@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.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +12 -0
- package/corpus/core/package.json +3 -1
- package/corpus/core/src/cli/code-agent-executor.ts +17 -5
- package/corpus/core/src/cli/code-agent-runs.ts +43 -2
- package/corpus/core/src/cli/multi-frontier-runs.ts +841 -0
- package/corpus/core/src/coding-tools/index.ts +27 -8
- package/corpus/core/src/embeddings/index.ts +233 -0
- package/corpus/core/src/index.ts +2 -0
- package/corpus/core/src/search/index.ts +413 -0
- package/corpus/templates/brain/.agents/skills/brain/RUNBOOK.md +48 -5
- package/corpus/templates/brain/.agents/skills/brain/SKILL.md +46 -14
- package/corpus/templates/brain/README.md +34 -3
- package/corpus/templates/brain/actions/approve-proposal.ts +2 -0
- package/corpus/templates/brain/actions/claim-distillation.ts +24 -27
- package/corpus/templates/brain/actions/create-source.ts +1 -1
- package/corpus/templates/brain/actions/get-knowledge.ts +6 -2
- package/corpus/templates/brain/actions/get-pilot-report.ts +44 -8
- package/corpus/templates/brain/actions/import-capture.ts +21 -9
- package/corpus/templates/brain/actions/import-transcript.ts +42 -14
- package/corpus/templates/brain/actions/list-captures.ts +10 -1
- package/corpus/templates/brain/actions/list-distillation-queue.ts +39 -14
- package/corpus/templates/brain/actions/list-projects.ts +51 -0
- package/corpus/templates/brain/actions/list-proposals.ts +80 -4
- package/corpus/templates/brain/actions/list-sources.ts +17 -3
- package/corpus/templates/brain/actions/manage-project.ts +118 -0
- package/corpus/templates/brain/actions/mark-capture-distilled.ts +68 -20
- package/corpus/templates/brain/actions/navigate.ts +1 -0
- package/corpus/templates/brain/actions/reject-proposal.ts +6 -1
- package/corpus/templates/brain/actions/resanitize-captures.ts +159 -33
- package/corpus/templates/brain/actions/review-proposal.ts +2 -0
- package/corpus/templates/brain/actions/search-everything.ts +10 -1
- package/corpus/templates/brain/actions/search-knowledge.ts +1 -1
- package/corpus/templates/brain/actions/set-settings.ts +36 -1
- package/corpus/templates/brain/actions/update-proposal.ts +2 -0
- package/corpus/templates/brain/app/hooks/use-distillation-bridge.ts +18 -9
- package/corpus/templates/brain/app/hooks/use-navigation-state.ts +3 -0
- package/corpus/templates/brain/app/i18n-data.ts +731 -2
- package/corpus/templates/brain/app/lib/brain.ts +33 -1
- package/corpus/templates/brain/app/routes/ops.tsx +47 -0
- package/corpus/templates/brain/app/routes/review.tsx +41 -2
- package/corpus/templates/brain/app/routes/search.tsx +33 -2
- package/corpus/templates/brain/app/routes/settings.tsx +158 -0
- package/corpus/templates/brain/app/routes/sources.tsx +31 -0
- package/corpus/templates/brain/changelog/2026-07-19-added-private-source-safe-semantic-search.md +6 -0
- package/corpus/templates/brain/jobs/process-ingest-queue.ts +270 -36
- package/corpus/templates/brain/package.json +1 -0
- package/corpus/templates/brain/server/db/index.ts +18 -0
- package/corpus/templates/brain/server/db/schema.ts +197 -1
- package/corpus/templates/brain/server/jobs/distillation-queue.ts +12 -5
- package/corpus/templates/brain/server/lib/audiences.ts +708 -0
- package/corpus/templates/brain/server/lib/brain-health.ts +251 -38
- package/corpus/templates/brain/server/lib/brain.ts +877 -50
- package/corpus/templates/brain/server/lib/capture-sanitization.ts +217 -53
- package/corpus/templates/brain/server/lib/connectors.ts +556 -70
- package/corpus/templates/brain/server/lib/demo.ts +17 -4
- package/corpus/templates/brain/server/lib/hybrid-search.ts +363 -0
- package/corpus/templates/brain/server/lib/ingest-queue.ts +104 -0
- package/corpus/templates/brain/server/lib/privacy-readiness.ts +24 -0
- package/corpus/templates/brain/server/lib/search-index-contracts.ts +72 -0
- package/corpus/templates/brain/server/lib/search-index.ts +714 -0
- package/corpus/templates/brain/server/lib/search.ts +120 -4
- package/corpus/templates/brain/server/lib/sensitivity-policy.ts +174 -0
- package/corpus/templates/brain/server/lib/slack-events.ts +281 -0
- package/corpus/templates/brain/server/onboarding.ts +29 -0
- package/corpus/templates/brain/server/plugins/db.ts +204 -0
- package/corpus/templates/brain/server/register-secrets.ts +46 -0
- package/corpus/templates/brain/server/routes/api/_agent-native/brain/ingest.post.ts +36 -16
- package/corpus/templates/brain/server/routes/api/_agent-native/brain/slack-events.post.ts +28 -0
- package/corpus/templates/brain/shared/types.ts +10 -0
- package/dist/cli/code-agent-executor.d.ts +8 -9
- package/dist/cli/code-agent-executor.d.ts.map +1 -1
- package/dist/cli/code-agent-executor.js +9 -3
- package/dist/cli/code-agent-executor.js.map +1 -1
- package/dist/cli/code-agent-runs.d.ts +5 -0
- package/dist/cli/code-agent-runs.d.ts.map +1 -1
- package/dist/cli/code-agent-runs.js +33 -2
- package/dist/cli/code-agent-runs.js.map +1 -1
- package/dist/cli/multi-frontier-runs.d.ts +131 -0
- package/dist/cli/multi-frontier-runs.d.ts.map +1 -0
- package/dist/cli/multi-frontier-runs.js +529 -0
- package/dist/cli/multi-frontier-runs.js.map +1 -0
- package/dist/coding-tools/index.d.ts +1 -0
- package/dist/coding-tools/index.d.ts.map +1 -1
- package/dist/coding-tools/index.js +25 -7
- package/dist/coding-tools/index.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/embeddings/index.d.ts +24 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +172 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/progress/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/search/index.d.ts +88 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +267 -0
- package/dist/search/index.js.map +1 -0
- 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
|
-
|
|
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:
|
|
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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"}
|