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
@@ -1,95 +1,97 @@
1
- import type { WorkspaceRequest, WorkspaceManager } from '../workspace/workspace-manager';
2
- import type { WorkspaceLease, SnapshotRef } from '../models/workspace';
3
- import type { VerificationResult } from '../models/verification-result';
4
-
5
- // ─── ToolProvider ────────────────────────────────────────────────────────────
6
-
7
- export interface ToolInvocationInput {
8
- action_type: string;
9
- work_item_id: string;
10
- run_id: string;
11
- attempt_id: string;
12
- params: Record<string, unknown>;
13
- workspace_root: string;
14
- }
15
-
16
- export interface ToolInvocationResult {
17
- success: boolean;
18
- output: string;
19
- evidence_paths: string[];
20
- side_effects_applied: string[];
21
- error?: string;
22
- }
23
-
24
- export interface ToolProvider {
25
- readonly name: string;
26
- readonly kind: 'read' | 'mutation' | 'verification' | 'analysis' | 'external_operation';
27
- readonly idempotent: boolean;
28
- supports(actionType: string): boolean;
29
- invoke(input: ToolInvocationInput): Promise<ToolInvocationResult>;
30
- }
31
-
32
- // ─── WorkspaceProvider ───────────────────────────────────────────────────────
33
-
34
- export interface WorkspaceProvider extends WorkspaceManager {
35
- readonly name: string;
36
- supportsStrategy(strategy: string): boolean;
37
- }
38
-
39
- // ─── VerifierProvider ────────────────────────────────────────────────────────
40
-
41
- export interface VerificationInput {
42
- check_id: string;
43
- check_type: string;
44
- command: string | null;
45
- work_item_id: string;
46
- workspace_root: string;
47
- evidence_dir: string;
48
- }
49
-
50
- export interface VerifierProvider {
51
- readonly name: string;
52
- supports(checkType: string): boolean;
53
- execute(input: VerificationInput): Promise<VerificationResult>;
54
- }
55
-
56
- // ─── ContextProvider ─────────────────────────────────────────────────────────
57
-
58
- export interface ContextRequest {
59
- work_item_id: string;
60
- run_id: string;
61
- decision_type: 'execute' | 'verify' | 'plan' | 'review';
62
- artifact_paths: string[];
63
- project_root: string;
64
- }
65
-
66
- export interface PluginContextArtifact {
67
- source: string;
68
- weight: number;
69
- reason: string;
70
- content?: string;
71
- }
72
-
73
- export interface PluginContextArtifacts {
74
- included: PluginContextArtifact[];
75
- excluded: Array<{ source: string; reason: string }>;
76
- total_weight: number;
77
- }
78
-
79
- export interface ContextProvider {
80
- readonly name: string;
81
- collect(input: ContextRequest): Promise<PluginContextArtifacts>;
82
- }
83
-
84
- // ─── OxePlugin (unified) ─────────────────────────────────────────────────────
85
-
86
- export interface OxePlugin {
87
- readonly name: string;
88
- readonly version?: string;
89
- toolProviders?: ToolProvider[];
90
- workspaceProviders?: WorkspaceProvider[];
91
- verifierProviders?: VerifierProvider[];
92
- contextProviders?: ContextProvider[];
93
- /** Legacy lifecycle hooks (compatible with oxe-plugins.cjs) */
94
- hooks?: Record<string, (ctx: Record<string, unknown>) => Promise<void> | void>;
95
- }
1
+ import type { WorkspaceRequest, WorkspaceManager } from '../workspace/workspace-manager';
2
+ import type { WorkspaceLease, SnapshotRef } from '../models/workspace';
3
+ import type { VerificationResult } from '../models/verification-result';
4
+
5
+ // ─── ToolProvider ────────────────────────────────────────────────────────────
6
+
7
+ export interface ToolInvocationInput {
8
+ action_type: string;
9
+ work_item_id: string;
10
+ run_id: string;
11
+ attempt_id: string;
12
+ params: Record<string, unknown>;
13
+ workspace_root: string;
14
+ }
15
+
16
+ export interface ToolInvocationResult {
17
+ success: boolean;
18
+ output: string;
19
+ evidence_paths: string[];
20
+ side_effects_applied: string[];
21
+ error?: string;
22
+ }
23
+
24
+ export interface ToolProvider {
25
+ readonly name: string;
26
+ readonly kind: 'read' | 'mutation' | 'verification' | 'analysis' | 'external_operation';
27
+ readonly idempotent: boolean;
28
+ supports(actionType: string): boolean;
29
+ invoke(input: ToolInvocationInput): Promise<ToolInvocationResult>;
30
+ }
31
+
32
+ // ─── WorkspaceProvider ───────────────────────────────────────────────────────
33
+
34
+ export interface WorkspaceProvider extends WorkspaceManager {
35
+ readonly name: string;
36
+ readonly isolation_level: 'shared' | 'isolated';
37
+ supportsStrategy(strategy: string): boolean;
38
+ }
39
+
40
+ // ─── VerifierProvider ────────────────────────────────────────────────────────
41
+
42
+ export interface VerificationInput {
43
+ check_id: string;
44
+ check_type: string;
45
+ command: string | null;
46
+ work_item_id: string;
47
+ workspace_root: string;
48
+ evidence_dir: string;
49
+ }
50
+
51
+ export interface VerifierProvider {
52
+ readonly name: string;
53
+ supports(checkType: string): boolean;
54
+ execute(input: VerificationInput): Promise<VerificationResult>;
55
+ }
56
+
57
+ // ─── ContextProvider ─────────────────────────────────────────────────────────
58
+
59
+ export interface ContextRequest {
60
+ work_item_id: string;
61
+ run_id: string;
62
+ decision_type: 'execute' | 'verify' | 'plan' | 'review';
63
+ artifact_paths: string[];
64
+ project_root: string;
65
+ }
66
+
67
+ export interface PluginContextArtifact {
68
+ source: string;
69
+ weight: number;
70
+ reason: string;
71
+ content?: string;
72
+ }
73
+
74
+ export interface PluginContextArtifacts {
75
+ included: PluginContextArtifact[];
76
+ excluded: Array<{ source: string; reason: string }>;
77
+ total_weight: number;
78
+ }
79
+
80
+ export interface ContextProvider {
81
+ readonly name: string;
82
+ collect(input: ContextRequest): Promise<PluginContextArtifacts>;
83
+ }
84
+
85
+ // ─── OxePlugin (unified) ─────────────────────────────────────────────────────
86
+
87
+ export interface OxePlugin {
88
+ readonly name: string;
89
+ readonly version?: string;
90
+ readonly abi_version?: string;
91
+ toolProviders?: ToolProvider[];
92
+ workspaceProviders?: WorkspaceProvider[];
93
+ verifierProviders?: VerifierProvider[];
94
+ contextProviders?: ContextProvider[];
95
+ /** Legacy lifecycle hooks (compatible with oxe-plugins.cjs) */
96
+ hooks?: Record<string, (ctx: Record<string, unknown>) => Promise<void> | void>;
97
+ }
@@ -0,0 +1,118 @@
1
+ import type { OxePlugin } from './plugin-abi';
2
+
3
+ export const CURRENT_ABI_VERSION = '1';
4
+
5
+ export interface PluginManifest {
6
+ name: string;
7
+ version: string;
8
+ abi_version: string;
9
+ capabilities: Array<'tool' | 'workspace' | 'verifier' | 'context' | 'hooks'>;
10
+ tool_action_types?: string[];
11
+ workspace_strategies?: string[];
12
+ verifier_check_types?: string[];
13
+ context_provider_names?: string[];
14
+ hook_names?: string[];
15
+ }
16
+
17
+ export interface PluginValidationResult {
18
+ valid: boolean;
19
+ errors: string[];
20
+ warnings: string[];
21
+ }
22
+
23
+ export function extractManifest(plugin: OxePlugin): PluginManifest {
24
+ const capabilities: PluginManifest['capabilities'] = [];
25
+ if (plugin.toolProviders?.length) capabilities.push('tool');
26
+ if (plugin.workspaceProviders?.length) capabilities.push('workspace');
27
+ if (plugin.verifierProviders?.length) capabilities.push('verifier');
28
+ if (plugin.contextProviders?.length) capabilities.push('context');
29
+ if (plugin.hooks && Object.keys(plugin.hooks).length > 0) capabilities.push('hooks');
30
+
31
+ return {
32
+ name: plugin.name,
33
+ version: plugin.version ?? '0.0.0',
34
+ abi_version: plugin.abi_version ?? CURRENT_ABI_VERSION,
35
+ capabilities,
36
+ tool_action_types: plugin.toolProviders?.flatMap((p) =>
37
+ ['read_code', 'generate_patch', 'run_tests', 'collect_evidence', 'custom'].filter((t) => p.supports(t))
38
+ ) ?? [],
39
+ workspace_strategies: plugin.workspaceProviders?.map((p) => p.name) ?? [],
40
+ verifier_check_types: plugin.verifierProviders?.flatMap((p) =>
41
+ ['unit', 'integration', 'smoke', 'policy', 'security', 'custom'].filter((t) => p.supports(t))
42
+ ) ?? [],
43
+ context_provider_names: plugin.contextProviders?.map((p) => p.name) ?? [],
44
+ hook_names: plugin.hooks ? Object.keys(plugin.hooks) : [],
45
+ };
46
+ }
47
+
48
+ export function validatePlugin(plugin: OxePlugin): PluginValidationResult {
49
+ const errors: string[] = [];
50
+ const warnings: string[] = [];
51
+
52
+ if (!plugin.name || typeof plugin.name !== 'string') {
53
+ errors.push('Plugin must have a non-empty string name');
54
+ }
55
+
56
+ if (plugin.version && !/^\d+\.\d+\.\d+/.test(plugin.version)) {
57
+ warnings.push(`Plugin version "${plugin.version}" does not follow semver`);
58
+ }
59
+
60
+ const abiVersion = plugin.abi_version ?? CURRENT_ABI_VERSION;
61
+ if (!isAbiCompatible(abiVersion)) {
62
+ errors.push(`Plugin ABI "${abiVersion}" is incompatible with runtime ABI "${CURRENT_ABI_VERSION}"`);
63
+ }
64
+
65
+ if (!plugin.toolProviders?.length &&
66
+ !plugin.workspaceProviders?.length &&
67
+ !plugin.verifierProviders?.length &&
68
+ !plugin.contextProviders?.length &&
69
+ !plugin.hooks) {
70
+ warnings.push('Plugin declares no providers or hooks — it has no effect');
71
+ }
72
+
73
+ // Validate each tool provider
74
+ for (const tp of plugin.toolProviders ?? []) {
75
+ if (!tp.name) errors.push('ToolProvider missing name');
76
+ if (typeof tp.supports !== 'function') errors.push(`ToolProvider "${tp.name}" missing supports() method`);
77
+ if (typeof tp.invoke !== 'function') errors.push(`ToolProvider "${tp.name}" missing invoke() method`);
78
+ }
79
+
80
+ // Validate each workspace provider
81
+ for (const wp of plugin.workspaceProviders ?? []) {
82
+ if (!wp.name) errors.push('WorkspaceProvider missing name');
83
+ if (typeof wp.supportsStrategy !== 'function') errors.push(`WorkspaceProvider "${wp.name}" missing supportsStrategy()`);
84
+ if (typeof wp.allocate !== 'function') errors.push(`WorkspaceProvider "${wp.name}" missing allocate()`);
85
+ }
86
+
87
+ // Validate each verifier provider
88
+ for (const vp of plugin.verifierProviders ?? []) {
89
+ if (!vp.name) errors.push('VerifierProvider missing name');
90
+ if (typeof vp.supports !== 'function') errors.push(`VerifierProvider "${vp.name}" missing supports()`);
91
+ if (typeof vp.execute !== 'function') errors.push(`VerifierProvider "${vp.name}" missing execute()`);
92
+ }
93
+
94
+ return { valid: errors.length === 0, errors, warnings };
95
+ }
96
+
97
+ export function isAbiCompatible(pluginAbiVersion: string): boolean {
98
+ // Major version must match; minor/patch are backwards-compatible
99
+ const [currMajor] = CURRENT_ABI_VERSION.split('.').map(Number);
100
+ const [plugMajor] = pluginAbiVersion.split('.').map(Number);
101
+ return currMajor === plugMajor;
102
+ }
103
+
104
+ export function sandboxInvoke<T>(
105
+ fn: () => Promise<T>,
106
+ timeoutMs = 10_000
107
+ ): Promise<T> {
108
+ return new Promise<T>((resolve, reject) => {
109
+ const timer = setTimeout(() => {
110
+ reject(new Error(`Plugin invocation timed out after ${timeoutMs}ms`));
111
+ }, timeoutMs);
112
+
113
+ fn().then(
114
+ (result) => { clearTimeout(timer); resolve(result); },
115
+ (err) => { clearTimeout(timer); reject(err instanceof Error ? err : new Error(String(err))); }
116
+ );
117
+ });
118
+ }
@@ -1,119 +1,232 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import type {
4
- OxePlugin,
5
- ToolProvider,
6
- WorkspaceProvider,
7
- VerifierProvider,
8
- ContextProvider,
9
- } from './plugin-abi';
10
-
11
- export class PluginRegistry {
12
- private plugins: OxePlugin[] = [];
13
-
14
- register(plugin: OxePlugin): void {
15
- if (this.plugins.some((p) => p.name === plugin.name)) {
16
- throw new Error(`Plugin "${plugin.name}" is already registered`);
17
- }
18
- this.plugins.push(plugin);
19
- }
20
-
21
- unregister(name: string): void {
22
- this.plugins = this.plugins.filter((p) => p.name !== name);
23
- }
24
-
25
- loadFromDirectory(dir: string): string[] {
26
- if (!fs.existsSync(dir)) return [];
27
- const loaded: string[] = [];
28
- for (const file of fs.readdirSync(dir)) {
29
- if (!file.endsWith('.cjs') && !file.endsWith('.js')) continue;
30
- const fullPath = path.resolve(dir, file);
31
- try {
32
- // eslint-disable-next-line @typescript-eslint/no-var-requires
33
- const mod = require(fullPath) as OxePlugin | { default?: OxePlugin };
34
- const plugin = 'default' in mod && mod.default ? mod.default : (mod as OxePlugin);
35
- if (plugin && plugin.name) {
36
- this.register(plugin);
37
- loaded.push(plugin.name);
38
- }
39
- } catch {
40
- // skip invalid plugin files
41
- }
42
- }
43
- return loaded;
44
- }
45
-
46
- toolProviderFor(actionType: string): ToolProvider | null {
47
- for (const plugin of this.plugins) {
48
- const provider = plugin.toolProviders?.find((p) => p.supports(actionType));
49
- if (provider) return provider;
50
- }
51
- return null;
52
- }
53
-
54
- workspaceProviderFor(strategy: string): WorkspaceProvider | null {
55
- for (const plugin of this.plugins) {
56
- const provider = plugin.workspaceProviders?.find((p) => p.supportsStrategy(strategy));
57
- if (provider) return provider;
58
- }
59
- return null;
60
- }
61
-
62
- verifierProviderFor(checkType: string): VerifierProvider | null {
63
- for (const plugin of this.plugins) {
64
- const provider = plugin.verifierProviders?.find((p) => p.supports(checkType));
65
- if (provider) return provider;
66
- }
67
- return null;
68
- }
69
-
70
- contextProviderFor(name: string): ContextProvider | null {
71
- for (const plugin of this.plugins) {
72
- const provider = plugin.contextProviders?.find((p) => p.name === name);
73
- if (provider) return provider;
74
- }
75
- return null;
76
- }
77
-
78
- allContextProviders(): ContextProvider[] {
79
- return this.plugins.flatMap((p) => p.contextProviders ?? []);
80
- }
81
-
82
- allToolProviders(): ToolProvider[] {
83
- return this.plugins.flatMap((p) => p.toolProviders ?? []);
84
- }
85
-
86
- async runHook(
87
- hookName: string,
88
- ctx: Record<string, unknown>
89
- ): Promise<void> {
90
- for (const plugin of this.plugins) {
91
- const hook = plugin.hooks?.[hookName];
92
- if (hook) await hook(ctx);
93
- }
94
- }
95
-
96
- list(): Array<{ name: string; version?: string; providers: string[] }> {
97
- return this.plugins.map((p) => ({
98
- name: p.name,
99
- version: p.version,
100
- providers: [
101
- ...(p.toolProviders?.map((tp) => `tool:${tp.name}`) ?? []),
102
- ...(p.workspaceProviders?.map((wp) => `workspace:${wp.name}`) ?? []),
103
- ...(p.verifierProviders?.map((vp) => `verifier:${vp.name}`) ?? []),
104
- ...(p.contextProviders?.map((cp) => `context:${cp.name}`) ?? []),
105
- ],
106
- }));
107
- }
108
- }
109
-
110
- let _globalRegistry: PluginRegistry | null = null;
111
-
112
- export function globalRegistry(): PluginRegistry {
113
- if (!_globalRegistry) _globalRegistry = new PluginRegistry();
114
- return _globalRegistry;
115
- }
116
-
117
- export function resetGlobalRegistry(): void {
118
- _globalRegistry = null;
119
- }
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import type {
4
+ OxePlugin,
5
+ ToolProvider,
6
+ WorkspaceProvider,
7
+ VerifierProvider,
8
+ ContextProvider,
9
+ } from './plugin-abi';
10
+ import { validatePlugin } from './plugin-manifest';
11
+ import { buildMatrix, type CapabilityMatrix } from './capability-matrix';
12
+ import { loadCapabilityPlugins } from './capability-adapter';
13
+
14
+ export class PluginRegistry {
15
+ private plugins: OxePlugin[] = [];
16
+ private loadErrors: string[] = [];
17
+
18
+ register(plugin: OxePlugin): void {
19
+ if (this.plugins.some((p) => p.name === plugin.name)) {
20
+ throw new Error(`Plugin "${plugin.name}" is already registered`);
21
+ }
22
+ const validation = validatePlugin(plugin);
23
+ if (!validation.valid && validation.errors.length > 0) {
24
+ throw new Error(`Plugin "${plugin.name}" failed validation: ${validation.errors.join('; ')}`);
25
+ }
26
+ this.plugins.push(plugin);
27
+ }
28
+
29
+ unregister(name: string): void {
30
+ this.plugins = this.plugins.filter((p) => p.name !== name);
31
+ }
32
+
33
+ loadFromDirectory(dir: string): string[] {
34
+ if (!fs.existsSync(dir)) return [];
35
+ const loaded: string[] = [];
36
+ for (const file of fs.readdirSync(dir)) {
37
+ if (!file.endsWith('.cjs') && !file.endsWith('.js')) continue;
38
+ const fullPath = path.resolve(dir, file);
39
+ try {
40
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
41
+ const mod = require(fullPath) as OxePlugin | { default?: OxePlugin };
42
+ const plugin = 'default' in mod && mod.default ? mod.default : (mod as OxePlugin);
43
+ if (plugin && plugin.name) {
44
+ this.register(plugin);
45
+ loaded.push(plugin.name);
46
+ }
47
+ } catch (error) {
48
+ this.loadErrors.push(
49
+ `Plugin ${fullPath} falhou ao carregar: ${error instanceof Error ? error.message : String(error)}`
50
+ );
51
+ }
52
+ }
53
+ return loaded;
54
+ }
55
+
56
+ toolProviderFor(actionType: string): ToolProvider | null {
57
+ for (const plugin of this.plugins) {
58
+ const provider = plugin.toolProviders?.find((p) => p.supports(actionType));
59
+ if (provider) return provider;
60
+ }
61
+ return null;
62
+ }
63
+
64
+ workspaceProviderFor(strategy: string): WorkspaceProvider | null {
65
+ for (const plugin of this.plugins) {
66
+ const provider = plugin.workspaceProviders?.find((p) => p.supportsStrategy(strategy));
67
+ if (provider) return provider;
68
+ }
69
+ return null;
70
+ }
71
+
72
+ verifierProviderFor(checkType: string): VerifierProvider | null {
73
+ for (const plugin of this.plugins) {
74
+ const provider = plugin.verifierProviders?.find((p) => p.supports(checkType));
75
+ if (provider) return provider;
76
+ }
77
+ return null;
78
+ }
79
+
80
+ contextProviderFor(name: string): ContextProvider | null {
81
+ for (const plugin of this.plugins) {
82
+ const provider = plugin.contextProviders?.find((p) => p.name === name);
83
+ if (provider) return provider;
84
+ }
85
+ return null;
86
+ }
87
+
88
+ allContextProviders(): ContextProvider[] {
89
+ return this.plugins.flatMap((p) => p.contextProviders ?? []);
90
+ }
91
+
92
+ allToolProviders(): ToolProvider[] {
93
+ return this.plugins.flatMap((p) => p.toolProviders ?? []);
94
+ }
95
+
96
+ async runHook(
97
+ hookName: string,
98
+ ctx: Record<string, unknown>
99
+ ): Promise<void> {
100
+ for (const plugin of this.plugins) {
101
+ const hook = plugin.hooks?.[hookName];
102
+ if (hook) await hook(ctx);
103
+ }
104
+ }
105
+
106
+ list(): Array<{ name: string; version?: string; providers: string[] }> {
107
+ return this.plugins.map((p) => ({
108
+ name: p.name,
109
+ version: p.version,
110
+ providers: [
111
+ ...(p.toolProviders?.map((tp) => `tool:${tp.name}`) ?? []),
112
+ ...(p.workspaceProviders?.map((wp) => `workspace:${wp.name}`) ?? []),
113
+ ...(p.verifierProviders?.map((vp) => `verifier:${vp.name}`) ?? []),
114
+ ...(p.contextProviders?.map((cp) => `context:${cp.name}`) ?? []),
115
+ ],
116
+ }));
117
+ }
118
+
119
+ registerProjectCapabilities(projectRoot: string): string[] {
120
+ const loaded: string[] = [];
121
+ for (const plugin of loadCapabilityPlugins(projectRoot)) {
122
+ try {
123
+ this.register(plugin);
124
+ loaded.push(plugin.name);
125
+ } catch (error) {
126
+ this.loadErrors.push(
127
+ `Capability plugin ${plugin.name} falhou ao registrar: ${error instanceof Error ? error.message : String(error)}`
128
+ );
129
+ }
130
+ }
131
+ return loaded;
132
+ }
133
+
134
+ loadErrorsSnapshot(): string[] {
135
+ return [...this.loadErrors];
136
+ }
137
+
138
+ clearLoadErrors(): void {
139
+ this.loadErrors = [];
140
+ }
141
+
142
+ snapshot(): Array<{
143
+ name: string;
144
+ version?: string;
145
+ abi_version?: string;
146
+ toolProviders: Array<{ name: string; kind: string; idempotent: boolean }>;
147
+ workspaceProviders: Array<{ name: string }>;
148
+ verifierProviders: Array<{ name: string }>;
149
+ contextProviders: Array<{ name: string }>;
150
+ }> {
151
+ return this.plugins.map((plugin) => ({
152
+ name: plugin.name,
153
+ version: plugin.version,
154
+ abi_version: plugin.abi_version,
155
+ toolProviders: (plugin.toolProviders ?? []).map((provider) => ({
156
+ name: provider.name,
157
+ kind: provider.kind,
158
+ idempotent: provider.idempotent,
159
+ })),
160
+ workspaceProviders: (plugin.workspaceProviders ?? []).map((provider) => ({
161
+ name: provider.name,
162
+ })),
163
+ verifierProviders: (plugin.verifierProviders ?? []).map((provider) => ({
164
+ name: provider.name,
165
+ })),
166
+ contextProviders: (plugin.contextProviders ?? []).map((provider) => ({
167
+ name: provider.name,
168
+ })),
169
+ }));
170
+ }
171
+
172
+ summary(): {
173
+ total_plugins: number;
174
+ tool_providers: number;
175
+ workspace_providers: number;
176
+ verifier_providers: number;
177
+ context_providers: number;
178
+ load_errors: number;
179
+ pluginsCount: number;
180
+ toolProviders: number;
181
+ workspaceProviders: number;
182
+ verifierProviders: number;
183
+ contextProviders: number;
184
+ loadErrors: number;
185
+ plugins: Array<{ name: string; version?: string; providers: string[] }>;
186
+ } {
187
+ const plugins = this.list();
188
+ const toolProviders = plugins.reduce((sum, plugin) => sum + plugin.providers.filter((provider) => provider.startsWith('tool:')).length, 0);
189
+ const workspaceProviders = plugins.reduce((sum, plugin) => sum + plugin.providers.filter((provider) => provider.startsWith('workspace:')).length, 0);
190
+ const verifierProviders = plugins.reduce((sum, plugin) => sum + plugin.providers.filter((provider) => provider.startsWith('verifier:')).length, 0);
191
+ const contextProviders = plugins.reduce((sum, plugin) => sum + plugin.providers.filter((provider) => provider.startsWith('context:')).length, 0);
192
+ const loadErrors = this.loadErrors.length;
193
+ return {
194
+ total_plugins: plugins.length,
195
+ tool_providers: toolProviders,
196
+ workspace_providers: workspaceProviders,
197
+ verifier_providers: verifierProviders,
198
+ context_providers: contextProviders,
199
+ load_errors: loadErrors,
200
+ pluginsCount: plugins.length,
201
+ toolProviders,
202
+ workspaceProviders,
203
+ verifierProviders,
204
+ contextProviders,
205
+ loadErrors,
206
+ plugins,
207
+ };
208
+ }
209
+
210
+ capabilityMatrix(): CapabilityMatrix {
211
+ return buildMatrix(this);
212
+ }
213
+ }
214
+
215
+ let _globalRegistry: PluginRegistry | null = null;
216
+
217
+ export function globalRegistry(): PluginRegistry {
218
+ if (!_globalRegistry) _globalRegistry = new PluginRegistry();
219
+ return _globalRegistry;
220
+ }
221
+
222
+ export function resetGlobalRegistry(): void {
223
+ _globalRegistry = null;
224
+ }
225
+
226
+ export function registrySummary(registry: PluginRegistry): ReturnType<PluginRegistry['summary']> {
227
+ return registry.summary();
228
+ }
229
+
230
+ export function resolveCapabilityMatrix(registry: PluginRegistry): CapabilityMatrix {
231
+ return registry.capabilityMatrix();
232
+ }
@@ -1 +1 @@
1
- export * from './policy-engine';
1
+ export * from './policy-engine';