vgxness 1.20.4 → 1.20.6

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 (375) hide show
  1. package/dist/adapters/claude/agent-renderer.js +82 -0
  2. package/dist/{mcp → adapters/claude/install}/claude-code-agent-config.js +64 -9
  3. package/dist/{mcp → adapters/claude/install}/claude-code-config.js +28 -6
  4. package/dist/{mcp → adapters/claude/install}/claude-code-project-memory.js +35 -5
  5. package/dist/{mcp → adapters/claude/install}/claude-code-scope.js +12 -3
  6. package/dist/{mcp → adapters/claude/install}/claude-code-user-config.js +26 -5
  7. package/dist/{mcp → adapters/claude/install}/claude-code-user-memory.js +47 -7
  8. package/dist/{mcp → adapters/claude/install}/client-install-claude-code-contract.js +45 -8
  9. package/dist/{mcp → adapters/claude/install}/client-install-claude-code.js +98 -14
  10. package/dist/adapters/json/agent-renderer.js +104 -0
  11. package/dist/adapters/opencode/agent-renderer.js +113 -0
  12. package/dist/{mcp → adapters/opencode/install}/client-install-opencode-contract.js +2 -2
  13. package/dist/{mcp → adapters/opencode/install}/client-install-opencode.js +1 -1
  14. package/dist/{mcp → adapters/opencode/install}/opencode-default-agent-config.js +2 -2
  15. package/dist/{mcp → adapters/opencode/install}/opencode-handoff-preview.js +60 -7
  16. package/dist/{mcp → adapters/opencode/install}/opencode-visibility.js +1 -1
  17. package/dist/adapters/provider-renderer.js +6 -0
  18. package/dist/agents/agent-activation-service.js +1 -263
  19. package/dist/agents/agent-lookup-contexts.js +1 -28
  20. package/dist/agents/agent-registry-service.js +1 -81
  21. package/dist/agents/agent-resolver.js +1 -287
  22. package/dist/agents/agent-seed-service.js +1 -157
  23. package/dist/agents/agent-seed-upgrade-service.js +1 -231
  24. package/dist/agents/agent-selector-resolver.js +1 -28
  25. package/dist/agents/boot-upgrade.js +1 -59
  26. package/dist/agents/canonical-agent-manifest.js +1 -245
  27. package/dist/agents/canonical-agent-projection.js +1 -236
  28. package/dist/agents/manager-profile-overlay-service.js +1 -60
  29. package/dist/agents/profile-model-routing.js +1 -30
  30. package/dist/agents/renderers/claude-renderer.js +1 -82
  31. package/dist/agents/renderers/index.js +1 -14
  32. package/dist/agents/renderers/json-renderer.js +1 -104
  33. package/dist/agents/renderers/opencode-renderer.js +1 -113
  34. package/dist/agents/renderers/provider-adapter.js +1 -6
  35. package/dist/agents/repositories/agent-seed-history.js +1 -128
  36. package/dist/agents/repositories/agents.js +1 -200
  37. package/dist/agents/repositories/manager-profile-overlays.js +1 -90
  38. package/dist/agents/schema.js +1 -1
  39. package/dist/application/agents/agent-activation-service.js +261 -0
  40. package/dist/application/agents/agent-lookup-contexts.js +28 -0
  41. package/dist/application/agents/agent-registry-service.js +81 -0
  42. package/dist/application/agents/agent-resolver.js +287 -0
  43. package/dist/application/agents/agent-seed-service.js +157 -0
  44. package/dist/application/agents/agent-seed-upgrade-service.js +231 -0
  45. package/dist/application/agents/agent-selector-resolver.js +28 -0
  46. package/dist/application/agents/boot-upgrade.js +59 -0
  47. package/dist/application/agents/canonical-agent-projection.js +236 -0
  48. package/dist/application/agents/manager-profile-overlay-service.js +68 -0
  49. package/dist/application/agents/profile-model-routing.js +30 -0
  50. package/dist/application/agents/renderers/claude-renderer.js +1 -0
  51. package/dist/application/agents/renderers/index.js +14 -0
  52. package/dist/application/agents/renderers/json-renderer.js +1 -0
  53. package/dist/application/agents/renderers/opencode-renderer.js +1 -0
  54. package/dist/application/agents/renderers/provider-adapter.js +1 -0
  55. package/dist/application/memory/active-work-preview.js +75 -0
  56. package/dist/application/memory/agent-memory-capture-service.js +498 -0
  57. package/dist/application/memory/import/dry-run-planner.js +58 -0
  58. package/dist/application/memory/import/index.js +3 -0
  59. package/dist/application/memory/import/observation-writer.js +226 -0
  60. package/dist/application/memory/import/package.js +179 -0
  61. package/dist/application/memory/memory-service.js +202 -0
  62. package/dist/application/memory/search.js +11 -0
  63. package/dist/{mcp → application/provider-setup}/provider-change-plan.js +74 -13
  64. package/dist/{mcp → application/provider-setup}/provider-doctor.js +201 -31
  65. package/dist/{mcp → application/provider-setup}/provider-health-types.js +1 -1
  66. package/dist/{mcp → application/provider-setup}/provider-status.js +170 -33
  67. package/dist/application/runs/execution-planning.js +180 -0
  68. package/dist/application/runs/operation-execution.js +1 -0
  69. package/dist/application/runs/operation-retry.js +129 -0
  70. package/dist/application/runs/resume-after-approval-result.js +88 -0
  71. package/dist/application/runs/run-insights.js +270 -0
  72. package/dist/application/runs/run-service.js +1480 -0
  73. package/dist/application/runs/run-snapshot-export-service.js +31 -0
  74. package/dist/application/runs/sandbox-process-execution.js +244 -0
  75. package/dist/application/runs/sandbox-worktree-planning.js +59 -0
  76. package/dist/application/runs/task-scoped-command-grant-service.js +224 -0
  77. package/dist/application/sdd/artifact-portability-service.js +137 -0
  78. package/dist/application/sdd/cockpit-read-model.js +195 -0
  79. package/dist/application/sdd/sdd-continuation-plan.js +265 -0
  80. package/dist/application/sdd/sdd-workflow-service.js +892 -0
  81. package/dist/application/skills/boot-seed.js +42 -0
  82. package/dist/application/skills/personal-skills.js +41 -0
  83. package/dist/application/skills/skill-export-service.js +34 -0
  84. package/dist/application/skills/skill-index-service.js +126 -0
  85. package/dist/application/skills/skill-payload.js +186 -0
  86. package/dist/application/skills/skill-registry-service.js +648 -0
  87. package/dist/application/skills/skill-resolver.js +368 -0
  88. package/dist/application/skills/skill-seed-service.js +242 -0
  89. package/dist/application/skills/skill-status-service.js +147 -0
  90. package/dist/cli/bun-bin.js +0 -0
  91. package/dist/cli/cli-flags.js +1 -387
  92. package/dist/cli/cli-help.js +1 -173
  93. package/dist/cli/cli-helpers.js +1 -77
  94. package/dist/cli/cli-types.js +1 -1
  95. package/dist/cli/commands/agent-skill-dispatcher.js +1 -700
  96. package/dist/cli/commands/index.js +1 -9
  97. package/dist/cli/commands/interactive-entrypoint-dispatcher.js +1 -14
  98. package/dist/cli/commands/mcp-dispatcher.js +1 -232
  99. package/dist/cli/commands/memory-sdd-dispatcher.js +1 -367
  100. package/dist/cli/commands/run-permission-dispatcher.js +1 -455
  101. package/dist/cli/commands/setup-dispatcher.js +1 -496
  102. package/dist/cli/commands/status-dispatcher.js +1 -130
  103. package/dist/cli/commands/verification-dispatcher.js +1 -47
  104. package/dist/cli/commands/workflow-dispatcher.js +1 -566
  105. package/dist/cli/dispatcher.js +1 -247
  106. package/dist/cli/doctor-renderer.js +1 -26
  107. package/dist/cli/home-tui-app.js +1 -411
  108. package/dist/cli/home-tui-controller.js +1 -314
  109. package/dist/cli/mcp-start-path.js +1 -21
  110. package/dist/cli/product-resume-renderer.js +1 -32
  111. package/dist/cli/product-status-renderer.js +1 -81
  112. package/dist/cli/sdd-renderer.js +1 -247
  113. package/dist/cli/setup-plan-renderer.js +1 -79
  114. package/dist/cli/setup-status-renderer.js +1 -50
  115. package/dist/cli/setup-tui-app.js +1 -130
  116. package/dist/cli/setup-tui-controller.js +1 -89
  117. package/dist/cli/tui/focus-reducer.js +1 -0
  118. package/dist/cli/tui/focus-types.js +1 -0
  119. package/dist/cli/tui/ink/app-shell.js +1 -0
  120. package/dist/cli/tui/ink/components.js +1 -38
  121. package/dist/cli/tui/ink/help-overlay.js +1 -0
  122. package/dist/cli/tui/ink/state-components.js +1 -0
  123. package/dist/cli/tui/ink/theme.js +1 -36
  124. package/dist/cli/tui/key-intents.js +1 -0
  125. package/dist/cli/tui/keymap.js +1 -20
  126. package/dist/cli/tui/navigation.js +1 -10
  127. package/dist/cli/tui/screen-registry.js +1 -0
  128. package/dist/cli/tui/terminal-capabilities.js +1 -12
  129. package/dist/cli/tui/tui-types.js +1 -1
  130. package/dist/cli/tui/visual/badges.js +1 -19
  131. package/dist/cli/tui/visual/footer.js +1 -27
  132. package/dist/cli/tui/visual/index.js +1 -3
  133. package/dist/cli/tui/visual/viewport.js +1 -11
  134. package/dist/cli/tui-render-helpers.js +1 -200
  135. package/dist/cli/verification-plan-renderer.js +1 -25
  136. package/dist/cli/verification-report-renderer.js +1 -19
  137. package/dist/domain/agents/canonical-agent-manifest.js +355 -0
  138. package/dist/domain/agents/schema.js +1 -0
  139. package/dist/domain/memory/active-work-topics.js +64 -0
  140. package/dist/domain/memory/memory-capture-schema.js +1 -0
  141. package/dist/domain/memory/schema.js +1 -0
  142. package/dist/domain/runs/schema.js +5 -0
  143. package/dist/domain/sdd/cockpit-types.js +1 -0
  144. package/dist/domain/sdd/schema.js +111 -0
  145. package/dist/domain/skills/schema.js +1 -0
  146. package/dist/governance/risk-classifier.js +2 -0
  147. package/dist/interfaces/cli/bun-bin.js +46 -0
  148. package/dist/interfaces/cli/cli-flags.js +391 -0
  149. package/dist/interfaces/cli/cli-help.js +173 -0
  150. package/dist/interfaces/cli/cli-helpers.js +77 -0
  151. package/dist/interfaces/cli/cli-types.js +1 -0
  152. package/dist/interfaces/cli/commands/agent-skill-dispatcher.js +700 -0
  153. package/dist/interfaces/cli/commands/index.js +9 -0
  154. package/dist/interfaces/cli/commands/interactive-entrypoint-dispatcher.js +14 -0
  155. package/dist/interfaces/cli/commands/mcp-dispatcher.js +252 -0
  156. package/dist/interfaces/cli/commands/memory-sdd-dispatcher.js +367 -0
  157. package/dist/interfaces/cli/commands/run-permission-dispatcher.js +460 -0
  158. package/dist/interfaces/cli/commands/setup-dispatcher.js +496 -0
  159. package/dist/interfaces/cli/commands/status-dispatcher.js +130 -0
  160. package/dist/interfaces/cli/commands/verification-dispatcher.js +47 -0
  161. package/dist/interfaces/cli/commands/workflow-dispatcher.js +566 -0
  162. package/dist/interfaces/cli/dispatcher.js +247 -0
  163. package/dist/interfaces/cli/doctor-renderer.js +26 -0
  164. package/dist/interfaces/cli/home-tui-app.js +462 -0
  165. package/dist/interfaces/cli/home-tui-controller.js +341 -0
  166. package/dist/interfaces/cli/index.js +27 -0
  167. package/dist/interfaces/cli/mcp-start-path.js +21 -0
  168. package/dist/interfaces/cli/product-resume-renderer.js +32 -0
  169. package/dist/interfaces/cli/product-status-renderer.js +81 -0
  170. package/dist/interfaces/cli/sdd-renderer.js +247 -0
  171. package/dist/interfaces/cli/setup-plan-renderer.js +79 -0
  172. package/dist/interfaces/cli/setup-status-renderer.js +50 -0
  173. package/dist/interfaces/cli/setup-tui-app.js +135 -0
  174. package/dist/interfaces/cli/setup-tui-controller.js +89 -0
  175. package/dist/interfaces/cli/tui/focus-reducer.js +60 -0
  176. package/dist/interfaces/cli/tui/focus-types.js +10 -0
  177. package/dist/interfaces/cli/tui/ink/app-shell.js +16 -0
  178. package/dist/interfaces/cli/tui/ink/components.js +38 -0
  179. package/dist/interfaces/cli/tui/ink/help-overlay.js +6 -0
  180. package/dist/interfaces/cli/tui/ink/state-components.js +22 -0
  181. package/dist/interfaces/cli/tui/ink/theme.js +36 -0
  182. package/dist/interfaces/cli/tui/key-intents.js +33 -0
  183. package/dist/interfaces/cli/tui/keymap.js +20 -0
  184. package/dist/interfaces/cli/tui/navigation.js +10 -0
  185. package/dist/interfaces/cli/tui/screen-registry.js +43 -0
  186. package/dist/interfaces/cli/tui/terminal-capabilities.js +12 -0
  187. package/dist/interfaces/cli/tui/tui-types.js +1 -0
  188. package/dist/interfaces/cli/tui/visual/badges.js +19 -0
  189. package/dist/interfaces/cli/tui/visual/footer.js +27 -0
  190. package/dist/interfaces/cli/tui/visual/index.js +3 -0
  191. package/dist/interfaces/cli/tui/visual/viewport.js +11 -0
  192. package/dist/interfaces/cli/tui-render-helpers.js +200 -0
  193. package/dist/interfaces/cli/verification-plan-renderer.js +25 -0
  194. package/dist/interfaces/cli/verification-report-renderer.js +19 -0
  195. package/dist/interfaces/mcp/contracts/agents.js +1 -0
  196. package/dist/interfaces/mcp/contracts/context.js +1 -0
  197. package/dist/interfaces/mcp/contracts/governance.js +1 -0
  198. package/dist/interfaces/mcp/contracts/index.js +1 -0
  199. package/dist/interfaces/mcp/contracts/memory.js +1 -0
  200. package/dist/interfaces/mcp/contracts/providers.js +1 -0
  201. package/dist/interfaces/mcp/contracts/runs.js +1 -0
  202. package/dist/interfaces/mcp/contracts/sdd.js +1 -0
  203. package/dist/interfaces/mcp/contracts/sessions.js +1 -0
  204. package/dist/interfaces/mcp/contracts/skills.js +1 -0
  205. package/dist/interfaces/mcp/contracts/verification.js +1 -0
  206. package/dist/interfaces/mcp/control-plane/handlers/agents.js +38 -0
  207. package/dist/interfaces/mcp/control-plane/handlers/context.js +12 -0
  208. package/dist/interfaces/mcp/control-plane/handlers/memory.js +95 -0
  209. package/dist/interfaces/mcp/control-plane/handlers/providers.js +19 -0
  210. package/dist/interfaces/mcp/control-plane/handlers/runs.js +134 -0
  211. package/dist/interfaces/mcp/control-plane/handlers/sdd.js +225 -0
  212. package/dist/interfaces/mcp/control-plane/handlers/sessions.js +39 -0
  213. package/dist/interfaces/mcp/control-plane/handlers/skills.js +82 -0
  214. package/dist/interfaces/mcp/control-plane/handlers/verification.js +11 -0
  215. package/dist/interfaces/mcp/control-plane/types.js +1 -0
  216. package/dist/interfaces/mcp/control-plane.js +235 -0
  217. package/dist/interfaces/mcp/schema.js +174 -0
  218. package/dist/interfaces/mcp/schemas/common.js +121 -0
  219. package/dist/interfaces/mcp/schemas/inputs/agents.js +69 -0
  220. package/dist/interfaces/mcp/schemas/inputs/context.js +32 -0
  221. package/dist/interfaces/mcp/schemas/inputs/governance.js +23 -0
  222. package/dist/interfaces/mcp/schemas/inputs/index.js +10 -0
  223. package/dist/interfaces/mcp/schemas/inputs/memory.js +50 -0
  224. package/dist/interfaces/mcp/schemas/inputs/providers.js +35 -0
  225. package/dist/interfaces/mcp/schemas/inputs/runs.js +146 -0
  226. package/dist/interfaces/mcp/schemas/inputs/sdd.js +102 -0
  227. package/dist/interfaces/mcp/schemas/inputs/sessions.js +32 -0
  228. package/dist/interfaces/mcp/schemas/inputs/skills.js +231 -0
  229. package/dist/interfaces/mcp/schemas/inputs/verification.js +9 -0
  230. package/dist/interfaces/mcp/schemas/outputs/index.js +2 -0
  231. package/dist/interfaces/mcp/schemas/outputs/providers.js +28 -0
  232. package/dist/interfaces/mcp/schemas/outputs/sdd.js +166 -0
  233. package/dist/interfaces/mcp/stdio-server.js +116 -0
  234. package/dist/interfaces/mcp/validation/agents.js +189 -0
  235. package/dist/interfaces/mcp/validation/common.js +415 -0
  236. package/dist/interfaces/mcp/validation/governance.js +50 -0
  237. package/dist/interfaces/mcp/validation/memory.js +133 -0
  238. package/dist/interfaces/mcp/validation/providers.js +94 -0
  239. package/dist/interfaces/mcp/validation/runs.js +514 -0
  240. package/dist/interfaces/mcp/validation/sdd.js +247 -0
  241. package/dist/interfaces/mcp/validation/sessions.js +51 -0
  242. package/dist/interfaces/mcp/validation/skills.js +685 -0
  243. package/dist/interfaces/mcp/validation/verification.js +24 -0
  244. package/dist/interfaces/mcp/validation.js +149 -0
  245. package/dist/mcp/control-plane-snapshot-service.js +65 -2
  246. package/dist/mcp/control-plane.js +1 -646
  247. package/dist/mcp/doctor.js +1 -1
  248. package/dist/mcp/index.js +17 -17
  249. package/dist/mcp/schema.js +1 -1072
  250. package/dist/mcp/stdio-server.js +1 -116
  251. package/dist/mcp/validation.js +1 -2239
  252. package/dist/memory/active-work-preview.js +1 -75
  253. package/dist/memory/active-work-topics.js +1 -64
  254. package/dist/memory/agent-memory-capture-service.js +1 -497
  255. package/dist/memory/import/dry-run-planner.js +1 -58
  256. package/dist/memory/import/index.js +1 -3
  257. package/dist/memory/import/observation-writer.js +1 -226
  258. package/dist/memory/import/package.js +1 -179
  259. package/dist/memory/memory-capture-schema.js +1 -1
  260. package/dist/memory/memory-service.js +1 -201
  261. package/dist/memory/repositories/artifacts.js +1 -67
  262. package/dist/memory/repositories/observations.js +1 -217
  263. package/dist/memory/repositories/sessions.js +1 -125
  264. package/dist/memory/repositories/traces.js +1 -78
  265. package/dist/memory/schema.js +1 -1
  266. package/dist/memory/search.js +1 -11
  267. package/dist/memory/sqlite/database.js +1 -228
  268. package/dist/memory/storage-paths.js +1 -72
  269. package/dist/payload/context-budget-policy.js +10 -0
  270. package/dist/payload/context-budget-service.js +26 -0
  271. package/dist/payload/payload-diagnostics.js +50 -0
  272. package/dist/permissions/explicit-request-authorization.js +126 -0
  273. package/dist/permissions/policy-evaluator.js +54 -14
  274. package/dist/runs/execution-planning.js +1 -178
  275. package/dist/runs/operation-execution.js +1 -1
  276. package/dist/runs/operation-retry.js +1 -129
  277. package/dist/runs/repositories/runs.js +1 -676
  278. package/dist/runs/repositories/task-scoped-command-grants.js +1 -462
  279. package/dist/runs/resume-after-approval-result.js +1 -84
  280. package/dist/runs/run-insights.js +1 -270
  281. package/dist/runs/run-service.js +1 -1439
  282. package/dist/runs/run-snapshot-export-service.js +1 -31
  283. package/dist/runs/sandbox-process-execution.js +1 -240
  284. package/dist/runs/sandbox-worktree-planning.js +1 -59
  285. package/dist/runs/schema.js +1 -5
  286. package/dist/runs/task-scoped-command-grant-service.js +1 -216
  287. package/dist/sdd/artifact-portability-service.js +1 -137
  288. package/dist/sdd/cockpit-read-model.js +1 -195
  289. package/dist/sdd/cockpit-types.js +1 -1
  290. package/dist/sdd/schema.js +1 -111
  291. package/dist/sdd/sdd-continuation-plan.js +1 -265
  292. package/dist/sdd/sdd-workflow-service.js +1 -822
  293. package/dist/setup/providers/claude-setup-adapter.js +11 -4
  294. package/dist/setup/providers/opencode-setup-adapter.js +10 -7
  295. package/dist/setup/setup-plan.js +20 -7
  296. package/dist/skills/boot-seed.js +1 -42
  297. package/dist/skills/personal-skills.js +1 -41
  298. package/dist/skills/repositories/skill-evaluation-requests.js +1 -190
  299. package/dist/skills/repositories/skill-evaluation-scenarios.js +1 -305
  300. package/dist/skills/repositories/skill-improvement-proposals.js +1 -355
  301. package/dist/skills/repositories/skills.js +1 -1077
  302. package/dist/skills/schema.js +1 -1
  303. package/dist/skills/skill-export-service.js +1 -34
  304. package/dist/skills/skill-index-service.js +1 -126
  305. package/dist/skills/skill-payload.js +1 -186
  306. package/dist/skills/skill-registry-service.js +1 -644
  307. package/dist/skills/skill-resolver.js +1 -368
  308. package/dist/skills/skill-seed-service.js +1 -242
  309. package/dist/skills/skill-status-service.js +1 -147
  310. package/dist/storage/agents/repositories/agent-seed-history.js +128 -0
  311. package/dist/storage/agents/repositories/agents.js +200 -0
  312. package/dist/storage/agents/repositories/manager-profile-overlays.js +90 -0
  313. package/dist/storage/memory/repositories/artifacts.js +67 -0
  314. package/dist/storage/memory/repositories/observations.js +217 -0
  315. package/dist/storage/memory/repositories/sessions.js +125 -0
  316. package/dist/storage/memory/repositories/traces.js +78 -0
  317. package/dist/storage/memory/sqlite/database.js +228 -0
  318. package/dist/storage/memory/storage-paths.js +72 -0
  319. package/dist/storage/runs/repositories/runs.js +676 -0
  320. package/dist/storage/runs/repositories/task-scoped-command-grants.js +464 -0
  321. package/dist/storage/skills/repositories/skill-evaluation-requests.js +190 -0
  322. package/dist/storage/skills/repositories/skill-evaluation-scenarios.js +305 -0
  323. package/dist/storage/skills/repositories/skill-improvement-proposals.js +355 -0
  324. package/dist/storage/skills/repositories/skills.js +1084 -0
  325. package/docs/architecture.md +2 -2
  326. package/docs/glossary.md +1 -1
  327. package/docs/mcp.md +1 -1
  328. package/docs/module-boundaries.md +114 -0
  329. package/docs/prd.md +1 -1
  330. package/docs/project-health-audit-v1.10.x.md +1 -1
  331. package/docs/providers.md +2 -2
  332. package/docs/safety.md +3 -3
  333. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/apply-progress.md +122 -0
  334. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/archive-report.md +61 -0
  335. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/design.md +66 -0
  336. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/proposal.md +79 -0
  337. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/spec.md +67 -0
  338. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/tasks.md +63 -0
  339. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/verify-report.md +71 -0
  340. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/apply-progress.md +68 -0
  341. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/archive-report.md +61 -0
  342. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/design.md +43 -0
  343. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/proposal.md +61 -0
  344. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/spec.md +31 -0
  345. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/tasks.md +27 -0
  346. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/verify-report.md +58 -0
  347. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/apply-progress.md +65 -0
  348. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/archive-report.md +53 -0
  349. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/design.md +64 -0
  350. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/proposal.md +62 -0
  351. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/spec.md +51 -0
  352. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/tasks.md +50 -0
  353. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/verify-report.md +66 -0
  354. package/docs/storage.md +2 -2
  355. package/package.json +2 -2
  356. /package/dist/{mcp → adapters/claude/install}/claude-code-cli.js +0 -0
  357. /package/dist/{memory → storage/memory}/sqlite/migrations/001_initial.sql +0 -0
  358. /package/dist/{memory → storage/memory}/sqlite/migrations/002_observation_revisions.sql +0 -0
  359. /package/dist/{memory → storage/memory}/sqlite/migrations/003_agent_registry.sql +0 -0
  360. /package/dist/{memory → storage/memory}/sqlite/migrations/004_run_runtime.sql +0 -0
  361. /package/dist/{memory → storage/memory}/sqlite/migrations/005_run_approvals.sql +0 -0
  362. /package/dist/{memory → storage/memory}/sqlite/migrations/006_run_operation_attempts.sql +0 -0
  363. /package/dist/{memory → storage/memory}/sqlite/migrations/007_abandoned_operation_attempts.sql +0 -0
  364. /package/dist/{memory → storage/memory}/sqlite/migrations/008_run_execution_plan_events.sql +0 -0
  365. /package/dist/{memory → storage/memory}/sqlite/migrations/009_multiple_operation_attempts.sql +0 -0
  366. /package/dist/{memory → storage/memory}/sqlite/migrations/010_skill_registry.sql +0 -0
  367. /package/dist/{memory → storage/memory}/sqlite/migrations/011_skill_usage_resolution_outcomes.sql +0 -0
  368. /package/dist/{memory → storage/memory}/sqlite/migrations/012_skill_improvement_proposals.sql +0 -0
  369. /package/dist/{memory → storage/memory}/sqlite/migrations/013_skill_evaluation_scenarios.sql +0 -0
  370. /package/dist/{memory → storage/memory}/sqlite/migrations/014_manager_profile_overlays.sql +0 -0
  371. /package/dist/{memory → storage/memory}/sqlite/migrations/015_artifact_metadata.sql +0 -0
  372. /package/dist/{memory → storage/memory}/sqlite/migrations/016_agent_seed_history.sql +0 -0
  373. /package/dist/{memory → storage/memory}/sqlite/migrations/017_intent_signal_skill_targets.sql +0 -0
  374. /package/dist/{memory → storage/memory}/sqlite/migrations/018_skill_system_v2.sql +0 -0
  375. /package/dist/{memory → storage/memory}/sqlite/migrations/019_task_scoped_command_grants.sql +0 -0
@@ -0,0 +1,217 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { normalizeLimit, toFtsMatchQuery } from '../../../application/memory/search.js';
3
+ export class ObservationRepository {
4
+ db;
5
+ constructor(db) {
6
+ this.db = db;
7
+ }
8
+ save(input) {
9
+ const result = this.db.transaction(() => {
10
+ const existing = input.topicKey ? this.topic(input) : undefined;
11
+ const id = existing?.id ?? randomUUID();
12
+ const now = new Date().toISOString();
13
+ if (existing)
14
+ this.db.connection
15
+ .prepare('UPDATE observations SET title=@title, content=@content, updated_at=@updatedAt WHERE id=@id')
16
+ .run({ id, title: input.title, content: input.content, updatedAt: now });
17
+ else
18
+ this.db.connection
19
+ .prepare(`INSERT INTO observations(id, project, scope, type, title, content, topic_key, created_at, updated_at)
20
+ VALUES (@id, @project, @scope, @type, @title, @content, @topicKey, @createdAt, @updatedAt)`)
21
+ .run({ ...input, id, topicKey: input.topicKey ?? null, createdAt: now, updatedAt: now });
22
+ this.appendRevision(id, input.topicKey === undefined
23
+ ? { type: input.type, title: input.title, content: input.content, createdAt: now }
24
+ : { type: input.type, title: input.title, content: input.content, topicKey: input.topicKey, createdAt: now });
25
+ const found = this.getById(id);
26
+ if (!found.ok)
27
+ throw new Error(found.error.message);
28
+ return found.value;
29
+ });
30
+ return result.ok ? result : fail(result.error.message, result.error.cause);
31
+ }
32
+ getById(id) {
33
+ try {
34
+ const row = this.db.connection.prepare('SELECT * FROM observations WHERE id=?').get(id);
35
+ return row ? ok(map(row)) : missing(`Observation not found: ${id}`);
36
+ }
37
+ catch (cause) {
38
+ return fail('Failed to read observation', cause);
39
+ }
40
+ }
41
+ update(input) {
42
+ const existing = this.getById(input.id);
43
+ if (!existing.ok)
44
+ return existing;
45
+ const result = this.db.transaction(() => {
46
+ const next = { ...existing.value, ...input, updatedAt: new Date().toISOString() };
47
+ this.db.connection
48
+ .prepare(`UPDATE observations SET type=@type, title=@title, content=@content, topic_key=@topicKey, updated_at=@updatedAt WHERE id=@id`)
49
+ .run({
50
+ id: input.id,
51
+ type: next.type,
52
+ title: next.title,
53
+ content: next.content,
54
+ topicKey: next.topicKey ?? null,
55
+ updatedAt: next.updatedAt,
56
+ });
57
+ const found = this.getById(input.id);
58
+ if (!found.ok)
59
+ throw new Error(found.error.message);
60
+ return found.value;
61
+ });
62
+ return result.ok ? result : fail(result.error.message, result.error.cause);
63
+ }
64
+ getByTopic(input) {
65
+ try {
66
+ const row = input.topicKey ? this.topic(input) : undefined;
67
+ return row ? ok(map(row)) : missing(`Observation topic not found: ${input.topicKey ?? ''}`);
68
+ }
69
+ catch (cause) {
70
+ return fail('Failed to read observation by topic', cause);
71
+ }
72
+ }
73
+ search(filters) {
74
+ try {
75
+ const params = { limit: normalizeLimit(filters.limit) };
76
+ const where = [];
77
+ let from = 'observations o';
78
+ if (filters.query?.trim()) {
79
+ from = 'observations o JOIN observations_fts fts ON fts.rowid=o.rowid';
80
+ where.push('observations_fts MATCH @query');
81
+ params.query = toFtsMatchQuery(filters.query);
82
+ }
83
+ for (const [key, column] of [
84
+ ['project', 'project'],
85
+ ['scope', 'scope'],
86
+ ['type', 'type'],
87
+ ]) {
88
+ const value = filters[key];
89
+ if (value) {
90
+ where.push(`o.${column}=@${key}`);
91
+ params[key] = value;
92
+ }
93
+ }
94
+ if (filters.topicKey) {
95
+ const topicKeyFilter = normalizeTopicKeySearchFilter(filters.topicKey);
96
+ if (topicKeyFilter.kind === 'exact') {
97
+ where.push('o.topic_key=@topicKey');
98
+ params.topicKey = topicKeyFilter.value;
99
+ }
100
+ else if (topicKeyFilter.kind === 'prefix') {
101
+ where.push(`(o.topic_key=@topicKey OR o.topic_key LIKE @topicKeyPrefix ESCAPE '\\')`);
102
+ params.topicKey = topicKeyFilter.value;
103
+ params.topicKeyPrefix = `${escapeLike(topicKeyFilter.value)}/%`;
104
+ }
105
+ }
106
+ const rows = this.db.connection
107
+ .prepare(`SELECT o.* FROM ${from} ${where.length ? `WHERE ${where.join(' AND ')}` : ''} ORDER BY o.updated_at DESC LIMIT @limit`)
108
+ .all(params);
109
+ return ok(rows.map(map));
110
+ }
111
+ catch (cause) {
112
+ return fail('Failed to search observations', cause);
113
+ }
114
+ }
115
+ searchPreviews(filters) {
116
+ const result = this.search(filters);
117
+ if (!result.ok)
118
+ return result;
119
+ return ok(result.value.map(toSearchResult));
120
+ }
121
+ listRevisions(observationId) {
122
+ try {
123
+ const rows = this.db.connection.prepare('SELECT * FROM observation_revisions WHERE observation_id=? ORDER BY revision ASC').all(observationId);
124
+ return ok(rows.map(mapRevision));
125
+ }
126
+ catch (cause) {
127
+ return fail('Failed to read observation revisions', cause);
128
+ }
129
+ }
130
+ topic(input) {
131
+ return this.db.connection.prepare('SELECT * FROM observations WHERE project=@project AND scope=@scope AND type=@type AND topic_key=@topicKey').get(input);
132
+ }
133
+ appendRevision(observationId, input) {
134
+ const current = this.db.connection
135
+ .prepare('SELECT COALESCE(MAX(revision), 0) AS revision FROM observation_revisions WHERE observation_id=?')
136
+ .get(observationId);
137
+ this.db.connection
138
+ .prepare(`INSERT INTO observation_revisions(id, observation_id, revision, type, title, content, topic_key, created_at)
139
+ VALUES (@id, @observationId, @revision, @type, @title, @content, @topicKey, @createdAt)`)
140
+ .run({
141
+ id: randomUUID(),
142
+ observationId,
143
+ revision: Number(current?.revision ?? 0) + 1,
144
+ type: input.type,
145
+ title: input.title,
146
+ content: input.content,
147
+ topicKey: input.topicKey ?? null,
148
+ createdAt: input.createdAt,
149
+ });
150
+ }
151
+ }
152
+ function normalizeTopicKeySearchFilter(topicKey) {
153
+ if (topicKey === '*')
154
+ return { kind: 'all' };
155
+ if (!topicKey.includes('/'))
156
+ return { kind: 'prefix', value: topicKey };
157
+ return { kind: 'exact', value: topicKey };
158
+ }
159
+ function escapeLike(value) {
160
+ return value.replace(/[\\%_]/g, (match) => `\\${match}`);
161
+ }
162
+ function map(row) {
163
+ const value = {
164
+ id: row.id,
165
+ project: row.project,
166
+ scope: row.scope,
167
+ type: row.type,
168
+ title: row.title,
169
+ content: row.content,
170
+ createdAt: row.created_at,
171
+ updatedAt: row.updated_at,
172
+ };
173
+ if (row.topic_key !== null)
174
+ value.topicKey = row.topic_key;
175
+ return value;
176
+ }
177
+ function mapRevision(row) {
178
+ const value = {
179
+ id: row.id,
180
+ observationId: row.observation_id,
181
+ revision: row.revision,
182
+ type: row.type,
183
+ title: row.title,
184
+ content: row.content,
185
+ createdAt: row.created_at,
186
+ };
187
+ if (row.topic_key !== null)
188
+ value.topicKey = row.topic_key;
189
+ return value;
190
+ }
191
+ function toSearchResult(observation) {
192
+ const value = {
193
+ id: observation.id,
194
+ project: observation.project,
195
+ scope: observation.scope,
196
+ type: observation.type,
197
+ title: observation.title,
198
+ preview: preview(observation.content),
199
+ createdAt: observation.createdAt,
200
+ updatedAt: observation.updatedAt,
201
+ };
202
+ if (observation.topicKey !== undefined)
203
+ value.topicKey = observation.topicKey;
204
+ return value;
205
+ }
206
+ function preview(content) {
207
+ return content.length <= 160 ? content : `${content.slice(0, 157)}...`;
208
+ }
209
+ function ok(value) {
210
+ return { ok: true, value };
211
+ }
212
+ function missing(message) {
213
+ return { ok: false, error: { code: 'not_found', message } };
214
+ }
215
+ function fail(message, cause) {
216
+ return { ok: false, error: { code: 'validation_failed', message, cause } };
217
+ }
@@ -0,0 +1,125 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ export class SessionRepository {
3
+ db;
4
+ constructor(db) {
5
+ this.db = db;
6
+ }
7
+ save(input) {
8
+ const result = this.db.transaction(() => {
9
+ const id = input.id ?? randomUUID();
10
+ this.db.connection
11
+ .prepare(`INSERT INTO sessions(id, project, directory, started_at) VALUES (@id, @project, @directory, @startedAt)
12
+ ON CONFLICT(id) DO UPDATE SET project=excluded.project, directory=excluded.directory`)
13
+ .run({ id, project: input.project, directory: input.directory ?? null, startedAt: new Date().toISOString() });
14
+ const session = this.getById(id);
15
+ if (!session.ok)
16
+ throw new Error(session.error.message);
17
+ return session.value;
18
+ });
19
+ return result.ok ? result : fail(result.error.message, result.error.cause);
20
+ }
21
+ getById(id) {
22
+ try {
23
+ const row = this.db.connection.prepare('SELECT * FROM sessions WHERE id=?').get(id);
24
+ if (!row)
25
+ return { ok: false, error: { code: 'not_found', message: `Session not found: ${id}` } };
26
+ return { ok: true, value: mapSession(row) };
27
+ }
28
+ catch (cause) {
29
+ return fail('Failed to read session', cause);
30
+ }
31
+ }
32
+ restoreLatest(input) {
33
+ try {
34
+ const row = this.db.connection
35
+ .prepare(`
36
+ SELECT * FROM sessions
37
+ WHERE project = @project
38
+ AND ended_at IS NOT NULL
39
+ AND summary IS NOT NULL
40
+ AND TRIM(summary) <> ''
41
+ AND (@directory IS NULL OR directory = @directory)
42
+ ORDER BY ended_at DESC, started_at DESC, id DESC
43
+ LIMIT 1
44
+ `)
45
+ .get({ project: input.project, directory: input.directory ?? null });
46
+ if (!row)
47
+ return missing(`No closed session summary found for project: ${input.project}`);
48
+ return { ok: true, value: mapSession(row) };
49
+ }
50
+ catch (cause) {
51
+ return fail('Failed to restore session', cause);
52
+ }
53
+ }
54
+ appendActivity(input) {
55
+ const session = this.getById(input.sessionId);
56
+ if (!session.ok)
57
+ return session;
58
+ const result = this.db.transaction(() => {
59
+ const next = this.db.connection
60
+ .prepare('SELECT COALESCE(MAX(sequence), 0) + 1 AS sequence FROM session_activity WHERE session_id=?')
61
+ .get(input.sessionId);
62
+ const activity = { id: randomUUID(), sequence: next.sequence, createdAt: new Date().toISOString(), ...input };
63
+ this.db.connection
64
+ .prepare(`INSERT INTO session_activity(id, session_id, sequence, actor, kind, payload_json, created_at)
65
+ VALUES (@id, @sessionId, @sequence, @actor, @kind, @payloadJson, @createdAt)`)
66
+ .run(activity);
67
+ return activity;
68
+ });
69
+ return result.ok ? result : fail(result.error.message, result.error.cause);
70
+ }
71
+ closeSession(input) {
72
+ const summary = input.summary.trim();
73
+ if (summary.length === 0)
74
+ return fail('summary must not be empty');
75
+ const result = this.db.transaction(() => {
76
+ const existing = this.db.connection.prepare('SELECT 1 FROM sessions WHERE id=?').get(input.sessionId);
77
+ if (!existing)
78
+ throw new SessionValidationError(`Session not found: ${input.sessionId}`);
79
+ const endedAt = new Date().toISOString();
80
+ this.db.connection
81
+ .prepare('UPDATE sessions SET summary=@summary, ended_at=@endedAt WHERE id=@sessionId')
82
+ .run({ sessionId: input.sessionId, summary, endedAt });
83
+ const next = this.db.connection
84
+ .prepare('SELECT COALESCE(MAX(sequence), 0) + 1 AS sequence FROM session_activity WHERE session_id=?')
85
+ .get(input.sessionId);
86
+ this.db.connection
87
+ .prepare(`INSERT INTO session_activity(id, session_id, sequence, actor, kind, payload_json, created_at)
88
+ VALUES (@id, @sessionId, @sequence, @actor, 'summary', @payloadJson, @createdAt)`)
89
+ .run({
90
+ id: randomUUID(),
91
+ sessionId: input.sessionId,
92
+ sequence: next.sequence,
93
+ actor: input.actor,
94
+ payloadJson: JSON.stringify({ summary }),
95
+ createdAt: endedAt,
96
+ });
97
+ const session = this.getById(input.sessionId);
98
+ if (!session.ok)
99
+ throw new SessionValidationError(session.error.message);
100
+ return session.value;
101
+ });
102
+ return result.ok ? result : fail(errorMessage(result.error.cause) ?? result.error.message, result.error.cause);
103
+ }
104
+ }
105
+ function fail(message, cause) {
106
+ return { ok: false, error: { code: 'validation_failed', message, cause } };
107
+ }
108
+ function missing(message) {
109
+ return { ok: false, error: { code: 'not_found', message } };
110
+ }
111
+ function mapSession(row) {
112
+ const session = { id: row.id, project: row.project, startedAt: row.started_at };
113
+ if (row.directory !== null)
114
+ session.directory = row.directory;
115
+ if (row.ended_at !== null)
116
+ session.endedAt = row.ended_at;
117
+ if (row.summary !== null)
118
+ session.summary = row.summary;
119
+ return session;
120
+ }
121
+ class SessionValidationError extends Error {
122
+ }
123
+ function errorMessage(cause) {
124
+ return cause instanceof SessionValidationError ? cause.message : undefined;
125
+ }
@@ -0,0 +1,78 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ export class TraceRepository {
3
+ db;
4
+ constructor(db) {
5
+ this.db = db;
6
+ }
7
+ write(input) {
8
+ try {
9
+ const trace = toTrace(input);
10
+ this.db.connection
11
+ .prepare(`INSERT INTO traces(id, actor, session_id, operation, target_type, target_id, topic_key, status, error_code, error_message, created_at)
12
+ VALUES (@id, @actor, @sessionId, @operation, @targetType, @targetId, @topicKey, @status, @errorCode, @errorMessage, @createdAt)`)
13
+ .run({
14
+ id: trace.id,
15
+ actor: trace.actor,
16
+ sessionId: trace.sessionId ?? null,
17
+ operation: trace.operation,
18
+ targetType: trace.targetType,
19
+ targetId: trace.targetId ?? null,
20
+ topicKey: trace.topicKey ?? null,
21
+ status: trace.status,
22
+ errorCode: trace.errorCode ?? null,
23
+ errorMessage: trace.errorMessage ?? null,
24
+ createdAt: trace.createdAt,
25
+ });
26
+ return { ok: true, value: trace };
27
+ }
28
+ catch (cause) {
29
+ return fail('Failed to write trace', cause);
30
+ }
31
+ }
32
+ list() {
33
+ try {
34
+ return { ok: true, value: this.db.connection.prepare('SELECT * FROM traces ORDER BY created_at ASC').all().map(map) };
35
+ }
36
+ catch (cause) {
37
+ return fail('Failed to list traces', cause);
38
+ }
39
+ }
40
+ }
41
+ function toTrace(input) {
42
+ const trace = {
43
+ id: randomUUID(),
44
+ actor: input.actor,
45
+ operation: input.operation,
46
+ targetType: input.targetType,
47
+ status: input.status,
48
+ createdAt: new Date().toISOString(),
49
+ };
50
+ if (input.sessionId !== undefined)
51
+ trace.sessionId = input.sessionId;
52
+ if (input.targetId !== undefined)
53
+ trace.targetId = input.targetId;
54
+ if (input.topicKey !== undefined)
55
+ trace.topicKey = input.topicKey;
56
+ if (input.errorCode !== undefined)
57
+ trace.errorCode = input.errorCode;
58
+ if (input.errorMessage !== undefined)
59
+ trace.errorMessage = input.errorMessage;
60
+ return trace;
61
+ }
62
+ function map(row) {
63
+ const trace = { id: row.id, actor: row.actor, operation: row.operation, targetType: row.target_type, status: row.status, createdAt: row.created_at };
64
+ if (row.session_id !== null)
65
+ trace.sessionId = row.session_id;
66
+ if (row.target_id !== null)
67
+ trace.targetId = row.target_id;
68
+ if (row.topic_key !== null)
69
+ trace.topicKey = row.topic_key;
70
+ if (row.error_code !== null)
71
+ trace.errorCode = row.error_code;
72
+ if (row.error_message !== null)
73
+ trace.errorMessage = row.error_message;
74
+ return trace;
75
+ }
76
+ function fail(message, cause) {
77
+ return { ok: false, error: { code: 'validation_failed', message, cause } };
78
+ }
@@ -0,0 +1,228 @@
1
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ const migrationsDirectory = join(dirname(fileURLToPath(import.meta.url)), 'migrations');
6
+ export const sqliteBusyTimeoutMs = 5000;
7
+ const bunRequiredGuidance = 'Real local SQLite storage requires Bun. Use the installed Bun-backed vgxness/vgx runtime, or run Bun storage verification with bun run verify:bun-sqlite.';
8
+ export class MemoryDatabase {
9
+ connection;
10
+ constructor(connection) {
11
+ this.connection = connection;
12
+ }
13
+ static open(options) {
14
+ try {
15
+ const connection = openSqliteConnection(options);
16
+ connection.pragma('foreign_keys = ON');
17
+ connection.pragma(`busy_timeout = ${sqliteBusyTimeoutMs}`);
18
+ const memoryDatabase = new MemoryDatabase(connection);
19
+ if (!(options.readonly ?? false)) {
20
+ const migration = memoryDatabase.applyMigrations();
21
+ if (!migration.ok) {
22
+ connection.close();
23
+ return migration;
24
+ }
25
+ }
26
+ return { ok: true, value: memoryDatabase };
27
+ }
28
+ catch (cause) {
29
+ return {
30
+ ok: false,
31
+ error: {
32
+ code: 'store_unavailable',
33
+ message: buildMemoryStoreUnavailableMessage(options.path, cause),
34
+ cause,
35
+ },
36
+ };
37
+ }
38
+ }
39
+ applyMigrations() {
40
+ if (!existsSync(migrationsDirectory)) {
41
+ return migrationFailure(`Migrations directory not found: ${migrationsDirectory}`);
42
+ }
43
+ const migrationFiles = readdirSync(migrationsDirectory)
44
+ .filter((file) => file.endsWith('.sql'))
45
+ .sort();
46
+ try {
47
+ const run = this.connection.transaction(() => {
48
+ this.connection.exec(`
49
+ CREATE TABLE IF NOT EXISTS schema_migrations (
50
+ version TEXT PRIMARY KEY,
51
+ applied_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
52
+ );
53
+ `);
54
+ const hasMigration = this.connection.prepare('SELECT 1 FROM schema_migrations WHERE version = ?');
55
+ const recordMigration = this.connection.prepare('INSERT INTO schema_migrations(version) VALUES (?)');
56
+ for (const file of migrationFiles) {
57
+ if (hasMigration.get(file))
58
+ continue;
59
+ this.connection.exec(readFileSync(join(migrationsDirectory, file), 'utf8'));
60
+ recordMigration.run(file);
61
+ }
62
+ });
63
+ run();
64
+ return { ok: true, value: undefined };
65
+ }
66
+ catch (cause) {
67
+ return migrationFailure('Failed to apply local memory migrations', cause);
68
+ }
69
+ }
70
+ transaction(operation) {
71
+ try {
72
+ const run = this.connection.transaction(operation);
73
+ return { ok: true, value: run.immediate() };
74
+ }
75
+ catch (cause) {
76
+ return {
77
+ ok: false,
78
+ error: {
79
+ code: 'transaction_failed',
80
+ message: 'Local memory transaction failed and was rolled back',
81
+ cause,
82
+ },
83
+ };
84
+ }
85
+ }
86
+ close() {
87
+ this.connection.close();
88
+ }
89
+ }
90
+ export function openMemoryDatabase(options) {
91
+ return MemoryDatabase.open(options);
92
+ }
93
+ export function buildMemoryStoreUnavailableMessage(path, cause) {
94
+ const message = `Unable to open local memory store at ${path}`;
95
+ if (!isUnsupportedSqliteRuntimeError(cause))
96
+ return message;
97
+ return `${message}. ${bunRequiredGuidance}`;
98
+ }
99
+ function openSqliteConnection(options) {
100
+ return resolveSqliteDriver()(options);
101
+ }
102
+ function resolveSqliteDriver() {
103
+ if (isBunRuntime())
104
+ return resolveBunSqliteDriver();
105
+ throw createUnsupportedSqliteRuntimeError();
106
+ }
107
+ function isBunRuntime() {
108
+ return typeof globalThis.Bun !== 'undefined';
109
+ }
110
+ function resolveBunSqliteDriver() {
111
+ const require = createRequire(import.meta.url);
112
+ const module = require('bun:sqlite');
113
+ const BunDatabase = module.Database;
114
+ if (typeof BunDatabase !== 'function')
115
+ throw new Error('bun:sqlite Database constructor is unavailable');
116
+ return (options) => createBunSqliteConnection(new BunDatabase(options.path, { readonly: options.readonly ?? false, strict: true }));
117
+ }
118
+ function createUnsupportedSqliteRuntimeError() {
119
+ const error = new Error(bunRequiredGuidance);
120
+ error.name = 'UnsupportedSqliteRuntimeError';
121
+ return error;
122
+ }
123
+ function isUnsupportedSqliteRuntimeError(cause) {
124
+ return cause instanceof Error && cause.name === 'UnsupportedSqliteRuntimeError';
125
+ }
126
+ function createBunSqliteConnection(database) {
127
+ const record = database;
128
+ return {
129
+ prepare(sql) {
130
+ const prepare = record.prepare;
131
+ if (typeof prepare !== 'function')
132
+ throw new Error('bun:sqlite prepare() is unavailable');
133
+ return createBunSqliteStatement(prepare.call(database, sql));
134
+ },
135
+ exec(sql) {
136
+ const exec = record.exec;
137
+ if (typeof exec === 'function')
138
+ return exec.call(database, sql);
139
+ const run = record.run;
140
+ if (typeof run === 'function')
141
+ return run.call(database, sql);
142
+ throw new Error('bun:sqlite exec() is unavailable');
143
+ },
144
+ pragma(statement) {
145
+ return runBunPragma(database, statement);
146
+ },
147
+ transaction(operation) {
148
+ const transaction = record.transaction;
149
+ if (typeof transaction !== 'function')
150
+ throw new Error('bun:sqlite transaction() is unavailable');
151
+ const run = transaction.call(database, operation);
152
+ if (typeof run !== 'function')
153
+ throw new Error('bun:sqlite transaction() did not return a callable transaction');
154
+ const transactionRunner = run;
155
+ if (typeof transactionRunner.immediate !== 'function') {
156
+ throw new Error('bun:sqlite transaction().immediate() is unavailable');
157
+ }
158
+ return transactionRunner;
159
+ },
160
+ close() {
161
+ const close = record.close;
162
+ if (typeof close !== 'function')
163
+ return;
164
+ close.call(database, false);
165
+ },
166
+ };
167
+ }
168
+ function createBunSqliteStatement(statement) {
169
+ const record = statement;
170
+ return {
171
+ get(...params) {
172
+ const get = record.get;
173
+ if (typeof get !== 'function')
174
+ throw new Error('bun:sqlite statement.get() is unavailable');
175
+ const row = get.call(statement, ...params);
176
+ return row === null ? undefined : row;
177
+ },
178
+ all(...params) {
179
+ const all = record.all;
180
+ if (typeof all !== 'function')
181
+ throw new Error('bun:sqlite statement.all() is unavailable');
182
+ return all.call(statement, ...params);
183
+ },
184
+ run(...params) {
185
+ const run = record.run;
186
+ if (typeof run !== 'function')
187
+ throw new Error('bun:sqlite statement.run() is unavailable');
188
+ return run.call(statement, ...params);
189
+ },
190
+ };
191
+ }
192
+ function runBunPragma(database, statement) {
193
+ const normalizedStatement = statement.trim();
194
+ if (isPragmaSetter(normalizedStatement)) {
195
+ const exec = database.exec;
196
+ if (typeof exec !== 'function')
197
+ throw new Error('bun:sqlite exec() is unavailable for PRAGMA setter');
198
+ return exec.call(database, `PRAGMA ${normalizedStatement}`);
199
+ }
200
+ const prepare = database.prepare;
201
+ if (typeof prepare !== 'function')
202
+ throw new Error('bun:sqlite prepare() is unavailable for PRAGMA reader');
203
+ const rows = prepare.call(database, `PRAGMA ${normalizedStatement}`).all();
204
+ if (/^busy_timeout\b/i.test(normalizedStatement))
205
+ return normalizeBusyTimeoutRows(rows);
206
+ return rows;
207
+ }
208
+ function isPragmaSetter(statement) {
209
+ return /=/.test(statement);
210
+ }
211
+ function normalizeBusyTimeoutRows(rows) {
212
+ return rows.map((row) => {
213
+ if (row === null || typeof row !== 'object')
214
+ return row;
215
+ const record = row;
216
+ if (typeof record.timeout === 'number')
217
+ return row;
218
+ if (typeof record.busy_timeout === 'number')
219
+ return { timeout: record.busy_timeout };
220
+ return row;
221
+ });
222
+ }
223
+ function migrationFailure(message, cause) {
224
+ const error = { code: 'migration_failed', message };
225
+ if (cause !== undefined)
226
+ error.cause = cause;
227
+ return { ok: false, error };
228
+ }