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.
- package/agentic/orchestrator/defaults/policy.defaults.yaml +1 -0
- package/agentic/orchestrator/policy.yaml +1 -0
- package/agentic/orchestrator/schemas/policy.schema.json +4 -0
- package/agentic/orchestrator/schemas/policy.user.schema.json +4 -0
- package/apps/control-plane/src/application/services/activity-monitor-service.ts +42 -0
- package/apps/control-plane/src/application/services/collision-queue-service.ts +48 -0
- package/apps/control-plane/src/application/services/cost-tracking-service.ts +80 -0
- package/apps/control-plane/src/application/services/feature-deletion-service.ts +57 -0
- package/apps/control-plane/src/application/services/feature-lifecycle-service.ts +65 -0
- package/apps/control-plane/src/application/services/feature-state-service.ts +87 -0
- package/apps/control-plane/src/application/services/gate-selection-service.ts +28 -0
- package/apps/control-plane/src/application/services/gate-service.ts +148 -0
- package/apps/control-plane/src/application/services/issue-tracker-service.ts +28 -0
- package/apps/control-plane/src/application/services/lock-service.ts +88 -0
- package/apps/control-plane/src/application/services/merge-service.ts +63 -0
- package/apps/control-plane/src/application/services/notifier-service.ts +70 -0
- package/apps/control-plane/src/application/services/patch-service.ts +95 -0
- package/apps/control-plane/src/application/services/performance-analytics-service.ts +90 -0
- package/apps/control-plane/src/application/services/plan-service.ts +184 -0
- package/apps/control-plane/src/application/services/pr-monitor-service.ts +58 -0
- package/apps/control-plane/src/application/services/qa-index-service.ts +68 -0
- package/apps/control-plane/src/application/services/reactions-service.ts +77 -0
- package/apps/control-plane/src/application/services/reporting-service.ts +79 -0
- package/apps/control-plane/src/application/services/run-lease-service.ts +79 -0
- package/apps/control-plane/src/application/tools/tool-router.ts +76 -0
- package/apps/control-plane/src/mcp/tool-runtime.ts +4 -0
- package/apps/control-plane/src/providers/providers.ts +96 -0
- package/apps/control-plane/src/providers/worker-provider-factory.ts +4 -0
- package/apps/control-plane/src/supervisor/build-wave-executor.ts +4 -0
- package/apps/control-plane/src/supervisor/planning-wave-executor.ts +4 -0
- package/apps/control-plane/src/supervisor/qa-wave-executor.ts +4 -0
- package/apps/control-plane/src/supervisor/run-coordinator.ts +4 -0
- package/apps/control-plane/src/supervisor/runtime.ts +4 -0
- package/apps/control-plane/src/supervisor/session-orchestrator.ts +4 -0
- package/apps/control-plane/test/dashboard-api.integration.spec.ts +310 -1
- package/apps/control-plane/test/dashboard-client.spec.ts +136 -1
- package/apps/control-plane/test/dashboard-live-feed.spec.ts +153 -0
- package/apps/control-plane/test/dashboard-ui-utils.spec.ts +132 -0
- package/apps/control-plane/test/mcp.spec.ts +96 -0
- package/apps/control-plane/test/tool-runtime.spec.ts +68 -0
- package/config/agentic/orchestrator/policy.yaml +1 -0
- package/dist/apps/control-plane/application/services/activity-monitor-service.d.ts +42 -0
- package/dist/apps/control-plane/application/services/activity-monitor-service.js +42 -0
- package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/collision-queue-service.d.ts +48 -0
- package/dist/apps/control-plane/application/services/collision-queue-service.js +48 -0
- package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/cost-tracking-service.d.ts +79 -0
- package/dist/apps/control-plane/application/services/cost-tracking-service.js +76 -0
- package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-deletion-service.d.ts +57 -0
- package/dist/apps/control-plane/application/services/feature-deletion-service.js +57 -0
- package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-lifecycle-service.d.ts +64 -0
- package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +61 -0
- package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/feature-state-service.d.ts +86 -0
- package/dist/apps/control-plane/application/services/feature-state-service.js +83 -0
- package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/gate-selection-service.d.ts +28 -0
- package/dist/apps/control-plane/application/services/gate-selection-service.js +28 -0
- package/dist/apps/control-plane/application/services/gate-selection-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/gate-service.d.ts +148 -0
- package/dist/apps/control-plane/application/services/gate-service.js +120 -0
- package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/issue-tracker-service.d.ts +28 -0
- package/dist/apps/control-plane/application/services/issue-tracker-service.js +28 -0
- package/dist/apps/control-plane/application/services/issue-tracker-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/lock-service.d.ts +88 -0
- package/dist/apps/control-plane/application/services/lock-service.js +64 -0
- package/dist/apps/control-plane/application/services/lock-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/merge-service.d.ts +62 -0
- package/dist/apps/control-plane/application/services/merge-service.js +59 -0
- package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/notifier-service.d.ts +70 -0
- package/dist/apps/control-plane/application/services/notifier-service.js +70 -0
- package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/patch-service.d.ts +94 -0
- package/dist/apps/control-plane/application/services/patch-service.js +91 -0
- package/dist/apps/control-plane/application/services/patch-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/performance-analytics-service.d.ts +89 -0
- package/dist/apps/control-plane/application/services/performance-analytics-service.js +86 -0
- package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/plan-service.d.ts +287 -0
- package/dist/apps/control-plane/application/services/plan-service.js +207 -0
- package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/pr-monitor-service.d.ts +58 -0
- package/dist/apps/control-plane/application/services/pr-monitor-service.js +58 -0
- package/dist/apps/control-plane/application/services/pr-monitor-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/qa-index-service.d.ts +67 -0
- package/dist/apps/control-plane/application/services/qa-index-service.js +64 -0
- package/dist/apps/control-plane/application/services/qa-index-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/reactions-service.d.ts +76 -0
- package/dist/apps/control-plane/application/services/reactions-service.js +73 -0
- package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/reporting-service.d.ts +78 -0
- package/dist/apps/control-plane/application/services/reporting-service.js +75 -0
- package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
- package/dist/apps/control-plane/application/services/run-lease-service.d.ts +79 -0
- package/dist/apps/control-plane/application/services/run-lease-service.js +79 -0
- package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
- package/dist/apps/control-plane/application/tools/tool-router.d.ts +76 -0
- package/dist/apps/control-plane/application/tools/tool-router.js +62 -0
- package/dist/apps/control-plane/application/tools/tool-router.js.map +1 -1
- package/dist/apps/control-plane/mcp/tool-runtime.d.ts +3 -0
- package/dist/apps/control-plane/mcp/tool-runtime.js +3 -0
- package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
- package/dist/apps/control-plane/providers/providers.d.ts +88 -0
- package/dist/apps/control-plane/providers/providers.js.map +1 -1
- package/dist/apps/control-plane/providers/worker-provider-factory.d.ts +3 -0
- package/dist/apps/control-plane/providers/worker-provider-factory.js.map +1 -1
- package/dist/apps/control-plane/supervisor/build-wave-executor.d.ts +3 -0
- package/dist/apps/control-plane/supervisor/build-wave-executor.js +3 -0
- package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/planning-wave-executor.d.ts +3 -0
- package/dist/apps/control-plane/supervisor/planning-wave-executor.js +3 -0
- package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/qa-wave-executor.d.ts +3 -0
- package/dist/apps/control-plane/supervisor/qa-wave-executor.js +3 -0
- package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
- package/dist/apps/control-plane/supervisor/run-coordinator.d.ts +3 -0
- package/dist/apps/control-plane/supervisor/run-coordinator.js +3 -0
- package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
- package/dist/apps/control-plane/supervisor/runtime.d.ts +3 -0
- package/dist/apps/control-plane/supervisor/runtime.js +3 -0
- package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
- package/dist/apps/control-plane/supervisor/session-orchestrator.d.ts +3 -0
- package/dist/apps/control-plane/supervisor/session-orchestrator.js +3 -0
- package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
- package/package.json +1 -1
- package/packages/web-dashboard/src/app/analytics/page.tsx +451 -0
- package/packages/web-dashboard/src/app/api/analytics/route.ts +62 -0
- package/packages/web-dashboard/src/app/api/collisions/route.ts +63 -0
- package/packages/web-dashboard/src/app/api/features/[id]/cost/route.ts +29 -0
- package/packages/web-dashboard/src/app/api/features/[id]/review-brief/route.ts +31 -0
- package/packages/web-dashboard/src/app/api/features/[id]/route.ts +5 -8
- package/packages/web-dashboard/src/app/api/features/[id]/test-index/route.ts +31 -0
- package/packages/web-dashboard/src/app/api/flaky/route.ts +20 -0
- package/packages/web-dashboard/src/app/api/policy/budget/route.ts +31 -0
- package/packages/web-dashboard/src/app/api/run/route.ts +162 -0
- package/packages/web-dashboard/src/app/api/status/route.ts +2 -5
- package/packages/web-dashboard/src/app/feature/[id]/page.tsx +112 -0
- package/packages/web-dashboard/src/app/page.tsx +379 -77
- package/packages/web-dashboard/src/components/agent-pipeline-stepper.tsx +100 -0
- package/packages/web-dashboard/src/components/dependency-chains.tsx +58 -0
- package/packages/web-dashboard/src/components/detail-panel.tsx +215 -5
- package/packages/web-dashboard/src/components/feature-card.tsx +5 -0
- package/packages/web-dashboard/src/components/feature-cost-panel.tsx +66 -0
- package/packages/web-dashboard/src/components/feature-list-view.tsx +336 -0
- package/packages/web-dashboard/src/components/gate-step-drilldown.tsx +92 -0
- package/packages/web-dashboard/src/components/kanban-board.tsx +3 -0
- package/packages/web-dashboard/src/components/live-event-feed.tsx +60 -0
- package/packages/web-dashboard/src/components/lock-resource-map.tsx +73 -0
- package/packages/web-dashboard/src/components/plan-revision-timeline.tsx +55 -0
- package/packages/web-dashboard/src/components/plan-risk-annotations.tsx +63 -0
- package/packages/web-dashboard/src/components/plan-scope-tree.tsx +285 -0
- package/packages/web-dashboard/src/components/qa-coverage-map.tsx +174 -0
- package/packages/web-dashboard/src/components/quick-launch-panel.tsx +70 -0
- package/packages/web-dashboard/src/components/review-brief-panel.tsx +75 -0
- package/packages/web-dashboard/src/components/run-health-panel.tsx +85 -0
- package/packages/web-dashboard/src/components/summary-bar.tsx +59 -2
- package/packages/web-dashboard/src/components/verification-signals.tsx +167 -0
- package/packages/web-dashboard/src/lib/analytics-utils.ts +3 -0
- package/packages/web-dashboard/src/lib/aop-client.ts +510 -11
- package/packages/web-dashboard/src/lib/api-envelope.ts +48 -0
- package/packages/web-dashboard/src/lib/authz-adapter.ts +33 -0
- package/packages/web-dashboard/src/lib/dashboard-utils.ts +304 -0
- package/packages/web-dashboard/src/lib/live-feed.ts +218 -0
- package/packages/web-dashboard/src/lib/policy-reader.ts +22 -0
- package/packages/web-dashboard/src/lib/types.ts +114 -0
- package/packages/web-dashboard/src/styles/dashboard.module.css +341 -1
- package/spec-files/{outstanding → completed}/agentic_orchestrator_dashboard_advanced_ux_spec.md +1 -1
- package/spec-files/outstanding/agentic_orchestrator_evidence_integrity_doctor_spec.md +561 -0
- package/spec-files/outstanding/agentic_orchestrator_kernel_simplification_spec.md +834 -0
- package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +12 -5
- package/spec-files/outstanding/agentic_orchestrator_observability_replay_spec.md +442 -0
- 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> }>();
|
|
@@ -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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"}
|