@renseiai/agentfactory 0.8.18 → 0.8.19

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 (45) hide show
  1. package/dist/src/governor/decision-engine-adapter.d.ts +43 -0
  2. package/dist/src/governor/decision-engine-adapter.d.ts.map +1 -0
  3. package/dist/src/governor/decision-engine-adapter.js +422 -0
  4. package/dist/src/governor/decision-engine-adapter.test.d.ts +2 -0
  5. package/dist/src/governor/decision-engine-adapter.test.d.ts.map +1 -0
  6. package/dist/src/governor/decision-engine-adapter.test.js +363 -0
  7. package/dist/src/governor/index.d.ts +1 -0
  8. package/dist/src/governor/index.d.ts.map +1 -1
  9. package/dist/src/governor/index.js +1 -0
  10. package/dist/src/manifest/route-manifest.d.ts.map +1 -1
  11. package/dist/src/manifest/route-manifest.js +4 -0
  12. package/dist/src/orchestrator/orchestrator.d.ts +27 -0
  13. package/dist/src/orchestrator/orchestrator.d.ts.map +1 -1
  14. package/dist/src/orchestrator/orchestrator.js +289 -86
  15. package/dist/src/providers/claude-provider.d.ts.map +1 -1
  16. package/dist/src/providers/claude-provider.js +11 -0
  17. package/dist/src/providers/codex-app-server-provider.d.ts +201 -0
  18. package/dist/src/providers/codex-app-server-provider.d.ts.map +1 -0
  19. package/dist/src/providers/codex-app-server-provider.js +786 -0
  20. package/dist/src/providers/codex-app-server-provider.test.d.ts +2 -0
  21. package/dist/src/providers/codex-app-server-provider.test.d.ts.map +1 -0
  22. package/dist/src/providers/codex-app-server-provider.test.js +529 -0
  23. package/dist/src/providers/codex-provider.d.ts +24 -4
  24. package/dist/src/providers/codex-provider.d.ts.map +1 -1
  25. package/dist/src/providers/codex-provider.js +58 -6
  26. package/dist/src/providers/index.d.ts +1 -0
  27. package/dist/src/providers/index.d.ts.map +1 -1
  28. package/dist/src/providers/index.js +1 -0
  29. package/dist/src/routing/observation-recorder.test.js +1 -1
  30. package/dist/src/routing/observation-store.d.ts +15 -1
  31. package/dist/src/routing/observation-store.d.ts.map +1 -1
  32. package/dist/src/routing/observation-store.test.js +17 -11
  33. package/dist/src/templates/index.d.ts +2 -1
  34. package/dist/src/templates/index.d.ts.map +1 -1
  35. package/dist/src/templates/index.js +1 -0
  36. package/dist/src/templates/registry.d.ts +23 -0
  37. package/dist/src/templates/registry.d.ts.map +1 -1
  38. package/dist/src/templates/registry.js +80 -0
  39. package/dist/src/templates/schema.d.ts +31 -0
  40. package/dist/src/templates/schema.d.ts.map +1 -0
  41. package/dist/src/templates/schema.js +139 -0
  42. package/dist/src/templates/schema.test.d.ts +2 -0
  43. package/dist/src/templates/schema.test.d.ts.map +1 -0
  44. package/dist/src/templates/schema.test.js +215 -0
  45. package/package.json +2 -2
@@ -0,0 +1,363 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { DecisionEngineAdapter } from './decision-engine-adapter.js';
3
+ import { decideAction, MAX_SESSION_ATTEMPTS } from './decision-engine.js';
4
+ import { DEFAULT_GOVERNOR_CONFIG } from './governor-types.js';
5
+ // ---------------------------------------------------------------------------
6
+ // Helpers
7
+ // ---------------------------------------------------------------------------
8
+ function makeIssue(overrides = {}) {
9
+ return {
10
+ id: 'issue-1',
11
+ identifier: 'SUP-100',
12
+ title: 'Test Issue',
13
+ description: undefined,
14
+ status: 'Backlog',
15
+ labels: [],
16
+ createdAt: Date.now() - 2 * 60 * 60 * 1000,
17
+ ...overrides,
18
+ };
19
+ }
20
+ function makeContext(overrides = {}) {
21
+ return {
22
+ issue: makeIssue(),
23
+ config: { ...DEFAULT_GOVERNOR_CONFIG, projects: ['TestProject'] },
24
+ hasActiveSession: false,
25
+ isHeld: false,
26
+ isWithinCooldown: false,
27
+ isParentIssue: false,
28
+ workflowStrategy: undefined,
29
+ researchCompleted: false,
30
+ backlogCreationCompleted: false,
31
+ completedSessionCount: 0,
32
+ ...overrides,
33
+ };
34
+ }
35
+ function findNode(workflow, name) {
36
+ return workflow.nodes?.find(n => n.name === name);
37
+ }
38
+ // ---------------------------------------------------------------------------
39
+ // Basic structure tests
40
+ // ---------------------------------------------------------------------------
41
+ describe('DecisionEngineAdapter', () => {
42
+ describe('toWorkflowDefinition', () => {
43
+ it('generates a valid WorkflowDefinition v2', () => {
44
+ const workflow = DecisionEngineAdapter.toWorkflowDefinition();
45
+ expect(workflow.apiVersion).toBe('v2');
46
+ expect(workflow.kind).toBe('WorkflowDefinition');
47
+ expect(workflow.metadata.name).toBe('governor-decision-engine');
48
+ });
49
+ it('uses custom workflow name when provided', () => {
50
+ const workflow = DecisionEngineAdapter.toWorkflowDefinition({
51
+ workflowName: 'custom-workflow',
52
+ });
53
+ expect(workflow.metadata.name).toBe('custom-workflow');
54
+ });
55
+ it('includes triggers for Linear events and governor scan', () => {
56
+ const workflow = DecisionEngineAdapter.toWorkflowDefinition();
57
+ expect(workflow.triggers).toHaveLength(2);
58
+ expect(workflow.triggers?.[0].name).toBe('issue-status-change');
59
+ expect(workflow.triggers?.[0].source).toBe('linear');
60
+ expect(workflow.triggers?.[1].name).toBe('governor-scan');
61
+ expect(workflow.triggers?.[1].type).toBe('schedule');
62
+ });
63
+ it('includes agent and linear providers', () => {
64
+ const workflow = DecisionEngineAdapter.toWorkflowDefinition();
65
+ expect(workflow.providers).toHaveLength(2);
66
+ const names = workflow.providers?.map(p => p.name);
67
+ expect(names).toContain('linear');
68
+ expect(names).toContain('agent');
69
+ });
70
+ it('stores governor config values in workflow config', () => {
71
+ const config = {
72
+ ...DEFAULT_GOVERNOR_CONFIG,
73
+ enableAutoDevelopment: false,
74
+ enableAutoQA: false,
75
+ };
76
+ const workflow = DecisionEngineAdapter.toWorkflowDefinition({ governorConfig: config });
77
+ expect(workflow.config?.enableAutoDevelopment).toBe(false);
78
+ expect(workflow.config?.enableAutoQA).toBe(false);
79
+ });
80
+ });
81
+ // ---------------------------------------------------------------------------
82
+ // Guard nodes
83
+ // ---------------------------------------------------------------------------
84
+ describe('guard nodes', () => {
85
+ const workflow = DecisionEngineAdapter.toWorkflowDefinition();
86
+ it('includes active-session guard', () => {
87
+ const node = findNode(workflow, 'guard-active-session');
88
+ expect(node).toBeDefined();
89
+ expect(node?.when).toContain('hasActiveSession');
90
+ });
91
+ it('includes cooldown guard', () => {
92
+ const node = findNode(workflow, 'guard-cooldown');
93
+ expect(node).toBeDefined();
94
+ expect(node?.when).toContain('isWithinCooldown');
95
+ });
96
+ it('includes hold guard', () => {
97
+ const node = findNode(workflow, 'guard-hold');
98
+ expect(node).toBeDefined();
99
+ expect(node?.when).toContain('isHeld');
100
+ });
101
+ it('includes gate guard', () => {
102
+ const node = findNode(workflow, 'guard-gates');
103
+ expect(node).toBeDefined();
104
+ expect(node?.when).toContain('gateEvaluation');
105
+ });
106
+ it('includes circuit breaker guard', () => {
107
+ const node = findNode(workflow, 'guard-circuit-breaker');
108
+ expect(node).toBeDefined();
109
+ expect(node?.when).toContain(`${MAX_SESSION_ATTEMPTS}`);
110
+ });
111
+ it('includes terminal status guard', () => {
112
+ const node = findNode(workflow, 'guard-terminal-status');
113
+ expect(node).toBeDefined();
114
+ expect(node?.when).toContain('Accepted');
115
+ expect(node?.when).toContain('Canceled');
116
+ expect(node?.when).toContain('Duplicate');
117
+ });
118
+ it('includes sub-issue guard', () => {
119
+ const node = findNode(workflow, 'guard-sub-issue');
120
+ expect(node).toBeDefined();
121
+ expect(node?.when).toContain('parentId');
122
+ });
123
+ });
124
+ // ---------------------------------------------------------------------------
125
+ // Routing nodes
126
+ // ---------------------------------------------------------------------------
127
+ describe('routing nodes', () => {
128
+ it('includes Backlog routing node', () => {
129
+ const workflow = DecisionEngineAdapter.toWorkflowDefinition();
130
+ const node = findNode(workflow, 'route-backlog');
131
+ expect(node).toBeDefined();
132
+ expect(node?.when).toContain('Backlog');
133
+ const actions = node?.steps?.map(s => s.action);
134
+ expect(actions).toContain('trigger-development');
135
+ });
136
+ it('includes Started routing node', () => {
137
+ const workflow = DecisionEngineAdapter.toWorkflowDefinition();
138
+ const node = findNode(workflow, 'route-started');
139
+ expect(node).toBeDefined();
140
+ expect(node?.when).toContain('Started');
141
+ });
142
+ it('includes Finished routing node with QA', () => {
143
+ const workflow = DecisionEngineAdapter.toWorkflowDefinition();
144
+ const node = findNode(workflow, 'route-finished');
145
+ expect(node).toBeDefined();
146
+ expect(node?.when).toContain('Finished');
147
+ const actions = node?.steps?.map(s => s.action);
148
+ expect(actions).toContain('trigger-qa');
149
+ expect(actions).toContain('escalate-human');
150
+ expect(actions).toContain('decompose');
151
+ });
152
+ it('includes merge queue step in Finished when enabled', () => {
153
+ const workflow = DecisionEngineAdapter.toWorkflowDefinition({
154
+ includeMergeQueue: true,
155
+ });
156
+ const node = findNode(workflow, 'route-finished');
157
+ const actions = node?.steps?.map(s => s.action);
158
+ expect(actions).toContain('trigger-merge');
159
+ });
160
+ it('excludes merge queue step in Finished when disabled', () => {
161
+ const workflow = DecisionEngineAdapter.toWorkflowDefinition({
162
+ includeMergeQueue: false,
163
+ });
164
+ const node = findNode(workflow, 'route-finished');
165
+ const actions = node?.steps?.map(s => s.action);
166
+ expect(actions).not.toContain('trigger-merge');
167
+ });
168
+ it('includes Delivered routing node', () => {
169
+ const workflow = DecisionEngineAdapter.toWorkflowDefinition();
170
+ const node = findNode(workflow, 'route-delivered');
171
+ expect(node).toBeDefined();
172
+ expect(node?.when).toContain('Delivered');
173
+ const actions = node?.steps?.map(s => s.action);
174
+ expect(actions).toContain('trigger-acceptance');
175
+ });
176
+ it('includes Rejected routing node with escalation', () => {
177
+ const workflow = DecisionEngineAdapter.toWorkflowDefinition();
178
+ const node = findNode(workflow, 'route-rejected');
179
+ expect(node).toBeDefined();
180
+ expect(node?.when).toContain('Rejected');
181
+ const actions = node?.steps?.map(s => s.action);
182
+ expect(actions).toContain('trigger-refinement');
183
+ expect(actions).toContain('escalate-human');
184
+ expect(actions).toContain('decompose');
185
+ });
186
+ });
187
+ // ---------------------------------------------------------------------------
188
+ // Top-of-funnel (Icebox) nodes
189
+ // ---------------------------------------------------------------------------
190
+ describe('top-of-funnel nodes', () => {
191
+ it('includes Icebox research node by default', () => {
192
+ const workflow = DecisionEngineAdapter.toWorkflowDefinition();
193
+ const node = findNode(workflow, 'icebox-research');
194
+ expect(node).toBeDefined();
195
+ expect(node?.when).toContain('Icebox');
196
+ expect(node?.when).toContain('enableAutoResearch');
197
+ });
198
+ it('includes Icebox backlog-creation node by default', () => {
199
+ const workflow = DecisionEngineAdapter.toWorkflowDefinition();
200
+ const node = findNode(workflow, 'icebox-backlog-creation');
201
+ expect(node).toBeDefined();
202
+ expect(node?.when).toContain('Icebox');
203
+ expect(node?.when).toContain('enableAutoBacklogCreation');
204
+ });
205
+ it('excludes top-of-funnel nodes when disabled', () => {
206
+ const workflow = DecisionEngineAdapter.toWorkflowDefinition({
207
+ includeTopOfFunnel: false,
208
+ });
209
+ expect(findNode(workflow, 'icebox-research')).toBeUndefined();
210
+ expect(findNode(workflow, 'icebox-backlog-creation')).toBeUndefined();
211
+ });
212
+ });
213
+ // ---------------------------------------------------------------------------
214
+ // Decision parity: verify the adapter covers all decision paths
215
+ // ---------------------------------------------------------------------------
216
+ describe('decision parity with decideAction()', () => {
217
+ const workflow = DecisionEngineAdapter.toWorkflowDefinition({
218
+ includeMergeQueue: true,
219
+ includeTopOfFunnel: true,
220
+ });
221
+ it('covers active session skip → guard-active-session node exists', () => {
222
+ const ctx = makeContext({ hasActiveSession: true });
223
+ const result = decideAction(ctx);
224
+ expect(result.action).toBe('none');
225
+ expect(findNode(workflow, 'guard-active-session')).toBeDefined();
226
+ });
227
+ it('covers cooldown skip → guard-cooldown node exists', () => {
228
+ const ctx = makeContext({ isWithinCooldown: true });
229
+ const result = decideAction(ctx);
230
+ expect(result.action).toBe('none');
231
+ expect(findNode(workflow, 'guard-cooldown')).toBeDefined();
232
+ });
233
+ it('covers hold skip → guard-hold node exists', () => {
234
+ const ctx = makeContext({ isHeld: true });
235
+ const result = decideAction(ctx);
236
+ expect(result.action).toBe('none');
237
+ expect(findNode(workflow, 'guard-hold')).toBeDefined();
238
+ });
239
+ it('covers circuit breaker → guard-circuit-breaker node exists', () => {
240
+ const ctx = makeContext({ completedSessionCount: MAX_SESSION_ATTEMPTS });
241
+ const result = decideAction(ctx);
242
+ expect(result.action).toBe('none');
243
+ expect(findNode(workflow, 'guard-circuit-breaker')).toBeDefined();
244
+ });
245
+ it('covers terminal status → guard-terminal-status node exists', () => {
246
+ for (const status of ['Accepted', 'Canceled', 'Duplicate']) {
247
+ const ctx = makeContext({ issue: makeIssue({ status }) });
248
+ const result = decideAction(ctx);
249
+ expect(result.action).toBe('none');
250
+ }
251
+ expect(findNode(workflow, 'guard-terminal-status')).toBeDefined();
252
+ });
253
+ it('covers sub-issue guard → guard-sub-issue node exists', () => {
254
+ const ctx = makeContext({ issue: makeIssue({ parentId: 'parent-1' }) });
255
+ const result = decideAction(ctx);
256
+ expect(result.action).toBe('none');
257
+ expect(findNode(workflow, 'guard-sub-issue')).toBeDefined();
258
+ });
259
+ it('covers Backlog → trigger-development', () => {
260
+ const ctx = makeContext({ issue: makeIssue({ status: 'Backlog' }) });
261
+ const result = decideAction(ctx);
262
+ expect(result.action).toBe('trigger-development');
263
+ const node = findNode(workflow, 'route-backlog');
264
+ const dispatchStep = node?.steps?.find(s => s.action === 'trigger-development');
265
+ expect(dispatchStep).toBeDefined();
266
+ });
267
+ it('covers Finished → trigger-qa', () => {
268
+ const ctx = makeContext({ issue: makeIssue({ status: 'Finished' }) });
269
+ const result = decideAction(ctx);
270
+ expect(result.action).toBe('trigger-qa');
271
+ const node = findNode(workflow, 'route-finished');
272
+ const qaStep = node?.steps?.find(s => s.action === 'trigger-qa');
273
+ expect(qaStep).toBeDefined();
274
+ });
275
+ it('covers Finished + escalate-human → escalate-human', () => {
276
+ const ctx = makeContext({
277
+ issue: makeIssue({ status: 'Finished' }),
278
+ workflowStrategy: 'escalate-human',
279
+ });
280
+ const result = decideAction(ctx);
281
+ expect(result.action).toBe('escalate-human');
282
+ const node = findNode(workflow, 'route-finished');
283
+ const escalateStep = node?.steps?.find(s => s.action === 'escalate-human');
284
+ expect(escalateStep).toBeDefined();
285
+ });
286
+ it('covers Finished + decompose → decompose', () => {
287
+ const ctx = makeContext({
288
+ issue: makeIssue({ status: 'Finished' }),
289
+ workflowStrategy: 'decompose',
290
+ });
291
+ const result = decideAction(ctx);
292
+ expect(result.action).toBe('decompose');
293
+ const node = findNode(workflow, 'route-finished');
294
+ const decomposeStep = node?.steps?.find(s => s.action === 'decompose');
295
+ expect(decomposeStep).toBeDefined();
296
+ });
297
+ it('covers Finished + merge queue → trigger-merge', () => {
298
+ const ctx = makeContext({
299
+ issue: makeIssue({ status: 'Finished' }),
300
+ mergeQueueEnabled: true,
301
+ });
302
+ const result = decideAction(ctx);
303
+ expect(result.action).toBe('trigger-merge');
304
+ const node = findNode(workflow, 'route-finished');
305
+ const mergeStep = node?.steps?.find(s => s.action === 'trigger-merge');
306
+ expect(mergeStep).toBeDefined();
307
+ });
308
+ it('covers Delivered → trigger-acceptance', () => {
309
+ const ctx = makeContext({ issue: makeIssue({ status: 'Delivered' }) });
310
+ const result = decideAction(ctx);
311
+ expect(result.action).toBe('trigger-acceptance');
312
+ const node = findNode(workflow, 'route-delivered');
313
+ const acceptStep = node?.steps?.find(s => s.action === 'trigger-acceptance');
314
+ expect(acceptStep).toBeDefined();
315
+ });
316
+ it('covers Rejected → trigger-refinement', () => {
317
+ const ctx = makeContext({ issue: makeIssue({ status: 'Rejected' }) });
318
+ const result = decideAction(ctx);
319
+ expect(result.action).toBe('trigger-refinement');
320
+ const node = findNode(workflow, 'route-rejected');
321
+ const refineStep = node?.steps?.find(s => s.action === 'trigger-refinement');
322
+ expect(refineStep).toBeDefined();
323
+ });
324
+ it('covers Rejected + escalate-human → escalate-human', () => {
325
+ const ctx = makeContext({
326
+ issue: makeIssue({ status: 'Rejected' }),
327
+ workflowStrategy: 'escalate-human',
328
+ });
329
+ const result = decideAction(ctx);
330
+ expect(result.action).toBe('escalate-human');
331
+ const node = findNode(workflow, 'route-rejected');
332
+ const escalateStep = node?.steps?.find(s => s.action === 'escalate-human');
333
+ expect(escalateStep).toBeDefined();
334
+ });
335
+ it('covers Started → none', () => {
336
+ const ctx = makeContext({ issue: makeIssue({ status: 'Started' }) });
337
+ const result = decideAction(ctx);
338
+ expect(result.action).toBe('none');
339
+ expect(findNode(workflow, 'route-started')).toBeDefined();
340
+ });
341
+ it('all decideAction decision points have corresponding workflow nodes', () => {
342
+ // Comprehensive check: every decision path in decideAction has a matching node
343
+ const nodeNames = workflow.nodes?.map(n => n.name) ?? [];
344
+ // Guard nodes
345
+ expect(nodeNames).toContain('guard-active-session');
346
+ expect(nodeNames).toContain('guard-cooldown');
347
+ expect(nodeNames).toContain('guard-hold');
348
+ expect(nodeNames).toContain('guard-gates');
349
+ expect(nodeNames).toContain('guard-circuit-breaker');
350
+ expect(nodeNames).toContain('guard-terminal-status');
351
+ expect(nodeNames).toContain('guard-sub-issue');
352
+ // Routing nodes
353
+ expect(nodeNames).toContain('route-backlog');
354
+ expect(nodeNames).toContain('route-started');
355
+ expect(nodeNames).toContain('route-finished');
356
+ expect(nodeNames).toContain('route-delivered');
357
+ expect(nodeNames).toContain('route-rejected');
358
+ // Top-of-funnel
359
+ expect(nodeNames).toContain('icebox-research');
360
+ expect(nodeNames).toContain('icebox-backlog-creation');
361
+ });
362
+ });
363
+ });
@@ -11,4 +11,5 @@ export * from './in-memory-event-bus.js';
11
11
  export * from './event-deduplicator.js';
12
12
  export * from './event-driven-governor.js';
13
13
  export * from './platform-adapter.js';
14
+ export * from './decision-engine-adapter.js';
14
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/governor/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,0BAA0B,CAAA;AACxC,cAAc,yBAAyB,CAAA;AACvC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,uBAAuB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/governor/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,0BAA0B,CAAA;AACxC,cAAc,yBAAyB,CAAA;AACvC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,uBAAuB,CAAA;AACrC,cAAc,8BAA8B,CAAA"}
@@ -11,3 +11,4 @@ export * from './in-memory-event-bus.js';
11
11
  export * from './event-deduplicator.js';
12
12
  export * from './event-driven-governor.js';
13
13
  export * from './platform-adapter.js';
14
+ export * from './decision-engine-adapter.js';
@@ -1 +1 @@
1
- {"version":3,"file":"route-manifest.d.ts","sourceRoot":"","sources":["../../../src/manifest/route-manifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;AAElD,MAAM,WAAW,UAAU;IACzB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAA;IACZ,0FAA0F;IAC1F,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;CAC7C;AAED,MAAM,WAAW,SAAS;IACxB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAA;IACZ,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAA;IACjB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAA;IAClB,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB,KAAK,EAAE,SAAS,EAAE,CAAA;CACnB;AAED,eAAO,MAAM,cAAc,EAAE,aAmJ5B,CAAA"}
1
+ {"version":3,"file":"route-manifest.d.ts","sourceRoot":"","sources":["../../../src/manifest/route-manifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;AAElD,MAAM,WAAW,UAAU;IACzB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAA;IACZ,0FAA0F;IAC1F,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;CAC7C;AAED,MAAM,WAAW,SAAS;IACxB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAA;IACZ,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAA;IACjB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAA;IAClB,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB,KAAK,EAAE,SAAS,EAAE,CAAA;CACnB;AAED,eAAO,MAAM,cAAc,EAAE,aAuJ5B,CAAA"}
@@ -99,6 +99,10 @@ export const ROUTE_MANIFEST = {
99
99
  path: 'src/app/api/public/sessions/[id]/route.ts',
100
100
  methods: { GET: 'routes.public.sessionDetail.GET' },
101
101
  },
102
+ {
103
+ path: 'src/app/api/public/phase-metrics/route.ts',
104
+ methods: { GET: 'routes.public.phaseMetrics.GET' },
105
+ },
102
106
  // Config route
103
107
  {
104
108
  path: 'src/app/api/config/route.ts',
@@ -242,6 +242,22 @@ export declare class AgentOrchestrator {
242
242
  * Falls back to `pnpm install --frozen-lockfile` if symlinking fails.
243
243
  */
244
244
  linkDependencies(worktreePath: string, identifier: string): void;
245
+ /**
246
+ * Verify that critical dependency symlinks are intact and resolvable.
247
+ * Returns true if verification passes, false if re-linking is needed.
248
+ */
249
+ private verifyDependencyLinks;
250
+ /**
251
+ * Remove all node_modules directories from a worktree (root + per-workspace).
252
+ */
253
+ private removeWorktreeNodeModules;
254
+ /**
255
+ * Create or update a symlink atomically, handling EEXIST races.
256
+ *
257
+ * If the destination already exists and points to the correct target, this is a no-op.
258
+ * If it points elsewhere or isn't a symlink, it's replaced.
259
+ */
260
+ private safeSymlink;
245
261
  /**
246
262
  * Create a real node_modules directory and symlink each entry from the source.
247
263
  *
@@ -249,6 +265,9 @@ export declare class AgentOrchestrator {
249
265
  * resolve through the symlink and corrupt the original), we create a real
250
266
  * directory and symlink each entry individually. If pnpm "recreates" this
251
267
  * directory, it only destroys the worktree's symlinks — not the originals.
268
+ *
269
+ * Supports incremental sync: if the destination already exists, only missing
270
+ * or stale entries are updated (safe for concurrent agents and phase reuse).
252
271
  */
253
272
  private linkNodeModulesContents;
254
273
  /**
@@ -256,6 +275,14 @@ export declare class AgentOrchestrator {
256
275
  * Only called when symlinking fails.
257
276
  */
258
277
  private installDependencies;
278
+ /**
279
+ * Sync dependencies between worktree and main repo before linking.
280
+ *
281
+ * When a development agent adds new packages on a branch, the lockfile in the
282
+ * worktree diverges from the main repo. This method detects lockfile drift,
283
+ * updates the main repo's node_modules, then re-links into the worktree.
284
+ */
285
+ syncDependencies(worktreePath: string, identifier: string): void;
259
286
  /**
260
287
  * @deprecated Use linkDependencies() instead. This now delegates to linkDependencies.
261
288
  */
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/orchestrator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/orchestrator.ts"],"names":[],"mappings":"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"}