@blundergoat/goat-flow
Version:
AI coding agent harness and local dashboard for Claude Code, OpenAI Codex, Google Antigravity, and GitHub Copilot - setup audits, guardrails, structured skills, deny hooks, and persistent learning loops.
81 lines • 4.27 kB
TypeScript
import type { CheckEvidence } from "../audit/provenance-types.js";
import { type RedactedEvidenceValue } from "./redaction.js";
type EvidenceActor = "dashboard" | "cli" | "server";
/** Stable event names emitted by local runtime producers into the evidence log. */
export type EvidenceEventKind = "terminal.create" | "terminal.delete" | "terminal.upload" | "terminal.send" | "prompt.launch" | "prompt.send" | "audit.exec" | "audit.run" | "setup.prompt" | "quality.prompt" | "index.regenerate" | "project.save" | "project.remove" | "project.switch";
type EvidencePayloadValue = string | number | boolean | null | RedactedEvidenceValue | EvidencePayloadValue[] | {
[key: string]: EvidencePayloadValue;
};
/** JSON-compatible payload object; sensitive values must use redaction markers. */
export type EvidencePayload = Record<string, EvidencePayloadValue>;
/** Runtime event record that reuses CheckEvidence provenance fields. */
export interface EvidenceEnvelope extends CheckEvidence {
producer: string;
event_kind: EvidenceEventKind;
actor: EvidenceActor;
timestamp: string;
project_path: string;
payload?: EvidencePayload;
}
/** Caller-friendly input shape before camelCase fields are adapted to envelope keys. */
export interface CreateEvidenceEnvelopeInput {
producer?: string;
eventType: EvidenceEventKind;
actor: EvidenceActor;
projectRoot: string;
timestamp?: string | Date;
payload?: EvidencePayload | undefined;
provenance?: Partial<Pick<CheckEvidence, "source_urls" | "evidence_paths" | "framework_evidence_paths" | "target_evidence_paths" | "reason">>;
}
/** Non-throwing append result returned to dashboard and CLI producers. */
export interface AppendEvidenceEnvelopeResult extends Record<"ok", boolean> {
path: string | null;
error?: string;
}
/** Optional warning sink used by tests and dashboard routes instead of direct stderr writes. */
export interface EvidenceEnvelopeWriteOptions {
onWarning?: ((message: string) => void) | undefined;
}
type EvidencePathExists = (path: string) => boolean;
/**
* Build a validated envelope shape from one local runtime event.
*
* @param input - Runtime event details and optional provenance override.
* @returns Evidence envelope ready for validation or append.
*/
export declare function createEvidenceEnvelope(input: CreateEvidenceEnvelopeInput): EvidenceEnvelope;
/**
* Validate runtime envelope fields while delegating provenance rules.
*
* @param envelope - Envelope to validate.
* @param pathExists - Optional path-existence predicate for provenance checks.
* @returns Human-readable validation errors; an empty array means valid.
*/
export declare function validateEvidenceEnvelope(envelope: EvidenceEnvelope, pathExists?: EvidencePathExists): string[];
/**
* Append one envelope to the local gitignored JSONL event log. Never throws.
*
* @param projectRoot - Project root that owns `.goat-flow/logs/events`.
* @param envelope - Validated or caller-created envelope to append.
* @param options - Optional warning callback for non-fatal validation or filesystem failures.
* @returns Append outcome with a path on success and an error string on failure.
*/
export declare function appendEvidenceEnvelope(projectRoot: string, envelope: EvidenceEnvelope, options?: EvidenceEnvelopeWriteOptions): AppendEvidenceEnvelopeResult;
/**
* Convenience producer helper for common dashboard/server event emission.
*
* @param input - Runtime event details to envelope and append.
* @param options - Optional warning callback for append failures.
* @returns Append outcome from the underlying non-throwing writer.
*/
export declare function recordEvidenceEvent(input: CreateEvidenceEnvelopeInput, options?: EvidenceEnvelopeWriteOptions): AppendEvidenceEnvelopeResult;
/**
* Read the newest local event envelopes, preserving chronological order.
*
* @param projectRoot - Project root whose gitignored event logs should be tailed.
* @param limit - Requested maximum number of newest envelopes; capped for bounded reads.
* @returns Valid envelopes from the newest tail window.
*/
export declare function tailEvidenceEvents(projectRoot: string, limit?: number): EvidenceEnvelope[];
export {};
//# sourceMappingURL=envelope.d.ts.map