oxe-cc 1.2.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/.cursor/commands/oxe-ask.md +2 -2
  2. package/.cursor/commands/oxe-capabilities.md +2 -2
  3. package/.cursor/commands/oxe-checkpoint.md +2 -2
  4. package/.cursor/commands/oxe-compact.md +2 -2
  5. package/.cursor/commands/oxe-dashboard.md +2 -2
  6. package/.cursor/commands/oxe-debug.md +2 -2
  7. package/.cursor/commands/oxe-discuss.md +2 -2
  8. package/.cursor/commands/oxe-execute.md +5 -2
  9. package/.cursor/commands/oxe-forensics.md +2 -2
  10. package/.cursor/commands/oxe-help.md +2 -2
  11. package/.cursor/commands/oxe-loop.md +2 -2
  12. package/.cursor/commands/oxe-milestone.md +2 -2
  13. package/.cursor/commands/oxe-next.md +2 -2
  14. package/.cursor/commands/oxe-obs.md +2 -2
  15. package/.cursor/commands/oxe-plan-agent.md +2 -2
  16. package/.cursor/commands/oxe-plan.md +2 -2
  17. package/.cursor/commands/oxe-project.md +2 -2
  18. package/.cursor/commands/oxe-quick.md +2 -2
  19. package/.cursor/commands/oxe-research.md +2 -2
  20. package/.cursor/commands/oxe-retro.md +2 -2
  21. package/.cursor/commands/oxe-review-pr.md +2 -2
  22. package/.cursor/commands/oxe-route.md +2 -2
  23. package/.cursor/commands/oxe-scan.md +2 -2
  24. package/.cursor/commands/oxe-security.md +2 -2
  25. package/.cursor/commands/oxe-session.md +2 -2
  26. package/.cursor/commands/oxe-ship.md +2 -2
  27. package/.cursor/commands/oxe-skill.md +2 -2
  28. package/.cursor/commands/oxe-spec.md +2 -2
  29. package/.cursor/commands/oxe-ui-review.md +2 -2
  30. package/.cursor/commands/oxe-ui-spec.md +2 -2
  31. package/.cursor/commands/oxe-update.md +2 -2
  32. package/.cursor/commands/oxe-validate-gaps.md +2 -2
  33. package/.cursor/commands/oxe-verify.md +5 -2
  34. package/.cursor/commands/oxe-workstream.md +2 -2
  35. package/.cursor/commands/oxe.md +2 -2
  36. package/.github/copilot-instructions.md +13 -13
  37. package/.github/prompts/oxe-ask.prompt.md +2 -2
  38. package/.github/prompts/oxe-capabilities.prompt.md +2 -2
  39. package/.github/prompts/oxe-checkpoint.prompt.md +2 -2
  40. package/.github/prompts/oxe-compact.prompt.md +2 -2
  41. package/.github/prompts/oxe-dashboard.prompt.md +2 -2
  42. package/.github/prompts/oxe-debug.prompt.md +2 -2
  43. package/.github/prompts/oxe-discuss.prompt.md +2 -2
  44. package/.github/prompts/oxe-execute.prompt.md +5 -2
  45. package/.github/prompts/oxe-forensics.prompt.md +2 -2
  46. package/.github/prompts/oxe-help.prompt.md +2 -2
  47. package/.github/prompts/oxe-loop.prompt.md +2 -2
  48. package/.github/prompts/oxe-milestone.prompt.md +2 -2
  49. package/.github/prompts/oxe-next.prompt.md +2 -2
  50. package/.github/prompts/oxe-obs.prompt.md +2 -2
  51. package/.github/prompts/oxe-plan-agent.prompt.md +2 -2
  52. package/.github/prompts/oxe-plan.prompt.md +2 -2
  53. package/.github/prompts/oxe-project.prompt.md +2 -2
  54. package/.github/prompts/oxe-quick.prompt.md +2 -2
  55. package/.github/prompts/oxe-research.prompt.md +2 -2
  56. package/.github/prompts/oxe-retro.prompt.md +2 -2
  57. package/.github/prompts/oxe-review-pr.prompt.md +2 -2
  58. package/.github/prompts/oxe-route.prompt.md +2 -2
  59. package/.github/prompts/oxe-scan.prompt.md +2 -2
  60. package/.github/prompts/oxe-security.prompt.md +2 -2
  61. package/.github/prompts/oxe-session.prompt.md +2 -2
  62. package/.github/prompts/oxe-ship.prompt.md +2 -2
  63. package/.github/prompts/oxe-skill.prompt.md +2 -2
  64. package/.github/prompts/oxe-spec.prompt.md +2 -2
  65. package/.github/prompts/oxe-ui-review.prompt.md +2 -2
  66. package/.github/prompts/oxe-ui-spec.prompt.md +2 -2
  67. package/.github/prompts/oxe-update.prompt.md +2 -2
  68. package/.github/prompts/oxe-validate-gaps.prompt.md +2 -2
  69. package/.github/prompts/oxe-verify.prompt.md +5 -2
  70. package/.github/prompts/oxe-workstream.prompt.md +2 -2
  71. package/.github/prompts/oxe.prompt.md +2 -2
  72. package/AGENTS.md +5 -3
  73. package/CHANGELOG.md +72 -10
  74. package/LICENSE +21 -674
  75. package/README.md +631 -535
  76. package/bin/banner.txt +6 -6
  77. package/bin/lib/oxe-agent-install.cjs +69 -69
  78. package/bin/lib/oxe-azure.cjs +1445 -1445
  79. package/bin/lib/oxe-context-engine.cjs +867 -867
  80. package/bin/lib/oxe-dashboard.cjs +76 -28
  81. package/bin/lib/oxe-operational.cjs +2144 -1340
  82. package/bin/lib/oxe-project-health.cjs +483 -1
  83. package/bin/lib/oxe-runtime-semantics.cjs +12 -0
  84. package/bin/oxe-cc.js +554 -152
  85. package/commands/oxe/ask.md +2 -2
  86. package/commands/oxe/capabilities.md +2 -2
  87. package/commands/oxe/checkpoint.md +2 -2
  88. package/commands/oxe/compact.md +2 -2
  89. package/commands/oxe/dashboard.md +2 -2
  90. package/commands/oxe/debug.md +2 -2
  91. package/commands/oxe/discuss.md +2 -2
  92. package/commands/oxe/execute.md +5 -2
  93. package/commands/oxe/forensics.md +2 -2
  94. package/commands/oxe/help.md +2 -2
  95. package/commands/oxe/loop.md +2 -2
  96. package/commands/oxe/milestone.md +2 -2
  97. package/commands/oxe/next.md +2 -2
  98. package/commands/oxe/obs.md +2 -2
  99. package/commands/oxe/oxe.md +2 -2
  100. package/commands/oxe/plan-agent.md +2 -2
  101. package/commands/oxe/plan.md +2 -2
  102. package/commands/oxe/project.md +2 -2
  103. package/commands/oxe/quick.md +2 -2
  104. package/commands/oxe/research.md +2 -2
  105. package/commands/oxe/retro.md +2 -2
  106. package/commands/oxe/review-pr.md +2 -2
  107. package/commands/oxe/route.md +2 -2
  108. package/commands/oxe/scan.md +2 -2
  109. package/commands/oxe/security.md +2 -2
  110. package/commands/oxe/session.md +2 -2
  111. package/commands/oxe/ship.md +2 -2
  112. package/commands/oxe/skill.md +2 -2
  113. package/commands/oxe/spec.md +2 -2
  114. package/commands/oxe/ui-review.md +2 -2
  115. package/commands/oxe/ui-spec.md +2 -2
  116. package/commands/oxe/update.md +2 -2
  117. package/commands/oxe/validate-gaps.md +2 -2
  118. package/commands/oxe/verify.md +5 -2
  119. package/commands/oxe/workstream.md +2 -2
  120. package/lib/runtime/delivery/branch-manager.d.ts +1 -0
  121. package/lib/runtime/delivery/branch-manager.js +7 -0
  122. package/lib/runtime/delivery/ci-checks.js +34 -1
  123. package/lib/runtime/delivery/delivery-records.d.ts +34 -0
  124. package/lib/runtime/delivery/delivery-records.js +48 -0
  125. package/lib/runtime/delivery/index.d.ts +1 -0
  126. package/lib/runtime/delivery/index.js +1 -0
  127. package/lib/runtime/delivery/promotion-pipeline.d.ts +26 -2
  128. package/lib/runtime/delivery/promotion-pipeline.js +111 -14
  129. package/lib/runtime/gate/gate-manager.d.ts +41 -0
  130. package/lib/runtime/gate/gate-manager.js +108 -1
  131. package/lib/runtime/index.d.ts +2 -2
  132. package/lib/runtime/index.js +3 -1
  133. package/lib/runtime/models/gate-decision.d.ts +4 -1
  134. package/lib/runtime/models/workspace.d.ts +3 -0
  135. package/lib/runtime/plugins/capability-adapter.d.ts +12 -0
  136. package/lib/runtime/plugins/capability-adapter.js +204 -0
  137. package/lib/runtime/plugins/capability-matrix.d.ts +5 -0
  138. package/lib/runtime/plugins/capability-matrix.js +48 -17
  139. package/lib/runtime/plugins/index.d.ts +1 -0
  140. package/lib/runtime/plugins/index.js +1 -0
  141. package/lib/runtime/plugins/plugin-abi.d.ts +2 -0
  142. package/lib/runtime/plugins/plugin-manifest.d.ts +1 -1
  143. package/lib/runtime/plugins/plugin-manifest.js +6 -2
  144. package/lib/runtime/plugins/plugin-registry.d.ts +46 -0
  145. package/lib/runtime/plugins/plugin-registry.js +79 -2
  146. package/lib/runtime/policy/policy-engine.d.ts +19 -0
  147. package/lib/runtime/policy/policy-engine.js +76 -4
  148. package/lib/runtime/projection/projection-engine.d.ts +9 -1
  149. package/lib/runtime/projection/projection-engine.js +73 -3
  150. package/lib/runtime/scheduler/multi-agent-coordinator.d.ts +43 -1
  151. package/lib/runtime/scheduler/multi-agent-coordinator.js +151 -39
  152. package/lib/runtime/scheduler/run-journal.d.ts +1 -1
  153. package/lib/runtime/scheduler/scheduler.d.ts +19 -1
  154. package/lib/runtime/scheduler/scheduler.js +258 -13
  155. package/lib/runtime/verification/verification-compiler.d.ts +43 -0
  156. package/lib/runtime/verification/verification-compiler.js +137 -0
  157. package/lib/runtime/verification/verification-manifest.d.ts +9 -0
  158. package/lib/runtime/verification/verification-manifest.js +56 -6
  159. package/lib/runtime/workspace/strategies/ephemeral-container.d.ts +1 -0
  160. package/lib/runtime/workspace/strategies/ephemeral-container.js +4 -0
  161. package/lib/runtime/workspace/strategies/git-worktree.d.ts +1 -0
  162. package/lib/runtime/workspace/strategies/git-worktree.js +2 -0
  163. package/lib/runtime/workspace/strategies/inplace.d.ts +1 -0
  164. package/lib/runtime/workspace/strategies/inplace.js +2 -0
  165. package/lib/runtime/workspace/workspace-manager.d.ts +2 -1
  166. package/lib/sdk/README.md +20 -8
  167. package/lib/sdk/index.cjs +33 -24
  168. package/lib/sdk/index.d.ts +149 -14
  169. package/oxe/templates/ACTIVE-RUN.template.json +32 -32
  170. package/oxe/templates/CAPABILITIES.template.md +7 -7
  171. package/oxe/templates/CAPABILITY.template.md +45 -45
  172. package/oxe/templates/CHECKPOINTS.template.md +7 -7
  173. package/oxe/templates/EXECUTION-RUNTIME.template.md +68 -68
  174. package/oxe/templates/HYPOTHESES.template.md +33 -33
  175. package/oxe/templates/LESSONS-METRICS.template.json +13 -13
  176. package/oxe/templates/NOTES.template.md +16 -16
  177. package/oxe/templates/PLAN-REVIEW.template.md +31 -31
  178. package/oxe/templates/SESSION.template.md +34 -34
  179. package/oxe/templates/SKILL.template.md +26 -26
  180. package/oxe/templates/STATE.md +55 -55
  181. package/oxe/templates/WORKFLOW_AUTHORING.md +18 -18
  182. package/oxe/workflows/ask.md +96 -96
  183. package/oxe/workflows/capabilities.md +25 -25
  184. package/oxe/workflows/dashboard.md +33 -33
  185. package/oxe/workflows/discuss.md +12 -12
  186. package/oxe/workflows/execute.md +14 -0
  187. package/oxe/workflows/help.md +352 -352
  188. package/oxe/workflows/next.md +22 -22
  189. package/oxe/workflows/oxe.md +6 -6
  190. package/oxe/workflows/plan-agent.md +9 -9
  191. package/oxe/workflows/plan.md +51 -20
  192. package/oxe/workflows/quick.md +10 -10
  193. package/oxe/workflows/references/reasoning-discovery.md +28 -28
  194. package/oxe/workflows/references/reasoning-execution.md +29 -29
  195. package/oxe/workflows/references/reasoning-planning.md +32 -32
  196. package/oxe/workflows/references/reasoning-review.md +29 -29
  197. package/oxe/workflows/references/reasoning-status.md +24 -24
  198. package/oxe/workflows/references/robustness-elevation.md +295 -295
  199. package/oxe/workflows/references/workflow-runtime-contracts.json +952 -930
  200. package/oxe/workflows/route.md +16 -16
  201. package/oxe/workflows/session.md +213 -213
  202. package/oxe/workflows/ship.md +142 -142
  203. package/oxe/workflows/skill.md +44 -44
  204. package/oxe/workflows/ui-review.md +36 -36
  205. package/oxe/workflows/verify-audit.md +73 -73
  206. package/oxe/workflows/verify.md +10 -0
  207. package/package.json +92 -92
  208. package/packages/runtime/package.json +16 -15
  209. package/packages/runtime/src/audit/audit-trail.ts +243 -243
  210. package/packages/runtime/src/audit/index.ts +2 -2
  211. package/packages/runtime/src/audit/policy-pack.ts +62 -62
  212. package/packages/runtime/src/compiler/graph-compiler.ts +245 -245
  213. package/packages/runtime/src/compiler/index.ts +1 -1
  214. package/packages/runtime/src/context/context-pack-builder.ts +259 -259
  215. package/packages/runtime/src/context/context-pack-store.ts +197 -197
  216. package/packages/runtime/src/context/context-profiles.ts +60 -60
  217. package/packages/runtime/src/context/index.ts +3 -3
  218. package/packages/runtime/src/decision/decision-engine.ts +174 -174
  219. package/packages/runtime/src/decision/decision-memo.ts +211 -211
  220. package/packages/runtime/src/decision/index.ts +2 -2
  221. package/packages/runtime/src/delivery/branch-manager.ts +91 -84
  222. package/packages/runtime/src/delivery/ci-checks.ts +285 -252
  223. package/packages/runtime/src/delivery/delivery-records.ts +75 -0
  224. package/packages/runtime/src/delivery/index.ts +5 -4
  225. package/packages/runtime/src/delivery/pr-manager.ts +112 -112
  226. package/packages/runtime/src/delivery/promotion-pipeline.ts +334 -180
  227. package/packages/runtime/src/events/bus.ts +92 -92
  228. package/packages/runtime/src/events/catalog.ts +29 -29
  229. package/packages/runtime/src/events/envelope.ts +14 -14
  230. package/packages/runtime/src/events/index.ts +3 -3
  231. package/packages/runtime/src/evidence/evidence-store.ts +130 -130
  232. package/packages/runtime/src/evidence/index.ts +1 -1
  233. package/packages/runtime/src/gate/gate-manager.ts +289 -137
  234. package/packages/runtime/src/gate/index.ts +1 -1
  235. package/packages/runtime/src/index.ts +41 -37
  236. package/packages/runtime/src/models/attempt.ts +19 -19
  237. package/packages/runtime/src/models/evidence.ts +21 -21
  238. package/packages/runtime/src/models/gate-decision.ts +25 -21
  239. package/packages/runtime/src/models/index.ts +8 -8
  240. package/packages/runtime/src/models/run.ts +24 -24
  241. package/packages/runtime/src/models/session.ts +11 -11
  242. package/packages/runtime/src/models/verification-result.ts +10 -10
  243. package/packages/runtime/src/models/work-item.ts +25 -25
  244. package/packages/runtime/src/models/workspace.ts +31 -28
  245. package/packages/runtime/src/plugins/capability-adapter.ts +206 -0
  246. package/packages/runtime/src/plugins/capability-matrix.ts +126 -83
  247. package/packages/runtime/src/plugins/index.ts +5 -4
  248. package/packages/runtime/src/plugins/plugin-abi.ts +97 -95
  249. package/packages/runtime/src/plugins/plugin-manifest.ts +118 -113
  250. package/packages/runtime/src/plugins/plugin-registry.ts +232 -124
  251. package/packages/runtime/src/policy/index.ts +1 -1
  252. package/packages/runtime/src/policy/policy-engine.ts +330 -244
  253. package/packages/runtime/src/projection/index.ts +1 -1
  254. package/packages/runtime/src/projection/projection-engine.ts +328 -249
  255. package/packages/runtime/src/reducers/debug-reducer.ts +36 -36
  256. package/packages/runtime/src/reducers/index.ts +2 -2
  257. package/packages/runtime/src/reducers/run-state-reducer.ts +269 -269
  258. package/packages/runtime/src/scheduler/agent-registry.ts +132 -132
  259. package/packages/runtime/src/scheduler/agent-roles.ts +109 -109
  260. package/packages/runtime/src/scheduler/index.ts +4 -4
  261. package/packages/runtime/src/scheduler/multi-agent-coordinator.ts +521 -333
  262. package/packages/runtime/src/scheduler/run-journal.ts +62 -62
  263. package/packages/runtime/src/scheduler/scheduler.ts +722 -441
  264. package/packages/runtime/src/verification/index.ts +2 -2
  265. package/packages/runtime/src/verification/verification-compiler.ts +436 -225
  266. package/packages/runtime/src/verification/verification-manifest.ts +252 -192
  267. package/packages/runtime/src/workspace/index.ts +5 -5
  268. package/packages/runtime/src/workspace/strategies/ephemeral-container.ts +126 -121
  269. package/packages/runtime/src/workspace/strategies/git-worktree.ts +79 -77
  270. package/packages/runtime/src/workspace/strategies/inplace.ts +38 -35
  271. package/packages/runtime/src/workspace/workspace-manager.ts +16 -15
  272. package/packages/runtime/tsconfig.json +17 -17
  273. package/vscode-extension/.vscodeignore +7 -7
  274. package/vscode-extension/LICENSE +21 -0
  275. package/vscode-extension/oxe-agents-1.0.0.vsix +0 -0
  276. package/vscode-extension/oxe-agents-1.4.0.vsix +0 -0
  277. package/vscode-extension/package.json +184 -184
  278. package/vscode-extension/src/extension.js +310 -310
  279. package/vscode-extension/src/shared/contextLoader.js +137 -137
  280. package/vscode-extension/src/shared/contractBuilder.js +159 -159
  281. package/vscode-extension/src/shared/stateReader.js +101 -101
@@ -1,92 +1,92 @@
1
- import type { OxeEvent } from './envelope';
2
- import type { EventType } from './catalog';
3
- import path from 'path';
4
- import fs from 'fs';
5
-
6
- export type EventInput = Partial<Omit<OxeEvent, 'type'>> & { type: EventType };
7
-
8
- interface OperationalEvent {
9
- event_id?: string;
10
- type?: string;
11
- timestamp?: string;
12
- session_id?: string | null;
13
- run_id?: string | null;
14
- task_id?: string | null;
15
- work_item_id?: string | null;
16
- attempt_id?: string | null;
17
- causation_id?: string | null;
18
- correlation_id?: string | null;
19
- payload?: Record<string, unknown>;
20
- }
21
-
22
- function loadOperationalModule(): {
23
- appendEvent: (projectRoot: string, sessionId: string | null, event: Record<string, unknown>) => OperationalEvent;
24
- readEvents: (projectRoot: string, sessionId: string | null) => OperationalEvent[];
25
- } {
26
- const candidates = [
27
- path.resolve(__dirname, '../../../bin/lib/oxe-operational.cjs'),
28
- path.resolve(__dirname, '../../../../bin/lib/oxe-operational.cjs'),
29
- path.resolve(__dirname, '../../../../../bin/lib/oxe-operational.cjs'),
30
- ];
31
- for (const candidate of candidates) {
32
- if (!fs.existsSync(candidate)) continue;
33
- // eslint-disable-next-line @typescript-eslint/no-var-requires
34
- return require(candidate) as {
35
- appendEvent: (projectRoot: string, sessionId: string | null, event: Record<string, unknown>) => OperationalEvent;
36
- readEvents: (projectRoot: string, sessionId: string | null) => OperationalEvent[];
37
- };
38
- }
39
- throw new Error(`Unable to locate oxe-operational.cjs from ${__dirname}`);
40
- }
41
-
42
- const operational = loadOperationalModule();
43
-
44
- function fromOperationalEvent(raw: OperationalEvent): OxeEvent {
45
- return {
46
- id: String(raw.event_id || ''),
47
- type: String(raw.type || 'RunStarted') as EventType,
48
- timestamp: String(raw.timestamp || new Date().toISOString()),
49
- session_id: raw.session_id ?? null,
50
- run_id: raw.run_id ?? null,
51
- work_item_id: raw.work_item_id ?? raw.task_id ?? null,
52
- attempt_id: raw.attempt_id ?? null,
53
- causation_id: raw.causation_id ?? null,
54
- correlation_id: raw.correlation_id ?? null,
55
- payload: raw.payload && typeof raw.payload === 'object' ? raw.payload : {},
56
- };
57
- }
58
-
59
- export function appendEvent(
60
- projectRoot: string,
61
- sessionId: string | null,
62
- input: EventInput,
63
- causationId?: string
64
- ): OxeEvent {
65
- const event = operational.appendEvent(projectRoot, sessionId, {
66
- event_id: input.id,
67
- type: input.type,
68
- timestamp: input.timestamp,
69
- run_id: input.run_id ?? null,
70
- work_item_id: input.work_item_id ?? null,
71
- attempt_id: input.attempt_id ?? null,
72
- causation_id: input.causation_id ?? causationId ?? null,
73
- correlation_id: input.correlation_id ?? null,
74
- payload: input.payload && typeof input.payload === 'object' ? input.payload : {},
75
- });
76
- return fromOperationalEvent(event);
77
- }
78
-
79
- export function readEvents(
80
- projectRoot: string,
81
- sessionId: string | null
82
- ): OxeEvent[] {
83
- return operational.readEvents(projectRoot, sessionId).map(fromOperationalEvent);
84
- }
85
-
86
- export function filterByRun(events: OxeEvent[], runId: string): OxeEvent[] {
87
- return events.filter((e) => e.run_id === runId);
88
- }
89
-
90
- export function filterByWorkItem(events: OxeEvent[], workItemId: string): OxeEvent[] {
91
- return events.filter((e) => e.work_item_id === workItemId);
92
- }
1
+ import type { OxeEvent } from './envelope';
2
+ import type { EventType } from './catalog';
3
+ import path from 'path';
4
+ import fs from 'fs';
5
+
6
+ export type EventInput = Partial<Omit<OxeEvent, 'type'>> & { type: EventType };
7
+
8
+ interface OperationalEvent {
9
+ event_id?: string;
10
+ type?: string;
11
+ timestamp?: string;
12
+ session_id?: string | null;
13
+ run_id?: string | null;
14
+ task_id?: string | null;
15
+ work_item_id?: string | null;
16
+ attempt_id?: string | null;
17
+ causation_id?: string | null;
18
+ correlation_id?: string | null;
19
+ payload?: Record<string, unknown>;
20
+ }
21
+
22
+ function loadOperationalModule(): {
23
+ appendEvent: (projectRoot: string, sessionId: string | null, event: Record<string, unknown>) => OperationalEvent;
24
+ readEvents: (projectRoot: string, sessionId: string | null) => OperationalEvent[];
25
+ } {
26
+ const candidates = [
27
+ path.resolve(__dirname, '../../../bin/lib/oxe-operational.cjs'),
28
+ path.resolve(__dirname, '../../../../bin/lib/oxe-operational.cjs'),
29
+ path.resolve(__dirname, '../../../../../bin/lib/oxe-operational.cjs'),
30
+ ];
31
+ for (const candidate of candidates) {
32
+ if (!fs.existsSync(candidate)) continue;
33
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
34
+ return require(candidate) as {
35
+ appendEvent: (projectRoot: string, sessionId: string | null, event: Record<string, unknown>) => OperationalEvent;
36
+ readEvents: (projectRoot: string, sessionId: string | null) => OperationalEvent[];
37
+ };
38
+ }
39
+ throw new Error(`Unable to locate oxe-operational.cjs from ${__dirname}`);
40
+ }
41
+
42
+ const operational = loadOperationalModule();
43
+
44
+ function fromOperationalEvent(raw: OperationalEvent): OxeEvent {
45
+ return {
46
+ id: String(raw.event_id || ''),
47
+ type: String(raw.type || 'RunStarted') as EventType,
48
+ timestamp: String(raw.timestamp || new Date().toISOString()),
49
+ session_id: raw.session_id ?? null,
50
+ run_id: raw.run_id ?? null,
51
+ work_item_id: raw.work_item_id ?? raw.task_id ?? null,
52
+ attempt_id: raw.attempt_id ?? null,
53
+ causation_id: raw.causation_id ?? null,
54
+ correlation_id: raw.correlation_id ?? null,
55
+ payload: raw.payload && typeof raw.payload === 'object' ? raw.payload : {},
56
+ };
57
+ }
58
+
59
+ export function appendEvent(
60
+ projectRoot: string,
61
+ sessionId: string | null,
62
+ input: EventInput,
63
+ causationId?: string
64
+ ): OxeEvent {
65
+ const event = operational.appendEvent(projectRoot, sessionId, {
66
+ event_id: input.id,
67
+ type: input.type,
68
+ timestamp: input.timestamp,
69
+ run_id: input.run_id ?? null,
70
+ work_item_id: input.work_item_id ?? null,
71
+ attempt_id: input.attempt_id ?? null,
72
+ causation_id: input.causation_id ?? causationId ?? null,
73
+ correlation_id: input.correlation_id ?? null,
74
+ payload: input.payload && typeof input.payload === 'object' ? input.payload : {},
75
+ });
76
+ return fromOperationalEvent(event);
77
+ }
78
+
79
+ export function readEvents(
80
+ projectRoot: string,
81
+ sessionId: string | null
82
+ ): OxeEvent[] {
83
+ return operational.readEvents(projectRoot, sessionId).map(fromOperationalEvent);
84
+ }
85
+
86
+ export function filterByRun(events: OxeEvent[], runId: string): OxeEvent[] {
87
+ return events.filter((e) => e.run_id === runId);
88
+ }
89
+
90
+ export function filterByWorkItem(events: OxeEvent[], workItemId: string): OxeEvent[] {
91
+ return events.filter((e) => e.work_item_id === workItemId);
92
+ }
@@ -1,29 +1,29 @@
1
- export const EVENT_TYPES = [
2
- 'SessionCreated',
3
- 'RunStarted',
4
- 'GraphCompiled',
5
- 'WorkItemReady',
6
- 'WorkspaceAllocated',
7
- 'AttemptStarted',
8
- 'ToolInvoked',
9
- 'ToolCompleted',
10
- 'ToolFailed',
11
- 'EvidenceCollected',
12
- 'PolicyEvaluated',
13
- 'GateRequested',
14
- 'GateResolved',
15
- 'VerificationStarted',
16
- 'VerificationCompleted',
17
- 'RetryScheduled',
18
- 'WorkItemCompleted',
19
- 'WorkItemBlocked',
20
- 'RunCompleted',
21
- 'RetroPublished',
22
- 'LessonPromoted',
23
- ] as const;
24
-
25
- export type EventType = (typeof EVENT_TYPES)[number];
26
-
27
- export function isValidEventType(type: string): type is EventType {
28
- return (EVENT_TYPES as readonly string[]).includes(type);
29
- }
1
+ export const EVENT_TYPES = [
2
+ 'SessionCreated',
3
+ 'RunStarted',
4
+ 'GraphCompiled',
5
+ 'WorkItemReady',
6
+ 'WorkspaceAllocated',
7
+ 'AttemptStarted',
8
+ 'ToolInvoked',
9
+ 'ToolCompleted',
10
+ 'ToolFailed',
11
+ 'EvidenceCollected',
12
+ 'PolicyEvaluated',
13
+ 'GateRequested',
14
+ 'GateResolved',
15
+ 'VerificationStarted',
16
+ 'VerificationCompleted',
17
+ 'RetryScheduled',
18
+ 'WorkItemCompleted',
19
+ 'WorkItemBlocked',
20
+ 'RunCompleted',
21
+ 'RetroPublished',
22
+ 'LessonPromoted',
23
+ ] as const;
24
+
25
+ export type EventType = (typeof EVENT_TYPES)[number];
26
+
27
+ export function isValidEventType(type: string): type is EventType {
28
+ return (EVENT_TYPES as readonly string[]).includes(type);
29
+ }
@@ -1,14 +1,14 @@
1
- import type { EventType } from './catalog';
2
-
3
- export interface OxeEvent {
4
- id: string;
5
- type: EventType;
6
- timestamp: string;
7
- session_id: string | null;
8
- run_id: string | null;
9
- work_item_id: string | null;
10
- attempt_id: string | null;
11
- causation_id: string | null;
12
- correlation_id: string | null;
13
- payload: Record<string, unknown>;
14
- }
1
+ import type { EventType } from './catalog';
2
+
3
+ export interface OxeEvent {
4
+ id: string;
5
+ type: EventType;
6
+ timestamp: string;
7
+ session_id: string | null;
8
+ run_id: string | null;
9
+ work_item_id: string | null;
10
+ attempt_id: string | null;
11
+ causation_id: string | null;
12
+ correlation_id: string | null;
13
+ payload: Record<string, unknown>;
14
+ }
@@ -1,3 +1,3 @@
1
- export * from './catalog';
2
- export * from './envelope';
3
- export * from './bus';
1
+ export * from './catalog';
2
+ export * from './envelope';
3
+ export * from './bus';
@@ -1,130 +1,130 @@
1
- import crypto from 'crypto';
2
- import path from 'path';
3
- import fs from 'fs';
4
- import type { Evidence, EvidenceType } from '../models/evidence';
5
-
6
- export interface EvidenceCollectOptions {
7
- work_item_id: string;
8
- run_id: string;
9
- attempt_number: number;
10
- }
11
-
12
- export interface EvidenceContent {
13
- evidence: Evidence;
14
- content: Buffer;
15
- }
16
-
17
- const EXT_MAP: Record<EvidenceType, string> = {
18
- diff: 'patch',
19
- stdout: 'txt',
20
- stderr: 'txt',
21
- junit_xml: 'xml',
22
- coverage: 'json',
23
- screenshot: 'png',
24
- trace: 'json',
25
- log: 'txt',
26
- security_report: 'json',
27
- api_output: 'json',
28
- summary: 'json',
29
- };
30
-
31
- export class EvidenceStore {
32
- constructor(private readonly projectRoot: string) {}
33
-
34
- private evidenceDir(runId: string, workItemId: string, attemptNumber: number): string {
35
- return path.join(
36
- this.projectRoot,
37
- '.oxe',
38
- 'evidence',
39
- 'runs',
40
- runId,
41
- workItemId,
42
- `attempt-${attemptNumber}`
43
- );
44
- }
45
-
46
- private indexPath(runId: string, workItemId: string, attemptNumber: number): string {
47
- return path.join(this.evidenceDir(runId, workItemId, attemptNumber), 'index.json');
48
- }
49
-
50
- private readIndex(runId: string, workItemId: string, attemptNumber: number): Evidence[] {
51
- const p = this.indexPath(runId, workItemId, attemptNumber);
52
- if (!fs.existsSync(p)) return [];
53
- try {
54
- return JSON.parse(fs.readFileSync(p, 'utf8')) as Evidence[];
55
- } catch {
56
- return [];
57
- }
58
- }
59
-
60
- private writeIndex(runId: string, workItemId: string, attemptNumber: number, items: Evidence[]): void {
61
- fs.writeFileSync(this.indexPath(runId, workItemId, attemptNumber), JSON.stringify(items, null, 2), 'utf8');
62
- }
63
-
64
- async collect(
65
- type: EvidenceType,
66
- content: Buffer | string,
67
- opts: EvidenceCollectOptions
68
- ): Promise<Evidence> {
69
- const { work_item_id, run_id, attempt_number } = opts;
70
- const dir = this.evidenceDir(run_id, work_item_id, attempt_number);
71
- fs.mkdirSync(dir, { recursive: true });
72
-
73
- const buf = Buffer.isBuffer(content) ? content : Buffer.from(content, 'utf8');
74
- const checksum = crypto.createHash('sha256').update(buf).digest('hex').slice(0, 16);
75
- const ext = EXT_MAP[type] ?? 'bin';
76
-
77
- const existing = this.readIndex(run_id, work_item_id, attempt_number);
78
- const seq = existing.filter((e) => e.type === type).length + 1;
79
- const filename = seq === 1 ? `${type}.${ext}` : `${type}-${seq}.${ext}`;
80
- const filePath = path.join(dir, filename);
81
-
82
- fs.writeFileSync(filePath, buf);
83
-
84
- const evidence: Evidence = {
85
- evidence_id: `ev-${run_id}-${work_item_id}-a${attempt_number}-${type}-${seq}`,
86
- attempt_id: `${work_item_id}-a${attempt_number}`,
87
- type,
88
- path: path.relative(this.projectRoot, filePath),
89
- checksum,
90
- created_at: new Date().toISOString(),
91
- };
92
-
93
- this.writeIndex(run_id, work_item_id, attempt_number, [...existing, evidence]);
94
- return evidence;
95
- }
96
-
97
- async list(opts: EvidenceCollectOptions): Promise<Evidence[]> {
98
- return this.readIndex(opts.run_id, opts.work_item_id, opts.attempt_number);
99
- }
100
-
101
- async get(evidenceId: string, opts: EvidenceCollectOptions): Promise<EvidenceContent | null> {
102
- const items = this.readIndex(opts.run_id, opts.work_item_id, opts.attempt_number);
103
- const ev = items.find((e) => e.evidence_id === evidenceId);
104
- if (!ev) return null;
105
- const absPath = path.join(this.projectRoot, ev.path);
106
- if (!fs.existsSync(absPath)) return null;
107
- return { evidence: ev, content: fs.readFileSync(absPath) };
108
- }
109
-
110
- async listByRun(runId: string): Promise<Evidence[]> {
111
- const runDir = path.join(this.projectRoot, '.oxe', 'evidence', 'runs', runId);
112
- if (!fs.existsSync(runDir)) return [];
113
- const all: Evidence[] = [];
114
- for (const workItem of fs.readdirSync(runDir)) {
115
- const wiDir = path.join(runDir, workItem);
116
- for (const attempt of fs.readdirSync(wiDir)) {
117
- const indexPath = path.join(wiDir, attempt, 'index.json');
118
- if (fs.existsSync(indexPath)) {
119
- try {
120
- const items = JSON.parse(fs.readFileSync(indexPath, 'utf8')) as Evidence[];
121
- all.push(...items);
122
- } catch {
123
- // skip corrupt index
124
- }
125
- }
126
- }
127
- }
128
- return all;
129
- }
130
- }
1
+ import crypto from 'crypto';
2
+ import path from 'path';
3
+ import fs from 'fs';
4
+ import type { Evidence, EvidenceType } from '../models/evidence';
5
+
6
+ export interface EvidenceCollectOptions {
7
+ work_item_id: string;
8
+ run_id: string;
9
+ attempt_number: number;
10
+ }
11
+
12
+ export interface EvidenceContent {
13
+ evidence: Evidence;
14
+ content: Buffer;
15
+ }
16
+
17
+ const EXT_MAP: Record<EvidenceType, string> = {
18
+ diff: 'patch',
19
+ stdout: 'txt',
20
+ stderr: 'txt',
21
+ junit_xml: 'xml',
22
+ coverage: 'json',
23
+ screenshot: 'png',
24
+ trace: 'json',
25
+ log: 'txt',
26
+ security_report: 'json',
27
+ api_output: 'json',
28
+ summary: 'json',
29
+ };
30
+
31
+ export class EvidenceStore {
32
+ constructor(private readonly projectRoot: string) {}
33
+
34
+ private evidenceDir(runId: string, workItemId: string, attemptNumber: number): string {
35
+ return path.join(
36
+ this.projectRoot,
37
+ '.oxe',
38
+ 'evidence',
39
+ 'runs',
40
+ runId,
41
+ workItemId,
42
+ `attempt-${attemptNumber}`
43
+ );
44
+ }
45
+
46
+ private indexPath(runId: string, workItemId: string, attemptNumber: number): string {
47
+ return path.join(this.evidenceDir(runId, workItemId, attemptNumber), 'index.json');
48
+ }
49
+
50
+ private readIndex(runId: string, workItemId: string, attemptNumber: number): Evidence[] {
51
+ const p = this.indexPath(runId, workItemId, attemptNumber);
52
+ if (!fs.existsSync(p)) return [];
53
+ try {
54
+ return JSON.parse(fs.readFileSync(p, 'utf8')) as Evidence[];
55
+ } catch {
56
+ return [];
57
+ }
58
+ }
59
+
60
+ private writeIndex(runId: string, workItemId: string, attemptNumber: number, items: Evidence[]): void {
61
+ fs.writeFileSync(this.indexPath(runId, workItemId, attemptNumber), JSON.stringify(items, null, 2), 'utf8');
62
+ }
63
+
64
+ async collect(
65
+ type: EvidenceType,
66
+ content: Buffer | string,
67
+ opts: EvidenceCollectOptions
68
+ ): Promise<Evidence> {
69
+ const { work_item_id, run_id, attempt_number } = opts;
70
+ const dir = this.evidenceDir(run_id, work_item_id, attempt_number);
71
+ fs.mkdirSync(dir, { recursive: true });
72
+
73
+ const buf = Buffer.isBuffer(content) ? content : Buffer.from(content, 'utf8');
74
+ const checksum = crypto.createHash('sha256').update(buf).digest('hex').slice(0, 16);
75
+ const ext = EXT_MAP[type] ?? 'bin';
76
+
77
+ const existing = this.readIndex(run_id, work_item_id, attempt_number);
78
+ const seq = existing.filter((e) => e.type === type).length + 1;
79
+ const filename = seq === 1 ? `${type}.${ext}` : `${type}-${seq}.${ext}`;
80
+ const filePath = path.join(dir, filename);
81
+
82
+ fs.writeFileSync(filePath, buf);
83
+
84
+ const evidence: Evidence = {
85
+ evidence_id: `ev-${run_id}-${work_item_id}-a${attempt_number}-${type}-${seq}`,
86
+ attempt_id: `${work_item_id}-a${attempt_number}`,
87
+ type,
88
+ path: path.relative(this.projectRoot, filePath),
89
+ checksum,
90
+ created_at: new Date().toISOString(),
91
+ };
92
+
93
+ this.writeIndex(run_id, work_item_id, attempt_number, [...existing, evidence]);
94
+ return evidence;
95
+ }
96
+
97
+ async list(opts: EvidenceCollectOptions): Promise<Evidence[]> {
98
+ return this.readIndex(opts.run_id, opts.work_item_id, opts.attempt_number);
99
+ }
100
+
101
+ async get(evidenceId: string, opts: EvidenceCollectOptions): Promise<EvidenceContent | null> {
102
+ const items = this.readIndex(opts.run_id, opts.work_item_id, opts.attempt_number);
103
+ const ev = items.find((e) => e.evidence_id === evidenceId);
104
+ if (!ev) return null;
105
+ const absPath = path.join(this.projectRoot, ev.path);
106
+ if (!fs.existsSync(absPath)) return null;
107
+ return { evidence: ev, content: fs.readFileSync(absPath) };
108
+ }
109
+
110
+ async listByRun(runId: string): Promise<Evidence[]> {
111
+ const runDir = path.join(this.projectRoot, '.oxe', 'evidence', 'runs', runId);
112
+ if (!fs.existsSync(runDir)) return [];
113
+ const all: Evidence[] = [];
114
+ for (const workItem of fs.readdirSync(runDir)) {
115
+ const wiDir = path.join(runDir, workItem);
116
+ for (const attempt of fs.readdirSync(wiDir)) {
117
+ const indexPath = path.join(wiDir, attempt, 'index.json');
118
+ if (fs.existsSync(indexPath)) {
119
+ try {
120
+ const items = JSON.parse(fs.readFileSync(indexPath, 'utf8')) as Evidence[];
121
+ all.push(...items);
122
+ } catch {
123
+ // skip corrupt index
124
+ }
125
+ }
126
+ }
127
+ }
128
+ return all;
129
+ }
130
+ }
@@ -1 +1 @@
1
- export * from './evidence-store';
1
+ export * from './evidence-store';