youmd 0.10.2 → 0.11.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 (84) hide show
  1. package/dist/commands/brain.d.ts.map +1 -1
  2. package/dist/commands/brain.js +32 -10
  3. package/dist/commands/brain.js.map +1 -1
  4. package/dist/commands/doctor.d.ts +1 -0
  5. package/dist/commands/doctor.d.ts.map +1 -1
  6. package/dist/commands/doctor.js +16 -1
  7. package/dist/commands/doctor.js.map +1 -1
  8. package/dist/commands/stack.d.ts +2 -0
  9. package/dist/commands/stack.d.ts.map +1 -1
  10. package/dist/commands/stack.js +26 -0
  11. package/dist/commands/stack.js.map +1 -1
  12. package/dist/commands/tasks.d.ts +37 -0
  13. package/dist/commands/tasks.d.ts.map +1 -1
  14. package/dist/commands/tasks.js +152 -18
  15. package/dist/commands/tasks.js.map +1 -1
  16. package/dist/generated/capability-registry.d.ts +148 -68
  17. package/dist/generated/capability-registry.d.ts.map +1 -1
  18. package/dist/generated/capability-registry.js +159 -68
  19. package/dist/generated/capability-registry.js.map +1 -1
  20. package/dist/index.js +20 -2
  21. package/dist/index.js.map +1 -1
  22. package/dist/lib/api.d.ts +46 -0
  23. package/dist/lib/api.d.ts.map +1 -1
  24. package/dist/lib/api.js +18 -0
  25. package/dist/lib/api.js.map +1 -1
  26. package/dist/lib/brain/cache.d.ts +2 -2
  27. package/dist/lib/brain/cache.d.ts.map +1 -1
  28. package/dist/lib/brain/cache.js +4 -4
  29. package/dist/lib/brain/cache.js.map +1 -1
  30. package/dist/lib/brain/content.d.ts +51 -0
  31. package/dist/lib/brain/content.d.ts.map +1 -0
  32. package/dist/lib/brain/content.js +327 -0
  33. package/dist/lib/brain/content.js.map +1 -0
  34. package/dist/lib/brain/discovery.d.ts.map +1 -1
  35. package/dist/lib/brain/discovery.js +28 -11
  36. package/dist/lib/brain/discovery.js.map +1 -1
  37. package/dist/lib/brain/index.d.ts +1 -0
  38. package/dist/lib/brain/index.d.ts.map +1 -1
  39. package/dist/lib/brain/index.js +1 -0
  40. package/dist/lib/brain/index.js.map +1 -1
  41. package/dist/lib/brain/proposal.d.ts.map +1 -1
  42. package/dist/lib/brain/proposal.js +46 -5
  43. package/dist/lib/brain/proposal.js.map +1 -1
  44. package/dist/lib/brain/safe-open.d.ts +2 -0
  45. package/dist/lib/brain/safe-open.d.ts.map +1 -0
  46. package/dist/lib/brain/safe-open.js +77 -0
  47. package/dist/lib/brain/safe-open.js.map +1 -0
  48. package/dist/lib/brain/sync.d.ts +39 -0
  49. package/dist/lib/brain/sync.d.ts.map +1 -0
  50. package/dist/lib/brain/sync.js +136 -0
  51. package/dist/lib/brain/sync.js.map +1 -0
  52. package/dist/lib/daemon.js +1 -1
  53. package/dist/lib/daemon.js.map +1 -1
  54. package/dist/lib/orchestrator/loop.d.ts +7 -0
  55. package/dist/lib/orchestrator/loop.d.ts.map +1 -1
  56. package/dist/lib/orchestrator/loop.js +48 -0
  57. package/dist/lib/orchestrator/loop.js.map +1 -1
  58. package/dist/lib/orchestrator/run-journal.d.ts +113 -0
  59. package/dist/lib/orchestrator/run-journal.d.ts.map +1 -0
  60. package/dist/lib/orchestrator/run-journal.js +558 -0
  61. package/dist/lib/orchestrator/run-journal.js.map +1 -0
  62. package/dist/lib/orchestrator/tools.d.ts +2 -0
  63. package/dist/lib/orchestrator/tools.d.ts.map +1 -1
  64. package/dist/lib/orchestrator/tools.js +141 -1
  65. package/dist/lib/orchestrator/tools.js.map +1 -1
  66. package/dist/lib/taskLedgerProposal.d.ts +102 -0
  67. package/dist/lib/taskLedgerProposal.d.ts.map +1 -0
  68. package/dist/lib/taskLedgerProposal.js +400 -0
  69. package/dist/lib/taskLedgerProposal.js.map +1 -0
  70. package/dist/lib/tasksFile.d.ts +9 -0
  71. package/dist/lib/tasksFile.d.ts.map +1 -1
  72. package/dist/lib/tasksFile.js +83 -5
  73. package/dist/lib/tasksFile.js.map +1 -1
  74. package/native/prebuilds/darwin-universal/youmd_safe_open.node +0 -0
  75. package/native/safe-open/youmd_safe_open.c +224 -0
  76. package/package.json +8 -2
  77. package/scripts/build-safe-open.mjs +63 -0
  78. package/scripts/skillstack-sync/com.you.context-sync.plist +1 -1
  79. package/scripts/skillstack-sync/com.you.identity-sync.plist +1 -1
  80. package/scripts/skillstack-sync/com.you.orchestrator-watch.plist +1 -1
  81. package/scripts/skillstack-sync/com.you.realtime-sync.plist +7 -1
  82. package/scripts/skillstack-sync/com.you.skillstack-sync.plist +1 -1
  83. package/scripts/skillstack-sync/context-sync.sh +19 -7
  84. package/scripts/skillstack-sync/install-daemons-linux.sh +6 -0
@@ -0,0 +1,558 @@
1
+ "use strict";
2
+ // run-journal.ts — durable, atomic state for governed orchestrator runs.
3
+ //
4
+ // A run becomes governed only when spawn_agent carries a run_id. Ungoverned loops keep their
5
+ // historical behavior. Governed runs cannot complete until a distinct, terminal reviewer records
6
+ // a structured approval; rejected reviews advance a bounded retry counter or block the run.
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.MAX_RUN_EVENTS = exports.RUN_WORKER_ROLES = void 0;
42
+ exports.isRunWorkerRole = isRunWorkerRole;
43
+ exports.validateAssignmentPreflight = validateAssignmentPreflight;
44
+ exports.loadRunJournal = loadRunJournal;
45
+ exports.saveRunJournal = saveRunJournal;
46
+ exports.createOrLoadRun = createOrLoadRun;
47
+ exports.assignRunWorker = assignRunWorker;
48
+ exports.completeRunReview = completeRunReview;
49
+ exports.findBoundUnfinishedRunIds = findBoundUnfinishedRunIds;
50
+ exports.runFinishBlocker = runFinishBlocker;
51
+ const fs = __importStar(require("fs"));
52
+ const path = __importStar(require("path"));
53
+ const config_1 = require("../config");
54
+ exports.RUN_WORKER_ROLES = ["planner", "specialist", "qa", "design", "reviewer"];
55
+ exports.MAX_RUN_EVENTS = 256;
56
+ const RUN_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
57
+ const DEFAULT_MAX_ATTEMPTS = 3;
58
+ const MAX_EVENT_TEXT = 1000;
59
+ const MAX_RUN_WORKER_IDENTITIES = 512;
60
+ function runsDir(options = {}) {
61
+ return options.dir ?? path.join((0, config_1.getWritableHomeBundleDir)(), "orchestrator", "runs");
62
+ }
63
+ function validRunId(runId) {
64
+ return RUN_ID_RE.test(runId);
65
+ }
66
+ function isRunWorkerRole(role) {
67
+ return exports.RUN_WORKER_ROLES.includes(role);
68
+ }
69
+ function runPath(runId, options = {}) {
70
+ if (!validRunId(runId))
71
+ throw new Error("run_id must use 1-128 letters, numbers, dots, dashes, or underscores");
72
+ return path.join(runsDir(options), `${runId}.json`);
73
+ }
74
+ function isStringRecord(value) {
75
+ return (!!value &&
76
+ typeof value === "object" &&
77
+ !Array.isArray(value) &&
78
+ Object.values(value).every((entry) => typeof entry === "string"));
79
+ }
80
+ function isStringArray(value) {
81
+ return Array.isArray(value) && value.every((entry) => typeof entry === "string" && !!entry.trim());
82
+ }
83
+ function boundedText(value, max = MAX_EVENT_TEXT) {
84
+ return value.trim().slice(0, max);
85
+ }
86
+ function isPreflight(value) {
87
+ if (!value || typeof value !== "object" || Array.isArray(value))
88
+ return false;
89
+ const row = value;
90
+ return ((row.mode === "auto" || row.mode === "explicit") &&
91
+ typeof row.harness === "string" &&
92
+ !!row.harness.trim() &&
93
+ typeof row.host === "string" &&
94
+ !!row.host.trim() &&
95
+ typeof row.recordedAt === "string" &&
96
+ (row.capabilityReason === undefined || typeof row.capabilityReason === "string") &&
97
+ (row.proof === undefined || typeof row.proof === "string"));
98
+ }
99
+ function isRunEvent(value) {
100
+ if (!value || typeof value !== "object" || Array.isArray(value))
101
+ return false;
102
+ const row = value;
103
+ return (Number.isInteger(row.sequence) &&
104
+ Number(row.sequence) >= 1 &&
105
+ [
106
+ "created",
107
+ "worker_assigned",
108
+ "handoff",
109
+ "review_started",
110
+ "review_recorded",
111
+ "retry_required",
112
+ "blocked",
113
+ "completed",
114
+ ].includes(String(row.type)) &&
115
+ typeof row.at === "string" &&
116
+ Number.isInteger(row.attempt) &&
117
+ Number(row.attempt) >= 1 &&
118
+ ["working", "review", "retry_required", "completed", "blocked"].includes(String(row.toStage)) &&
119
+ (row.fromStage === undefined ||
120
+ ["working", "review", "retry_required", "completed", "blocked"].includes(String(row.fromStage))) &&
121
+ (row.role === undefined || isRunWorkerRole(row.role)) &&
122
+ (row.workerId === undefined || typeof row.workerId === "string") &&
123
+ (row.from === undefined || typeof row.from === "string") &&
124
+ (row.to === undefined || typeof row.to === "string") &&
125
+ (row.summary === undefined || typeof row.summary === "string") &&
126
+ (row.preflight === undefined || isPreflight(row.preflight)));
127
+ }
128
+ function appendRunEvent(journal, input) {
129
+ const events = Array.isArray(journal.events) ? journal.events : [];
130
+ const sequence = events.reduce((max, event) => Math.max(max, event.sequence), 0) + 1;
131
+ const event = {
132
+ ...input,
133
+ sequence,
134
+ attempt: input.attempt ?? journal.attempt,
135
+ ...(input.summary ? { summary: boundedText(input.summary) } : {}),
136
+ };
137
+ journal.events = [...events, event].slice(-exports.MAX_RUN_EVENTS);
138
+ }
139
+ function validateAssignmentPreflight(input) {
140
+ if (!input)
141
+ return "governed worker assignment requires capability preflight evidence";
142
+ if (input.mode !== "auto" && input.mode !== "explicit") {
143
+ return "capability preflight mode must be auto or explicit";
144
+ }
145
+ const harness = boundedText(input.harness || "", 128);
146
+ const host = boundedText(input.host || "", 255);
147
+ if (!harness || !host)
148
+ return "capability preflight requires selected harness and host";
149
+ if (input.mode === "auto" && !boundedText(input.capabilityReason || "")) {
150
+ return "auto-selected harness requires a capability reason";
151
+ }
152
+ if (input.mode === "explicit" && !boundedText(input.proof || "")) {
153
+ return "explicit harness selection requires harness proof";
154
+ }
155
+ return undefined;
156
+ }
157
+ function isJournal(value) {
158
+ if (!value || typeof value !== "object" || Array.isArray(value))
159
+ return false;
160
+ const row = value;
161
+ const evidenceValid = Array.isArray(row.evidence) &&
162
+ row.evidence.every((item) => !!item &&
163
+ typeof item === "object" &&
164
+ typeof item.workerId === "string" &&
165
+ typeof item.role === "string" &&
166
+ typeof item.summary === "string" &&
167
+ typeof item.recordedAt === "string");
168
+ const verdictValid = row.reviewerVerdict === undefined ||
169
+ (!!row.reviewerVerdict &&
170
+ ["approved", "changes_requested"].includes(row.reviewerVerdict.status) &&
171
+ typeof row.reviewerVerdict.reviewerId === "string" &&
172
+ typeof row.reviewerVerdict.summary === "string" &&
173
+ Array.isArray(row.reviewerVerdict.issues) &&
174
+ row.reviewerVerdict.issues.every((issue) => typeof issue === "string") &&
175
+ typeof row.reviewerVerdict.recordedAt === "string");
176
+ const eventsValid = row.events === undefined ||
177
+ (Array.isArray(row.events) && row.events.length <= exports.MAX_RUN_EVENTS && row.events.every(isRunEvent));
178
+ return (typeof row.runId === "string" &&
179
+ validRunId(row.runId) &&
180
+ ["working", "review", "retry_required", "completed", "blocked"].includes(String(row.stage)) &&
181
+ isStringRecord(row.workers) &&
182
+ Number.isInteger(row.attempt) &&
183
+ Number(row.attempt) >= 1 &&
184
+ Number.isInteger(row.maxAttempts) &&
185
+ Number(row.maxAttempts) >= 1 &&
186
+ evidenceValid &&
187
+ eventsValid &&
188
+ verdictValid &&
189
+ (row.taskId === undefined || typeof row.taskId === "string") &&
190
+ (row.sessionId === undefined || typeof row.sessionId === "string") &&
191
+ (row.executionWorkerIds === undefined ||
192
+ (isStringArray(row.executionWorkerIds) && row.executionWorkerIds.length <= MAX_RUN_WORKER_IDENTITIES)) &&
193
+ (row.reviewerWorkerIds === undefined ||
194
+ (isStringArray(row.reviewerWorkerIds) && row.reviewerWorkerIds.length <= MAX_RUN_WORKER_IDENTITIES)) &&
195
+ typeof row.createdAt === "string" &&
196
+ typeof row.updatedAt === "string");
197
+ }
198
+ function archiveCorrupt(target) {
199
+ try {
200
+ const archived = `${target}.corrupt-${Date.now()}`;
201
+ fs.renameSync(target, archived);
202
+ }
203
+ catch {
204
+ // A concurrent reader may already have archived it. A corrupt journal must never crash U.
205
+ }
206
+ }
207
+ /** Load a persisted run. Invalid/partial JSON is quarantined and treated as missing. */
208
+ function loadRunJournal(runId, options = {}) {
209
+ let target;
210
+ try {
211
+ target = runPath(runId, options);
212
+ const parsed = JSON.parse(fs.readFileSync(target, "utf8"));
213
+ if (!isJournal(parsed) || parsed.runId !== runId) {
214
+ archiveCorrupt(target);
215
+ return undefined;
216
+ }
217
+ const journal = parsed;
218
+ // v1 journals predate append-only events. They remain readable and gain events on the next mutation.
219
+ journal.events = Array.isArray(journal.events) ? journal.events : [];
220
+ // Older journals only have mutable role slots. Seed the durable identity sets from every
221
+ // retained assignment event plus current slots; future reassignments can no longer erase them.
222
+ const assignedEvents = journal.events.filter((event) => event.type === "worker_assigned");
223
+ journal.executionWorkerIds = Array.from(new Set([
224
+ ...(Array.isArray(journal.executionWorkerIds) ? journal.executionWorkerIds : []),
225
+ ...assignedEvents
226
+ .filter((event) => event.role !== "reviewer")
227
+ .map((event) => event.workerId)
228
+ .filter((id) => !!id),
229
+ ...Object.entries(journal.workers)
230
+ .filter(([role]) => role !== "reviewer")
231
+ .map(([, id]) => id),
232
+ ]));
233
+ journal.reviewerWorkerIds = Array.from(new Set([
234
+ ...(Array.isArray(journal.reviewerWorkerIds) ? journal.reviewerWorkerIds : []),
235
+ ...assignedEvents
236
+ .filter((event) => event.role === "reviewer")
237
+ .map((event) => event.workerId)
238
+ .filter((id) => !!id),
239
+ ...(journal.workers.reviewer ? [journal.workers.reviewer] : []),
240
+ ]));
241
+ return journal;
242
+ }
243
+ catch (error) {
244
+ if (error.code !== "ENOENT" && target)
245
+ archiveCorrupt(target);
246
+ return undefined;
247
+ }
248
+ }
249
+ /** Atomic 0600 checkpoint: a restart sees either the old complete record or the new one. */
250
+ function saveRunJournal(journal, options = {}) {
251
+ const target = runPath(journal.runId, options);
252
+ fs.mkdirSync(path.dirname(target), { recursive: true, mode: 0o700 });
253
+ const tmp = `${target}.${process.pid}.${Math.random().toString(16).slice(2)}.tmp`;
254
+ try {
255
+ fs.writeFileSync(tmp, `${JSON.stringify(journal, null, 2)}\n`, { mode: 0o600 });
256
+ fs.renameSync(tmp, target);
257
+ }
258
+ finally {
259
+ try {
260
+ fs.rmSync(tmp, { force: true });
261
+ }
262
+ catch {
263
+ /* rename already removed it */
264
+ }
265
+ }
266
+ }
267
+ function createOrLoadRun(input, options = {}) {
268
+ if (!validRunId(input.runId))
269
+ return { ok: false, error: "invalid run_id" };
270
+ const existing = loadRunJournal(input.runId, options);
271
+ if (existing) {
272
+ const taskId = input.taskId?.trim();
273
+ const sessionId = input.sessionId ? boundedText(input.sessionId, 256) : undefined;
274
+ if (taskId && existing.taskId && existing.taskId !== taskId) {
275
+ return { ok: false, error: `run ${input.runId} already belongs to task ${existing.taskId}` };
276
+ }
277
+ if (sessionId && existing.sessionId && existing.sessionId !== sessionId) {
278
+ return { ok: false, error: `run ${input.runId} already belongs to session ${existing.sessionId}` };
279
+ }
280
+ let changed = false;
281
+ if (taskId && !existing.taskId) {
282
+ existing.taskId = taskId;
283
+ changed = true;
284
+ }
285
+ if (sessionId && !existing.sessionId) {
286
+ existing.sessionId = sessionId;
287
+ changed = true;
288
+ }
289
+ if (changed) {
290
+ existing.updatedAt = (options.now?.() ?? new Date()).toISOString();
291
+ saveRunJournal(existing, options);
292
+ }
293
+ return { ok: true, journal: existing };
294
+ }
295
+ const requestedMax = Number.isFinite(input.maxAttempts) ? Number(input.maxAttempts) : DEFAULT_MAX_ATTEMPTS;
296
+ const maxAttempts = Math.max(1, Math.min(10, Math.trunc(requestedMax)));
297
+ const timestamp = (options.now?.() ?? new Date()).toISOString();
298
+ const journal = {
299
+ runId: input.runId,
300
+ taskId: input.taskId?.trim() || undefined,
301
+ sessionId: input.sessionId ? boundedText(input.sessionId, 256) : undefined,
302
+ stage: "working",
303
+ workers: {},
304
+ executionWorkerIds: [],
305
+ reviewerWorkerIds: [],
306
+ attempt: 1,
307
+ maxAttempts,
308
+ evidence: [],
309
+ events: [],
310
+ createdAt: timestamp,
311
+ updatedAt: timestamp,
312
+ };
313
+ appendRunEvent(journal, {
314
+ type: "created",
315
+ at: timestamp,
316
+ toStage: "working",
317
+ summary: input.taskId ? `created for task ${input.taskId}` : "created governed run",
318
+ });
319
+ saveRunJournal(journal, options);
320
+ return { ok: true, journal };
321
+ }
322
+ /** Attribute a spawned worker to a durable run and advance it into work or review. */
323
+ function assignRunWorker(input, options = {}) {
324
+ const role = input.role.trim().toLowerCase();
325
+ const workerId = input.workerId.trim();
326
+ if (!role || !workerId)
327
+ return { ok: false, error: "role and workerId are required" };
328
+ if (!isRunWorkerRole(role)) {
329
+ return { ok: false, error: `role must be one of: ${exports.RUN_WORKER_ROLES.join(", ")}` };
330
+ }
331
+ const preflightError = validateAssignmentPreflight(input.preflight);
332
+ if (preflightError)
333
+ return { ok: false, error: preflightError };
334
+ const created = createOrLoadRun(input, options);
335
+ if (!created.ok || !created.journal)
336
+ return created;
337
+ const journal = created.journal;
338
+ if (journal.stage === "completed" || journal.stage === "blocked") {
339
+ return { ok: false, error: `run ${journal.runId} is already ${journal.stage}` };
340
+ }
341
+ const fromStage = journal.stage;
342
+ const timestamp = (options.now?.() ?? new Date()).toISOString();
343
+ const preflight = {
344
+ mode: input.preflight.mode,
345
+ harness: boundedText(input.preflight.harness, 128),
346
+ host: boundedText(input.preflight.host, 255),
347
+ ...(input.preflight.capabilityReason
348
+ ? { capabilityReason: boundedText(input.preflight.capabilityReason) }
349
+ : {}),
350
+ ...(input.preflight.proof ? { proof: boundedText(input.preflight.proof) } : {}),
351
+ recordedAt: timestamp,
352
+ };
353
+ if (role === "reviewer") {
354
+ if (journal.executionWorkerIds.includes(workerId)) {
355
+ return { ok: false, error: "reviewer must be distinct from every specialist worker" };
356
+ }
357
+ if (!journal.reviewerWorkerIds.includes(workerId) && journal.reviewerWorkerIds.length >= MAX_RUN_WORKER_IDENTITIES) {
358
+ return { ok: false, error: "run reviewer identity budget exhausted" };
359
+ }
360
+ journal.stage = "review";
361
+ }
362
+ else {
363
+ if (journal.reviewerWorkerIds.includes(workerId)) {
364
+ return { ok: false, error: "specialist cannot reuse the reviewer worker" };
365
+ }
366
+ if (!journal.executionWorkerIds.includes(workerId) && journal.executionWorkerIds.length >= MAX_RUN_WORKER_IDENTITIES) {
367
+ return { ok: false, error: "run execution identity budget exhausted" };
368
+ }
369
+ journal.stage = "working";
370
+ }
371
+ journal.workers[role] = workerId;
372
+ if (role === "reviewer") {
373
+ if (!journal.reviewerWorkerIds.includes(workerId))
374
+ journal.reviewerWorkerIds.push(workerId);
375
+ }
376
+ else if (!journal.executionWorkerIds.includes(workerId)) {
377
+ journal.executionWorkerIds.push(workerId);
378
+ }
379
+ appendRunEvent(journal, {
380
+ type: "worker_assigned",
381
+ at: timestamp,
382
+ fromStage,
383
+ toStage: journal.stage,
384
+ role,
385
+ workerId,
386
+ summary: `${role} assigned with ${preflight.harness} on ${preflight.host}`,
387
+ preflight,
388
+ });
389
+ appendRunEvent(journal, {
390
+ type: "handoff",
391
+ at: timestamp,
392
+ fromStage,
393
+ toStage: journal.stage,
394
+ role,
395
+ workerId,
396
+ from: "orchestrator",
397
+ to: workerId,
398
+ summary: `handoff to ${role}`,
399
+ });
400
+ if (role === "reviewer") {
401
+ appendRunEvent(journal, {
402
+ type: "review_started",
403
+ at: timestamp,
404
+ fromStage,
405
+ toStage: "review",
406
+ role,
407
+ workerId,
408
+ summary: "distinct reviewer assigned",
409
+ });
410
+ }
411
+ journal.updatedAt = timestamp;
412
+ saveRunJournal(journal, options);
413
+ return { ok: true, journal };
414
+ }
415
+ /** Apply a terminal review. Approval completes; rejection retries or blocks at the budget. */
416
+ function completeRunReview(input, options = {}) {
417
+ const journal = loadRunJournal(input.runId, options);
418
+ if (!journal)
419
+ return { ok: false, error: `run ${input.runId} was not found or is corrupt` };
420
+ if (journal.stage === "completed" || journal.stage === "blocked") {
421
+ return { ok: false, error: `run ${journal.runId} is already ${journal.stage}` };
422
+ }
423
+ if (journal.workers.reviewer !== input.reviewerId) {
424
+ return { ok: false, error: "reviewer_id must match the worker assigned to role=reviewer" };
425
+ }
426
+ if (journal.executionWorkerIds.includes(input.reviewerId)) {
427
+ return { ok: false, error: "specialist/self-approval is not allowed" };
428
+ }
429
+ if (!input.reviewerTerminal) {
430
+ return { ok: false, error: "reviewer must be terminal before complete_run" };
431
+ }
432
+ const summary = input.verdict.summary?.trim();
433
+ if (!summary || !["approved", "changes_requested"].includes(input.verdict.status)) {
434
+ return { ok: false, error: "verdict requires status=approved|changes_requested and a non-empty summary" };
435
+ }
436
+ const concreteEvidence = (input.evidence ?? []).map(String).map((item) => item.trim()).filter(Boolean);
437
+ if (input.verdict.status === "approved" && concreteEvidence.length === 0) {
438
+ return { ok: false, error: "approved verdict requires at least one non-empty concrete evidence item" };
439
+ }
440
+ const timestamp = (options.now?.() ?? new Date()).toISOString();
441
+ const fromStage = journal.stage;
442
+ const verdict = {
443
+ status: input.verdict.status,
444
+ reviewerId: input.reviewerId,
445
+ summary,
446
+ issues: (input.verdict.issues ?? []).map(String).map((issue) => issue.trim()).filter(Boolean),
447
+ recordedAt: timestamp,
448
+ };
449
+ journal.reviewerVerdict = verdict;
450
+ appendRunEvent(journal, {
451
+ type: "review_recorded",
452
+ at: timestamp,
453
+ fromStage,
454
+ toStage: fromStage,
455
+ role: "reviewer",
456
+ workerId: input.reviewerId,
457
+ summary: `${verdict.status}: ${verdict.summary}`,
458
+ });
459
+ for (const evidence of concreteEvidence) {
460
+ journal.evidence.push({
461
+ workerId: input.reviewerId,
462
+ role: "reviewer",
463
+ summary: evidence,
464
+ recordedAt: timestamp,
465
+ });
466
+ }
467
+ if (verdict.status === "approved") {
468
+ journal.stage = "completed";
469
+ journal.completedAt = timestamp;
470
+ appendRunEvent(journal, {
471
+ type: "completed",
472
+ at: timestamp,
473
+ fromStage,
474
+ toStage: "completed",
475
+ role: "reviewer",
476
+ workerId: input.reviewerId,
477
+ summary: verdict.summary,
478
+ });
479
+ }
480
+ else if (journal.attempt < journal.maxAttempts) {
481
+ journal.attempt += 1;
482
+ journal.stage = "retry_required";
483
+ delete journal.workers.reviewer;
484
+ appendRunEvent(journal, {
485
+ type: "retry_required",
486
+ at: timestamp,
487
+ attempt: journal.attempt,
488
+ fromStage,
489
+ toStage: "retry_required",
490
+ role: "reviewer",
491
+ workerId: input.reviewerId,
492
+ summary: verdict.summary,
493
+ });
494
+ }
495
+ else {
496
+ journal.stage = "blocked";
497
+ journal.blockedAt = timestamp;
498
+ appendRunEvent(journal, {
499
+ type: "blocked",
500
+ at: timestamp,
501
+ fromStage,
502
+ toStage: "blocked",
503
+ role: "reviewer",
504
+ workerId: input.reviewerId,
505
+ summary: verdict.summary,
506
+ });
507
+ }
508
+ journal.updatedAt = timestamp;
509
+ saveRunJournal(journal, options);
510
+ return { ok: true, journal };
511
+ }
512
+ /** Discover only unfinished governed runs bound to this task or orchestration session. */
513
+ function findBoundUnfinishedRunIds(binding, options = {}) {
514
+ const taskId = binding.taskId?.trim();
515
+ const sessionId = binding.sessionId?.trim();
516
+ if (!taskId && !sessionId)
517
+ return [];
518
+ let names;
519
+ try {
520
+ names = fs.readdirSync(runsDir(options));
521
+ }
522
+ catch {
523
+ return [];
524
+ }
525
+ const matches = [];
526
+ for (const name of names.sort()) {
527
+ if (!name.endsWith(".json"))
528
+ continue;
529
+ const runId = name.slice(0, -5);
530
+ if (!validRunId(runId))
531
+ continue;
532
+ const journal = loadRunJournal(runId, options);
533
+ if (!journal)
534
+ continue;
535
+ // A task binding is more specific than a goal-derived session. When present, use it
536
+ // exclusively so two distinct tasks with identical goal text cannot block one another.
537
+ const bound = taskId ? journal.taskId === taskId : Boolean(sessionId && journal.sessionId === sessionId);
538
+ if (!bound)
539
+ continue;
540
+ if (journal.stage === "completed" && journal.reviewerVerdict?.status === "approved")
541
+ continue;
542
+ matches.push(runId);
543
+ }
544
+ return matches;
545
+ }
546
+ /** A governed loop may finish only after every run it touched has reviewer-approved completion. */
547
+ function runFinishBlocker(runIds, options = {}) {
548
+ for (const runId of runIds) {
549
+ const journal = loadRunJournal(runId, options);
550
+ if (!journal)
551
+ return `governed run ${runId} is missing or corrupt`;
552
+ if (journal.stage !== "completed" || journal.reviewerVerdict?.status !== "approved") {
553
+ return `governed run ${runId} is ${journal.stage} (attempt ${journal.attempt}/${journal.maxAttempts}); a distinct terminal reviewer must approve it through complete_run`;
554
+ }
555
+ }
556
+ return undefined;
557
+ }
558
+ //# sourceMappingURL=run-journal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-journal.js","sourceRoot":"","sources":["../../../src/lib/orchestrator/run-journal.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,8 @@ export interface BuildToolsOptions {
5
5
  host?: string;
6
6
  /** Default cwd for spawns when no project/dir is supplied. */
7
7
  cwd?: string;
8
+ /** Injectable durable journal location for tests/embedded hosts. */
9
+ runJournalDir?: string;
8
10
  }
9
11
  /** Build the orchestrator tool set (process supervision over worker harnesses). */
10
12
  export declare function buildOrchestratorTools(opts?: BuildToolsOptions): LoopTool[];
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/lib/orchestrator/tools.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,QAAQ,EAAe,WAAW,EAAE,MAAM,QAAQ,CAAC;AA4B5D,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CA6B1F;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA+BD,mFAAmF;AACnF,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,iBAAsB,GAAG,QAAQ,EAAE,CAgM/E;AAqCD;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,QAAQ,EAAE,CAyG5C;AAWD,6FAA6F;AAC7F,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAYzC,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CASvD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,QAAQ,EAAE,CAgH3C;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,WAAW,CA4C7C"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/lib/orchestrator/tools.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,QAAQ,EAAe,WAAW,EAAE,MAAM,QAAQ,CAAC;AAoC5D,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CA6B1F;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA+BD,mFAAmF;AACnF,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,iBAAsB,GAAG,QAAQ,EAAE,CAwS/E;AAqCD;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,QAAQ,EAAE,CAyG5C;AAWD,6FAA6F;AAC7F,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAYzC,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CASvD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,QAAQ,EAAE,CAyJ3C;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,WAAW,CA4C7C"}