gsd-pi 2.75.0 → 2.76.0-dev.4100bd590

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 (1034) hide show
  1. package/README.md +208 -151
  2. package/dist/claude-cli-check.d.ts +10 -0
  3. package/dist/claude-cli-check.js +13 -3
  4. package/dist/headless-events.d.ts +1 -1
  5. package/dist/headless-events.js +5 -2
  6. package/dist/headless.js +5 -6
  7. package/dist/loader.js +0 -0
  8. package/dist/onboarding.d.ts +20 -1
  9. package/dist/onboarding.js +99 -39
  10. package/dist/resources/agents/researcher.md +1 -1
  11. package/dist/resources/extensions/ask-user-questions.js +17 -5
  12. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  13. package/dist/resources/extensions/claude-code-cli/readiness.js +34 -2
  14. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +76 -4
  15. package/dist/resources/extensions/gsd/auto/detect-stuck.js +9 -0
  16. package/dist/resources/extensions/gsd/auto/loop.js +67 -4
  17. package/dist/resources/extensions/gsd/auto/phases.js +118 -53
  18. package/dist/resources/extensions/gsd/auto/resolve.js +1 -1
  19. package/dist/resources/extensions/gsd/auto/run-unit.js +10 -1
  20. package/dist/resources/extensions/gsd/auto/session.js +5 -0
  21. package/dist/resources/extensions/gsd/auto-artifact-paths.js +20 -0
  22. package/dist/resources/extensions/gsd/auto-dashboard.js +37 -8
  23. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -2
  24. package/dist/resources/extensions/gsd/auto-dispatch.js +120 -14
  25. package/dist/resources/extensions/gsd/auto-loop.js +1 -1
  26. package/dist/resources/extensions/gsd/auto-model-selection.js +54 -18
  27. package/dist/resources/extensions/gsd/auto-post-unit.js +10 -8
  28. package/dist/resources/extensions/gsd/auto-prompts.js +190 -46
  29. package/dist/resources/extensions/gsd/auto-recovery.js +57 -0
  30. package/dist/resources/extensions/gsd/auto-start.js +5 -3
  31. package/dist/resources/extensions/gsd/auto-verification.js +36 -3
  32. package/dist/resources/extensions/gsd/auto-worktree.js +71 -2
  33. package/dist/resources/extensions/gsd/auto.js +57 -25
  34. package/dist/resources/extensions/gsd/blocked-models.js +68 -0
  35. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +84 -21
  36. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +45 -23
  37. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +131 -0
  38. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
  39. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +12 -0
  40. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -0
  41. package/dist/resources/extensions/gsd/bootstrap/system-context.js +84 -10
  42. package/dist/resources/extensions/gsd/commands/catalog.js +81 -9
  43. package/dist/resources/extensions/gsd/commands/handlers/core.js +64 -24
  44. package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
  45. package/dist/resources/extensions/gsd/commands/handlers/onboarding.js +159 -0
  46. package/dist/resources/extensions/gsd/commands/handlers/ops.js +21 -0
  47. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +228 -29
  48. package/dist/resources/extensions/gsd/commands-cmux.js +5 -2
  49. package/dist/resources/extensions/gsd/commands-config.js +5 -0
  50. package/dist/resources/extensions/gsd/commands-debug.js +388 -0
  51. package/dist/resources/extensions/gsd/commands-do.js +1 -0
  52. package/dist/resources/extensions/gsd/commands-extract-learnings.js +200 -77
  53. package/dist/resources/extensions/gsd/commands-handlers.js +21 -2
  54. package/dist/resources/extensions/gsd/commands-memory.js +462 -0
  55. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +40 -12
  56. package/dist/resources/extensions/gsd/commands-scan.js +94 -0
  57. package/dist/resources/extensions/gsd/commands-workflow-templates.js +101 -2
  58. package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
  59. package/dist/resources/extensions/gsd/db-writer.js +89 -16
  60. package/dist/resources/extensions/gsd/debug-session-store.js +238 -0
  61. package/dist/resources/extensions/gsd/definition-loader.js +7 -0
  62. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -9
  63. package/dist/resources/extensions/gsd/doctor-environment.js +2 -1
  64. package/dist/resources/extensions/gsd/doctor-git-checks.js +50 -32
  65. package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
  66. package/dist/resources/extensions/gsd/doctor-providers.js +96 -22
  67. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +22 -4
  68. package/dist/resources/extensions/gsd/doctor.js +7 -1
  69. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +1 -0
  70. package/dist/resources/extensions/gsd/error-classifier.js +27 -3
  71. package/dist/resources/extensions/gsd/escalation.js +321 -0
  72. package/dist/resources/extensions/gsd/forensics.js +26 -29
  73. package/dist/resources/extensions/gsd/git-service.js +0 -1
  74. package/dist/resources/extensions/gsd/graph.js +26 -2
  75. package/dist/resources/extensions/gsd/gsd-db.js +517 -32
  76. package/dist/resources/extensions/gsd/health-widget-core.js +42 -14
  77. package/dist/resources/extensions/gsd/health-widget.js +7 -4
  78. package/dist/resources/extensions/gsd/hook-emitter.js +108 -0
  79. package/dist/resources/extensions/gsd/init-wizard.js +86 -45
  80. package/dist/resources/extensions/gsd/markdown-renderer.js +5 -5
  81. package/dist/resources/extensions/gsd/memory-backfill.js +126 -0
  82. package/dist/resources/extensions/gsd/memory-embeddings.js +219 -0
  83. package/dist/resources/extensions/gsd/memory-extractor.js +78 -27
  84. package/dist/resources/extensions/gsd/memory-ingest.js +218 -0
  85. package/dist/resources/extensions/gsd/memory-relations.js +189 -0
  86. package/dist/resources/extensions/gsd/memory-source-store.js +113 -0
  87. package/dist/resources/extensions/gsd/memory-store.js +318 -6
  88. package/dist/resources/extensions/gsd/metrics.js +1 -0
  89. package/dist/resources/extensions/gsd/model-cost-table.js +3 -1
  90. package/dist/resources/extensions/gsd/model-router.js +16 -6
  91. package/dist/resources/extensions/gsd/native-git-bridge.js +137 -5
  92. package/dist/resources/extensions/gsd/notification-overlay.js +7 -22
  93. package/dist/resources/extensions/gsd/notification-widget.js +24 -39
  94. package/dist/resources/extensions/gsd/notifications.js +4 -0
  95. package/dist/resources/extensions/gsd/onboarding-state.js +133 -0
  96. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
  97. package/dist/resources/extensions/gsd/pre-execution-checks.js +105 -8
  98. package/dist/resources/extensions/gsd/preferences-models.js +1 -0
  99. package/dist/resources/extensions/gsd/preferences-types.js +2 -1
  100. package/dist/resources/extensions/gsd/preferences-validation.js +42 -8
  101. package/dist/resources/extensions/gsd/preferences.js +10 -10
  102. package/dist/resources/extensions/gsd/prompts/add-tests.md +1 -0
  103. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  104. package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  105. package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +27 -0
  106. package/dist/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  107. package/dist/resources/extensions/gsd/prompts/execute-task.md +16 -3
  108. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  109. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  110. package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  111. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -0
  112. package/dist/resources/extensions/gsd/prompts/scan.md +79 -0
  113. package/dist/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  114. package/dist/resources/extensions/gsd/python-resolver.js +70 -0
  115. package/dist/resources/extensions/gsd/run-manager.js +37 -17
  116. package/dist/resources/extensions/gsd/setup-catalog.js +75 -0
  117. package/dist/resources/extensions/gsd/state.js +90 -7
  118. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  119. package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
  120. package/dist/resources/extensions/gsd/tools/memory-tools.js +331 -0
  121. package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -12
  122. package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
  123. package/dist/resources/extensions/gsd/tools/skip-slice.js +78 -0
  124. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +14 -0
  125. package/dist/resources/extensions/gsd/uok/flags.js +7 -7
  126. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  127. package/dist/resources/extensions/gsd/verification-gate.js +2 -1
  128. package/dist/resources/extensions/gsd/workflow-dispatch.js +64 -0
  129. package/dist/resources/extensions/gsd/workflow-install.js +327 -0
  130. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
  131. package/dist/resources/extensions/gsd/workflow-mcp.js +1 -6
  132. package/dist/resources/extensions/gsd/workflow-plugins.js +346 -0
  133. package/dist/resources/extensions/gsd/workflow-projections.js +17 -15
  134. package/dist/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  135. package/dist/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  136. package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  137. package/dist/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  138. package/dist/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  139. package/dist/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  140. package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  141. package/dist/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  142. package/dist/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  143. package/dist/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  144. package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  145. package/dist/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  146. package/dist/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  147. package/dist/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  148. package/dist/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  149. package/dist/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  150. package/dist/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  151. package/dist/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  152. package/dist/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  153. package/dist/resources/extensions/gsd/workflow-templates/release.md +118 -0
  154. package/dist/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  155. package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  156. package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  157. package/dist/resources/extensions/gsd/workflow-templates/spike.md +7 -0
  158. package/dist/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  159. package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
  160. package/dist/resources/extensions/remote-questions/commands.js +380 -0
  161. package/dist/resources/extensions/remote-questions/manager.js +39 -5
  162. package/dist/resources/extensions/remote-questions/telegram-adapter.js +79 -4
  163. package/dist/resources/extensions/search-the-web/command-search-provider.js +5 -1
  164. package/dist/resources/extensions/search-the-web/native-search.js +46 -3
  165. package/dist/resources/extensions/shared/interview-ui.js +189 -1
  166. package/dist/resources/extensions/shared/layout-utils.js +17 -0
  167. package/dist/resources/extensions/shared/rtk-shared.js +47 -0
  168. package/dist/resources/extensions/shared/rtk.js +3 -46
  169. package/dist/resources/skills/api-design/SKILL.md +190 -0
  170. package/dist/resources/skills/create-mcp-server/SKILL.md +121 -0
  171. package/dist/resources/skills/create-workflow/SKILL.md +33 -6
  172. package/dist/resources/skills/decompose-into-slices/SKILL.md +139 -0
  173. package/dist/resources/skills/dependency-upgrade/SKILL.md +158 -0
  174. package/dist/resources/skills/design-an-interface/SKILL.md +102 -0
  175. package/dist/resources/skills/forensics/SKILL.md +153 -0
  176. package/dist/resources/skills/grill-me/SKILL.md +93 -0
  177. package/dist/resources/skills/handoff/SKILL.md +121 -0
  178. package/dist/resources/skills/observability/SKILL.md +174 -0
  179. package/dist/resources/skills/security-review/SKILL.md +181 -0
  180. package/dist/resources/skills/spike-wrap-up/SKILL.md +138 -0
  181. package/dist/resources/skills/tdd/SKILL.md +112 -0
  182. package/dist/resources/skills/verify-before-complete/SKILL.md +97 -0
  183. package/dist/resources/skills/write-docs/SKILL.md +81 -0
  184. package/dist/resources/skills/write-milestone-brief/SKILL.md +135 -0
  185. package/dist/rtk-shared.d.ts +10 -0
  186. package/dist/rtk-shared.js +47 -0
  187. package/dist/rtk.d.ts +2 -6
  188. package/dist/rtk.js +3 -48
  189. package/dist/shared/workspace-types.d.ts +52 -0
  190. package/dist/shared/workspace-types.js +1 -0
  191. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  192. package/dist/update-check.d.ts +10 -0
  193. package/dist/update-check.js +24 -3
  194. package/dist/web/standalone/.next/BUILD_ID +1 -1
  195. package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -16
  196. package/dist/web/standalone/.next/build-manifest.json +4 -4
  197. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  198. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  199. package/dist/web/standalone/.next/required-server-files.json +4 -4
  200. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  201. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  203. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  207. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  208. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  209. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  210. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  211. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  213. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  214. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  215. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  217. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  220. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  230. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  231. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  246. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  249. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  254. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  255. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  256. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  258. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  259. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  260. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  261. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  262. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  263. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  264. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  265. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  266. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  267. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  268. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  269. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  270. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  271. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  272. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  273. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  274. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  275. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  276. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  277. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  278. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  279. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  280. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  281. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  282. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  283. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  284. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  285. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  286. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  287. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  288. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  289. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  290. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  291. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  292. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  293. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  294. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  295. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  296. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  297. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  298. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  299. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  300. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  301. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  302. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  303. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  304. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  305. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  306. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  307. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  308. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  309. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  310. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  311. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  312. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  313. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  314. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  315. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  316. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  317. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  318. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  319. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  320. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  321. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  322. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  323. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  324. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  325. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  326. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  327. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  328. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  329. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  330. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  331. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  332. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  333. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  334. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  335. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  336. package/dist/web/standalone/.next/server/app/index.html +1 -1
  337. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  338. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  339. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  340. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  341. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  342. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  343. package/dist/web/standalone/.next/server/app/page.js +2 -2
  344. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  345. package/dist/web/standalone/.next/server/app-paths-manifest.json +16 -16
  346. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  347. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  348. package/dist/web/standalone/.next/server/chunks/7461.js +1 -0
  349. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  350. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  351. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  352. package/dist/web/standalone/.next/server/middleware.js +2 -2
  353. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  354. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  355. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  356. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  357. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  358. package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +9 -0
  359. package/dist/web/standalone/.next/static/chunks/{2008.71ee9230ad78df21.js → 3621.fc7480022c972438.js} +2 -2
  360. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  361. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  362. package/dist/web/standalone/.next/static/chunks/app/page-5b113fd32bc2a1c3.js +1 -0
  363. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  364. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  365. package/dist/web/standalone/.next/static/chunks/{webpack-b868033a5834586d.js → webpack-5fc74f13a25fa1bb.js} +1 -1
  366. package/dist/web/standalone/.next/static/css/632cd626b1731d88.css +1 -0
  367. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  368. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  369. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  370. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  371. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  372. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  373. package/dist/web/standalone/server.js +1 -1
  374. package/dist/welcome-screen.js +48 -24
  375. package/dist/wizard.js +2 -2
  376. package/dist/worktree-cli.d.ts +6 -5
  377. package/dist/worktree-cli.js +23 -7
  378. package/package.json +3 -3
  379. package/packages/daemon/package.json +2 -2
  380. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  381. package/packages/mcp-server/dist/server.js +12 -10
  382. package/packages/mcp-server/dist/server.js.map +1 -1
  383. package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
  384. package/packages/mcp-server/dist/session-manager.js +8 -1
  385. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  386. package/packages/mcp-server/dist/workflow-tools.d.ts +2 -1
  387. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  388. package/packages/mcp-server/dist/workflow-tools.js +306 -71
  389. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  390. package/packages/mcp-server/package.json +2 -2
  391. package/packages/mcp-server/src/mcp-server.test.ts +40 -4
  392. package/packages/mcp-server/src/server.ts +12 -10
  393. package/packages/mcp-server/src/session-manager.ts +10 -3
  394. package/packages/mcp-server/src/workflow-tools.test.ts +346 -1
  395. package/packages/mcp-server/src/workflow-tools.ts +359 -75
  396. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  397. package/packages/native/package.json +1 -1
  398. package/packages/native/tsconfig.tsbuildinfo +1 -1
  399. package/packages/pi-agent-core/dist/agent-loop.js +12 -0
  400. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  401. package/packages/pi-agent-core/dist/types.d.ts +30 -0
  402. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  403. package/packages/pi-agent-core/dist/types.js.map +1 -1
  404. package/packages/pi-agent-core/package.json +1 -1
  405. package/packages/pi-agent-core/src/agent-loop.ts +14 -0
  406. package/packages/pi-agent-core/src/types.ts +34 -0
  407. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  408. package/packages/pi-ai/dist/index.d.ts +1 -0
  409. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  410. package/packages/pi-ai/dist/index.js +1 -0
  411. package/packages/pi-ai/dist/index.js.map +1 -1
  412. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  413. package/packages/pi-ai/dist/models/capability-patches.js +3 -2
  414. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  415. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +68 -0
  416. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -1
  417. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +68 -0
  418. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -1
  419. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +17 -0
  420. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -1
  421. package/packages/pi-ai/dist/models/generated/anthropic.js +17 -0
  422. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -1
  423. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +17 -0
  424. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -1
  425. package/packages/pi-ai/dist/models/generated/google-antigravity.js +17 -0
  426. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -1
  427. package/packages/pi-ai/dist/models/generated/groq.d.ts +0 -153
  428. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -1
  429. package/packages/pi-ai/dist/models/generated/groq.js +0 -153
  430. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -1
  431. package/packages/pi-ai/dist/models/generated/index.d.ts +136 -153
  432. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  433. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  434. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  435. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  436. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  437. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +17 -0
  438. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -1
  439. package/packages/pi-ai/dist/models/generated/openrouter.js +17 -0
  440. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -1
  441. package/packages/pi-ai/dist/models.generated.test.js +17 -0
  442. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  443. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts +22 -1
  444. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  445. package/packages/pi-ai/dist/providers/amazon-bedrock.js +40 -6
  446. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  447. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts +2 -0
  448. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts.map +1 -0
  449. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js +106 -0
  450. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js.map +1 -0
  451. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +42 -1
  452. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  453. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts +2 -0
  454. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts.map +1 -0
  455. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +13 -0
  456. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -0
  457. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +20 -1
  458. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  459. package/packages/pi-ai/dist/providers/anthropic-shared.js +32 -2
  460. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  461. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +12 -1
  462. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
  463. package/packages/pi-ai/dist/providers/anthropic.d.ts +11 -0
  464. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  465. package/packages/pi-ai/dist/providers/anthropic.js +23 -2
  466. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  467. package/packages/pi-ai/dist/providers/api-family.d.ts +27 -0
  468. package/packages/pi-ai/dist/providers/api-family.d.ts.map +1 -0
  469. package/packages/pi-ai/dist/providers/api-family.js +47 -0
  470. package/packages/pi-ai/dist/providers/api-family.js.map +1 -0
  471. package/packages/pi-ai/dist/providers/api-family.test.d.ts +2 -0
  472. package/packages/pi-ai/dist/providers/api-family.test.d.ts.map +1 -0
  473. package/packages/pi-ai/dist/providers/api-family.test.js +101 -0
  474. package/packages/pi-ai/dist/providers/api-family.test.js.map +1 -0
  475. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  476. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +12 -2
  477. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  478. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +164 -14
  479. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  480. package/packages/pi-ai/dist/utils/oauth/google-antigravity.d.ts.map +1 -1
  481. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js +15 -3
  482. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js.map +1 -1
  483. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts +2 -0
  484. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts.map +1 -0
  485. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +67 -0
  486. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -0
  487. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.d.ts.map +1 -1
  488. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js +16 -3
  489. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js.map +1 -1
  490. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts +2 -0
  491. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts.map +1 -0
  492. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +67 -0
  493. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -0
  494. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +2 -0
  495. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +1 -0
  496. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +289 -0
  497. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +1 -0
  498. package/packages/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  499. package/packages/pi-ai/dist/utils/oauth/openai-codex.js +12 -0
  500. package/packages/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  501. package/packages/pi-ai/package.json +2 -2
  502. package/packages/pi-ai/scripts/generate-models.ts +50 -0
  503. package/packages/pi-ai/src/index.ts +1 -0
  504. package/packages/pi-ai/src/models/capability-patches.ts +5 -2
  505. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +68 -0
  506. package/packages/pi-ai/src/models/generated/anthropic.ts +17 -0
  507. package/packages/pi-ai/src/models/generated/google-antigravity.ts +17 -0
  508. package/packages/pi-ai/src/models/generated/groq.ts +0 -153
  509. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  510. package/packages/pi-ai/src/models/generated/openrouter.ts +17 -0
  511. package/packages/pi-ai/src/models.generated.test.ts +17 -0
  512. package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
  513. package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -7
  514. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
  515. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -0
  516. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +15 -1
  517. package/packages/pi-ai/src/providers/anthropic-shared.ts +36 -3
  518. package/packages/pi-ai/src/providers/anthropic.ts +25 -2
  519. package/packages/pi-ai/src/providers/api-family.test.ts +129 -0
  520. package/packages/pi-ai/src/providers/api-family.ts +57 -0
  521. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +200 -23
  522. package/packages/pi-ai/src/utils/oauth/github-copilot.ts +12 -2
  523. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +84 -0
  524. package/packages/pi-ai/src/utils/oauth/google-antigravity.ts +15 -5
  525. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +84 -0
  526. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.ts +16 -5
  527. package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +363 -0
  528. package/packages/pi-ai/src/utils/oauth/openai-codex.ts +15 -0
  529. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  530. package/packages/pi-coding-agent/dist/cli/args.d.ts +6 -0
  531. package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
  532. package/packages/pi-coding-agent/dist/cli/args.js +14 -4
  533. package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
  534. package/packages/pi-coding-agent/dist/cli/args.test.d.ts +2 -0
  535. package/packages/pi-coding-agent/dist/cli/args.test.d.ts.map +1 -0
  536. package/packages/pi-coding-agent/dist/cli/args.test.js +38 -0
  537. package/packages/pi-coding-agent/dist/cli/args.test.js.map +1 -0
  538. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts +2 -0
  539. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts.map +1 -0
  540. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +38 -0
  541. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -0
  542. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  543. package/packages/pi-coding-agent/dist/core/agent-session.js +25 -2
  544. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  545. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +14 -0
  546. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  547. package/packages/pi-coding-agent/dist/core/auth-storage.js +34 -0
  548. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  549. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +74 -0
  550. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  551. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +4 -1
  552. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  553. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  554. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  555. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  556. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  557. package/packages/pi-coding-agent/dist/core/extensions/loader.js +4 -0
  558. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  559. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +34 -2
  560. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  561. package/packages/pi-coding-agent/dist/core/extensions/runner.js +233 -0
  562. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  563. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +200 -3
  564. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  565. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  566. package/packages/pi-coding-agent/dist/core/hooks-runner.d.ts +53 -0
  567. package/packages/pi-coding-agent/dist/core/hooks-runner.d.ts.map +1 -0
  568. package/packages/pi-coding-agent/dist/core/hooks-runner.js +337 -0
  569. package/packages/pi-coding-agent/dist/core/hooks-runner.js.map +1 -0
  570. package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts +2 -0
  571. package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts.map +1 -0
  572. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +234 -0
  573. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -0
  574. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
  575. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  576. package/packages/pi-coding-agent/dist/core/index.js +1 -0
  577. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  578. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts +2 -0
  579. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts.map +1 -0
  580. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js +40 -0
  581. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js.map +1 -0
  582. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +32 -0
  583. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  584. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  585. package/packages/pi-coding-agent/dist/core/retry-handler.js +4 -1
  586. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  587. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -0
  588. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  589. package/packages/pi-coding-agent/dist/core/sdk.js +39 -1
  590. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  591. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +55 -0
  592. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  593. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  594. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +2 -2
  595. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  596. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  597. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  598. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  599. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  600. package/packages/pi-coding-agent/dist/main.js +3 -0
  601. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  602. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  603. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +17 -7
  604. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  605. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  606. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +48 -34
  607. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  608. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +4 -0
  609. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  610. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +83 -33
  611. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  612. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  613. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  614. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +77 -0
  615. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  616. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -66
  617. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  618. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +1 -75
  619. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  620. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +1 -1
  621. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  622. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +192 -24
  623. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  624. package/packages/pi-coding-agent/package.json +1 -1
  625. package/packages/pi-coding-agent/src/cli/args.test.ts +44 -0
  626. package/packages/pi-coding-agent/src/cli/args.ts +21 -6
  627. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +56 -0
  628. package/packages/pi-coding-agent/src/core/agent-session.ts +27 -2
  629. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +83 -0
  630. package/packages/pi-coding-agent/src/core/auth-storage.ts +35 -0
  631. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +4 -1
  632. package/packages/pi-coding-agent/src/core/extensions/index.ts +16 -0
  633. package/packages/pi-coding-agent/src/core/extensions/loader.ts +5 -0
  634. package/packages/pi-coding-agent/src/core/extensions/runner.ts +353 -1
  635. package/packages/pi-coding-agent/src/core/extensions/types.ts +253 -2
  636. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +269 -0
  637. package/packages/pi-coding-agent/src/core/hooks-runner.ts +460 -0
  638. package/packages/pi-coding-agent/src/core/index.ts +10 -0
  639. package/packages/pi-coding-agent/src/core/model-registry-auth-header.test.ts +44 -0
  640. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
  641. package/packages/pi-coding-agent/src/core/retry-handler.ts +4 -1
  642. package/packages/pi-coding-agent/src/core/sdk.ts +58 -1
  643. package/packages/pi-coding-agent/src/core/settings-manager.ts +57 -0
  644. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +2 -2
  645. package/packages/pi-coding-agent/src/index.ts +16 -0
  646. package/packages/pi-coding-agent/src/main.ts +4 -0
  647. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +19 -7
  648. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
  649. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +88 -36
  650. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +83 -0
  651. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +2 -83
  652. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +208 -27
  653. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  654. package/packages/pi-tui/package.json +1 -1
  655. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  656. package/packages/rpc-client/package.json +1 -1
  657. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  658. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  659. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  660. package/pkg/dist/modes/interactive/theme/theme-schema.js +77 -0
  661. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  662. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -66
  663. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  664. package/pkg/dist/modes/interactive/theme/theme.js +1 -75
  665. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  666. package/pkg/dist/modes/interactive/theme/themes.d.ts +1 -1
  667. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  668. package/pkg/dist/modes/interactive/theme/themes.js +192 -24
  669. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  670. package/pkg/package.json +1 -1
  671. package/src/resources/agents/researcher.md +1 -1
  672. package/src/resources/extensions/ask-user-questions.ts +24 -6
  673. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  674. package/src/resources/extensions/claude-code-cli/readiness.ts +36 -2
  675. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +94 -4
  676. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +84 -0
  677. package/src/resources/extensions/gsd/auto/detect-stuck.ts +10 -0
  678. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -9
  679. package/src/resources/extensions/gsd/auto/loop.ts +109 -3
  680. package/src/resources/extensions/gsd/auto/phases.ts +146 -66
  681. package/src/resources/extensions/gsd/auto/resolve.ts +1 -1
  682. package/src/resources/extensions/gsd/auto/run-unit.ts +11 -1
  683. package/src/resources/extensions/gsd/auto/session.ts +7 -0
  684. package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
  685. package/src/resources/extensions/gsd/auto-dashboard.ts +46 -5
  686. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
  687. package/src/resources/extensions/gsd/auto-dispatch.ts +141 -9
  688. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  689. package/src/resources/extensions/gsd/auto-model-selection.ts +72 -18
  690. package/src/resources/extensions/gsd/auto-post-unit.ts +10 -8
  691. package/src/resources/extensions/gsd/auto-prompts.ts +232 -47
  692. package/src/resources/extensions/gsd/auto-recovery.ts +63 -1
  693. package/src/resources/extensions/gsd/auto-start.ts +8 -6
  694. package/src/resources/extensions/gsd/auto-verification.ts +36 -3
  695. package/src/resources/extensions/gsd/auto-worktree.ts +81 -1
  696. package/src/resources/extensions/gsd/auto.ts +61 -28
  697. package/src/resources/extensions/gsd/blocked-models.ts +98 -0
  698. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +105 -21
  699. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +46 -24
  700. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +163 -0
  701. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
  702. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +15 -0
  703. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
  704. package/src/resources/extensions/gsd/bootstrap/system-context.ts +89 -10
  705. package/src/resources/extensions/gsd/commands/catalog.ts +74 -9
  706. package/src/resources/extensions/gsd/commands/handlers/core.ts +69 -27
  707. package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
  708. package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +196 -0
  709. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  710. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +279 -29
  711. package/src/resources/extensions/gsd/commands-cmux.ts +6 -2
  712. package/src/resources/extensions/gsd/commands-config.ts +10 -0
  713. package/src/resources/extensions/gsd/commands-debug.ts +484 -0
  714. package/src/resources/extensions/gsd/commands-do.ts +1 -0
  715. package/src/resources/extensions/gsd/commands-extract-learnings.ts +262 -78
  716. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  717. package/src/resources/extensions/gsd/commands-memory.ts +551 -0
  718. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +49 -12
  719. package/src/resources/extensions/gsd/commands-scan.ts +125 -0
  720. package/src/resources/extensions/gsd/commands-workflow-templates.ts +129 -2
  721. package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
  722. package/src/resources/extensions/gsd/db-writer.ts +91 -17
  723. package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
  724. package/src/resources/extensions/gsd/definition-loader.ts +7 -0
  725. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -9
  726. package/src/resources/extensions/gsd/doctor-environment.ts +2 -1
  727. package/src/resources/extensions/gsd/doctor-git-checks.ts +51 -30
  728. package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
  729. package/src/resources/extensions/gsd/doctor-providers.ts +109 -26
  730. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +23 -4
  731. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  732. package/src/resources/extensions/gsd/doctor.ts +7 -1
  733. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +2 -0
  734. package/src/resources/extensions/gsd/error-classifier.ts +32 -3
  735. package/src/resources/extensions/gsd/escalation.ts +367 -0
  736. package/src/resources/extensions/gsd/forensics.ts +25 -29
  737. package/src/resources/extensions/gsd/git-service.ts +0 -1
  738. package/src/resources/extensions/gsd/graph.ts +33 -3
  739. package/src/resources/extensions/gsd/gsd-db.ts +617 -32
  740. package/src/resources/extensions/gsd/health-widget-core.ts +43 -14
  741. package/src/resources/extensions/gsd/health-widget.ts +7 -3
  742. package/src/resources/extensions/gsd/hook-emitter.ts +188 -0
  743. package/src/resources/extensions/gsd/init-wizard.ts +87 -54
  744. package/src/resources/extensions/gsd/markdown-renderer.ts +5 -5
  745. package/src/resources/extensions/gsd/memory-backfill.ts +140 -0
  746. package/src/resources/extensions/gsd/memory-embeddings.ts +235 -0
  747. package/src/resources/extensions/gsd/memory-extractor.ts +100 -34
  748. package/src/resources/extensions/gsd/memory-ingest.ts +286 -0
  749. package/src/resources/extensions/gsd/memory-relations.ts +240 -0
  750. package/src/resources/extensions/gsd/memory-source-store.ts +138 -0
  751. package/src/resources/extensions/gsd/memory-store.ts +377 -7
  752. package/src/resources/extensions/gsd/metrics.ts +1 -0
  753. package/src/resources/extensions/gsd/model-cost-table.ts +3 -1
  754. package/src/resources/extensions/gsd/model-router.ts +25 -6
  755. package/src/resources/extensions/gsd/native-git-bridge.ts +134 -6
  756. package/src/resources/extensions/gsd/notification-overlay.ts +9 -19
  757. package/src/resources/extensions/gsd/notification-widget.ts +25 -43
  758. package/src/resources/extensions/gsd/notifications.ts +6 -0
  759. package/src/resources/extensions/gsd/onboarding-state.ts +146 -0
  760. package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
  761. package/src/resources/extensions/gsd/pre-execution-checks.ts +106 -12
  762. package/src/resources/extensions/gsd/preferences-models.ts +1 -0
  763. package/src/resources/extensions/gsd/preferences-types.ts +10 -2
  764. package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
  765. package/src/resources/extensions/gsd/preferences.ts +10 -10
  766. package/src/resources/extensions/gsd/prompts/add-tests.md +1 -0
  767. package/src/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  768. package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  769. package/src/resources/extensions/gsd/prompts/debug-diagnose.md +27 -0
  770. package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  771. package/src/resources/extensions/gsd/prompts/execute-task.md +16 -3
  772. package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  773. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  774. package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  775. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -0
  776. package/src/resources/extensions/gsd/prompts/scan.md +79 -0
  777. package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  778. package/src/resources/extensions/gsd/python-resolver.ts +76 -0
  779. package/src/resources/extensions/gsd/run-manager.ts +53 -19
  780. package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
  781. package/src/resources/extensions/gsd/state.ts +95 -6
  782. package/src/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  783. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +1 -34
  784. package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
  785. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +49 -0
  786. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +45 -31
  787. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
  788. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +95 -1
  789. package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
  790. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
  791. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
  792. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +39 -0
  793. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +98 -0
  794. package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +54 -0
  795. package/src/resources/extensions/gsd/tests/commands-do.test.ts +48 -0
  796. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +335 -21
  797. package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
  798. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +8 -6
  799. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +6 -8
  800. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  801. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
  802. package/src/resources/extensions/gsd/tests/debug-command-handler.test.ts +905 -0
  803. package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
  804. package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
  805. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +42 -0
  806. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +8 -4
  807. package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +64 -0
  808. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +67 -0
  809. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +175 -17
  810. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
  811. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +306 -1
  812. package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
  813. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +29 -12
  814. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +145 -8
  815. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +74 -0
  816. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +62 -0
  817. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -4
  818. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -1
  819. package/src/resources/extensions/gsd/tests/health-widget.test.ts +8 -2
  820. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +190 -0
  821. package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +90 -0
  822. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +117 -0
  823. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
  824. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +68 -1
  825. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +109 -11
  826. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +51 -0
  827. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +2 -2
  828. package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
  829. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -1
  830. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +206 -1
  831. package/src/resources/extensions/gsd/tests/load-memory-block.test.ts +36 -0
  832. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  833. package/src/resources/extensions/gsd/tests/memory-embeddings.test.ts +213 -0
  834. package/src/resources/extensions/gsd/tests/memory-ingest.test.ts +153 -0
  835. package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +107 -0
  836. package/src/resources/extensions/gsd/tests/memory-relations.test.ts +175 -0
  837. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  838. package/src/resources/extensions/gsd/tests/memory-tools.test.ts +295 -0
  839. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +3 -2
  840. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +2 -2
  841. package/src/resources/extensions/gsd/tests/model-router.test.ts +51 -1
  842. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
  843. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +56 -37
  844. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
  845. package/src/resources/extensions/gsd/tests/onboarding-state.test.ts +105 -0
  846. package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
  847. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +4 -5
  848. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
  849. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
  850. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +341 -6
  851. package/src/resources/extensions/gsd/tests/preferences.test.ts +69 -1
  852. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
  853. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +11 -2
  854. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
  855. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +159 -8
  856. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
  857. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +1 -1
  858. package/src/resources/extensions/gsd/tests/prompts-no-gitignored-test-refs.test.ts +56 -0
  859. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +88 -4
  860. package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
  861. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +67 -0
  862. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +107 -0
  863. package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
  864. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
  865. package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +125 -0
  866. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
  867. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +54 -0
  868. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
  869. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +15 -0
  870. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
  871. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +2 -1
  872. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +31 -1
  873. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +166 -0
  874. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +9 -3
  875. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +35 -0
  876. package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
  877. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +15 -6
  878. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  879. package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
  880. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
  881. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +8 -2
  882. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +97 -0
  883. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
  884. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
  885. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  886. package/src/resources/extensions/gsd/tools/memory-tools.ts +410 -0
  887. package/src/resources/extensions/gsd/tools/plan-milestone.ts +42 -8
  888. package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
  889. package/src/resources/extensions/gsd/tools/skip-slice.ts +133 -0
  890. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +14 -0
  891. package/src/resources/extensions/gsd/types.ts +62 -0
  892. package/src/resources/extensions/gsd/unit-runtime.ts +1 -0
  893. package/src/resources/extensions/gsd/uok/contracts.ts +2 -1
  894. package/src/resources/extensions/gsd/uok/flags.ts +7 -7
  895. package/src/resources/extensions/gsd/uok/kernel.ts +16 -4
  896. package/src/resources/extensions/gsd/verification-gate.ts +2 -1
  897. package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
  898. package/src/resources/extensions/gsd/workflow-install.ts +423 -0
  899. package/src/resources/extensions/gsd/workflow-logger.ts +4 -1
  900. package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
  901. package/src/resources/extensions/gsd/workflow-mcp.ts +1 -6
  902. package/src/resources/extensions/gsd/workflow-plugins.ts +403 -0
  903. package/src/resources/extensions/gsd/workflow-projections.ts +18 -16
  904. package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  905. package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  906. package/src/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  907. package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  908. package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  909. package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  910. package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  911. package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  912. package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  913. package/src/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  914. package/src/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  915. package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  916. package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  917. package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  918. package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  919. package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  920. package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  921. package/src/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  922. package/src/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  923. package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
  924. package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  925. package/src/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  926. package/src/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  927. package/src/resources/extensions/gsd/workflow-templates/spike.md +7 -0
  928. package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  929. package/src/resources/extensions/gsd/workflow-templates.ts +7 -0
  930. package/src/resources/extensions/gsd/workspace-index.ts +9 -4
  931. package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
  932. package/src/resources/extensions/remote-questions/commands.ts +480 -0
  933. package/src/resources/extensions/remote-questions/manager.ts +49 -4
  934. package/src/resources/extensions/remote-questions/telegram-adapter.ts +86 -4
  935. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +246 -0
  936. package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
  937. package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
  938. package/src/resources/extensions/search-the-web/command-search-provider.ts +5 -1
  939. package/src/resources/extensions/search-the-web/native-search.ts +50 -4
  940. package/src/resources/extensions/shared/interview-ui.ts +195 -1
  941. package/src/resources/extensions/shared/layout-utils.ts +26 -0
  942. package/src/resources/extensions/shared/rtk-shared.ts +58 -0
  943. package/src/resources/extensions/shared/rtk.ts +12 -52
  944. package/src/resources/extensions/shared/tests/interview-preview.test.ts +177 -0
  945. package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
  946. package/src/resources/skills/api-design/SKILL.md +190 -0
  947. package/src/resources/skills/create-mcp-server/SKILL.md +121 -0
  948. package/src/resources/skills/create-workflow/SKILL.md +33 -6
  949. package/src/resources/skills/decompose-into-slices/SKILL.md +139 -0
  950. package/src/resources/skills/dependency-upgrade/SKILL.md +158 -0
  951. package/src/resources/skills/design-an-interface/SKILL.md +102 -0
  952. package/src/resources/skills/forensics/SKILL.md +153 -0
  953. package/src/resources/skills/grill-me/SKILL.md +93 -0
  954. package/src/resources/skills/handoff/SKILL.md +121 -0
  955. package/src/resources/skills/observability/SKILL.md +174 -0
  956. package/src/resources/skills/security-review/SKILL.md +181 -0
  957. package/src/resources/skills/spike-wrap-up/SKILL.md +138 -0
  958. package/src/resources/skills/tdd/SKILL.md +112 -0
  959. package/src/resources/skills/verify-before-complete/SKILL.md +97 -0
  960. package/src/resources/skills/write-docs/SKILL.md +81 -0
  961. package/src/resources/skills/write-milestone-brief/SKILL.md +135 -0
  962. package/dist/web/standalone/.next/static/chunks/2826.dd3dc8bbd3025fa5.js +0 -9
  963. package/dist/web/standalone/.next/static/chunks/app/page-7115e62689b5fd84.js +0 -1
  964. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  965. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  966. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
  967. package/packages/native/dist/ps/types.d.ts +0 -5
  968. package/packages/native/dist/ps/types.js +0 -2
  969. package/packages/native/src/ps/types.ts +0 -5
  970. package/packages/pi-ai/node_modules/@smithy/node-http-handler/LICENSE +0 -201
  971. package/packages/pi-ai/node_modules/@smithy/node-http-handler/README.md +0 -9
  972. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-cjs/index.js +0 -762
  973. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +0 -19
  974. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/constants.js +0 -1
  975. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js +0 -9
  976. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/index.js +0 -3
  977. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +0 -230
  978. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +0 -87
  979. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js +0 -32
  980. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +0 -169
  981. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +0 -21
  982. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +0 -88
  983. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js +0 -36
  984. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js +0 -21
  985. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js +0 -22
  986. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js +0 -23
  987. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +0 -8
  988. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js +0 -41
  989. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +0 -21
  990. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/timing.js +0 -4
  991. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +0 -63
  992. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +0 -10
  993. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/constants.d.ts +0 -5
  994. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +0 -4
  995. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/index.d.ts +0 -3
  996. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +0 -46
  997. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +0 -24
  998. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +0 -12
  999. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-handler.d.ts +0 -63
  1000. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +0 -13
  1001. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +0 -12
  1002. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +0 -2
  1003. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +0 -6
  1004. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +0 -6
  1005. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +0 -2
  1006. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +0 -5
  1007. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/index.d.ts +0 -6
  1008. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +0 -13
  1009. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/timing.d.ts +0 -8
  1010. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +0 -10
  1011. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/constants.d.ts +0 -5
  1012. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +0 -4
  1013. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/index.d.ts +0 -3
  1014. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +0 -46
  1015. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +0 -24
  1016. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +0 -12
  1017. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-handler.d.ts +0 -63
  1018. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +0 -13
  1019. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +0 -12
  1020. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +0 -2
  1021. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +0 -6
  1022. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +0 -6
  1023. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +0 -2
  1024. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +0 -5
  1025. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/index.d.ts +0 -6
  1026. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +0 -13
  1027. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/timing.d.ts +0 -8
  1028. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +0 -12
  1029. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +0 -12
  1030. package/packages/pi-ai/node_modules/@smithy/node-http-handler/package.json +0 -68
  1031. package/packages/pi-ai/oauth.d.ts +0 -1
  1032. package/packages/pi-ai/oauth.js +0 -1
  1033. /package/dist/web/standalone/.next/static/{prkokVQFxWtUVIku57_0z → YnUwu2WWaT0_hyTLUF4nq}/_buildManifest.js +0 -0
  1034. /package/dist/web/standalone/.next/static/{prkokVQFxWtUVIku57_0z → YnUwu2WWaT0_hyTLUF4nq}/_ssgManifest.js +0 -0
@@ -135,7 +135,7 @@ function openRawDb(path) {
135
135
  const Database = providerModule;
136
136
  return new Database(path);
137
137
  }
138
- const SCHEMA_VERSION = 15;
138
+ const SCHEMA_VERSION = 21;
139
139
  function indexExists(db, name) {
140
140
  return !!db.prepare("SELECT 1 as present FROM sqlite_master WHERE type = 'index' AND name = ?").get(name);
141
141
  }
@@ -189,6 +189,7 @@ function initSchema(db, fileBacked) {
189
189
  rationale TEXT NOT NULL DEFAULT '',
190
190
  revisable TEXT NOT NULL DEFAULT '',
191
191
  made_by TEXT NOT NULL DEFAULT 'agent',
192
+ source TEXT NOT NULL DEFAULT 'discussion', -- ADR-011 P2: 'discussion' | 'planning' | 'escalation'
192
193
  superseded_by TEXT DEFAULT NULL
193
194
  )
194
195
  `);
@@ -231,7 +232,10 @@ function initSchema(db, fileBacked) {
231
232
  created_at TEXT NOT NULL,
232
233
  updated_at TEXT NOT NULL,
233
234
  superseded_by TEXT DEFAULT NULL,
234
- hit_count INTEGER NOT NULL DEFAULT 0
235
+ hit_count INTEGER NOT NULL DEFAULT 0,
236
+ scope TEXT NOT NULL DEFAULT 'project',
237
+ tags TEXT NOT NULL DEFAULT '[]',
238
+ structured_fields TEXT DEFAULT NULL
235
239
  )
236
240
  `);
237
241
  db.exec(`
@@ -242,6 +246,41 @@ function initSchema(db, fileBacked) {
242
246
  )
243
247
  `);
244
248
  db.exec(`
249
+ CREATE TABLE IF NOT EXISTS memory_sources (
250
+ id TEXT PRIMARY KEY,
251
+ kind TEXT NOT NULL,
252
+ uri TEXT,
253
+ title TEXT,
254
+ content TEXT NOT NULL,
255
+ content_hash TEXT NOT NULL UNIQUE,
256
+ imported_at TEXT NOT NULL,
257
+ scope TEXT NOT NULL DEFAULT 'project',
258
+ tags TEXT NOT NULL DEFAULT '[]'
259
+ )
260
+ `);
261
+ db.exec(`
262
+ CREATE TABLE IF NOT EXISTS memory_embeddings (
263
+ memory_id TEXT PRIMARY KEY,
264
+ model TEXT NOT NULL,
265
+ dim INTEGER NOT NULL,
266
+ vector BLOB NOT NULL,
267
+ updated_at TEXT NOT NULL
268
+ )
269
+ `);
270
+ db.exec(`
271
+ CREATE TABLE IF NOT EXISTS memory_relations (
272
+ from_id TEXT NOT NULL,
273
+ to_id TEXT NOT NULL,
274
+ rel TEXT NOT NULL,
275
+ confidence REAL NOT NULL DEFAULT 0.8,
276
+ created_at TEXT NOT NULL,
277
+ PRIMARY KEY (from_id, to_id, rel)
278
+ )
279
+ `);
280
+ // FTS5 virtual table mirroring memories.content for fast keyword search.
281
+ // Optional — if the SQLite build lacks FTS5, we fall back to LIKE scans.
282
+ tryCreateMemoriesFts(db);
283
+ db.exec(`
245
284
  CREATE TABLE IF NOT EXISTS milestones (
246
285
  id TEXT PRIMARY KEY,
247
286
  title TEXT NOT NULL DEFAULT '',
@@ -282,6 +321,8 @@ function initSchema(db, fileBacked) {
282
321
  observability_impact TEXT NOT NULL DEFAULT '',
283
322
  sequence INTEGER DEFAULT 0, -- Ordering hint: tools may set this to control execution order
284
323
  replan_triggered_at TEXT DEFAULT NULL,
324
+ is_sketch INTEGER NOT NULL DEFAULT 0, -- ADR-011: 1 = slice is a sketch awaiting refinement
325
+ sketch_scope TEXT NOT NULL DEFAULT '', -- ADR-011: 2-3 sentence rough scope from plan-milestone
285
326
  PRIMARY KEY (milestone_id, id),
286
327
  FOREIGN KEY (milestone_id) REFERENCES milestones(id)
287
328
  )
@@ -299,6 +340,11 @@ function initSchema(db, fileBacked) {
299
340
  duration TEXT NOT NULL DEFAULT '',
300
341
  completed_at TEXT DEFAULT NULL,
301
342
  blocker_discovered INTEGER DEFAULT 0,
343
+ blocker_source TEXT NOT NULL DEFAULT '', -- ADR-011 P2: provenance for blocker_discovered (e.g. 'reject-escalation')
344
+ escalation_pending INTEGER NOT NULL DEFAULT 0, -- ADR-011 P2: pause-on-escalation flag
345
+ escalation_awaiting_review INTEGER NOT NULL DEFAULT 0, -- ADR-011 P2: artifact exists but continueWithDefault=true (no pause)
346
+ escalation_artifact_path TEXT DEFAULT NULL, -- ADR-011 P2: path to T##-ESCALATION.json
347
+ escalation_override_applied_at TEXT DEFAULT NULL, -- ADR-011 P2: DB claim lock for idempotent override injection
302
348
  deviations TEXT NOT NULL DEFAULT '',
303
349
  known_issues TEXT NOT NULL DEFAULT '',
304
350
  key_files TEXT NOT NULL DEFAULT '[]',
@@ -445,6 +491,15 @@ function initSchema(db, fileBacked) {
445
491
  )
446
492
  `);
447
493
  db.exec("CREATE INDEX IF NOT EXISTS idx_memories_active ON memories(superseded_by)");
494
+ // Existing DBs may arrive here before migrateSchema() has added columns
495
+ // that fresh installs already have. Add only columns needed by bootstrap
496
+ // indexes so old DBs can open far enough for the normal migration chain.
497
+ ensureBootstrapIndexColumns(db);
498
+ db.exec("CREATE INDEX IF NOT EXISTS idx_memories_scope ON memories(scope)");
499
+ db.exec("CREATE INDEX IF NOT EXISTS idx_memory_sources_kind ON memory_sources(kind)");
500
+ db.exec("CREATE INDEX IF NOT EXISTS idx_memory_sources_scope ON memory_sources(scope)");
501
+ db.exec("CREATE INDEX IF NOT EXISTS idx_memory_relations_from ON memory_relations(from_id)");
502
+ db.exec("CREATE INDEX IF NOT EXISTS idx_memory_relations_to ON memory_relations(to_id)");
448
503
  db.exec("CREATE INDEX IF NOT EXISTS idx_replan_history_milestone ON replan_history(milestone_id, created_at)");
449
504
  // v13 indexes — hot-path dispatch queries
450
505
  db.exec("CREATE INDEX IF NOT EXISTS idx_tasks_active ON tasks(milestone_id, slice_id, status)");
@@ -460,6 +515,9 @@ function initSchema(db, fileBacked) {
460
515
  db.exec("CREATE INDEX IF NOT EXISTS idx_turn_git_tx_turn ON turn_git_transactions(trace_id, turn_id)");
461
516
  db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_trace ON audit_events(trace_id, ts)");
462
517
  db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_turn ON audit_events(trace_id, turn_id, ts)");
518
+ // ADR-011 Phase 2 — also created by the v17 migration; fresh installs
519
+ // skip migrations so the index must be created here too.
520
+ db.exec("CREATE INDEX IF NOT EXISTS idx_tasks_escalation_pending ON tasks(milestone_id, slice_id, escalation_pending)");
463
521
  db.exec(`CREATE VIEW IF NOT EXISTS active_decisions AS SELECT * FROM decisions WHERE superseded_by IS NULL`);
464
522
  db.exec(`CREATE VIEW IF NOT EXISTS active_requirements AS SELECT * FROM requirements WHERE superseded_by IS NULL`);
465
523
  db.exec(`CREATE VIEW IF NOT EXISTS active_memories AS SELECT * FROM memories WHERE superseded_by IS NULL`);
@@ -482,10 +540,67 @@ function columnExists(db, table, column) {
482
540
  const rows = db.prepare(`PRAGMA table_info(${table})`).all();
483
541
  return rows.some((row) => row["name"] === column);
484
542
  }
543
+ /**
544
+ * Create the FTS5 virtual table for memories plus the triggers that keep it
545
+ * in sync with the base table. FTS5 may be unavailable on stripped-down
546
+ * SQLite builds — callers should treat failure as non-fatal and fall back
547
+ * to LIKE-based scans in `memory-store.queryMemoriesRanked`.
548
+ */
549
+ export function tryCreateMemoriesFts(db) {
550
+ try {
551
+ db.exec(`
552
+ CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts
553
+ USING fts5(content, content='memories', content_rowid='seq', tokenize='porter unicode61')
554
+ `);
555
+ // Triggers mirror inserts / updates / deletes on the base memories table.
556
+ db.exec(`
557
+ CREATE TRIGGER IF NOT EXISTS memories_ai
558
+ AFTER INSERT ON memories BEGIN
559
+ INSERT INTO memories_fts(rowid, content) VALUES (new.seq, new.content);
560
+ END
561
+ `);
562
+ db.exec(`
563
+ CREATE TRIGGER IF NOT EXISTS memories_ad
564
+ AFTER DELETE ON memories BEGIN
565
+ INSERT INTO memories_fts(memories_fts, rowid, content) VALUES ('delete', old.seq, old.content);
566
+ END
567
+ `);
568
+ db.exec(`
569
+ CREATE TRIGGER IF NOT EXISTS memories_au
570
+ AFTER UPDATE OF content ON memories BEGIN
571
+ INSERT INTO memories_fts(memories_fts, rowid, content) VALUES ('delete', old.seq, old.content);
572
+ INSERT INTO memories_fts(rowid, content) VALUES (new.seq, new.content);
573
+ END
574
+ `);
575
+ return true;
576
+ }
577
+ catch (err) {
578
+ logWarning("db", `FTS5 unavailable — memory queries will use LIKE fallback: ${err.message}`);
579
+ return false;
580
+ }
581
+ }
582
+ export function isMemoriesFtsAvailable(db) {
583
+ try {
584
+ const row = db
585
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='memories_fts'")
586
+ .get();
587
+ return !!row;
588
+ }
589
+ catch {
590
+ return false;
591
+ }
592
+ }
485
593
  function ensureColumn(db, table, column, ddl) {
486
594
  if (!columnExists(db, table, column))
487
595
  db.exec(ddl);
488
596
  }
597
+ function ensureBootstrapIndexColumns(db) {
598
+ ensureColumn(db, "memories", "scope", `ALTER TABLE memories ADD COLUMN scope TEXT NOT NULL DEFAULT 'project'`);
599
+ ensureColumn(db, "memories", "tags", `ALTER TABLE memories ADD COLUMN tags TEXT NOT NULL DEFAULT '[]'`);
600
+ ensureColumn(db, "memory_sources", "scope", `ALTER TABLE memory_sources ADD COLUMN scope TEXT NOT NULL DEFAULT 'project'`);
601
+ ensureColumn(db, "memory_sources", "tags", `ALTER TABLE memory_sources ADD COLUMN tags TEXT NOT NULL DEFAULT '[]'`);
602
+ ensureColumn(db, "tasks", "escalation_pending", `ALTER TABLE tasks ADD COLUMN escalation_pending INTEGER NOT NULL DEFAULT 0`);
603
+ }
489
604
  function migrateSchema(db) {
490
605
  const row = db.prepare("SELECT MAX(version) as v FROM schema_version").get();
491
606
  const currentVersion = row ? row["v"] : 0;
@@ -861,6 +976,115 @@ function migrateSchema(db) {
861
976
  ":applied_at": new Date().toISOString(),
862
977
  });
863
978
  }
979
+ if (currentVersion < 16) {
980
+ // ADR-011 Phase 1: sketch-then-refine progressive planning — sketch columns on slices.
981
+ ensureColumn(db, "slices", "is_sketch", `ALTER TABLE slices ADD COLUMN is_sketch INTEGER NOT NULL DEFAULT 0`);
982
+ ensureColumn(db, "slices", "sketch_scope", `ALTER TABLE slices ADD COLUMN sketch_scope TEXT NOT NULL DEFAULT ''`);
983
+ // ADR-011 Phase 2: decisions can now be sourced from escalation resolutions.
984
+ ensureColumn(db, "decisions", "source", `ALTER TABLE decisions ADD COLUMN source TEXT NOT NULL DEFAULT 'discussion'`);
985
+ db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
986
+ ":version": 16,
987
+ ":applied_at": new Date().toISOString(),
988
+ });
989
+ }
990
+ if (currentVersion < 17) {
991
+ // ADR-011 Phase 2: mid-execution escalation — columns on the tasks table.
992
+ ensureColumn(db, "tasks", "blocker_source", `ALTER TABLE tasks ADD COLUMN blocker_source TEXT NOT NULL DEFAULT ''`);
993
+ ensureColumn(db, "tasks", "escalation_pending", `ALTER TABLE tasks ADD COLUMN escalation_pending INTEGER NOT NULL DEFAULT 0`);
994
+ ensureColumn(db, "tasks", "escalation_awaiting_review", `ALTER TABLE tasks ADD COLUMN escalation_awaiting_review INTEGER NOT NULL DEFAULT 0`);
995
+ ensureColumn(db, "tasks", "escalation_artifact_path", `ALTER TABLE tasks ADD COLUMN escalation_artifact_path TEXT DEFAULT NULL`);
996
+ ensureColumn(db, "tasks", "escalation_override_applied_at", `ALTER TABLE tasks ADD COLUMN escalation_override_applied_at TEXT DEFAULT NULL`);
997
+ db.exec("CREATE INDEX IF NOT EXISTS idx_tasks_escalation_pending ON tasks(milestone_id, slice_id, escalation_pending)");
998
+ db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
999
+ ":version": 17,
1000
+ ":applied_at": new Date().toISOString(),
1001
+ });
1002
+ }
1003
+ if (currentVersion < 18) {
1004
+ // Memory system Phase 2: scope + tags on memories, plus memory_sources
1005
+ // table for raw ingested content (notes, files, URLs, artifacts).
1006
+ ensureColumn(db, "memories", "scope", `ALTER TABLE memories ADD COLUMN scope TEXT NOT NULL DEFAULT 'project'`);
1007
+ ensureColumn(db, "memories", "tags", `ALTER TABLE memories ADD COLUMN tags TEXT NOT NULL DEFAULT '[]'`);
1008
+ db.exec(`
1009
+ CREATE TABLE IF NOT EXISTS memory_sources (
1010
+ id TEXT PRIMARY KEY,
1011
+ kind TEXT NOT NULL,
1012
+ uri TEXT,
1013
+ title TEXT,
1014
+ content TEXT NOT NULL,
1015
+ content_hash TEXT NOT NULL UNIQUE,
1016
+ imported_at TEXT NOT NULL,
1017
+ scope TEXT NOT NULL DEFAULT 'project',
1018
+ tags TEXT NOT NULL DEFAULT '[]'
1019
+ )
1020
+ `);
1021
+ db.exec("CREATE INDEX IF NOT EXISTS idx_memories_scope ON memories(scope)");
1022
+ db.exec("CREATE INDEX IF NOT EXISTS idx_memory_sources_kind ON memory_sources(kind)");
1023
+ db.exec("CREATE INDEX IF NOT EXISTS idx_memory_sources_scope ON memory_sources(scope)");
1024
+ db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
1025
+ ":version": 18,
1026
+ ":applied_at": new Date().toISOString(),
1027
+ });
1028
+ }
1029
+ if (currentVersion < 19) {
1030
+ // Memory system Phase 3: embeddings + FTS5 for hybrid retrieval.
1031
+ db.exec(`
1032
+ CREATE TABLE IF NOT EXISTS memory_embeddings (
1033
+ memory_id TEXT PRIMARY KEY,
1034
+ model TEXT NOT NULL,
1035
+ dim INTEGER NOT NULL,
1036
+ vector BLOB NOT NULL,
1037
+ updated_at TEXT NOT NULL
1038
+ )
1039
+ `);
1040
+ tryCreateMemoriesFts(db);
1041
+ // Backfill FTS5 with any existing memories (triggers only cover future writes).
1042
+ if (isMemoriesFtsAvailable(db)) {
1043
+ try {
1044
+ db.exec(`INSERT INTO memories_fts(rowid, content) SELECT seq, content FROM memories`);
1045
+ }
1046
+ catch (err) {
1047
+ logWarning("db", `FTS5 backfill failed: ${err.message}`);
1048
+ }
1049
+ }
1050
+ db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
1051
+ ":version": 19,
1052
+ ":applied_at": new Date().toISOString(),
1053
+ });
1054
+ }
1055
+ if (currentVersion < 20) {
1056
+ // Memory system Phase 4: knowledge-graph relations between memories.
1057
+ db.exec(`
1058
+ CREATE TABLE IF NOT EXISTS memory_relations (
1059
+ from_id TEXT NOT NULL,
1060
+ to_id TEXT NOT NULL,
1061
+ rel TEXT NOT NULL,
1062
+ confidence REAL NOT NULL DEFAULT 0.8,
1063
+ created_at TEXT NOT NULL,
1064
+ PRIMARY KEY (from_id, to_id, rel)
1065
+ )
1066
+ `);
1067
+ db.exec("CREATE INDEX IF NOT EXISTS idx_memory_relations_from ON memory_relations(from_id)");
1068
+ db.exec("CREATE INDEX IF NOT EXISTS idx_memory_relations_to ON memory_relations(to_id)");
1069
+ db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
1070
+ ":version": 20,
1071
+ ":applied_at": new Date().toISOString(),
1072
+ });
1073
+ }
1074
+ if (currentVersion < 21) {
1075
+ // ADR-013 Step 2: preserve structured fields (gsd_save_decision's
1076
+ // scope/decision/choice/rationale/made_by/revisable) on memories rows so
1077
+ // the eventual decisions->memories cutover does not lose schema fidelity.
1078
+ // Nullable JSON column — existing rows stay NULL until backfilled in Step 5.
1079
+ // Use ensureColumn for race-safety (matches v15-v18 pattern; bare ALTER
1080
+ // throws "duplicate column" on the loser of a concurrent open race even
1081
+ // though the transaction wrapper protects the schema_version row).
1082
+ ensureColumn(db, "memories", "structured_fields", "ALTER TABLE memories ADD COLUMN structured_fields TEXT DEFAULT NULL");
1083
+ db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
1084
+ ":version": 21,
1085
+ ":applied_at": new Date().toISOString(),
1086
+ });
1087
+ }
864
1088
  db.exec("COMMIT");
865
1089
  }
866
1090
  catch (err) {
@@ -984,6 +1208,17 @@ export function vacuumDatabase() {
984
1208
  logWarning("db", `VACUUM failed: ${e.message}`);
985
1209
  }
986
1210
  }
1211
+ /** Flush WAL into gsd.db so `git add .gsd/gsd.db` stages current state — safe while DB is open. */
1212
+ export function checkpointDatabase() {
1213
+ if (!currentDb)
1214
+ return;
1215
+ try {
1216
+ currentDb.exec('PRAGMA wal_checkpoint(TRUNCATE)');
1217
+ }
1218
+ catch (e) {
1219
+ logWarning("db", `WAL checkpoint failed: ${e.message}`);
1220
+ }
1221
+ }
987
1222
  let _txDepth = 0;
988
1223
  export function transaction(fn) {
989
1224
  if (!currentDb)
@@ -1061,8 +1296,8 @@ export function readTransaction(fn) {
1061
1296
  export function insertDecision(d) {
1062
1297
  if (!currentDb)
1063
1298
  throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1064
- currentDb.prepare(`INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable, made_by, superseded_by)
1065
- VALUES (:id, :when_context, :scope, :decision, :choice, :rationale, :revisable, :made_by, :superseded_by)`).run({
1299
+ currentDb.prepare(`INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by)
1300
+ VALUES (:id, :when_context, :scope, :decision, :choice, :rationale, :revisable, :made_by, :source, :superseded_by)`).run({
1066
1301
  ":id": d.id,
1067
1302
  ":when_context": d.when_context,
1068
1303
  ":scope": d.scope,
@@ -1071,6 +1306,7 @@ export function insertDecision(d) {
1071
1306
  ":rationale": d.rationale,
1072
1307
  ":revisable": d.revisable,
1073
1308
  ":made_by": d.made_by ?? "agent",
1309
+ ":source": d.source ?? "discussion",
1074
1310
  ":superseded_by": d.superseded_by,
1075
1311
  });
1076
1312
  }
@@ -1090,6 +1326,7 @@ export function getDecisionById(id) {
1090
1326
  rationale: row["rationale"],
1091
1327
  revisable: row["revisable"],
1092
1328
  made_by: row["made_by"] ?? "agent",
1329
+ source: row["source"] ?? "discussion",
1093
1330
  superseded_by: row["superseded_by"] ?? null,
1094
1331
  };
1095
1332
  }
@@ -1107,6 +1344,7 @@ export function getActiveDecisions() {
1107
1344
  rationale: row["rationale"],
1108
1345
  revisable: row["revisable"],
1109
1346
  made_by: row["made_by"] ?? "agent",
1347
+ source: row["source"] ?? "discussion",
1110
1348
  superseded_by: null,
1111
1349
  }));
1112
1350
  }
@@ -1189,8 +1427,8 @@ export function upsertDecision(d) {
1189
1427
  // Use ON CONFLICT DO UPDATE instead of INSERT OR REPLACE to preserve the
1190
1428
  // seq column. INSERT OR REPLACE deletes then reinserts, resetting seq and
1191
1429
  // corrupting decision ordering in DECISIONS.md after reconcile replay.
1192
- currentDb.prepare(`INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable, made_by, superseded_by)
1193
- VALUES (:id, :when_context, :scope, :decision, :choice, :rationale, :revisable, :made_by, :superseded_by)
1430
+ currentDb.prepare(`INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by)
1431
+ VALUES (:id, :when_context, :scope, :decision, :choice, :rationale, :revisable, :made_by, :source, :superseded_by)
1194
1432
  ON CONFLICT(id) DO UPDATE SET
1195
1433
  when_context = excluded.when_context,
1196
1434
  scope = excluded.scope,
@@ -1199,6 +1437,7 @@ export function upsertDecision(d) {
1199
1437
  rationale = excluded.rationale,
1200
1438
  revisable = excluded.revisable,
1201
1439
  made_by = excluded.made_by,
1440
+ source = excluded.source,
1202
1441
  superseded_by = excluded.superseded_by`).run({
1203
1442
  ":id": d.id,
1204
1443
  ":when_context": d.when_context,
@@ -1208,6 +1447,7 @@ export function upsertDecision(d) {
1208
1447
  ":rationale": d.rationale,
1209
1448
  ":revisable": d.revisable,
1210
1449
  ":made_by": d.made_by ?? "agent",
1450
+ ":source": d.source ?? "discussion",
1211
1451
  ":superseded_by": d.superseded_by ?? null,
1212
1452
  });
1213
1453
  }
@@ -1327,10 +1567,12 @@ export function insertSlice(s) {
1327
1567
  throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1328
1568
  currentDb.prepare(`INSERT INTO slices (
1329
1569
  milestone_id, id, title, status, risk, depends, demo, created_at,
1330
- goal, success_criteria, proof_level, integration_closure, observability_impact, sequence
1570
+ goal, success_criteria, proof_level, integration_closure, observability_impact, sequence,
1571
+ is_sketch, sketch_scope
1331
1572
  ) VALUES (
1332
1573
  :milestone_id, :id, :title, :status, :risk, :depends, :demo, :created_at,
1333
- :goal, :success_criteria, :proof_level, :integration_closure, :observability_impact, :sequence
1574
+ :goal, :success_criteria, :proof_level, :integration_closure, :observability_impact, :sequence,
1575
+ :is_sketch, :sketch_scope
1334
1576
  )
1335
1577
  ON CONFLICT (milestone_id, id) DO UPDATE SET
1336
1578
  title = CASE WHEN :raw_title IS NOT NULL THEN excluded.title ELSE slices.title END,
@@ -1343,7 +1585,9 @@ export function insertSlice(s) {
1343
1585
  proof_level = CASE WHEN :raw_proof_level IS NOT NULL THEN excluded.proof_level ELSE slices.proof_level END,
1344
1586
  integration_closure = CASE WHEN :raw_integration_closure IS NOT NULL THEN excluded.integration_closure ELSE slices.integration_closure END,
1345
1587
  observability_impact = CASE WHEN :raw_observability_impact IS NOT NULL THEN excluded.observability_impact ELSE slices.observability_impact END,
1346
- sequence = CASE WHEN :raw_sequence IS NOT NULL THEN excluded.sequence ELSE slices.sequence END`).run({
1588
+ sequence = CASE WHEN :raw_sequence IS NOT NULL THEN excluded.sequence ELSE slices.sequence END,
1589
+ is_sketch = CASE WHEN :raw_is_sketch IS NOT NULL THEN excluded.is_sketch ELSE slices.is_sketch END,
1590
+ sketch_scope = CASE WHEN :raw_sketch_scope IS NOT NULL THEN excluded.sketch_scope ELSE slices.sketch_scope END`).run({
1347
1591
  ":milestone_id": s.milestoneId,
1348
1592
  ":id": s.id,
1349
1593
  ":title": s.title ?? "",
@@ -1358,6 +1602,8 @@ export function insertSlice(s) {
1358
1602
  ":integration_closure": s.planning?.integrationClosure ?? "",
1359
1603
  ":observability_impact": s.planning?.observabilityImpact ?? "",
1360
1604
  ":sequence": s.sequence ?? 0,
1605
+ ":is_sketch": s.isSketch ? 1 : 0,
1606
+ ":sketch_scope": s.sketchScope ?? "",
1361
1607
  // Raw sentinel params: NULL when caller omitted the field, used in ON CONFLICT guards
1362
1608
  ":raw_title": s.title ?? null,
1363
1609
  ":raw_risk": s.risk ?? null,
@@ -1368,8 +1614,47 @@ export function insertSlice(s) {
1368
1614
  ":raw_integration_closure": s.planning?.integrationClosure ?? null,
1369
1615
  ":raw_observability_impact": s.planning?.observabilityImpact ?? null,
1370
1616
  ":raw_sequence": s.sequence ?? null,
1617
+ ":raw_is_sketch": s.isSketch === undefined ? null : (s.isSketch ? 1 : 0),
1618
+ // NOTE: use !== undefined (not ??) so an explicit empty string "" is treated
1619
+ // as a present value and correctly clears the existing sketch_scope on
1620
+ // CONFLICT. ?? would incorrectly preserve the stale value.
1621
+ ":raw_sketch_scope": s.sketchScope !== undefined ? s.sketchScope : null,
1371
1622
  });
1372
1623
  }
1624
+ // ADR-011: sketch-then-refine helpers
1625
+ export function setSliceSketchFlag(milestoneId, sliceId, isSketch) {
1626
+ if (!currentDb)
1627
+ throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1628
+ currentDb.prepare(`UPDATE slices SET is_sketch = :is_sketch WHERE milestone_id = :mid AND id = :sid`).run({ ":is_sketch": isSketch ? 1 : 0, ":mid": milestoneId, ":sid": sliceId });
1629
+ }
1630
+ /**
1631
+ * ADR-011 auto-heal: reconcile stale is_sketch=1 rows whose PLAN already exists.
1632
+ *
1633
+ * Callers pass a predicate that resolves whether a plan file exists for a slice.
1634
+ * The predicate MUST use the canonical path resolver (`resolveSliceFile`, etc.)
1635
+ * to keep path logic in one place — do not hand-roll the path inside the callback.
1636
+ *
1637
+ * Recovers from two scenarios:
1638
+ * 1. Crash between `gsd_plan_slice` write and the sketch flag flip.
1639
+ * 2. Flag-OFF downgrade path: when `progressive_planning` is off, the dispatch
1640
+ * rule routes sketch slices to plan-slice, which writes PLAN.md but leaves
1641
+ * `is_sketch=1` — the next state derivation auto-heals it to 0 here.
1642
+ *
1643
+ * Not aggressive in practice: PLAN.md is only written via the DB-backed
1644
+ * `gsd_plan_slice` tool (which also inserts tasks), so a "stale PLAN.md with
1645
+ * is_sketch=1" is extremely unlikely to indicate anything other than the two
1646
+ * recovery scenarios above.
1647
+ */
1648
+ export function autoHealSketchFlags(milestoneId, hasPlanFile) {
1649
+ if (!currentDb)
1650
+ return;
1651
+ const rows = currentDb.prepare(`SELECT id FROM slices WHERE milestone_id = :mid AND is_sketch = 1`).all({ ":mid": milestoneId });
1652
+ for (const row of rows) {
1653
+ if (hasPlanFile(row.id)) {
1654
+ setSliceSketchFlag(milestoneId, row.id, false);
1655
+ }
1656
+ }
1657
+ }
1373
1658
  export function upsertSlicePlanning(milestoneId, sliceId, planning) {
1374
1659
  if (!currentDb)
1375
1660
  throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
@@ -1516,6 +1801,8 @@ function rowToSlice(row) {
1516
1801
  observability_impact: row["observability_impact"] ?? "",
1517
1802
  sequence: row["sequence"] ?? 0,
1518
1803
  replan_triggered_at: row["replan_triggered_at"] ?? null,
1804
+ is_sketch: row["is_sketch"] ?? 0,
1805
+ sketch_scope: row["sketch_scope"] ?? "",
1519
1806
  };
1520
1807
  }
1521
1808
  export function getSlice(milestoneId, sliceId) {
@@ -1616,6 +1903,11 @@ function rowToTask(row) {
1616
1903
  observability_impact: row["observability_impact"] ?? "",
1617
1904
  full_plan_md: row["full_plan_md"] ?? "",
1618
1905
  sequence: row["sequence"] ?? 0,
1906
+ blocker_source: row["blocker_source"] ?? "",
1907
+ escalation_pending: row["escalation_pending"] ?? 0,
1908
+ escalation_awaiting_review: row["escalation_awaiting_review"] ?? 0,
1909
+ escalation_artifact_path: row["escalation_artifact_path"] ?? null,
1910
+ escalation_override_applied_at: row["escalation_override_applied_at"] ?? null,
1619
1911
  };
1620
1912
  }
1621
1913
  export function getTask(milestoneId, sliceId, taskId) {
@@ -1632,6 +1924,95 @@ export function getSliceTasks(milestoneId, sliceId) {
1632
1924
  const rows = currentDb.prepare("SELECT * FROM tasks WHERE milestone_id = :mid AND slice_id = :sid ORDER BY sequence, id").all({ ":mid": milestoneId, ":sid": sliceId });
1633
1925
  return rows.map(rowToTask);
1634
1926
  }
1927
+ // ─── ADR-011 Phase 2 escalation helpers ──────────────────────────────────
1928
+ /** Set pause-on-escalation state on a completed task. Mutually exclusive with awaiting_review. */
1929
+ export function setTaskEscalationPending(milestoneId, sliceId, taskId, artifactPath) {
1930
+ if (!currentDb)
1931
+ throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1932
+ currentDb.prepare(`UPDATE tasks
1933
+ SET escalation_pending = 1,
1934
+ escalation_awaiting_review = 0,
1935
+ escalation_artifact_path = :path
1936
+ WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`).run({ ":path": artifactPath, ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
1937
+ }
1938
+ /** Set awaiting-review state (artifact exists but continueWithDefault=true, no pause). Mutually exclusive with pending. */
1939
+ export function setTaskEscalationAwaitingReview(milestoneId, sliceId, taskId, artifactPath) {
1940
+ if (!currentDb)
1941
+ throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1942
+ currentDb.prepare(`UPDATE tasks
1943
+ SET escalation_awaiting_review = 1,
1944
+ escalation_pending = 0,
1945
+ escalation_artifact_path = :path
1946
+ WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`).run({ ":path": artifactPath, ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
1947
+ }
1948
+ /** Clear escalation-pending and awaiting-review flags once the user has resolved it. */
1949
+ export function clearTaskEscalationFlags(milestoneId, sliceId, taskId) {
1950
+ if (!currentDb)
1951
+ throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1952
+ currentDb.prepare(`UPDATE tasks
1953
+ SET escalation_pending = 0,
1954
+ escalation_awaiting_review = 0
1955
+ WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
1956
+ }
1957
+ /**
1958
+ * Atomically claim a resolved escalation override for injection into a downstream
1959
+ * task's prompt. Returns true if this caller claimed it (must inject), false if
1960
+ * another caller already claimed it (must skip).
1961
+ */
1962
+ export function claimEscalationOverride(milestoneId, sliceId, sourceTaskId) {
1963
+ if (!currentDb)
1964
+ return false;
1965
+ const now = new Date().toISOString();
1966
+ const result = currentDb.prepare(`UPDATE tasks
1967
+ SET escalation_override_applied_at = :now
1968
+ WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid
1969
+ AND escalation_override_applied_at IS NULL
1970
+ AND escalation_artifact_path IS NOT NULL`).run({ ":now": now, ":mid": milestoneId, ":sid": sliceId, ":tid": sourceTaskId });
1971
+ // node:sqlite + better-sqlite3 both surface `changes` on the run result.
1972
+ const changes = result.changes ?? 0;
1973
+ return changes > 0;
1974
+ }
1975
+ /** Find the most recent resolved-but-unapplied escalation override in a slice. */
1976
+ export function findUnappliedEscalationOverride(milestoneId, sliceId) {
1977
+ if (!currentDb)
1978
+ return null;
1979
+ // Filter BOTH flags: escalation_pending=0 AND escalation_awaiting_review=0
1980
+ // ensures we only claim overrides the user has explicitly resolved.
1981
+ // Without the awaiting_review filter, continueWithDefault=true artifacts
1982
+ // (not yet responded to) would be prematurely claimed, causing the override
1983
+ // to be lost when the user later resolves (#ADR-011 Phase 2 peer-review Bug 2).
1984
+ const row = currentDb.prepare(`SELECT id, escalation_artifact_path AS path
1985
+ FROM tasks
1986
+ WHERE milestone_id = :mid AND slice_id = :sid
1987
+ AND escalation_artifact_path IS NOT NULL
1988
+ AND escalation_override_applied_at IS NULL
1989
+ AND escalation_pending = 0
1990
+ AND escalation_awaiting_review = 0
1991
+ ORDER BY sequence DESC, id DESC
1992
+ LIMIT 1`).get({ ":mid": milestoneId, ":sid": sliceId });
1993
+ if (!row || !row.path)
1994
+ return null;
1995
+ return { taskId: row.id, artifactPath: row.path };
1996
+ }
1997
+ /** Set the blocker_source provenance field (used when rejecting an escalation). */
1998
+ export function setTaskBlockerSource(milestoneId, sliceId, taskId, source) {
1999
+ if (!currentDb)
2000
+ throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2001
+ currentDb.prepare(`UPDATE tasks
2002
+ SET blocker_discovered = 1,
2003
+ blocker_source = :src
2004
+ WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`).run({ ":src": source, ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
2005
+ }
2006
+ /** List tasks with active escalation artifacts across a milestone (for /gsd escalate list). */
2007
+ export function listEscalationArtifacts(milestoneId, includeResolved = false) {
2008
+ if (!currentDb)
2009
+ return [];
2010
+ const filter = includeResolved
2011
+ ? "escalation_artifact_path IS NOT NULL"
2012
+ : "(escalation_pending = 1 OR escalation_awaiting_review = 1) AND escalation_artifact_path IS NOT NULL";
2013
+ const rows = currentDb.prepare(`SELECT * FROM tasks WHERE milestone_id = :mid AND ${filter} ORDER BY slice_id, sequence, id`).all({ ":mid": milestoneId });
2014
+ return rows.map(rowToTask);
2015
+ }
1635
2016
  export function insertVerificationEvidence(e) {
1636
2017
  if (!currentDb)
1637
2018
  throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
@@ -1862,6 +2243,19 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
1862
2243
  try {
1863
2244
  const wtInfo = adapter.prepare("PRAGMA wt.table_info('decisions')").all();
1864
2245
  const hasMadeBy = wtInfo.some((col) => col["name"] === "made_by");
2246
+ // ADR-011: worktree may predate schema v16/v17. For missing columns we
2247
+ // fall through to the main DB's existing value (not a literal default)
2248
+ // so reconcile never silently clears state the main tree has recorded.
2249
+ const hasDecisionSource = wtInfo.some((col) => col["name"] === "source");
2250
+ const wtSliceInfo = adapter.prepare("PRAGMA wt.table_info('slices')").all();
2251
+ const hasIsSketch = wtSliceInfo.some((col) => col["name"] === "is_sketch");
2252
+ const hasSketchScope = wtSliceInfo.some((col) => col["name"] === "sketch_scope");
2253
+ const wtTaskInfo = adapter.prepare("PRAGMA wt.table_info('tasks')").all();
2254
+ const hasBlockerSource = wtTaskInfo.some((col) => col["name"] === "blocker_source");
2255
+ const hasEscalationPending = wtTaskInfo.some((col) => col["name"] === "escalation_pending");
2256
+ const hasEscalationAwaiting = wtTaskInfo.some((col) => col["name"] === "escalation_awaiting_review");
2257
+ const hasEscalationArtifact = wtTaskInfo.some((col) => col["name"] === "escalation_artifact_path");
2258
+ const hasEscalationOverride = wtTaskInfo.some((col) => col["name"] === "escalation_override_applied_at");
1865
2259
  const decConf = adapter.prepare(`SELECT m.id FROM decisions m INNER JOIN wt.decisions w ON m.id = w.id WHERE m.decision != w.decision OR m.choice != w.choice OR m.rationale != w.rationale OR ${hasMadeBy ? "m.made_by != w.made_by" : "'agent' != 'agent'"} OR m.superseded_by IS NOT w.superseded_by`).all();
1866
2260
  for (const row of decConf)
1867
2261
  conflicts.push(`decision ${row["id"]}: modified in both`);
@@ -1874,11 +2268,16 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
1874
2268
  }
1875
2269
  adapter.exec("BEGIN");
1876
2270
  try {
2271
+ // Join the target decisions so we can prefer an existing main.source
2272
+ // when the worktree predates v16 — otherwise a write-through reconcile
2273
+ // would clobber 'escalation'-sourced decisions with the literal default.
1877
2274
  merged.decisions = countChanges(adapter.prepare(`
1878
2275
  INSERT OR REPLACE INTO decisions (
1879
- id, when_context, scope, decision, choice, rationale, revisable, made_by, superseded_by
2276
+ id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by
1880
2277
  )
1881
- SELECT id, when_context, scope, decision, choice, rationale, revisable, ${hasMadeBy ? "made_by" : "'agent'"}, superseded_by FROM wt.decisions
2278
+ SELECT w.id, w.when_context, w.scope, w.decision, w.choice, w.rationale, w.revisable, ${hasMadeBy ? "w.made_by" : "COALESCE(m.made_by, 'agent')"}, ${hasDecisionSource ? "w.source" : "COALESCE(m.source, 'discussion')"}, w.superseded_by
2279
+ FROM wt.decisions w
2280
+ LEFT JOIN decisions m ON m.id = w.id
1882
2281
  `).run());
1883
2282
  merged.requirements = countChanges(adapter.prepare(`
1884
2283
  INSERT OR REPLACE INTO requirements (
@@ -1911,13 +2310,15 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
1911
2310
  FROM wt.milestones
1912
2311
  `).run());
1913
2312
  // Merge slices — preserve worktree progress but never downgrade completed status (#2558).
1914
- // Uses INSERT OR REPLACE with a subquery that picks the best status — if the main DB
1915
- // already has a completed slice, keep that status even if the worktree copy is stale.
2313
+ // ADR-011 Phase 1: carry is_sketch + sketch_scope so reconcile doesn't
2314
+ // silently clear sketch metadata. When the worktree predates v16,
2315
+ // fall back to the main DB's existing value rather than a literal 0/''.
1916
2316
  merged.slices = countChanges(adapter.prepare(`
1917
2317
  INSERT OR REPLACE INTO slices (
1918
2318
  milestone_id, id, title, status, risk, depends, demo, created_at, completed_at,
1919
2319
  full_summary_md, full_uat_md, goal, success_criteria, proof_level,
1920
- integration_closure, observability_impact, sequence, replan_triggered_at
2320
+ integration_closure, observability_impact, sequence, replan_triggered_at,
2321
+ is_sketch, sketch_scope
1921
2322
  )
1922
2323
  SELECT w.milestone_id, w.id, w.title,
1923
2324
  CASE
@@ -1930,18 +2331,24 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
1930
2331
  THEN m.completed_at ELSE w.completed_at
1931
2332
  END,
1932
2333
  w.full_summary_md, w.full_uat_md, w.goal, w.success_criteria, w.proof_level,
1933
- w.integration_closure, w.observability_impact, w.sequence, w.replan_triggered_at
2334
+ w.integration_closure, w.observability_impact, w.sequence, w.replan_triggered_at,
2335
+ ${hasIsSketch ? "w.is_sketch" : "COALESCE(m.is_sketch, 0)"},
2336
+ ${hasSketchScope ? "w.sketch_scope" : "COALESCE(m.sketch_scope, '')"}
1934
2337
  FROM wt.slices w
1935
2338
  LEFT JOIN slices m ON m.milestone_id = w.milestone_id AND m.id = w.id
1936
2339
  `).run());
1937
- // Merge tasks — preserve execution results, never downgrade completed status (#2558)
2340
+ // Merge tasks — preserve execution results, never downgrade completed status (#2558).
2341
+ // ADR-011 P2: carry blocker_source + escalation_* columns so worktree reconcile
2342
+ // doesn't silently clear escalation state back to defaults.
1938
2343
  merged.tasks = countChanges(adapter.prepare(`
1939
2344
  INSERT OR REPLACE INTO tasks (
1940
2345
  milestone_id, slice_id, id, title, status, one_liner, narrative,
1941
2346
  verification_result, duration, completed_at, blocker_discovered,
1942
2347
  deviations, known_issues, key_files, key_decisions, full_summary_md,
1943
2348
  description, estimate, files, verify, inputs, expected_output,
1944
- observability_impact, full_plan_md, sequence
2349
+ observability_impact, full_plan_md, sequence,
2350
+ blocker_source, escalation_pending, escalation_awaiting_review,
2351
+ escalation_artifact_path, escalation_override_applied_at
1945
2352
  )
1946
2353
  SELECT w.milestone_id, w.slice_id, w.id, w.title,
1947
2354
  CASE
@@ -1957,7 +2364,12 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
1957
2364
  w.blocker_discovered,
1958
2365
  w.deviations, w.known_issues, w.key_files, w.key_decisions, w.full_summary_md,
1959
2366
  w.description, w.estimate, w.files, w.verify, w.inputs, w.expected_output,
1960
- w.observability_impact, w.full_plan_md, w.sequence
2367
+ w.observability_impact, w.full_plan_md, w.sequence,
2368
+ ${hasBlockerSource ? "w.blocker_source" : "COALESCE(m.blocker_source, '')"},
2369
+ ${hasEscalationPending ? "w.escalation_pending" : "COALESCE(m.escalation_pending, 0)"},
2370
+ ${hasEscalationAwaiting ? "w.escalation_awaiting_review" : "COALESCE(m.escalation_awaiting_review, 0)"},
2371
+ ${hasEscalationArtifact ? "w.escalation_artifact_path" : "m.escalation_artifact_path"},
2372
+ ${hasEscalationOverride ? "w.escalation_override_applied_at" : "m.escalation_override_applied_at"}
1961
2373
  FROM wt.tasks w
1962
2374
  LEFT JOIN tasks m ON m.milestone_id = w.milestone_id AND m.slice_id = w.slice_id AND m.id = w.id
1963
2375
  `).run());
@@ -2489,30 +2901,32 @@ export function restoreManifest(manifest) {
2489
2901
  for (const m of manifest.milestones) {
2490
2902
  msStmt.run(m.id, m.title, m.status, JSON.stringify(m.depends_on), m.created_at, m.completed_at, m.vision, JSON.stringify(m.success_criteria), JSON.stringify(m.key_risks), JSON.stringify(m.proof_strategy), m.verification_contract, m.verification_integration, m.verification_operational, m.verification_uat, JSON.stringify(m.definition_of_done), m.requirement_coverage, m.boundary_map_markdown);
2491
2903
  }
2492
- // Restore slices
2904
+ // Restore slices (ADR-011 Phase 1: includes is_sketch + sketch_scope)
2493
2905
  const slStmt = db.prepare(`INSERT INTO slices (milestone_id, id, title, status, risk, depends, demo,
2494
2906
  created_at, completed_at, full_summary_md, full_uat_md,
2495
2907
  goal, success_criteria, proof_level, integration_closure, observability_impact,
2496
- sequence, replan_triggered_at)
2497
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
2908
+ sequence, replan_triggered_at, is_sketch, sketch_scope)
2909
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
2498
2910
  for (const s of manifest.slices) {
2499
- slStmt.run(s.milestone_id, s.id, s.title, s.status, s.risk, JSON.stringify(s.depends), s.demo, s.created_at, s.completed_at, s.full_summary_md, s.full_uat_md, s.goal, s.success_criteria, s.proof_level, s.integration_closure, s.observability_impact, s.sequence, s.replan_triggered_at);
2911
+ slStmt.run(s.milestone_id, s.id, s.title, s.status, s.risk, JSON.stringify(s.depends), s.demo, s.created_at, s.completed_at, s.full_summary_md, s.full_uat_md, s.goal, s.success_criteria, s.proof_level, s.integration_closure, s.observability_impact, s.sequence, s.replan_triggered_at, s.is_sketch ?? 0, s.sketch_scope ?? "");
2500
2912
  }
2501
- // Restore tasks
2913
+ // Restore tasks (ADR-011 P2: includes blocker_source + escalation_* columns)
2502
2914
  const tkStmt = db.prepare(`INSERT INTO tasks (milestone_id, slice_id, id, title, status,
2503
2915
  one_liner, narrative, verification_result, duration, completed_at,
2504
2916
  blocker_discovered, deviations, known_issues, key_files, key_decisions,
2505
2917
  full_summary_md, description, estimate, files, verify,
2506
- inputs, expected_output, observability_impact, sequence)
2507
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
2918
+ inputs, expected_output, observability_impact, sequence,
2919
+ blocker_source, escalation_pending, escalation_awaiting_review,
2920
+ escalation_artifact_path, escalation_override_applied_at)
2921
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
2508
2922
  for (const t of manifest.tasks) {
2509
- tkStmt.run(t.milestone_id, t.slice_id, t.id, t.title, t.status, t.one_liner, t.narrative, t.verification_result, t.duration, t.completed_at, t.blocker_discovered ? 1 : 0, t.deviations, t.known_issues, JSON.stringify(t.key_files), JSON.stringify(t.key_decisions), t.full_summary_md, t.description, t.estimate, JSON.stringify(t.files), t.verify, JSON.stringify(t.inputs), JSON.stringify(t.expected_output), t.observability_impact, t.sequence);
2923
+ tkStmt.run(t.milestone_id, t.slice_id, t.id, t.title, t.status, t.one_liner, t.narrative, t.verification_result, t.duration, t.completed_at, t.blocker_discovered ? 1 : 0, t.deviations, t.known_issues, JSON.stringify(t.key_files), JSON.stringify(t.key_decisions), t.full_summary_md, t.description, t.estimate, JSON.stringify(t.files), t.verify, JSON.stringify(t.inputs), JSON.stringify(t.expected_output), t.observability_impact, t.sequence, t.blocker_source ?? "", t.escalation_pending ?? 0, t.escalation_awaiting_review ?? 0, t.escalation_artifact_path ?? null, t.escalation_override_applied_at ?? null);
2510
2924
  }
2511
- // Restore decisions
2512
- const dcStmt = db.prepare(`INSERT INTO decisions (seq, id, when_context, scope, decision, choice, rationale, revisable, made_by, superseded_by)
2513
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
2925
+ // Restore decisions (ADR-011 P2: include source so escalation decisions survive)
2926
+ const dcStmt = db.prepare(`INSERT INTO decisions (seq, id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by)
2927
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
2514
2928
  for (const d of manifest.decisions) {
2515
- dcStmt.run(d.seq, d.id, d.when_context, d.scope, d.decision, d.choice, d.rationale, d.revisable, d.made_by, d.superseded_by);
2929
+ dcStmt.run(d.seq, d.id, d.when_context, d.scope, d.decision, d.choice, d.rationale, d.revisable, d.made_by, d.source ?? "discussion", d.superseded_by);
2516
2930
  }
2517
2931
  // Restore verification evidence
2518
2932
  const evStmt = db.prepare(`INSERT INTO verification_evidence (task_id, slice_id, milestone_id, command, exit_code, verdict, duration_ms, created_at)
@@ -2560,8 +2974,8 @@ export function bulkInsertLegacyHierarchy(payload) {
2560
2974
  export function insertMemoryRow(args) {
2561
2975
  if (!currentDb)
2562
2976
  throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2563
- currentDb.prepare(`INSERT INTO memories (id, category, content, confidence, source_unit_type, source_unit_id, created_at, updated_at)
2564
- VALUES (:id, :category, :content, :confidence, :source_unit_type, :source_unit_id, :created_at, :updated_at)`).run({
2977
+ currentDb.prepare(`INSERT INTO memories (id, category, content, confidence, source_unit_type, source_unit_id, created_at, updated_at, scope, tags, structured_fields)
2978
+ VALUES (:id, :category, :content, :confidence, :source_unit_type, :source_unit_id, :created_at, :updated_at, :scope, :tags, :structured_fields)`).run({
2565
2979
  ":id": args.id,
2566
2980
  ":category": args.category,
2567
2981
  ":content": args.content,
@@ -2570,8 +2984,79 @@ export function insertMemoryRow(args) {
2570
2984
  ":source_unit_id": args.sourceUnitId,
2571
2985
  ":created_at": args.createdAt,
2572
2986
  ":updated_at": args.updatedAt,
2987
+ ":scope": args.scope ?? "project",
2988
+ ":tags": JSON.stringify(args.tags ?? []),
2989
+ ":structured_fields": args.structuredFields == null ? null : JSON.stringify(args.structuredFields),
2573
2990
  });
2574
2991
  }
2992
+ export function insertMemorySourceRow(args) {
2993
+ if (!currentDb)
2994
+ throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2995
+ currentDb.prepare(`INSERT OR IGNORE INTO memory_sources (id, kind, uri, title, content, content_hash, imported_at, scope, tags)
2996
+ VALUES (:id, :kind, :uri, :title, :content, :content_hash, :imported_at, :scope, :tags)`).run({
2997
+ ":id": args.id,
2998
+ ":kind": args.kind,
2999
+ ":uri": args.uri,
3000
+ ":title": args.title,
3001
+ ":content": args.content,
3002
+ ":content_hash": args.contentHash,
3003
+ ":imported_at": args.importedAt,
3004
+ ":scope": args.scope ?? "project",
3005
+ ":tags": JSON.stringify(args.tags ?? []),
3006
+ });
3007
+ }
3008
+ export function deleteMemorySourceRow(id) {
3009
+ if (!currentDb)
3010
+ throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
3011
+ const res = currentDb
3012
+ .prepare("DELETE FROM memory_sources WHERE id = :id")
3013
+ .run({ ":id": id });
3014
+ return (res?.changes ?? 0) > 0;
3015
+ }
3016
+ export function upsertMemoryEmbedding(args) {
3017
+ if (!currentDb)
3018
+ throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
3019
+ currentDb.prepare(`INSERT INTO memory_embeddings (memory_id, model, dim, vector, updated_at)
3020
+ VALUES (:memory_id, :model, :dim, :vector, :updated_at)
3021
+ ON CONFLICT(memory_id) DO UPDATE SET
3022
+ model = excluded.model,
3023
+ dim = excluded.dim,
3024
+ vector = excluded.vector,
3025
+ updated_at = excluded.updated_at`).run({
3026
+ ":memory_id": args.memoryId,
3027
+ ":model": args.model,
3028
+ ":dim": args.dim,
3029
+ ":vector": args.vector,
3030
+ ":updated_at": args.updatedAt,
3031
+ });
3032
+ }
3033
+ export function deleteMemoryEmbedding(memoryId) {
3034
+ if (!currentDb)
3035
+ throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
3036
+ const res = currentDb
3037
+ .prepare("DELETE FROM memory_embeddings WHERE memory_id = :id")
3038
+ .run({ ":id": memoryId });
3039
+ return (res?.changes ?? 0) > 0;
3040
+ }
3041
+ export function insertMemoryRelationRow(args) {
3042
+ if (!currentDb)
3043
+ throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
3044
+ currentDb.prepare(`INSERT OR REPLACE INTO memory_relations (from_id, to_id, rel, confidence, created_at)
3045
+ VALUES (:from_id, :to_id, :rel, :confidence, :created_at)`).run({
3046
+ ":from_id": args.fromId,
3047
+ ":to_id": args.toId,
3048
+ ":rel": args.rel,
3049
+ ":confidence": args.confidence,
3050
+ ":created_at": args.createdAt,
3051
+ });
3052
+ }
3053
+ export function deleteMemoryRelationsFor(memoryId) {
3054
+ if (!currentDb)
3055
+ throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
3056
+ currentDb
3057
+ .prepare("DELETE FROM memory_relations WHERE from_id = :id OR to_id = :id")
3058
+ .run({ ":id": memoryId });
3059
+ }
2575
3060
  export function rewriteMemoryId(placeholderId, realId) {
2576
3061
  if (!currentDb)
2577
3062
  throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");