@tiangong-ai/cli 0.0.18 → 0.0.20

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 (47) hide show
  1. package/AGENTS.md +8 -2
  2. package/README.md +81 -12
  3. package/dist/cli.js +3 -1
  4. package/dist/cli.js.map +1 -1
  5. package/dist/research/commands.js +13 -5
  6. package/dist/research/commands.js.map +1 -1
  7. package/dist/research/config.d.ts +1 -0
  8. package/dist/research/config.js +18 -1
  9. package/dist/research/config.js.map +1 -1
  10. package/dist/research/orchestration.d.ts +3 -0
  11. package/dist/research/orchestration.js +236 -0
  12. package/dist/research/orchestration.js.map +1 -0
  13. package/dist/research/types.d.ts +1 -1
  14. package/dist/research/workspace/broker.d.ts +5 -0
  15. package/dist/research/workspace/broker.js +353 -0
  16. package/dist/research/workspace/broker.js.map +1 -0
  17. package/dist/research/workspace/capabilities.d.ts +10 -0
  18. package/dist/research/workspace/capabilities.js +291 -0
  19. package/dist/research/workspace/capabilities.js.map +1 -0
  20. package/dist/research/workspace/constants.d.ts +8 -0
  21. package/dist/research/workspace/constants.js +37 -0
  22. package/dist/research/workspace/constants.js.map +1 -0
  23. package/dist/research/workspace/context.d.ts +3 -0
  24. package/dist/research/workspace/context.js +77 -0
  25. package/dist/research/workspace/context.js.map +1 -0
  26. package/dist/research/workspace/executor.d.ts +12 -0
  27. package/dist/research/workspace/executor.js +353 -0
  28. package/dist/research/workspace/executor.js.map +1 -0
  29. package/dist/research/workspace/journal.d.ts +7 -0
  30. package/dist/research/workspace/journal.js +104 -0
  31. package/dist/research/workspace/journal.js.map +1 -0
  32. package/dist/research/workspace/projects.d.ts +9 -0
  33. package/dist/research/workspace/projects.js +230 -0
  34. package/dist/research/workspace/projects.js.map +1 -0
  35. package/dist/research/workspace/runtime.d.ts +27 -0
  36. package/dist/research/workspace/runtime.js +519 -0
  37. package/dist/research/workspace/runtime.js.map +1 -0
  38. package/dist/research/workspace/storage.d.ts +25 -0
  39. package/dist/research/workspace/storage.js +218 -0
  40. package/dist/research/workspace/storage.js.map +1 -0
  41. package/dist/research/workspace/types.d.ts +181 -0
  42. package/dist/research/workspace/types.js +2 -0
  43. package/dist/research/workspace/types.js.map +1 -0
  44. package/dist/research/workspace/workspace.d.ts +12 -0
  45. package/dist/research/workspace/workspace.js +340 -0
  46. package/dist/research/workspace/workspace.js.map +1 -0
  47. package/package.json +3 -2
@@ -0,0 +1,519 @@
1
+ import { cp, readFile, rm } from "node:fs/promises";
2
+ import { basename, dirname, join, relative } from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ import { CliError } from "../../errors.js";
5
+ import { stageLockedCapabilities, verifyCapabilities } from "./capabilities.js";
6
+ import { startCapabilityBroker } from "./broker.js";
7
+ import { executeAgent } from "./executor.js";
8
+ import { appendJournalEvent, readJournal, verifyJournal } from "./journal.js";
9
+ import { listProjects, loadProject, nextReadyPackage, packageById, refreshProject, saveProject, } from "./projects.js";
10
+ import { ensureDirectory, canonicalJson, fileRecord, isObject, pathExists, regularTreeFiles, resolveContained, sha256File, sha256Text, workspacePaths, writeJsonAtomic, writeTextAtomic, } from "./storage.js";
11
+ import { loadWorkspaceConfig, withWorkspaceLock } from "./workspace.js";
12
+ export async function runResearchWorkspace(root, options, packageExecutor = executeAgent) {
13
+ validateRunOptions(options);
14
+ if (options.dryRun)
15
+ return dryRunResult(root);
16
+ return withWorkspaceLock(root, "research.run", async () => {
17
+ const config = await loadWorkspaceConfig(root);
18
+ if (config.producer.agent === config.reviewer.agent) {
19
+ throw new CliError("Research producer and reviewer must use different agent families.", {
20
+ code: "RESEARCH_REVIEW_ROUTE_INVALID",
21
+ exitCode: 3,
22
+ });
23
+ }
24
+ const capabilities = await verifyCapabilities(root);
25
+ if (capabilities.status !== "verified") {
26
+ throw new CliError("Research capabilities are not locked and verified.", {
27
+ code: "RESEARCH_CAPABILITY_DRIFT",
28
+ exitCode: 3,
29
+ details: capabilities,
30
+ });
31
+ }
32
+ const executed = [];
33
+ let cycles = 0;
34
+ while (cycles < options.maxCycles) {
35
+ const projects = await listProjects(root);
36
+ const selected = projects
37
+ .map((project) => ({ project, workPackage: nextReadyPackage(project) }))
38
+ .filter((item) => Boolean(item.workPackage) &&
39
+ item.project.status !== "blocked" &&
40
+ item.project.status !== "complete")
41
+ .slice(0, options.maxParallel);
42
+ if (!selected.length)
43
+ break;
44
+ cycles += 1;
45
+ const results = await Promise.all(selected.map(({ project, workPackage }) => executeWorkPackage(root, project.id, workPackage.id, config, options.environment, packageExecutor)));
46
+ executed.push(...results);
47
+ }
48
+ return summarizeRun(root, cycles, executed, options.maxCycles);
49
+ });
50
+ }
51
+ async function executeWorkPackage(root, projectId, packageId, config, environment, packageExecutor) {
52
+ const project = await loadProject(root, projectId);
53
+ const workPackage = packageById(project, packageId);
54
+ const now = new Date().toISOString();
55
+ workPackage.status = "running";
56
+ workPackage.attempts += 1;
57
+ workPackage.startedAt = now;
58
+ workPackage.lastError = null;
59
+ project.status = "running";
60
+ project.updatedAt = now;
61
+ await saveProject(root, project);
62
+ await appendJournalEvent(workspacePaths(root).journal, "package.started", projectId, {
63
+ projectId,
64
+ packageId,
65
+ attempt: workPackage.attempts,
66
+ });
67
+ const runId = randomUUID();
68
+ const startedAt = new Date().toISOString();
69
+ let capsuleRoot;
70
+ let broker;
71
+ let accountedResult;
72
+ try {
73
+ if (workPackage.kind !== "verify")
74
+ assertBudget(project, config);
75
+ let result;
76
+ let outputs;
77
+ let executor;
78
+ if (workPackage.kind === "verify") {
79
+ result = await closeProjectMechanically(root, project, workPackage);
80
+ accountedResult = result;
81
+ outputs = await outputRecords(root, project, workPackage.expectedOutputs);
82
+ executor = "mechanical";
83
+ }
84
+ else {
85
+ const capsule = await createCapsule(root, project, workPackage, runId);
86
+ capsuleRoot = capsule.capsuleRoot;
87
+ const route = workPackage.executor === "reviewer" ? config.reviewer : config.producer;
88
+ executor = route.agent;
89
+ broker = await startCapabilityBroker(root, project.id, capsule.projectRoot);
90
+ result = await packageExecutor({
91
+ route,
92
+ prompt: packagePrompt(project, workPackage, capsule.inputManifest, capsule.stagedSkills, capsule.reviewPacketSha256),
93
+ capsuleRoot: capsule.capsuleRoot,
94
+ projectRoot: capsule.projectRoot,
95
+ workspaceRoot: root,
96
+ timeoutSeconds: remainingWallSeconds(project, config),
97
+ environment,
98
+ brokerUrl: broker?.url ?? null,
99
+ });
100
+ accountedResult = result;
101
+ if (result.exitCode !== 0) {
102
+ throw new Error(`executor exited ${result.exitCode}: ${bounded(result.stderr, 1000)}`);
103
+ }
104
+ assertProjectedBudget(project, config, result);
105
+ outputs = await validateAndImportOutputs(root, project, workPackage, capsule.projectRoot, config, capsule.reviewPacketSha256);
106
+ }
107
+ const completedAt = new Date().toISOString();
108
+ project.usage.tokens += result.tokens;
109
+ project.usage.costUsd = roundMoney(project.usage.costUsd + result.costUsd);
110
+ project.usage.wallSeconds += result.wallSeconds;
111
+ workPackage.status = "complete";
112
+ workPackage.completedAt = completedAt;
113
+ workPackage.lastError = null;
114
+ refreshProject(project);
115
+ await saveProject(root, project);
116
+ const record = {
117
+ schemaVersion: 1,
118
+ runId,
119
+ projectId,
120
+ packageId,
121
+ executor,
122
+ startedAt,
123
+ completedAt,
124
+ exitCode: result.exitCode,
125
+ tokens: result.tokens,
126
+ costUsd: result.costUsd,
127
+ wallSeconds: result.wallSeconds,
128
+ outputs,
129
+ stdoutSha256: sha256Text(result.stdout),
130
+ stderrSha256: sha256Text(result.stderr),
131
+ };
132
+ await writeJsonAtomic(join(projectRoot(root, projectId), "runs", `${runId}.json`), record);
133
+ await appendJournalEvent(workspacePaths(root).journal, "package.completed", projectId, {
134
+ projectId,
135
+ packageId,
136
+ runId,
137
+ executor,
138
+ outputs,
139
+ usage: { tokens: result.tokens, costUsd: result.costUsd, wallSeconds: result.wallSeconds },
140
+ });
141
+ return { projectId, packageId, status: "complete" };
142
+ }
143
+ catch (error) {
144
+ const failedProject = await loadProject(root, projectId);
145
+ const failedPackage = packageById(failedProject, packageId);
146
+ const message = bounded(error instanceof Error ? error.message : String(error), 2000);
147
+ if (accountedResult) {
148
+ failedProject.usage.tokens += accountedResult.tokens;
149
+ failedProject.usage.costUsd = roundMoney(failedProject.usage.costUsd + accountedResult.costUsd);
150
+ failedProject.usage.wallSeconds += accountedResult.wallSeconds;
151
+ }
152
+ failedPackage.lastError = message;
153
+ failedPackage.completedAt = new Date().toISOString();
154
+ const nonRetryable = error instanceof CliError && error.code === "RESEARCH_BUDGET_EXHAUSTED";
155
+ failedPackage.status =
156
+ !nonRetryable && failedPackage.attempts < failedPackage.maxAttempts ? "retry" : "failed";
157
+ refreshProject(failedProject);
158
+ await saveProject(root, failedProject);
159
+ await appendJournalEvent(workspacePaths(root).journal, "package.failed", projectId, {
160
+ projectId,
161
+ packageId,
162
+ runId,
163
+ attempt: failedPackage.attempts,
164
+ retryable: failedPackage.status === "retry",
165
+ error: message,
166
+ usage: accountedResult
167
+ ? {
168
+ tokens: accountedResult.tokens,
169
+ costUsd: accountedResult.costUsd,
170
+ wallSeconds: accountedResult.wallSeconds,
171
+ }
172
+ : { tokens: 0, costUsd: 0, wallSeconds: 0 },
173
+ });
174
+ return { projectId, packageId, status: failedPackage.status };
175
+ }
176
+ finally {
177
+ if (broker)
178
+ await broker.stop();
179
+ if (capsuleRoot)
180
+ await rm(capsuleRoot, { recursive: true, force: true });
181
+ }
182
+ }
183
+ async function createCapsule(root, project, workPackage, runId) {
184
+ const paths = workspacePaths(root);
185
+ const capsuleRoot = join(paths.runtime, runId);
186
+ const capsuleProject = join(capsuleRoot, "project");
187
+ await ensureDirectory(capsuleProject);
188
+ await ensureDirectory(join(capsuleProject, "outputs"));
189
+ const canonicalOutputs = join(projectRoot(root, project.id), "outputs");
190
+ if (await pathExists(canonicalOutputs)) {
191
+ for (const source of await regularTreeFiles(canonicalOutputs)) {
192
+ const logical = relative(canonicalOutputs, source);
193
+ const destination = join(capsuleProject, "outputs", logical);
194
+ await ensureDirectory(dirname(destination));
195
+ await cp(source, destination, { force: false });
196
+ }
197
+ }
198
+ const inputManifest = [];
199
+ for (const input of project.inputs) {
200
+ if ((await sha256File(input.path)) !== input.sha256) {
201
+ throw new Error(`input drift detected: ${input.id}`);
202
+ }
203
+ const logical = join("inputs", input.id, basename(input.path)).replaceAll("\\", "/");
204
+ const destination = join(capsuleProject, logical);
205
+ await ensureDirectory(dirname(destination));
206
+ await cp(input.path, destination, { force: false });
207
+ inputManifest.push({ id: input.id, role: input.role, path: logical, sha256: input.sha256 });
208
+ }
209
+ await writeJsonAtomic(join(capsuleProject, "inputs", "manifest.json"), inputManifest);
210
+ await writeJsonAtomic(join(capsuleProject, "project.json"), {
211
+ ...project,
212
+ inputs: project.inputs.map((input, index) => ({
213
+ ...input,
214
+ path: inputManifest[index]?.path ?? "inputs/unavailable",
215
+ })),
216
+ });
217
+ const stagedSkills = await stageLockedCapabilities(root, join(capsuleProject, "skills"));
218
+ const reviewPacketSha256 = workPackage.stage === "review"
219
+ ? await writeReviewPacket(capsuleProject, project, inputManifest)
220
+ : null;
221
+ return {
222
+ capsuleRoot,
223
+ projectRoot: capsuleProject,
224
+ inputManifest,
225
+ stagedSkills,
226
+ reviewPacketSha256,
227
+ };
228
+ }
229
+ async function writeReviewPacket(capsuleProject, project, inputManifest) {
230
+ const artifactPaths = ["outputs/evidence.json", "outputs/analysis.json", "outputs/report.md"];
231
+ const packet = {
232
+ schemaVersion: 1,
233
+ projectId: project.id,
234
+ questionSha256: sha256Text(project.question),
235
+ inputs: inputManifest,
236
+ artifacts: await Promise.all(artifactPaths.map((logicalPath) => fileRecord(resolveContained(capsuleProject, logicalPath), logicalPath))),
237
+ };
238
+ const packetSha256 = sha256Text(canonicalJson(packet));
239
+ await writeJsonAtomic(join(capsuleProject, "inputs", "review-packet.json"), {
240
+ ...packet,
241
+ packetSha256,
242
+ });
243
+ return packetSha256;
244
+ }
245
+ async function validateAndImportOutputs(root, project, workPackage, capsuleProject, config, reviewPacketSha256) {
246
+ const admitted = [];
247
+ let totalBytes = 0;
248
+ if (workPackage.expectedOutputs.length > config.budget.maxFilesPerPackage) {
249
+ throw new Error("declared output count exceeds the package file budget");
250
+ }
251
+ for (const logicalPath of workPackage.expectedOutputs) {
252
+ const source = resolveContained(capsuleProject, logicalPath);
253
+ const record = await fileRecord(source, logicalPath);
254
+ totalBytes += record.bytes;
255
+ if (totalBytes > config.budget.maxBytesPerPackage) {
256
+ throw new Error("package outputs exceed the byte budget");
257
+ }
258
+ await validateOutputShape(root, project, logicalPath, source, reviewPacketSha256);
259
+ admitted.push({ logicalPath, content: await readFile(source, "utf8"), record });
260
+ }
261
+ for (const output of admitted) {
262
+ const destination = resolveContained(projectRoot(root, project.id), output.logicalPath);
263
+ await ensureDirectory(dirname(destination));
264
+ await writeTextAtomic(destination, output.content);
265
+ }
266
+ return admitted.map((output) => output.record);
267
+ }
268
+ async function validateOutputShape(root, project, logicalPath, path, reviewPacketSha256) {
269
+ const content = await readFile(path, "utf8");
270
+ if (!content.trim())
271
+ throw new Error(`${logicalPath} is empty`);
272
+ if (!logicalPath.endsWith(".json"))
273
+ return;
274
+ const value = JSON.parse(content);
275
+ if (!isObject(value))
276
+ throw new Error(`${logicalPath} must contain a JSON object`);
277
+ if (logicalPath.endsWith("evidence.json")) {
278
+ if (!Array.isArray(value.sources) ||
279
+ value.sources.length === 0 ||
280
+ !Array.isArray(value.limitations) ||
281
+ value.limitations.some((item) => typeof item !== "string")) {
282
+ throw new Error("evidence.json must contain sources and limitations arrays");
283
+ }
284
+ await validateEvidenceSources(root, project, value.sources);
285
+ }
286
+ if (logicalPath.endsWith("analysis.json")) {
287
+ if (!Array.isArray(value.findings) || value.findings.length === 0) {
288
+ throw new Error("analysis.json must contain a non-empty findings array");
289
+ }
290
+ await validateFindings(path, value.findings);
291
+ }
292
+ if (logicalPath.endsWith("review.json")) {
293
+ if ((value.decision !== "pass" && value.decision !== "revise") ||
294
+ !Array.isArray(value.issues) ||
295
+ typeof value.rationale !== "string" ||
296
+ !value.rationale.trim() ||
297
+ !reviewPacketSha256 ||
298
+ value.packetSha256 !== reviewPacketSha256) {
299
+ throw new Error("review.json must bind the review packet, decision, issues, and rationale");
300
+ }
301
+ if (value.decision !== "pass")
302
+ throw new Error("independent review requested revision");
303
+ }
304
+ }
305
+ async function validateEvidenceSources(root, project, sources) {
306
+ const inputLocators = new Map(project.inputs.map((input) => [
307
+ input.id,
308
+ join("inputs", input.id, basename(input.path)).replaceAll("\\", "/"),
309
+ ]));
310
+ const brokerLocators = new Map();
311
+ for (const event of await readJournal(workspacePaths(root).journal)) {
312
+ if (event.scope !== project.id || event.type !== "capability.fetch.completed")
313
+ continue;
314
+ const attemptId = event.payload.attemptId;
315
+ const locator = event.payload.path;
316
+ if (typeof attemptId === "string" && typeof locator === "string") {
317
+ brokerLocators.set(attemptId, locator);
318
+ }
319
+ }
320
+ const sourceIds = new Set();
321
+ for (const source of sources) {
322
+ if (!isObject(source) ||
323
+ typeof source.id !== "string" ||
324
+ !/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(source.id) ||
325
+ sourceIds.has(source.id) ||
326
+ typeof source.title !== "string" ||
327
+ !source.title.trim() ||
328
+ typeof source.locator !== "string" ||
329
+ !source.locator.trim() ||
330
+ typeof source.relevance !== "string" ||
331
+ !source.relevance.trim() ||
332
+ !isObject(source.provenance) ||
333
+ (source.provenance.kind !== "input" && source.provenance.kind !== "broker") ||
334
+ typeof source.provenance.id !== "string") {
335
+ throw new Error("evidence.json contains an invalid or duplicate source");
336
+ }
337
+ const expectedLocator = source.provenance.kind === "input"
338
+ ? inputLocators.get(source.provenance.id)
339
+ : brokerLocators.get(source.provenance.id);
340
+ if (!expectedLocator || expectedLocator !== source.locator) {
341
+ throw new Error(`evidence source ${source.id} has invalid provenance`);
342
+ }
343
+ sourceIds.add(source.id);
344
+ }
345
+ }
346
+ async function validateFindings(path, findings) {
347
+ const evidencePath = join(dirname(path), "evidence.json");
348
+ const evidence = JSON.parse(await readFile(evidencePath, "utf8"));
349
+ if (!isObject(evidence) || !Array.isArray(evidence.sources)) {
350
+ throw new Error("analysis requires admitted evidence.json");
351
+ }
352
+ const sourceIds = new Set(evidence.sources
353
+ .filter((source) => isObject(source))
354
+ .map((source) => source.id)
355
+ .filter((id) => typeof id === "string"));
356
+ const findingIds = new Set();
357
+ for (const finding of findings) {
358
+ if (!isObject(finding) ||
359
+ typeof finding.id !== "string" ||
360
+ !finding.id.trim() ||
361
+ findingIds.has(finding.id) ||
362
+ typeof finding.statement !== "string" ||
363
+ !finding.statement.trim() ||
364
+ !Array.isArray(finding.evidence) ||
365
+ finding.evidence.length === 0 ||
366
+ finding.evidence.some((id) => typeof id !== "string" || !sourceIds.has(id)) ||
367
+ typeof finding.uncertainty !== "string" ||
368
+ !finding.uncertainty.trim()) {
369
+ throw new Error("analysis.json contains an invalid or untraceable finding");
370
+ }
371
+ findingIds.add(finding.id);
372
+ }
373
+ }
374
+ async function closeProjectMechanically(root, project, workPackage) {
375
+ const required = [
376
+ "outputs/evidence.json",
377
+ "outputs/analysis.json",
378
+ "outputs/report.md",
379
+ "outputs/review.json",
380
+ ];
381
+ const artifacts = await outputRecords(root, project, required);
382
+ const review = JSON.parse(await readFile(resolveContained(projectRoot(root, project.id), "outputs/review.json"), "utf8"));
383
+ if (!isObject(review) || review.decision !== "pass") {
384
+ throw new Error("project cannot close without a passing independent review");
385
+ }
386
+ const journal = await verifyJournal(workspacePaths(root).journal);
387
+ const closure = {
388
+ schemaVersion: 1,
389
+ projectId: project.id,
390
+ status: "complete",
391
+ closedAt: new Date().toISOString(),
392
+ questionSha256: sha256Text(project.question),
393
+ artifacts,
394
+ journalHead: journal.head,
395
+ };
396
+ const closurePath = resolveContained(projectRoot(root, project.id), workPackage.expectedOutputs[0]);
397
+ await writeJsonAtomic(closurePath, closure);
398
+ return { exitCode: 0, stdout: "", stderr: "", tokens: 0, costUsd: 0, wallSeconds: 0 };
399
+ }
400
+ async function outputRecords(root, project, logicalPaths) {
401
+ return Promise.all(logicalPaths.map((logicalPath) => fileRecord(resolveContained(projectRoot(root, project.id), logicalPath), logicalPath)));
402
+ }
403
+ function packagePrompt(project, workPackage, inputs, stagedSkills, reviewPacketSha256) {
404
+ const stageInstructions = {
405
+ discover: 'Create outputs/evidence.json with non-empty sources and a limitations array. Every source needs id, title, locator, relevance, and provenance {kind: "input"|"broker", id}. Input provenance IDs and locators must match the declared input manifest. Broker provenance must match a receipt returned by fetch_candidate_source. Do not invent unavailable evidence.',
406
+ analyze: "Read outputs/evidence.json and create outputs/analysis.json with non-empty findings. Each finding needs id, statement, evidence source IDs, and uncertainty.",
407
+ synthesize: "Read the admitted evidence and findings, then create outputs/report.md. Separate supported conclusions, uncertainty, limitations, and next actions.",
408
+ review: `Independently inspect inputs/review-packet.json and all packet artifacts. Create outputs/review.json with packetSha256 ${reviewPacketSha256 ?? "unavailable"}, decision "pass" or "revise", an issues array, and a non-empty rationale. Use "pass" only when every material claim is traceable to admitted evidence.`,
409
+ close: "No agent action is allowed for mechanical closure.",
410
+ };
411
+ return [
412
+ "Operate only inside this isolated research capsule.",
413
+ `Project: ${project.id}`,
414
+ `Question: ${project.question}`,
415
+ `Stage: ${workPackage.stage}`,
416
+ `Declared inputs: ${JSON.stringify(inputs)}`,
417
+ `Staged capability directories: ${JSON.stringify(stagedSkills.map((path) => `skills/${basename(path)}`))}`,
418
+ stageInstructions[workPackage.stage],
419
+ `Write only the declared stage outputs: ${workPackage.expectedOutputs.join(", ")}.`,
420
+ "Do not edit project.json, the input manifest, prior outputs, or staged capability files.",
421
+ ].join("\n\n");
422
+ }
423
+ async function dryRunResult(root) {
424
+ const projects = await listProjects(root);
425
+ return {
426
+ workspace: root,
427
+ status: "dry-run",
428
+ stopReason: "dry-run",
429
+ cycles: 0,
430
+ executed: [],
431
+ projects: projects.map((project) => ({
432
+ id: project.id,
433
+ status: refreshProject(project).status,
434
+ readyPackage: nextReadyPackage(project)?.id ?? null,
435
+ usage: project.usage,
436
+ })),
437
+ };
438
+ }
439
+ async function summarizeRun(root, cycles, executed, maxCycles) {
440
+ const projects = await listProjects(root);
441
+ const summaries = projects.map((project) => ({
442
+ id: project.id,
443
+ status: refreshProject(project).status,
444
+ readyPackage: nextReadyPackage(project)?.id ?? null,
445
+ usage: project.usage,
446
+ }));
447
+ const status = summaries.length > 0 && summaries.every((project) => project.status === "complete")
448
+ ? "complete"
449
+ : summaries.some((project) => project.status === "blocked")
450
+ ? "blocked"
451
+ : "ready";
452
+ const stopReason = summaries.length === 0
453
+ ? "no-projects"
454
+ : status === "complete"
455
+ ? "all-projects-complete"
456
+ : status === "blocked"
457
+ ? "project-blocked"
458
+ : cycles >= maxCycles
459
+ ? "cycle-limit"
460
+ : "no-ready-work";
461
+ return { workspace: root, status, stopReason, cycles, executed, projects: summaries };
462
+ }
463
+ function assertBudget(project, config) {
464
+ const exceeded = project.usage.tokens >= config.budget.maxTokens ||
465
+ project.usage.costUsd >= config.budget.maxCostUsd ||
466
+ project.usage.wallSeconds >= config.budget.maxWallSeconds;
467
+ if (exceeded) {
468
+ throw new CliError(`Research budget is exhausted for project ${project.id}.`, {
469
+ code: "RESEARCH_BUDGET_EXHAUSTED",
470
+ exitCode: 3,
471
+ details: { usage: project.usage, budget: config.budget },
472
+ });
473
+ }
474
+ }
475
+ function assertProjectedBudget(project, config, result) {
476
+ const projected = {
477
+ tokens: project.usage.tokens + result.tokens,
478
+ costUsd: project.usage.costUsd + result.costUsd,
479
+ wallSeconds: project.usage.wallSeconds + result.wallSeconds,
480
+ };
481
+ if (projected.tokens > config.budget.maxTokens ||
482
+ projected.costUsd > config.budget.maxCostUsd ||
483
+ projected.wallSeconds > config.budget.maxWallSeconds) {
484
+ throw new CliError(`Research execution exceeded a hard budget for project ${project.id}.`, {
485
+ code: "RESEARCH_BUDGET_EXHAUSTED",
486
+ exitCode: 3,
487
+ details: { projected, budget: config.budget },
488
+ });
489
+ }
490
+ }
491
+ function remainingWallSeconds(project, config) {
492
+ return Math.max(1, Math.floor(config.budget.maxWallSeconds - project.usage.wallSeconds));
493
+ }
494
+ function projectRoot(root, projectId) {
495
+ return join(workspacePaths(root).projects, projectId);
496
+ }
497
+ function validateRunOptions(options) {
498
+ if (!Number.isInteger(options.maxParallel) ||
499
+ options.maxParallel < 1 ||
500
+ options.maxParallel > 8) {
501
+ throw new CliError("--max-parallel must be an integer from 1 to 8.", {
502
+ code: "RESEARCH_RUN_OPTION_INVALID",
503
+ exitCode: 2,
504
+ });
505
+ }
506
+ if (!Number.isInteger(options.maxCycles) || options.maxCycles < 1 || options.maxCycles > 100) {
507
+ throw new CliError("--max-cycles must be an integer from 1 to 100.", {
508
+ code: "RESEARCH_RUN_OPTION_INVALID",
509
+ exitCode: 2,
510
+ });
511
+ }
512
+ }
513
+ function roundMoney(value) {
514
+ return Math.round(value * 1_000_000) / 1_000_000;
515
+ }
516
+ function bounded(value, length) {
517
+ return value.length <= length ? value : `${value.slice(0, length)}…`;
518
+ }
519
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/research/workspace/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { WorkspacePaths } from "./types.js";
2
+ export declare function workspacePaths(root: string): WorkspacePaths;
3
+ export declare function ensureDirectory(path: string, mode?: number): Promise<void>;
4
+ export declare function readJsonFile<T>(path: string, label: string): Promise<T>;
5
+ export declare function writeJsonAtomic(path: string, value: unknown, mode?: number): Promise<void>;
6
+ export declare function writeTextAtomic(path: string, value: string, mode?: number): Promise<void>;
7
+ export declare function canonicalJson(value: unknown): string;
8
+ export declare function sha256Text(value: string): string;
9
+ export declare function sha256Bytes(value: Uint8Array): string;
10
+ export declare function sha256File(path: string): Promise<string>;
11
+ export declare function hashRegularTree(root: string): Promise<string>;
12
+ export declare function regularTreeFiles(root: string): Promise<string[]>;
13
+ export declare function fileRecord(path: string, logicalPath: string): Promise<{
14
+ path: string;
15
+ sha256: string;
16
+ bytes: number;
17
+ }>;
18
+ export declare function safeRelativePath(value: string, label: string): string;
19
+ export declare function resolveContained(root: string, logicalPath: string): string;
20
+ export declare function acquireFileLock(path: string, payload: unknown): Promise<() => Promise<void>>;
21
+ export declare function pathExists(path: string): Promise<boolean>;
22
+ export declare function fileSize(path: string): Promise<number>;
23
+ export declare function isObject(value: unknown): value is Record<string, unknown>;
24
+ export declare function requireAbsolutePath(value: string, label: string): string;
25
+ export declare function basenameWithoutExtension(path: string): string;