export type JsonPrimitive = string | number | boolean | null; export type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue }; export type JsonObject = { [key: string]: JsonValue }; export type SpecDocumentKind = | "architecture" | "decision" | "task" | "glossary" | "experience" | "note" | "unknown"; export interface MarkdownHeading { depth: number; text: string; slug: string; } export interface SpecMarkdownDocument { /** Stable document identity. Comes from frontmatter.id, or else from relative path. */ id: string; /** POSIX path relative to the spec root, e.g. architecture/runtime.md. */ path: string; title: string; kind: SpecDocumentKind; status?: string; frontmatter: JsonObject; body: string; raw: string; headings: MarkdownHeading[]; sha256: string; sizeBytes: number; mtimeMs: number; } export interface SpecDocumentRow { id: string; path: string; title: string; kind: SpecDocumentKind; status: string; body: string; frontmatterJson: string; headingsJson: string; sha256: string; sizeBytes: number; mtimeMs: number; importedAt: string; } export type ProjectEventType = | "spec.document.upserted" | "spec.document.unchanged" | "spec.document.deleted" | "consumer.registered" | "consumer.updated" | "consumer.matched" | "agent.packet.created" | "agent.request.created" | "agent.request.executing" | "agent.request.executed" | "agent.request.failed" | "agent.request.blocked" | "agent.request.ignored"; export interface ProjectEventRow { id: string; type: ProjectEventType; documentId: string; path: string; sha256?: string; occurredAt: string; authority: "importer.sync" | "human.file" | "human.ui" | "agent.proposal" | "agent.applied" | "charter.agent" | "charter.system"; sourceJazzRowId?: string; sourceField?: string; } export type WorkItemStatus = "queued" | "claimed" | "running" | "done" | "ignored" | "failed" | "blocked"; export type WorkItemKind = "spec-change" | "agent-request" | "manual"; export type AgentPacketStatus = "planned" | "executing" | "executed" | "failed" | "blocked" | "ignored"; export interface WorkItemRow { id: string; kind: WorkItemKind; status: WorkItemStatus; eventId: string; documentId: string; path: string; title: string; createdAt: string; updatedAt: string; authority: ProjectEventRow["authority"]; attachedDocumentIds: string[]; matchedConsumerIds: string[]; sourceJazzRowId?: string; sourceField?: string; claimedBy?: string; claimedAt?: string; requestId?: string; resultText?: string; reportedAt?: string; } export interface SpecImportPlan { projectRoot: string; specRoot: string; generatedAt: string; documents: SpecMarkdownDocument[]; rows: SpecDocumentRow[]; events: ProjectEventRow[]; } export type AgentRequestStatus = "planned" | "executing" | "executed" | "failed" | "blocked"; export type AgentReportStatus = "done" | "failed" | "blocked" | "ignored"; export type AgentConsumerStatus = "active" | "paused" | "archived"; export type AgentRunnerKind = "letta" | "codex" | "claude-code" | "script" | "custom"; export interface AgentConsumerRow { id: string; name: string; status: AgentConsumerStatus; runnerKind: AgentRunnerKind; runnerCommand?: string; runnerConfigJson: string; eventTypes: string[]; documentSelectors: string[]; promptDocumentIds: string[]; defaultContextDocumentIds: string[]; cursorJson: string; createdAt: string; updatedAt: string; } export interface AgentPacketRow { id: string; status: AgentPacketStatus; createdAt: string; updatedAt: string; consumerId?: string; requestId?: string; command: string; workItemIds: string[]; eventIds: string[]; affectedDocumentIds: string[]; promptDocumentIds: string[]; attachedDocumentIds: string[]; documentVersionIds: Record; prompt: string; promptSha256: string; outputContract: string; resultText?: string; stdoutText?: string; stderrText?: string; outputText?: string; reportStatus?: AgentReportStatus; reportedAt?: string; exitCode?: number; } export interface AgentRequestRow { id: string; status: AgentRequestStatus; createdAt: string; updatedAt: string; requestedBy: "charter.agent"; consumerId?: string; packetId?: string; command: string; changeIds: string[]; workItemIds: string[]; attachedDocumentIds: string[]; prompt: string; promptSha256: string; resultText?: string; stdoutText?: string; stderrText?: string; outputText?: string; reportStatus?: AgentReportStatus; reportedAt?: string; exitCode?: number; } export interface CharterDatabaseSnapshot { projectId: string; updatedAt: string; documents: Record; pathIndex: Record; events: ProjectEventRow[]; workItems: Record; consumers: Record; packets: Record; requests: Record; } export interface SpecLink { kind: "markdown" | "wikilink"; raw: string; target: string; normalizedTarget: string; text?: string; } export interface SpecIndexDocument { id: string; path: string; title: string; kind: SpecDocumentKind; status: string; sha256: string; headings: MarkdownHeading[]; links: SpecLink[]; terms: string[]; } export interface SpecIndex { projectRoot: string; specRoot: string; generatedAt: string; documents: Record; pathIndex: Record; termIndex: Record; backlinks: Record; } export type SpecChangeType = "added" | "modified" | "deleted" | "unchanged"; export interface SpecChange { type: SpecChangeType; documentId: string; path: string; title: string; previousSha256?: string; currentSha256?: string; previousPath?: string; currentPath?: string; }