@agent-native/core 0.111.3 → 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 (109) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +18 -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/migration-codemod.ts +59 -9
  7. package/corpus/core/src/cli/multi-frontier-runs.ts +841 -0
  8. package/corpus/core/src/coding-tools/index.ts +27 -8
  9. package/corpus/core/src/embeddings/index.ts +233 -0
  10. package/corpus/core/src/index.ts +2 -0
  11. package/corpus/core/src/search/index.ts +413 -0
  12. package/corpus/templates/brain/.agents/skills/brain/RUNBOOK.md +48 -5
  13. package/corpus/templates/brain/.agents/skills/brain/SKILL.md +46 -14
  14. package/corpus/templates/brain/README.md +34 -3
  15. package/corpus/templates/brain/actions/approve-proposal.ts +2 -0
  16. package/corpus/templates/brain/actions/claim-distillation.ts +24 -27
  17. package/corpus/templates/brain/actions/create-source.ts +1 -1
  18. package/corpus/templates/brain/actions/get-knowledge.ts +6 -2
  19. package/corpus/templates/brain/actions/get-pilot-report.ts +44 -8
  20. package/corpus/templates/brain/actions/import-capture.ts +21 -9
  21. package/corpus/templates/brain/actions/import-transcript.ts +42 -14
  22. package/corpus/templates/brain/actions/list-captures.ts +10 -1
  23. package/corpus/templates/brain/actions/list-distillation-queue.ts +39 -14
  24. package/corpus/templates/brain/actions/list-projects.ts +51 -0
  25. package/corpus/templates/brain/actions/list-proposals.ts +80 -4
  26. package/corpus/templates/brain/actions/list-sources.ts +17 -3
  27. package/corpus/templates/brain/actions/manage-project.ts +118 -0
  28. package/corpus/templates/brain/actions/mark-capture-distilled.ts +68 -20
  29. package/corpus/templates/brain/actions/navigate.ts +1 -0
  30. package/corpus/templates/brain/actions/reject-proposal.ts +6 -1
  31. package/corpus/templates/brain/actions/resanitize-captures.ts +159 -33
  32. package/corpus/templates/brain/actions/review-proposal.ts +2 -0
  33. package/corpus/templates/brain/actions/search-everything.ts +10 -1
  34. package/corpus/templates/brain/actions/search-knowledge.ts +1 -1
  35. package/corpus/templates/brain/actions/set-settings.ts +36 -1
  36. package/corpus/templates/brain/actions/update-proposal.ts +2 -0
  37. package/corpus/templates/brain/app/hooks/use-distillation-bridge.ts +18 -9
  38. package/corpus/templates/brain/app/hooks/use-navigation-state.ts +3 -0
  39. package/corpus/templates/brain/app/i18n-data.ts +731 -2
  40. package/corpus/templates/brain/app/lib/brain.ts +33 -1
  41. package/corpus/templates/brain/app/routes/ops.tsx +47 -0
  42. package/corpus/templates/brain/app/routes/review.tsx +41 -2
  43. package/corpus/templates/brain/app/routes/search.tsx +33 -2
  44. package/corpus/templates/brain/app/routes/settings.tsx +158 -0
  45. package/corpus/templates/brain/app/routes/sources.tsx +31 -0
  46. package/corpus/templates/brain/changelog/2026-07-19-added-private-source-safe-semantic-search.md +6 -0
  47. package/corpus/templates/brain/jobs/process-ingest-queue.ts +270 -36
  48. package/corpus/templates/brain/package.json +1 -0
  49. package/corpus/templates/brain/server/db/index.ts +18 -0
  50. package/corpus/templates/brain/server/db/schema.ts +197 -1
  51. package/corpus/templates/brain/server/jobs/distillation-queue.ts +12 -5
  52. package/corpus/templates/brain/server/lib/audiences.ts +708 -0
  53. package/corpus/templates/brain/server/lib/brain-health.ts +251 -38
  54. package/corpus/templates/brain/server/lib/brain.ts +877 -50
  55. package/corpus/templates/brain/server/lib/capture-sanitization.ts +217 -53
  56. package/corpus/templates/brain/server/lib/connectors.ts +556 -70
  57. package/corpus/templates/brain/server/lib/demo.ts +17 -4
  58. package/corpus/templates/brain/server/lib/hybrid-search.ts +363 -0
  59. package/corpus/templates/brain/server/lib/ingest-queue.ts +104 -0
  60. package/corpus/templates/brain/server/lib/privacy-readiness.ts +24 -0
  61. package/corpus/templates/brain/server/lib/search-index-contracts.ts +72 -0
  62. package/corpus/templates/brain/server/lib/search-index.ts +714 -0
  63. package/corpus/templates/brain/server/lib/search.ts +120 -4
  64. package/corpus/templates/brain/server/lib/sensitivity-policy.ts +174 -0
  65. package/corpus/templates/brain/server/lib/slack-events.ts +281 -0
  66. package/corpus/templates/brain/server/onboarding.ts +29 -0
  67. package/corpus/templates/brain/server/plugins/db.ts +204 -0
  68. package/corpus/templates/brain/server/register-secrets.ts +46 -0
  69. package/corpus/templates/brain/server/routes/api/_agent-native/brain/ingest.post.ts +36 -16
  70. package/corpus/templates/brain/server/routes/api/_agent-native/brain/slack-events.post.ts +28 -0
  71. package/corpus/templates/brain/shared/types.ts +10 -0
  72. package/dist/cli/code-agent-executor.d.ts +8 -9
  73. package/dist/cli/code-agent-executor.d.ts.map +1 -1
  74. package/dist/cli/code-agent-executor.js +9 -3
  75. package/dist/cli/code-agent-executor.js.map +1 -1
  76. package/dist/cli/code-agent-runs.d.ts +5 -0
  77. package/dist/cli/code-agent-runs.d.ts.map +1 -1
  78. package/dist/cli/code-agent-runs.js +33 -2
  79. package/dist/cli/code-agent-runs.js.map +1 -1
  80. package/dist/cli/migration-codemod.d.ts.map +1 -1
  81. package/dist/cli/migration-codemod.js +48 -10
  82. package/dist/cli/migration-codemod.js.map +1 -1
  83. package/dist/cli/multi-frontier-runs.d.ts +131 -0
  84. package/dist/cli/multi-frontier-runs.d.ts.map +1 -0
  85. package/dist/cli/multi-frontier-runs.js +529 -0
  86. package/dist/cli/multi-frontier-runs.js.map +1 -0
  87. package/dist/coding-tools/index.d.ts +1 -0
  88. package/dist/coding-tools/index.d.ts.map +1 -1
  89. package/dist/coding-tools/index.js +25 -7
  90. package/dist/coding-tools/index.js.map +1 -1
  91. package/dist/collab/awareness.d.ts +2 -2
  92. package/dist/collab/awareness.d.ts.map +1 -1
  93. package/dist/embeddings/index.d.ts +24 -0
  94. package/dist/embeddings/index.d.ts.map +1 -0
  95. package/dist/embeddings/index.js +172 -0
  96. package/dist/embeddings/index.js.map +1 -0
  97. package/dist/index.d.ts +2 -0
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +2 -0
  100. package/dist/index.js.map +1 -1
  101. package/dist/notifications/routes.d.ts +3 -3
  102. package/dist/progress/routes.d.ts +1 -1
  103. package/dist/resources/handlers.d.ts +1 -1
  104. package/dist/search/index.d.ts +88 -0
  105. package/dist/search/index.d.ts.map +1 -0
  106. package/dist/search/index.js +267 -0
  107. package/dist/search/index.js.map +1 -0
  108. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  109. package/package.json +3 -1
@@ -0,0 +1,529 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { codeAgentStoreRoot } from "./code-agent-runs.js";
5
+ const TERMINAL_PHASES = new Set([
6
+ "completed",
7
+ "failed",
8
+ "canceled",
9
+ ]);
10
+ const SAFE_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,191}$/;
11
+ /** All multi-frontier state stays alongside the existing local Code store. */
12
+ export function multiFrontierRunsStoreRoot() {
13
+ return path.join(codeAgentStoreRoot(), "multi-frontier");
14
+ }
15
+ export function multiFrontierRunsDir() {
16
+ return path.join(multiFrontierRunsStoreRoot(), "runs");
17
+ }
18
+ export function multiFrontierParticipantEventsDir() {
19
+ return path.join(multiFrontierRunsStoreRoot(), "events");
20
+ }
21
+ export function createMultiFrontierRun(input) {
22
+ assertSafeId(input.collaborationId, "collaboration id");
23
+ assertParticipants(input.participants);
24
+ if (getMultiFrontierRun(input.collaborationId)) {
25
+ throw new Error(`Multi-frontier run already exists: ${input.collaborationId}`);
26
+ }
27
+ const now = new Date().toISOString();
28
+ const state = {
29
+ schemaVersion: 1,
30
+ collaborationId: input.collaborationId,
31
+ phase: input.phase ?? "proposing",
32
+ participants: input.participants.map((participant) => ({
33
+ ...participant,
34
+ capabilities: [...(participant.capabilities ?? [])],
35
+ role: "watchdog",
36
+ permission: "read_only",
37
+ })),
38
+ driver: null,
39
+ approval: { ...(input.approval ?? { state: "not_required" }) },
40
+ checkpointIds: [...(input.checkpointIds ?? [])],
41
+ round: 1,
42
+ proposalIds: [],
43
+ reviewIds: [],
44
+ createdAt: now,
45
+ updatedAt: now,
46
+ };
47
+ writeNewMultiFrontierRun(state);
48
+ return state;
49
+ }
50
+ export function getMultiFrontierRun(collaborationId) {
51
+ if (!SAFE_ID.test(collaborationId))
52
+ return null;
53
+ return readStoredRun(multiFrontierRunPath(collaborationId));
54
+ }
55
+ export function listMultiFrontierRuns() {
56
+ const directory = multiFrontierRunsDir();
57
+ if (!fs.existsSync(directory))
58
+ return [];
59
+ return fs
60
+ .readdirSync(directory)
61
+ .filter((file) => file.endsWith(".json"))
62
+ .map((file) => readStoredRun(path.join(directory, file)))
63
+ .filter((run) => run !== null)
64
+ .sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
65
+ }
66
+ /**
67
+ * Recovery never resumes a native participant automatically. Any in-flight
68
+ * driver lease is revoked and requires an explicit, newly fenced activation.
69
+ */
70
+ export function recoverMultiFrontierRun(state, input) {
71
+ assertTimestamp(input.now, "recovery time");
72
+ if (TERMINAL_PHASES.has(state.phase) || state.phase === "paused") {
73
+ return state;
74
+ }
75
+ const checkpointId = state.checkpointIds.at(-1);
76
+ return {
77
+ ...state,
78
+ phase: "paused",
79
+ participants: state.participants.map((participant) => ({
80
+ ...participant,
81
+ permission: "read_only",
82
+ status: participant.status === "running" ? "waiting" : participant.status,
83
+ })),
84
+ driver: state.driver ? { ...state.driver, leaseState: "revoked" } : null,
85
+ recovery: {
86
+ reason: input.reason,
87
+ recoveredAt: input.now,
88
+ resumablePhase: state.phase,
89
+ ...(checkpointId ? { checkpointId } : {}),
90
+ },
91
+ };
92
+ }
93
+ /** Persist the recovery decision made by the main-process coordinator. */
94
+ export function recoverStoredMultiFrontierRun(collaborationId, input) {
95
+ const current = getMultiFrontierRun(collaborationId);
96
+ if (!current)
97
+ return null;
98
+ const recovered = recoverMultiFrontierRun(current, input);
99
+ if (recovered === current)
100
+ return current;
101
+ return writeNextStoredRun(current, recovered, input.now);
102
+ }
103
+ /**
104
+ * Coordinators must call this before applying a participant event. Write
105
+ * events are accepted only from the active driver generation.
106
+ */
107
+ export function canApplyMultiFrontierParticipantEvent(state, event) {
108
+ if (TERMINAL_PHASES.has(state.phase) || state.phase === "paused") {
109
+ return false;
110
+ }
111
+ if (!state.participants.some((candidate) => candidate.participantId === event.participantId)) {
112
+ return false;
113
+ }
114
+ if (event.permission === "read_only")
115
+ return true;
116
+ const driver = state.driver;
117
+ return Boolean(state.phase === "implementing" &&
118
+ driver?.leaseState === "active" &&
119
+ driver.participantId === event.participantId &&
120
+ driver.generation === event.generation);
121
+ }
122
+ /**
123
+ * Explicitly restores a write lease after recovery. The generation increments
124
+ * so an event from the interrupted process can never regain write authority.
125
+ */
126
+ export function reactivateMultiFrontierDriver(state, participantId) {
127
+ if (state.phase !== "paused" ||
128
+ !state.recovery ||
129
+ state.recovery.resumablePhase !== "implementing" ||
130
+ state.approval.state === "pending") {
131
+ return null;
132
+ }
133
+ const participant = state.participants.find((candidate) => candidate.participantId === participantId);
134
+ if (!participant || participant.status === "failed")
135
+ return null;
136
+ const nextGeneration = (state.driver?.generation ?? 0) + 1;
137
+ return {
138
+ ...state,
139
+ phase: state.recovery.resumablePhase,
140
+ participants: state.participants.map((candidate) => ({
141
+ ...candidate,
142
+ role: candidate.participantId === participantId ? "driver" : "watchdog",
143
+ permission: candidate.participantId === participantId
144
+ ? "workspace_write"
145
+ : "read_only",
146
+ status: candidate.participantId === participantId
147
+ ? "waiting"
148
+ : candidate.status,
149
+ })),
150
+ driver: {
151
+ participantId,
152
+ generation: nextGeneration,
153
+ leaseState: "active",
154
+ },
155
+ recovery: undefined,
156
+ };
157
+ }
158
+ /** Assign the first explicit write lease for an implementing run. */
159
+ export function activateMultiFrontierDriver(state, participantId) {
160
+ if (state.phase !== "implementing" ||
161
+ state.approval.state === "pending" ||
162
+ state.driver?.leaseState === "active") {
163
+ return null;
164
+ }
165
+ const participant = state.participants.find((candidate) => candidate.participantId === participantId);
166
+ if (!participant || participant.status === "failed")
167
+ return null;
168
+ return {
169
+ ...state,
170
+ participants: state.participants.map((candidate) => ({
171
+ ...candidate,
172
+ role: candidate.participantId === participantId ? "driver" : "watchdog",
173
+ permission: candidate.participantId === participantId
174
+ ? "workspace_write"
175
+ : "read_only",
176
+ })),
177
+ driver: {
178
+ participantId,
179
+ generation: (state.driver?.generation ?? 0) + 1,
180
+ leaseState: "active",
181
+ },
182
+ };
183
+ }
184
+ /** Persist the first explicit driver activation from the main-process coordinator. */
185
+ export function activateStoredMultiFrontierDriver(collaborationId, participantId, now = new Date().toISOString()) {
186
+ assertTimestamp(now, "activation time");
187
+ const current = getMultiFrontierRun(collaborationId);
188
+ if (!current)
189
+ return null;
190
+ const activated = activateMultiFrontierDriver(current, participantId);
191
+ return activated ? writeNextStoredRun(current, activated, now) : null;
192
+ }
193
+ /** Persist an explicit driver reactivation after the human-approved resume. */
194
+ export function reactivateStoredMultiFrontierDriver(collaborationId, participantId, now = new Date().toISOString()) {
195
+ assertTimestamp(now, "reactivation time");
196
+ const current = getMultiFrontierRun(collaborationId);
197
+ if (!current)
198
+ return null;
199
+ const reactivated = reactivateMultiFrontierDriver(current, participantId);
200
+ return reactivated ? writeNextStoredRun(current, reactivated, now) : null;
201
+ }
202
+ /**
203
+ * Appends an idempotent participant event after the coordinator has fenced it.
204
+ * The event journal is diagnostic; state is mutated only through this guarded
205
+ * coordinator entry point.
206
+ */
207
+ export function appendMultiFrontierParticipantEvent(input) {
208
+ assertSafeId(input.id, "event id");
209
+ assertSafeId(input.collaborationId, "collaboration id");
210
+ assertSafeId(input.participantId, "participant id");
211
+ const createdAt = input.createdAt ?? new Date().toISOString();
212
+ assertTimestamp(createdAt, "event time");
213
+ const current = getMultiFrontierRun(input.collaborationId);
214
+ if (!current)
215
+ return { accepted: false, reason: "missing-run", run: null };
216
+ const existing = listMultiFrontierParticipantEvents(input.collaborationId).find((event) => event.id === input.id);
217
+ if (existing) {
218
+ if (!isMatchingParticipantEvent(existing, input)) {
219
+ return { accepted: false, reason: "event-conflict", run: current };
220
+ }
221
+ return {
222
+ accepted: true,
223
+ deduplicated: true,
224
+ event: existing,
225
+ run: current,
226
+ };
227
+ }
228
+ if (!current.participants.some((candidate) => candidate.participantId === input.participantId)) {
229
+ return { accepted: false, reason: "missing-participant", run: current };
230
+ }
231
+ if (!canApplyMultiFrontierParticipantEvent(current, input)) {
232
+ return { accepted: false, reason: "stale-driver", run: current };
233
+ }
234
+ const participant = current.participants.find((candidate) => candidate.participantId === input.participantId);
235
+ if (input.status !== undefined &&
236
+ (participant?.status === "completed" || participant?.status === "failed") &&
237
+ input.status !== participant.status) {
238
+ return { accepted: false, reason: "terminal-participant", run: current };
239
+ }
240
+ const event = {
241
+ schemaVersion: 1,
242
+ id: input.id,
243
+ collaborationId: input.collaborationId,
244
+ participantId: input.participantId,
245
+ permission: input.permission,
246
+ createdAt,
247
+ ...(input.generation === undefined ? {} : { generation: input.generation }),
248
+ ...(input.status === undefined ? {} : { status: input.status }),
249
+ };
250
+ appendParticipantEvent(event);
251
+ const participants = input.status
252
+ ? current.participants.map((candidate) => candidate.participantId === input.participantId
253
+ ? { ...candidate, status: input.status }
254
+ : candidate)
255
+ : current.participants;
256
+ const run = writeNextStoredRun(current, { ...current, participants }, createdAt);
257
+ return { accepted: true, deduplicated: false, event, run };
258
+ }
259
+ export function listMultiFrontierParticipantEvents(collaborationId) {
260
+ if (!SAFE_ID.test(collaborationId))
261
+ return [];
262
+ const eventPath = multiFrontierParticipantEventsPath(collaborationId);
263
+ if (!fs.existsSync(eventPath))
264
+ return [];
265
+ return fs
266
+ .readFileSync(eventPath, "utf-8")
267
+ .split(/\r?\n/)
268
+ .filter(Boolean)
269
+ .map(readParticipantEvent)
270
+ .filter((event) => event !== null);
271
+ }
272
+ function writeMultiFrontierRun(run) {
273
+ fs.mkdirSync(multiFrontierRunsDir(), { recursive: true });
274
+ writeFileAtomically(multiFrontierRunPath(run.collaborationId), `${JSON.stringify(run, null, 2)}\n`);
275
+ }
276
+ function writeNewMultiFrontierRun(run) {
277
+ fs.mkdirSync(multiFrontierRunsDir(), { recursive: true });
278
+ try {
279
+ fs.writeFileSync(multiFrontierRunPath(run.collaborationId), `${JSON.stringify(run, null, 2)}\n`, { encoding: "utf-8", flag: "wx" });
280
+ }
281
+ catch (error) {
282
+ if (error.code === "EEXIST") {
283
+ throw new Error(`Multi-frontier run already exists: ${run.collaborationId}`);
284
+ }
285
+ throw error;
286
+ }
287
+ }
288
+ function writeNextStoredRun(current, nextState, updatedAt) {
289
+ const next = {
290
+ ...nextState,
291
+ createdAt: current.createdAt,
292
+ updatedAt,
293
+ };
294
+ writeMultiFrontierRun(next);
295
+ return next;
296
+ }
297
+ function appendParticipantEvent(event) {
298
+ fs.mkdirSync(multiFrontierParticipantEventsDir(), { recursive: true });
299
+ fs.appendFileSync(multiFrontierParticipantEventsPath(event.collaborationId), `${JSON.stringify(event)}\n`);
300
+ }
301
+ function multiFrontierRunPath(collaborationId) {
302
+ return path.join(multiFrontierRunsDir(), `${collaborationId}.json`);
303
+ }
304
+ function multiFrontierParticipantEventsPath(collaborationId) {
305
+ return path.join(multiFrontierParticipantEventsDir(), `${collaborationId}.jsonl`);
306
+ }
307
+ function readStoredRun(filePath) {
308
+ try {
309
+ const raw = JSON.parse(fs.readFileSync(filePath, "utf-8"));
310
+ if (!raw || typeof raw !== "object")
311
+ return null;
312
+ const run = raw;
313
+ if (run.schemaVersion !== 1 ||
314
+ typeof run.collaborationId !== "string" ||
315
+ !SAFE_ID.test(run.collaborationId) ||
316
+ !isPhase(run.phase) ||
317
+ !isStoredRunParticipantsAndDriverValid(run.participants, run.driver) ||
318
+ !isApproval(run.approval) ||
319
+ !Array.isArray(run.checkpointIds) ||
320
+ !run.checkpointIds.every((checkpointId) => typeof checkpointId === "string") ||
321
+ typeof run.round !== "number" ||
322
+ !Number.isInteger(run.round) ||
323
+ run.round < 1 ||
324
+ !isStringArray(run.proposalIds) ||
325
+ !isStringArray(run.reviewIds) ||
326
+ (run.recovery !== undefined && !isRecovery(run.recovery)) ||
327
+ typeof run.createdAt !== "string" ||
328
+ Number.isNaN(Date.parse(run.createdAt)) ||
329
+ typeof run.updatedAt !== "string" ||
330
+ Number.isNaN(Date.parse(run.updatedAt))) {
331
+ return null;
332
+ }
333
+ return run;
334
+ }
335
+ catch {
336
+ return null;
337
+ }
338
+ }
339
+ function readParticipantEvent(line) {
340
+ try {
341
+ const raw = JSON.parse(line);
342
+ if (!raw || typeof raw !== "object")
343
+ return null;
344
+ const event = raw;
345
+ if (event.schemaVersion !== 1 ||
346
+ typeof event.id !== "string" ||
347
+ typeof event.collaborationId !== "string" ||
348
+ typeof event.participantId !== "string" ||
349
+ !isPermission(event.permission) ||
350
+ (event.generation !== undefined &&
351
+ typeof event.generation !== "number") ||
352
+ (event.status !== undefined && !isParticipantStatus(event.status)) ||
353
+ typeof event.createdAt !== "string" ||
354
+ Number.isNaN(Date.parse(event.createdAt))) {
355
+ return null;
356
+ }
357
+ return event;
358
+ }
359
+ catch {
360
+ return null;
361
+ }
362
+ }
363
+ function assertParticipants(participants) {
364
+ if (participants.length === 0) {
365
+ throw new Error("A multi-frontier run needs at least one participant.");
366
+ }
367
+ const participantIds = new Set();
368
+ for (const participant of participants) {
369
+ if (!isParticipant(participant))
370
+ throw new Error("Invalid multi-frontier participant.");
371
+ assertSafeId(participant.participantId, "participant id");
372
+ if (participantIds.has(participant.participantId)) {
373
+ throw new Error(`Duplicate multi-frontier participant id: ${participant.participantId}`);
374
+ }
375
+ participantIds.add(participant.participantId);
376
+ }
377
+ }
378
+ function isParticipant(value) {
379
+ if (!value || typeof value !== "object")
380
+ return false;
381
+ const participant = value;
382
+ return (typeof participant.participantId === "string" &&
383
+ SAFE_ID.test(participant.participantId) &&
384
+ typeof participant.provider === "string" &&
385
+ participant.provider.length > 0 &&
386
+ typeof participant.runtime === "string" &&
387
+ participant.runtime.length > 0 &&
388
+ (participant.model === undefined ||
389
+ typeof participant.model === "string") &&
390
+ (participant.capabilities === undefined ||
391
+ isStringArray(participant.capabilities)) &&
392
+ (participant.sessionRef === undefined ||
393
+ typeof participant.sessionRef === "string") &&
394
+ (participant.role === "driver" || participant.role === "watchdog") &&
395
+ isPermission(participant.permission) &&
396
+ isParticipantStatus(participant.status));
397
+ }
398
+ function areStoredParticipantsValid(value) {
399
+ if (!Array.isArray(value) ||
400
+ value.length === 0 ||
401
+ !value.every(isParticipant)) {
402
+ return false;
403
+ }
404
+ return (new Set(value.map((participant) => participant.participantId)).size ===
405
+ value.length);
406
+ }
407
+ function isStoredRunParticipantsAndDriverValid(participants, driver) {
408
+ if (!areStoredParticipantsValid(participants) || !isDriver(driver)) {
409
+ return false;
410
+ }
411
+ if (driver?.leaseState !== "active") {
412
+ return participants.every((participant) => participant.permission === "read_only");
413
+ }
414
+ if (!participants.some((participant) => participant.participantId === driver.participantId)) {
415
+ return false;
416
+ }
417
+ return participants.every((participant) => {
418
+ if (participant.participantId !== driver.participantId) {
419
+ return (participant.role === "watchdog" &&
420
+ participant.permission === "read_only");
421
+ }
422
+ return (participant.role === "driver" &&
423
+ participant.permission === "workspace_write");
424
+ });
425
+ }
426
+ function isDriver(value) {
427
+ if (value === null)
428
+ return true;
429
+ if (!value || typeof value !== "object")
430
+ return false;
431
+ const driver = value;
432
+ return (typeof driver.participantId === "string" &&
433
+ typeof driver.generation === "number" &&
434
+ (driver.leaseState === "inactive" ||
435
+ driver.leaseState === "active" ||
436
+ driver.leaseState === "revoked"));
437
+ }
438
+ function isApproval(value) {
439
+ if (!value || typeof value !== "object")
440
+ return false;
441
+ const approval = value;
442
+ return ((approval.state === "not_required" ||
443
+ approval.state === "pending" ||
444
+ approval.state === "approved" ||
445
+ approval.state === "rejected") &&
446
+ (approval.proposalId === undefined ||
447
+ typeof approval.proposalId === "string") &&
448
+ (approval.reviewPacketId === undefined ||
449
+ typeof approval.reviewPacketId === "string"));
450
+ }
451
+ function isRecovery(value) {
452
+ if (!value || typeof value !== "object")
453
+ return false;
454
+ const recovery = value;
455
+ return (isRecoveryReason(recovery.reason) &&
456
+ typeof recovery.recoveredAt === "string" &&
457
+ !Number.isNaN(Date.parse(recovery.recoveredAt)) &&
458
+ isPhase(recovery.resumablePhase) &&
459
+ (recovery.checkpointId === undefined ||
460
+ typeof recovery.checkpointId === "string"));
461
+ }
462
+ function isPhase(value) {
463
+ return (typeof value === "string" &&
464
+ [
465
+ "proposing",
466
+ "cross_review",
467
+ "converging",
468
+ "awaiting_go",
469
+ "implementing",
470
+ "checkpoint_review",
471
+ "paused",
472
+ "completed",
473
+ "failed",
474
+ "canceled",
475
+ ].includes(value));
476
+ }
477
+ function isParticipantStatus(value) {
478
+ return (value === "idle" ||
479
+ value === "running" ||
480
+ value === "waiting" ||
481
+ value === "failed" ||
482
+ value === "completed");
483
+ }
484
+ function isPermission(value) {
485
+ return value === "read_only" || value === "workspace_write";
486
+ }
487
+ function isMatchingParticipantEvent(existing, input) {
488
+ return (existing.collaborationId === input.collaborationId &&
489
+ existing.participantId === input.participantId &&
490
+ existing.permission === input.permission &&
491
+ existing.generation === input.generation &&
492
+ existing.status === input.status &&
493
+ (input.createdAt === undefined || existing.createdAt === input.createdAt));
494
+ }
495
+ function isStringArray(value) {
496
+ return (Array.isArray(value) && value.every((item) => typeof item === "string"));
497
+ }
498
+ function isRecoveryReason(value) {
499
+ return (value === "main_process_restarted" ||
500
+ value === "driver_crashed" ||
501
+ value === "watchdog_crashed" ||
502
+ value === "app_quit" ||
503
+ value === "canceled");
504
+ }
505
+ function assertSafeId(value, label) {
506
+ if (!SAFE_ID.test(value))
507
+ throw new Error(`Invalid multi-frontier ${label}.`);
508
+ }
509
+ function assertTimestamp(value, label) {
510
+ if (Number.isNaN(Date.parse(value))) {
511
+ throw new Error(`Invalid multi-frontier ${label}.`);
512
+ }
513
+ }
514
+ function writeFileAtomically(filePath, contents) {
515
+ const directory = path.dirname(filePath);
516
+ const temporaryPath = path.join(directory, `.${path.basename(filePath)}.tmp-${process.pid}-${crypto.randomUUID()}`);
517
+ try {
518
+ fs.writeFileSync(temporaryPath, contents, {
519
+ encoding: "utf-8",
520
+ flag: "wx",
521
+ });
522
+ fs.renameSync(temporaryPath, filePath);
523
+ }
524
+ catch (error) {
525
+ fs.rmSync(temporaryPath, { force: true });
526
+ throw error;
527
+ }
528
+ }
529
+ //# sourceMappingURL=multi-frontier-runs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-frontier-runs.js","sourceRoot":"","sources":["../../src/cli/multi-frontier-runs.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport { codeAgentStoreRoot } from \"./code-agent-runs.js\";\n\nexport type MultiFrontierPhase =\n | \"proposing\"\n | \"cross_review\"\n | \"converging\"\n | \"awaiting_go\"\n | \"implementing\"\n | \"checkpoint_review\"\n | \"paused\"\n | \"completed\"\n | \"failed\"\n | \"canceled\";\n\nexport type MultiFrontierParticipantRole = \"driver\" | \"watchdog\";\nexport type MultiFrontierParticipantPermission =\n | \"read_only\"\n | \"workspace_write\";\nexport type MultiFrontierParticipantStatus =\n | \"idle\"\n | \"running\"\n | \"waiting\"\n | \"failed\"\n | \"completed\";\nexport type MultiFrontierApprovalState =\n | \"not_required\"\n | \"pending\"\n | \"approved\"\n | \"rejected\";\nexport type MultiFrontierRecoveryReason =\n | \"main_process_restarted\"\n | \"driver_crashed\"\n | \"watchdog_crashed\"\n | \"app_quit\"\n | \"canceled\";\n\nexport interface MultiFrontierParticipantState {\n participantId: string;\n provider: string;\n runtime: string;\n model?: string;\n capabilities?: string[];\n sessionRef?: string;\n role: MultiFrontierParticipantRole;\n permission: MultiFrontierParticipantPermission;\n status: MultiFrontierParticipantStatus;\n}\n\nexport interface MultiFrontierDriverLease {\n participantId: string;\n generation: number;\n leaseState: \"inactive\" | \"active\" | \"revoked\";\n}\n\nexport interface MultiFrontierApproval {\n state: MultiFrontierApprovalState;\n proposalId?: string;\n reviewPacketId?: string;\n}\n\nexport interface MultiFrontierRecovery {\n reason: MultiFrontierRecoveryReason;\n recoveredAt: string;\n resumablePhase: MultiFrontierPhase;\n checkpointId?: string;\n}\n\n/**\n * The durable state contract shared by the main process and every participant.\n * Only the main-process coordinator writes it through this module.\n */\nexport interface MultiFrontierRunState {\n schemaVersion: 1;\n collaborationId: string;\n phase: MultiFrontierPhase;\n participants: MultiFrontierParticipantState[];\n driver: MultiFrontierDriverLease | null;\n approval: MultiFrontierApproval;\n checkpointIds: string[];\n round: number;\n proposalIds: string[];\n reviewIds: string[];\n recovery?: MultiFrontierRecovery;\n}\n\nexport interface CreateMultiFrontierRunInput {\n collaborationId: string;\n phase?: MultiFrontierPhase;\n participants: MultiFrontierParticipantState[];\n approval?: MultiFrontierApproval;\n checkpointIds?: string[];\n}\n\nexport interface RecoverMultiFrontierRunInput {\n now: string;\n reason: MultiFrontierRecoveryReason;\n}\n\nexport interface MultiFrontierParticipantEvent {\n participantId: string;\n generation?: number;\n permission: MultiFrontierParticipantPermission;\n}\n\nexport interface PersistedMultiFrontierParticipantEvent extends MultiFrontierParticipantEvent {\n schemaVersion: 1;\n id: string;\n collaborationId: string;\n createdAt: string;\n status?: MultiFrontierParticipantStatus;\n}\n\nexport interface AppendMultiFrontierParticipantEventInput extends MultiFrontierParticipantEvent {\n id: string;\n collaborationId: string;\n createdAt?: string;\n status?: MultiFrontierParticipantStatus;\n}\n\nexport interface MultiFrontierStoredRun extends MultiFrontierRunState {\n createdAt: string;\n updatedAt: string;\n}\n\nexport type AppendMultiFrontierParticipantEventResult =\n | {\n accepted: true;\n deduplicated: boolean;\n event: PersistedMultiFrontierParticipantEvent;\n run: MultiFrontierStoredRun;\n }\n | {\n accepted: false;\n reason:\n | \"missing-run\"\n | \"stale-driver\"\n | \"missing-participant\"\n | \"event-conflict\"\n | \"terminal-participant\";\n run: MultiFrontierStoredRun | null;\n };\n\nconst TERMINAL_PHASES = new Set<MultiFrontierPhase>([\n \"completed\",\n \"failed\",\n \"canceled\",\n]);\nconst SAFE_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,191}$/;\n\n/** All multi-frontier state stays alongside the existing local Code store. */\nexport function multiFrontierRunsStoreRoot(): string {\n return path.join(codeAgentStoreRoot(), \"multi-frontier\");\n}\n\nexport function multiFrontierRunsDir(): string {\n return path.join(multiFrontierRunsStoreRoot(), \"runs\");\n}\n\nexport function multiFrontierParticipantEventsDir(): string {\n return path.join(multiFrontierRunsStoreRoot(), \"events\");\n}\n\nexport function createMultiFrontierRun(\n input: CreateMultiFrontierRunInput,\n): MultiFrontierStoredRun {\n assertSafeId(input.collaborationId, \"collaboration id\");\n assertParticipants(input.participants);\n if (getMultiFrontierRun(input.collaborationId)) {\n throw new Error(\n `Multi-frontier run already exists: ${input.collaborationId}`,\n );\n }\n const now = new Date().toISOString();\n const state: MultiFrontierStoredRun = {\n schemaVersion: 1,\n collaborationId: input.collaborationId,\n phase: input.phase ?? \"proposing\",\n participants: input.participants.map((participant) => ({\n ...participant,\n capabilities: [...(participant.capabilities ?? [])],\n role: \"watchdog\",\n permission: \"read_only\",\n })),\n driver: null,\n approval: { ...(input.approval ?? { state: \"not_required\" }) },\n checkpointIds: [...(input.checkpointIds ?? [])],\n round: 1,\n proposalIds: [],\n reviewIds: [],\n createdAt: now,\n updatedAt: now,\n };\n writeNewMultiFrontierRun(state);\n return state;\n}\n\nexport function getMultiFrontierRun(\n collaborationId: string,\n): MultiFrontierStoredRun | null {\n if (!SAFE_ID.test(collaborationId)) return null;\n return readStoredRun(multiFrontierRunPath(collaborationId));\n}\n\nexport function listMultiFrontierRuns(): MultiFrontierStoredRun[] {\n const directory = multiFrontierRunsDir();\n if (!fs.existsSync(directory)) return [];\n return fs\n .readdirSync(directory)\n .filter((file) => file.endsWith(\".json\"))\n .map((file) => readStoredRun(path.join(directory, file)))\n .filter((run): run is MultiFrontierStoredRun => run !== null)\n .sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));\n}\n\n/**\n * Recovery never resumes a native participant automatically. Any in-flight\n * driver lease is revoked and requires an explicit, newly fenced activation.\n */\nexport function recoverMultiFrontierRun(\n state: MultiFrontierRunState,\n input: RecoverMultiFrontierRunInput,\n): MultiFrontierRunState {\n assertTimestamp(input.now, \"recovery time\");\n if (TERMINAL_PHASES.has(state.phase) || state.phase === \"paused\") {\n return state;\n }\n\n const checkpointId = state.checkpointIds.at(-1);\n return {\n ...state,\n phase: \"paused\",\n participants: state.participants.map((participant) => ({\n ...participant,\n permission: \"read_only\",\n status: participant.status === \"running\" ? \"waiting\" : participant.status,\n })),\n driver: state.driver ? { ...state.driver, leaseState: \"revoked\" } : null,\n recovery: {\n reason: input.reason,\n recoveredAt: input.now,\n resumablePhase: state.phase,\n ...(checkpointId ? { checkpointId } : {}),\n },\n };\n}\n\n/** Persist the recovery decision made by the main-process coordinator. */\nexport function recoverStoredMultiFrontierRun(\n collaborationId: string,\n input: RecoverMultiFrontierRunInput,\n): MultiFrontierStoredRun | null {\n const current = getMultiFrontierRun(collaborationId);\n if (!current) return null;\n const recovered = recoverMultiFrontierRun(current, input);\n if (recovered === current) return current;\n return writeNextStoredRun(current, recovered, input.now);\n}\n\n/**\n * Coordinators must call this before applying a participant event. Write\n * events are accepted only from the active driver generation.\n */\nexport function canApplyMultiFrontierParticipantEvent(\n state: MultiFrontierRunState,\n event: MultiFrontierParticipantEvent,\n): boolean {\n if (TERMINAL_PHASES.has(state.phase) || state.phase === \"paused\") {\n return false;\n }\n if (\n !state.participants.some(\n (candidate) => candidate.participantId === event.participantId,\n )\n ) {\n return false;\n }\n if (event.permission === \"read_only\") return true;\n const driver = state.driver;\n return Boolean(\n state.phase === \"implementing\" &&\n driver?.leaseState === \"active\" &&\n driver.participantId === event.participantId &&\n driver.generation === event.generation,\n );\n}\n\n/**\n * Explicitly restores a write lease after recovery. The generation increments\n * so an event from the interrupted process can never regain write authority.\n */\nexport function reactivateMultiFrontierDriver(\n state: MultiFrontierRunState,\n participantId: string,\n): MultiFrontierRunState | null {\n if (\n state.phase !== \"paused\" ||\n !state.recovery ||\n state.recovery.resumablePhase !== \"implementing\" ||\n state.approval.state === \"pending\"\n ) {\n return null;\n }\n const participant = state.participants.find(\n (candidate) => candidate.participantId === participantId,\n );\n if (!participant || participant.status === \"failed\") return null;\n\n const nextGeneration = (state.driver?.generation ?? 0) + 1;\n return {\n ...state,\n phase: state.recovery.resumablePhase,\n participants: state.participants.map((candidate) => ({\n ...candidate,\n role: candidate.participantId === participantId ? \"driver\" : \"watchdog\",\n permission:\n candidate.participantId === participantId\n ? \"workspace_write\"\n : \"read_only\",\n status:\n candidate.participantId === participantId\n ? \"waiting\"\n : candidate.status,\n })),\n driver: {\n participantId,\n generation: nextGeneration,\n leaseState: \"active\",\n },\n recovery: undefined,\n };\n}\n\n/** Assign the first explicit write lease for an implementing run. */\nexport function activateMultiFrontierDriver(\n state: MultiFrontierRunState,\n participantId: string,\n): MultiFrontierRunState | null {\n if (\n state.phase !== \"implementing\" ||\n state.approval.state === \"pending\" ||\n state.driver?.leaseState === \"active\"\n ) {\n return null;\n }\n const participant = state.participants.find(\n (candidate) => candidate.participantId === participantId,\n );\n if (!participant || participant.status === \"failed\") return null;\n\n return {\n ...state,\n participants: state.participants.map((candidate) => ({\n ...candidate,\n role: candidate.participantId === participantId ? \"driver\" : \"watchdog\",\n permission:\n candidate.participantId === participantId\n ? \"workspace_write\"\n : \"read_only\",\n })),\n driver: {\n participantId,\n generation: (state.driver?.generation ?? 0) + 1,\n leaseState: \"active\",\n },\n };\n}\n\n/** Persist the first explicit driver activation from the main-process coordinator. */\nexport function activateStoredMultiFrontierDriver(\n collaborationId: string,\n participantId: string,\n now = new Date().toISOString(),\n): MultiFrontierStoredRun | null {\n assertTimestamp(now, \"activation time\");\n const current = getMultiFrontierRun(collaborationId);\n if (!current) return null;\n const activated = activateMultiFrontierDriver(current, participantId);\n return activated ? writeNextStoredRun(current, activated, now) : null;\n}\n\n/** Persist an explicit driver reactivation after the human-approved resume. */\nexport function reactivateStoredMultiFrontierDriver(\n collaborationId: string,\n participantId: string,\n now = new Date().toISOString(),\n): MultiFrontierStoredRun | null {\n assertTimestamp(now, \"reactivation time\");\n const current = getMultiFrontierRun(collaborationId);\n if (!current) return null;\n const reactivated = reactivateMultiFrontierDriver(current, participantId);\n return reactivated ? writeNextStoredRun(current, reactivated, now) : null;\n}\n\n/**\n * Appends an idempotent participant event after the coordinator has fenced it.\n * The event journal is diagnostic; state is mutated only through this guarded\n * coordinator entry point.\n */\nexport function appendMultiFrontierParticipantEvent(\n input: AppendMultiFrontierParticipantEventInput,\n): AppendMultiFrontierParticipantEventResult {\n assertSafeId(input.id, \"event id\");\n assertSafeId(input.collaborationId, \"collaboration id\");\n assertSafeId(input.participantId, \"participant id\");\n const createdAt = input.createdAt ?? new Date().toISOString();\n assertTimestamp(createdAt, \"event time\");\n\n const current = getMultiFrontierRun(input.collaborationId);\n if (!current) return { accepted: false, reason: \"missing-run\", run: null };\n const existing = listMultiFrontierParticipantEvents(\n input.collaborationId,\n ).find((event) => event.id === input.id);\n if (existing) {\n if (!isMatchingParticipantEvent(existing, input)) {\n return { accepted: false, reason: \"event-conflict\", run: current };\n }\n return {\n accepted: true,\n deduplicated: true,\n event: existing,\n run: current,\n };\n }\n if (\n !current.participants.some(\n (candidate) => candidate.participantId === input.participantId,\n )\n ) {\n return { accepted: false, reason: \"missing-participant\", run: current };\n }\n if (!canApplyMultiFrontierParticipantEvent(current, input)) {\n return { accepted: false, reason: \"stale-driver\", run: current };\n }\n const participant = current.participants.find(\n (candidate) => candidate.participantId === input.participantId,\n );\n if (\n input.status !== undefined &&\n (participant?.status === \"completed\" || participant?.status === \"failed\") &&\n input.status !== participant.status\n ) {\n return { accepted: false, reason: \"terminal-participant\", run: current };\n }\n\n const event: PersistedMultiFrontierParticipantEvent = {\n schemaVersion: 1,\n id: input.id,\n collaborationId: input.collaborationId,\n participantId: input.participantId,\n permission: input.permission,\n createdAt,\n ...(input.generation === undefined ? {} : { generation: input.generation }),\n ...(input.status === undefined ? {} : { status: input.status }),\n };\n appendParticipantEvent(event);\n const participants = input.status\n ? current.participants.map((candidate) =>\n candidate.participantId === input.participantId\n ? { ...candidate, status: input.status }\n : candidate,\n )\n : current.participants;\n const run = writeNextStoredRun(\n current,\n { ...current, participants },\n createdAt,\n );\n return { accepted: true, deduplicated: false, event, run };\n}\n\nexport function listMultiFrontierParticipantEvents(\n collaborationId: string,\n): PersistedMultiFrontierParticipantEvent[] {\n if (!SAFE_ID.test(collaborationId)) return [];\n const eventPath = multiFrontierParticipantEventsPath(collaborationId);\n if (!fs.existsSync(eventPath)) return [];\n return fs\n .readFileSync(eventPath, \"utf-8\")\n .split(/\\r?\\n/)\n .filter(Boolean)\n .map(readParticipantEvent)\n .filter(\n (event): event is PersistedMultiFrontierParticipantEvent =>\n event !== null,\n );\n}\n\nfunction writeMultiFrontierRun(run: MultiFrontierStoredRun): void {\n fs.mkdirSync(multiFrontierRunsDir(), { recursive: true });\n writeFileAtomically(\n multiFrontierRunPath(run.collaborationId),\n `${JSON.stringify(run, null, 2)}\\n`,\n );\n}\n\nfunction writeNewMultiFrontierRun(run: MultiFrontierStoredRun): void {\n fs.mkdirSync(multiFrontierRunsDir(), { recursive: true });\n try {\n fs.writeFileSync(\n multiFrontierRunPath(run.collaborationId),\n `${JSON.stringify(run, null, 2)}\\n`,\n { encoding: \"utf-8\", flag: \"wx\" },\n );\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"EEXIST\") {\n throw new Error(\n `Multi-frontier run already exists: ${run.collaborationId}`,\n );\n }\n throw error;\n }\n}\n\nfunction writeNextStoredRun(\n current: MultiFrontierStoredRun,\n nextState: MultiFrontierRunState,\n updatedAt: string,\n): MultiFrontierStoredRun {\n const next: MultiFrontierStoredRun = {\n ...nextState,\n createdAt: current.createdAt,\n updatedAt,\n };\n writeMultiFrontierRun(next);\n return next;\n}\n\nfunction appendParticipantEvent(\n event: PersistedMultiFrontierParticipantEvent,\n): void {\n fs.mkdirSync(multiFrontierParticipantEventsDir(), { recursive: true });\n fs.appendFileSync(\n multiFrontierParticipantEventsPath(event.collaborationId),\n `${JSON.stringify(event)}\\n`,\n );\n}\n\nfunction multiFrontierRunPath(collaborationId: string): string {\n return path.join(multiFrontierRunsDir(), `${collaborationId}.json`);\n}\n\nfunction multiFrontierParticipantEventsPath(collaborationId: string): string {\n return path.join(\n multiFrontierParticipantEventsDir(),\n `${collaborationId}.jsonl`,\n );\n}\n\nfunction readStoredRun(filePath: string): MultiFrontierStoredRun | 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 run = raw as Partial<MultiFrontierStoredRun>;\n if (\n run.schemaVersion !== 1 ||\n typeof run.collaborationId !== \"string\" ||\n !SAFE_ID.test(run.collaborationId) ||\n !isPhase(run.phase) ||\n !isStoredRunParticipantsAndDriverValid(run.participants, run.driver) ||\n !isApproval(run.approval) ||\n !Array.isArray(run.checkpointIds) ||\n !run.checkpointIds.every(\n (checkpointId) => typeof checkpointId === \"string\",\n ) ||\n typeof run.round !== \"number\" ||\n !Number.isInteger(run.round) ||\n run.round < 1 ||\n !isStringArray(run.proposalIds) ||\n !isStringArray(run.reviewIds) ||\n (run.recovery !== undefined && !isRecovery(run.recovery)) ||\n typeof run.createdAt !== \"string\" ||\n Number.isNaN(Date.parse(run.createdAt)) ||\n typeof run.updatedAt !== \"string\" ||\n Number.isNaN(Date.parse(run.updatedAt))\n ) {\n return null;\n }\n return run as MultiFrontierStoredRun;\n } catch {\n return null;\n }\n}\n\nfunction readParticipantEvent(\n line: string,\n): PersistedMultiFrontierParticipantEvent | 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<PersistedMultiFrontierParticipantEvent>;\n if (\n event.schemaVersion !== 1 ||\n typeof event.id !== \"string\" ||\n typeof event.collaborationId !== \"string\" ||\n typeof event.participantId !== \"string\" ||\n !isPermission(event.permission) ||\n (event.generation !== undefined &&\n typeof event.generation !== \"number\") ||\n (event.status !== undefined && !isParticipantStatus(event.status)) ||\n typeof event.createdAt !== \"string\" ||\n Number.isNaN(Date.parse(event.createdAt))\n ) {\n return null;\n }\n return event as PersistedMultiFrontierParticipantEvent;\n } catch {\n return null;\n }\n}\n\nfunction assertParticipants(\n participants: MultiFrontierParticipantState[],\n): void {\n if (participants.length === 0) {\n throw new Error(\"A multi-frontier run needs at least one participant.\");\n }\n const participantIds = new Set<string>();\n for (const participant of participants) {\n if (!isParticipant(participant))\n throw new Error(\"Invalid multi-frontier participant.\");\n assertSafeId(participant.participantId, \"participant id\");\n if (participantIds.has(participant.participantId)) {\n throw new Error(\n `Duplicate multi-frontier participant id: ${participant.participantId}`,\n );\n }\n participantIds.add(participant.participantId);\n }\n}\n\nfunction isParticipant(value: unknown): value is MultiFrontierParticipantState {\n if (!value || typeof value !== \"object\") return false;\n const participant = value as Partial<MultiFrontierParticipantState>;\n return (\n typeof participant.participantId === \"string\" &&\n SAFE_ID.test(participant.participantId) &&\n typeof participant.provider === \"string\" &&\n participant.provider.length > 0 &&\n typeof participant.runtime === \"string\" &&\n participant.runtime.length > 0 &&\n (participant.model === undefined ||\n typeof participant.model === \"string\") &&\n (participant.capabilities === undefined ||\n isStringArray(participant.capabilities)) &&\n (participant.sessionRef === undefined ||\n typeof participant.sessionRef === \"string\") &&\n (participant.role === \"driver\" || participant.role === \"watchdog\") &&\n isPermission(participant.permission) &&\n isParticipantStatus(participant.status)\n );\n}\n\nfunction areStoredParticipantsValid(\n value: unknown,\n): value is MultiFrontierParticipantState[] {\n if (\n !Array.isArray(value) ||\n value.length === 0 ||\n !value.every(isParticipant)\n ) {\n return false;\n }\n return (\n new Set(value.map((participant) => participant.participantId)).size ===\n value.length\n );\n}\n\nfunction isStoredRunParticipantsAndDriverValid(\n participants: unknown,\n driver: unknown,\n): participants is MultiFrontierParticipantState[] {\n if (!areStoredParticipantsValid(participants) || !isDriver(driver)) {\n return false;\n }\n if (driver?.leaseState !== \"active\") {\n return participants.every(\n (participant) => participant.permission === \"read_only\",\n );\n }\n if (\n !participants.some(\n (participant) => participant.participantId === driver.participantId,\n )\n ) {\n return false;\n }\n return participants.every((participant) => {\n if (participant.participantId !== driver.participantId) {\n return (\n participant.role === \"watchdog\" &&\n participant.permission === \"read_only\"\n );\n }\n return (\n participant.role === \"driver\" &&\n participant.permission === \"workspace_write\"\n );\n });\n}\n\nfunction isDriver(value: unknown): value is MultiFrontierDriverLease | null {\n if (value === null) return true;\n if (!value || typeof value !== \"object\") return false;\n const driver = value as Partial<MultiFrontierDriverLease>;\n return (\n typeof driver.participantId === \"string\" &&\n typeof driver.generation === \"number\" &&\n (driver.leaseState === \"inactive\" ||\n driver.leaseState === \"active\" ||\n driver.leaseState === \"revoked\")\n );\n}\n\nfunction isApproval(value: unknown): value is MultiFrontierApproval {\n if (!value || typeof value !== \"object\") return false;\n const approval = value as Partial<MultiFrontierApproval>;\n return (\n (approval.state === \"not_required\" ||\n approval.state === \"pending\" ||\n approval.state === \"approved\" ||\n approval.state === \"rejected\") &&\n (approval.proposalId === undefined ||\n typeof approval.proposalId === \"string\") &&\n (approval.reviewPacketId === undefined ||\n typeof approval.reviewPacketId === \"string\")\n );\n}\n\nfunction isRecovery(value: unknown): value is MultiFrontierRecovery {\n if (!value || typeof value !== \"object\") return false;\n const recovery = value as Partial<MultiFrontierRecovery>;\n return (\n isRecoveryReason(recovery.reason) &&\n typeof recovery.recoveredAt === \"string\" &&\n !Number.isNaN(Date.parse(recovery.recoveredAt)) &&\n isPhase(recovery.resumablePhase) &&\n (recovery.checkpointId === undefined ||\n typeof recovery.checkpointId === \"string\")\n );\n}\n\nfunction isPhase(value: unknown): value is MultiFrontierPhase {\n return (\n typeof value === \"string\" &&\n [\n \"proposing\",\n \"cross_review\",\n \"converging\",\n \"awaiting_go\",\n \"implementing\",\n \"checkpoint_review\",\n \"paused\",\n \"completed\",\n \"failed\",\n \"canceled\",\n ].includes(value)\n );\n}\n\nfunction isParticipantStatus(\n value: unknown,\n): value is MultiFrontierParticipantStatus {\n return (\n value === \"idle\" ||\n value === \"running\" ||\n value === \"waiting\" ||\n value === \"failed\" ||\n value === \"completed\"\n );\n}\n\nfunction isPermission(\n value: unknown,\n): value is MultiFrontierParticipantPermission {\n return value === \"read_only\" || value === \"workspace_write\";\n}\n\nfunction isMatchingParticipantEvent(\n existing: PersistedMultiFrontierParticipantEvent,\n input: AppendMultiFrontierParticipantEventInput,\n): boolean {\n return (\n existing.collaborationId === input.collaborationId &&\n existing.participantId === input.participantId &&\n existing.permission === input.permission &&\n existing.generation === input.generation &&\n existing.status === input.status &&\n (input.createdAt === undefined || existing.createdAt === input.createdAt)\n );\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return (\n Array.isArray(value) && value.every((item) => typeof item === \"string\")\n );\n}\n\nfunction isRecoveryReason(\n value: unknown,\n): value is MultiFrontierRecoveryReason {\n return (\n value === \"main_process_restarted\" ||\n value === \"driver_crashed\" ||\n value === \"watchdog_crashed\" ||\n value === \"app_quit\" ||\n value === \"canceled\"\n );\n}\n\nfunction assertSafeId(value: string, label: string): void {\n if (!SAFE_ID.test(value)) throw new Error(`Invalid multi-frontier ${label}.`);\n}\n\nfunction assertTimestamp(value: string, label: string): void {\n if (Number.isNaN(Date.parse(value))) {\n throw new Error(`Invalid multi-frontier ${label}.`);\n }\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 try {\n fs.writeFileSync(temporaryPath, contents, {\n encoding: \"utf-8\",\n flag: \"wx\",\n });\n fs.renameSync(temporaryPath, filePath);\n } catch (error) {\n fs.rmSync(temporaryPath, { force: true });\n throw error;\n }\n}\n"]}
@@ -79,6 +79,7 @@ export declare function createCodingToolRegistry(options?: CreateCodingToolRegis
79
79
  export declare function runCodingCommand(command: string, cwd: string, timeoutMs: number, options?: {
80
80
  stdin?: string;
81
81
  onChunk?: BashOutputChunkCallback;
82
+ signal?: AbortSignal;
82
83
  }): Promise<CodingCommandResult>;
83
84
  /**
84
85
  * Spawn a command detached in the background. Returns immediately with the
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/coding-tools/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/coding-tools/index.ts"],"names":[],"mappings":"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"}