@tiangong-ai/cli 0.0.19 → 0.0.21

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 (58) hide show
  1. package/AGENTS.md +8 -2
  2. package/README.md +209 -4
  3. package/dist/cli.js +2 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/research/commands.js +6 -0
  6. package/dist/research/commands.js.map +1 -1
  7. package/dist/research/orchestration.d.ts +3 -0
  8. package/dist/research/orchestration.js +391 -0
  9. package/dist/research/orchestration.js.map +1 -0
  10. package/dist/research/workspace/broker.d.ts +5 -0
  11. package/dist/research/workspace/broker.js +729 -0
  12. package/dist/research/workspace/broker.js.map +1 -0
  13. package/dist/research/workspace/capabilities.d.ts +10 -0
  14. package/dist/research/workspace/capabilities.js +356 -0
  15. package/dist/research/workspace/capabilities.js.map +1 -0
  16. package/dist/research/workspace/constants.d.ts +8 -0
  17. package/dist/research/workspace/constants.js +41 -0
  18. package/dist/research/workspace/constants.js.map +1 -0
  19. package/dist/research/workspace/context.d.ts +3 -0
  20. package/dist/research/workspace/context.js +77 -0
  21. package/dist/research/workspace/context.js.map +1 -0
  22. package/dist/research/workspace/evidence.d.ts +32 -0
  23. package/dist/research/workspace/evidence.js +235 -0
  24. package/dist/research/workspace/evidence.js.map +1 -0
  25. package/dist/research/workspace/executor.d.ts +22 -0
  26. package/dist/research/workspace/executor.js +926 -0
  27. package/dist/research/workspace/executor.js.map +1 -0
  28. package/dist/research/workspace/input-plan.d.ts +5 -0
  29. package/dist/research/workspace/input-plan.js +319 -0
  30. package/dist/research/workspace/input-plan.js.map +1 -0
  31. package/dist/research/workspace/journal.d.ts +7 -0
  32. package/dist/research/workspace/journal.js +105 -0
  33. package/dist/research/workspace/journal.js.map +1 -0
  34. package/dist/research/workspace/preflight.d.ts +108 -0
  35. package/dist/research/workspace/preflight.js +261 -0
  36. package/dist/research/workspace/preflight.js.map +1 -0
  37. package/dist/research/workspace/projects.d.ts +12 -0
  38. package/dist/research/workspace/projects.js +514 -0
  39. package/dist/research/workspace/projects.js.map +1 -0
  40. package/dist/research/workspace/runtime.d.ts +31 -0
  41. package/dist/research/workspace/runtime.js +1637 -0
  42. package/dist/research/workspace/runtime.js.map +1 -0
  43. package/dist/research/workspace/sanitization.d.ts +5 -0
  44. package/dist/research/workspace/sanitization.js +72 -0
  45. package/dist/research/workspace/sanitization.js.map +1 -0
  46. package/dist/research/workspace/schemas.d.ts +17 -0
  47. package/dist/research/workspace/schemas.js +342 -0
  48. package/dist/research/workspace/schemas.js.map +1 -0
  49. package/dist/research/workspace/storage.d.ts +25 -0
  50. package/dist/research/workspace/storage.js +222 -0
  51. package/dist/research/workspace/storage.js.map +1 -0
  52. package/dist/research/workspace/types.d.ts +341 -0
  53. package/dist/research/workspace/types.js +2 -0
  54. package/dist/research/workspace/types.js.map +1 -0
  55. package/dist/research/workspace/workspace.d.ts +23 -0
  56. package/dist/research/workspace/workspace.js +702 -0
  57. package/dist/research/workspace/workspace.js.map +1 -0
  58. package/package.json +4 -2
@@ -0,0 +1,514 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { cp, lstat, readdir } from "node:fs/promises";
3
+ import { basename, dirname, join, resolve, sep } from "node:path";
4
+ import { CliError } from "../../errors.js";
5
+ import { RESEARCH_CONTROL_DIRECTORY } from "./constants.js";
6
+ import { appendJournalEvent } from "./journal.js";
7
+ import { cloneProjectEvidenceReceipts } from "./evidence.js";
8
+ import { projectInputsFromPlan, reverifyProjectInputPlan } from "./input-plan.js";
9
+ import { evaluateProjectPreflight } from "./preflight.js";
10
+ import { ensureDirectory, fileRecord, fileSize, readJsonFile, sha256File, workspacePaths, writeJsonAtomic, } from "./storage.js";
11
+ import { loadWorkspaceConfig, withWorkspaceLock } from "./workspace.js";
12
+ const PROJECT_ID_PATTERN = /^[a-z0-9][a-z0-9-]{2,63}$/;
13
+ export async function initializeProject(root, projectId, question, evidenceRequirements, budgetConfirmed = false, inputPlan) {
14
+ validateProjectId(projectId);
15
+ const normalizedQuestion = question.trim();
16
+ if (normalizedQuestion.length < 8 || normalizedQuestion.length > 4000) {
17
+ throw new CliError("Research question must contain 8-4000 characters.", {
18
+ code: "RESEARCH_QUESTION_INVALID",
19
+ exitCode: 2,
20
+ });
21
+ }
22
+ return withWorkspaceLock(root, "project.init", async () => {
23
+ const paths = workspacePaths(root);
24
+ const projectRoot = join(paths.projects, projectId);
25
+ const projectPath = join(projectRoot, "project.json");
26
+ const existing = await lstat(projectRoot).catch(() => undefined);
27
+ if (existing) {
28
+ throw new CliError(`Research project already exists: ${projectId}`, {
29
+ code: "RESEARCH_PROJECT_EXISTS",
30
+ exitCode: 2,
31
+ });
32
+ }
33
+ const config = await loadWorkspaceConfig(root);
34
+ if (config.mode === "production-research" && !evidenceRequirements) {
35
+ throw new CliError("Production research requires explicit evidence requirements.", {
36
+ code: "RESEARCH_EVIDENCE_REQUIREMENTS_REQUIRED",
37
+ exitCode: 2,
38
+ });
39
+ }
40
+ if (config.mode === "production-research" &&
41
+ config.budget.maxCostUsd > config.budget.confirmationCostUsd &&
42
+ !budgetConfirmed) {
43
+ throw new CliError(`Production budget requires explicit confirmation above $${config.budget.confirmationCostUsd}.`, {
44
+ code: "RESEARCH_BUDGET_CONFIRMATION_REQUIRED",
45
+ exitCode: 2,
46
+ details: {
47
+ maxCostUsd: config.budget.maxCostUsd,
48
+ confirmationCostUsd: config.budget.confirmationCostUsd,
49
+ },
50
+ });
51
+ }
52
+ const requirements = normalizeEvidenceRequirements(evidenceRequirements ?? defaultEvidenceRequirements(config));
53
+ const admittedInputPlan = inputPlan ? await reverifyProjectInputPlan(inputPlan) : undefined;
54
+ if (config.mode === "production-research") {
55
+ const preflight = await evaluateProjectPreflight(root, normalizedQuestion, requirements, admittedInputPlan ?? null);
56
+ if (!preflight.readyToInitialize) {
57
+ throw new CliError("Production project initialization was blocked by preflight.", {
58
+ code: "RESEARCH_PREFLIGHT_BLOCKED",
59
+ exitCode: 3,
60
+ details: { gaps: preflight.gaps, preflightSha256: preflight.preflightSha256 },
61
+ });
62
+ }
63
+ }
64
+ const now = new Date().toISOString();
65
+ const project = {
66
+ schemaVersion: 1,
67
+ id: projectId,
68
+ question: normalizedQuestion,
69
+ status: "ready",
70
+ createdAt: now,
71
+ updatedAt: now,
72
+ budgetConfirmedAt: budgetConfirmed ? now : null,
73
+ inputs: admittedInputPlan ? projectInputsFromPlan(admittedInputPlan, now) : [],
74
+ evidenceRequirements: requirements,
75
+ packages: defaultWorkPackages(config),
76
+ usage: {
77
+ tokens: 0,
78
+ inputTokens: 0,
79
+ cachedInputTokens: 0,
80
+ outputTokens: 0,
81
+ costUsd: 0,
82
+ wallSeconds: 0,
83
+ },
84
+ };
85
+ await Promise.all([
86
+ ensureDirectory(projectRoot),
87
+ ensureDirectory(join(projectRoot, "outputs")),
88
+ ensureDirectory(join(projectRoot, "runs")),
89
+ ]);
90
+ await writeJsonAtomic(projectPath, project);
91
+ await appendJournalEvent(paths.journal, "project.initialized", projectId, {
92
+ projectId,
93
+ questionSha256: await hashQuestion(normalizedQuestion),
94
+ inputPlanSha256: admittedInputPlan?.sha256 ?? null,
95
+ inputs: project.inputs.map((input) => ({
96
+ id: input.id,
97
+ role: input.role,
98
+ sha256: input.sha256,
99
+ bytes: input.bytes,
100
+ })),
101
+ });
102
+ return project;
103
+ });
104
+ }
105
+ export async function addProjectInput(root, projectId, inputPath, role) {
106
+ validateProjectId(projectId);
107
+ const canonicalInput = resolve(inputPath);
108
+ if (canonicalInput !== inputPath) {
109
+ throw new CliError(`Input path must be absolute: ${inputPath}`, {
110
+ code: "RESEARCH_INPUT_INVALID",
111
+ exitCode: 2,
112
+ });
113
+ }
114
+ if (canonicalInput.split(sep).includes(RESEARCH_CONTROL_DIRECTORY)) {
115
+ throw new CliError("Research inputs cannot come from a research control directory.", {
116
+ code: "RESEARCH_INPUT_INVALID",
117
+ exitCode: 2,
118
+ });
119
+ }
120
+ const info = await lstat(canonicalInput).catch(() => undefined);
121
+ if (!info?.isFile() || info.isSymbolicLink()) {
122
+ throw new CliError(`Research input must be a regular file: ${inputPath}`, {
123
+ code: "RESEARCH_INPUT_INVALID",
124
+ exitCode: 2,
125
+ });
126
+ }
127
+ return withWorkspaceLock(root, "project.input.add", async () => {
128
+ const project = await loadProject(root, projectId);
129
+ const sha256 = await sha256File(canonicalInput);
130
+ const existing = project.inputs.find((input) => input.sha256 === sha256 && input.role === role);
131
+ if (existing)
132
+ return existing;
133
+ const input = {
134
+ id: `${slug(basename(canonicalInput))}-${sha256.slice(0, 12)}`,
135
+ role,
136
+ path: canonicalInput,
137
+ sha256,
138
+ bytes: await fileSize(canonicalInput),
139
+ addedAt: new Date().toISOString(),
140
+ };
141
+ project.inputs.push(input);
142
+ project.inputs.sort((left, right) => left.id.localeCompare(right.id));
143
+ project.updatedAt = new Date().toISOString();
144
+ await saveProject(root, project);
145
+ await appendJournalEvent(workspacePaths(root).journal, "project.input.added", projectId, {
146
+ projectId,
147
+ inputId: input.id,
148
+ role,
149
+ sha256,
150
+ bytes: input.bytes,
151
+ });
152
+ return input;
153
+ });
154
+ }
155
+ export async function loadProject(root, projectId) {
156
+ validateProjectId(projectId);
157
+ const project = await readJsonFile(join(workspacePaths(root).projects, projectId, "project.json"), `Research project ${projectId}`);
158
+ validateProjectShape(project, projectId);
159
+ return project;
160
+ }
161
+ export async function listProjects(root) {
162
+ const entries = await readdir(workspacePaths(root).projects, { withFileTypes: true });
163
+ const projects = [];
164
+ for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {
165
+ if (!entry.isDirectory() || entry.isSymbolicLink())
166
+ continue;
167
+ projects.push(await loadProject(root, entry.name));
168
+ }
169
+ return projects;
170
+ }
171
+ export async function saveProject(root, project) {
172
+ validateProjectShape(project, project.id);
173
+ await writeJsonAtomic(join(workspacePaths(root).projects, project.id, "project.json"), project);
174
+ }
175
+ export async function retryProjectPackage(root, projectId, packageId) {
176
+ validateProjectId(projectId);
177
+ return withWorkspaceLock(root, "project.retry", async () => {
178
+ const project = await loadProject(root, projectId);
179
+ const selected = packageId
180
+ ? packageById(project, packageId)
181
+ : project.packages.find((item) => item.status === "failed" || item.status === "retry");
182
+ if (!selected || (selected.status !== "failed" && selected.status !== "retry")) {
183
+ throw new CliError("Project retry requires a failed or retryable package.", {
184
+ code: "RESEARCH_RETRY_NOT_AVAILABLE",
185
+ exitCode: 2,
186
+ });
187
+ }
188
+ const selectedIndex = project.packages.indexOf(selected);
189
+ const previous = {
190
+ status: selected.status,
191
+ attempts: selected.attempts,
192
+ failureKind: selected.lastFailureKind,
193
+ };
194
+ for (const [index, workPackage] of project.packages.entries()) {
195
+ if (index < selectedIndex)
196
+ continue;
197
+ workPackage.status = index === selectedIndex ? "ready" : "pending";
198
+ workPackage.maxAttempts = Math.max(workPackage.maxAttempts, workPackage.attempts + 1);
199
+ workPackage.startedAt = null;
200
+ workPackage.completedAt = null;
201
+ workPackage.lastError = null;
202
+ workPackage.lastFailureKind = null;
203
+ workPackage.retryNotBefore = null;
204
+ }
205
+ project.status = "ready";
206
+ project.updatedAt = new Date().toISOString();
207
+ await saveProject(root, project);
208
+ await appendJournalEvent(workspacePaths(root).journal, "project.retry.requested", projectId, {
209
+ projectId,
210
+ packageId: selected.id,
211
+ previous,
212
+ preservedOutputs: true,
213
+ });
214
+ return project;
215
+ });
216
+ }
217
+ export async function forkProject(root, sourceProjectId, targetProjectId, resumeThrough) {
218
+ validateProjectId(sourceProjectId);
219
+ validateProjectId(targetProjectId);
220
+ if (sourceProjectId === targetProjectId) {
221
+ throw new CliError("Fork target must use a different project ID.", {
222
+ code: "RESEARCH_PROJECT_FORK_INVALID",
223
+ exitCode: 2,
224
+ });
225
+ }
226
+ return withWorkspaceLock(root, "project.fork", async () => {
227
+ const source = await loadProject(root, sourceProjectId);
228
+ const targetRoot = join(workspacePaths(root).projects, targetProjectId);
229
+ if (await lstat(targetRoot).catch(() => undefined)) {
230
+ throw new CliError(`Research project already exists: ${targetProjectId}`, {
231
+ code: "RESEARCH_PROJECT_EXISTS",
232
+ exitCode: 2,
233
+ });
234
+ }
235
+ const config = await loadWorkspaceConfig(root);
236
+ const packages = defaultWorkPackages(config);
237
+ const inheritedStages = resumeThrough
238
+ ? ["discover", "analyze", "synthesize"].slice(0, ["discover", "analyze", "synthesize"].indexOf(resumeThrough) + 1)
239
+ : [];
240
+ for (const stage of inheritedStages) {
241
+ const sourcePackage = source.packages.find((item) => item.stage === stage);
242
+ if (sourcePackage?.status !== "complete") {
243
+ throw new CliError(`Cannot fork through incomplete package: ${stage}.`, {
244
+ code: "RESEARCH_PROJECT_FORK_INVALID",
245
+ exitCode: 2,
246
+ });
247
+ }
248
+ }
249
+ const now = new Date().toISOString();
250
+ for (const workPackage of packages) {
251
+ if (inheritedStages.includes(workPackage.stage)) {
252
+ workPackage.status = "complete";
253
+ workPackage.completedAt = now;
254
+ }
255
+ }
256
+ const project = {
257
+ schemaVersion: 1,
258
+ id: targetProjectId,
259
+ question: source.question,
260
+ status: "ready",
261
+ createdAt: now,
262
+ updatedAt: now,
263
+ budgetConfirmedAt: source.budgetConfirmedAt,
264
+ inputs: source.inputs.map((input) => ({ ...input })),
265
+ evidenceRequirements: {
266
+ ...source.evidenceRequirements,
267
+ dimensions: [...source.evidenceRequirements.dimensions],
268
+ sourceTypes: [...source.evidenceRequirements.sourceTypes],
269
+ },
270
+ packages,
271
+ usage: {
272
+ tokens: 0,
273
+ inputTokens: 0,
274
+ cachedInputTokens: 0,
275
+ outputTokens: 0,
276
+ costUsd: 0,
277
+ wallSeconds: 0,
278
+ },
279
+ };
280
+ await Promise.all([
281
+ ensureDirectory(targetRoot),
282
+ ensureDirectory(join(targetRoot, "outputs")),
283
+ ensureDirectory(join(targetRoot, "runs")),
284
+ ]);
285
+ const inheritedOutputs = [];
286
+ const stageOutput = {
287
+ discover: "outputs/evidence.json",
288
+ analyze: "outputs/analysis.json",
289
+ synthesize: "outputs/report.md",
290
+ };
291
+ for (const stage of inheritedStages) {
292
+ const logicalPath = stageOutput[stage];
293
+ const sourcePath = join(workspacePaths(root).projects, sourceProjectId, logicalPath);
294
+ const record = await fileRecord(sourcePath, logicalPath);
295
+ const destination = join(targetRoot, logicalPath);
296
+ await ensureDirectory(dirname(destination));
297
+ await cp(sourcePath, destination, { errorOnExist: true, force: false });
298
+ inheritedOutputs.push(record);
299
+ }
300
+ if (inheritedStages.includes("discover")) {
301
+ await cloneProjectEvidenceReceipts(root, sourceProjectId, targetProjectId);
302
+ }
303
+ refreshProject(project);
304
+ await writeJsonAtomic(join(targetRoot, "project.json"), project);
305
+ await appendJournalEvent(workspacePaths(root).journal, "project.forked", targetProjectId, {
306
+ sourceProjectId,
307
+ targetProjectId,
308
+ resumeThrough: resumeThrough ?? null,
309
+ inheritedOutputs,
310
+ inheritedUsage: false,
311
+ });
312
+ return project;
313
+ });
314
+ }
315
+ export function refreshProject(project) {
316
+ const now = Date.now();
317
+ for (const workPackage of project.packages) {
318
+ if (workPackage.status !== "pending" && workPackage.status !== "retry")
319
+ continue;
320
+ if (workPackage.status === "retry" &&
321
+ workPackage.retryNotBefore &&
322
+ Date.parse(workPackage.retryNotBefore) > now) {
323
+ continue;
324
+ }
325
+ const dependenciesComplete = workPackage.dependencies.every((dependency) => project.packages.find((candidate) => candidate.id === dependency)?.status === "complete");
326
+ if (dependenciesComplete)
327
+ workPackage.status = "ready";
328
+ }
329
+ if (project.packages.some((item) => item.status === "failed"))
330
+ project.status = "blocked";
331
+ else if (project.packages.every((item) => item.status === "complete"))
332
+ project.status = "complete";
333
+ else if (project.packages.some((item) => item.status === "running"))
334
+ project.status = "running";
335
+ else
336
+ project.status = "ready";
337
+ project.updatedAt = new Date().toISOString();
338
+ return project;
339
+ }
340
+ export function nextReadyPackage(project) {
341
+ refreshProject(project);
342
+ return project.packages.find((workPackage) => workPackage.status === "ready");
343
+ }
344
+ export function packageById(project, packageId) {
345
+ const workPackage = project.packages.find((candidate) => candidate.id === packageId);
346
+ if (!workPackage) {
347
+ throw new CliError(`Unknown work package ${packageId} in project ${project.id}.`, {
348
+ code: "RESEARCH_PACKAGE_INVALID",
349
+ exitCode: 2,
350
+ });
351
+ }
352
+ return workPackage;
353
+ }
354
+ function defaultWorkPackages(config) {
355
+ const maxAttempts = config.budget.maxAttemptsPerPackage;
356
+ return [
357
+ workPackage("discover", "discover", "agent", "producer", [], ["outputs/evidence.json"], maxAttempts),
358
+ workPackage("analyze", "analyze", "agent", "producer", ["discover"], ["outputs/analysis.json"], maxAttempts),
359
+ workPackage("synthesize", "synthesize", "agent", "producer", ["analyze"], ["outputs/report.md"], maxAttempts),
360
+ workPackage("review", "review", "agent", "reviewer", ["synthesize"], ["outputs/review.json"], maxAttempts),
361
+ workPackage("close", "close", "verify", "mechanical", ["review"], ["outputs/closure.json"], 1),
362
+ ];
363
+ }
364
+ function workPackage(id, stage, kind, executor, dependencies, expectedOutputs, maxAttempts) {
365
+ return {
366
+ id,
367
+ stage,
368
+ kind,
369
+ executor,
370
+ dependencies,
371
+ expectedOutputs,
372
+ status: dependencies.length ? "pending" : "ready",
373
+ attempts: 0,
374
+ maxAttempts,
375
+ lastError: null,
376
+ lastFailureKind: null,
377
+ retryNotBefore: null,
378
+ startedAt: null,
379
+ completedAt: null,
380
+ };
381
+ }
382
+ function validateProjectShape(project, expectedId) {
383
+ if (project.schemaVersion !== 1 ||
384
+ project.id !== expectedId ||
385
+ !PROJECT_ID_PATTERN.test(project.id) ||
386
+ typeof project.question !== "string" ||
387
+ (project.budgetConfirmedAt !== null && typeof project.budgetConfirmedAt !== "string") ||
388
+ !Array.isArray(project.inputs) ||
389
+ !isEvidenceRequirements(project.evidenceRequirements) ||
390
+ !Array.isArray(project.packages) ||
391
+ !project.usage ||
392
+ typeof project.usage.tokens !== "number" ||
393
+ typeof project.usage.inputTokens !== "number" ||
394
+ typeof project.usage.cachedInputTokens !== "number" ||
395
+ typeof project.usage.outputTokens !== "number" ||
396
+ typeof project.usage.costUsd !== "number" ||
397
+ typeof project.usage.wallSeconds !== "number") {
398
+ throw new CliError(`Research project state is invalid: ${expectedId}`, {
399
+ code: "RESEARCH_PROJECT_INVALID",
400
+ exitCode: 2,
401
+ });
402
+ }
403
+ const packageIds = new Set(project.packages.map((item) => item.id));
404
+ if (packageIds.size !== project.packages.length ||
405
+ project.packages.some((item) => !["agent", "verify"].includes(item.kind) ||
406
+ !["producer", "reviewer", "mechanical"].includes(item.executor) ||
407
+ item.dependencies.some((dependency) => !packageIds.has(dependency)) ||
408
+ item.expectedOutputs.some((path) => !path.startsWith("outputs/")))) {
409
+ throw new CliError(`Research project work packages are invalid: ${expectedId}`, {
410
+ code: "RESEARCH_PROJECT_INVALID",
411
+ exitCode: 2,
412
+ });
413
+ }
414
+ }
415
+ function defaultEvidenceRequirements(config) {
416
+ return config.mode === "production-research"
417
+ ? {
418
+ dimensions: ["research-question"],
419
+ sourceTypes: ["primary"],
420
+ minSources: 3,
421
+ minFullTextSources: 1,
422
+ minDatedSources: 1,
423
+ publicationDateFrom: null,
424
+ publicationDateTo: null,
425
+ }
426
+ : {
427
+ dimensions: ["research-question"],
428
+ sourceTypes: [],
429
+ minSources: 1,
430
+ minFullTextSources: 0,
431
+ minDatedSources: 0,
432
+ publicationDateFrom: null,
433
+ publicationDateTo: null,
434
+ };
435
+ }
436
+ export function normalizeEvidenceRequirements(value) {
437
+ const normalized = {
438
+ dimensions: [...new Set(value.dimensions.map(normalizeRequirementId))].sort(),
439
+ sourceTypes: [...new Set(value.sourceTypes.map(normalizeRequirementId))].sort(),
440
+ minSources: value.minSources,
441
+ minFullTextSources: value.minFullTextSources,
442
+ minDatedSources: value.minDatedSources,
443
+ publicationDateFrom: value.publicationDateFrom,
444
+ publicationDateTo: value.publicationDateTo,
445
+ };
446
+ if (!isEvidenceRequirements(normalized)) {
447
+ throw new CliError("Evidence requirements are invalid.", {
448
+ code: "RESEARCH_EVIDENCE_REQUIREMENTS_INVALID",
449
+ exitCode: 2,
450
+ });
451
+ }
452
+ return normalized;
453
+ }
454
+ function isEvidenceRequirements(value) {
455
+ return (Boolean(value) &&
456
+ typeof value === "object" &&
457
+ !Array.isArray(value) &&
458
+ Array.isArray(value.dimensions) &&
459
+ value.dimensions.length > 0 &&
460
+ value.dimensions.every(validRequirementId) &&
461
+ Array.isArray(value.sourceTypes) &&
462
+ value.sourceTypes.every(validRequirementId) &&
463
+ Number.isInteger(value.minSources) &&
464
+ value.minSources > 0 &&
465
+ Number.isInteger(value.minFullTextSources) &&
466
+ value.minFullTextSources >= 0 &&
467
+ value.minFullTextSources <=
468
+ value.minSources &&
469
+ Number.isInteger(value.minDatedSources) &&
470
+ value.minDatedSources >= 0 &&
471
+ value.minDatedSources <=
472
+ value.minSources &&
473
+ validDateBoundary(value.publicationDateFrom) &&
474
+ validDateBoundary(value.publicationDateTo) &&
475
+ dateRangeOrdered(value.publicationDateFrom, value.publicationDateTo));
476
+ }
477
+ function validDateBoundary(value) {
478
+ if (value === null)
479
+ return true;
480
+ if (typeof value !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(value))
481
+ return false;
482
+ const timestamp = Date.parse(`${value}T00:00:00.000Z`);
483
+ return Number.isFinite(timestamp) && new Date(timestamp).toISOString().slice(0, 10) === value;
484
+ }
485
+ function dateRangeOrdered(from, to) {
486
+ return from === null || to === null || from <= to;
487
+ }
488
+ function normalizeRequirementId(value) {
489
+ return value
490
+ .trim()
491
+ .toLowerCase()
492
+ .replace(/[^a-z0-9._:-]+/g, "-");
493
+ }
494
+ function validRequirementId(value) {
495
+ return typeof value === "string" && /^[a-z0-9][a-z0-9._:-]{0,127}$/.test(value);
496
+ }
497
+ function validateProjectId(projectId) {
498
+ if (!PROJECT_ID_PATTERN.test(projectId)) {
499
+ throw new CliError("Project ID must contain 3-64 lowercase letters, digits, or hyphens and start with a letter or digit.", { code: "RESEARCH_PROJECT_ID_INVALID", exitCode: 2 });
500
+ }
501
+ }
502
+ function slug(value) {
503
+ const result = value
504
+ .toLowerCase()
505
+ .replace(/[^a-z0-9]+/g, "-")
506
+ .replace(/^-|-$/g, "")
507
+ .slice(0, 40);
508
+ return result || randomUUID().slice(0, 8);
509
+ }
510
+ async function hashQuestion(question) {
511
+ const { createHash } = await import("node:crypto");
512
+ return createHash("sha256").update(question, "utf8").digest("hex");
513
+ }
514
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../../src/research/workspace/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type AgentExecutionRequest } from "./executor.js";
2
+ import type { ExecutionResult, ProjectState, ResearchProgressEvent } from "./types.js";
3
+ export interface RunOptions {
4
+ maxParallel: number;
5
+ maxCycles: number;
6
+ dryRun: boolean;
7
+ environment: NodeJS.ProcessEnv;
8
+ projectId?: string;
9
+ onProgress?: (event: ResearchProgressEvent) => void;
10
+ }
11
+ export type PackageExecutor = (request: AgentExecutionRequest) => Promise<ExecutionResult>;
12
+ export interface WorkspaceRunResult {
13
+ workspace: string;
14
+ requestId: string;
15
+ projectId: string | null;
16
+ status: "complete" | "blocked" | "ready" | "dry-run";
17
+ stopReason: "dry-run" | "all-projects-complete" | "project-blocked" | "cycle-limit" | "no-ready-work" | "no-projects";
18
+ cycles: number;
19
+ executed: Array<{
20
+ projectId: string;
21
+ packageId: string;
22
+ status: string;
23
+ }>;
24
+ projects: Array<{
25
+ id: string;
26
+ status: ProjectState["status"];
27
+ readyPackage: string | null;
28
+ usage: ProjectState["usage"];
29
+ }>;
30
+ }
31
+ export declare function runResearchWorkspace(root: string, options: RunOptions, packageExecutor?: PackageExecutor): Promise<WorkspaceRunResult>;