gsd-pi 2.80.0-dev.b62439b9f → 2.80.0-dev.c5c38454b

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 (431) hide show
  1. package/dist/{cli/cli-web-branch.d.ts → cli-web-branch.d.ts} +1 -1
  2. package/dist/{cli/cli-web-branch.js → cli-web-branch.js} +3 -3
  3. package/dist/{cli/cli.js → cli.js} +25 -25
  4. package/dist/{extension-runtime/extension-registry.js → extension-registry.js} +1 -1
  5. package/dist/{headless/headless-query.d.ts → headless-query.d.ts} +1 -1
  6. package/dist/{headless/headless-query.js → headless-query.js} +2 -3
  7. package/dist/{headless/headless-recover.js → headless-recover.js} +2 -3
  8. package/dist/{headless/headless.js → headless.js} +3 -3
  9. package/dist/loader.js +10 -10
  10. package/dist/{providers/models-resolver.js → models-resolver.js} +1 -1
  11. package/dist/{onboarding/onboarding.js → onboarding.js} +8 -8
  12. package/dist/{providers/remote-questions-config.js → remote-questions-config.js} +1 -1
  13. package/dist/{resource-runtime/resource-loader.d.ts → resource-loader.d.ts} +1 -1
  14. package/dist/{resource-runtime/resource-loader.js → resource-loader.js} +6 -6
  15. package/dist/resources/.managed-resources-content-hash +1 -1
  16. package/dist/resources/extensions/github-sync/templates.js +39 -8
  17. package/dist/resources/extensions/gsd/auto/loop.js +13 -9
  18. package/dist/resources/extensions/gsd/auto/run-unit.js +19 -15
  19. package/dist/resources/extensions/gsd/auto-dashboard.js +51 -15
  20. package/dist/resources/extensions/gsd/auto-dispatch.js +10 -0
  21. package/dist/resources/extensions/gsd/auto-recovery.js +154 -8
  22. package/dist/resources/extensions/gsd/auto-start.js +2 -3
  23. package/dist/resources/extensions/gsd/auto-worktree.js +6 -4
  24. package/dist/resources/extensions/gsd/auto.js +3 -3
  25. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +15 -1
  26. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +11 -1
  27. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +129 -1
  28. package/dist/resources/extensions/gsd/commands-extract-learnings.js +17 -12
  29. package/dist/resources/extensions/gsd/db-base-schema.js +14 -0
  30. package/dist/resources/extensions/gsd/db-migration-steps.js +16 -0
  31. package/dist/resources/extensions/gsd/gsd-db.js +102 -2
  32. package/dist/resources/extensions/gsd/guided-flow.js +2 -2
  33. package/dist/resources/extensions/gsd/pr-evidence.js +57 -16
  34. package/dist/resources/extensions/gsd/working-output-messages.js +64 -0
  35. package/dist/{security/security-overrides.js → security-overrides.js} +1 -1
  36. package/dist/{startup/startup-model-validation.js → startup-model-validation.js} +1 -1
  37. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  38. package/dist/{update/update-check.js → update-check.js} +1 -1
  39. package/dist/web/standalone/.next/BUILD_ID +1 -1
  40. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  41. package/dist/web/standalone/.next/build-manifest.json +3 -3
  42. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  43. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  44. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  45. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  46. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  47. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  48. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  49. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  50. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  51. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  52. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  53. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  54. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  55. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  56. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  57. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  58. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  59. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  60. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  61. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  62. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  63. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  64. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  65. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  66. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  67. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  68. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  69. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  70. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  71. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  72. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  73. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  74. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  76. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  78. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  80. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  82. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  84. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  86. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  88. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  90. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  92. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  93. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  94. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  96. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  99. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  101. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  103. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  105. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  106. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  107. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  109. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  111. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  113. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  115. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  117. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  118. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  119. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  120. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  121. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +3 -3
  122. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  123. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  125. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  128. package/dist/web/standalone/.next/server/app/index.html +1 -1
  129. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  136. package/dist/web/standalone/.next/server/chunks/6897.js +12 -0
  137. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  140. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  141. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  142. package/dist/web/standalone/.next/static/chunks/{8336.6f6f30e410419aff.js → 8336.631939fb583761fa.js} +1 -1
  143. package/dist/web/standalone/.next/static/chunks/{webpack-d82dbee6356c1733.js → webpack-0481f1221120a7c6.js} +1 -1
  144. package/dist/{cli/web-mode.js → web-mode.js} +3 -3
  145. package/dist/{onboarding/welcome-screen.js → welcome-screen.js} +1 -1
  146. package/dist/{worktrees/worktree-cli.js → worktree-cli.js} +2 -3
  147. package/package.json +7 -3
  148. package/packages/pi-ai/dist/models/fake-model.d.ts +12 -0
  149. package/packages/pi-ai/dist/models/fake-model.d.ts.map +1 -0
  150. package/packages/pi-ai/dist/models/fake-model.js +27 -0
  151. package/packages/pi-ai/dist/models/fake-model.js.map +1 -0
  152. package/packages/pi-ai/dist/models/index.d.ts.map +1 -1
  153. package/packages/pi-ai/dist/models/index.js +8 -0
  154. package/packages/pi-ai/dist/models/index.js.map +1 -1
  155. package/packages/pi-ai/dist/providers/fake.d.ts +42 -0
  156. package/packages/pi-ai/dist/providers/fake.d.ts.map +1 -0
  157. package/packages/pi-ai/dist/providers/fake.js +319 -0
  158. package/packages/pi-ai/dist/providers/fake.js.map +1 -0
  159. package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  160. package/packages/pi-ai/dist/providers/register-builtins.js +24 -0
  161. package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
  162. package/packages/pi-ai/src/models/fake-model.ts +30 -0
  163. package/packages/pi-ai/src/models/index.ts +9 -0
  164. package/packages/pi-ai/src/providers/fake.ts +376 -0
  165. package/packages/pi-ai/src/providers/register-builtins.ts +23 -0
  166. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  167. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -0
  168. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  169. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -0
  170. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  171. package/packages/pi-coding-agent/dist/core/extensions/runner.js +14 -1
  172. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  173. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +97 -0
  174. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  175. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  176. package/packages/pi-coding-agent/dist/core/model-registry.js +5 -0
  177. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  178. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +4 -0
  179. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  180. package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
  181. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  182. package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
  183. package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
  184. package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  185. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
  186. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  187. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +54 -15
  188. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  189. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +26 -0
  190. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -0
  191. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +112 -0
  192. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -0
  193. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts +2 -0
  194. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts.map +1 -0
  195. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +51 -0
  196. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -0
  197. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  198. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  199. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  200. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +10 -9
  201. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  202. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +3 -0
  203. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  204. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +11 -0
  205. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  206. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +7 -6
  207. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  208. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +16 -0
  209. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  210. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +106 -17
  211. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  212. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  213. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +58 -1
  214. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  215. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +40 -1
  216. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  217. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -0
  218. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  219. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +1 -0
  220. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  221. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  222. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +3 -0
  223. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  224. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +23 -0
  225. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  226. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  227. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +20 -0
  228. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  229. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts +2 -0
  230. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts.map +1 -0
  231. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js +79 -0
  232. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js.map +1 -0
  233. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
  234. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  235. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +13 -0
  236. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  237. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  238. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  239. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +18 -1
  240. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  241. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  242. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
  243. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  244. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts +11 -0
  245. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts.map +1 -0
  246. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js +18 -0
  247. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js.map +1 -0
  248. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts +2 -0
  249. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts.map +1 -0
  250. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +48 -0
  251. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -0
  252. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +51 -0
  253. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +108 -0
  254. package/packages/pi-coding-agent/src/core/extensions/runner.ts +16 -1
  255. package/packages/pi-coding-agent/src/core/model-registry.ts +4 -0
  256. package/packages/pi-coding-agent/src/core/settings-manager.ts +12 -0
  257. package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
  258. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
  259. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +78 -15
  260. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +59 -0
  261. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +160 -0
  262. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
  263. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +10 -9
  264. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
  265. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +10 -9
  266. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +118 -17
  267. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +43 -1
  268. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +73 -1
  269. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -0
  270. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +1 -1
  271. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +25 -0
  272. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +95 -0
  273. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +24 -1
  274. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +13 -0
  275. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +32 -2
  276. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
  277. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +65 -0
  278. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +29 -0
  279. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  280. package/packages/pi-tui/dist/__tests__/style.test.d.ts +2 -0
  281. package/packages/pi-tui/dist/__tests__/style.test.d.ts.map +1 -0
  282. package/packages/pi-tui/dist/__tests__/style.test.js +63 -0
  283. package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -0
  284. package/packages/pi-tui/dist/__tests__/tui.test.js +1 -2
  285. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  286. package/packages/pi-tui/dist/index.d.ts +1 -0
  287. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  288. package/packages/pi-tui/dist/index.js +2 -0
  289. package/packages/pi-tui/dist/index.js.map +1 -1
  290. package/packages/pi-tui/dist/style.d.ts +41 -0
  291. package/packages/pi-tui/dist/style.d.ts.map +1 -0
  292. package/packages/pi-tui/dist/style.js +158 -0
  293. package/packages/pi-tui/dist/style.js.map +1 -0
  294. package/packages/pi-tui/dist/tui.d.ts +1 -3
  295. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  296. package/packages/pi-tui/dist/tui.js +2 -3
  297. package/packages/pi-tui/dist/tui.js.map +1 -1
  298. package/packages/pi-tui/src/__tests__/style.test.ts +76 -0
  299. package/packages/pi-tui/src/__tests__/tui.test.ts +1 -2
  300. package/packages/pi-tui/src/index.ts +9 -0
  301. package/packages/pi-tui/src/style.ts +225 -0
  302. package/packages/pi-tui/src/tui.ts +2 -3
  303. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  304. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
  305. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  306. package/pkg/dist/modes/interactive/theme/theme-schema.js +13 -0
  307. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  308. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  309. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  310. package/pkg/dist/modes/interactive/theme/theme.js +18 -1
  311. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  312. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  313. package/pkg/dist/modes/interactive/theme/themes.js +36 -27
  314. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  315. package/src/resources/extensions/github-sync/templates.ts +38 -8
  316. package/src/resources/extensions/github-sync/tests/inline-code.test.ts +66 -0
  317. package/src/resources/extensions/gsd/auto/loop.ts +14 -10
  318. package/src/resources/extensions/gsd/auto/run-unit.ts +24 -14
  319. package/src/resources/extensions/gsd/auto-dashboard.ts +57 -8
  320. package/src/resources/extensions/gsd/auto-dispatch.ts +17 -0
  321. package/src/resources/extensions/gsd/auto-recovery.ts +153 -7
  322. package/src/resources/extensions/gsd/auto-start.ts +7 -6
  323. package/src/resources/extensions/gsd/auto-worktree.ts +6 -4
  324. package/src/resources/extensions/gsd/auto.ts +3 -3
  325. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +16 -1
  326. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +17 -1
  327. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +135 -1
  328. package/src/resources/extensions/gsd/commands-extract-learnings.ts +17 -12
  329. package/src/resources/extensions/gsd/db-base-schema.ts +15 -0
  330. package/src/resources/extensions/gsd/db-migration-steps.ts +17 -0
  331. package/src/resources/extensions/gsd/gsd-db.ts +119 -1
  332. package/src/resources/extensions/gsd/guided-flow.ts +2 -2
  333. package/src/resources/extensions/gsd/pr-evidence.ts +63 -5
  334. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +7 -1
  335. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +33 -0
  336. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +83 -4
  337. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +170 -1
  338. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +9 -0
  339. package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +428 -0
  340. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +2 -2
  341. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-basic.md +52 -0
  342. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-empty-optionals.md +42 -0
  343. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +55 -0
  344. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +60 -0
  345. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -0
  346. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
  347. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +1 -1
  348. package/src/resources/extensions/gsd/tests/headless-query.test.ts +2 -2
  349. package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +102 -0
  350. package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +165 -0
  351. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +1 -1
  352. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  353. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +7 -8
  354. package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +93 -0
  355. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +1 -1
  356. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +179 -0
  357. package/src/resources/extensions/gsd/working-output-messages.ts +120 -0
  358. package/dist/web/standalone/.next/server/chunks/7020.js +0 -12
  359. /package/dist/{app/app-paths.d.ts → app-paths.d.ts} +0 -0
  360. /package/dist/{app/app-paths.js → app-paths.js} +0 -0
  361. /package/dist/{extension-runtime/bundled-extension-paths.d.ts → bundled-extension-paths.d.ts} +0 -0
  362. /package/dist/{extension-runtime/bundled-extension-paths.js → bundled-extension-paths.js} +0 -0
  363. /package/dist/{extension-runtime/bundled-resource-path.d.ts → bundled-resource-path.d.ts} +0 -0
  364. /package/dist/{extension-runtime/bundled-resource-path.js → bundled-resource-path.js} +0 -0
  365. /package/dist/{startup/claude-cli-check.d.ts → claude-cli-check.d.ts} +0 -0
  366. /package/dist/{startup/claude-cli-check.js → claude-cli-check.js} +0 -0
  367. /package/dist/{cli/cli-auto-routing.d.ts → cli-auto-routing.d.ts} +0 -0
  368. /package/dist/{cli/cli-auto-routing.js → cli-auto-routing.js} +0 -0
  369. /package/dist/{cli/cli-policy.d.ts → cli-policy.d.ts} +0 -0
  370. /package/dist/{cli/cli-policy.js → cli-policy.js} +0 -0
  371. /package/dist/{cli/cli.d.ts → cli.d.ts} +0 -0
  372. /package/dist/{extension-runtime/extension-discovery.d.ts → extension-discovery.d.ts} +0 -0
  373. /package/dist/{extension-runtime/extension-discovery.js → extension-discovery.js} +0 -0
  374. /package/dist/{extension-runtime/extension-registry.d.ts → extension-registry.d.ts} +0 -0
  375. /package/dist/{extension-runtime/extension-sort.d.ts → extension-sort.d.ts} +0 -0
  376. /package/dist/{extension-runtime/extension-sort.js → extension-sort.js} +0 -0
  377. /package/dist/{extension-runtime/extension-validator.d.ts → extension-validator.d.ts} +0 -0
  378. /package/dist/{extension-runtime/extension-validator.js → extension-validator.js} +0 -0
  379. /package/dist/{headless/headless-answers.d.ts → headless-answers.d.ts} +0 -0
  380. /package/dist/{headless/headless-answers.js → headless-answers.js} +0 -0
  381. /package/dist/{headless/headless-context.d.ts → headless-context.d.ts} +0 -0
  382. /package/dist/{headless/headless-context.js → headless-context.js} +0 -0
  383. /package/dist/{headless/headless-events.d.ts → headless-events.d.ts} +0 -0
  384. /package/dist/{headless/headless-events.js → headless-events.js} +0 -0
  385. /package/dist/{headless/headless-recover.d.ts → headless-recover.d.ts} +0 -0
  386. /package/dist/{headless/headless-types.d.ts → headless-types.d.ts} +0 -0
  387. /package/dist/{headless/headless-types.js → headless-types.js} +0 -0
  388. /package/dist/{headless/headless-ui.d.ts → headless-ui.d.ts} +0 -0
  389. /package/dist/{headless/headless-ui.js → headless-ui.js} +0 -0
  390. /package/dist/{headless/headless.d.ts → headless.d.ts} +0 -0
  391. /package/dist/{cli/help-text.d.ts → help-text.d.ts} +0 -0
  392. /package/dist/{cli/help-text.js → help-text.js} +0 -0
  393. /package/dist/{cli/logo.d.ts → logo.d.ts} +0 -0
  394. /package/dist/{cli/logo.js → logo.js} +0 -0
  395. /package/dist/{mcp/mcp-server.d.ts → mcp-server.d.ts} +0 -0
  396. /package/dist/{mcp/mcp-server.js → mcp-server.js} +0 -0
  397. /package/dist/{providers/models-resolver.d.ts → models-resolver.d.ts} +0 -0
  398. /package/dist/{onboarding/onboarding.d.ts → onboarding.d.ts} +0 -0
  399. /package/dist/{providers/pi-migration.d.ts → pi-migration.d.ts} +0 -0
  400. /package/dist/{providers/pi-migration.js → pi-migration.js} +0 -0
  401. /package/dist/{app/project-sessions.d.ts → project-sessions.d.ts} +0 -0
  402. /package/dist/{app/project-sessions.js → project-sessions.js} +0 -0
  403. /package/dist/{providers/provider-migrations.d.ts → provider-migrations.d.ts} +0 -0
  404. /package/dist/{providers/provider-migrations.js → provider-migrations.js} +0 -0
  405. /package/dist/{providers/remote-questions-config.d.ts → remote-questions-config.d.ts} +0 -0
  406. /package/dist/{rtk/rtk-shared.d.ts → rtk-shared.d.ts} +0 -0
  407. /package/dist/{rtk/rtk-shared.js → rtk-shared.js} +0 -0
  408. /package/dist/{rtk/rtk.d.ts → rtk.d.ts} +0 -0
  409. /package/dist/{rtk/rtk.js → rtk.js} +0 -0
  410. /package/dist/{startup/runtime-checks.d.ts → runtime-checks.d.ts} +0 -0
  411. /package/dist/{startup/runtime-checks.js → runtime-checks.js} +0 -0
  412. /package/dist/{security/security-overrides.d.ts → security-overrides.d.ts} +0 -0
  413. /package/dist/{startup/startup-model-validation.d.ts → startup-model-validation.d.ts} +0 -0
  414. /package/dist/{startup/startup-timings.d.ts → startup-timings.d.ts} +0 -0
  415. /package/dist/{startup/startup-timings.js → startup-timings.js} +0 -0
  416. /package/dist/{app/tool-bootstrap.d.ts → tool-bootstrap.d.ts} +0 -0
  417. /package/dist/{app/tool-bootstrap.js → tool-bootstrap.js} +0 -0
  418. /package/dist/{update/update-check.d.ts → update-check.d.ts} +0 -0
  419. /package/dist/{update/update-cmd.d.ts → update-cmd.d.ts} +0 -0
  420. /package/dist/{update/update-cmd.js → update-cmd.js} +0 -0
  421. /package/dist/web/standalone/.next/static/{-WDXZiiJHGZDbYH75Mu6f → TCSim36ZpcPu2WgeoC45g}/_buildManifest.js +0 -0
  422. /package/dist/web/standalone/.next/static/{-WDXZiiJHGZDbYH75Mu6f → TCSim36ZpcPu2WgeoC45g}/_ssgManifest.js +0 -0
  423. /package/dist/{cli/web-mode.d.ts → web-mode.d.ts} +0 -0
  424. /package/dist/{onboarding/welcome-screen.d.ts → welcome-screen.d.ts} +0 -0
  425. /package/dist/{onboarding/wizard.d.ts → wizard.d.ts} +0 -0
  426. /package/dist/{onboarding/wizard.js → wizard.js} +0 -0
  427. /package/dist/{worktrees/worktree-cli.d.ts → worktree-cli.d.ts} +0 -0
  428. /package/dist/{worktrees/worktree-name-gen.d.ts → worktree-name-gen.d.ts} +0 -0
  429. /package/dist/{worktrees/worktree-name-gen.js → worktree-name-gen.js} +0 -0
  430. /package/dist/{worktrees/worktree-status-banner.d.ts → worktree-status-banner.d.ts} +0 -0
  431. /package/dist/{worktrees/worktree-status-banner.js → worktree-status-banner.js} +0 -0
@@ -114,14 +114,19 @@ Using the \`write\` tool, persist the full structured report to
114
114
  LEARNINGS.md is the full, cited audit trail. Write it first — subsequent steps
115
115
  feed from its content.
116
116
 
117
- ### Step 3 — Optionally pre-query the memory store for semantic duplicates
117
+ ### Step 3 — Run one bounded duplicate check
118
118
 
119
- Before persisting any extracted item in Steps 4–6, you may call
120
- \`memory_query\` with 2–3 keywords from the item to check whether the
121
- memory store already holds a semantically equivalent entry at high
122
- confidence. Skip those items in their respective steps. The memory store
123
- is the single source of truth for cross-session durable knowledge — no
124
- other persistence call is part of this flow.
119
+ Before persisting extracted items in Steps 4–6, do at most one duplicate-check
120
+ pass for the durable Decisions, Lessons, and Patterns from this milestone. Use
121
+ the already-written LEARNINGS.md content and call \`memory_query\` once with a
122
+ compact keyword summary for the whole batch. If that result clearly shows a
123
+ semantically equivalent high-confidence memory for an item, mark only that item
124
+ as already captured and skip it in its respective persistence step.
125
+
126
+ Do not re-read milestone artefacts or repeat memory queries category-by-category
127
+ after this point. The memory store is the single source of truth for
128
+ cross-session durable knowledge — no other persistence call is part of this
129
+ flow.
125
130
 
126
131
  ### Step 4 — Persist Patterns via \`capture_thought\`
127
132
 
@@ -160,11 +165,11 @@ later projection back to a human-visible decisions register stays lossless
160
165
 
161
166
  ### Step 7 — Deduplication rule (applies to Steps 4, 5, 6)
162
167
 
163
- Before each \`capture_thought\` call, optionally call \`memory_query\` with 2–3
164
- keywords from the entry. If a semantically equivalent memory is returned at
165
- high confidence, skip the capture entirely. Prefer skipping a near-duplicate
166
- over creating a second slightly-different row — redundancy degrades the
167
- signal.
168
+ Use only the duplicate-check result from Step 3. If that bounded check returned
169
+ a semantically equivalent memory at high confidence for an extracted item, skip
170
+ the capture entirely. Otherwise, persist the item once via \`capture_thought\`.
171
+ Prefer skipping a near-duplicate over creating a second slightly-different row
172
+ — redundancy degrades the signal.
168
173
 
169
174
  ### Step 8 — Surprises stay only in LEARNINGS.md
170
175
 
@@ -294,6 +294,19 @@ export function createBaseSchemaObjects(db, hooks) {
294
294
  updated_at TEXT NOT NULL DEFAULT '',
295
295
  PRIMARY KEY (trace_id, turn_id, stage)
296
296
  )
297
+ `);
298
+ db.exec(`
299
+ CREATE TABLE IF NOT EXISTS milestone_commit_attributions (
300
+ commit_sha TEXT NOT NULL,
301
+ milestone_id TEXT NOT NULL,
302
+ slice_id TEXT DEFAULT NULL,
303
+ task_id TEXT DEFAULT NULL,
304
+ source TEXT NOT NULL DEFAULT 'recorded',
305
+ confidence REAL NOT NULL DEFAULT 1.0,
306
+ files_json TEXT NOT NULL DEFAULT '[]',
307
+ created_at TEXT NOT NULL DEFAULT '',
308
+ PRIMARY KEY (commit_sha, milestone_id)
309
+ )
297
310
  `);
298
311
  db.exec(`
299
312
  CREATE TABLE IF NOT EXISTS audit_events (
@@ -329,6 +342,7 @@ export function createBaseSchemaObjects(db, hooks) {
329
342
  db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_turn ON gate_runs(trace_id, turn_id)");
330
343
  db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_lookup ON gate_runs(milestone_id, slice_id, task_id, gate_id)");
331
344
  db.exec("CREATE INDEX IF NOT EXISTS idx_turn_git_tx_turn ON turn_git_transactions(trace_id, turn_id)");
345
+ db.exec("CREATE INDEX IF NOT EXISTS idx_milestone_commit_attr_milestone ON milestone_commit_attributions(milestone_id)");
332
346
  db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_trace ON audit_events(trace_id, ts)");
333
347
  db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_turn ON audit_events(trace_id, turn_id, ts)");
334
348
  db.exec("CREATE VIEW IF NOT EXISTS active_decisions AS SELECT * FROM decisions WHERE superseded_by IS NULL");
@@ -363,6 +363,22 @@ export function applyMigrationV21StructuredMemories(db) {
363
363
  export function applyMigrationV23MilestoneQueue(db) {
364
364
  ensureColumn(db, "milestones", "sequence", "ALTER TABLE milestones ADD COLUMN sequence INTEGER DEFAULT 0");
365
365
  }
366
+ export function applyMigrationV26MilestoneCommitAttributions(db) {
367
+ db.exec(`
368
+ CREATE TABLE IF NOT EXISTS milestone_commit_attributions (
369
+ commit_sha TEXT NOT NULL,
370
+ milestone_id TEXT NOT NULL,
371
+ slice_id TEXT DEFAULT NULL,
372
+ task_id TEXT DEFAULT NULL,
373
+ source TEXT NOT NULL DEFAULT 'recorded',
374
+ confidence REAL NOT NULL DEFAULT 1.0,
375
+ files_json TEXT NOT NULL DEFAULT '[]',
376
+ created_at TEXT NOT NULL DEFAULT '',
377
+ PRIMARY KEY (commit_sha, milestone_id)
378
+ )
379
+ `);
380
+ db.exec("CREATE INDEX IF NOT EXISTS idx_milestone_commit_attr_milestone ON milestone_commit_attributions(milestone_id)");
381
+ }
366
382
  export function applyMigrationV22QualityGateRepair(db, hooks) {
367
383
  const qgInfo = db.prepare("PRAGMA table_info(quality_gates)").all();
368
384
  const taskIdCol = qgInfo.find((r) => r["name"] === "task_id");
@@ -36,7 +36,7 @@ import { rowToActiveDecision, rowToActiveRequirement, rowToDecision, rowToRequir
36
36
  import { rowToGate } from "./db-gate-rows.js";
37
37
  import { rowToArtifact, rowToMilestone } from "./db-milestone-artifact-rows.js";
38
38
  import { backupDatabaseBeforeMigration } from "./db-migration-backup.js";
39
- import { applyMigrationV2Artifacts, applyMigrationV3Memories, applyMigrationV4DecisionMadeBy, applyMigrationV5HierarchyTables, applyMigrationV6SliceSummaries, applyMigrationV7Dependencies, applyMigrationV8PlanningFields, applyMigrationV9Ordering, applyMigrationV10ReplanTrigger, applyMigrationV11TaskPlanning, applyMigrationV12QualityGates, applyMigrationV13HotPathIndexes, applyMigrationV14SliceDependencies, applyMigrationV15AuditTables, applyMigrationV16EscalationSource, applyMigrationV17TaskEscalation, applyMigrationV18MemorySources, applyMigrationV19MemoryFts, applyMigrationV20MemoryRelations, applyMigrationV21StructuredMemories, applyMigrationV22QualityGateRepair, applyMigrationV23MilestoneQueue, } from "./db-migration-steps.js";
39
+ import { applyMigrationV2Artifacts, applyMigrationV3Memories, applyMigrationV4DecisionMadeBy, applyMigrationV5HierarchyTables, applyMigrationV6SliceSummaries, applyMigrationV7Dependencies, applyMigrationV8PlanningFields, applyMigrationV9Ordering, applyMigrationV10ReplanTrigger, applyMigrationV11TaskPlanning, applyMigrationV12QualityGates, applyMigrationV13HotPathIndexes, applyMigrationV14SliceDependencies, applyMigrationV15AuditTables, applyMigrationV16EscalationSource, applyMigrationV17TaskEscalation, applyMigrationV18MemorySources, applyMigrationV19MemoryFts, applyMigrationV20MemoryRelations, applyMigrationV21StructuredMemories, applyMigrationV22QualityGateRepair, applyMigrationV23MilestoneQueue, applyMigrationV26MilestoneCommitAttributions, } from "./db-migration-steps.js";
40
40
  import { isMemoriesFtsAvailableSchema, tryCreateMemoriesFtsSchema } from "./db-memory-fts-schema.js";
41
41
  import { createDbOpenState } from "./db-open-state.js";
42
42
  import { createRuntimeKvTableV25 } from "./db-runtime-kv-schema.js";
@@ -52,7 +52,7 @@ const providerLoader = createSqliteProviderLoader({
52
52
  nodeVersion: process.versions.node,
53
53
  writeStderr: (message) => process.stderr.write(message),
54
54
  });
55
- export const SCHEMA_VERSION = 25;
55
+ export const SCHEMA_VERSION = 26;
56
56
  function initSchema(db, fileBacked) {
57
57
  if (fileBacked)
58
58
  db.exec("PRAGMA journal_mode=WAL");
@@ -246,6 +246,10 @@ function migrateSchema(db) {
246
246
  createRuntimeKvTableV25(db);
247
247
  recordSchemaVersion(db, 25);
248
248
  }
249
+ if (currentVersion < 26) {
250
+ applyMigrationV26MilestoneCommitAttributions(db);
251
+ recordSchemaVersion(db, 26);
252
+ }
249
253
  db.exec("COMMIT");
250
254
  }
251
255
  catch (err) {
@@ -1158,6 +1162,47 @@ export function getSliceTasks(milestoneId, sliceId) {
1158
1162
  const rows = currentDb.prepare("SELECT * FROM tasks WHERE milestone_id = :mid AND slice_id = :sid ORDER BY sequence, id").all({ ":mid": milestoneId, ":sid": sliceId });
1159
1163
  return rows.map(rowToTask);
1160
1164
  }
1165
+ export function getCompletedMilestoneTaskFileHints(milestoneId) {
1166
+ if (!currentDb)
1167
+ return [];
1168
+ const rows = currentDb.prepare(`SELECT files, key_files
1169
+ FROM tasks
1170
+ WHERE milestone_id = :mid AND status IN ('complete', 'done')`).all({ ":mid": milestoneId });
1171
+ const hints = new Set();
1172
+ for (const row of rows) {
1173
+ for (const raw of [row["files"], row["key_files"]]) {
1174
+ for (const file of parseStringArrayColumn(raw)) {
1175
+ const normalized = normalizeRepoPath(file);
1176
+ if (normalized)
1177
+ hints.add(normalized);
1178
+ }
1179
+ }
1180
+ }
1181
+ return [...hints];
1182
+ }
1183
+ function parseStringArrayColumn(raw) {
1184
+ if (Array.isArray(raw))
1185
+ return raw.filter((entry) => typeof entry === "string");
1186
+ if (typeof raw !== "string")
1187
+ return [];
1188
+ const trimmed = raw.trim();
1189
+ if (!trimmed)
1190
+ return [];
1191
+ try {
1192
+ const parsed = JSON.parse(trimmed);
1193
+ if (Array.isArray(parsed))
1194
+ return parsed.filter((entry) => typeof entry === "string");
1195
+ if (typeof parsed === "string")
1196
+ return [parsed];
1197
+ }
1198
+ catch {
1199
+ return trimmed.split(",");
1200
+ }
1201
+ return [];
1202
+ }
1203
+ function normalizeRepoPath(file) {
1204
+ return file.trim().replace(/\\/g, "/").replace(/^\.\/+/, "");
1205
+ }
1161
1206
  // ─── ADR-011 Phase 2 escalation helpers ──────────────────────────────────
1162
1207
  /** Set pause-on-escalation state on a completed task. Mutually exclusive with awaiting_review. */
1163
1208
  export function setTaskEscalationPending(milestoneId, sliceId, taskId, artifactPath) {
@@ -1735,6 +1780,7 @@ export function deleteMilestone(milestoneId) {
1735
1780
  currentDb.prepare(`DELETE FROM replan_history WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
1736
1781
  currentDb.prepare(`DELETE FROM assessments WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
1737
1782
  currentDb.prepare(`DELETE FROM artifacts WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
1783
+ currentDb.prepare(`DELETE FROM milestone_commit_attributions WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
1738
1784
  currentDb.prepare(`DELETE FROM milestone_leases WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
1739
1785
  currentDb.prepare(`DELETE FROM milestones WHERE id = :mid`).run({ ":mid": milestoneId });
1740
1786
  });
@@ -1962,6 +2008,59 @@ export function upsertTurnGitTransaction(entry) {
1962
2008
  ":updated_at": entry.updatedAt,
1963
2009
  });
1964
2010
  }
2011
+ export function getMilestoneCommitAttributionShas(milestoneId) {
2012
+ if (!currentDb)
2013
+ return [];
2014
+ const rows = currentDb.prepare(`SELECT commit_sha
2015
+ FROM milestone_commit_attributions
2016
+ WHERE milestone_id = :mid
2017
+ ORDER BY created_at, commit_sha`).all({ ":mid": milestoneId });
2018
+ return rows
2019
+ .map((row) => typeof row["commit_sha"] === "string" ? row["commit_sha"] : "")
2020
+ .filter(Boolean);
2021
+ }
2022
+ export function recordMilestoneCommitAttribution(entry) {
2023
+ if (!currentDb)
2024
+ return;
2025
+ transaction(() => {
2026
+ currentDb.prepare(`INSERT OR REPLACE INTO milestone_commit_attributions (
2027
+ commit_sha, milestone_id, slice_id, task_id, source, confidence, files_json, created_at
2028
+ ) VALUES (
2029
+ :commit_sha, :milestone_id, :slice_id, :task_id, :source, :confidence, :files_json, :created_at
2030
+ )`).run({
2031
+ ":commit_sha": entry.commitSha,
2032
+ ":milestone_id": entry.milestoneId,
2033
+ ":slice_id": entry.sliceId ?? null,
2034
+ ":task_id": entry.taskId ?? null,
2035
+ ":source": entry.source,
2036
+ ":confidence": entry.confidence,
2037
+ ":files_json": JSON.stringify(entry.files),
2038
+ ":created_at": entry.createdAt,
2039
+ });
2040
+ currentDb.prepare(`INSERT OR IGNORE INTO audit_events (
2041
+ event_id, trace_id, turn_id, caused_by, category, type, ts, payload_json
2042
+ ) VALUES (
2043
+ :event_id, :trace_id, :turn_id, :caused_by, :category, :type, :ts, :payload_json
2044
+ )`).run({
2045
+ ":event_id": `milestone-commit-attribution:${entry.milestoneId}:${entry.commitSha}`,
2046
+ ":trace_id": "milestone-commit-attribution",
2047
+ ":turn_id": null,
2048
+ ":caused_by": null,
2049
+ ":category": "git",
2050
+ ":type": "milestone-commit-attribution-recorded",
2051
+ ":ts": entry.createdAt,
2052
+ ":payload_json": JSON.stringify({
2053
+ commitSha: entry.commitSha,
2054
+ milestoneId: entry.milestoneId,
2055
+ sliceId: entry.sliceId ?? null,
2056
+ taskId: entry.taskId ?? null,
2057
+ source: entry.source,
2058
+ confidence: entry.confidence,
2059
+ files: entry.files,
2060
+ }),
2061
+ });
2062
+ });
2063
+ }
1965
2064
  export function insertAuditEvent(entry) {
1966
2065
  if (!currentDb)
1967
2066
  return;
@@ -2048,6 +2147,7 @@ export function clearEngineHierarchy() {
2048
2147
  currentDb.exec("DELETE FROM slice_dependencies");
2049
2148
  currentDb.exec("DELETE FROM assessments");
2050
2149
  currentDb.exec("DELETE FROM replan_history");
2150
+ currentDb.exec("DELETE FROM milestone_commit_attributions");
2051
2151
  currentDb.exec("DELETE FROM tasks");
2052
2152
  currentDb.exec("DELETE FROM slices");
2053
2153
  currentDb.exec("DELETE FROM milestone_leases");
@@ -1716,8 +1716,8 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1716
1716
  // standard wizard below.
1717
1717
  {
1718
1718
  const prefs = loadEffectiveGSDPreferences(basePath)?.preferences;
1719
- const { hasPendingDeepStage } = await import("./auto-dispatch.js");
1720
- if (hasPendingDeepStage(prefs, basePath)) {
1719
+ const { shouldRunDeepProjectSetup } = await import("./auto-dispatch.js");
1720
+ if (shouldRunDeepProjectSetup(state, prefs, basePath)) {
1721
1721
  await startDeepProjectSetupForeground(ctx, pi, basePath, stepMode);
1722
1722
  return;
1723
1723
  }
@@ -8,8 +8,53 @@ const CHANGE_TYPE_LABELS = {
8
8
  docs: "Documentation only",
9
9
  chore: "Build, CI, or tooling changes",
10
10
  };
11
+ // Per-item cap for user-supplied content. 2 KB gives slice titles plus
12
+ // descriptions room while still bounding malicious DoS-via-PR-body input.
13
+ const USER_CONTENT_CAP_BYTES = 2048;
14
+ const TRUNCATION_SUFFIX = " … [truncated]";
15
+ // Strips HTML comments, fake commit trailers (Co-Authored-By, Signed-off-by —
16
+ // case-insensitive on the trailer name), and caps total length. Designed to
17
+ // be a no-op for well-formed input; golden fixtures must remain byte-stable.
18
+ // Trailer lines are removed (not rejected) so that a single bad line in an
19
+ // otherwise legitimate description does not block the entire PR.
20
+ function sanitizeUserContent(s) {
21
+ if (!s)
22
+ return s;
23
+ // Strip HTML comments greedily across newlines.
24
+ let out = s.replace(/<!--[\s\S]*?-->/g, "");
25
+ // Drop lines that look like commit trailers we do not want forged.
26
+ out = out
27
+ .split("\n")
28
+ .filter((line) => !/^\s*(co-authored-by|signed-off-by)\s*:/i.test(line))
29
+ .join("\n");
30
+ if (Buffer.byteLength(out, "utf8") > USER_CONTENT_CAP_BYTES) {
31
+ const budget = USER_CONTENT_CAP_BYTES - Buffer.byteLength(TRUNCATION_SUFFIX, "utf8");
32
+ // Truncate by code units to stay safely under the byte budget for ASCII;
33
+ // for multibyte content we conservatively walk back until under budget.
34
+ let sliced = out.slice(0, Math.max(0, budget));
35
+ while (Buffer.byteLength(sliced, "utf8") > budget && sliced.length > 0) {
36
+ sliced = sliced.slice(0, -1);
37
+ }
38
+ out = sliced + TRUNCATION_SUFFIX;
39
+ }
40
+ return out;
41
+ }
42
+ // Strips HTML comments and fake trailers without applying the length cap.
43
+ // Used for short fields like linkedIssue where truncation would be confusing.
44
+ function sanitizeIssueRef(s) {
45
+ if (!s)
46
+ return s;
47
+ let out = s.replace(/<!--[\s\S]*?-->/g, "");
48
+ out = out
49
+ .split("\n")
50
+ .filter((line) => !/^\s*(co-authored-by|signed-off-by)\s*:/i.test(line))
51
+ .join("\n");
52
+ return out;
53
+ }
11
54
  function normalizeList(values) {
12
- return (values ?? []).map((value) => value.trim()).filter(Boolean);
55
+ return (values ?? [])
56
+ .map((value) => sanitizeUserContent(value).trim())
57
+ .filter(Boolean);
13
58
  }
14
59
  function changeTypeChecklist(selected) {
15
60
  return Object.keys(CHANGE_TYPE_LABELS).map((type) => {
@@ -28,13 +73,17 @@ export function buildPrEvidence(input) {
28
73
  const subjectTitle = input.milestoneTitle?.trim() || subjectId;
29
74
  const changeType = input.changeType ?? "feat";
30
75
  const summaries = normalizeList(input.summaries);
76
+ const blockers = normalizeList(input.blockers);
31
77
  const roadmapItems = normalizeList(input.roadmapItems);
32
78
  const metrics = normalizeList(input.metrics);
33
79
  const testsRun = normalizeList(input.testsRun);
34
80
  const rollbackNotes = normalizeList(input.rollbackNotes);
35
- const linkedIssue = input.linkedIssue?.trim() || "Not specified. Add an issue link before marking this PR ready if CONTRIBUTING.md requires one.";
36
- const why = input.why?.trim() || `${capitalize(subjectKind)} work is complete and ready for review.`;
37
- const how = input.how?.trim() || "Generated from GSD evidence and local workflow artifacts.";
81
+ // linkedIssue is sanitized but not length-capped: legitimate issue refs
82
+ // are short by nature, and truncating "Closes #123" would be unhelpful.
83
+ const linkedIssueRaw = input.linkedIssue ? sanitizeIssueRef(input.linkedIssue).trim() : "";
84
+ const linkedIssue = linkedIssueRaw || "Not specified. Add an issue link before marking this PR ready if CONTRIBUTING.md requires one.";
85
+ const why = (input.why ? sanitizeUserContent(input.why).trim() : "") || `${capitalize(subjectKind)} work is complete and ready for review.`;
86
+ const how = (input.how ? sanitizeUserContent(input.how).trim() : "") || "Generated from GSD evidence and local workflow artifacts.";
38
87
  const title = `${changeType}: ${subjectTitle}`;
39
88
  const sections = [
40
89
  "## TL;DR",
@@ -46,19 +95,11 @@ export function buildPrEvidence(input) {
46
95
  "## What",
47
96
  "",
48
97
  summaries.length > 0 ? summaries.join("\n\n") : `${capitalize(subjectKind)} ${subjectId} completed.`,
49
- "",
50
- "## Why",
51
- "",
52
- why,
53
- "",
54
- "## How",
55
- "",
56
- how,
57
- "",
58
- "## Linked Issue",
59
- "",
60
- linkedIssue,
61
98
  ];
99
+ if (blockers.length > 0) {
100
+ sections.push("", "## Blockers", "", blockers.map((blocker) => `- ${blocker}`).join("\n"));
101
+ }
102
+ sections.push("", "## Why", "", why, "", "## How", "", how, "", "## Linked Issue", "", linkedIssue);
62
103
  if (roadmapItems.length > 0) {
63
104
  sections.push("", "## Roadmap", "", roadmapItems.join("\n"));
64
105
  }
@@ -0,0 +1,64 @@
1
+ // GSD-2 + src/resources/extensions/gsd/working-output-messages.ts - Formats and audits user-facing working-state messages.
2
+ const ACTION_RE = /\b(?:wait|pause|paused|retry|retrying|recover|recovering|resume|stop|stopped|run|press|type|configure|restart)\b/i;
3
+ export function formatAutoUnitWorkingMessage(unitType, unitId) {
4
+ switch (unitType) {
5
+ case "research-milestone":
6
+ case "research-slice":
7
+ return `Researching ${unitId}: waiting for provider response`;
8
+ case "plan-milestone":
9
+ case "plan-slice":
10
+ return `Planning ${unitId}: waiting for provider response`;
11
+ case "execute-task":
12
+ return `Executing ${unitId}: waiting for provider response`;
13
+ case "complete-slice":
14
+ case "complete-milestone":
15
+ return `Completing ${unitId}: waiting for provider response`;
16
+ default:
17
+ return `${unitType} ${unitId}: waiting for provider response`;
18
+ }
19
+ }
20
+ export function evaluateWorkingOutputMessage(item) {
21
+ const findings = [];
22
+ const message = item.message.trim();
23
+ const health = item.context?.health;
24
+ if (!message) {
25
+ findings.push({
26
+ code: "empty-message",
27
+ severity: "error",
28
+ detail: `${item.surface} message is empty`,
29
+ });
30
+ return findings;
31
+ }
32
+ if (/^Working(?:\.\.\.)?(?:\s|\(|$)/i.test(message)) {
33
+ findings.push({
34
+ code: "generic-working-message",
35
+ severity: "warning",
36
+ detail: `${item.surface} message should say what work is running`,
37
+ });
38
+ }
39
+ if (/Progressing well/i.test(message) && health && health !== "healthy") {
40
+ findings.push({
41
+ code: "misleading-healthy-message",
42
+ severity: "error",
43
+ detail: `${item.surface} says progress is healthy while runtime health is ${health}`,
44
+ });
45
+ }
46
+ if (/\b0\s*\/\s*0\s+slices\b/i.test(message)) {
47
+ findings.push({
48
+ code: "fake-zero-progress",
49
+ severity: "warning",
50
+ detail: `${item.surface} should hide roadmap progress before roadmap slices exist`,
51
+ });
52
+ }
53
+ if ((health === "stalled" || health === "provider-error" || health === "timeout") && !ACTION_RE.test(message)) {
54
+ findings.push({
55
+ code: "missing-action",
56
+ severity: "warning",
57
+ detail: `${item.surface} should give the user a next action for ${health}`,
58
+ });
59
+ }
60
+ return findings;
61
+ }
62
+ export function evaluateWorkingOutputMessages(items) {
63
+ return items.flatMap(evaluateWorkingOutputMessage);
64
+ }
@@ -8,7 +8,7 @@
8
8
  * Precedence: env var > settings.json > built-in defaults
9
9
  */
10
10
  import { setAllowedCommandPrefixes } from '@gsd/pi-coding-agent';
11
- import { setFetchAllowedUrls } from '../resources/extensions/search-the-web/url-utils.js';
11
+ import { setFetchAllowedUrls } from './resources/extensions/search-the-web/url-utils.js';
12
12
  export function applySecurityOverrides(settingsManager) {
13
13
  // --- Command prefix allowlist ---
14
14
  const envPrefixes = process.env.GSD_ALLOWED_COMMAND_PREFIXES;
@@ -8,7 +8,7 @@
8
8
  * configuredExists was always false for extension models, causing the
9
9
  * user's valid choice to be silently overwritten with a built-in fallback.
10
10
  */
11
- import { getPiDefaultModelAndProvider } from '../providers/pi-migration.js';
11
+ import { getPiDefaultModelAndProvider } from './pi-migration.js';
12
12
  /**
13
13
  * Validate the configured default model against the registry.
14
14
  *