@zhuk/spego 0.10.1 → 0.12.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 (110) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +19 -48
  3. package/dist/artifacts/engine.d.ts +3 -7
  4. package/dist/artifacts/engine.js +39 -23
  5. package/dist/artifacts/engine.js.map +1 -1
  6. package/dist/artifacts/storage.d.ts +3 -2
  7. package/dist/artifacts/storage.js +42 -7
  8. package/dist/artifacts/storage.js.map +1 -1
  9. package/dist/artifacts/validation.js +1 -1
  10. package/dist/artifacts/validation.js.map +1 -1
  11. package/dist/cli/body-input.js +12 -2
  12. package/dist/cli/body-input.js.map +1 -1
  13. package/dist/cli/commands/artifact.js +53 -12
  14. package/dist/cli/commands/artifact.js.map +1 -1
  15. package/dist/cli/commands/meta.js +1 -1
  16. package/dist/cli/commands/meta.js.map +1 -1
  17. package/dist/cli/commands/skills.js +0 -2
  18. package/dist/cli/commands/skills.js.map +1 -1
  19. package/dist/cli/commands/view.js +29 -27
  20. package/dist/cli/commands/view.js.map +1 -1
  21. package/dist/cli/runtime.d.ts +2 -0
  22. package/dist/cli/runtime.js +2 -1
  23. package/dist/cli/runtime.js.map +1 -1
  24. package/dist/cli.js +0 -2
  25. package/dist/cli.js.map +1 -1
  26. package/dist/{commands → command-meta}/registry.js +0 -12
  27. package/dist/command-meta/registry.js.map +1 -0
  28. package/dist/errors.d.ts +1 -1
  29. package/dist/errors.js.map +1 -1
  30. package/dist/generator/claude.d.ts +1 -0
  31. package/dist/generator/claude.js +17 -2
  32. package/dist/generator/claude.js.map +1 -1
  33. package/dist/generator/index.js +2 -0
  34. package/dist/generator/index.js.map +1 -1
  35. package/dist/generator/opencode.d.ts +5 -0
  36. package/dist/generator/opencode.js +207 -0
  37. package/dist/generator/opencode.js.map +1 -0
  38. package/dist/generator/write.d.ts +1 -0
  39. package/dist/generator/write.js +14 -0
  40. package/dist/generator/write.js.map +1 -1
  41. package/dist/index/indexer.js +37 -8
  42. package/dist/index/indexer.js.map +1 -1
  43. package/dist/index/revisions.d.ts +2 -2
  44. package/dist/index/revisions.js +18 -3
  45. package/dist/index/revisions.js.map +1 -1
  46. package/dist/workspace/config.d.ts +0 -69
  47. package/dist/workspace/config.js +4 -21
  48. package/dist/workspace/config.js.map +1 -1
  49. package/dist/workspace/init.js +16 -4
  50. package/dist/workspace/init.js.map +1 -1
  51. package/dist/workspace/paths.d.ts +12 -0
  52. package/dist/workspace/paths.js +69 -0
  53. package/dist/workspace/paths.js.map +1 -1
  54. package/package.json +3 -5
  55. package/dist/cli/commands/orchestrate.d.ts +0 -6
  56. package/dist/cli/commands/orchestrate.js +0 -51
  57. package/dist/cli/commands/orchestrate.js.map +0 -1
  58. package/dist/commands/registry.js.map +0 -1
  59. package/dist/index.d.ts +0 -33
  60. package/dist/index.js +0 -20
  61. package/dist/index.js.map +0 -1
  62. package/dist/orchestration/agents.d.ts +0 -15
  63. package/dist/orchestration/agents.js +0 -156
  64. package/dist/orchestration/agents.js.map +0 -1
  65. package/dist/orchestration/artifacts.d.ts +0 -8
  66. package/dist/orchestration/artifacts.js +0 -20
  67. package/dist/orchestration/artifacts.js.map +0 -1
  68. package/dist/orchestration/client.d.ts +0 -59
  69. package/dist/orchestration/client.js +0 -107
  70. package/dist/orchestration/client.js.map +0 -1
  71. package/dist/orchestration/config.d.ts +0 -14
  72. package/dist/orchestration/config.js +0 -45
  73. package/dist/orchestration/config.js.map +0 -1
  74. package/dist/orchestration/emit.d.ts +0 -7
  75. package/dist/orchestration/emit.js +0 -19
  76. package/dist/orchestration/emit.js.map +0 -1
  77. package/dist/orchestration/engine.d.ts +0 -23
  78. package/dist/orchestration/engine.js +0 -136
  79. package/dist/orchestration/engine.js.map +0 -1
  80. package/dist/orchestration/file-gate.d.ts +0 -19
  81. package/dist/orchestration/file-gate.js +0 -25
  82. package/dist/orchestration/file-gate.js.map +0 -1
  83. package/dist/orchestration/index.d.ts +0 -18
  84. package/dist/orchestration/index.js +0 -12
  85. package/dist/orchestration/index.js.map +0 -1
  86. package/dist/orchestration/manager.d.ts +0 -13
  87. package/dist/orchestration/manager.js +0 -26
  88. package/dist/orchestration/manager.js.map +0 -1
  89. package/dist/orchestration/prompts.d.ts +0 -10
  90. package/dist/orchestration/prompts.js +0 -71
  91. package/dist/orchestration/prompts.js.map +0 -1
  92. package/dist/orchestration/scheduler.d.ts +0 -18
  93. package/dist/orchestration/scheduler.js +0 -49
  94. package/dist/orchestration/scheduler.js.map +0 -1
  95. package/dist/orchestration/schema.d.ts +0 -12
  96. package/dist/orchestration/schema.js +0 -78
  97. package/dist/orchestration/schema.js.map +0 -1
  98. package/dist/orchestration/tiers.d.ts +0 -14
  99. package/dist/orchestration/tiers.js +0 -57
  100. package/dist/orchestration/tiers.js.map +0 -1
  101. package/dist/orchestration/types.d.ts +0 -74
  102. package/dist/orchestration/types.js +0 -8
  103. package/dist/orchestration/types.js.map +0 -1
  104. package/dist/orchestration/verifier.d.ts +0 -14
  105. package/dist/orchestration/verifier.js +0 -66
  106. package/dist/orchestration/verifier.js.map +0 -1
  107. package/dist/orchestration/worker.d.ts +0 -16
  108. package/dist/orchestration/worker.js +0 -80
  109. package/dist/orchestration/worker.js.map +0 -1
  110. /package/dist/{commands → command-meta}/registry.d.ts +0 -0
@@ -1,49 +0,0 @@
1
- /**
2
- * Swarm scheduler. Executes sub-tasks in `sequential`, `parallel`, or
3
- * `adaptive` mode, honoring `dependsOn` edges and bounding concurrency.
4
- *
5
- * The actual per-task work is injected via `runTask`, keeping the scheduler
6
- * free of any OpenCode/IO coupling and trivially unit-testable.
7
- */
8
- import { buildDependencyTiers } from './tiers.js';
9
- async function mapWithConcurrency(items, limit, fn) {
10
- const results = new Array(items.length);
11
- let cursor = 0;
12
- const workerCount = Math.max(1, Math.min(limit, items.length));
13
- const workers = Array.from({ length: workerCount }, async () => {
14
- while (cursor < items.length) {
15
- const index = cursor++;
16
- const item = items[index];
17
- if (item === undefined)
18
- continue;
19
- results[index] = await fn(item);
20
- }
21
- });
22
- await Promise.all(workers);
23
- return results;
24
- }
25
- export async function runSwarm(breakdown, opts) {
26
- const mode = opts.mode ?? breakdown.executionMode;
27
- const tasks = [...breakdown.subtasks].sort((a, b) => a.priority - b.priority);
28
- const warnings = [];
29
- const { tiers, hadCycle } = buildDependencyTiers(tasks);
30
- if (hadCycle) {
31
- warnings.push('Dependency cycle detected — affected sub-tasks ran sequentially');
32
- }
33
- if (mode === 'sequential') {
34
- const ordered = tiers.flat();
35
- const results = [];
36
- for (const task of ordered) {
37
- results.push(await opts.runTask(task));
38
- }
39
- return { results, warnings };
40
- }
41
- // parallel + adaptive: run dependency tiers sequentially, parallel within each tier.
42
- const results = [];
43
- for (const tier of tiers) {
44
- const tierResults = await mapWithConcurrency(tier, opts.maxParallel, opts.runTask);
45
- results.push(...tierResults);
46
- }
47
- return { results, warnings };
48
- }
49
- //# sourceMappingURL=scheduler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/orchestration/scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAclD,KAAK,UAAU,kBAAkB,CAC/B,KAAU,EACV,KAAa,EACb,EAA2B;IAE3B,MAAM,OAAO,GAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,KAAK,IAAI,EAAE;QAC7D,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,IAAI,KAAK,SAAS;gBAAE,SAAS;YACjC,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,SAAwB,EAAE,IAAkB;IACzE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,aAAa,CAAC;IAClD,MAAM,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAoB,EAAE,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAED,qFAAqF;IACrF,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC"}
@@ -1,12 +0,0 @@
1
- /**
2
- * Schema validation and parsing for the manager's TaskBreakdown contract.
3
- *
4
- * The manager is instructed to emit snake_case JSON. This module strips any
5
- * markdown code fences, parses the JSON, validates it against a zod schema,
6
- * and normalizes it into the camelCase {@link TaskBreakdown} model.
7
- */
8
- import type { TaskBreakdown } from './types.js';
9
- /** Remove a leading/trailing ```json … ``` markdown fence if present. */
10
- export declare function stripJsonFences(text: string): string;
11
- /** Parse and validate raw manager output into a {@link TaskBreakdown}. */
12
- export declare function parseBreakdown(raw: string): TaskBreakdown;
@@ -1,78 +0,0 @@
1
- /**
2
- * Schema validation and parsing for the manager's TaskBreakdown contract.
3
- *
4
- * The manager is instructed to emit snake_case JSON. This module strips any
5
- * markdown code fences, parses the JSON, validates it against a zod schema,
6
- * and normalizes it into the camelCase {@link TaskBreakdown} model.
7
- */
8
- import { z } from 'zod';
9
- import { SpegoError } from '../errors.js';
10
- const subTaskSchema = z
11
- .object({
12
- id: z.string().min(1),
13
- title: z.string().default(''),
14
- description: z.string().default(''),
15
- files: z.array(z.string()).default([]),
16
- acceptance_criteria: z.array(z.string()).default([]),
17
- depends_on: z.array(z.string()).default([]),
18
- priority: z.number().int().default(0),
19
- model_override: z.string().optional(),
20
- })
21
- .transform((s) => ({
22
- id: s.id,
23
- title: s.title,
24
- description: s.description,
25
- files: s.files,
26
- acceptanceCriteria: s.acceptance_criteria,
27
- dependsOn: s.depends_on,
28
- priority: s.priority,
29
- modelOverride: s.model_override,
30
- }));
31
- const breakdownSchema = z
32
- .object({
33
- goal: z.string().min(1),
34
- context_summary: z.string().default(''),
35
- execution_mode: z.enum(['sequential', 'parallel', 'adaptive']).default('adaptive'),
36
- test_command: z.string().default(''),
37
- language: z.string().default('unknown'),
38
- subtasks: z.array(subTaskSchema).min(1),
39
- })
40
- .transform((b) => ({
41
- goal: b.goal,
42
- contextSummary: b.context_summary,
43
- executionMode: b.execution_mode,
44
- testCommand: b.test_command,
45
- language: b.language,
46
- subtasks: b.subtasks,
47
- }));
48
- /** Remove a leading/trailing ```json … ``` markdown fence if present. */
49
- export function stripJsonFences(text) {
50
- const trimmed = text.trim();
51
- if (!trimmed.startsWith('```'))
52
- return trimmed;
53
- const lines = trimmed.split('\n');
54
- const inner = lines[lines.length - 1]?.startsWith('```') ? lines.slice(1, -1) : lines.slice(1);
55
- return inner.join('\n').trim();
56
- }
57
- /** Parse and validate raw manager output into a {@link TaskBreakdown}. */
58
- export function parseBreakdown(raw) {
59
- const stripped = stripJsonFences(raw);
60
- let data;
61
- try {
62
- data = JSON.parse(stripped);
63
- }
64
- catch (err) {
65
- throw new SpegoError('ORCHESTRATION_INVALID_BREAKDOWN', 'Manager returned non-JSON output', {
66
- cause: err.message,
67
- raw: raw.slice(0, 500),
68
- });
69
- }
70
- const parsed = breakdownSchema.safeParse(data);
71
- if (!parsed.success) {
72
- throw new SpegoError('ORCHESTRATION_INVALID_BREAKDOWN', 'Manager breakdown failed schema validation', {
73
- issues: parsed.error.issues,
74
- });
75
- }
76
- return parsed.data;
77
- }
78
- //# sourceMappingURL=schema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/orchestration/schema.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- /**
2
- * Dependency-tier construction for the swarm scheduler.
3
- *
4
- * Uses Kahn's algorithm to group sub-tasks into tiers: tasks within a tier
5
- * have no dependency on one another and can run in parallel. When a cycle is
6
- * detected, the remaining tasks are emitted as single-task tiers so they run
7
- * sequentially rather than concurrently.
8
- */
9
- import type { SubTask } from './types.js';
10
- export interface DependencyTiers {
11
- tiers: SubTask[][];
12
- hadCycle: boolean;
13
- }
14
- export declare function buildDependencyTiers(tasks: SubTask[]): DependencyTiers;
@@ -1,57 +0,0 @@
1
- /**
2
- * Dependency-tier construction for the swarm scheduler.
3
- *
4
- * Uses Kahn's algorithm to group sub-tasks into tiers: tasks within a tier
5
- * have no dependency on one another and can run in parallel. When a cycle is
6
- * detected, the remaining tasks are emitted as single-task tiers so they run
7
- * sequentially rather than concurrently.
8
- */
9
- export function buildDependencyTiers(tasks) {
10
- const byId = new Map(tasks.map((t) => [t.id, t]));
11
- const inDegree = new Map(tasks.map((t) => [t.id, 0]));
12
- for (const task of tasks) {
13
- for (const dep of task.dependsOn) {
14
- if (inDegree.has(dep)) {
15
- inDegree.set(task.id, (inDegree.get(task.id) ?? 0) + 1);
16
- }
17
- }
18
- }
19
- const tiers = [];
20
- const remaining = new Set(tasks.map((t) => t.id));
21
- let hadCycle = false;
22
- const priorityOf = (id) => byId.get(id)?.priority ?? 0;
23
- while (remaining.size > 0) {
24
- const ready = [...remaining].filter((id) => (inDegree.get(id) ?? 0) === 0);
25
- if (ready.length === 0) {
26
- // Cycle: drain the remainder one task at a time, lowest priority first.
27
- hadCycle = true;
28
- const ordered = [...remaining].sort((a, b) => priorityOf(a) - priorityOf(b));
29
- for (const id of ordered) {
30
- const task = byId.get(id);
31
- if (task)
32
- tiers.push([task]);
33
- remaining.delete(id);
34
- }
35
- break;
36
- }
37
- const tier = ready
38
- .sort((a, b) => priorityOf(a) - priorityOf(b))
39
- .map((id) => byId.get(id))
40
- .filter((t) => t !== undefined);
41
- tiers.push(tier);
42
- for (const id of ready)
43
- remaining.delete(id);
44
- for (const id of remaining) {
45
- const task = byId.get(id);
46
- if (!task)
47
- continue;
48
- for (const dep of task.dependsOn) {
49
- if (ready.includes(dep)) {
50
- inDegree.set(id, (inDegree.get(id) ?? 0) - 1);
51
- }
52
- }
53
- }
54
- }
55
- return { tiers, hadCycle };
56
- }
57
- //# sourceMappingURL=tiers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tiers.js","sourceRoot":"","sources":["../../src/orchestration/tiers.ts"],"names":[],"mappings":"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"}
@@ -1,74 +0,0 @@
1
- /**
2
- * Core data models for the ultracode multi-agent orchestration pipeline.
3
- *
4
- * Internal models use camelCase. The manager emits a snake_case JSON contract
5
- * (see `schema.ts`) which is normalized into these shapes before execution.
6
- */
7
- export type ExecutionMode = 'sequential' | 'parallel' | 'adaptive';
8
- export interface SubTask {
9
- id: string;
10
- title: string;
11
- description: string;
12
- /** Relative paths the worker may modify. Enforced by the file gate. */
13
- files: string[];
14
- acceptanceCriteria: string[];
15
- dependsOn: string[];
16
- priority: number;
17
- modelOverride?: string;
18
- }
19
- export interface TaskBreakdown {
20
- goal: string;
21
- contextSummary: string;
22
- executionMode: ExecutionMode;
23
- testCommand: string;
24
- language: string;
25
- subtasks: SubTask[];
26
- }
27
- /** A single changed-file entry from an OpenCode session diff. */
28
- export interface DiffEntry {
29
- path: string;
30
- [key: string]: unknown;
31
- }
32
- export interface SubtaskResult {
33
- subtaskId: string;
34
- sessionId: string;
35
- success: boolean;
36
- summary: string;
37
- changedFiles: string[];
38
- /** Files reverted by the file gate because they were outside the allow-list. */
39
- gateViolations: string[];
40
- error?: string;
41
- }
42
- export interface Verdict {
43
- passed: boolean;
44
- testOutput: string;
45
- failingCriteria: string[];
46
- regressions: string[];
47
- notes: string;
48
- skipped?: boolean;
49
- }
50
- export interface OrchestrationModels {
51
- manager: string;
52
- worker: string;
53
- verifier: string;
54
- fallback: string;
55
- }
56
- /** Fully resolved orchestration runtime settings (config + env overrides). */
57
- export interface OrchestrationRuntimeConfig {
58
- serverUrl: string;
59
- models: OrchestrationModels;
60
- maxParallel: number;
61
- workDir: string;
62
- username?: string;
63
- password?: string;
64
- }
65
- export interface OrchestrationOutcome {
66
- changeName: string;
67
- goal: string;
68
- executionMode: ExecutionMode;
69
- tasksTotal: number;
70
- tasksSucceeded: number;
71
- results: SubtaskResult[];
72
- verdict: Verdict;
73
- warnings: string[];
74
- }
@@ -1,8 +0,0 @@
1
- /**
2
- * Core data models for the ultracode multi-agent orchestration pipeline.
3
- *
4
- * Internal models use camelCase. The manager emits a snake_case JSON contract
5
- * (see `schema.ts`) which is normalized into these shapes before execution.
6
- */
7
- export {};
8
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/orchestration/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -1,14 +0,0 @@
1
- /**
2
- * Verifier step: run the breakdown test command, check acceptance criteria,
3
- * and emit a structured verdict. `passed` is true only when the test command
4
- * succeeds and all criteria are met. A missing test command fails the verdict
5
- * without consulting the backend.
6
- */
7
- import type { OpenCodeApi } from './client.js';
8
- import type { SubtaskResult, TaskBreakdown, Verdict } from './types.js';
9
- export interface VerifierOptions {
10
- model: string;
11
- agentName: string;
12
- workDirAbs: string;
13
- }
14
- export declare function runVerifier(api: OpenCodeApi, breakdown: TaskBreakdown, results: SubtaskResult[], opts: VerifierOptions): Promise<Verdict>;
@@ -1,66 +0,0 @@
1
- /**
2
- * Verifier step: run the breakdown test command, check acceptance criteria,
3
- * and emit a structured verdict. `passed` is true only when the test command
4
- * succeeds and all criteria are met. A missing test command fails the verdict
5
- * without consulting the backend.
6
- */
7
- import { extractText } from './client.js';
8
- import { VERIFIER_SYSTEM_PROMPT, renderVerifierPrompt } from './prompts.js';
9
- import { saveArtifact } from './artifacts.js';
10
- function coerceVerdict(raw) {
11
- const obj = (raw && typeof raw === 'object' ? raw : {});
12
- return {
13
- passed: obj.passed === true,
14
- testOutput: typeof obj.test_output === 'string' ? obj.test_output : '',
15
- failingCriteria: Array.isArray(obj.failing_criteria) ? obj.failing_criteria : [],
16
- regressions: Array.isArray(obj.regressions) ? obj.regressions : [],
17
- notes: typeof obj.notes === 'string' ? obj.notes : '',
18
- };
19
- }
20
- export async function runVerifier(api, breakdown, results, opts) {
21
- if (!breakdown.testCommand.trim()) {
22
- const verdict = {
23
- passed: false,
24
- testOutput: '',
25
- failingCriteria: [],
26
- regressions: [],
27
- notes: 'No test command provided in the breakdown; cannot verify.',
28
- };
29
- await saveArtifact(opts.workDirAbs, 'verdict.json', verdict);
30
- return verdict;
31
- }
32
- const payload = {
33
- goal: breakdown.goal,
34
- test_command: breakdown.testCommand,
35
- subtask_results: results.map((r) => ({
36
- id: r.subtaskId,
37
- success: r.success,
38
- summary_tail: r.summary.slice(-500),
39
- error: r.error,
40
- changed_files: r.changedFiles,
41
- })),
42
- };
43
- const session = await api.createSession('spego-orchestrate-verifier');
44
- try {
45
- const response = await api.sendMessage(session.id, {
46
- text: renderVerifierPrompt(payload),
47
- model: opts.model,
48
- agent: opts.agentName,
49
- system: VERIFIER_SYSTEM_PROMPT,
50
- });
51
- let parsed;
52
- try {
53
- parsed = JSON.parse(extractText(response));
54
- }
55
- catch {
56
- parsed = { passed: false, notes: 'Verifier returned non-JSON output.' };
57
- }
58
- const verdict = coerceVerdict(parsed);
59
- await saveArtifact(opts.workDirAbs, 'verdict.json', verdict);
60
- return verdict;
61
- }
62
- finally {
63
- await api.deleteSession(session.id).catch(() => undefined);
64
- }
65
- }
66
- //# sourceMappingURL=verifier.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../src/orchestration/verifier.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- /**
2
- * Worker step: run one sub-task in an isolated session, parse the status
3
- * marker, collect the session diff, and enforce the file gate. Out-of-scope
4
- * edits are reverted and fail the sub-task.
5
- */
6
- import type { OpenCodeApi } from './client.js';
7
- import type { SubTask, SubtaskResult, TaskBreakdown } from './types.js';
8
- export interface WorkerOptions {
9
- model: string;
10
- agentName: string;
11
- projectRoot: string;
12
- workDirAbs: string;
13
- /** Override for the revert mechanism (defaults to `git checkout --`). */
14
- revert?: (path: string) => Promise<void> | void;
15
- }
16
- export declare function runWorker(api: OpenCodeApi, task: SubTask, breakdown: TaskBreakdown, opts: WorkerOptions): Promise<SubtaskResult>;
@@ -1,80 +0,0 @@
1
- /**
2
- * Worker step: run one sub-task in an isolated session, parse the status
3
- * marker, collect the session diff, and enforce the file gate. Out-of-scope
4
- * edits are reverted and fail the sub-task.
5
- */
6
- import { execFile as execFileCb } from 'node:child_process';
7
- import { promisify } from 'node:util';
8
- import { unlink } from 'node:fs/promises';
9
- import { extractText } from './client.js';
10
- import { renderWorkerPrompt } from './prompts.js';
11
- import { enforceFileGate } from './file-gate.js';
12
- import { saveArtifact } from './artifacts.js';
13
- const execFile = promisify(execFileCb);
14
- const SUCCESS_MARKER = 'ULTRAWORKER_STATUS: SUCCESS';
15
- const FAILURE_MARKER = 'ULTRAWORKER_STATUS: FAILED';
16
- function extractFailureReason(text) {
17
- const idx = text.indexOf(FAILURE_MARKER);
18
- if (idx === -1)
19
- return 'unknown';
20
- return text
21
- .slice(idx + FAILURE_MARKER.length)
22
- .replace(/^[\s—-]+/, '')
23
- .trim()
24
- .slice(0, 300);
25
- }
26
- async function revertFile(projectRoot, filePath) {
27
- await execFile('git', ['checkout', 'HEAD', '--', filePath], { cwd: projectRoot }).catch(() => undefined);
28
- try {
29
- await execFile('git', ['ls-files', '--error-unmatch', filePath], { cwd: projectRoot });
30
- }
31
- catch {
32
- await unlink(filePath).catch(() => undefined);
33
- }
34
- }
35
- export async function runWorker(api, task, breakdown, opts) {
36
- const session = await api.createSession(`spego-orchestrate-worker-${task.id}`);
37
- const revert = opts.revert ?? ((p) => revertFile(opts.projectRoot, p));
38
- let result;
39
- try {
40
- const response = await api.sendMessage(session.id, {
41
- text: renderWorkerPrompt(task, breakdown),
42
- model: task.modelOverride ?? opts.model,
43
- agent: opts.agentName,
44
- });
45
- const text = extractText(response);
46
- const reportedSuccess = text.includes(SUCCESS_MARKER);
47
- const diff = await api.getSessionDiff(session.id);
48
- const changedFiles = diff.map((d) => d.path).filter((p) => typeof p === 'string');
49
- const { violations } = await enforceFileGate({ changedPaths: changedFiles, allowed: task.files, revert });
50
- const success = reportedSuccess && violations.length === 0;
51
- const error = success
52
- ? undefined
53
- : violations.length > 0
54
- ? `file gate violations: ${violations.join(', ')}`
55
- : extractFailureReason(text);
56
- result = {
57
- subtaskId: task.id,
58
- sessionId: session.id,
59
- success,
60
- summary: text.slice(-2000),
61
- changedFiles: changedFiles.filter((p) => !violations.includes(p)),
62
- gateViolations: violations,
63
- error,
64
- };
65
- }
66
- catch (err) {
67
- result = {
68
- subtaskId: task.id,
69
- sessionId: session.id,
70
- success: false,
71
- summary: '',
72
- changedFiles: [],
73
- gateViolations: [],
74
- error: err instanceof Error ? err.message : String(err),
75
- };
76
- }
77
- await saveArtifact(opts.workDirAbs, `result_${task.id}.json`, result);
78
- return result;
79
- }
80
- //# sourceMappingURL=worker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/orchestration/worker.ts"],"names":[],"mappings":"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"}
File without changes