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
@@ -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,8 @@ 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
10
  export * from './verification/verification-manifest';
11
11
  export * from './policy/index';
12
12
  export * from './gate/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,6 +29,8 @@ 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; } });
33
35
  __exportStar(require("./verification/verification-manifest"), exports);
34
36
  __exportStar(require("./policy/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
+ }
@@ -1,10 +1,15 @@
1
1
  import type { PluginRegistry } from './plugin-registry';
2
2
  export type ApiStability = 'stable' | 'experimental' | 'deprecated';
3
3
  export interface ProviderCapabilityEntry {
4
+ plugin: string;
4
5
  name: string;
6
+ capability: string;
5
7
  provider_type: 'tool' | 'workspace' | 'verifier' | 'context';
6
8
  stability: ApiStability;
9
+ abi_version: string;
7
10
  since_abi_version: string;
11
+ supported: string[];
12
+ fallback_available: boolean;
8
13
  deprecated_in?: string;
9
14
  replacement?: string;
10
15
  }
@@ -9,26 +9,57 @@ exports.addEntry = addEntry;
9
9
  const plugin_manifest_1 = require("./plugin-manifest");
10
10
  function buildMatrix(registry) {
11
11
  const entries = [];
12
- for (const plugin of registry.list()) {
13
- const providers = plugin.providers ?? [];
14
- for (const prov of providers) {
15
- let provider_type;
16
- if (prov.startsWith('tool:'))
17
- provider_type = 'tool';
18
- else if (prov.startsWith('workspace:'))
19
- provider_type = 'workspace';
20
- else if (prov.startsWith('verifier:'))
21
- provider_type = 'verifier';
22
- else if (prov.startsWith('context:'))
23
- provider_type = 'context';
24
- else
25
- continue;
26
- const name = prov.slice(prov.indexOf(':') + 1);
12
+ for (const plugin of registry.snapshot()) {
13
+ for (const provider of plugin.toolProviders) {
27
14
  entries.push({
28
- name,
29
- provider_type,
15
+ plugin: plugin.name,
16
+ name: provider.name,
17
+ capability: provider.name,
18
+ provider_type: 'tool',
30
19
  stability: 'stable',
20
+ abi_version: plugin.abi_version ?? plugin_manifest_1.CURRENT_ABI_VERSION,
31
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,
32
63
  });
33
64
  }
34
65
  }
@@ -2,3 +2,4 @@ export * from './plugin-abi';
2
2
  export * from './plugin-registry';
3
3
  export * from './plugin-manifest';
4
4
  export * from './capability-matrix';
5
+ export * from './capability-adapter';
@@ -18,3 +18,4 @@ __exportStar(require("./plugin-abi"), exports);
18
18
  __exportStar(require("./plugin-registry"), exports);
19
19
  __exportStar(require("./plugin-manifest"), exports);
20
20
  __exportStar(require("./capability-matrix"), exports);
21
+ __exportStar(require("./capability-adapter"), exports);
@@ -24,6 +24,7 @@ export interface ToolProvider {
24
24
  }
25
25
  export interface WorkspaceProvider extends WorkspaceManager {
26
26
  readonly name: string;
27
+ readonly isolation_level: 'shared' | 'isolated';
27
28
  supportsStrategy(strategy: string): boolean;
28
29
  }
29
30
  export interface VerificationInput {
@@ -67,6 +68,7 @@ export interface ContextProvider {
67
68
  export interface OxePlugin {
68
69
  readonly name: string;
69
70
  readonly version?: string;
71
+ readonly abi_version?: string;
70
72
  toolProviders?: ToolProvider[];
71
73
  workspaceProviders?: WorkspaceProvider[];
72
74
  verifierProviders?: VerifierProvider[];
@@ -1,5 +1,5 @@
1
1
  import type { OxePlugin } from './plugin-abi';
2
- export declare const CURRENT_ABI_VERSION = "1.0.0";
2
+ export declare const CURRENT_ABI_VERSION = "1";
3
3
  export interface PluginManifest {
4
4
  name: string;
5
5
  version: string;
@@ -5,7 +5,7 @@ exports.extractManifest = extractManifest;
5
5
  exports.validatePlugin = validatePlugin;
6
6
  exports.isAbiCompatible = isAbiCompatible;
7
7
  exports.sandboxInvoke = sandboxInvoke;
8
- exports.CURRENT_ABI_VERSION = '1.0.0';
8
+ exports.CURRENT_ABI_VERSION = '1';
9
9
  function extractManifest(plugin) {
10
10
  const capabilities = [];
11
11
  if (plugin.toolProviders?.length)
@@ -21,7 +21,7 @@ function extractManifest(plugin) {
21
21
  return {
22
22
  name: plugin.name,
23
23
  version: plugin.version ?? '0.0.0',
24
- abi_version: exports.CURRENT_ABI_VERSION,
24
+ abi_version: plugin.abi_version ?? exports.CURRENT_ABI_VERSION,
25
25
  capabilities,
26
26
  tool_action_types: plugin.toolProviders?.flatMap((p) => ['read_code', 'generate_patch', 'run_tests', 'collect_evidence', 'custom'].filter((t) => p.supports(t))) ?? [],
27
27
  workspace_strategies: plugin.workspaceProviders?.map((p) => p.name) ?? [],
@@ -39,6 +39,10 @@ function validatePlugin(plugin) {
39
39
  if (plugin.version && !/^\d+\.\d+\.\d+/.test(plugin.version)) {
40
40
  warnings.push(`Plugin version "${plugin.version}" does not follow semver`);
41
41
  }
42
+ const abiVersion = plugin.abi_version ?? exports.CURRENT_ABI_VERSION;
43
+ if (!isAbiCompatible(abiVersion)) {
44
+ errors.push(`Plugin ABI "${abiVersion}" is incompatible with runtime ABI "${exports.CURRENT_ABI_VERSION}"`);
45
+ }
42
46
  if (!plugin.toolProviders?.length &&
43
47
  !plugin.workspaceProviders?.length &&
44
48
  !plugin.verifierProviders?.length &&
@@ -1,6 +1,8 @@
1
1
  import type { OxePlugin, ToolProvider, WorkspaceProvider, VerifierProvider, ContextProvider } from './plugin-abi';
2
+ import { type CapabilityMatrix } from './capability-matrix';
2
3
  export declare class PluginRegistry {
3
4
  private plugins;
5
+ private loadErrors;
4
6
  register(plugin: OxePlugin): void;
5
7
  unregister(name: string): void;
6
8
  loadFromDirectory(dir: string): string[];
@@ -16,6 +18,50 @@ export declare class PluginRegistry {
16
18
  version?: string;
17
19
  providers: string[];
18
20
  }>;
21
+ registerProjectCapabilities(projectRoot: string): string[];
22
+ loadErrorsSnapshot(): string[];
23
+ clearLoadErrors(): void;
24
+ snapshot(): Array<{
25
+ name: string;
26
+ version?: string;
27
+ abi_version?: string;
28
+ toolProviders: Array<{
29
+ name: string;
30
+ kind: string;
31
+ idempotent: boolean;
32
+ }>;
33
+ workspaceProviders: Array<{
34
+ name: string;
35
+ }>;
36
+ verifierProviders: Array<{
37
+ name: string;
38
+ }>;
39
+ contextProviders: Array<{
40
+ name: string;
41
+ }>;
42
+ }>;
43
+ summary(): {
44
+ total_plugins: number;
45
+ tool_providers: number;
46
+ workspace_providers: number;
47
+ verifier_providers: number;
48
+ context_providers: number;
49
+ load_errors: number;
50
+ pluginsCount: number;
51
+ toolProviders: number;
52
+ workspaceProviders: number;
53
+ verifierProviders: number;
54
+ contextProviders: number;
55
+ loadErrors: number;
56
+ plugins: Array<{
57
+ name: string;
58
+ version?: string;
59
+ providers: string[];
60
+ }>;
61
+ };
62
+ capabilityMatrix(): CapabilityMatrix;
19
63
  }
20
64
  export declare function globalRegistry(): PluginRegistry;
21
65
  export declare function resetGlobalRegistry(): void;
66
+ export declare function registrySummary(registry: PluginRegistry): ReturnType<PluginRegistry['summary']>;
67
+ export declare function resolveCapabilityMatrix(registry: PluginRegistry): CapabilityMatrix;