oxe-cc 1.0.0 → 1.3.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 (322) hide show
  1. package/.cursor/commands/oxe-ask.md +3 -3
  2. package/.cursor/commands/oxe-capabilities.md +3 -3
  3. package/.cursor/commands/oxe-checkpoint.md +3 -3
  4. package/.cursor/commands/oxe-compact.md +3 -3
  5. package/.cursor/commands/oxe-dashboard.md +3 -3
  6. package/.cursor/commands/oxe-debug.md +3 -3
  7. package/.cursor/commands/oxe-discuss.md +3 -3
  8. package/.cursor/commands/oxe-execute.md +7 -4
  9. package/.cursor/commands/oxe-forensics.md +3 -3
  10. package/.cursor/commands/oxe-help.md +3 -3
  11. package/.cursor/commands/oxe-loop.md +3 -3
  12. package/.cursor/commands/oxe-milestone.md +3 -3
  13. package/.cursor/commands/oxe-next.md +3 -3
  14. package/.cursor/commands/oxe-obs.md +3 -3
  15. package/.cursor/commands/oxe-plan-agent.md +3 -3
  16. package/.cursor/commands/oxe-plan.md +3 -3
  17. package/.cursor/commands/oxe-project.md +3 -3
  18. package/.cursor/commands/oxe-quick.md +3 -3
  19. package/.cursor/commands/oxe-research.md +3 -3
  20. package/.cursor/commands/oxe-retro.md +3 -3
  21. package/.cursor/commands/oxe-review-pr.md +3 -3
  22. package/.cursor/commands/oxe-route.md +3 -3
  23. package/.cursor/commands/oxe-scan.md +3 -3
  24. package/.cursor/commands/oxe-security.md +3 -3
  25. package/.cursor/commands/oxe-session.md +4 -4
  26. package/.cursor/commands/oxe-ship.md +45 -0
  27. package/.cursor/commands/oxe-skill.md +3 -3
  28. package/.cursor/commands/oxe-spec.md +3 -3
  29. package/.cursor/commands/oxe-ui-review.md +3 -3
  30. package/.cursor/commands/oxe-ui-spec.md +3 -3
  31. package/.cursor/commands/oxe-update.md +3 -3
  32. package/.cursor/commands/oxe-validate-gaps.md +3 -3
  33. package/.cursor/commands/oxe-verify.md +6 -3
  34. package/.cursor/commands/oxe-workstream.md +3 -3
  35. package/.cursor/commands/oxe.md +6 -6
  36. package/.github/copilot-instructions.md +94 -4
  37. package/.github/prompts/oxe-ask.prompt.md +3 -3
  38. package/.github/prompts/oxe-capabilities.prompt.md +3 -3
  39. package/.github/prompts/oxe-checkpoint.prompt.md +3 -3
  40. package/.github/prompts/oxe-compact.prompt.md +3 -3
  41. package/.github/prompts/oxe-dashboard.prompt.md +3 -3
  42. package/.github/prompts/oxe-debug.prompt.md +3 -3
  43. package/.github/prompts/oxe-discuss.prompt.md +3 -3
  44. package/.github/prompts/oxe-execute.prompt.md +7 -4
  45. package/.github/prompts/oxe-forensics.prompt.md +3 -3
  46. package/.github/prompts/oxe-help.prompt.md +3 -3
  47. package/.github/prompts/oxe-loop.prompt.md +3 -3
  48. package/.github/prompts/oxe-milestone.prompt.md +3 -3
  49. package/.github/prompts/oxe-next.prompt.md +3 -3
  50. package/.github/prompts/oxe-obs.prompt.md +3 -3
  51. package/.github/prompts/oxe-plan-agent.prompt.md +3 -3
  52. package/.github/prompts/oxe-plan.prompt.md +3 -3
  53. package/.github/prompts/oxe-project.prompt.md +3 -3
  54. package/.github/prompts/oxe-quick.prompt.md +3 -3
  55. package/.github/prompts/oxe-research.prompt.md +3 -3
  56. package/.github/prompts/oxe-retro.prompt.md +3 -3
  57. package/.github/prompts/oxe-review-pr.prompt.md +3 -3
  58. package/.github/prompts/oxe-route.prompt.md +3 -3
  59. package/.github/prompts/oxe-scan.prompt.md +3 -3
  60. package/.github/prompts/oxe-security.prompt.md +3 -3
  61. package/.github/prompts/oxe-session.prompt.md +4 -4
  62. package/.github/prompts/oxe-ship.prompt.md +45 -0
  63. package/.github/prompts/oxe-skill.prompt.md +3 -3
  64. package/.github/prompts/oxe-spec.prompt.md +3 -3
  65. package/.github/prompts/oxe-ui-review.prompt.md +3 -3
  66. package/.github/prompts/oxe-ui-spec.prompt.md +3 -3
  67. package/.github/prompts/oxe-update.prompt.md +3 -3
  68. package/.github/prompts/oxe-validate-gaps.prompt.md +3 -3
  69. package/.github/prompts/oxe-verify.prompt.md +6 -3
  70. package/.github/prompts/oxe-workstream.prompt.md +3 -3
  71. package/.github/prompts/oxe.prompt.md +5 -5
  72. package/AGENTS.md +43 -28
  73. package/CHANGELOG.md +193 -0
  74. package/README.md +610 -529
  75. package/bin/banner.txt +1 -1
  76. package/bin/lib/oxe-agent-install.cjs +69 -69
  77. package/bin/lib/oxe-azure.cjs +1445 -1445
  78. package/bin/lib/oxe-context-engine.cjs +867 -867
  79. package/bin/lib/oxe-dashboard.cjs +76 -28
  80. package/bin/lib/oxe-operational.cjs +2144 -1340
  81. package/bin/lib/oxe-project-health.cjs +483 -1
  82. package/bin/lib/oxe-runtime-semantics.cjs +12 -0
  83. package/bin/oxe-cc.js +554 -152
  84. package/commands/oxe/ask.md +7 -3
  85. package/commands/oxe/capabilities.md +2 -2
  86. package/commands/oxe/checkpoint.md +3 -3
  87. package/commands/oxe/compact.md +3 -3
  88. package/commands/oxe/dashboard.md +2 -2
  89. package/commands/oxe/debug.md +3 -3
  90. package/commands/oxe/discuss.md +2 -2
  91. package/commands/oxe/execute.md +7 -4
  92. package/commands/oxe/forensics.md +3 -3
  93. package/commands/oxe/help.md +2 -2
  94. package/commands/oxe/loop.md +3 -3
  95. package/commands/oxe/milestone.md +3 -3
  96. package/commands/oxe/next.md +3 -3
  97. package/commands/oxe/obs.md +3 -3
  98. package/commands/oxe/oxe.md +5 -5
  99. package/commands/oxe/plan-agent.md +2 -2
  100. package/commands/oxe/plan.md +2 -2
  101. package/commands/oxe/project.md +3 -3
  102. package/commands/oxe/quick.md +2 -2
  103. package/commands/oxe/research.md +3 -3
  104. package/commands/oxe/retro.md +3 -3
  105. package/commands/oxe/review-pr.md +3 -3
  106. package/commands/oxe/route.md +3 -3
  107. package/commands/oxe/scan.md +3 -3
  108. package/commands/oxe/security.md +3 -3
  109. package/commands/oxe/session.md +4 -4
  110. package/commands/oxe/ship.md +49 -0
  111. package/commands/oxe/skill.md +2 -2
  112. package/commands/oxe/spec.md +4 -4
  113. package/commands/oxe/ui-review.md +3 -3
  114. package/commands/oxe/ui-spec.md +3 -3
  115. package/commands/oxe/update.md +2 -2
  116. package/commands/oxe/validate-gaps.md +3 -3
  117. package/commands/oxe/verify.md +7 -4
  118. package/commands/oxe/workstream.md +3 -3
  119. package/lib/runtime/audit/audit-trail.d.ts +71 -0
  120. package/lib/runtime/audit/audit-trail.js +154 -0
  121. package/lib/runtime/audit/index.d.ts +2 -0
  122. package/lib/runtime/audit/index.js +18 -0
  123. package/lib/runtime/audit/policy-pack.d.ts +15 -0
  124. package/lib/runtime/audit/policy-pack.js +57 -0
  125. package/lib/runtime/context/context-pack-builder.d.ts +15 -0
  126. package/lib/runtime/context/context-pack-builder.js +42 -0
  127. package/lib/runtime/context/context-pack-store.d.ts +38 -0
  128. package/lib/runtime/context/context-pack-store.js +142 -0
  129. package/lib/runtime/context/context-profiles.d.ts +11 -0
  130. package/lib/runtime/context/context-profiles.js +51 -0
  131. package/lib/runtime/context/index.d.ts +2 -0
  132. package/lib/runtime/context/index.js +2 -0
  133. package/lib/runtime/decision/decision-engine.d.ts +43 -0
  134. package/lib/runtime/decision/decision-engine.js +127 -0
  135. package/lib/runtime/decision/decision-memo.d.ts +53 -0
  136. package/lib/runtime/decision/decision-memo.js +173 -0
  137. package/lib/runtime/decision/index.d.ts +2 -0
  138. package/lib/runtime/decision/index.js +18 -0
  139. package/lib/runtime/delivery/branch-manager.d.ts +1 -0
  140. package/lib/runtime/delivery/branch-manager.js +7 -0
  141. package/lib/runtime/delivery/ci-checks.js +34 -1
  142. package/lib/runtime/delivery/delivery-records.d.ts +34 -0
  143. package/lib/runtime/delivery/delivery-records.js +48 -0
  144. package/lib/runtime/delivery/index.d.ts +2 -0
  145. package/lib/runtime/delivery/index.js +2 -0
  146. package/lib/runtime/delivery/promotion-pipeline.d.ts +63 -0
  147. package/lib/runtime/delivery/promotion-pipeline.js +224 -0
  148. package/lib/runtime/gate/gate-manager.d.ts +41 -0
  149. package/lib/runtime/gate/gate-manager.js +108 -1
  150. package/lib/runtime/index.d.ts +5 -2
  151. package/lib/runtime/index.js +7 -1
  152. package/lib/runtime/models/gate-decision.d.ts +4 -1
  153. package/lib/runtime/models/workspace.d.ts +3 -0
  154. package/lib/runtime/plugins/capability-adapter.d.ts +12 -0
  155. package/lib/runtime/plugins/capability-adapter.js +204 -0
  156. package/lib/runtime/plugins/capability-matrix.d.ts +25 -0
  157. package/lib/runtime/plugins/capability-matrix.js +90 -0
  158. package/lib/runtime/plugins/index.d.ts +3 -0
  159. package/lib/runtime/plugins/index.js +3 -0
  160. package/lib/runtime/plugins/plugin-abi.d.ts +2 -0
  161. package/lib/runtime/plugins/plugin-manifest.d.ts +22 -0
  162. package/lib/runtime/plugins/plugin-manifest.js +95 -0
  163. package/lib/runtime/plugins/plugin-registry.d.ts +46 -0
  164. package/lib/runtime/plugins/plugin-registry.js +84 -2
  165. package/lib/runtime/policy/policy-engine.d.ts +47 -1
  166. package/lib/runtime/policy/policy-engine.js +172 -9
  167. package/lib/runtime/projection/projection-engine.d.ts +9 -1
  168. package/lib/runtime/projection/projection-engine.js +73 -3
  169. package/lib/runtime/reducers/run-state-reducer.d.ts +26 -0
  170. package/lib/runtime/reducers/run-state-reducer.js +117 -1
  171. package/lib/runtime/scheduler/agent-registry.d.ts +44 -0
  172. package/lib/runtime/scheduler/agent-registry.js +96 -0
  173. package/lib/runtime/scheduler/agent-roles.d.ts +54 -0
  174. package/lib/runtime/scheduler/agent-roles.js +62 -0
  175. package/lib/runtime/scheduler/index.d.ts +3 -0
  176. package/lib/runtime/scheduler/index.js +3 -0
  177. package/lib/runtime/scheduler/multi-agent-coordinator.d.ts +45 -1
  178. package/lib/runtime/scheduler/multi-agent-coordinator.js +234 -35
  179. package/lib/runtime/scheduler/run-journal.d.ts +18 -0
  180. package/lib/runtime/scheduler/run-journal.js +54 -0
  181. package/lib/runtime/scheduler/scheduler.d.ts +29 -1
  182. package/lib/runtime/scheduler/scheduler.js +387 -14
  183. package/lib/runtime/verification/index.d.ts +1 -0
  184. package/lib/runtime/verification/index.js +1 -0
  185. package/lib/runtime/verification/verification-compiler.d.ts +43 -0
  186. package/lib/runtime/verification/verification-compiler.js +137 -0
  187. package/lib/runtime/verification/verification-manifest.d.ts +67 -0
  188. package/lib/runtime/verification/verification-manifest.js +179 -0
  189. package/lib/runtime/workspace/strategies/ephemeral-container.d.ts +1 -0
  190. package/lib/runtime/workspace/strategies/ephemeral-container.js +4 -0
  191. package/lib/runtime/workspace/strategies/git-worktree.d.ts +1 -0
  192. package/lib/runtime/workspace/strategies/git-worktree.js +2 -0
  193. package/lib/runtime/workspace/strategies/inplace.d.ts +1 -0
  194. package/lib/runtime/workspace/strategies/inplace.js +2 -0
  195. package/lib/runtime/workspace/workspace-manager.d.ts +2 -1
  196. package/lib/sdk/README.md +9 -9
  197. package/lib/sdk/index.cjs +33 -24
  198. package/lib/sdk/index.d.ts +149 -14
  199. package/oxe/templates/ACTIVE-RUN.template.json +32 -32
  200. package/oxe/templates/CAPABILITIES.template.md +7 -7
  201. package/oxe/templates/CAPABILITY.template.md +45 -45
  202. package/oxe/templates/CHECKPOINTS.template.md +7 -7
  203. package/oxe/templates/EXECUTION-RUNTIME.template.md +68 -68
  204. package/oxe/templates/HYPOTHESES.template.md +33 -33
  205. package/oxe/templates/LESSONS-METRICS.template.json +13 -13
  206. package/oxe/templates/NOTES.template.md +16 -16
  207. package/oxe/templates/PLAN-REVIEW.template.md +31 -31
  208. package/oxe/templates/SESSION.template.md +34 -34
  209. package/oxe/templates/SKILL.template.md +26 -26
  210. package/oxe/templates/STATE.md +55 -55
  211. package/oxe/templates/WORKFLOW_AUTHORING.md +18 -18
  212. package/oxe/workflows/ask.md +96 -92
  213. package/oxe/workflows/capabilities.md +25 -25
  214. package/oxe/workflows/checkpoint.md +14 -10
  215. package/oxe/workflows/dashboard.md +33 -33
  216. package/oxe/workflows/debug.md +19 -15
  217. package/oxe/workflows/discuss.md +12 -12
  218. package/oxe/workflows/execute.md +44 -2
  219. package/oxe/workflows/forensics.md +13 -9
  220. package/oxe/workflows/help.md +352 -304
  221. package/oxe/workflows/loop.md +17 -13
  222. package/oxe/workflows/next.md +22 -22
  223. package/oxe/workflows/obs.md +4 -0
  224. package/oxe/workflows/oxe.md +64 -31
  225. package/oxe/workflows/plan-agent.md +9 -9
  226. package/oxe/workflows/project.md +6 -1
  227. package/oxe/workflows/quick.md +10 -10
  228. package/oxe/workflows/references/reasoning-discovery.md +28 -28
  229. package/oxe/workflows/references/reasoning-execution.md +29 -29
  230. package/oxe/workflows/references/reasoning-planning.md +32 -32
  231. package/oxe/workflows/references/reasoning-review.md +29 -29
  232. package/oxe/workflows/references/reasoning-status.md +24 -24
  233. package/oxe/workflows/references/robustness-elevation.md +295 -295
  234. package/oxe/workflows/references/workflow-runtime-contracts.json +952 -907
  235. package/oxe/workflows/research.md +32 -28
  236. package/oxe/workflows/retro.md +4 -0
  237. package/oxe/workflows/review-pr.md +15 -11
  238. package/oxe/workflows/route.md +16 -16
  239. package/oxe/workflows/scan.md +4 -0
  240. package/oxe/workflows/security.md +14 -10
  241. package/oxe/workflows/session.md +213 -197
  242. package/oxe/workflows/ship.md +142 -0
  243. package/oxe/workflows/skill.md +44 -44
  244. package/oxe/workflows/spec.md +15 -0
  245. package/oxe/workflows/ui-review.md +20 -16
  246. package/oxe/workflows/ui-spec.md +7 -3
  247. package/oxe/workflows/validate-gaps.md +13 -9
  248. package/oxe/workflows/verify-audit.md +73 -73
  249. package/oxe/workflows/verify.md +52 -3
  250. package/package.json +92 -92
  251. package/packages/runtime/package.json +17 -17
  252. package/packages/runtime/src/audit/audit-trail.ts +243 -0
  253. package/packages/runtime/src/audit/index.ts +2 -0
  254. package/packages/runtime/src/audit/policy-pack.ts +62 -0
  255. package/packages/runtime/src/compiler/graph-compiler.ts +245 -245
  256. package/packages/runtime/src/compiler/index.ts +1 -1
  257. package/packages/runtime/src/context/context-pack-builder.ts +259 -193
  258. package/packages/runtime/src/context/context-pack-store.ts +197 -0
  259. package/packages/runtime/src/context/context-profiles.ts +60 -0
  260. package/packages/runtime/src/context/index.ts +3 -1
  261. package/packages/runtime/src/decision/decision-engine.ts +174 -0
  262. package/packages/runtime/src/decision/decision-memo.ts +211 -0
  263. package/packages/runtime/src/decision/index.ts +2 -0
  264. package/packages/runtime/src/delivery/branch-manager.ts +91 -84
  265. package/packages/runtime/src/delivery/ci-checks.ts +285 -252
  266. package/packages/runtime/src/delivery/delivery-records.ts +75 -0
  267. package/packages/runtime/src/delivery/index.ts +5 -3
  268. package/packages/runtime/src/delivery/pr-manager.ts +112 -112
  269. package/packages/runtime/src/delivery/promotion-pipeline.ts +334 -0
  270. package/packages/runtime/src/events/bus.ts +92 -92
  271. package/packages/runtime/src/events/catalog.ts +29 -29
  272. package/packages/runtime/src/events/envelope.ts +14 -14
  273. package/packages/runtime/src/events/index.ts +3 -3
  274. package/packages/runtime/src/evidence/evidence-store.ts +130 -130
  275. package/packages/runtime/src/evidence/index.ts +1 -1
  276. package/packages/runtime/src/gate/gate-manager.ts +289 -137
  277. package/packages/runtime/src/gate/index.ts +1 -1
  278. package/packages/runtime/src/index.ts +41 -32
  279. package/packages/runtime/src/models/attempt.ts +19 -19
  280. package/packages/runtime/src/models/evidence.ts +21 -21
  281. package/packages/runtime/src/models/gate-decision.ts +25 -21
  282. package/packages/runtime/src/models/index.ts +8 -8
  283. package/packages/runtime/src/models/run.ts +24 -24
  284. package/packages/runtime/src/models/session.ts +11 -11
  285. package/packages/runtime/src/models/verification-result.ts +10 -10
  286. package/packages/runtime/src/models/work-item.ts +25 -25
  287. package/packages/runtime/src/models/workspace.ts +31 -28
  288. package/packages/runtime/src/plugins/capability-adapter.ts +206 -0
  289. package/packages/runtime/src/plugins/capability-matrix.ts +126 -0
  290. package/packages/runtime/src/plugins/index.ts +5 -2
  291. package/packages/runtime/src/plugins/plugin-abi.ts +97 -95
  292. package/packages/runtime/src/plugins/plugin-manifest.ts +118 -0
  293. package/packages/runtime/src/plugins/plugin-registry.ts +232 -119
  294. package/packages/runtime/src/policy/index.ts +1 -1
  295. package/packages/runtime/src/policy/policy-engine.ts +330 -113
  296. package/packages/runtime/src/projection/index.ts +1 -1
  297. package/packages/runtime/src/projection/projection-engine.ts +328 -249
  298. package/packages/runtime/src/reducers/debug-reducer.ts +36 -36
  299. package/packages/runtime/src/reducers/index.ts +2 -2
  300. package/packages/runtime/src/reducers/run-state-reducer.ts +269 -127
  301. package/packages/runtime/src/scheduler/agent-registry.ts +132 -0
  302. package/packages/runtime/src/scheduler/agent-roles.ts +109 -0
  303. package/packages/runtime/src/scheduler/index.ts +4 -1
  304. package/packages/runtime/src/scheduler/multi-agent-coordinator.ts +521 -231
  305. package/packages/runtime/src/scheduler/run-journal.ts +62 -0
  306. package/packages/runtime/src/scheduler/scheduler.ts +722 -281
  307. package/packages/runtime/src/verification/index.ts +2 -1
  308. package/packages/runtime/src/verification/verification-compiler.ts +436 -225
  309. package/packages/runtime/src/verification/verification-manifest.ts +252 -0
  310. package/packages/runtime/src/workspace/index.ts +5 -5
  311. package/packages/runtime/src/workspace/strategies/ephemeral-container.ts +126 -121
  312. package/packages/runtime/src/workspace/strategies/git-worktree.ts +79 -77
  313. package/packages/runtime/src/workspace/strategies/inplace.ts +38 -35
  314. package/packages/runtime/src/workspace/workspace-manager.ts +16 -15
  315. package/packages/runtime/tsconfig.json +17 -17
  316. package/vscode-extension/.vscodeignore +7 -7
  317. package/vscode-extension/oxe-agents-1.0.0.vsix +0 -0
  318. package/vscode-extension/package.json +185 -185
  319. package/vscode-extension/src/extension.js +310 -310
  320. package/vscode-extension/src/shared/contextLoader.js +137 -137
  321. package/vscode-extension/src/shared/contractBuilder.js +159 -159
  322. package/vscode-extension/src/shared/stateReader.js +101 -101
@@ -2,13 +2,25 @@ import type { GateScope, GateDecisionValue } from '../models/gate-decision';
2
2
  export interface GateContext {
3
3
  work_item_id?: string;
4
4
  run_id?: string;
5
+ action?: string;
5
6
  description: string;
6
7
  evidence_refs: string[];
7
8
  risks: string[];
9
+ rationale?: string;
10
+ policy_decision_id?: string | null;
11
+ }
12
+ export interface GateResolutionRecord {
13
+ decision: GateDecisionValue;
14
+ actor: string;
15
+ reason?: string;
16
+ resolved_at: string;
8
17
  }
9
18
  export interface GateToken {
10
19
  gate_id: string;
11
20
  scope: GateScope;
21
+ run_id: string | null;
22
+ work_item_id: string | null;
23
+ action: string | null;
12
24
  requested_at: string;
13
25
  context: GateContext;
14
26
  status: 'pending' | 'resolved';
@@ -16,12 +28,32 @@ export interface GateToken {
16
28
  actor?: string;
17
29
  reason?: string;
18
30
  resolved_at?: string;
31
+ resolution_history?: GateResolutionRecord[];
19
32
  }
20
33
  export interface GateResolution {
21
34
  decision: GateDecisionValue;
22
35
  actor: string;
23
36
  reason?: string;
24
37
  }
38
+ export interface GateQuery {
39
+ run_id?: string | null;
40
+ status?: 'pending' | 'stale' | 'resolved' | 'all';
41
+ scope?: GateScope;
42
+ work_item_id?: string | null;
43
+ action?: string | null;
44
+ gate_sla_hours?: number;
45
+ }
46
+ export interface GateQueueSnapshot {
47
+ total: number;
48
+ gate_sla_hours: number;
49
+ pending: GateToken[];
50
+ stale_pending: GateToken[];
51
+ staleCount: number;
52
+ resolved_recent: GateToken[];
53
+ byRun: Record<string, number>;
54
+ byScope: Record<string, number>;
55
+ all: GateToken[];
56
+ }
25
57
  export declare class GateManager {
26
58
  private readonly projectRoot;
27
59
  private readonly sessionId;
@@ -34,6 +66,15 @@ export declare class GateManager {
34
66
  resolve(token: GateToken, resolution: GateResolution): Promise<GateToken>;
35
67
  isPending(scope: GateScope): boolean;
36
68
  listPending(): GateToken[];
69
+ listResolved(): GateToken[];
70
+ listPendingByRun(runId?: string): GateToken[];
71
+ listPendingForWorkItem(workItemId: string): GateToken[];
72
+ stalePending(maxAgeHours?: number): GateToken[];
73
+ listRecentResolved(maxAgeHours?: number): GateToken[];
37
74
  listAll(): GateToken[];
38
75
  get(gateId: string): GateToken | null;
76
+ filter(query?: GateQuery): GateToken[];
77
+ snapshot(maxAgeHours?: number, query?: Omit<GateQuery, 'gate_sla_hours'>): GateQueueSnapshot;
39
78
  }
79
+ export declare function listPendingGates(manager: GateManager, runId?: string, query?: Omit<GateQuery, 'run_id'>): GateQueueSnapshot;
80
+ export declare function resolveGate(manager: GateManager, gateId: string, resolution: GateResolution): Promise<GateToken>;
@@ -4,10 +4,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.GateManager = void 0;
7
+ exports.listPendingGates = listPendingGates;
8
+ exports.resolveGate = resolveGate;
7
9
  const crypto_1 = __importDefault(require("crypto"));
8
10
  const path_1 = __importDefault(require("path"));
9
11
  const fs_1 = __importDefault(require("fs"));
10
12
  const bus_1 = require("../events/bus");
13
+ function isStaleGate(gate, maxAgeHours) {
14
+ const cutoff = Date.now() - maxAgeHours * 60 * 60 * 1000;
15
+ const requested = Date.parse(gate.requested_at);
16
+ return Number.isFinite(requested) && requested <= cutoff;
17
+ }
18
+ function wasResolvedRecently(gate, maxAgeHours) {
19
+ const cutoff = Date.now() - maxAgeHours * 60 * 60 * 1000;
20
+ const resolved = Date.parse(gate.resolved_at || '');
21
+ return Number.isFinite(resolved) && resolved >= cutoff;
22
+ }
11
23
  class GateManager {
12
24
  constructor(projectRoot, sessionId, runId) {
13
25
  this.projectRoot = projectRoot;
@@ -40,9 +52,13 @@ class GateManager {
40
52
  const token = {
41
53
  gate_id: `gate-${crypto_1.default.randomBytes(4).toString('hex')}`,
42
54
  scope,
55
+ run_id: ctx.run_id ?? this.runId,
56
+ work_item_id: ctx.work_item_id ?? null,
57
+ action: ctx.action ?? null,
43
58
  requested_at: new Date().toISOString(),
44
59
  context: ctx,
45
60
  status: 'pending',
61
+ resolution_history: [],
46
62
  };
47
63
  const gates = this.readGates();
48
64
  gates.push(token);
@@ -54,9 +70,12 @@ class GateManager {
54
70
  payload: {
55
71
  gate_id: token.gate_id,
56
72
  scope,
73
+ action: token.action,
57
74
  description: ctx.description,
58
75
  evidence_refs: ctx.evidence_refs,
59
76
  risks: ctx.risks,
77
+ rationale: ctx.rationale ?? null,
78
+ policy_decision_id: ctx.policy_decision_id ?? null,
60
79
  },
61
80
  });
62
81
  return token;
@@ -66,13 +85,23 @@ class GateManager {
66
85
  const idx = gates.findIndex((g) => g.gate_id === token.gate_id);
67
86
  if (idx === -1)
68
87
  throw new Error(`Gate ${token.gate_id} not found`);
88
+ const resolvedAt = new Date().toISOString();
69
89
  const resolved = {
70
90
  ...gates[idx],
71
91
  status: 'resolved',
72
92
  decision: resolution.decision,
73
93
  actor: resolution.actor,
74
94
  reason: resolution.reason ?? undefined,
75
- resolved_at: new Date().toISOString(),
95
+ resolved_at: resolvedAt,
96
+ resolution_history: [
97
+ ...(Array.isArray(gates[idx].resolution_history) ? gates[idx].resolution_history : []),
98
+ {
99
+ decision: resolution.decision,
100
+ actor: resolution.actor,
101
+ reason: resolution.reason ?? undefined,
102
+ resolved_at: resolvedAt,
103
+ },
104
+ ],
76
105
  };
77
106
  gates[idx] = resolved;
78
107
  this.writeGates(gates);
@@ -82,8 +111,10 @@ class GateManager {
82
111
  payload: {
83
112
  gate_id: token.gate_id,
84
113
  scope: token.scope,
114
+ action: token.action,
85
115
  decision: resolution.decision,
86
116
  actor: resolution.actor,
117
+ reason: resolution.reason ?? null,
87
118
  },
88
119
  });
89
120
  return resolved;
@@ -94,11 +125,87 @@ class GateManager {
94
125
  listPending() {
95
126
  return this.readGates().filter((g) => g.status === 'pending');
96
127
  }
128
+ listResolved() {
129
+ return this.readGates().filter((g) => g.status === 'resolved');
130
+ }
131
+ listPendingByRun(runId = this.runId) {
132
+ return this.readGates().filter((g) => g.status === 'pending' && g.run_id === runId);
133
+ }
134
+ listPendingForWorkItem(workItemId) {
135
+ return this.readGates().filter((g) => g.status === 'pending' && g.work_item_id === workItemId);
136
+ }
137
+ stalePending(maxAgeHours = 24) {
138
+ return this.listPending().filter((gate) => isStaleGate(gate, maxAgeHours));
139
+ }
140
+ listRecentResolved(maxAgeHours = 24) {
141
+ return this.listResolved().filter((gate) => wasResolvedRecently(gate, maxAgeHours));
142
+ }
97
143
  listAll() {
98
144
  return this.readGates();
99
145
  }
100
146
  get(gateId) {
101
147
  return this.readGates().find((g) => g.gate_id === gateId) ?? null;
102
148
  }
149
+ filter(query = {}) {
150
+ const all = this.readGates();
151
+ const sla = query.gate_sla_hours ?? 24;
152
+ return all.filter((gate) => {
153
+ if (query.run_id && gate.run_id !== query.run_id)
154
+ return false;
155
+ if (query.scope && gate.scope !== query.scope)
156
+ return false;
157
+ if (query.work_item_id && gate.work_item_id !== query.work_item_id)
158
+ return false;
159
+ if (query.action && gate.action !== query.action)
160
+ return false;
161
+ if (query.status && query.status !== 'all') {
162
+ if (query.status === 'stale') {
163
+ if (!(gate.status === 'pending' && isStaleGate(gate, sla)))
164
+ return false;
165
+ }
166
+ else if (gate.status !== query.status) {
167
+ return false;
168
+ }
169
+ }
170
+ return true;
171
+ });
172
+ }
173
+ snapshot(maxAgeHours = 24, query = {}) {
174
+ const all = this.filter({ ...query, gate_sla_hours: maxAgeHours });
175
+ const pending = all.filter((gate) => gate.status === 'pending');
176
+ const stale_pending = pending.filter((gate) => isStaleGate(gate, maxAgeHours));
177
+ const resolved_recent = all.filter((gate) => gate.status === 'resolved' && wasResolvedRecently(gate, maxAgeHours));
178
+ const byRun = {};
179
+ const byScope = {};
180
+ for (const gate of all) {
181
+ const runKey = gate.run_id || 'unscoped';
182
+ const scopeKey = gate.scope || 'unknown';
183
+ byRun[runKey] = (byRun[runKey] || 0) + 1;
184
+ byScope[scopeKey] = (byScope[scopeKey] || 0) + 1;
185
+ }
186
+ return {
187
+ total: all.length,
188
+ gate_sla_hours: maxAgeHours,
189
+ pending,
190
+ stale_pending,
191
+ staleCount: stale_pending.length,
192
+ resolved_recent,
193
+ byRun,
194
+ byScope,
195
+ all,
196
+ };
197
+ }
103
198
  }
104
199
  exports.GateManager = GateManager;
200
+ function listPendingGates(manager, runId, query = {}) {
201
+ return manager.snapshot(query.gate_sla_hours ?? 24, {
202
+ ...query,
203
+ run_id: runId ?? undefined,
204
+ });
205
+ }
206
+ async function resolveGate(manager, gateId, resolution) {
207
+ const token = manager.get(gateId);
208
+ if (!token)
209
+ throw new Error(`Gate ${gateId} not found`);
210
+ return manager.resolve(token, resolution);
211
+ }
@@ -5,8 +5,9 @@ export * from './compiler/index';
5
5
  export * from './scheduler/index';
6
6
  export * from './workspace/index';
7
7
  export * from './evidence/index';
8
- export { compile as compileVerification, runCheck, runSuite, summarizeSuite, } from './verification/verification-compiler';
9
- export type { CheckType, AcceptanceCheck, AcceptanceCheckSuite, CheckResult, } from './verification/verification-compiler';
8
+ export { compile as compileVerification, runCheck, runSuite, executeSuite, verifyRun, summarizeSuite, } from './verification/verification-compiler';
9
+ export type { CheckType, AcceptanceCheck, AcceptanceCheckSuite, CheckResult, ExecutedVerificationSuite, VerifyRunResult, } from './verification/verification-compiler';
10
+ export * from './verification/verification-manifest';
10
11
  export * from './policy/index';
11
12
  export * from './gate/index';
12
13
  export * from './projection/index';
@@ -14,3 +15,5 @@ export * from './plugins/index';
14
15
  export * from './delivery/index';
15
16
  export * from './context/index';
16
17
  export * from './scheduler/multi-agent-coordinator';
18
+ export * from './decision/index';
19
+ export * from './audit/index';
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.summarizeSuite = exports.runSuite = exports.runCheck = exports.compileVerification = void 0;
17
+ exports.summarizeSuite = exports.verifyRun = exports.executeSuite = exports.runSuite = exports.runCheck = exports.compileVerification = void 0;
18
18
  // R1 Public ABI — OXE Runtime Foundation
19
19
  __exportStar(require("./models/index"), exports);
20
20
  __exportStar(require("./events/index"), exports);
@@ -29,7 +29,10 @@ var verification_compiler_1 = require("./verification/verification-compiler");
29
29
  Object.defineProperty(exports, "compileVerification", { enumerable: true, get: function () { return verification_compiler_1.compile; } });
30
30
  Object.defineProperty(exports, "runCheck", { enumerable: true, get: function () { return verification_compiler_1.runCheck; } });
31
31
  Object.defineProperty(exports, "runSuite", { enumerable: true, get: function () { return verification_compiler_1.runSuite; } });
32
+ Object.defineProperty(exports, "executeSuite", { enumerable: true, get: function () { return verification_compiler_1.executeSuite; } });
33
+ Object.defineProperty(exports, "verifyRun", { enumerable: true, get: function () { return verification_compiler_1.verifyRun; } });
32
34
  Object.defineProperty(exports, "summarizeSuite", { enumerable: true, get: function () { return verification_compiler_1.summarizeSuite; } });
35
+ __exportStar(require("./verification/verification-manifest"), exports);
33
36
  __exportStar(require("./policy/index"), exports);
34
37
  __exportStar(require("./gate/index"), exports);
35
38
  __exportStar(require("./projection/index"), exports);
@@ -38,3 +41,6 @@ __exportStar(require("./plugins/index"), exports);
38
41
  __exportStar(require("./delivery/index"), exports);
39
42
  __exportStar(require("./context/index"), exports);
40
43
  __exportStar(require("./scheduler/multi-agent-coordinator"), exports);
44
+ // R4 Public ABI — Decision, Audit & Enterprise
45
+ __exportStar(require("./decision/index"), exports);
46
+ __exportStar(require("./audit/index"), exports);
@@ -1,8 +1,11 @@
1
1
  export type GateDecisionValue = 'approved' | 'rejected' | 'approved_with_caveats' | 'needs_more_evidence';
2
- export type GateScope = 'plan_approval' | 'critical_mutation' | 'security' | 'pr_promotion' | 'merge';
2
+ export type GateScope = 'plan_approval' | 'critical_mutation' | 'security' | 'pr_promotion' | 'remote_promotion' | 'merge';
3
3
  export interface GateDecision {
4
4
  gate_id: string;
5
5
  scope: GateScope;
6
+ run_id?: string | null;
7
+ work_item_id?: string | null;
8
+ action?: string | null;
6
9
  decision: GateDecisionValue;
7
10
  actor: string;
8
11
  reason: string | null;
@@ -1,8 +1,10 @@
1
1
  export type WorkspaceStrategy = 'inplace' | 'git_worktree' | 'ephemeral_container';
2
2
  export type WorkspaceStatus = 'allocating' | 'ready' | 'dirty' | 'disposed' | 'error';
3
+ export type WorkspaceIsolationLevel = 'shared' | 'isolated';
3
4
  export interface Workspace {
4
5
  workspace_id: string;
5
6
  strategy: WorkspaceStrategy;
7
+ isolation_level: WorkspaceIsolationLevel;
6
8
  base_commit: string | null;
7
9
  branch: string | null;
8
10
  container_ref: string | null;
@@ -12,6 +14,7 @@ export interface Workspace {
12
14
  export interface WorkspaceLease {
13
15
  workspace_id: string;
14
16
  strategy: WorkspaceStrategy;
17
+ isolation_level: WorkspaceIsolationLevel;
15
18
  branch: string | null;
16
19
  base_commit: string | null;
17
20
  root_path: string;
@@ -0,0 +1,12 @@
1
+ import type { OxePlugin } from './plugin-abi';
2
+ interface CapabilityManifest {
3
+ id: string;
4
+ entrypoint: string | null;
5
+ sideEffects: string[];
6
+ evidenceOutputs: string[];
7
+ checkTypes: string[];
8
+ dir: string;
9
+ }
10
+ export declare function createCapabilityPlugin(projectRoot: string, manifest: CapabilityManifest): OxePlugin;
11
+ export declare function loadCapabilityPlugins(projectRoot: string): OxePlugin[];
12
+ export {};
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createCapabilityPlugin = createCapabilityPlugin;
7
+ exports.loadCapabilityPlugins = loadCapabilityPlugins;
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const child_process_1 = require("child_process");
11
+ const plugin_manifest_1 = require("./plugin-manifest");
12
+ function parseFrontmatter(text) {
13
+ const match = String(text || '').match(/^---\r?\n([\s\S]*?)\r?\n---/);
14
+ if (!match)
15
+ return {};
16
+ const out = {};
17
+ for (const line of match[1].split(/\r?\n/)) {
18
+ const trimmed = line.trim();
19
+ if (!trimmed || trimmed.startsWith('#'))
20
+ continue;
21
+ const idx = trimmed.indexOf(':');
22
+ if (idx === -1)
23
+ continue;
24
+ out[trimmed.slice(0, idx).trim()] = trimmed.slice(idx + 1).trim();
25
+ }
26
+ return out;
27
+ }
28
+ function parseArrayField(value) {
29
+ const raw = String(value || '').trim();
30
+ if (!raw || raw === '[]')
31
+ return [];
32
+ if (/^\[.*\]$/.test(raw)) {
33
+ return raw
34
+ .slice(1, -1)
35
+ .split(',')
36
+ .map((item) => item.trim().replace(/^['"`]|['"`]$/g, ''))
37
+ .filter(Boolean);
38
+ }
39
+ return raw.split(',').map((item) => item.trim()).filter(Boolean);
40
+ }
41
+ function loadCapabilityManifests(projectRoot) {
42
+ const capabilitiesDir = path_1.default.join(projectRoot, '.oxe', 'capabilities');
43
+ if (!fs_1.default.existsSync(capabilitiesDir))
44
+ return [];
45
+ return fs_1.default
46
+ .readdirSync(capabilitiesDir, { withFileTypes: true })
47
+ .filter((entry) => entry.isDirectory())
48
+ .map((entry) => {
49
+ const dir = path_1.default.join(capabilitiesDir, entry.name);
50
+ const manifestPath = path_1.default.join(dir, 'CAPABILITY.md');
51
+ if (!fs_1.default.existsSync(manifestPath))
52
+ return null;
53
+ const raw = fs_1.default.readFileSync(manifestPath, 'utf8');
54
+ const fm = parseFrontmatter(raw);
55
+ const id = String(fm.id || '').trim();
56
+ if (!id)
57
+ return null;
58
+ return {
59
+ id,
60
+ entrypoint: String(fm.entrypoint || '').trim() || null,
61
+ sideEffects: parseArrayField(fm.side_effects),
62
+ evidenceOutputs: parseArrayField(fm.evidence_outputs),
63
+ checkTypes: parseArrayField(fm.check_types || fm.supports_checks),
64
+ dir,
65
+ };
66
+ })
67
+ .filter((item) => Boolean(item));
68
+ }
69
+ function resolveEntrypoint(projectRoot, manifest) {
70
+ if (!manifest.entrypoint)
71
+ return null;
72
+ if (path_1.default.isAbsolute(manifest.entrypoint))
73
+ return manifest.entrypoint;
74
+ const capabilityRelative = path_1.default.join(manifest.dir, manifest.entrypoint);
75
+ if (fs_1.default.existsSync(capabilityRelative))
76
+ return capabilityRelative;
77
+ const projectRelative = path_1.default.join(projectRoot, manifest.entrypoint);
78
+ if (fs_1.default.existsSync(projectRelative))
79
+ return projectRelative;
80
+ return capabilityRelative;
81
+ }
82
+ function resolveEvidencePaths(projectRoot, manifest) {
83
+ return manifest.evidenceOutputs
84
+ .map((entry) => {
85
+ const capabilityRelative = path_1.default.join(manifest.dir, entry);
86
+ if (fs_1.default.existsSync(capabilityRelative))
87
+ return path_1.default.relative(projectRoot, capabilityRelative);
88
+ const projectRelative = path_1.default.join(projectRoot, entry);
89
+ if (fs_1.default.existsSync(projectRelative))
90
+ return path_1.default.relative(projectRoot, projectRelative);
91
+ return path_1.default.relative(projectRoot, projectRelative);
92
+ })
93
+ .map((entry) => entry.replace(/\\/g, '/'));
94
+ }
95
+ function inferToolKind(sideEffects) {
96
+ if (sideEffects.some((effect) => /db|infra|network|external/i.test(effect)))
97
+ return 'external_operation';
98
+ if (sideEffects.some((effect) => /write|mutat|git/i.test(effect)))
99
+ return 'mutation';
100
+ if (sideEffects.some((effect) => /verify|test|evidence/i.test(effect)))
101
+ return 'verification';
102
+ if (sideEffects.some((effect) => /analysis|scan|read/i.test(effect)))
103
+ return 'analysis';
104
+ return 'read';
105
+ }
106
+ function buildToolProvider(projectRoot, manifest) {
107
+ return {
108
+ name: manifest.id,
109
+ kind: inferToolKind(manifest.sideEffects),
110
+ idempotent: !manifest.sideEffects.some((effect) => /write|mutat|git|db|infra/i.test(effect)),
111
+ supports(actionType) {
112
+ return actionType === manifest.id || actionType === `capability:${manifest.id}`;
113
+ },
114
+ async invoke(input) {
115
+ const entrypoint = resolveEntrypoint(projectRoot, manifest);
116
+ if (!entrypoint) {
117
+ return {
118
+ success: false,
119
+ output: '',
120
+ evidence_paths: [],
121
+ side_effects_applied: [],
122
+ error: `Capability ${manifest.id} does not declare an entrypoint`,
123
+ };
124
+ }
125
+ const ext = path_1.default.extname(entrypoint).toLowerCase();
126
+ const env = {
127
+ ...process.env,
128
+ OXE_CAPABILITY_INPUT: JSON.stringify(input.params || {}),
129
+ OXE_CAPABILITY_RUN_ID: input.run_id,
130
+ OXE_CAPABILITY_WORK_ITEM_ID: input.work_item_id,
131
+ OXE_CAPABILITY_ATTEMPT_ID: input.attempt_id,
132
+ OXE_CAPABILITY_WORKSPACE_ROOT: input.workspace_root,
133
+ };
134
+ let program = entrypoint;
135
+ let args = [];
136
+ if (ext === '.js' || ext === '.cjs' || ext === '.mjs') {
137
+ program = process.execPath;
138
+ args = [entrypoint];
139
+ }
140
+ else if (ext === '.ps1') {
141
+ program = 'powershell';
142
+ args = ['-File', entrypoint];
143
+ }
144
+ const result = (0, child_process_1.spawnSync)(program, args, {
145
+ cwd: projectRoot,
146
+ encoding: 'utf8',
147
+ env,
148
+ });
149
+ return {
150
+ success: result.status === 0 && !result.error,
151
+ output: [result.stdout || '', result.stderr || ''].filter(Boolean).join('\n').trim(),
152
+ evidence_paths: resolveEvidencePaths(projectRoot, manifest),
153
+ side_effects_applied: manifest.sideEffects,
154
+ error: result.error ? String(result.error) : result.status === 0 ? undefined : (result.stderr || result.stdout || `Capability exited with status ${result.status}`),
155
+ };
156
+ },
157
+ };
158
+ }
159
+ function buildVerifierProvider(projectRoot, manifest) {
160
+ if (!manifest.checkTypes.length)
161
+ return null;
162
+ return {
163
+ name: `${manifest.id}-verifier`,
164
+ supports(checkType) {
165
+ return manifest.checkTypes.includes(checkType);
166
+ },
167
+ async execute(input) {
168
+ const tool = await buildToolProvider(projectRoot, manifest).invoke({
169
+ action_type: `verify:${input.check_type}`,
170
+ work_item_id: input.work_item_id,
171
+ run_id: input.work_item_id,
172
+ attempt_id: `${input.work_item_id}-verify`,
173
+ params: {
174
+ check_id: input.check_id,
175
+ check_type: input.check_type,
176
+ command: input.command,
177
+ evidence_dir: input.evidence_dir,
178
+ },
179
+ workspace_root: input.workspace_root,
180
+ });
181
+ return {
182
+ verification_id: `vr-${manifest.id}-${input.check_id}`,
183
+ work_item_id: input.work_item_id,
184
+ check_id: input.check_id,
185
+ status: tool.success ? 'pass' : 'fail',
186
+ evidence_refs: tool.evidence_paths,
187
+ summary: tool.error || tool.output || null,
188
+ };
189
+ },
190
+ };
191
+ }
192
+ function createCapabilityPlugin(projectRoot, manifest) {
193
+ const verifierProvider = buildVerifierProvider(projectRoot, manifest);
194
+ return {
195
+ name: `capability:${manifest.id}`,
196
+ version: '0.0.0',
197
+ abi_version: plugin_manifest_1.CURRENT_ABI_VERSION,
198
+ toolProviders: [buildToolProvider(projectRoot, manifest)],
199
+ verifierProviders: verifierProvider ? [verifierProvider] : [],
200
+ };
201
+ }
202
+ function loadCapabilityPlugins(projectRoot) {
203
+ return loadCapabilityManifests(projectRoot).map((manifest) => createCapabilityPlugin(projectRoot, manifest));
204
+ }
@@ -0,0 +1,25 @@
1
+ import type { PluginRegistry } from './plugin-registry';
2
+ export type ApiStability = 'stable' | 'experimental' | 'deprecated';
3
+ export interface ProviderCapabilityEntry {
4
+ plugin: string;
5
+ name: string;
6
+ capability: string;
7
+ provider_type: 'tool' | 'workspace' | 'verifier' | 'context';
8
+ stability: ApiStability;
9
+ abi_version: string;
10
+ since_abi_version: string;
11
+ supported: string[];
12
+ fallback_available: boolean;
13
+ deprecated_in?: string;
14
+ replacement?: string;
15
+ }
16
+ export interface CapabilityMatrix {
17
+ abi_version: string;
18
+ entries: ProviderCapabilityEntry[];
19
+ }
20
+ export declare function buildMatrix(registry: PluginRegistry): CapabilityMatrix;
21
+ export declare function getStableEntries(matrix: CapabilityMatrix): ProviderCapabilityEntry[];
22
+ export declare function getExperimentalEntries(matrix: CapabilityMatrix): ProviderCapabilityEntry[];
23
+ export declare function getDeprecatedEntries(matrix: CapabilityMatrix): ProviderCapabilityEntry[];
24
+ export declare function markDeprecated(matrix: CapabilityMatrix, name: string, deprecatedIn: string, replacement?: string): CapabilityMatrix;
25
+ export declare function addEntry(matrix: CapabilityMatrix, entry: ProviderCapabilityEntry): CapabilityMatrix;
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildMatrix = buildMatrix;
4
+ exports.getStableEntries = getStableEntries;
5
+ exports.getExperimentalEntries = getExperimentalEntries;
6
+ exports.getDeprecatedEntries = getDeprecatedEntries;
7
+ exports.markDeprecated = markDeprecated;
8
+ exports.addEntry = addEntry;
9
+ const plugin_manifest_1 = require("./plugin-manifest");
10
+ function buildMatrix(registry) {
11
+ const entries = [];
12
+ for (const plugin of registry.snapshot()) {
13
+ for (const provider of plugin.toolProviders) {
14
+ entries.push({
15
+ plugin: plugin.name,
16
+ name: provider.name,
17
+ capability: provider.name,
18
+ provider_type: 'tool',
19
+ stability: 'stable',
20
+ abi_version: plugin.abi_version ?? plugin_manifest_1.CURRENT_ABI_VERSION,
21
+ since_abi_version: plugin_manifest_1.CURRENT_ABI_VERSION,
22
+ supported: ['read_code', 'generate_patch', 'run_tests', 'collect_evidence', 'custom'].filter((action) => registry.toolProviderFor(action)?.name === provider.name),
23
+ fallback_available: true,
24
+ });
25
+ }
26
+ for (const provider of plugin.workspaceProviders) {
27
+ entries.push({
28
+ plugin: plugin.name,
29
+ name: provider.name,
30
+ capability: provider.name,
31
+ provider_type: 'workspace',
32
+ stability: 'stable',
33
+ abi_version: plugin.abi_version ?? plugin_manifest_1.CURRENT_ABI_VERSION,
34
+ since_abi_version: plugin_manifest_1.CURRENT_ABI_VERSION,
35
+ supported: [provider.name],
36
+ fallback_available: true,
37
+ });
38
+ }
39
+ for (const provider of plugin.verifierProviders) {
40
+ entries.push({
41
+ plugin: plugin.name,
42
+ name: provider.name,
43
+ capability: provider.name,
44
+ provider_type: 'verifier',
45
+ stability: 'stable',
46
+ abi_version: plugin.abi_version ?? plugin_manifest_1.CURRENT_ABI_VERSION,
47
+ since_abi_version: plugin_manifest_1.CURRENT_ABI_VERSION,
48
+ supported: ['unit', 'integration', 'smoke', 'policy', 'security', 'custom'].filter((checkType) => registry.verifierProviderFor(checkType)?.name === provider.name),
49
+ fallback_available: true,
50
+ });
51
+ }
52
+ for (const provider of plugin.contextProviders) {
53
+ entries.push({
54
+ plugin: plugin.name,
55
+ name: provider.name,
56
+ capability: provider.name,
57
+ provider_type: 'context',
58
+ stability: 'stable',
59
+ abi_version: plugin.abi_version ?? plugin_manifest_1.CURRENT_ABI_VERSION,
60
+ since_abi_version: plugin_manifest_1.CURRENT_ABI_VERSION,
61
+ supported: [provider.name],
62
+ fallback_available: false,
63
+ });
64
+ }
65
+ }
66
+ return { abi_version: plugin_manifest_1.CURRENT_ABI_VERSION, entries };
67
+ }
68
+ function getStableEntries(matrix) {
69
+ return matrix.entries.filter((e) => e.stability === 'stable');
70
+ }
71
+ function getExperimentalEntries(matrix) {
72
+ return matrix.entries.filter((e) => e.stability === 'experimental');
73
+ }
74
+ function getDeprecatedEntries(matrix) {
75
+ return matrix.entries.filter((e) => e.stability === 'deprecated');
76
+ }
77
+ function markDeprecated(matrix, name, deprecatedIn, replacement) {
78
+ return {
79
+ ...matrix,
80
+ entries: matrix.entries.map((e) => e.name === name
81
+ ? { ...e, stability: 'deprecated', deprecated_in: deprecatedIn, replacement }
82
+ : e),
83
+ };
84
+ }
85
+ function addEntry(matrix, entry) {
86
+ if (matrix.entries.some((e) => e.name === entry.name && e.provider_type === entry.provider_type)) {
87
+ return matrix;
88
+ }
89
+ return { ...matrix, entries: [...matrix.entries, entry] };
90
+ }
@@ -1,2 +1,5 @@
1
1
  export * from './plugin-abi';
2
2
  export * from './plugin-registry';
3
+ export * from './plugin-manifest';
4
+ export * from './capability-matrix';
5
+ export * from './capability-adapter';
@@ -16,3 +16,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./plugin-abi"), exports);
18
18
  __exportStar(require("./plugin-registry"), exports);
19
+ __exportStar(require("./plugin-manifest"), exports);
20
+ __exportStar(require("./capability-matrix"), exports);
21
+ __exportStar(require("./capability-adapter"), exports);