agentic-orchestrator 0.1.26 → 0.1.28

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 (172) hide show
  1. package/AGENTS.md +2 -2
  2. package/CLAUDE.md +2 -2
  3. package/README.md +47 -14
  4. package/agentic/orchestrator/agents.yaml +13 -0
  5. package/agentic/orchestrator/policy.yaml +3 -0
  6. package/agentic/orchestrator/schemas/agents.schema.json +76 -0
  7. package/agentic/orchestrator/schemas/policy.schema.json +16 -0
  8. package/agentic/orchestrator/schemas/policy.user.schema.json +16 -0
  9. package/agentic/orchestrator/schemas/state.schema.json +53 -0
  10. package/apps/control-plane/src/application/configuration-service.ts +181 -0
  11. package/apps/control-plane/src/application/kernel-tool-wiring.ts +292 -0
  12. package/apps/control-plane/src/application/services/checkpoint-service.ts +523 -0
  13. package/apps/control-plane/src/application/services/feature-send-message-service.ts +132 -0
  14. package/apps/control-plane/src/application/services/patch-service.ts +29 -5
  15. package/apps/control-plane/src/application/services/repo-operations-service.ts +276 -0
  16. package/apps/control-plane/src/application/services/worktree-watchdog-service.ts +156 -0
  17. package/apps/control-plane/src/cli/cli-argument-parser.ts +12 -0
  18. package/apps/control-plane/src/cli/help-command-handler.ts +17 -0
  19. package/apps/control-plane/src/cli/init-command-handler.ts +31 -0
  20. package/apps/control-plane/src/cli/resume-command-handler.ts +31 -4
  21. package/apps/control-plane/src/cli/rollback-command-handler.ts +217 -0
  22. package/apps/control-plane/src/cli/run-command-handler.ts +8 -0
  23. package/apps/control-plane/src/cli/types.ts +3 -0
  24. package/apps/control-plane/src/core/kernel-types.ts +55 -0
  25. package/apps/control-plane/src/core/kernel.ts +61 -878
  26. package/apps/control-plane/src/core/tool-caller.ts +10 -0
  27. package/apps/control-plane/src/core/utils/field-readers.ts +38 -0
  28. package/apps/control-plane/src/core/utils/index-normalizer.ts +119 -0
  29. package/apps/control-plane/src/core/utils/path-normalizers.ts +22 -0
  30. package/apps/control-plane/src/interfaces/cli/bootstrap.ts +15 -0
  31. package/apps/control-plane/src/providers/api-worker-provider.ts +14 -12
  32. package/apps/control-plane/src/providers/cli-worker-provider.ts +82 -12
  33. package/apps/control-plane/src/providers/providers.ts +45 -24
  34. package/apps/control-plane/src/providers/worker-provider-factory.ts +36 -1
  35. package/apps/control-plane/src/supervisor/run-coordinator.ts +91 -36
  36. package/apps/control-plane/src/supervisor/runtime.ts +107 -1
  37. package/apps/control-plane/src/supervisor/types.ts +9 -0
  38. package/apps/control-plane/src/supervisor/worker-decision-loop.ts +253 -14
  39. package/apps/control-plane/test/checkpoint-service.spec.ts +537 -0
  40. package/apps/control-plane/test/cli-helpers.spec.ts +28 -0
  41. package/apps/control-plane/test/cli.unit.spec.ts +52 -0
  42. package/apps/control-plane/test/configuration-service.spec.ts +466 -0
  43. package/apps/control-plane/test/dashboard-api.integration.spec.ts +537 -0
  44. package/apps/control-plane/test/dashboard-client.spec.ts +233 -0
  45. package/apps/control-plane/test/feature-send-message-service.spec.ts +314 -0
  46. package/apps/control-plane/test/init-wizard.spec.ts +35 -0
  47. package/apps/control-plane/test/path-normalizers.spec.ts +41 -0
  48. package/apps/control-plane/test/repo-operations-service.spec.ts +339 -0
  49. package/apps/control-plane/test/resume-command.spec.ts +33 -0
  50. package/apps/control-plane/test/review-workspace-logic.spec.ts +130 -0
  51. package/apps/control-plane/test/rollback-command.spec.ts +208 -0
  52. package/apps/control-plane/test/run-coordinator.spec.ts +119 -0
  53. package/apps/control-plane/test/worker-decision-loop.spec.ts +209 -0
  54. package/apps/control-plane/test/worker-provider-adapters.spec.ts +102 -0
  55. package/apps/control-plane/test/worker-provider-factory.spec.ts +14 -0
  56. package/apps/control-plane/test/worktree-watchdog-service.spec.ts +147 -0
  57. package/config/agentic/orchestrator/agents.yaml +13 -0
  58. package/dist/apps/control-plane/application/configuration-service.d.ts +19 -0
  59. package/dist/apps/control-plane/application/configuration-service.js +123 -0
  60. package/dist/apps/control-plane/application/configuration-service.js.map +1 -0
  61. package/dist/apps/control-plane/application/kernel-tool-wiring.d.ts +39 -0
  62. package/dist/apps/control-plane/application/kernel-tool-wiring.js +38 -0
  63. package/dist/apps/control-plane/application/kernel-tool-wiring.js.map +1 -0
  64. package/dist/apps/control-plane/application/services/checkpoint-service.d.ts +84 -0
  65. package/dist/apps/control-plane/application/services/checkpoint-service.js +367 -0
  66. package/dist/apps/control-plane/application/services/checkpoint-service.js.map +1 -0
  67. package/dist/apps/control-plane/application/services/feature-send-message-service.d.ts +25 -0
  68. package/dist/apps/control-plane/application/services/feature-send-message-service.js +105 -0
  69. package/dist/apps/control-plane/application/services/feature-send-message-service.js.map +1 -0
  70. package/dist/apps/control-plane/application/services/patch-service.d.ts +6 -0
  71. package/dist/apps/control-plane/application/services/patch-service.js +11 -2
  72. package/dist/apps/control-plane/application/services/patch-service.js.map +1 -1
  73. package/dist/apps/control-plane/application/services/repo-operations-service.d.ts +70 -0
  74. package/dist/apps/control-plane/application/services/repo-operations-service.js +213 -0
  75. package/dist/apps/control-plane/application/services/repo-operations-service.js.map +1 -0
  76. package/dist/apps/control-plane/application/services/worktree-watchdog-service.d.ts +23 -0
  77. package/dist/apps/control-plane/application/services/worktree-watchdog-service.js +119 -0
  78. package/dist/apps/control-plane/application/services/worktree-watchdog-service.js.map +1 -0
  79. package/dist/apps/control-plane/cli/cli-argument-parser.js +12 -0
  80. package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
  81. package/dist/apps/control-plane/cli/help-command-handler.js +17 -0
  82. package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
  83. package/dist/apps/control-plane/cli/init-command-handler.js +23 -0
  84. package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
  85. package/dist/apps/control-plane/cli/resume-command-handler.js +25 -5
  86. package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
  87. package/dist/apps/control-plane/cli/rollback-command-handler.d.ts +6 -0
  88. package/dist/apps/control-plane/cli/rollback-command-handler.js +177 -0
  89. package/dist/apps/control-plane/cli/rollback-command-handler.js.map +1 -0
  90. package/dist/apps/control-plane/cli/run-command-handler.js +7 -1
  91. package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
  92. package/dist/apps/control-plane/cli/types.d.ts +3 -0
  93. package/dist/apps/control-plane/cli/types.js +1 -0
  94. package/dist/apps/control-plane/cli/types.js.map +1 -1
  95. package/dist/apps/control-plane/core/configuration-service.d.ts +25 -0
  96. package/dist/apps/control-plane/core/configuration-service.js +130 -0
  97. package/dist/apps/control-plane/core/configuration-service.js.map +1 -0
  98. package/dist/apps/control-plane/core/kernel-tool-wiring.d.ts +50 -0
  99. package/dist/apps/control-plane/core/kernel-tool-wiring.js +44 -0
  100. package/dist/apps/control-plane/core/kernel-tool-wiring.js.map +1 -0
  101. package/dist/apps/control-plane/core/kernel-types.d.ts +48 -0
  102. package/dist/apps/control-plane/core/kernel-types.js +2 -0
  103. package/dist/apps/control-plane/core/kernel-types.js.map +1 -0
  104. package/dist/apps/control-plane/core/kernel.d.ts +17 -48
  105. package/dist/apps/control-plane/core/kernel.js +44 -539
  106. package/dist/apps/control-plane/core/kernel.js.map +1 -1
  107. package/dist/apps/control-plane/core/tool-caller.d.ts +10 -0
  108. package/dist/apps/control-plane/core/utils/error-normalizer.d.ts +2 -0
  109. package/dist/apps/control-plane/core/utils/error-normalizer.js +51 -0
  110. package/dist/apps/control-plane/core/utils/error-normalizer.js.map +1 -0
  111. package/dist/apps/control-plane/core/utils/field-readers.d.ts +9 -0
  112. package/dist/apps/control-plane/core/utils/field-readers.js +30 -0
  113. package/dist/apps/control-plane/core/utils/field-readers.js.map +1 -0
  114. package/dist/apps/control-plane/core/utils/index-normalizer.d.ts +7 -0
  115. package/dist/apps/control-plane/core/utils/index-normalizer.js +92 -0
  116. package/dist/apps/control-plane/core/utils/index-normalizer.js.map +1 -0
  117. package/dist/apps/control-plane/core/utils/path-normalizers.d.ts +2 -0
  118. package/dist/apps/control-plane/core/utils/path-normalizers.js +17 -0
  119. package/dist/apps/control-plane/core/utils/path-normalizers.js.map +1 -0
  120. package/dist/apps/control-plane/interfaces/cli/bootstrap.js +13 -1
  121. package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
  122. package/dist/apps/control-plane/providers/api-worker-provider.d.ts +4 -13
  123. package/dist/apps/control-plane/providers/api-worker-provider.js +10 -0
  124. package/dist/apps/control-plane/providers/api-worker-provider.js.map +1 -1
  125. package/dist/apps/control-plane/providers/cli-worker-provider.d.ts +11 -13
  126. package/dist/apps/control-plane/providers/cli-worker-provider.js +64 -0
  127. package/dist/apps/control-plane/providers/cli-worker-provider.js.map +1 -1
  128. package/dist/apps/control-plane/providers/providers.d.ts +31 -24
  129. package/dist/apps/control-plane/providers/providers.js +10 -0
  130. package/dist/apps/control-plane/providers/providers.js.map +1 -1
  131. package/dist/apps/control-plane/providers/worker-provider-factory.d.ts +11 -0
  132. package/dist/apps/control-plane/providers/worker-provider-factory.js +20 -1
  133. package/dist/apps/control-plane/providers/worker-provider-factory.js.map +1 -1
  134. package/dist/apps/control-plane/supervisor/run-coordinator.d.ts +3 -0
  135. package/dist/apps/control-plane/supervisor/run-coordinator.js +81 -33
  136. package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
  137. package/dist/apps/control-plane/supervisor/runtime.d.ts +8 -1
  138. package/dist/apps/control-plane/supervisor/runtime.js +90 -0
  139. package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
  140. package/dist/apps/control-plane/supervisor/types.d.ts +11 -0
  141. package/dist/apps/control-plane/supervisor/types.js.map +1 -1
  142. package/dist/apps/control-plane/supervisor/worker-decision-loop.d.ts +21 -1
  143. package/dist/apps/control-plane/supervisor/worker-decision-loop.js +207 -13
  144. package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
  145. package/package.json +1 -1
  146. package/packages/web-dashboard/package.json +2 -0
  147. package/packages/web-dashboard/src/app/analytics/page.tsx +83 -2
  148. package/packages/web-dashboard/src/app/api/actions/route.ts +92 -1
  149. package/packages/web-dashboard/src/app/api/analytics/route.ts +5 -2
  150. package/packages/web-dashboard/src/app/api/features/[id]/checkpoints/[checkpointId]/diff/route.ts +43 -0
  151. package/packages/web-dashboard/src/app/api/features/[id]/checkpoints/compare/route.ts +45 -0
  152. package/packages/web-dashboard/src/app/api/features/[id]/checkpoints/stream/route.ts +170 -0
  153. package/packages/web-dashboard/src/app/api/features/[id]/file-diff/route.ts +144 -0
  154. package/packages/web-dashboard/src/app/api/features/[id]/log-stream/route.ts +167 -0
  155. package/packages/web-dashboard/src/app/api/features/[id]/raw-logs/[filename]/route.ts +65 -0
  156. package/packages/web-dashboard/src/app/api/features/[id]/raw-logs/route.ts +63 -0
  157. package/packages/web-dashboard/src/app/api/features/[id]/timeline/route.ts +60 -0
  158. package/packages/web-dashboard/src/app/feature/[id]/page.tsx +32 -11
  159. package/packages/web-dashboard/src/app/globals.css +2 -0
  160. package/packages/web-dashboard/src/components/detail-panel.tsx +483 -0
  161. package/packages/web-dashboard/src/components/review-workspace.tsx +1162 -0
  162. package/packages/web-dashboard/src/lib/aop-client.ts +725 -0
  163. package/packages/web-dashboard/src/lib/review-contracts.ts +182 -0
  164. package/packages/web-dashboard/src/lib/review-workspace-logic.ts +64 -0
  165. package/packages/web-dashboard/src/lib/types.ts +131 -0
  166. package/packages/web-dashboard/src/styles/dashboard.module.css +333 -0
  167. package/spec-files/completed/agentic_orchestrator_execution_mode_spec.md +1905 -0
  168. package/spec-files/outstanding/agentic_orchestrator_runtime_inspection_spec.md +940 -0
  169. package/spec-files/outstanding/execution_mode_critical_review.md +355 -0
  170. package/spec-files/outstanding/shadow_workspace_implementation_spec.md +1271 -0
  171. package/spec-files/outstanding/shadow_workspace_spec_summary.md +222 -0
  172. package/spec-files/progress.md +269 -1
@@ -0,0 +1,182 @@
1
+ export const FEATURE_ID_PATTERN = /^[a-z0-9](?:[a-z0-9_-]{1,126}[a-z0-9])?$/;
2
+ export const RAW_LOG_FILENAME_PATTERN = /^(planner|builder|qa)-[0-9]{13}\.txt$/;
3
+
4
+ export const TERMINAL_FEATURE_STATUSES = new Set(['merged', 'failed', 'stopped']);
5
+
6
+ export type DiffChangeType = 'added' | 'modified' | 'deleted' | 'renamed' | 'unknown';
7
+
8
+ export interface DiffFileDescriptor {
9
+ path: string;
10
+ oldPath: string | null;
11
+ newPath: string | null;
12
+ changeType: DiffChangeType;
13
+ }
14
+
15
+ function stripPrefix(value: string): string {
16
+ return value.replace(/^[ab]\//, '');
17
+ }
18
+
19
+ export function parseDiffFileDescriptors(rawDiff: string): DiffFileDescriptor[] {
20
+ const normalized = rawDiff.replace(/\r\n/g, '\n');
21
+ if (normalized.trim().length === 0) {
22
+ return [];
23
+ }
24
+
25
+ const descriptors: DiffFileDescriptor[] = [];
26
+ const lines = normalized.split('\n');
27
+ let current: DiffFileDescriptor | null = null;
28
+
29
+ const pushCurrent = () => {
30
+ if (!current) {
31
+ return;
32
+ }
33
+ const pathCandidate = current.newPath ?? current.oldPath ?? current.path;
34
+ descriptors.push({
35
+ ...current,
36
+ path: pathCandidate,
37
+ });
38
+ current = null;
39
+ };
40
+
41
+ for (const line of lines) {
42
+ if (line.startsWith('diff --git ')) {
43
+ pushCurrent();
44
+ const match = line.match(/^diff --git a\/(.+?) b\/(.+)$/);
45
+ const oldPath = match ? stripPrefix(match[1]) : null;
46
+ const newPath = match ? stripPrefix(match[2]) : null;
47
+ current = {
48
+ path: newPath ?? oldPath ?? 'unknown',
49
+ oldPath,
50
+ newPath,
51
+ changeType: 'modified',
52
+ };
53
+ continue;
54
+ }
55
+ if (!current) {
56
+ continue;
57
+ }
58
+ if (line.startsWith('new file mode')) {
59
+ current.changeType = 'added';
60
+ continue;
61
+ }
62
+ if (line.startsWith('deleted file mode')) {
63
+ current.changeType = 'deleted';
64
+ continue;
65
+ }
66
+ if (line.startsWith('rename from ')) {
67
+ current.changeType = 'renamed';
68
+ current.oldPath = line.slice('rename from '.length).trim();
69
+ continue;
70
+ }
71
+ if (line.startsWith('rename to ')) {
72
+ current.changeType = 'renamed';
73
+ current.newPath = line.slice('rename to '.length).trim();
74
+ continue;
75
+ }
76
+ if (line.startsWith('--- ')) {
77
+ const value = line.slice(4).trim();
78
+ current.oldPath = value === '/dev/null' ? null : stripPrefix(value);
79
+ continue;
80
+ }
81
+ if (line.startsWith('+++ ')) {
82
+ const value = line.slice(4).trim();
83
+ current.newPath = value === '/dev/null' ? null : stripPrefix(value);
84
+ continue;
85
+ }
86
+ }
87
+
88
+ pushCurrent();
89
+ return descriptors.map((entry) => {
90
+ const changeType =
91
+ entry.changeType === 'modified' && !entry.oldPath && entry.newPath
92
+ ? 'added'
93
+ : entry.changeType === 'modified' && entry.oldPath && !entry.newPath
94
+ ? 'deleted'
95
+ : entry.changeType;
96
+ return {
97
+ ...entry,
98
+ changeType,
99
+ };
100
+ });
101
+ }
102
+
103
+ export function inferLanguageFromPath(filePath: string): string {
104
+ const lower = filePath.toLowerCase();
105
+ if (lower.endsWith('.ts') || lower.endsWith('.tsx')) {
106
+ return 'typescript';
107
+ }
108
+ if (lower.endsWith('.js') || lower.endsWith('.jsx') || lower.endsWith('.mjs')) {
109
+ return 'javascript';
110
+ }
111
+ if (lower.endsWith('.json')) {
112
+ return 'json';
113
+ }
114
+ if (lower.endsWith('.md')) {
115
+ return 'markdown';
116
+ }
117
+ if (lower.endsWith('.yml') || lower.endsWith('.yaml')) {
118
+ return 'yaml';
119
+ }
120
+ if (lower.endsWith('.css')) {
121
+ return 'css';
122
+ }
123
+ if (lower.endsWith('.html')) {
124
+ return 'html';
125
+ }
126
+ if (lower.endsWith('.go')) {
127
+ return 'go';
128
+ }
129
+ if (lower.endsWith('.rs')) {
130
+ return 'rust';
131
+ }
132
+ if (lower.endsWith('.py')) {
133
+ return 'python';
134
+ }
135
+ if (lower.endsWith('.java')) {
136
+ return 'java';
137
+ }
138
+ if (lower.endsWith('.sh') || lower.endsWith('.bash')) {
139
+ return 'shell';
140
+ }
141
+ return 'plaintext';
142
+ }
143
+
144
+ export function normalizeLimit(value: string | null, fallback: number, max: number): number {
145
+ if (!value) {
146
+ return fallback;
147
+ }
148
+ const parsed = Number.parseInt(value, 10);
149
+ if (Number.isNaN(parsed) || parsed < 1) {
150
+ return fallback;
151
+ }
152
+ return Math.min(parsed, max);
153
+ }
154
+
155
+ export function normalizeRoleFilter(value: string | null): 'planner' | 'builder' | 'qa' | null {
156
+ if (value === 'planner' || value === 'builder' || value === 'qa') {
157
+ return value;
158
+ }
159
+ return null;
160
+ }
161
+
162
+ export function isEditableTarget(target: EventTarget | null): boolean {
163
+ const element = target as {
164
+ tagName?: unknown;
165
+ isContentEditable?: unknown;
166
+ closest?: (selector: string) => unknown;
167
+ } | null;
168
+ if (!element) {
169
+ return false;
170
+ }
171
+ if (typeof element.closest === 'function' && element.closest('.monaco-editor')) {
172
+ return true;
173
+ }
174
+ const tagName = typeof element.tagName === 'string' ? element.tagName.toLowerCase() : '';
175
+ if (tagName === 'input' || tagName === 'textarea') {
176
+ return true;
177
+ }
178
+ if (element.isContentEditable === true) {
179
+ return true;
180
+ }
181
+ return false;
182
+ }
@@ -0,0 +1,64 @@
1
+ import type { AgentLogEntry, AgentSessionCluster } from '@/lib/types.js';
2
+
3
+ const TERMINAL_STATUSES = new Set(['merged', 'failed', 'stopped']);
4
+ export const DEFAULT_LOG_STREAM_CAP = 200;
5
+
6
+ function hasActiveSession(value: string | undefined): boolean {
7
+ return Boolean(value) && value !== 'unknown' && value !== 'unassigned' && value !== 'none';
8
+ }
9
+
10
+ function hasActiveClusterSession(cluster: AgentSessionCluster | undefined): boolean {
11
+ return Boolean(
12
+ cluster &&
13
+ (hasActiveSession(cluster.orchestrator_session_id) ||
14
+ hasActiveSession(cluster.planner_session_id) ||
15
+ hasActiveSession(cluster.builder_session_id) ||
16
+ hasActiveSession(cluster.qa_session_id)),
17
+ );
18
+ }
19
+
20
+ export interface ConsoleSendEligibilityInput {
21
+ status: string;
22
+ cluster: AgentSessionCluster | undefined;
23
+ hasActiveRuntimeSession: boolean;
24
+ submitting: boolean;
25
+ message: string;
26
+ nowMs: number;
27
+ lastMessageSentAtMs: number;
28
+ minIntervalMs?: number;
29
+ }
30
+
31
+ export function isConsoleSendAllowed(input: ConsoleSendEligibilityInput): boolean {
32
+ const minIntervalMs = input.minIntervalMs ?? 1000;
33
+ if (
34
+ TERMINAL_STATUSES.has(input.status) ||
35
+ !input.hasActiveRuntimeSession ||
36
+ !hasActiveClusterSession(input.cluster)
37
+ ) {
38
+ return false;
39
+ }
40
+ if (input.submitting || input.message.trim().length === 0) {
41
+ return false;
42
+ }
43
+ return input.nowMs - input.lastMessageSentAtMs >= minIntervalMs;
44
+ }
45
+
46
+ export function appendCappedLogEntries(
47
+ current: AgentLogEntry[],
48
+ incoming: AgentLogEntry[],
49
+ cap = DEFAULT_LOG_STREAM_CAP,
50
+ ): AgentLogEntry[] {
51
+ if (incoming.length === 0) {
52
+ return current;
53
+ }
54
+ const next = [...current, ...incoming];
55
+ return next.slice(Math.max(0, next.length - Math.max(1, cap)));
56
+ }
57
+
58
+ export function stepHunkIndex(current: number, direction: -1 | 1, hunkCount: number): number {
59
+ const maxIndex = Math.max(0, hunkCount - 1);
60
+ if (direction < 0) {
61
+ return Math.max(0, current - 1);
62
+ }
63
+ return Math.min(maxIndex, current + 1);
64
+ }
@@ -1,11 +1,138 @@
1
1
  export type RoleStatus = 'ready' | 'running' | 'blocked' | 'done' | 'unknown';
2
2
 
3
+ export type AgentRuntimeRole = 'planner' | 'builder' | 'qa' | 'orchestrator' | string;
4
+
3
5
  export interface AgentPipelineStatus {
4
6
  planner: RoleStatus;
5
7
  builder: RoleStatus;
6
8
  qa: RoleStatus;
7
9
  }
8
10
 
11
+ export interface AgentLogEntry {
12
+ id: string;
13
+ timestamp: string;
14
+ actor: string;
15
+ role: AgentRuntimeRole;
16
+ text: string;
17
+ }
18
+
19
+ export interface WorkerEventEntry {
20
+ ts: string;
21
+ role: string;
22
+ output_types: string[];
23
+ patch_count: number;
24
+ plan_submission_count: number;
25
+ request_count: number;
26
+ note_count: number;
27
+ valid: boolean;
28
+ error_code: string | null;
29
+ provider: string;
30
+ model: string;
31
+ elapsed_ms?: number;
32
+ feature_id?: string;
33
+ event_type?: string;
34
+ execution_mode?: 'deterministic' | 'interactive';
35
+ run_id?: string;
36
+ }
37
+
38
+ export type FeatureExecutionMode = 'deterministic' | 'interactive';
39
+
40
+ export interface FeatureCheckpoint {
41
+ checkpoint_id: string;
42
+ timestamp: string;
43
+ files_changed: string[];
44
+ validation_status: 'valid' | 'invalid' | 'skipped';
45
+ violations: string[];
46
+ severity?: 'info' | 'warning' | 'error' | 'critical';
47
+ diff_snapshot: string;
48
+ }
49
+
50
+ export interface FeatureCheckpointDiff {
51
+ checkpoint: FeatureCheckpoint;
52
+ diff: string;
53
+ }
54
+
55
+ export interface FeatureCheckpointComparisonFile {
56
+ path: string;
57
+ status: 'added' | 'removed' | 'changed' | 'unchanged';
58
+ }
59
+
60
+ export interface FeatureCheckpointComparison {
61
+ from_checkpoint_id: string;
62
+ to_checkpoint_id: string;
63
+ from_timestamp: string | null;
64
+ to_timestamp: string | null;
65
+ summary: {
66
+ added: number;
67
+ removed: number;
68
+ changed: number;
69
+ unchanged: number;
70
+ };
71
+ files: FeatureCheckpointComparisonFile[];
72
+ from_diff: string;
73
+ to_diff: string;
74
+ }
75
+
76
+ export interface InteractivePerformanceLatestCheckpoint {
77
+ feature_id: string;
78
+ checkpoint_id: string;
79
+ trigger: string;
80
+ validation_status: 'valid' | 'invalid' | 'skipped';
81
+ checkpoint_latency_ms: number;
82
+ validation_latency_ms: number;
83
+ diff_capture_latency_ms: number;
84
+ files_changed: number;
85
+ recorded_at: string;
86
+ }
87
+
88
+ export interface InteractiveExecutionModeMetrics {
89
+ interactive_iterations: number;
90
+ deterministic_iterations: number;
91
+ interactive_avg_elapsed_ms: number | null;
92
+ deterministic_avg_elapsed_ms: number | null;
93
+ interactive_avg_request_count: number | null;
94
+ deterministic_avg_request_count: number | null;
95
+ context_request_reduction_ratio: number | null;
96
+ }
97
+
98
+ export interface InteractivePerformanceMetrics {
99
+ updated_at: string | null;
100
+ checkpoint_count: number;
101
+ valid_count: number;
102
+ invalid_count: number;
103
+ skipped_count: number;
104
+ avg_files_changed: number | null;
105
+ avg_checkpoint_latency_ms: number | null;
106
+ p95_checkpoint_latency_ms: number | null;
107
+ avg_validation_latency_ms: number | null;
108
+ p95_validation_latency_ms: number | null;
109
+ avg_diff_capture_latency_ms: number | null;
110
+ latest: InteractivePerformanceLatestCheckpoint | null;
111
+ execution_modes: InteractiveExecutionModeMetrics;
112
+ }
113
+
114
+ export interface AgentSessionCluster {
115
+ orchestrator_session_id: string;
116
+ planner_session_id: string;
117
+ builder_session_id: string;
118
+ qa_session_id: string;
119
+ }
120
+
121
+ export interface FileDiffPayload {
122
+ path: string;
123
+ language: string;
124
+ change_type: 'added' | 'modified' | 'deleted' | 'renamed' | 'unknown';
125
+ original: string;
126
+ modified: string;
127
+ }
128
+
129
+ export interface RawLogFileMeta {
130
+ filename: string;
131
+ role: 'planner' | 'builder' | 'qa';
132
+ timestamp: string;
133
+ size_bytes: number;
134
+ }
135
+
9
136
  export interface CostSummary {
10
137
  feature_id: string;
11
138
  tokens_used: number;
@@ -104,6 +231,7 @@ export interface FeatureSummary {
104
231
  revision_of?: number | null;
105
232
  revision_reason?: string | null;
106
233
  role_status?: AgentPipelineStatus;
234
+ cluster?: AgentSessionCluster;
107
235
  gate_retry_count?: number;
108
236
  last_retry_at?: string | null;
109
237
  locks_held?: string[];
@@ -175,6 +303,9 @@ export interface FeatureDetail {
175
303
  cost?: CostSummary | null;
176
304
  qa_test_index?: QaTestIndex | null;
177
305
  review_brief?: ReviewBrief | null;
306
+ log_entries?: AgentLogEntry[];
307
+ execution_mode?: FeatureExecutionMode | null;
308
+ checkpoints?: FeatureCheckpoint[];
178
309
  }
179
310
 
180
311
  export interface DashboardStatusPayload {