agentic-orchestrator 0.1.25 → 0.1.26

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 (177) hide show
  1. package/agentic/orchestrator/defaults/policy.defaults.yaml +1 -0
  2. package/agentic/orchestrator/policy.yaml +1 -0
  3. package/agentic/orchestrator/schemas/policy.schema.json +4 -0
  4. package/agentic/orchestrator/schemas/policy.user.schema.json +4 -0
  5. package/apps/control-plane/src/application/services/activity-monitor-service.ts +42 -0
  6. package/apps/control-plane/src/application/services/collision-queue-service.ts +48 -0
  7. package/apps/control-plane/src/application/services/cost-tracking-service.ts +80 -0
  8. package/apps/control-plane/src/application/services/feature-deletion-service.ts +57 -0
  9. package/apps/control-plane/src/application/services/feature-lifecycle-service.ts +65 -0
  10. package/apps/control-plane/src/application/services/feature-state-service.ts +87 -0
  11. package/apps/control-plane/src/application/services/gate-selection-service.ts +28 -0
  12. package/apps/control-plane/src/application/services/gate-service.ts +148 -0
  13. package/apps/control-plane/src/application/services/issue-tracker-service.ts +28 -0
  14. package/apps/control-plane/src/application/services/lock-service.ts +88 -0
  15. package/apps/control-plane/src/application/services/merge-service.ts +63 -0
  16. package/apps/control-plane/src/application/services/notifier-service.ts +70 -0
  17. package/apps/control-plane/src/application/services/patch-service.ts +95 -0
  18. package/apps/control-plane/src/application/services/performance-analytics-service.ts +90 -0
  19. package/apps/control-plane/src/application/services/plan-service.ts +184 -0
  20. package/apps/control-plane/src/application/services/pr-monitor-service.ts +58 -0
  21. package/apps/control-plane/src/application/services/qa-index-service.ts +68 -0
  22. package/apps/control-plane/src/application/services/reactions-service.ts +77 -0
  23. package/apps/control-plane/src/application/services/reporting-service.ts +79 -0
  24. package/apps/control-plane/src/application/services/run-lease-service.ts +79 -0
  25. package/apps/control-plane/src/application/tools/tool-router.ts +76 -0
  26. package/apps/control-plane/src/mcp/tool-runtime.ts +4 -0
  27. package/apps/control-plane/src/providers/providers.ts +96 -0
  28. package/apps/control-plane/src/providers/worker-provider-factory.ts +4 -0
  29. package/apps/control-plane/src/supervisor/build-wave-executor.ts +4 -0
  30. package/apps/control-plane/src/supervisor/planning-wave-executor.ts +4 -0
  31. package/apps/control-plane/src/supervisor/qa-wave-executor.ts +4 -0
  32. package/apps/control-plane/src/supervisor/run-coordinator.ts +4 -0
  33. package/apps/control-plane/src/supervisor/runtime.ts +4 -0
  34. package/apps/control-plane/src/supervisor/session-orchestrator.ts +4 -0
  35. package/apps/control-plane/test/dashboard-api.integration.spec.ts +310 -1
  36. package/apps/control-plane/test/dashboard-client.spec.ts +136 -1
  37. package/apps/control-plane/test/dashboard-live-feed.spec.ts +153 -0
  38. package/apps/control-plane/test/dashboard-ui-utils.spec.ts +132 -0
  39. package/apps/control-plane/test/mcp.spec.ts +96 -0
  40. package/apps/control-plane/test/tool-runtime.spec.ts +68 -0
  41. package/config/agentic/orchestrator/policy.yaml +1 -0
  42. package/dist/apps/control-plane/application/services/activity-monitor-service.d.ts +42 -0
  43. package/dist/apps/control-plane/application/services/activity-monitor-service.js +42 -0
  44. package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
  45. package/dist/apps/control-plane/application/services/collision-queue-service.d.ts +48 -0
  46. package/dist/apps/control-plane/application/services/collision-queue-service.js +48 -0
  47. package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
  48. package/dist/apps/control-plane/application/services/cost-tracking-service.d.ts +79 -0
  49. package/dist/apps/control-plane/application/services/cost-tracking-service.js +76 -0
  50. package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
  51. package/dist/apps/control-plane/application/services/feature-deletion-service.d.ts +57 -0
  52. package/dist/apps/control-plane/application/services/feature-deletion-service.js +57 -0
  53. package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
  54. package/dist/apps/control-plane/application/services/feature-lifecycle-service.d.ts +64 -0
  55. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +61 -0
  56. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
  57. package/dist/apps/control-plane/application/services/feature-state-service.d.ts +86 -0
  58. package/dist/apps/control-plane/application/services/feature-state-service.js +83 -0
  59. package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
  60. package/dist/apps/control-plane/application/services/gate-selection-service.d.ts +28 -0
  61. package/dist/apps/control-plane/application/services/gate-selection-service.js +28 -0
  62. package/dist/apps/control-plane/application/services/gate-selection-service.js.map +1 -1
  63. package/dist/apps/control-plane/application/services/gate-service.d.ts +148 -0
  64. package/dist/apps/control-plane/application/services/gate-service.js +120 -0
  65. package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
  66. package/dist/apps/control-plane/application/services/issue-tracker-service.d.ts +28 -0
  67. package/dist/apps/control-plane/application/services/issue-tracker-service.js +28 -0
  68. package/dist/apps/control-plane/application/services/issue-tracker-service.js.map +1 -1
  69. package/dist/apps/control-plane/application/services/lock-service.d.ts +88 -0
  70. package/dist/apps/control-plane/application/services/lock-service.js +64 -0
  71. package/dist/apps/control-plane/application/services/lock-service.js.map +1 -1
  72. package/dist/apps/control-plane/application/services/merge-service.d.ts +62 -0
  73. package/dist/apps/control-plane/application/services/merge-service.js +59 -0
  74. package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
  75. package/dist/apps/control-plane/application/services/notifier-service.d.ts +70 -0
  76. package/dist/apps/control-plane/application/services/notifier-service.js +70 -0
  77. package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
  78. package/dist/apps/control-plane/application/services/patch-service.d.ts +94 -0
  79. package/dist/apps/control-plane/application/services/patch-service.js +91 -0
  80. package/dist/apps/control-plane/application/services/patch-service.js.map +1 -1
  81. package/dist/apps/control-plane/application/services/performance-analytics-service.d.ts +89 -0
  82. package/dist/apps/control-plane/application/services/performance-analytics-service.js +86 -0
  83. package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
  84. package/dist/apps/control-plane/application/services/plan-service.d.ts +287 -0
  85. package/dist/apps/control-plane/application/services/plan-service.js +207 -0
  86. package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
  87. package/dist/apps/control-plane/application/services/pr-monitor-service.d.ts +58 -0
  88. package/dist/apps/control-plane/application/services/pr-monitor-service.js +58 -0
  89. package/dist/apps/control-plane/application/services/pr-monitor-service.js.map +1 -1
  90. package/dist/apps/control-plane/application/services/qa-index-service.d.ts +67 -0
  91. package/dist/apps/control-plane/application/services/qa-index-service.js +64 -0
  92. package/dist/apps/control-plane/application/services/qa-index-service.js.map +1 -1
  93. package/dist/apps/control-plane/application/services/reactions-service.d.ts +76 -0
  94. package/dist/apps/control-plane/application/services/reactions-service.js +73 -0
  95. package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
  96. package/dist/apps/control-plane/application/services/reporting-service.d.ts +78 -0
  97. package/dist/apps/control-plane/application/services/reporting-service.js +75 -0
  98. package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
  99. package/dist/apps/control-plane/application/services/run-lease-service.d.ts +79 -0
  100. package/dist/apps/control-plane/application/services/run-lease-service.js +79 -0
  101. package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
  102. package/dist/apps/control-plane/application/tools/tool-router.d.ts +76 -0
  103. package/dist/apps/control-plane/application/tools/tool-router.js +62 -0
  104. package/dist/apps/control-plane/application/tools/tool-router.js.map +1 -1
  105. package/dist/apps/control-plane/mcp/tool-runtime.d.ts +3 -0
  106. package/dist/apps/control-plane/mcp/tool-runtime.js +3 -0
  107. package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
  108. package/dist/apps/control-plane/providers/providers.d.ts +88 -0
  109. package/dist/apps/control-plane/providers/providers.js.map +1 -1
  110. package/dist/apps/control-plane/providers/worker-provider-factory.d.ts +3 -0
  111. package/dist/apps/control-plane/providers/worker-provider-factory.js.map +1 -1
  112. package/dist/apps/control-plane/supervisor/build-wave-executor.d.ts +3 -0
  113. package/dist/apps/control-plane/supervisor/build-wave-executor.js +3 -0
  114. package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
  115. package/dist/apps/control-plane/supervisor/planning-wave-executor.d.ts +3 -0
  116. package/dist/apps/control-plane/supervisor/planning-wave-executor.js +3 -0
  117. package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
  118. package/dist/apps/control-plane/supervisor/qa-wave-executor.d.ts +3 -0
  119. package/dist/apps/control-plane/supervisor/qa-wave-executor.js +3 -0
  120. package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
  121. package/dist/apps/control-plane/supervisor/run-coordinator.d.ts +3 -0
  122. package/dist/apps/control-plane/supervisor/run-coordinator.js +3 -0
  123. package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
  124. package/dist/apps/control-plane/supervisor/runtime.d.ts +3 -0
  125. package/dist/apps/control-plane/supervisor/runtime.js +3 -0
  126. package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
  127. package/dist/apps/control-plane/supervisor/session-orchestrator.d.ts +3 -0
  128. package/dist/apps/control-plane/supervisor/session-orchestrator.js +3 -0
  129. package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
  130. package/package.json +1 -1
  131. package/packages/web-dashboard/src/app/analytics/page.tsx +451 -0
  132. package/packages/web-dashboard/src/app/api/analytics/route.ts +62 -0
  133. package/packages/web-dashboard/src/app/api/collisions/route.ts +63 -0
  134. package/packages/web-dashboard/src/app/api/features/[id]/cost/route.ts +29 -0
  135. package/packages/web-dashboard/src/app/api/features/[id]/review-brief/route.ts +31 -0
  136. package/packages/web-dashboard/src/app/api/features/[id]/route.ts +5 -8
  137. package/packages/web-dashboard/src/app/api/features/[id]/test-index/route.ts +31 -0
  138. package/packages/web-dashboard/src/app/api/flaky/route.ts +20 -0
  139. package/packages/web-dashboard/src/app/api/policy/budget/route.ts +31 -0
  140. package/packages/web-dashboard/src/app/api/run/route.ts +162 -0
  141. package/packages/web-dashboard/src/app/api/status/route.ts +2 -5
  142. package/packages/web-dashboard/src/app/feature/[id]/page.tsx +112 -0
  143. package/packages/web-dashboard/src/app/page.tsx +379 -77
  144. package/packages/web-dashboard/src/components/agent-pipeline-stepper.tsx +100 -0
  145. package/packages/web-dashboard/src/components/dependency-chains.tsx +58 -0
  146. package/packages/web-dashboard/src/components/detail-panel.tsx +215 -5
  147. package/packages/web-dashboard/src/components/feature-card.tsx +5 -0
  148. package/packages/web-dashboard/src/components/feature-cost-panel.tsx +66 -0
  149. package/packages/web-dashboard/src/components/feature-list-view.tsx +336 -0
  150. package/packages/web-dashboard/src/components/gate-step-drilldown.tsx +92 -0
  151. package/packages/web-dashboard/src/components/kanban-board.tsx +3 -0
  152. package/packages/web-dashboard/src/components/live-event-feed.tsx +60 -0
  153. package/packages/web-dashboard/src/components/lock-resource-map.tsx +73 -0
  154. package/packages/web-dashboard/src/components/plan-revision-timeline.tsx +55 -0
  155. package/packages/web-dashboard/src/components/plan-risk-annotations.tsx +63 -0
  156. package/packages/web-dashboard/src/components/plan-scope-tree.tsx +285 -0
  157. package/packages/web-dashboard/src/components/qa-coverage-map.tsx +174 -0
  158. package/packages/web-dashboard/src/components/quick-launch-panel.tsx +70 -0
  159. package/packages/web-dashboard/src/components/review-brief-panel.tsx +75 -0
  160. package/packages/web-dashboard/src/components/run-health-panel.tsx +85 -0
  161. package/packages/web-dashboard/src/components/summary-bar.tsx +59 -2
  162. package/packages/web-dashboard/src/components/verification-signals.tsx +167 -0
  163. package/packages/web-dashboard/src/lib/analytics-utils.ts +3 -0
  164. package/packages/web-dashboard/src/lib/aop-client.ts +510 -11
  165. package/packages/web-dashboard/src/lib/api-envelope.ts +48 -0
  166. package/packages/web-dashboard/src/lib/authz-adapter.ts +33 -0
  167. package/packages/web-dashboard/src/lib/dashboard-utils.ts +304 -0
  168. package/packages/web-dashboard/src/lib/live-feed.ts +218 -0
  169. package/packages/web-dashboard/src/lib/policy-reader.ts +22 -0
  170. package/packages/web-dashboard/src/lib/types.ts +114 -0
  171. package/packages/web-dashboard/src/styles/dashboard.module.css +341 -1
  172. package/spec-files/{outstanding → completed}/agentic_orchestrator_dashboard_advanced_ux_spec.md +1 -1
  173. package/spec-files/outstanding/agentic_orchestrator_evidence_integrity_doctor_spec.md +561 -0
  174. package/spec-files/outstanding/agentic_orchestrator_kernel_simplification_spec.md +834 -0
  175. package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +12 -5
  176. package/spec-files/outstanding/agentic_orchestrator_observability_replay_spec.md +442 -0
  177. package/spec-files/progress.md +174 -1
@@ -1,14 +1,25 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
  import {
3
+ applyDashboardRouteState,
4
+ applyFiltersToSearchParams,
3
5
  applyQuickFilter,
6
+ buildDashboardFeatureHref,
7
+ buildFeatureFocusHref,
4
8
  computeSummaryCounts,
5
9
  createDefaultFilters,
6
10
  filterFeatures,
7
11
  formatElapsedTime,
8
12
  formatRelativeTime,
13
+ getNextFocusedFeatureId,
14
+ isQuickLaunchAffordanceVisible,
15
+ parseDashboardRouteState,
16
+ parseFiltersFromSearchParams,
9
17
  parseUnifiedDiff,
18
+ sparklinePath,
19
+ sparklinePoints,
10
20
  truncateText,
11
21
  } from '../../../packages/web-dashboard/src/lib/dashboard-utils.js';
22
+ import { shouldPollAnalytics } from '../../../packages/web-dashboard/src/lib/analytics-utils.js';
12
23
  import type {
13
24
  DashboardStatusPayload,
14
25
  FeatureSummary,
@@ -136,4 +147,125 @@ describe('dashboard utilities', () => {
136
147
  expect(formatElapsedTime('2026-03-04T22:31:00Z', now)).toBe('1h 30m');
137
148
  expect(truncateText('feature_abcdefghijklmnopqrstuvwxyz', 24)).toBe('feature_abcdefghijklm...');
138
149
  });
150
+
151
+ it('round-trips filters through URL search params', () => {
152
+ const params = new URLSearchParams();
153
+ const filters = {
154
+ ...createDefaultFilters(),
155
+ searchText: 'checkout',
156
+ phases: ['qa', 'ready_to_merge'] as FeatureSummary['phase'][],
157
+ activities: ['waiting_input'] as NonNullable<FeatureSummary['activity_state']>[],
158
+ gateFailuresOnly: true,
159
+ ciFailuresOnly: true,
160
+ quickFilter: 'ready_to_merge' as const,
161
+ };
162
+ applyFiltersToSearchParams(params, filters);
163
+
164
+ const parsed = parseFiltersFromSearchParams(params);
165
+ expect(parsed).toEqual(filters);
166
+ });
167
+
168
+ it('builds compact sparkline paths from histogram values', () => {
169
+ const path = sparklinePath([1, 3, 2, 4], 120, 30);
170
+ expect(path.startsWith('M')).toBe(true);
171
+ expect(path).toContain('L');
172
+ });
173
+
174
+ it('derives sparkline points for tooltip-capable rendering', () => {
175
+ const points = sparklinePoints([2, 4], 20, 10);
176
+ expect(points).toEqual([
177
+ { x: 0, y: 5, value: 2, index: 0 },
178
+ { x: 20, y: 0, value: 4, index: 1 },
179
+ ]);
180
+ });
181
+
182
+ it('only polls analytics when tab is visible', () => {
183
+ expect(shouldPollAnalytics(false)).toBe(true);
184
+ expect(shouldPollAnalytics(true)).toBe(false);
185
+ });
186
+
187
+ it('round-trips full dashboard route state through URL search params', () => {
188
+ const filters = {
189
+ ...createDefaultFilters(),
190
+ searchText: 'payments',
191
+ phases: ['qa'] as FeatureSummary['phase'][],
192
+ activities: ['active'] as NonNullable<FeatureSummary['activity_state']>[],
193
+ gateFailuresOnly: true,
194
+ ciFailuresOnly: false,
195
+ quickFilter: null,
196
+ };
197
+ const params = new URLSearchParams();
198
+ applyDashboardRouteState(params, {
199
+ project: 'alpha',
200
+ featureId: 'feature_checkout',
201
+ viewMode: 'list',
202
+ filters,
203
+ });
204
+
205
+ const parsed = parseDashboardRouteState(params);
206
+ expect(parsed).toEqual({
207
+ project: 'alpha',
208
+ featureId: 'feature_checkout',
209
+ viewMode: 'list',
210
+ filters,
211
+ });
212
+ });
213
+
214
+ it('clears route-state params when returning to default board view', () => {
215
+ const params = new URLSearchParams(
216
+ 'project=alpha&feature=feature_checkout&view=list&q=checkout&phase=qa',
217
+ );
218
+ applyDashboardRouteState(params, {
219
+ project: '',
220
+ featureId: null,
221
+ viewMode: 'board',
222
+ filters: createDefaultFilters(),
223
+ });
224
+ expect(params.toString()).toBe('');
225
+ });
226
+
227
+ it('builds dependency navigation hrefs with optional project context', () => {
228
+ expect(buildDashboardFeatureHref('feature_dep', '')).toBe('/?feature=feature_dep');
229
+ expect(buildDashboardFeatureHref('feature_dep', 'alpha')).toBe(
230
+ '/?project=alpha&feature=feature_dep',
231
+ );
232
+ });
233
+
234
+ it('builds focus-view hrefs with optional project context', () => {
235
+ expect(buildFeatureFocusHref('feature_dep', '')).toBe('/feature/feature_dep');
236
+ expect(buildFeatureFocusHref('feature_dep', 'alpha')).toBe(
237
+ '/feature/feature_dep?project=alpha',
238
+ );
239
+ });
240
+
241
+ it('shows quick-launch affordance only when policy and authorization allow it', () => {
242
+ expect(
243
+ isQuickLaunchAffordanceVisible({
244
+ available: true,
245
+ enabled: true,
246
+ authorized: true,
247
+ }),
248
+ ).toBe(true);
249
+ expect(
250
+ isQuickLaunchAffordanceVisible({
251
+ available: true,
252
+ enabled: false,
253
+ authorized: true,
254
+ }),
255
+ ).toBe(false);
256
+ });
257
+
258
+ it('computes deterministic keyboard focus transitions across board columns', () => {
259
+ const columns = [
260
+ { phase: 'planning' as const, featureIds: ['feature_a', 'feature_b'] },
261
+ { phase: 'building' as const, featureIds: [] },
262
+ { phase: 'qa' as const, featureIds: ['feature_c'] },
263
+ ];
264
+
265
+ expect(getNextFocusedFeatureId(columns, 'feature_a', 'ArrowDown')).toBe('feature_b');
266
+ expect(getNextFocusedFeatureId(columns, 'feature_b', 'ArrowDown')).toBe('feature_b');
267
+ expect(getNextFocusedFeatureId(columns, 'feature_b', 'ArrowRight')).toBe('feature_c');
268
+ expect(getNextFocusedFeatureId(columns, 'feature_c', 'ArrowLeft')).toBe('feature_a');
269
+ expect(getNextFocusedFeatureId(columns, null, 'ArrowRight')).toBe('feature_c');
270
+ });
139
271
  });
@@ -447,6 +447,102 @@ describe('MCP formalization', () => {
447
447
  });
448
448
  });
449
449
 
450
+ describe('replay timeline tool availability', () => {
451
+ it('GIVEN_tool_called_with_run_id_WHEN_replay_timeline_get_called_THEN_returns_invalid_argument', async () => {
452
+ const { tooling } = await boot();
453
+ await writeFeatureSpec(repoRoot, 'replay_timeline_feature');
454
+
455
+ const runId = 'run-replay-integration-001';
456
+ const orch = identity(runId, 'orchestrator', 'orch:replay', 'session-replay');
457
+
458
+ const init = await tooling.inProcessClient.call(
459
+ 'feature.init',
460
+ { feature_id: 'replay_timeline_feature', operation_id: 'op-replay-init-001' },
461
+ orch,
462
+ );
463
+ expect(init.ok).toBe(true);
464
+
465
+ const result = await tooling.inProcessClient.call(
466
+ 'replay.timeline_get',
467
+ { run_id: runId },
468
+ orch,
469
+ );
470
+
471
+ expect(result.ok).toBe(false);
472
+ expect((result as any).error.code).toBe('invalid_argument');
473
+ });
474
+
475
+ it('GIVEN_unknown_run_id_WHEN_replay_timeline_get_called_THEN_returns_invalid_argument', async () => {
476
+ const { tooling } = await boot();
477
+ const orch = identity('run-replay-int-002', 'orchestrator', 'orch:replay2', 'session-replay2');
478
+
479
+ const result = await tooling.inProcessClient.call(
480
+ 'replay.timeline_get',
481
+ { run_id: 'nonexistent-run-xyz-9999' },
482
+ orch,
483
+ );
484
+
485
+ expect(result.ok).toBe(false);
486
+ expect((result as any).error.code).toBe('invalid_argument');
487
+ });
488
+
489
+ it('GIVEN_multiple_tool_calls_WHEN_replay_timeline_get_with_from_sequence_THEN_returns_invalid_argument', async () => {
490
+ const { tooling } = await boot();
491
+ await writeFeatureSpec(repoRoot, 'replay_seq_feature');
492
+
493
+ const runId = 'run-replay-seq-003';
494
+ const orch = identity(runId, 'orchestrator', 'orch:seq', 'session-seq');
495
+
496
+ await tooling.inProcessClient.call(
497
+ 'feature.init',
498
+ { feature_id: 'replay_seq_feature', operation_id: 'op-seq-001' },
499
+ orch,
500
+ );
501
+ await tooling.inProcessClient.call(
502
+ 'feature.state_get',
503
+ { feature_id: 'replay_seq_feature' },
504
+ orch,
505
+ );
506
+
507
+ const filtered = await tooling.inProcessClient.call(
508
+ 'replay.timeline_get',
509
+ { run_id: runId, from_sequence: 1 },
510
+ orch,
511
+ );
512
+ expect(filtered.ok).toBe(false);
513
+ expect((filtered as any).error.code).toBe('invalid_argument');
514
+ });
515
+
516
+ it('GIVEN_tool_calls_across_features_WHEN_replay_timeline_get_with_feature_id_filter_THEN_returns_invalid_argument', async () => {
517
+ const { tooling } = await boot();
518
+ await writeFeatureSpec(repoRoot, 'replay_fa');
519
+ await writeFeatureSpec(repoRoot, 'replay_fb');
520
+
521
+ const runId = 'run-replay-feat-004';
522
+ const orch = identity(runId, 'orchestrator', 'orch:feat', 'session-feat');
523
+
524
+ await tooling.inProcessClient.call(
525
+ 'feature.init',
526
+ { feature_id: 'replay_fa', operation_id: 'op-fa-001' },
527
+ orch,
528
+ );
529
+ await tooling.inProcessClient.call(
530
+ 'feature.init',
531
+ { feature_id: 'replay_fb', operation_id: 'op-fb-001' },
532
+ orch,
533
+ );
534
+
535
+ const filtered = await tooling.inProcessClient.call(
536
+ 'replay.timeline_get',
537
+ { run_id: runId, feature_id: 'replay_fa' },
538
+ orch,
539
+ );
540
+
541
+ expect(filtered.ok).toBe(false);
542
+ expect((filtered as any).error.code).toBe('invalid_argument');
543
+ });
544
+ });
545
+
450
546
  describe('MCP utility functions', () => {
451
547
  it('GIVEN_no_featureId_WHEN_createOperationId_called_THEN_returns_toolname_and_uuid', () => {
452
548
  const id = createOperationId('feature.init');
@@ -94,6 +94,15 @@ function createRuntime() {
94
94
  return { runtime, loader, validator, authorizer, ledger, executor };
95
95
  }
96
96
 
97
+ function readLastToolLogEvent(): Record<string, unknown> {
98
+ const writeMock = vi.mocked(process.stderr.write);
99
+ const payload = writeMock.mock.calls.at(-1)?.[0];
100
+ if (payload == null) {
101
+ throw new Error('expected process.stderr.write to be called');
102
+ }
103
+ return JSON.parse(String(payload).trim()) as Record<string, unknown>;
104
+ }
105
+
97
106
  describe('ToolRuntime', () => {
98
107
  beforeEach(() => {
99
108
  vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
@@ -265,6 +274,65 @@ describe('ToolRuntime', () => {
265
274
  expect(ledger.recordOperation).toHaveBeenCalledTimes(1);
266
275
  });
267
276
 
277
+ it('GIVEN_readonly_tool_success_WHEN_calling_THEN_emits_success_log_payload', async () => {
278
+ const { runtime } = createRuntime();
279
+
280
+ await runtime.callTool(READ_TOOL.name, {}, claims());
281
+
282
+ const event = readLastToolLogEvent();
283
+ expect(event.tool_name).toBe(READ_TOOL.name);
284
+ expect(event.operation_id).toBeNull();
285
+ expect(event.result).toBe('ok');
286
+ expect(event.error_code).toBeNull();
287
+ });
288
+
289
+ it('GIVEN_mutating_tool_success_WHEN_calling_THEN_emits_log_with_operation_and_feature', async () => {
290
+ const { runtime } = createRuntime();
291
+
292
+ await runtime.callTool(
293
+ MUTATING_TOOL.name,
294
+ { feature_id: 'feature_a', operation_id: 'op-timeline-001' },
295
+ claims(),
296
+ );
297
+
298
+ const event = readLastToolLogEvent();
299
+ expect(event.tool_name).toBe(MUTATING_TOOL.name);
300
+ expect(event.operation_id).toBe('op-timeline-001');
301
+ expect(event.feature_id).toBe('feature_a');
302
+ expect(event.result).toBe('ok');
303
+ });
304
+
305
+ it('GIVEN_tool_error_WHEN_calling_THEN_emits_error_log_with_error_code', async () => {
306
+ const { runtime } = createRuntime();
307
+
308
+ await runtime.callTool('missing.tool', {}, claims());
309
+
310
+ const event = readLastToolLogEvent();
311
+ expect(event.tool_name).toBe('missing.tool');
312
+ expect(event.result).toBe('error');
313
+ expect(event.error_code).toBe(ERROR_CODES.INVALID_ARGUMENT);
314
+ });
315
+
316
+ it('GIVEN_mutating_replay_WHEN_calling_THEN_emits_success_log_for_replayed_response', async () => {
317
+ const { runtime, ledger } = createRuntime();
318
+ ledger.resolveOperation.mockResolvedValue({
319
+ status: 'replay',
320
+ response: ok({ cached: true }),
321
+ });
322
+
323
+ const response = await runtime.callTool(
324
+ MUTATING_TOOL.name,
325
+ { feature_id: 'feature_a', operation_id: 'op-replay-002' },
326
+ claims(),
327
+ );
328
+
329
+ expect(response).toEqual(ok({ cached: true }));
330
+ const event = readLastToolLogEvent();
331
+ expect(event.tool_name).toBe(MUTATING_TOOL.name);
332
+ expect(event.operation_id).toBe('op-replay-002');
333
+ expect(event.result).toBe('ok');
334
+ });
335
+
268
336
  it('GIVEN_retry_with_same_operation_id_after_mutating_failure_WHEN_calling_again_THEN_replays_without_reexecution', async () => {
269
337
  const { runtime, ledger, executor } = createRuntime();
270
338
  const recorded = new Map<string, { requestHash: string; response: ReturnType<typeof fail> }>();
@@ -12,6 +12,7 @@ supervisor:
12
12
  dashboard:
13
13
  enabled: true
14
14
  port: 3000
15
+ quick_launch: false
15
16
  merge_policy:
16
17
  require_user_approval: true
17
18
  notifications:
@@ -25,6 +25,36 @@ export interface ActivityMonitorServiceDependencies {
25
25
  };
26
26
  detectorName?: string;
27
27
  }
28
+ /**
29
+ * Monitors feature activity and detects stuck agents.
30
+ *
31
+ * ## Responsibilities
32
+ * - Track last activity timestamp per feature
33
+ * - Detect idle/stuck agents based on threshold
34
+ * - Notify when agents are stuck
35
+ * - Persist activity state to feature metadata
36
+ *
37
+ * ## Dependencies
38
+ * - {@link SupervisorToolCaller} - for tool invocation
39
+ * - {@link NotifierService} - for stuck agent notifications
40
+ * - Operation ledger - for activity tracking
41
+ *
42
+ * ## Key Methods
43
+ * - `getActivityState()` - get current activity snapshot
44
+ * - `checkAndNotifyStuck()` - check if stuck and notify
45
+ *
46
+ * ## Error Conditions
47
+ * - Activity persistence failures are logged but don't block
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * const monitor = new ActivityMonitorService({ toolCaller, notifier });
52
+ * const state = await monitor.getActivityState('my_feature');
53
+ * if (state.state === 'idle') {
54
+ * await monitor.checkAndNotifyStuck('my_feature');
55
+ * }
56
+ * ```
57
+ */
28
58
  export declare class ActivityMonitorService {
29
59
  private readonly toolCaller;
30
60
  private readonly operationLedger;
@@ -37,7 +67,19 @@ export declare class ActivityMonitorService {
37
67
  private resolveLastEvent;
38
68
  private deriveState;
39
69
  private persistSnapshot;
70
+ /**
71
+ * Gets current activity snapshot for a feature.
72
+ *
73
+ * @param featureId - feature identifier
74
+ * @returns Activity snapshot with state and last event timestamp
75
+ */
40
76
  getActivityState(featureId: string): Promise<ActivitySnapshot>;
77
+ /**
78
+ * Checks if agent is stuck and sends notification.
79
+ *
80
+ * @param featureId - feature identifier
81
+ * @returns True if stuck notification was sent
82
+ */
41
83
  checkAndNotifyStuck(featureId: string): Promise<boolean>;
42
84
  formatForStatus(snapshot: ActivitySnapshot): string;
43
85
  }
@@ -1,5 +1,35 @@
1
1
  import { TOOLS } from '../../core/constants.js';
2
2
  const DEFAULT_IDLE_THRESHOLD_MS = 300_000;
3
+ /**
4
+ * Monitors feature activity and detects stuck agents.
5
+ *
6
+ * ## Responsibilities
7
+ * - Track last activity timestamp per feature
8
+ * - Detect idle/stuck agents based on threshold
9
+ * - Notify when agents are stuck
10
+ * - Persist activity state to feature metadata
11
+ *
12
+ * ## Dependencies
13
+ * - {@link SupervisorToolCaller} - for tool invocation
14
+ * - {@link NotifierService} - for stuck agent notifications
15
+ * - Operation ledger - for activity tracking
16
+ *
17
+ * ## Key Methods
18
+ * - `getActivityState()` - get current activity snapshot
19
+ * - `checkAndNotifyStuck()` - check if stuck and notify
20
+ *
21
+ * ## Error Conditions
22
+ * - Activity persistence failures are logged but don't block
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const monitor = new ActivityMonitorService({ toolCaller, notifier });
27
+ * const state = await monitor.getActivityState('my_feature');
28
+ * if (state.state === 'idle') {
29
+ * await monitor.checkAndNotifyStuck('my_feature');
30
+ * }
31
+ * ```
32
+ */
3
33
  export class ActivityMonitorService {
4
34
  toolCaller;
5
35
  operationLedger;
@@ -85,6 +115,12 @@ export class ActivityMonitorService {
85
115
  // Activity persistence is best-effort and should not block orchestration.
86
116
  }
87
117
  }
118
+ /**
119
+ * Gets current activity snapshot for a feature.
120
+ *
121
+ * @param featureId - feature identifier
122
+ * @returns Activity snapshot with state and last event timestamp
123
+ */
88
124
  async getActivityState(featureId) {
89
125
  const response = await this.toolCaller.callTool('orchestrator', TOOLS.FEATURE_STATE_GET, { feature_id: featureId });
90
126
  const frontMatter = response.data.front_matter;
@@ -96,6 +132,12 @@ export class ActivityMonitorService {
96
132
  detectedVia: this.detectedVia(featureId),
97
133
  };
98
134
  }
135
+ /**
136
+ * Checks if agent is stuck and sends notification.
137
+ *
138
+ * @param featureId - feature identifier
139
+ * @returns True if stuck notification was sent
140
+ */
99
141
  async checkAndNotifyStuck(featureId) {
100
142
  const snapshot = await this.getActivityState(featureId);
101
143
  await this.persistSnapshot(featureId, snapshot);
@@ -1 +1 @@
1
- {"version":3,"file":"activity-monitor-service.js","sourceRoot":"","sources":["../../../../../apps/control-plane/src/application/services/activity-monitor-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"activity-monitor-service.js","sourceRoot":"","sources":["../../../../../apps/control-plane/src/application/services/activity-monitor-service.ts"],"names":[],"mappings":"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"}
@@ -39,6 +39,37 @@ export interface CollisionQueueServicePort {
39
39
  };
40
40
  }>;
41
41
  }
42
+ /**
43
+ * Manages blocked feature queue and collision re-drive.
44
+ *
45
+ * ## Responsibilities
46
+ * - Add features to blocked queue when collisions detected
47
+ * - Re-drive queue when locks released or plans updated
48
+ * - Retry plan submission for unblocked features
49
+ * - Remove resolved entries from queue
50
+ *
51
+ * ## Dependencies
52
+ * Depends on {@link CollisionQueueServicePort} for:
53
+ * - Index and state operations
54
+ * - Plan submission
55
+ * - Lock primitives
56
+ *
57
+ * ## Key Methods
58
+ * - `reDriveBlockedQueue()` - retry blocked features
59
+ * - `processSingleQueueEntry()` - process one queue entry
60
+ * - `clearQueueEntry()` - remove entry from queue
61
+ *
62
+ * ## Error Conditions
63
+ * - PLAN_COLLISION - collision still exists
64
+ * - LOCK_NOT_HELD - required locks not available
65
+ *
66
+ * @example
67
+ * ```typescript
68
+ * const queueService = new CollisionQueueService(port);
69
+ * const result = await queueService.reDriveBlockedQueue();
70
+ * console.log(`Retried: ${result.data.retried}, Still blocked: ${result.data.still_blocked}`);
71
+ * ```
72
+ */
42
73
  export declare class CollisionQueueService {
43
74
  private readonly port;
44
75
  constructor(port: CollisionQueueServicePort);
@@ -53,6 +84,17 @@ export declare class CollisionQueueService {
53
84
  retried: boolean;
54
85
  reason?: string;
55
86
  }>;
87
+ /**
88
+ * Re-drives blocked queue to retry unblocked features.
89
+ *
90
+ * @returns Result with processed/retried/still_blocked counts
91
+ *
92
+ * @example
93
+ * ```typescript
94
+ * const result = await queueService.reDriveBlockedQueue();
95
+ * console.log(`Retried: ${result.data.retried}`);
96
+ * ```
97
+ */
56
98
  reDriveBlockedQueue(): Promise<{
57
99
  data: {
58
100
  processed: number;
@@ -60,6 +102,12 @@ export declare class CollisionQueueService {
60
102
  still_blocked: number;
61
103
  };
62
104
  }>;
105
+ /**
106
+ * Removes entry from blocked queue.
107
+ *
108
+ * @param featureId - feature identifier
109
+ * @returns Success response
110
+ */
63
111
  clearQueueEntry(featureId: string): Promise<{
64
112
  data: {
65
113
  removed: boolean;
@@ -12,6 +12,37 @@ function readHeldLocks(frontMatter) {
12
12
  const locks = readObjectField(frontMatter, 'locks');
13
13
  return asArray(locks.held).filter((item) => typeof item === 'string');
14
14
  }
15
+ /**
16
+ * Manages blocked feature queue and collision re-drive.
17
+ *
18
+ * ## Responsibilities
19
+ * - Add features to blocked queue when collisions detected
20
+ * - Re-drive queue when locks released or plans updated
21
+ * - Retry plan submission for unblocked features
22
+ * - Remove resolved entries from queue
23
+ *
24
+ * ## Dependencies
25
+ * Depends on {@link CollisionQueueServicePort} for:
26
+ * - Index and state operations
27
+ * - Plan submission
28
+ * - Lock primitives
29
+ *
30
+ * ## Key Methods
31
+ * - `reDriveBlockedQueue()` - retry blocked features
32
+ * - `processSingleQueueEntry()` - process one queue entry
33
+ * - `clearQueueEntry()` - remove entry from queue
34
+ *
35
+ * ## Error Conditions
36
+ * - PLAN_COLLISION - collision still exists
37
+ * - LOCK_NOT_HELD - required locks not available
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * const queueService = new CollisionQueueService(port);
42
+ * const result = await queueService.reDriveBlockedQueue();
43
+ * console.log(`Retried: ${result.data.retried}, Still blocked: ${result.data.still_blocked}`);
44
+ * ```
45
+ */
15
46
  export class CollisionQueueService {
16
47
  port;
17
48
  constructor(port) {
@@ -89,6 +120,17 @@ export class CollisionQueueService {
89
120
  return { retried: false, reason: 'plan_submit_failed' };
90
121
  }
91
122
  }
123
+ /**
124
+ * Re-drives blocked queue to retry unblocked features.
125
+ *
126
+ * @returns Result with processed/retried/still_blocked counts
127
+ *
128
+ * @example
129
+ * ```typescript
130
+ * const result = await queueService.reDriveBlockedQueue();
131
+ * console.log(`Retried: ${result.data.retried}`);
132
+ * ```
133
+ */
92
134
  async reDriveBlockedQueue() {
93
135
  const policy = this.port.getPolicySnapshot();
94
136
  if (policy.collision_policy !== 'block') {
@@ -138,6 +180,12 @@ export class CollisionQueueService {
138
180
  };
139
181
  });
140
182
  }
183
+ /**
184
+ * Removes entry from blocked queue.
185
+ *
186
+ * @param featureId - feature identifier
187
+ * @returns Success response
188
+ */
141
189
  async clearQueueEntry(featureId) {
142
190
  return await this.port.withIndexLock(async () => {
143
191
  const index = await this.port.readIndex();
@@ -1 +1 @@
1
- {"version":3,"file":"collision-queue-service.js","sourceRoot":"","sources":["../../../../../apps/control-plane/src/application/services/collision-queue-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collision-queue-service.js","sourceRoot":"","sources":["../../../../../apps/control-plane/src/application/services/collision-queue-service.ts"],"names":[],"mappings":"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"}