@agent-native/core 0.111.4 → 0.112.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +12 -0
  3. package/corpus/core/package.json +3 -1
  4. package/corpus/core/src/cli/code-agent-executor.ts +17 -5
  5. package/corpus/core/src/cli/code-agent-runs.ts +43 -2
  6. package/corpus/core/src/cli/multi-frontier-runs.ts +841 -0
  7. package/corpus/core/src/coding-tools/index.ts +27 -8
  8. package/corpus/core/src/embeddings/index.ts +233 -0
  9. package/corpus/core/src/index.ts +2 -0
  10. package/corpus/core/src/search/index.ts +413 -0
  11. package/corpus/templates/brain/.agents/skills/brain/RUNBOOK.md +48 -5
  12. package/corpus/templates/brain/.agents/skills/brain/SKILL.md +46 -14
  13. package/corpus/templates/brain/README.md +34 -3
  14. package/corpus/templates/brain/actions/approve-proposal.ts +2 -0
  15. package/corpus/templates/brain/actions/claim-distillation.ts +24 -27
  16. package/corpus/templates/brain/actions/create-source.ts +1 -1
  17. package/corpus/templates/brain/actions/get-knowledge.ts +6 -2
  18. package/corpus/templates/brain/actions/get-pilot-report.ts +44 -8
  19. package/corpus/templates/brain/actions/import-capture.ts +21 -9
  20. package/corpus/templates/brain/actions/import-transcript.ts +42 -14
  21. package/corpus/templates/brain/actions/list-captures.ts +10 -1
  22. package/corpus/templates/brain/actions/list-distillation-queue.ts +39 -14
  23. package/corpus/templates/brain/actions/list-projects.ts +51 -0
  24. package/corpus/templates/brain/actions/list-proposals.ts +80 -4
  25. package/corpus/templates/brain/actions/list-sources.ts +17 -3
  26. package/corpus/templates/brain/actions/manage-project.ts +118 -0
  27. package/corpus/templates/brain/actions/mark-capture-distilled.ts +68 -20
  28. package/corpus/templates/brain/actions/navigate.ts +1 -0
  29. package/corpus/templates/brain/actions/reject-proposal.ts +6 -1
  30. package/corpus/templates/brain/actions/resanitize-captures.ts +159 -33
  31. package/corpus/templates/brain/actions/review-proposal.ts +2 -0
  32. package/corpus/templates/brain/actions/search-everything.ts +10 -1
  33. package/corpus/templates/brain/actions/search-knowledge.ts +1 -1
  34. package/corpus/templates/brain/actions/set-settings.ts +36 -1
  35. package/corpus/templates/brain/actions/update-proposal.ts +2 -0
  36. package/corpus/templates/brain/app/hooks/use-distillation-bridge.ts +18 -9
  37. package/corpus/templates/brain/app/hooks/use-navigation-state.ts +3 -0
  38. package/corpus/templates/brain/app/i18n-data.ts +731 -2
  39. package/corpus/templates/brain/app/lib/brain.ts +33 -1
  40. package/corpus/templates/brain/app/routes/ops.tsx +47 -0
  41. package/corpus/templates/brain/app/routes/review.tsx +41 -2
  42. package/corpus/templates/brain/app/routes/search.tsx +33 -2
  43. package/corpus/templates/brain/app/routes/settings.tsx +158 -0
  44. package/corpus/templates/brain/app/routes/sources.tsx +31 -0
  45. package/corpus/templates/brain/changelog/2026-07-19-added-private-source-safe-semantic-search.md +6 -0
  46. package/corpus/templates/brain/jobs/process-ingest-queue.ts +270 -36
  47. package/corpus/templates/brain/package.json +1 -0
  48. package/corpus/templates/brain/server/db/index.ts +18 -0
  49. package/corpus/templates/brain/server/db/schema.ts +197 -1
  50. package/corpus/templates/brain/server/jobs/distillation-queue.ts +12 -5
  51. package/corpus/templates/brain/server/lib/audiences.ts +708 -0
  52. package/corpus/templates/brain/server/lib/brain-health.ts +251 -38
  53. package/corpus/templates/brain/server/lib/brain.ts +877 -50
  54. package/corpus/templates/brain/server/lib/capture-sanitization.ts +217 -53
  55. package/corpus/templates/brain/server/lib/connectors.ts +556 -70
  56. package/corpus/templates/brain/server/lib/demo.ts +17 -4
  57. package/corpus/templates/brain/server/lib/hybrid-search.ts +363 -0
  58. package/corpus/templates/brain/server/lib/ingest-queue.ts +104 -0
  59. package/corpus/templates/brain/server/lib/privacy-readiness.ts +24 -0
  60. package/corpus/templates/brain/server/lib/search-index-contracts.ts +72 -0
  61. package/corpus/templates/brain/server/lib/search-index.ts +714 -0
  62. package/corpus/templates/brain/server/lib/search.ts +120 -4
  63. package/corpus/templates/brain/server/lib/sensitivity-policy.ts +174 -0
  64. package/corpus/templates/brain/server/lib/slack-events.ts +281 -0
  65. package/corpus/templates/brain/server/onboarding.ts +29 -0
  66. package/corpus/templates/brain/server/plugins/db.ts +204 -0
  67. package/corpus/templates/brain/server/register-secrets.ts +46 -0
  68. package/corpus/templates/brain/server/routes/api/_agent-native/brain/ingest.post.ts +36 -16
  69. package/corpus/templates/brain/server/routes/api/_agent-native/brain/slack-events.post.ts +28 -0
  70. package/corpus/templates/brain/shared/types.ts +10 -0
  71. package/dist/cli/code-agent-executor.d.ts +8 -9
  72. package/dist/cli/code-agent-executor.d.ts.map +1 -1
  73. package/dist/cli/code-agent-executor.js +9 -3
  74. package/dist/cli/code-agent-executor.js.map +1 -1
  75. package/dist/cli/code-agent-runs.d.ts +5 -0
  76. package/dist/cli/code-agent-runs.d.ts.map +1 -1
  77. package/dist/cli/code-agent-runs.js +33 -2
  78. package/dist/cli/code-agent-runs.js.map +1 -1
  79. package/dist/cli/multi-frontier-runs.d.ts +131 -0
  80. package/dist/cli/multi-frontier-runs.d.ts.map +1 -0
  81. package/dist/cli/multi-frontier-runs.js +529 -0
  82. package/dist/cli/multi-frontier-runs.js.map +1 -0
  83. package/dist/coding-tools/index.d.ts +1 -0
  84. package/dist/coding-tools/index.d.ts.map +1 -1
  85. package/dist/coding-tools/index.js +25 -7
  86. package/dist/coding-tools/index.js.map +1 -1
  87. package/dist/collab/awareness.d.ts +2 -2
  88. package/dist/collab/awareness.d.ts.map +1 -1
  89. package/dist/embeddings/index.d.ts +24 -0
  90. package/dist/embeddings/index.d.ts.map +1 -0
  91. package/dist/embeddings/index.js +172 -0
  92. package/dist/embeddings/index.js.map +1 -0
  93. package/dist/index.d.ts +2 -0
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/index.js +2 -0
  96. package/dist/index.js.map +1 -1
  97. package/dist/notifications/routes.d.ts +3 -3
  98. package/dist/progress/routes.d.ts +1 -1
  99. package/dist/resources/handlers.d.ts +1 -1
  100. package/dist/search/index.d.ts +88 -0
  101. package/dist/search/index.d.ts.map +1 -0
  102. package/dist/search/index.js +267 -0
  103. package/dist/search/index.js.map +1 -0
  104. package/package.json +3 -1
@@ -95,7 +95,7 @@ export function normalizeCodeAgentPermissionMode(value) {
95
95
  }
96
96
  export function writeCodeAgentRunRecord(record) {
97
97
  fs.mkdirSync(codeAgentRunsDir(), { recursive: true });
98
- fs.writeFileSync(codeAgentRunRecordPath(record.id), `${JSON.stringify(record, null, 2)}\n`);
98
+ writeFileAtomically(codeAgentRunRecordPath(record.id), `${JSON.stringify(record, null, 2)}\n`);
99
99
  }
100
100
  export function getCodeAgentRunRecord(runId) {
101
101
  return readRunFile(codeAgentRunRecordPath(runId));
@@ -133,10 +133,17 @@ export function getLastCodeAgentRunRecord(goalId) {
133
133
  return listCodeAgentRunRecords(goalId)[0] ?? null;
134
134
  }
135
135
  export function appendCodeAgentTranscriptEvent(input) {
136
+ const requestedId = input.id?.trim();
137
+ if (requestedId) {
138
+ const existing = listCodeAgentTranscriptEvents(input.runId).find((event) => event.id === requestedId);
139
+ if (existing)
140
+ return existing;
141
+ }
136
142
  const createdAt = input.createdAt ?? new Date().toISOString();
137
143
  const event = {
138
144
  schemaVersion: 1,
139
- id: `evt-${timestampSlug(createdAt)}-${crypto.randomUUID().slice(0, 8)}`,
145
+ id: requestedId ??
146
+ `evt-${timestampSlug(createdAt)}-${crypto.randomUUID().slice(0, 8)}`,
140
147
  runId: input.runId,
141
148
  kind: input.kind,
142
149
  message: input.message,
@@ -203,6 +210,30 @@ export function dequeueCodeAgentFollowUp(runId) {
203
210
  function codeAgentRunRecordPath(runId) {
204
211
  return path.join(codeAgentRunsDir(), `${runId}.json`);
205
212
  }
213
+ function writeFileAtomically(filePath, contents) {
214
+ const directory = path.dirname(filePath);
215
+ const temporaryPath = path.join(directory, `.${path.basename(filePath)}.tmp-${process.pid}-${crypto.randomUUID()}`);
216
+ let mode;
217
+ try {
218
+ mode = fs.statSync(filePath).mode & 0o777;
219
+ }
220
+ catch {
221
+ // A new run record uses the process umask.
222
+ }
223
+ try {
224
+ fs.writeFileSync(temporaryPath, contents, {
225
+ encoding: "utf-8",
226
+ flag: "wx",
227
+ });
228
+ if (mode !== undefined)
229
+ fs.chmodSync(temporaryPath, mode);
230
+ fs.renameSync(temporaryPath, filePath);
231
+ }
232
+ catch (error) {
233
+ fs.rmSync(temporaryPath, { force: true });
234
+ throw error;
235
+ }
236
+ }
206
237
  function readPendingFollowUps(value) {
207
238
  if (!Array.isArray(value))
208
239
  return [];
@@ -1 +1 @@
1
- {"version":3,"file":"code-agent-runs.js","sourceRoot":"","sources":["../../src/cli/code-agent-runs.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from \"crypto\";\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport type { AgentPromptAttachment } from \"../code-agents/prompt-attachments.js\";\n\nexport type CodeAgentRunStatus =\n | \"queued\"\n | \"running\"\n | \"paused\"\n | \"needs-approval\"\n | \"completed\"\n | \"errored\"\n | \"unknown\";\n\nexport const CODE_AGENT_PERMISSION_MODES = [\n \"read-only\",\n \"ask-before-edit\",\n \"auto-edit\",\n \"full-auto\",\n] as const;\n\nexport type CodeAgentPermissionMode =\n (typeof CODE_AGENT_PERMISSION_MODES)[number];\n\nexport interface CodeAgentRunProgress {\n label?: string;\n completed: number;\n total: number;\n failed?: number;\n percent: number;\n}\n\nexport interface CodeAgentRunDetail {\n label: string;\n value: string;\n}\n\nexport type CodeAgentFollowUpMode = \"immediate\" | \"queued\";\n\nexport interface CodeAgentPendingFollowUp {\n id: string;\n prompt: string;\n mode: CodeAgentFollowUpMode;\n createdAt: string;\n eventId?: string;\n permissionMode?: CodeAgentPermissionMode;\n source?: string;\n attachments?: AgentPromptAttachment[];\n}\n\nexport interface CodeAgentRunRecord {\n schemaVersion: 1;\n id: string;\n goalId: string;\n title: string;\n subtitle?: string;\n status: CodeAgentRunStatus;\n phase?: string;\n needsApproval?: boolean;\n progress?: CodeAgentRunProgress;\n permissionMode?: CodeAgentPermissionMode;\n details?: CodeAgentRunDetail[];\n artifactRoot?: string;\n surfaceUrl?: string;\n cwd: string;\n createdAt: string;\n updatedAt: string;\n metadata?: Record<string, unknown>;\n}\n\nexport type CodeAgentTranscriptEventKind =\n | \"user\"\n | \"system\"\n | \"note\"\n | \"artifact\"\n | \"status\";\n\n/**\n * Structured, machine-checkable marker for transcript events that need\n * special handling in the UI beyond free-text matching. `\"credential-gap\"`\n * marks the status event the executor appends when no LLM provider key (or\n * Codex CLI login) is available; consumers should prefer this field over\n * regex-matching `message` (see `isCredentialGapCodeAgentEvent` in\n * `../code-agents/transcript-normalizer.js`). Optional so older, already\n * persisted JSONL transcripts without the field keep parsing unchanged.\n */\nexport type CodeAgentTranscriptEventSignal = \"credential-gap\";\n\nexport interface CodeAgentTranscriptEvent {\n schemaVersion: 1;\n id: string;\n runId: string;\n kind: CodeAgentTranscriptEventKind;\n message: string;\n createdAt: string;\n metadata?: Record<string, unknown>;\n signal?: CodeAgentTranscriptEventSignal;\n}\n\nexport interface CreateCodeAgentRunInput {\n goalId: string;\n title: string;\n subtitle?: string;\n status?: CodeAgentRunStatus;\n phase?: string;\n needsApproval?: boolean;\n progress?: CodeAgentRunProgress;\n permissionMode?: CodeAgentPermissionMode;\n details?: CodeAgentRunDetail[];\n artifactRoot?: string;\n surfaceUrl?: string;\n cwd?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface AppendCodeAgentTranscriptEventInput {\n runId: string;\n kind: CodeAgentTranscriptEventKind;\n message: string;\n createdAt?: string;\n metadata?: Record<string, unknown>;\n signal?: CodeAgentTranscriptEventSignal;\n}\n\nexport interface QueueCodeAgentFollowUpInput {\n runId: string;\n prompt: string;\n mode: CodeAgentFollowUpMode;\n eventId?: string;\n permissionMode?: CodeAgentPermissionMode;\n source?: string;\n createdAt?: string;\n attachments?: AgentPromptAttachment[];\n}\n\nconst STORE_ENV = \"AGENT_NATIVE_CODE_AGENTS_HOME\";\n\nexport function codeAgentStoreRoot(): string {\n return path.resolve(\n process.env[STORE_ENV] ??\n path.join(os.homedir(), \".agent-native\", \"code-agents\"),\n );\n}\n\nexport function codeAgentRunsDir(): string {\n return path.join(codeAgentStoreRoot(), \"runs\");\n}\n\nexport function codeAgentRunArtifactsDir(runId: string): string {\n return path.join(codeAgentStoreRoot(), \"artifacts\", runId);\n}\n\nexport function codeAgentTranscriptsDir(): string {\n return path.join(codeAgentStoreRoot(), \"transcripts\");\n}\n\nexport function codeAgentRunTranscriptPath(runId: string): string {\n return path.join(codeAgentTranscriptsDir(), `${runId}.jsonl`);\n}\n\n// --------------- Command allowlist ---------------\n\nconst COMMAND_ALLOWLIST_FILENAME = \"command-allowlist.json\";\n\nexport function codeAgentCommandAllowlistPath(): string {\n return path.join(codeAgentStoreRoot(), COMMAND_ALLOWLIST_FILENAME);\n}\n\n/**\n * Load the per-store command allowlist. Returns an array of exact command\n * strings the user has marked \"always allow\".\n */\nexport function readCodeAgentCommandAllowlist(): string[] {\n try {\n const raw = JSON.parse(\n fs.readFileSync(codeAgentCommandAllowlistPath(), \"utf-8\"),\n ) as unknown;\n if (!Array.isArray(raw)) return [];\n return raw.filter((entry): entry is string => typeof entry === \"string\");\n } catch {\n return [];\n }\n}\n\n/**\n * Persist a command to the per-store allowlist so future identical commands\n * are auto-approved without a prompt. Deduplicates by exact string match.\n */\nexport function addCodeAgentCommandToAllowlist(command: string): void {\n const current = readCodeAgentCommandAllowlist();\n if (current.includes(command)) return;\n const next = [...current, command];\n fs.mkdirSync(codeAgentStoreRoot(), { recursive: true });\n fs.writeFileSync(\n codeAgentCommandAllowlistPath(),\n JSON.stringify(next, null, 2),\n );\n}\n\n/** Return true if `command` is in the stored allowlist. */\nexport function isCodeAgentCommandAllowed(command: string): boolean {\n return readCodeAgentCommandAllowlist().includes(command);\n}\n\nexport function createCodeAgentRunRecord(\n input: CreateCodeAgentRunInput,\n): CodeAgentRunRecord {\n const now = new Date().toISOString();\n const id = `${input.goalId}-${timestampSlug(now)}-${crypto.randomUUID().slice(0, 8)}`;\n const record: CodeAgentRunRecord = {\n schemaVersion: 1,\n id,\n goalId: input.goalId,\n title: input.title,\n subtitle: input.subtitle,\n status: input.status ?? \"queued\",\n phase: input.phase,\n needsApproval: input.needsApproval,\n progress: input.progress,\n permissionMode: input.permissionMode,\n details: input.details,\n artifactRoot: input.artifactRoot,\n surfaceUrl: input.surfaceUrl,\n cwd: input.cwd ?? process.cwd(),\n createdAt: now,\n updatedAt: now,\n metadata: input.metadata,\n };\n writeCodeAgentRunRecord(record);\n return record;\n}\n\nexport function normalizeCodeAgentPermissionMode(\n value: unknown,\n): CodeAgentPermissionMode | null {\n if (typeof value !== \"string\") return null;\n return CODE_AGENT_PERMISSION_MODES.includes(value as CodeAgentPermissionMode)\n ? (value as CodeAgentPermissionMode)\n : null;\n}\n\nexport function writeCodeAgentRunRecord(record: CodeAgentRunRecord): void {\n fs.mkdirSync(codeAgentRunsDir(), { recursive: true });\n fs.writeFileSync(\n codeAgentRunRecordPath(record.id),\n `${JSON.stringify(record, null, 2)}\\n`,\n );\n}\n\nexport function getCodeAgentRunRecord(\n runId: string,\n): CodeAgentRunRecord | null {\n return readRunFile(codeAgentRunRecordPath(runId));\n}\n\nexport function updateCodeAgentRunRecord(\n runId: string,\n updates:\n | Partial<CodeAgentRunRecord>\n | ((record: CodeAgentRunRecord) => Partial<CodeAgentRunRecord>),\n): CodeAgentRunRecord | null {\n const record = getCodeAgentRunRecord(runId);\n if (!record) return null;\n const patch = typeof updates === \"function\" ? updates(record) : updates;\n const next: CodeAgentRunRecord = {\n ...record,\n ...patch,\n metadata: {\n ...(record.metadata ?? {}),\n ...(patch.metadata ?? {}),\n },\n updatedAt: patch.updatedAt ?? new Date().toISOString(),\n };\n writeCodeAgentRunRecord(next);\n return next;\n}\n\nexport function listCodeAgentRunRecords(goalId?: string): CodeAgentRunRecord[] {\n const dir = codeAgentRunsDir();\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter((file) => file.endsWith(\".json\"))\n .map((file) => readRunFile(path.join(dir, file)))\n .filter((run): run is CodeAgentRunRecord => Boolean(run))\n .filter((run) => !goalId || run.goalId === goalId)\n .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n}\n\nexport function getLastCodeAgentRunRecord(\n goalId?: string,\n): CodeAgentRunRecord | null {\n return listCodeAgentRunRecords(goalId)[0] ?? null;\n}\n\nexport function appendCodeAgentTranscriptEvent(\n input: AppendCodeAgentTranscriptEventInput,\n): CodeAgentTranscriptEvent {\n const createdAt = input.createdAt ?? new Date().toISOString();\n const event: CodeAgentTranscriptEvent = {\n schemaVersion: 1,\n id: `evt-${timestampSlug(createdAt)}-${crypto.randomUUID().slice(0, 8)}`,\n runId: input.runId,\n kind: input.kind,\n message: input.message,\n createdAt,\n metadata: input.metadata,\n ...(input.signal ? { signal: input.signal } : {}),\n };\n\n fs.mkdirSync(codeAgentTranscriptsDir(), { recursive: true });\n fs.appendFileSync(\n codeAgentRunTranscriptPath(input.runId),\n `${JSON.stringify(event)}\\n`,\n );\n touchCodeAgentRunRecord(input.runId, createdAt);\n return event;\n}\n\nexport function listCodeAgentTranscriptEvents(\n runId: string,\n): CodeAgentTranscriptEvent[] {\n const transcriptPath = codeAgentRunTranscriptPath(runId);\n if (!fs.existsSync(transcriptPath)) return [];\n return fs\n .readFileSync(transcriptPath, \"utf-8\")\n .split(/\\r?\\n/)\n .filter(Boolean)\n .map(readTranscriptLine)\n .filter((event): event is CodeAgentTranscriptEvent => Boolean(event));\n}\n\nexport function isActiveCodeAgentRun(run: CodeAgentRunRecord): boolean {\n return run.status === \"running\" || run.status === \"needs-approval\";\n}\n\nexport function queueCodeAgentFollowUp(\n input: QueueCodeAgentFollowUpInput,\n): CodeAgentPendingFollowUp | null {\n const createdAt = input.createdAt ?? new Date().toISOString();\n const followUp: CodeAgentPendingFollowUp = {\n id: `followup-${timestampSlug(createdAt)}-${crypto.randomUUID().slice(0, 8)}`,\n prompt: input.prompt,\n mode: input.mode,\n createdAt,\n eventId: input.eventId,\n permissionMode: input.permissionMode,\n source: input.source,\n ...(input.attachments && input.attachments.length > 0\n ? { attachments: input.attachments }\n : {}),\n };\n const updated = updateCodeAgentRunRecord(input.runId, (record) => ({\n metadata: {\n pendingFollowUps: [\n ...readPendingFollowUps(record.metadata?.pendingFollowUps),\n followUp,\n ],\n },\n }));\n return updated ? followUp : null;\n}\n\nexport function dequeueCodeAgentFollowUp(\n runId: string,\n): CodeAgentPendingFollowUp | null {\n let selected: CodeAgentPendingFollowUp | null = null;\n updateCodeAgentRunRecord(runId, (record) => {\n const [first, ...rest] = readPendingFollowUps(\n record.metadata?.pendingFollowUps,\n );\n selected = first ?? null;\n return {\n metadata: {\n pendingFollowUps: rest.length > 0 ? rest : undefined,\n },\n };\n });\n return selected;\n}\n\nfunction codeAgentRunRecordPath(runId: string): string {\n return path.join(codeAgentRunsDir(), `${runId}.json`);\n}\n\nfunction readPendingFollowUps(value: unknown): CodeAgentPendingFollowUp[] {\n if (!Array.isArray(value)) return [];\n return value\n .map((item): CodeAgentPendingFollowUp | null => {\n if (!item || typeof item !== \"object\") return null;\n const candidate = item as Record<string, unknown>;\n if (\n typeof candidate.id !== \"string\" ||\n typeof candidate.prompt !== \"string\" ||\n typeof candidate.createdAt !== \"string\" ||\n (candidate.mode !== \"immediate\" && candidate.mode !== \"queued\")\n ) {\n return null;\n }\n return {\n id: candidate.id,\n prompt: candidate.prompt,\n mode: candidate.mode,\n createdAt: candidate.createdAt,\n eventId:\n typeof candidate.eventId === \"string\" ? candidate.eventId : undefined,\n permissionMode:\n normalizeCodeAgentPermissionMode(candidate.permissionMode) ??\n undefined,\n source:\n typeof candidate.source === \"string\" ? candidate.source : undefined,\n } satisfies CodeAgentPendingFollowUp;\n })\n .filter((item): item is CodeAgentPendingFollowUp => Boolean(item));\n}\n\nfunction touchCodeAgentRunRecord(runId: string, updatedAt: string): void {\n const record = readRunFile(codeAgentRunRecordPath(runId));\n if (!record) return;\n writeCodeAgentRunRecord({ ...record, updatedAt });\n}\n\nfunction readRunFile(filePath: string): CodeAgentRunRecord | null {\n try {\n const raw = JSON.parse(fs.readFileSync(filePath, \"utf-8\")) as unknown;\n if (!raw || typeof raw !== \"object\") return null;\n const record = raw as Partial<CodeAgentRunRecord>;\n if (\n record.schemaVersion !== 1 ||\n typeof record.id !== \"string\" ||\n typeof record.goalId !== \"string\" ||\n typeof record.title !== \"string\" ||\n typeof record.status !== \"string\" ||\n typeof record.cwd !== \"string\" ||\n typeof record.createdAt !== \"string\" ||\n typeof record.updatedAt !== \"string\"\n ) {\n return null;\n }\n return record as CodeAgentRunRecord;\n } catch {\n return null;\n }\n}\n\nfunction readTranscriptLine(line: string): CodeAgentTranscriptEvent | null {\n try {\n const raw = JSON.parse(line) as unknown;\n if (!raw || typeof raw !== \"object\") return null;\n const event = raw as Partial<CodeAgentTranscriptEvent> & {\n type?: unknown;\n role?: unknown;\n text?: unknown;\n content?: unknown;\n };\n const kind = isTranscriptEventKind(event.kind)\n ? event.kind\n : normalizeTranscriptKind(event.type ?? event.role);\n const message =\n typeof event.message === \"string\"\n ? event.message\n : typeof event.text === \"string\"\n ? event.text\n : typeof event.content === \"string\"\n ? event.content\n : undefined;\n if (\n event.schemaVersion !== 1 ||\n typeof event.id !== \"string\" ||\n typeof event.runId !== \"string\" ||\n !kind ||\n typeof message !== \"string\" ||\n typeof event.createdAt !== \"string\"\n ) {\n return null;\n }\n return {\n ...(event as Partial<CodeAgentTranscriptEvent>),\n kind,\n message,\n } as CodeAgentTranscriptEvent;\n } catch {\n return null;\n }\n}\n\nfunction normalizeTranscriptKind(\n value: unknown,\n): CodeAgentTranscriptEventKind | null {\n if (typeof value !== \"string\") return null;\n const normalized = value.toLowerCase();\n if (normalized === \"human\" || normalized === \"prompt\") return \"user\";\n if (normalized === \"assistant\") return \"system\";\n if (isTranscriptEventKind(normalized)) return normalized;\n return null;\n}\n\nfunction isTranscriptEventKind(\n value: unknown,\n): value is CodeAgentTranscriptEventKind {\n return (\n value === \"user\" ||\n value === \"system\" ||\n value === \"note\" ||\n value === \"artifact\" ||\n value === \"status\"\n );\n}\n\nfunction timestampSlug(value: string): string {\n return value.replace(/\\D/g, \"\").slice(0, 14);\n}\n"]}
1
+ {"version":3,"file":"code-agent-runs.js","sourceRoot":"","sources":["../../src/cli/code-agent-runs.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from \"crypto\";\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport type { AgentPromptAttachment } from \"../code-agents/prompt-attachments.js\";\n\nexport type CodeAgentRunStatus =\n | \"queued\"\n | \"running\"\n | \"paused\"\n | \"needs-approval\"\n | \"completed\"\n | \"errored\"\n | \"unknown\";\n\nexport const CODE_AGENT_PERMISSION_MODES = [\n \"read-only\",\n \"ask-before-edit\",\n \"auto-edit\",\n \"full-auto\",\n] as const;\n\nexport type CodeAgentPermissionMode =\n (typeof CODE_AGENT_PERMISSION_MODES)[number];\n\nexport interface CodeAgentRunProgress {\n label?: string;\n completed: number;\n total: number;\n failed?: number;\n percent: number;\n}\n\nexport interface CodeAgentRunDetail {\n label: string;\n value: string;\n}\n\nexport type CodeAgentFollowUpMode = \"immediate\" | \"queued\";\n\nexport interface CodeAgentPendingFollowUp {\n id: string;\n prompt: string;\n mode: CodeAgentFollowUpMode;\n createdAt: string;\n eventId?: string;\n permissionMode?: CodeAgentPermissionMode;\n source?: string;\n attachments?: AgentPromptAttachment[];\n}\n\nexport interface CodeAgentRunRecord {\n schemaVersion: 1;\n id: string;\n goalId: string;\n title: string;\n subtitle?: string;\n status: CodeAgentRunStatus;\n phase?: string;\n needsApproval?: boolean;\n progress?: CodeAgentRunProgress;\n permissionMode?: CodeAgentPermissionMode;\n details?: CodeAgentRunDetail[];\n artifactRoot?: string;\n surfaceUrl?: string;\n cwd: string;\n createdAt: string;\n updatedAt: string;\n metadata?: Record<string, unknown>;\n}\n\nexport type CodeAgentTranscriptEventKind =\n | \"user\"\n | \"system\"\n | \"note\"\n | \"artifact\"\n | \"status\";\n\n/**\n * Structured, machine-checkable marker for transcript events that need\n * special handling in the UI beyond free-text matching. `\"credential-gap\"`\n * marks the status event the executor appends when no LLM provider key (or\n * Codex CLI login) is available; consumers should prefer this field over\n * regex-matching `message` (see `isCredentialGapCodeAgentEvent` in\n * `../code-agents/transcript-normalizer.js`). Optional so older, already\n * persisted JSONL transcripts without the field keep parsing unchanged.\n */\nexport type CodeAgentTranscriptEventSignal = \"credential-gap\";\n\nexport interface CodeAgentTranscriptEvent {\n schemaVersion: 1;\n id: string;\n runId: string;\n kind: CodeAgentTranscriptEventKind;\n message: string;\n createdAt: string;\n metadata?: Record<string, unknown>;\n signal?: CodeAgentTranscriptEventSignal;\n}\n\nexport interface CreateCodeAgentRunInput {\n goalId: string;\n title: string;\n subtitle?: string;\n status?: CodeAgentRunStatus;\n phase?: string;\n needsApproval?: boolean;\n progress?: CodeAgentRunProgress;\n permissionMode?: CodeAgentPermissionMode;\n details?: CodeAgentRunDetail[];\n artifactRoot?: string;\n surfaceUrl?: string;\n cwd?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface AppendCodeAgentTranscriptEventInput {\n /**\n * Stable event identity supplied by a retrying caller. Reusing this value\n * returns the previously persisted event instead of appending a duplicate.\n */\n id?: string;\n runId: string;\n kind: CodeAgentTranscriptEventKind;\n message: string;\n createdAt?: string;\n metadata?: Record<string, unknown>;\n signal?: CodeAgentTranscriptEventSignal;\n}\n\nexport interface QueueCodeAgentFollowUpInput {\n runId: string;\n prompt: string;\n mode: CodeAgentFollowUpMode;\n eventId?: string;\n permissionMode?: CodeAgentPermissionMode;\n source?: string;\n createdAt?: string;\n attachments?: AgentPromptAttachment[];\n}\n\nconst STORE_ENV = \"AGENT_NATIVE_CODE_AGENTS_HOME\";\n\nexport function codeAgentStoreRoot(): string {\n return path.resolve(\n process.env[STORE_ENV] ??\n path.join(os.homedir(), \".agent-native\", \"code-agents\"),\n );\n}\n\nexport function codeAgentRunsDir(): string {\n return path.join(codeAgentStoreRoot(), \"runs\");\n}\n\nexport function codeAgentRunArtifactsDir(runId: string): string {\n return path.join(codeAgentStoreRoot(), \"artifacts\", runId);\n}\n\nexport function codeAgentTranscriptsDir(): string {\n return path.join(codeAgentStoreRoot(), \"transcripts\");\n}\n\nexport function codeAgentRunTranscriptPath(runId: string): string {\n return path.join(codeAgentTranscriptsDir(), `${runId}.jsonl`);\n}\n\n// --------------- Command allowlist ---------------\n\nconst COMMAND_ALLOWLIST_FILENAME = \"command-allowlist.json\";\n\nexport function codeAgentCommandAllowlistPath(): string {\n return path.join(codeAgentStoreRoot(), COMMAND_ALLOWLIST_FILENAME);\n}\n\n/**\n * Load the per-store command allowlist. Returns an array of exact command\n * strings the user has marked \"always allow\".\n */\nexport function readCodeAgentCommandAllowlist(): string[] {\n try {\n const raw = JSON.parse(\n fs.readFileSync(codeAgentCommandAllowlistPath(), \"utf-8\"),\n ) as unknown;\n if (!Array.isArray(raw)) return [];\n return raw.filter((entry): entry is string => typeof entry === \"string\");\n } catch {\n return [];\n }\n}\n\n/**\n * Persist a command to the per-store allowlist so future identical commands\n * are auto-approved without a prompt. Deduplicates by exact string match.\n */\nexport function addCodeAgentCommandToAllowlist(command: string): void {\n const current = readCodeAgentCommandAllowlist();\n if (current.includes(command)) return;\n const next = [...current, command];\n fs.mkdirSync(codeAgentStoreRoot(), { recursive: true });\n fs.writeFileSync(\n codeAgentCommandAllowlistPath(),\n JSON.stringify(next, null, 2),\n );\n}\n\n/** Return true if `command` is in the stored allowlist. */\nexport function isCodeAgentCommandAllowed(command: string): boolean {\n return readCodeAgentCommandAllowlist().includes(command);\n}\n\nexport function createCodeAgentRunRecord(\n input: CreateCodeAgentRunInput,\n): CodeAgentRunRecord {\n const now = new Date().toISOString();\n const id = `${input.goalId}-${timestampSlug(now)}-${crypto.randomUUID().slice(0, 8)}`;\n const record: CodeAgentRunRecord = {\n schemaVersion: 1,\n id,\n goalId: input.goalId,\n title: input.title,\n subtitle: input.subtitle,\n status: input.status ?? \"queued\",\n phase: input.phase,\n needsApproval: input.needsApproval,\n progress: input.progress,\n permissionMode: input.permissionMode,\n details: input.details,\n artifactRoot: input.artifactRoot,\n surfaceUrl: input.surfaceUrl,\n cwd: input.cwd ?? process.cwd(),\n createdAt: now,\n updatedAt: now,\n metadata: input.metadata,\n };\n writeCodeAgentRunRecord(record);\n return record;\n}\n\nexport function normalizeCodeAgentPermissionMode(\n value: unknown,\n): CodeAgentPermissionMode | null {\n if (typeof value !== \"string\") return null;\n return CODE_AGENT_PERMISSION_MODES.includes(value as CodeAgentPermissionMode)\n ? (value as CodeAgentPermissionMode)\n : null;\n}\n\nexport function writeCodeAgentRunRecord(record: CodeAgentRunRecord): void {\n fs.mkdirSync(codeAgentRunsDir(), { recursive: true });\n writeFileAtomically(\n codeAgentRunRecordPath(record.id),\n `${JSON.stringify(record, null, 2)}\\n`,\n );\n}\n\nexport function getCodeAgentRunRecord(\n runId: string,\n): CodeAgentRunRecord | null {\n return readRunFile(codeAgentRunRecordPath(runId));\n}\n\nexport function updateCodeAgentRunRecord(\n runId: string,\n updates:\n | Partial<CodeAgentRunRecord>\n | ((record: CodeAgentRunRecord) => Partial<CodeAgentRunRecord>),\n): CodeAgentRunRecord | null {\n const record = getCodeAgentRunRecord(runId);\n if (!record) return null;\n const patch = typeof updates === \"function\" ? updates(record) : updates;\n const next: CodeAgentRunRecord = {\n ...record,\n ...patch,\n metadata: {\n ...(record.metadata ?? {}),\n ...(patch.metadata ?? {}),\n },\n updatedAt: patch.updatedAt ?? new Date().toISOString(),\n };\n writeCodeAgentRunRecord(next);\n return next;\n}\n\nexport function listCodeAgentRunRecords(goalId?: string): CodeAgentRunRecord[] {\n const dir = codeAgentRunsDir();\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter((file) => file.endsWith(\".json\"))\n .map((file) => readRunFile(path.join(dir, file)))\n .filter((run): run is CodeAgentRunRecord => Boolean(run))\n .filter((run) => !goalId || run.goalId === goalId)\n .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n}\n\nexport function getLastCodeAgentRunRecord(\n goalId?: string,\n): CodeAgentRunRecord | null {\n return listCodeAgentRunRecords(goalId)[0] ?? null;\n}\n\nexport function appendCodeAgentTranscriptEvent(\n input: AppendCodeAgentTranscriptEventInput,\n): CodeAgentTranscriptEvent {\n const requestedId = input.id?.trim();\n if (requestedId) {\n const existing = listCodeAgentTranscriptEvents(input.runId).find(\n (event) => event.id === requestedId,\n );\n if (existing) return existing;\n }\n\n const createdAt = input.createdAt ?? new Date().toISOString();\n const event: CodeAgentTranscriptEvent = {\n schemaVersion: 1,\n id:\n requestedId ??\n `evt-${timestampSlug(createdAt)}-${crypto.randomUUID().slice(0, 8)}`,\n runId: input.runId,\n kind: input.kind,\n message: input.message,\n createdAt,\n metadata: input.metadata,\n ...(input.signal ? { signal: input.signal } : {}),\n };\n\n fs.mkdirSync(codeAgentTranscriptsDir(), { recursive: true });\n fs.appendFileSync(\n codeAgentRunTranscriptPath(input.runId),\n `${JSON.stringify(event)}\\n`,\n );\n touchCodeAgentRunRecord(input.runId, createdAt);\n return event;\n}\n\nexport function listCodeAgentTranscriptEvents(\n runId: string,\n): CodeAgentTranscriptEvent[] {\n const transcriptPath = codeAgentRunTranscriptPath(runId);\n if (!fs.existsSync(transcriptPath)) return [];\n return fs\n .readFileSync(transcriptPath, \"utf-8\")\n .split(/\\r?\\n/)\n .filter(Boolean)\n .map(readTranscriptLine)\n .filter((event): event is CodeAgentTranscriptEvent => Boolean(event));\n}\n\nexport function isActiveCodeAgentRun(run: CodeAgentRunRecord): boolean {\n return run.status === \"running\" || run.status === \"needs-approval\";\n}\n\nexport function queueCodeAgentFollowUp(\n input: QueueCodeAgentFollowUpInput,\n): CodeAgentPendingFollowUp | null {\n const createdAt = input.createdAt ?? new Date().toISOString();\n const followUp: CodeAgentPendingFollowUp = {\n id: `followup-${timestampSlug(createdAt)}-${crypto.randomUUID().slice(0, 8)}`,\n prompt: input.prompt,\n mode: input.mode,\n createdAt,\n eventId: input.eventId,\n permissionMode: input.permissionMode,\n source: input.source,\n ...(input.attachments && input.attachments.length > 0\n ? { attachments: input.attachments }\n : {}),\n };\n const updated = updateCodeAgentRunRecord(input.runId, (record) => ({\n metadata: {\n pendingFollowUps: [\n ...readPendingFollowUps(record.metadata?.pendingFollowUps),\n followUp,\n ],\n },\n }));\n return updated ? followUp : null;\n}\n\nexport function dequeueCodeAgentFollowUp(\n runId: string,\n): CodeAgentPendingFollowUp | null {\n let selected: CodeAgentPendingFollowUp | null = null;\n updateCodeAgentRunRecord(runId, (record) => {\n const [first, ...rest] = readPendingFollowUps(\n record.metadata?.pendingFollowUps,\n );\n selected = first ?? null;\n return {\n metadata: {\n pendingFollowUps: rest.length > 0 ? rest : undefined,\n },\n };\n });\n return selected;\n}\n\nfunction codeAgentRunRecordPath(runId: string): string {\n return path.join(codeAgentRunsDir(), `${runId}.json`);\n}\n\nfunction writeFileAtomically(filePath: string, contents: string): void {\n const directory = path.dirname(filePath);\n const temporaryPath = path.join(\n directory,\n `.${path.basename(filePath)}.tmp-${process.pid}-${crypto.randomUUID()}`,\n );\n let mode: number | undefined;\n try {\n mode = fs.statSync(filePath).mode & 0o777;\n } catch {\n // A new run record uses the process umask.\n }\n\n try {\n fs.writeFileSync(temporaryPath, contents, {\n encoding: \"utf-8\",\n flag: \"wx\",\n });\n if (mode !== undefined) fs.chmodSync(temporaryPath, mode);\n fs.renameSync(temporaryPath, filePath);\n } catch (error) {\n fs.rmSync(temporaryPath, { force: true });\n throw error;\n }\n}\n\nfunction readPendingFollowUps(value: unknown): CodeAgentPendingFollowUp[] {\n if (!Array.isArray(value)) return [];\n return value\n .map((item): CodeAgentPendingFollowUp | null => {\n if (!item || typeof item !== \"object\") return null;\n const candidate = item as Record<string, unknown>;\n if (\n typeof candidate.id !== \"string\" ||\n typeof candidate.prompt !== \"string\" ||\n typeof candidate.createdAt !== \"string\" ||\n (candidate.mode !== \"immediate\" && candidate.mode !== \"queued\")\n ) {\n return null;\n }\n return {\n id: candidate.id,\n prompt: candidate.prompt,\n mode: candidate.mode,\n createdAt: candidate.createdAt,\n eventId:\n typeof candidate.eventId === \"string\" ? candidate.eventId : undefined,\n permissionMode:\n normalizeCodeAgentPermissionMode(candidate.permissionMode) ??\n undefined,\n source:\n typeof candidate.source === \"string\" ? candidate.source : undefined,\n } satisfies CodeAgentPendingFollowUp;\n })\n .filter((item): item is CodeAgentPendingFollowUp => Boolean(item));\n}\n\nfunction touchCodeAgentRunRecord(runId: string, updatedAt: string): void {\n const record = readRunFile(codeAgentRunRecordPath(runId));\n if (!record) return;\n writeCodeAgentRunRecord({ ...record, updatedAt });\n}\n\nfunction readRunFile(filePath: string): CodeAgentRunRecord | null {\n try {\n const raw = JSON.parse(fs.readFileSync(filePath, \"utf-8\")) as unknown;\n if (!raw || typeof raw !== \"object\") return null;\n const record = raw as Partial<CodeAgentRunRecord>;\n if (\n record.schemaVersion !== 1 ||\n typeof record.id !== \"string\" ||\n typeof record.goalId !== \"string\" ||\n typeof record.title !== \"string\" ||\n typeof record.status !== \"string\" ||\n typeof record.cwd !== \"string\" ||\n typeof record.createdAt !== \"string\" ||\n typeof record.updatedAt !== \"string\"\n ) {\n return null;\n }\n return record as CodeAgentRunRecord;\n } catch {\n return null;\n }\n}\n\nfunction readTranscriptLine(line: string): CodeAgentTranscriptEvent | null {\n try {\n const raw = JSON.parse(line) as unknown;\n if (!raw || typeof raw !== \"object\") return null;\n const event = raw as Partial<CodeAgentTranscriptEvent> & {\n type?: unknown;\n role?: unknown;\n text?: unknown;\n content?: unknown;\n };\n const kind = isTranscriptEventKind(event.kind)\n ? event.kind\n : normalizeTranscriptKind(event.type ?? event.role);\n const message =\n typeof event.message === \"string\"\n ? event.message\n : typeof event.text === \"string\"\n ? event.text\n : typeof event.content === \"string\"\n ? event.content\n : undefined;\n if (\n event.schemaVersion !== 1 ||\n typeof event.id !== \"string\" ||\n typeof event.runId !== \"string\" ||\n !kind ||\n typeof message !== \"string\" ||\n typeof event.createdAt !== \"string\"\n ) {\n return null;\n }\n return {\n ...(event as Partial<CodeAgentTranscriptEvent>),\n kind,\n message,\n } as CodeAgentTranscriptEvent;\n } catch {\n return null;\n }\n}\n\nfunction normalizeTranscriptKind(\n value: unknown,\n): CodeAgentTranscriptEventKind | null {\n if (typeof value !== \"string\") return null;\n const normalized = value.toLowerCase();\n if (normalized === \"human\" || normalized === \"prompt\") return \"user\";\n if (normalized === \"assistant\") return \"system\";\n if (isTranscriptEventKind(normalized)) return normalized;\n return null;\n}\n\nfunction isTranscriptEventKind(\n value: unknown,\n): value is CodeAgentTranscriptEventKind {\n return (\n value === \"user\" ||\n value === \"system\" ||\n value === \"note\" ||\n value === \"artifact\" ||\n value === \"status\"\n );\n}\n\nfunction timestampSlug(value: string): string {\n return value.replace(/\\D/g, \"\").slice(0, 14);\n}\n"]}
@@ -0,0 +1,131 @@
1
+ export type MultiFrontierPhase = "proposing" | "cross_review" | "converging" | "awaiting_go" | "implementing" | "checkpoint_review" | "paused" | "completed" | "failed" | "canceled";
2
+ export type MultiFrontierParticipantRole = "driver" | "watchdog";
3
+ export type MultiFrontierParticipantPermission = "read_only" | "workspace_write";
4
+ export type MultiFrontierParticipantStatus = "idle" | "running" | "waiting" | "failed" | "completed";
5
+ export type MultiFrontierApprovalState = "not_required" | "pending" | "approved" | "rejected";
6
+ export type MultiFrontierRecoveryReason = "main_process_restarted" | "driver_crashed" | "watchdog_crashed" | "app_quit" | "canceled";
7
+ export interface MultiFrontierParticipantState {
8
+ participantId: string;
9
+ provider: string;
10
+ runtime: string;
11
+ model?: string;
12
+ capabilities?: string[];
13
+ sessionRef?: string;
14
+ role: MultiFrontierParticipantRole;
15
+ permission: MultiFrontierParticipantPermission;
16
+ status: MultiFrontierParticipantStatus;
17
+ }
18
+ export interface MultiFrontierDriverLease {
19
+ participantId: string;
20
+ generation: number;
21
+ leaseState: "inactive" | "active" | "revoked";
22
+ }
23
+ export interface MultiFrontierApproval {
24
+ state: MultiFrontierApprovalState;
25
+ proposalId?: string;
26
+ reviewPacketId?: string;
27
+ }
28
+ export interface MultiFrontierRecovery {
29
+ reason: MultiFrontierRecoveryReason;
30
+ recoveredAt: string;
31
+ resumablePhase: MultiFrontierPhase;
32
+ checkpointId?: string;
33
+ }
34
+ /**
35
+ * The durable state contract shared by the main process and every participant.
36
+ * Only the main-process coordinator writes it through this module.
37
+ */
38
+ export interface MultiFrontierRunState {
39
+ schemaVersion: 1;
40
+ collaborationId: string;
41
+ phase: MultiFrontierPhase;
42
+ participants: MultiFrontierParticipantState[];
43
+ driver: MultiFrontierDriverLease | null;
44
+ approval: MultiFrontierApproval;
45
+ checkpointIds: string[];
46
+ round: number;
47
+ proposalIds: string[];
48
+ reviewIds: string[];
49
+ recovery?: MultiFrontierRecovery;
50
+ }
51
+ export interface CreateMultiFrontierRunInput {
52
+ collaborationId: string;
53
+ phase?: MultiFrontierPhase;
54
+ participants: MultiFrontierParticipantState[];
55
+ approval?: MultiFrontierApproval;
56
+ checkpointIds?: string[];
57
+ }
58
+ export interface RecoverMultiFrontierRunInput {
59
+ now: string;
60
+ reason: MultiFrontierRecoveryReason;
61
+ }
62
+ export interface MultiFrontierParticipantEvent {
63
+ participantId: string;
64
+ generation?: number;
65
+ permission: MultiFrontierParticipantPermission;
66
+ }
67
+ export interface PersistedMultiFrontierParticipantEvent extends MultiFrontierParticipantEvent {
68
+ schemaVersion: 1;
69
+ id: string;
70
+ collaborationId: string;
71
+ createdAt: string;
72
+ status?: MultiFrontierParticipantStatus;
73
+ }
74
+ export interface AppendMultiFrontierParticipantEventInput extends MultiFrontierParticipantEvent {
75
+ id: string;
76
+ collaborationId: string;
77
+ createdAt?: string;
78
+ status?: MultiFrontierParticipantStatus;
79
+ }
80
+ export interface MultiFrontierStoredRun extends MultiFrontierRunState {
81
+ createdAt: string;
82
+ updatedAt: string;
83
+ }
84
+ export type AppendMultiFrontierParticipantEventResult = {
85
+ accepted: true;
86
+ deduplicated: boolean;
87
+ event: PersistedMultiFrontierParticipantEvent;
88
+ run: MultiFrontierStoredRun;
89
+ } | {
90
+ accepted: false;
91
+ reason: "missing-run" | "stale-driver" | "missing-participant" | "event-conflict" | "terminal-participant";
92
+ run: MultiFrontierStoredRun | null;
93
+ };
94
+ /** All multi-frontier state stays alongside the existing local Code store. */
95
+ export declare function multiFrontierRunsStoreRoot(): string;
96
+ export declare function multiFrontierRunsDir(): string;
97
+ export declare function multiFrontierParticipantEventsDir(): string;
98
+ export declare function createMultiFrontierRun(input: CreateMultiFrontierRunInput): MultiFrontierStoredRun;
99
+ export declare function getMultiFrontierRun(collaborationId: string): MultiFrontierStoredRun | null;
100
+ export declare function listMultiFrontierRuns(): MultiFrontierStoredRun[];
101
+ /**
102
+ * Recovery never resumes a native participant automatically. Any in-flight
103
+ * driver lease is revoked and requires an explicit, newly fenced activation.
104
+ */
105
+ export declare function recoverMultiFrontierRun(state: MultiFrontierRunState, input: RecoverMultiFrontierRunInput): MultiFrontierRunState;
106
+ /** Persist the recovery decision made by the main-process coordinator. */
107
+ export declare function recoverStoredMultiFrontierRun(collaborationId: string, input: RecoverMultiFrontierRunInput): MultiFrontierStoredRun | null;
108
+ /**
109
+ * Coordinators must call this before applying a participant event. Write
110
+ * events are accepted only from the active driver generation.
111
+ */
112
+ export declare function canApplyMultiFrontierParticipantEvent(state: MultiFrontierRunState, event: MultiFrontierParticipantEvent): boolean;
113
+ /**
114
+ * Explicitly restores a write lease after recovery. The generation increments
115
+ * so an event from the interrupted process can never regain write authority.
116
+ */
117
+ export declare function reactivateMultiFrontierDriver(state: MultiFrontierRunState, participantId: string): MultiFrontierRunState | null;
118
+ /** Assign the first explicit write lease for an implementing run. */
119
+ export declare function activateMultiFrontierDriver(state: MultiFrontierRunState, participantId: string): MultiFrontierRunState | null;
120
+ /** Persist the first explicit driver activation from the main-process coordinator. */
121
+ export declare function activateStoredMultiFrontierDriver(collaborationId: string, participantId: string, now?: string): MultiFrontierStoredRun | null;
122
+ /** Persist an explicit driver reactivation after the human-approved resume. */
123
+ export declare function reactivateStoredMultiFrontierDriver(collaborationId: string, participantId: string, now?: string): MultiFrontierStoredRun | null;
124
+ /**
125
+ * Appends an idempotent participant event after the coordinator has fenced it.
126
+ * The event journal is diagnostic; state is mutated only through this guarded
127
+ * coordinator entry point.
128
+ */
129
+ export declare function appendMultiFrontierParticipantEvent(input: AppendMultiFrontierParticipantEventInput): AppendMultiFrontierParticipantEventResult;
130
+ export declare function listMultiFrontierParticipantEvents(collaborationId: string): PersistedMultiFrontierParticipantEvent[];
131
+ //# sourceMappingURL=multi-frontier-runs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-frontier-runs.d.ts","sourceRoot":"","sources":["../../src/cli/multi-frontier-runs.ts"],"names":[],"mappings":"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"}