@opengsd/gsd-pi 1.0.2-dev.e9a1b49 → 1.0.2-dev.fb7ddf1

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 (490) hide show
  1. package/README.md +63 -12
  2. package/dist/headless-answers.js +2 -1
  3. package/dist/headless-events.d.ts +1 -0
  4. package/dist/headless-events.js +8 -1
  5. package/dist/onboarding.js +22 -3
  6. package/dist/resource-loader.d.ts +7 -0
  7. package/dist/resource-loader.js +44 -9
  8. package/dist/resources/.managed-resources-content-hash +1 -1
  9. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +34 -11
  10. package/dist/resources/extensions/context7/index.js +12 -2
  11. package/dist/resources/extensions/get-secrets-from-user.js +16 -16
  12. package/dist/resources/extensions/google-cli/index.js +30 -0
  13. package/dist/resources/extensions/google-cli/models.js +55 -0
  14. package/dist/resources/extensions/google-cli/package.json +11 -0
  15. package/dist/resources/extensions/google-cli/readiness.js +12 -0
  16. package/dist/resources/extensions/google-cli/stream-adapter.js +191 -0
  17. package/dist/resources/extensions/gsd/auto/loop.js +81 -1
  18. package/dist/resources/extensions/gsd/auto/orchestrator.js +4 -2
  19. package/dist/resources/extensions/gsd/auto/phases.js +38 -1
  20. package/dist/resources/extensions/gsd/auto/run-unit.js +8 -0
  21. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  22. package/dist/resources/extensions/gsd/auto-dispatch.js +17 -7
  23. package/dist/resources/extensions/gsd/auto-post-unit.js +65 -16
  24. package/dist/resources/extensions/gsd/auto-prompts.js +5 -236
  25. package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
  26. package/dist/resources/extensions/gsd/auto-start.js +232 -49
  27. package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -1
  28. package/dist/resources/extensions/gsd/auto-verification.js +14 -2
  29. package/dist/resources/extensions/gsd/auto-worktree.js +36 -55
  30. package/dist/resources/extensions/gsd/auto.js +40 -2
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +4 -3
  32. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +7 -2
  33. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +39 -5
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +107 -27
  35. package/dist/resources/extensions/gsd/bootstrap/system-context.js +3 -27
  36. package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +4 -4
  37. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +1 -1
  38. package/dist/resources/extensions/gsd/closeout-recovery.js +7 -1
  39. package/dist/resources/extensions/gsd/commands/handlers/auto.js +9 -1
  40. package/dist/resources/extensions/gsd/commands-handlers.js +3 -0
  41. package/dist/resources/extensions/gsd/commands-usage.js +105 -1
  42. package/dist/resources/extensions/gsd/config-overlay.js +20 -14
  43. package/dist/resources/extensions/gsd/context-overlay.js +22 -16
  44. package/dist/resources/extensions/gsd/dashboard-overlay.js +10 -23
  45. package/dist/resources/extensions/gsd/doctor-engine-checks.js +87 -0
  46. package/dist/resources/extensions/gsd/doctor-git-checks.js +70 -5
  47. package/dist/resources/extensions/gsd/doctor-providers.js +54 -24
  48. package/dist/resources/extensions/gsd/doctor.js +7 -2
  49. package/dist/resources/extensions/gsd/git-conflict-state.js +26 -1
  50. package/dist/resources/extensions/gsd/guided-flow.js +5 -6
  51. package/dist/resources/extensions/gsd/key-manager.js +45 -13
  52. package/dist/resources/extensions/gsd/mcp-filter.js +57 -18
  53. package/dist/resources/extensions/gsd/mcp-project-config.js +15 -9
  54. package/dist/resources/extensions/gsd/migration-auto-check.js +5 -1
  55. package/dist/resources/extensions/gsd/milestone-actions.js +3 -0
  56. package/dist/resources/extensions/gsd/milestone-reopen-events.js +28 -0
  57. package/dist/resources/extensions/gsd/notification-overlay.js +8 -9
  58. package/dist/resources/extensions/gsd/parallel-merge.js +6 -4
  59. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +15 -13
  60. package/dist/resources/extensions/gsd/post-execution-checks.js +5 -4
  61. package/dist/resources/extensions/gsd/preferences-skills.js +11 -4
  62. package/dist/resources/extensions/gsd/preferences.js +14 -2
  63. package/dist/resources/extensions/gsd/prompt-loader.js +2 -0
  64. package/dist/resources/extensions/gsd/prompts/discuss.md +4 -2
  65. package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
  66. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
  67. package/dist/resources/extensions/gsd/prompts/system.md +3 -20
  68. package/dist/resources/extensions/gsd/queue-reorder-ui.js +28 -18
  69. package/dist/resources/extensions/gsd/repo-identity.js +36 -6
  70. package/dist/resources/extensions/gsd/repository-registry.js +3 -1
  71. package/dist/resources/extensions/gsd/safety/evidence-collector.js +13 -6
  72. package/dist/resources/extensions/gsd/skill-activation.js +233 -0
  73. package/dist/resources/extensions/gsd/skill-catalog.data.js +820 -0
  74. package/dist/resources/extensions/gsd/skill-catalog.install.js +179 -0
  75. package/dist/resources/extensions/gsd/skill-catalog.js +5 -1028
  76. package/dist/resources/extensions/gsd/skill-discovery.js +121 -79
  77. package/dist/resources/extensions/gsd/skill-scope.js +52 -0
  78. package/dist/resources/extensions/gsd/skill-telemetry.js +6 -39
  79. package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +1 -1
  80. package/dist/resources/extensions/gsd/skills.js +60 -0
  81. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +351 -0
  82. package/dist/resources/extensions/gsd/state-reconciliation/index.js +41 -0
  83. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +4 -0
  84. package/dist/resources/extensions/gsd/tools/complete-task.js +9 -0
  85. package/dist/resources/extensions/gsd/tools/exec-tool.js +42 -8
  86. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +63 -2
  87. package/dist/resources/extensions/gsd/tui/render-kit.js +51 -0
  88. package/dist/resources/extensions/gsd/unit-context-manifest.js +35 -26
  89. package/dist/resources/extensions/gsd/user-input-boundary.js +1 -1
  90. package/dist/resources/extensions/gsd/vision-ask.js +22 -0
  91. package/dist/resources/extensions/gsd/visualizer-overlay.js +8 -36
  92. package/dist/resources/extensions/gsd/worktree-lifecycle.js +24 -3
  93. package/dist/resources/extensions/gsd/worktree-post-create-hook.js +117 -0
  94. package/dist/resources/extensions/gsd/worktree-state-projection.js +29 -0
  95. package/dist/resources/extensions/search-the-web/native-search.js +57 -8
  96. package/dist/resources/extensions/shared/confirm-ui.js +9 -6
  97. package/dist/resources/extensions/shared/dialog-frame.js +42 -0
  98. package/dist/resources/extensions/shared/interview-ui.js +42 -30
  99. package/dist/resources/extensions/shared/next-action-ui.js +6 -6
  100. package/dist/resources/extensions/subagent/index.js +8 -15
  101. package/dist/resources/shared/package-manager-detection.js +36 -0
  102. package/dist/resources/skills/agent-browser/SKILL.md +1 -1
  103. package/dist/resources/skills/api-design/SKILL.md +1 -1
  104. package/dist/resources/skills/code-optimizer/SKILL.md +6 -11
  105. package/dist/resources/skills/create-gsd-extension/SKILL.md +1 -1
  106. package/dist/resources/skills/create-mcp-server/SKILL.md +1 -1
  107. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
  108. package/dist/resources/skills/create-skill/workflows/verify-skill.md +2 -10
  109. package/dist/resources/skills/debug-like-expert/references/when-to-research.md +1 -5
  110. package/dist/resources/skills/decompose-into-slices/SKILL.md +3 -3
  111. package/dist/resources/skills/dependency-upgrade/SKILL.md +1 -1
  112. package/dist/resources/skills/forensics/SKILL.md +2 -2
  113. package/dist/resources/skills/grill-me/SKILL.md +1 -1
  114. package/dist/resources/skills/handoff/SKILL.md +1 -1
  115. package/dist/resources/skills/make-interfaces-feel-better/SKILL.md +1 -1
  116. package/dist/resources/skills/observability/SKILL.md +1 -1
  117. package/dist/resources/skills/security-review/SKILL.md +1 -1
  118. package/dist/resources/skills/spike-wrap-up/SKILL.md +1 -1
  119. package/dist/resources/skills/tdd/SKILL.md +1 -1
  120. package/dist/resources/skills/write-docs/SKILL.md +1 -1
  121. package/dist/resources/skills/write-milestone-brief/SKILL.md +1 -1
  122. package/dist/update-check.d.ts +6 -2
  123. package/dist/update-check.js +7 -3
  124. package/dist/web/standalone/.next/BUILD_ID +1 -1
  125. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  126. package/dist/web/standalone/.next/build-manifest.json +2 -2
  127. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  128. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/index.html +1 -1
  146. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  153. package/dist/web/standalone/.next/server/chunks/1834.js +2 -2
  154. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  156. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  157. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  158. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  159. package/dist/worktree-cli.d.ts +0 -2
  160. package/dist/worktree-cli.js +21 -9
  161. package/package.json +5 -2
  162. package/packages/cloud-mcp-gateway/bin/gsd-cloud-mcp-gateway.js +14 -0
  163. package/packages/cloud-mcp-gateway/package.json +4 -3
  164. package/packages/contracts/dist/rpc.test.js +5 -0
  165. package/packages/contracts/dist/rpc.test.js.map +1 -1
  166. package/packages/contracts/dist/workflow.d.ts +15 -0
  167. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  168. package/packages/contracts/dist/workflow.js +16 -0
  169. package/packages/contracts/dist/workflow.js.map +1 -1
  170. package/packages/contracts/dist/workflow.test.js +1 -0
  171. package/packages/contracts/dist/workflow.test.js.map +1 -1
  172. package/packages/contracts/package.json +1 -1
  173. package/packages/daemon/package.json +4 -4
  174. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +1 -0
  175. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  176. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +22 -8
  177. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  178. package/packages/gsd-agent-core/package.json +5 -5
  179. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts +12 -0
  180. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts.map +1 -0
  181. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js +45 -0
  182. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js.map +1 -0
  183. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts +3 -2
  184. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  185. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js +11 -11
  186. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js.map +1 -1
  187. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts +3 -3
  188. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  189. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js +13 -11
  190. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js.map +1 -1
  191. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts +3 -3
  192. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  193. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js +12 -10
  194. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js.map +1 -1
  195. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts +1 -0
  196. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts.map +1 -1
  197. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js +1 -0
  198. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js.map +1 -1
  199. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +1 -1
  200. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  201. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +2 -2
  202. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
  203. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts +6 -1
  204. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  205. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js +9 -6
  206. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  207. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  208. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -1
  209. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  210. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  211. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +0 -2
  212. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  213. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts +1 -0
  214. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts.map +1 -1
  215. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js +1 -0
  216. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js.map +1 -1
  217. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  218. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +2 -1
  219. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  220. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts +3 -0
  221. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  222. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +144 -2
  223. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  224. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.d.ts.map +1 -1
  225. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js +2 -14
  226. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js.map +1 -1
  227. package/packages/gsd-agent-modes/package.json +7 -7
  228. package/packages/mcp-server/bin/gsd-mcp-server.js +14 -0
  229. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  230. package/packages/mcp-server/dist/server.js +7 -1
  231. package/packages/mcp-server/dist/server.js.map +1 -1
  232. package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
  233. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  234. package/packages/mcp-server/dist/workflow-tools.js +47 -8
  235. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  236. package/packages/mcp-server/package.json +5 -4
  237. package/packages/native/package.json +1 -1
  238. package/packages/pi-agent-core/dist/agent-loop.js +16 -14
  239. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  240. package/packages/pi-agent-core/dist/harness/skills.d.ts.map +1 -1
  241. package/packages/pi-agent-core/dist/harness/skills.js +6 -0
  242. package/packages/pi-agent-core/dist/harness/skills.js.map +1 -1
  243. package/packages/pi-agent-core/dist/harness/system-prompt.d.ts +7 -0
  244. package/packages/pi-agent-core/dist/harness/system-prompt.d.ts.map +1 -1
  245. package/packages/pi-agent-core/dist/harness/system-prompt.js +7 -0
  246. package/packages/pi-agent-core/dist/harness/system-prompt.js.map +1 -1
  247. package/packages/pi-agent-core/package.json +1 -1
  248. package/packages/pi-ai/bin/pi-ai.js +14 -0
  249. package/packages/pi-ai/dist/models.generated.d.ts +48 -206
  250. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  251. package/packages/pi-ai/dist/models.generated.js +73 -226
  252. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  253. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  254. package/packages/pi-ai/dist/providers/anthropic.js +50 -0
  255. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  256. package/packages/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
  257. package/packages/pi-ai/dist/providers/openai-responses-shared.js +28 -4
  258. package/packages/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
  259. package/packages/pi-ai/dist/types.d.ts +2 -0
  260. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  261. package/packages/pi-ai/dist/types.js.map +1 -1
  262. package/packages/pi-ai/dist/utils/tests/tool-search-shim.test.js +29 -1
  263. package/packages/pi-ai/dist/utils/tests/tool-search-shim.test.js.map +1 -1
  264. package/packages/pi-ai/dist/utils/tool-search-shim.d.ts +4 -1
  265. package/packages/pi-ai/dist/utils/tool-search-shim.d.ts.map +1 -1
  266. package/packages/pi-ai/dist/utils/tool-search-shim.js +58 -10
  267. package/packages/pi-ai/dist/utils/tool-search-shim.js.map +1 -1
  268. package/packages/pi-ai/dist/utils/tool-shims.d.ts +1 -1
  269. package/packages/pi-ai/dist/utils/tool-shims.d.ts.map +1 -1
  270. package/packages/pi-ai/dist/utils/tool-shims.js.map +1 -1
  271. package/packages/pi-ai/package.json +3 -2
  272. package/packages/pi-coding-agent/README.md +1 -1
  273. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +2 -2
  274. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
  275. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/core/extensions/loader.js +1 -1
  277. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/extensions/runner.js +8 -2
  280. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/core/skills.d.ts +3 -0
  282. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/skills.js +3 -0
  284. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  286. package/packages/pi-coding-agent/dist/core/tools/edit.js +5 -7
  287. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -2
  289. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/tools/read.js +5 -4
  291. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/tools/write.js +0 -1
  294. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  295. package/packages/pi-coding-agent/package.json +8 -8
  296. package/packages/pi-tui/package.json +1 -1
  297. package/packages/rpc-client/package.json +2 -2
  298. package/pkg/package.json +1 -1
  299. package/scripts/install/deps.js +10 -0
  300. package/scripts/install/detect-existing.js +17 -3
  301. package/scripts/install/npm-global.js +103 -33
  302. package/scripts/install.js +1 -0
  303. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +36 -11
  304. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +86 -19
  305. package/src/resources/extensions/context7/index.ts +15 -2
  306. package/src/resources/extensions/get-secrets-from-user.ts +17 -16
  307. package/src/resources/extensions/google-cli/index.ts +34 -0
  308. package/src/resources/extensions/google-cli/models.ts +57 -0
  309. package/src/resources/extensions/google-cli/package.json +11 -0
  310. package/src/resources/extensions/google-cli/readiness.ts +15 -0
  311. package/src/resources/extensions/google-cli/stream-adapter.ts +245 -0
  312. package/src/resources/extensions/gsd/auto/loop.ts +96 -1
  313. package/src/resources/extensions/gsd/auto/orchestrator.ts +4 -2
  314. package/src/resources/extensions/gsd/auto/phases.ts +47 -1
  315. package/src/resources/extensions/gsd/auto/run-unit.ts +10 -0
  316. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  317. package/src/resources/extensions/gsd/auto-dispatch.ts +31 -11
  318. package/src/resources/extensions/gsd/auto-post-unit.ts +101 -18
  319. package/src/resources/extensions/gsd/auto-prompts.ts +4 -284
  320. package/src/resources/extensions/gsd/auto-recovery.ts +10 -7
  321. package/src/resources/extensions/gsd/auto-start.ts +307 -56
  322. package/src/resources/extensions/gsd/auto-tool-tracking.ts +3 -1
  323. package/src/resources/extensions/gsd/auto-verification.ts +18 -2
  324. package/src/resources/extensions/gsd/auto-worktree.ts +47 -57
  325. package/src/resources/extensions/gsd/auto.ts +50 -2
  326. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +4 -3
  327. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +9 -4
  328. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +42 -5
  329. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +124 -25
  330. package/src/resources/extensions/gsd/bootstrap/system-context.ts +3 -28
  331. package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +4 -4
  332. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -1
  333. package/src/resources/extensions/gsd/closeout-recovery.ts +6 -1
  334. package/src/resources/extensions/gsd/commands/handlers/auto.ts +9 -1
  335. package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
  336. package/src/resources/extensions/gsd/commands-usage.ts +110 -5
  337. package/src/resources/extensions/gsd/config-overlay.ts +19 -16
  338. package/src/resources/extensions/gsd/context-overlay.ts +24 -19
  339. package/src/resources/extensions/gsd/dashboard-overlay.ts +14 -27
  340. package/src/resources/extensions/gsd/doctor-engine-checks.ts +99 -0
  341. package/src/resources/extensions/gsd/doctor-git-checks.ts +72 -5
  342. package/src/resources/extensions/gsd/doctor-providers.ts +55 -27
  343. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  344. package/src/resources/extensions/gsd/doctor.ts +7 -2
  345. package/src/resources/extensions/gsd/git-conflict-state.ts +25 -1
  346. package/src/resources/extensions/gsd/guided-flow.ts +5 -6
  347. package/src/resources/extensions/gsd/key-manager.ts +57 -14
  348. package/src/resources/extensions/gsd/mcp-filter.ts +64 -17
  349. package/src/resources/extensions/gsd/mcp-project-config.ts +24 -9
  350. package/src/resources/extensions/gsd/migration-auto-check.ts +6 -0
  351. package/src/resources/extensions/gsd/milestone-actions.ts +2 -0
  352. package/src/resources/extensions/gsd/milestone-reopen-events.ts +28 -0
  353. package/src/resources/extensions/gsd/notification-overlay.ts +12 -11
  354. package/src/resources/extensions/gsd/parallel-merge.ts +6 -4
  355. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +16 -12
  356. package/src/resources/extensions/gsd/post-execution-checks.ts +7 -4
  357. package/src/resources/extensions/gsd/preferences-skills.ts +11 -4
  358. package/src/resources/extensions/gsd/preferences.ts +17 -2
  359. package/src/resources/extensions/gsd/prompt-loader.ts +2 -0
  360. package/src/resources/extensions/gsd/prompts/discuss.md +4 -2
  361. package/src/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
  362. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
  363. package/src/resources/extensions/gsd/prompts/system.md +3 -20
  364. package/src/resources/extensions/gsd/queue-reorder-ui.ts +29 -20
  365. package/src/resources/extensions/gsd/repo-identity.ts +35 -7
  366. package/src/resources/extensions/gsd/repository-registry.ts +3 -1
  367. package/src/resources/extensions/gsd/safety/evidence-collector.ts +13 -6
  368. package/src/resources/extensions/gsd/skill-activation.ts +292 -0
  369. package/src/resources/extensions/gsd/skill-catalog.data.ts +858 -0
  370. package/src/resources/extensions/gsd/skill-catalog.install.ts +205 -0
  371. package/src/resources/extensions/gsd/skill-catalog.ts +16 -1087
  372. package/src/resources/extensions/gsd/skill-discovery.ts +134 -78
  373. package/src/resources/extensions/gsd/skill-scope.ts +63 -0
  374. package/src/resources/extensions/gsd/skill-telemetry.ts +6 -40
  375. package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +1 -1
  376. package/src/resources/extensions/gsd/skills.ts +75 -0
  377. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +499 -0
  378. package/src/resources/extensions/gsd/state-reconciliation/index.ts +40 -0
  379. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +8 -0
  380. package/src/resources/extensions/gsd/state-reconciliation/types.ts +30 -0
  381. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +328 -2
  382. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +75 -0
  383. package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +28 -2
  384. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +30 -0
  385. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +41 -0
  386. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +24 -0
  387. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +436 -0
  388. package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +53 -0
  389. package/src/resources/extensions/gsd/tests/closeout-recovery.test.ts +15 -0
  390. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +31 -0
  391. package/src/resources/extensions/gsd/tests/commands-context.test.ts +5 -3
  392. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +15 -2
  393. package/src/resources/extensions/gsd/tests/commands-usage.test.ts +97 -0
  394. package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +40 -3
  395. package/src/resources/extensions/gsd/tests/context-chart.test.ts +9 -0
  396. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +64 -0
  397. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +25 -0
  398. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +1 -0
  399. package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +4 -2
  400. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +1 -1
  401. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +71 -1
  402. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +105 -0
  403. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +101 -1
  404. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +30 -0
  405. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +6 -0
  406. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +22 -3
  407. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +43 -0
  408. package/src/resources/extensions/gsd/tests/interactive-tool-idle-exemption.test.ts +8 -0
  409. package/src/resources/extensions/gsd/tests/key-manager.test.ts +23 -4
  410. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +19 -1
  411. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +24 -0
  412. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +56 -1
  413. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +6 -1
  414. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +70 -10
  415. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +7 -1
  416. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +9 -0
  417. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +127 -10
  418. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +44 -0
  419. package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +93 -0
  420. package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +101 -0
  421. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +46 -0
  422. package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +116 -11
  423. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +27 -0
  424. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +30 -1
  425. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +4 -0
  426. package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +111 -0
  427. package/src/resources/extensions/gsd/tests/skill-scope-auto.test.ts +67 -0
  428. package/src/resources/extensions/gsd/tests/skills.test.ts +55 -0
  429. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +13 -2
  430. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +303 -0
  431. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +67 -1
  432. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +24 -1
  433. package/src/resources/extensions/gsd/tests/tui-border-assertions.ts +28 -0
  434. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +14 -0
  435. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +18 -0
  436. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +26 -0
  437. package/src/resources/extensions/gsd/tests/vision-ask.test.ts +23 -0
  438. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -1
  439. package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +133 -0
  440. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +82 -0
  441. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +16 -1
  442. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +28 -0
  443. package/src/resources/extensions/gsd/tests/worktree-post-create-hook.test.ts +141 -1
  444. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +38 -1
  445. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +10 -0
  446. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +45 -1
  447. package/src/resources/extensions/gsd/tools/complete-task.ts +9 -0
  448. package/src/resources/extensions/gsd/tools/exec-tool.ts +42 -10
  449. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +82 -5
  450. package/src/resources/extensions/gsd/tui/render-kit.ts +82 -0
  451. package/src/resources/extensions/gsd/unit-context-manifest.ts +37 -26
  452. package/src/resources/extensions/gsd/user-input-boundary.ts +1 -1
  453. package/src/resources/extensions/gsd/vision-ask.ts +28 -0
  454. package/src/resources/extensions/gsd/visualizer-overlay.ts +12 -40
  455. package/src/resources/extensions/gsd/worktree-lifecycle.ts +37 -2
  456. package/src/resources/extensions/gsd/worktree-post-create-hook.ts +127 -0
  457. package/src/resources/extensions/gsd/worktree-state-projection.ts +33 -0
  458. package/src/resources/extensions/search-the-web/native-search.ts +60 -8
  459. package/src/resources/extensions/shared/confirm-ui.ts +8 -12
  460. package/src/resources/extensions/shared/dialog-frame.ts +71 -0
  461. package/src/resources/extensions/shared/interview-ui.ts +43 -42
  462. package/src/resources/extensions/shared/next-action-ui.ts +6 -6
  463. package/src/resources/extensions/shared/tests/confirm-ui.test.ts +57 -0
  464. package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +163 -0
  465. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +55 -0
  466. package/src/resources/extensions/subagent/index.ts +8 -15
  467. package/src/resources/shared/package-manager-detection.ts +39 -0
  468. package/src/resources/skills/agent-browser/SKILL.md +1 -1
  469. package/src/resources/skills/api-design/SKILL.md +1 -1
  470. package/src/resources/skills/code-optimizer/SKILL.md +6 -11
  471. package/src/resources/skills/create-gsd-extension/SKILL.md +1 -1
  472. package/src/resources/skills/create-mcp-server/SKILL.md +1 -1
  473. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
  474. package/src/resources/skills/create-skill/workflows/verify-skill.md +2 -10
  475. package/src/resources/skills/debug-like-expert/references/when-to-research.md +1 -5
  476. package/src/resources/skills/decompose-into-slices/SKILL.md +3 -3
  477. package/src/resources/skills/dependency-upgrade/SKILL.md +1 -1
  478. package/src/resources/skills/forensics/SKILL.md +2 -2
  479. package/src/resources/skills/grill-me/SKILL.md +1 -1
  480. package/src/resources/skills/handoff/SKILL.md +1 -1
  481. package/src/resources/skills/make-interfaces-feel-better/SKILL.md +1 -1
  482. package/src/resources/skills/observability/SKILL.md +1 -1
  483. package/src/resources/skills/security-review/SKILL.md +1 -1
  484. package/src/resources/skills/spike-wrap-up/SKILL.md +1 -1
  485. package/src/resources/skills/tdd/SKILL.md +1 -1
  486. package/src/resources/skills/write-docs/SKILL.md +1 -1
  487. package/src/resources/skills/write-milestone-brief/SKILL.md +1 -1
  488. package/dist/tsconfig.extensions.tsbuildinfo +0 -1
  489. /package/dist/web/standalone/.next/static/{BEjZM0MLHLibeMFbjtMol → tH1tnDYt1E0hK9Ien73Z0}/_buildManifest.js +0 -0
  490. /package/dist/web/standalone/.next/static/{BEjZM0MLHLibeMFbjtMol → tH1tnDYt1E0hK9Ien73Z0}/_ssgManifest.js +0 -0
@@ -13,6 +13,8 @@
13
13
  //
14
14
  // Phased rollout tracking:
15
15
  // - Phase 1 (this PR): schema + manifests + coverage test.
16
+ // - Phase 1b (skill token savings): skills policy wired via skill-scope.ts
17
+ // and setVisibleSkills(); allowlists derived from skill-manifest.ts.
16
18
  // - Phase 2: add composeSystemPromptForUnit(); migrate one low-risk
17
19
  // unit type (e.g. reassess-roadmap) as the pilot.
18
20
  // - Phase 3: migrate remaining unit types, tighten manifests per
@@ -60,11 +62,18 @@ export const ARTIFACT_KEYS = [
60
62
  "templates",
61
63
  ];
62
64
  // ─── Manifests ────────────────────────────────────────────────────────────
63
- // Phase 1 policy: every manifest encodes today's behavior. Skills = "all"
64
- // unless the unit type was already narrowed via the existing skill-manifest
65
- // resolver (#4779). Memory/knowledge policies reflect the defaults in
66
- // `bootstrap/system-context.ts`. Artifact classifications follow what
67
- // `auto-prompts.ts` inlines today for each unit type.
65
+ // Phase 1 policy: skills policy is derived from skill-manifest.ts allowlists
66
+ // via `skillPolicyForUnit()`; units without an allowlist keep mode "all".
67
+ // Explicit mode "none" remains for lightweight config units.
68
+ import { resolveSkillManifest } from "./skill-manifest.js";
69
+ /** Derive skills policy from skill-manifest allowlists; default to full catalog. */
70
+ function skillPolicyForUnit(unitType) {
71
+ const allowlist = resolveSkillManifest(unitType);
72
+ if (allowlist) {
73
+ return { mode: "allowlist", skills: allowlist };
74
+ }
75
+ return { mode: "all" };
76
+ }
68
77
  const COMMON_BUDGET_LARGE = 1_500_000; // ~400K tokens
69
78
  const COMMON_BUDGET_MEDIUM = 750_000; // ~200K tokens
70
79
  const COMMON_BUDGET_SMALL = 250_000; // ~65K tokens
@@ -136,7 +145,7 @@ export const KNOWN_UNIT_TYPES = [
136
145
  export const UNIT_MANIFESTS = {
137
146
  // ─── Milestone-scoped ────────────────────────────────────────────────
138
147
  "research-milestone": {
139
- skills: { mode: "all" },
148
+ skills: skillPolicyForUnit("research-milestone"),
140
149
  knowledge: "full",
141
150
  memory: "prompt-relevant",
142
151
  codebaseMap: true,
@@ -153,7 +162,7 @@ export const UNIT_MANIFESTS = {
153
162
  maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
154
163
  },
155
164
  "plan-milestone": {
156
- skills: { mode: "all" },
165
+ skills: skillPolicyForUnit("plan-milestone"),
157
166
  knowledge: "full",
158
167
  memory: "prompt-relevant",
159
168
  codebaseMap: true,
@@ -168,7 +177,7 @@ export const UNIT_MANIFESTS = {
168
177
  maxSystemPromptChars: COMMON_BUDGET_LARGE,
169
178
  },
170
179
  "discuss-milestone": {
171
- skills: { mode: "all" },
180
+ skills: skillPolicyForUnit("discuss-milestone"),
172
181
  knowledge: "full",
173
182
  memory: "prompt-relevant",
174
183
  codebaseMap: true,
@@ -183,7 +192,7 @@ export const UNIT_MANIFESTS = {
183
192
  maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
184
193
  },
185
194
  "validate-milestone": {
186
- skills: { mode: "all" },
195
+ skills: skillPolicyForUnit("validate-milestone"),
187
196
  knowledge: "scoped",
188
197
  memory: "prompt-relevant",
189
198
  codebaseMap: false,
@@ -200,7 +209,7 @@ export const UNIT_MANIFESTS = {
200
209
  maxSystemPromptChars: COMMON_BUDGET_LARGE,
201
210
  },
202
211
  "complete-milestone": {
203
- skills: { mode: "all" },
212
+ skills: skillPolicyForUnit("complete-milestone"),
204
213
  knowledge: "scoped",
205
214
  memory: "prompt-relevant",
206
215
  codebaseMap: false,
@@ -221,7 +230,7 @@ export const UNIT_MANIFESTS = {
221
230
  },
222
231
  // ─── Slice-scoped ────────────────────────────────────────────────────
223
232
  "research-slice": {
224
- skills: { mode: "all" },
233
+ skills: skillPolicyForUnit("research-slice"),
225
234
  knowledge: "full",
226
235
  memory: "prompt-relevant",
227
236
  codebaseMap: true,
@@ -238,7 +247,7 @@ export const UNIT_MANIFESTS = {
238
247
  maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
239
248
  },
240
249
  "plan-slice": {
241
- skills: { mode: "all" },
250
+ skills: skillPolicyForUnit("plan-slice"),
242
251
  knowledge: "full",
243
252
  memory: "prompt-relevant",
244
253
  codebaseMap: true,
@@ -256,7 +265,7 @@ export const UNIT_MANIFESTS = {
256
265
  maxSystemPromptChars: COMMON_BUDGET_LARGE,
257
266
  },
258
267
  "refine-slice": {
259
- skills: { mode: "all" },
268
+ skills: skillPolicyForUnit("refine-slice"),
260
269
  knowledge: "scoped",
261
270
  memory: "prompt-relevant",
262
271
  codebaseMap: true,
@@ -274,7 +283,7 @@ export const UNIT_MANIFESTS = {
274
283
  maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
275
284
  },
276
285
  "replan-slice": {
277
- skills: { mode: "all" },
286
+ skills: skillPolicyForUnit("replan-slice"),
278
287
  knowledge: "scoped",
279
288
  memory: "prompt-relevant",
280
289
  codebaseMap: true,
@@ -289,7 +298,7 @@ export const UNIT_MANIFESTS = {
289
298
  maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
290
299
  },
291
300
  "complete-slice": {
292
- skills: { mode: "all" },
301
+ skills: skillPolicyForUnit("complete-slice"),
293
302
  knowledge: "scoped",
294
303
  memory: "prompt-relevant",
295
304
  codebaseMap: false,
@@ -310,7 +319,7 @@ export const UNIT_MANIFESTS = {
310
319
  maxSystemPromptChars: COMMON_BUDGET_LARGE,
311
320
  },
312
321
  "reassess-roadmap": {
313
- skills: { mode: "all" },
322
+ skills: skillPolicyForUnit("reassess-roadmap"),
314
323
  knowledge: "scoped",
315
324
  memory: "critical-only",
316
325
  codebaseMap: false,
@@ -326,7 +335,7 @@ export const UNIT_MANIFESTS = {
326
335
  },
327
336
  // ─── Task-scoped ─────────────────────────────────────────────────────
328
337
  "execute-task": {
329
- skills: { mode: "all" },
338
+ skills: skillPolicyForUnit("execute-task"),
330
339
  knowledge: "scoped",
331
340
  memory: "prompt-relevant",
332
341
  codebaseMap: true,
@@ -341,7 +350,7 @@ export const UNIT_MANIFESTS = {
341
350
  maxSystemPromptChars: COMMON_BUDGET_LARGE,
342
351
  },
343
352
  "reactive-execute": {
344
- skills: { mode: "all" },
353
+ skills: skillPolicyForUnit("reactive-execute"),
345
354
  knowledge: "scoped",
346
355
  memory: "prompt-relevant",
347
356
  codebaseMap: true,
@@ -357,7 +366,7 @@ export const UNIT_MANIFESTS = {
357
366
  },
358
367
  // ─── Ancillary units ─────────────────────────────────────────────────
359
368
  "run-uat": {
360
- skills: { mode: "all" },
369
+ skills: skillPolicyForUnit("run-uat"),
361
370
  knowledge: "critical-only",
362
371
  memory: "critical-only",
363
372
  codebaseMap: false,
@@ -372,7 +381,7 @@ export const UNIT_MANIFESTS = {
372
381
  maxSystemPromptChars: COMMON_BUDGET_SMALL,
373
382
  },
374
383
  "gate-evaluate": {
375
- skills: { mode: "all" },
384
+ skills: skillPolicyForUnit("gate-evaluate"),
376
385
  knowledge: "critical-only",
377
386
  memory: "critical-only",
378
387
  codebaseMap: false,
@@ -389,7 +398,7 @@ export const UNIT_MANIFESTS = {
389
398
  maxSystemPromptChars: COMMON_BUDGET_SMALL,
390
399
  },
391
400
  "rewrite-docs": {
392
- skills: { mode: "all" },
401
+ skills: skillPolicyForUnit("rewrite-docs"),
393
402
  knowledge: "scoped",
394
403
  memory: "prompt-relevant",
395
404
  codebaseMap: true,
@@ -404,7 +413,7 @@ export const UNIT_MANIFESTS = {
404
413
  maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
405
414
  },
406
415
  "triage-captures": {
407
- skills: { mode: "all" },
416
+ skills: skillPolicyForUnit("triage-captures"),
408
417
  knowledge: "scoped",
409
418
  memory: "prompt-relevant",
410
419
  codebaseMap: false,
@@ -419,7 +428,7 @@ export const UNIT_MANIFESTS = {
419
428
  maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
420
429
  },
421
430
  "quick-task": {
422
- skills: { mode: "all" },
431
+ skills: skillPolicyForUnit("quick-task"),
423
432
  knowledge: "full",
424
433
  memory: "prompt-relevant",
425
434
  codebaseMap: true,
@@ -456,7 +465,7 @@ export const UNIT_MANIFESTS = {
456
465
  // discussion runs before any milestone exists, so milestone artifacts are
457
466
  // not loaded. Keeps templates available for PROJECT.md scaffolding.
458
467
  "discuss-project": {
459
- skills: { mode: "all" },
468
+ skills: skillPolicyForUnit("discuss-project"),
460
469
  knowledge: "scoped",
461
470
  memory: "prompt-relevant",
462
471
  codebaseMap: true,
@@ -473,7 +482,7 @@ export const UNIT_MANIFESTS = {
473
482
  // discuss-requirements: REQUIREMENTS.md interview. PROJECT.md is the
474
483
  // primary context input; templates carry the requirements format.
475
484
  "discuss-requirements": {
476
- skills: { mode: "all" },
485
+ skills: skillPolicyForUnit("discuss-requirements"),
477
486
  knowledge: "scoped",
478
487
  memory: "prompt-relevant",
479
488
  codebaseMap: true,
@@ -509,7 +518,7 @@ export const UNIT_MANIFESTS = {
509
518
  // planning-dispatch policy to dispatch them. PROJECT.md + REQUIREMENTS.md
510
519
  // give the orchestrator the framing context.
511
520
  "research-project": {
512
- skills: { mode: "all" },
521
+ skills: skillPolicyForUnit("research-project"),
513
522
  knowledge: "scoped",
514
523
  memory: "prompt-relevant",
515
524
  codebaseMap: true,
@@ -29,7 +29,7 @@ function extractTextFromMessage(msg) {
29
29
  }
30
30
  return parts.join("\n");
31
31
  }
32
- function lastAssistantText(messages) {
32
+ export function lastAssistantText(messages) {
33
33
  if (!Array.isArray(messages))
34
34
  return "";
35
35
  for (let i = messages.length - 1; i >= 0; i--) {
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Natural-language openers for milestone discussion.
3
+ *
4
+ * Keep these short and conversational. They are often the user's first prompt
5
+ * when GSD starts shaping a project or milestone, so they should feel like a
6
+ * collaborator starting a working session rather than a form field.
7
+ */
8
+ import { randomInt } from "node:crypto";
9
+ export const VISION_ASK_VARIANTS = [
10
+ "What are we building?",
11
+ "What do you want to make next?",
12
+ "What should this become?",
13
+ "What are you picturing?",
14
+ "Where should we take this?",
15
+ "What should this milestone unlock?",
16
+ "Tell me what you want to build.",
17
+ "What should GSD help you shape?",
18
+ ];
19
+ export function chooseVisionAskVariant(pickIndex = randomInt) {
20
+ const index = pickIndex(VISION_ASK_VARIANTS.length);
21
+ return VISION_ASK_VARIANTS[index] ?? VISION_ASK_VARIANTS[0];
22
+ }
@@ -1,4 +1,4 @@
1
- import { truncateToWidth, visibleWidth, matchesKey, Key } from "@gsd/pi-tui";
1
+ import { visibleWidth, matchesKey, Key } from "@gsd/pi-tui";
2
2
  import { loadVisualizerData } from "./visualizer-data.js";
3
3
  import { renderProgressView, renderDepsView, renderMetricsView, renderTimelineView, renderAgentView, renderChangelogView, renderExportView, renderKnowledgeView, renderCapturesView, renderHealthView, } from "./visualizer-views.js";
4
4
  import { writeFileSync, mkdirSync } from "node:fs";
@@ -6,6 +6,7 @@ import { join } from "node:path";
6
6
  import { writeExportFile } from "./export.js";
7
7
  import { gsdRoot } from "./paths.js";
8
8
  import { stripAnsi } from "../shared/mod.js";
9
+ import { renderDialogFrame, renderKeyHints } from "./tui/render-kit.js";
9
10
  export const TAB_COUNT = 10;
10
11
  const TAB_LABELS = [
11
12
  "1 Progress",
@@ -440,51 +441,22 @@ export class GSDVisualizerOverlay {
440
441
  }
441
442
  // Apply scroll
442
443
  const viewportHeight = Math.max(5, process.stdout.rows ? process.stdout.rows - 8 : 24);
443
- const chromeHeight = 2;
444
- const visibleContentRows = Math.max(1, viewportHeight - chromeHeight);
444
+ const visibleContentRows = Math.max(1, viewportHeight - 4);
445
445
  this.lastVisibleRows = visibleContentRows;
446
446
  const totalLines = content.length;
447
447
  const maxScroll = Math.max(0, content.length - visibleContentRows);
448
448
  this.scrollOffsets[this.activeTab] = Math.min(this.scrollOffsets[this.activeTab], maxScroll);
449
449
  const offset = this.scrollOffsets[this.activeTab];
450
450
  const visibleContent = content.slice(offset, offset + visibleContentRows);
451
- const lines = this.wrapInBox(visibleContent, width, offset, visibleContentRows, totalLines);
452
- // Footer hint
453
- const hint = th.fg("dim", "Tab/Shift+Tab/1-9,0 switch \u00b7 / filter \u00b7 PgUp/PgDn scroll \u00b7 ? help \u00b7 esc close");
454
- const hintVis = visibleWidth(hint);
455
- const hintPad = Math.max(0, Math.floor((width - hintVis) / 2));
456
- lines.push(" ".repeat(hintPad) + hint);
451
+ const footer = renderKeyHints(th, ["Tab/Shift+Tab/1-9,0 switch", "/ filter", "PgUp/PgDn scroll", "? help", "esc close"], Math.max(1, width - 4));
452
+ const lines = renderDialogFrame(th, "GSD Visualizer", visibleContent, width, {
453
+ footer,
454
+ scroll: { offset, visibleRows: visibleContentRows, totalRows: totalLines },
455
+ });
457
456
  this.cachedWidth = width;
458
457
  this.cachedLines = lines;
459
458
  return lines;
460
459
  }
461
- wrapInBox(inner, width, offset, visibleRows, totalLines) {
462
- const th = this.theme;
463
- const border = (s) => th.fg("borderAccent", s);
464
- const innerWidth = width - 4;
465
- const lines = [];
466
- lines.push(border("\u256d" + "\u2500".repeat(width - 2) + "\u256e"));
467
- // Compute scroll indicator positions
468
- const scrollable = totalLines !== undefined && visibleRows !== undefined && totalLines > visibleRows;
469
- let thumbStart = -1;
470
- let thumbLen = 0;
471
- const innerRows = inner.length;
472
- if (scrollable && innerRows > 0 && totalLines > 0) {
473
- thumbStart = Math.round(((offset ?? 0) / totalLines) * innerRows);
474
- thumbLen = Math.max(1, Math.round((visibleRows / totalLines) * innerRows));
475
- }
476
- for (let i = 0; i < inner.length; i++) {
477
- const line = inner[i];
478
- const truncated = truncateToWidth(line, innerWidth);
479
- const padWidth = Math.max(0, innerWidth - visibleWidth(truncated));
480
- const rightBorder = scrollable && i >= thumbStart && i < thumbStart + thumbLen
481
- ? border("\u2503")
482
- : border("\u2502");
483
- lines.push(border("\u2502") + " " + truncated + " ".repeat(padWidth) + " " + rightBorder);
484
- }
485
- lines.push(border("\u2570" + "\u2500".repeat(width - 2) + "\u256f"));
486
- return lines;
487
- }
488
460
  invalidate() {
489
461
  this.cachedWidth = undefined;
490
462
  this.cachedLines = undefined;
@@ -203,7 +203,7 @@ function validateMilestoneId(milestoneId) {
203
203
  * - emits worktree-created telemetry on successful entry
204
204
  * - notifies the caller via `ctx.notify` for every user-visible outcome
205
205
  */
206
- export function _enterMilestoneCore(s, deps, milestoneId, ctx) {
206
+ export function _enterMilestoneCore(s, deps, milestoneId, ctx, opts = {}) {
207
207
  if (!isValidMilestoneId(milestoneId)) {
208
208
  debugLog("WorktreeLifecycle", {
209
209
  action: "enterMilestone",
@@ -305,7 +305,7 @@ export function _enterMilestoneCore(s, deps, milestoneId, ctx) {
305
305
  // Handles the case where originalBasePath is falsy and basePath is itself
306
306
  // a worktree path — prevents double-nested worktree paths (#3729).
307
307
  const basePath = resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
308
- const mode = getIsolationMode(basePath);
308
+ const mode = opts.modeOverride ?? getIsolationMode(basePath);
309
309
  if (s.isolationDegraded) {
310
310
  if (mode === "worktree") {
311
311
  try {
@@ -841,7 +841,8 @@ export function mergeMilestoneStandalone(deps, mctx) {
841
841
  pushed: false,
842
842
  };
843
843
  }
844
- const mode = getIsolationMode(originalBasePath || worktreeBasePath);
844
+ const mode = mctx.isolationModeOverride ??
845
+ getIsolationMode(originalBasePath || worktreeBasePath);
845
846
  debugLog("WorktreeLifecycle", {
846
847
  action: "mergeAndExit",
847
848
  milestoneId,
@@ -1137,6 +1138,7 @@ export class WorktreeLifecycle {
1137
1138
  originalBasePath: this.s.originalBasePath,
1138
1139
  worktreeBasePath: this.s.basePath,
1139
1140
  milestoneId,
1141
+ isolationModeOverride: this.s.strandedRecoveryIsolationMode ?? undefined,
1140
1142
  isolationDegraded: this.s.isolationDegraded,
1141
1143
  notify: ctx.notify,
1142
1144
  });
@@ -1223,6 +1225,7 @@ export class WorktreeLifecycle {
1223
1225
  // Rebuild GitService after merge (branch HEAD changed)
1224
1226
  rebuildGitService(this.s, this.deps);
1225
1227
  }
1228
+ this.s.strandedRecoveryIsolationMode = null;
1226
1229
  return result;
1227
1230
  }
1228
1231
  // ── Removed: _mergeWorktreeMode / _mergeBranchMode bodies ────────────
@@ -1345,6 +1348,24 @@ export class WorktreeLifecycle {
1345
1348
  resumeFromPausedSession(base, persistedWorktreePath) {
1346
1349
  this.s.basePath = resolvePausedResumeBasePath(base, persistedWorktreePath);
1347
1350
  }
1351
+ /**
1352
+ * Adopt in-progress stranded work during bootstrap.
1353
+ *
1354
+ * Unlike completed-orphan recovery, this does not merge, delete, or commit.
1355
+ * It only moves the live session onto the branch/worktree proven by the
1356
+ * audit evidence, while preserving that mode for the eventual merge.
1357
+ */
1358
+ adoptStrandedMilestone(milestoneId, base, ctx, opts) {
1359
+ this.adoptSessionRoot(base);
1360
+ this.s.strandedRecoveryIsolationMode = opts.mode;
1361
+ const result = _enterMilestoneCore(this.s, this.deps, milestoneId, ctx, {
1362
+ modeOverride: opts.mode,
1363
+ });
1364
+ if (!result.ok) {
1365
+ this.s.strandedRecoveryIsolationMode = null;
1366
+ }
1367
+ return result;
1368
+ }
1348
1369
  /**
1349
1370
  * Adopt an orphan worktree for a bootstrap-time merge (ADR-016 phase 2 / B4,
1350
1371
  * issue #5622).
@@ -0,0 +1,117 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Lightweight worktree post-create hook runner.
3
+ import { execFileSync } from "node:child_process";
4
+ import { existsSync, readFileSync, realpathSync } from "node:fs";
5
+ import { homedir } from "node:os";
6
+ import { isAbsolute, join } from "node:path";
7
+ import { parse as parseYaml } from "yaml";
8
+ import { gsdHome } from "./gsd-home.js";
9
+ import { gsdRoot } from "./paths.js";
10
+ function readPreferencesObject(path) {
11
+ if (!existsSync(path))
12
+ return null;
13
+ const content = readFileSync(path, "utf-8");
14
+ try {
15
+ const startMarker = content.startsWith("---\r\n") ? "---\r\n" : "---\n";
16
+ if (content.startsWith(startMarker)) {
17
+ const searchStart = startMarker.length;
18
+ const endIdx = content.indexOf("\n---", searchStart);
19
+ if (endIdx === -1)
20
+ return null;
21
+ const parsed = parseYaml(content.slice(searchStart, endIdx).replace(/\r/g, ""));
22
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed)
23
+ ? parsed
24
+ : null;
25
+ }
26
+ const gitLines = [];
27
+ let inGitSection = false;
28
+ for (const rawLine of content.split("\n")) {
29
+ const line = rawLine.replace(/\r$/, "");
30
+ const heading = line.match(/^##\s+(.+)$/);
31
+ if (heading) {
32
+ inGitSection = heading[1].trim().toLowerCase().replace(/\s+/g, "_") === "git";
33
+ continue;
34
+ }
35
+ if (inGitSection && line.trim() && !line.trimStart().startsWith("#")) {
36
+ gitLines.push(line.replace(/^\s*-\s*/, ""));
37
+ }
38
+ }
39
+ if (gitLines.length === 0)
40
+ return null;
41
+ const parsed = parseYaml(gitLines.join("\n"));
42
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed)
43
+ ? { git: parsed }
44
+ : null;
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
50
+ function extractHookPath(preferences) {
51
+ const git = preferences?.git;
52
+ if (!git || typeof git !== "object" || Array.isArray(git))
53
+ return null;
54
+ const hookPath = git.worktree_post_create;
55
+ return typeof hookPath === "string" && hookPath.trim() ? hookPath : null;
56
+ }
57
+ function resolveConfiguredHookPath(sourceDir) {
58
+ const paths = [
59
+ join(homedir(), ".pi", "agent", "gsd-preferences.md"),
60
+ join(gsdHome(), "preferences.md"),
61
+ join(gsdHome(), "PREFERENCES.md"),
62
+ join(gsdRoot(sourceDir), "preferences.md"),
63
+ join(gsdRoot(sourceDir), "PREFERENCES.md"),
64
+ ];
65
+ let hookPath = null;
66
+ for (const path of paths) {
67
+ hookPath = extractHookPath(readPreferencesObject(path)) ?? hookPath;
68
+ }
69
+ return hookPath;
70
+ }
71
+ /**
72
+ * Run the user-configured post-create hook script after worktree creation.
73
+ * The script receives SOURCE_DIR and WORKTREE_DIR as environment variables.
74
+ * Failure is non-fatal -- returns the error message or null on success.
75
+ *
76
+ * Reads git.worktree_post_create from effective global/project preferences
77
+ * unless hookPath is provided directly.
78
+ */
79
+ export function runWorktreePostCreateHook(sourceDir, worktreeDir, hookPath) {
80
+ if (hookPath === undefined) {
81
+ hookPath = resolveConfiguredHookPath(sourceDir) ?? undefined;
82
+ }
83
+ if (!hookPath)
84
+ return null;
85
+ let resolved = isAbsolute(hookPath) ? hookPath : join(sourceDir, hookPath);
86
+ if (!existsSync(resolved)) {
87
+ return `Worktree post-create hook not found: ${resolved}`;
88
+ }
89
+ if (process.platform === "win32") {
90
+ try {
91
+ resolved = realpathSync.native(resolved);
92
+ }
93
+ catch {
94
+ // Keep the original path; the exec error below will include the failure.
95
+ }
96
+ }
97
+ try {
98
+ const needsShell = process.platform === "win32" && /\.(bat|cmd)$/i.test(resolved);
99
+ execFileSync(resolved, [], {
100
+ cwd: worktreeDir,
101
+ env: {
102
+ ...process.env,
103
+ SOURCE_DIR: sourceDir,
104
+ WORKTREE_DIR: worktreeDir,
105
+ },
106
+ stdio: ["ignore", "pipe", "pipe"],
107
+ encoding: "utf-8",
108
+ timeout: 30_000,
109
+ shell: needsShell,
110
+ });
111
+ return null;
112
+ }
113
+ catch (err) {
114
+ const msg = err instanceof Error ? err.message : String(err);
115
+ return `Worktree post-create hook failed: ${msg}`;
116
+ }
117
+ }
@@ -137,6 +137,32 @@ const ROOT_DIAGNOSTIC_FILES = [
137
137
  "completed-units.json",
138
138
  "metrics.json",
139
139
  ];
140
+ /**
141
+ * Root-level .gsd/ projections copied from project root into worktrees for
142
+ * compatibility reads. Project root remains authoritative; copy-back still
143
+ * excludes these markdown projections.
144
+ */
145
+ const ROOT_FORWARD_PROJECTION_FILES = [
146
+ "DECISIONS.md",
147
+ "REQUIREMENTS.md",
148
+ "PROJECT.md",
149
+ "KNOWLEDGE.md",
150
+ "OVERRIDES.md",
151
+ "QUEUE.md",
152
+ "completed-units.json",
153
+ "metrics.json",
154
+ "mcp.json",
155
+ ];
156
+ function syncRootProjectionFilesToWorktree(prGsd, wtGsd) {
157
+ mkdirSync(wtGsd, { recursive: true });
158
+ for (const file of ROOT_FORWARD_PROJECTION_FILES) {
159
+ const src = join(prGsd, file);
160
+ const dst = join(wtGsd, file);
161
+ if (!existsSync(src) || existsSync(dst))
162
+ continue;
163
+ safeCopy(src, dst, { force: false });
164
+ }
165
+ }
140
166
  // ─── Implementation cores ────────────────────────────────────────────────
141
167
  //
142
168
  // The `_*Impl` exports take raw paths so the deprecated path-string
@@ -164,6 +190,9 @@ export function _projectRootToWorktreeImpl(projectRoot, worktreePath_, milestone
164
190
  // Compare realpaths and skip when they resolve to the same physical path (#2184).
165
191
  if (isSamePath(prGsd, wtGsd))
166
192
  return;
193
+ // Root PROJECT/REQUIREMENTS/DECISIONS projections must be readable from a
194
+ // worktree-bound unit; the project root remains authoritative.
195
+ syncRootProjectionFilesToWorktree(prGsd, wtGsd);
167
196
  // Copy milestone directory from project root to worktree — additive only.
168
197
  // force:false prevents cpSync from overwriting existing worktree files.
169
198
  // Without this, worktree-local files (e.g. VALIDATION.md written
@@ -12,6 +12,45 @@ export const BRAVE_TOOL_NAMES = ["search-the-web", "search_and_read"];
12
12
  export const CUSTOM_SEARCH_TOOL_NAMES = ["search-the-web", "search_and_read", "google_search"];
13
13
  /** Thinking block types that require signature validation by the API */
14
14
  const THINKING_TYPES = new Set(["thinking", "redacted_thinking"]);
15
+ const NATIVE_SERVER_TOOL_USE_TYPES = new Set([
16
+ "server_tool_use",
17
+ "serverToolUse",
18
+ ]);
19
+ const NATIVE_WEB_SEARCH_RESULT_TYPES = new Set([
20
+ "web_search_tool_result",
21
+ "webSearchResult",
22
+ ]);
23
+ function nativeServerToolId(block) {
24
+ if (!NATIVE_SERVER_TOOL_USE_TYPES.has(block?.type))
25
+ return undefined;
26
+ return typeof block.id === "string" ? block.id : undefined;
27
+ }
28
+ function nativeWebSearchResultId(block) {
29
+ if (!NATIVE_WEB_SEARCH_RESULT_TYPES.has(block?.type))
30
+ return undefined;
31
+ const id = block.type === "webSearchResult" ? block.toolUseId : block.tool_use_id;
32
+ return typeof id === "string" ? id : undefined;
33
+ }
34
+ function hasCompleteNativeServerToolReplay(content) {
35
+ const pendingToolUseIds = new Set();
36
+ let sawNativeServerToolUse = false;
37
+ for (const block of content) {
38
+ const toolUseId = nativeServerToolId(block);
39
+ if (toolUseId !== undefined) {
40
+ if (pendingToolUseIds.has(toolUseId))
41
+ return false;
42
+ sawNativeServerToolUse = true;
43
+ pendingToolUseIds.add(toolUseId);
44
+ continue;
45
+ }
46
+ const resultId = nativeWebSearchResultId(block);
47
+ if (resultId !== undefined) {
48
+ if (!pendingToolUseIds.delete(resultId))
49
+ return false;
50
+ }
51
+ }
52
+ return sawNativeServerToolUse && pendingToolUseIds.size === 0;
53
+ }
15
54
  /**
16
55
  * Providers whose Anthropic-Messages endpoint is known to accept the native
17
56
  * `web_search_20250305` server tool. Anthropic-shaped transports NOT in this
@@ -30,6 +69,10 @@ const NATIVE_WEB_SEARCH_PROVIDERS = new Set([
30
69
  "anthropic-vertex",
31
70
  "vercel-ai-gateway",
32
71
  ]);
72
+ function looksLikeAnthropicModelName(modelName) {
73
+ const normalized = modelName.trim().toLowerCase();
74
+ return normalized.startsWith("claude-") || normalized.startsWith("anthropic/claude-");
75
+ }
33
76
  /**
34
77
  * True when the model is an Anthropic-shaped transport AND the provider is
35
78
  * known to accept the native `web_search_20250305` tool. Gate both on api
@@ -74,11 +117,10 @@ export function preferBraveSearch() {
74
117
  * those blocks. The Anthropic API detects the modification and rejects the
75
118
  * request with "thinking blocks cannot be modified."
76
119
  *
77
- * Fix: Remove thinking blocks from all assistant messages in the history.
78
- * In Anthropic's Messages API, the messages array always ends with a user
79
- * message, so every assistant message is from a previous turn that has been
80
- * through a store/replay cycle. The model generates fresh thinking for the
81
- * current turn regardless.
120
+ * Fix: Remove thinking blocks only from assistant messages that do not carry
121
+ * native server-tool blocks. Complete native server-tool histories can be
122
+ * replayed as-is; stripping thinking from those messages is itself a latest
123
+ * assistant message modification.
82
124
  */
83
125
  export function stripThinkingFromHistory(messages) {
84
126
  for (const msg of messages) {
@@ -87,6 +129,9 @@ export function stripThinkingFromHistory(messages) {
87
129
  const content = msg.content;
88
130
  if (!Array.isArray(content))
89
131
  continue;
132
+ if (hasCompleteNativeServerToolReplay(content)) {
133
+ continue;
134
+ }
90
135
  msg.content = content.filter((block) => !THINKING_TYPES.has(block?.type));
91
136
  }
92
137
  }
@@ -152,6 +197,8 @@ export function registerNativeSearchHooks(pi) {
152
197
  // The model name heuristic is needed for session restores where
153
198
  // modelsAreEqual suppresses model_select AND the SDK doesn't pass model.
154
199
  const eventModel = event.model;
200
+ const payloadModelName = typeof payload.model === "string" ? payload.model : "";
201
+ const payloadLooksAnthropic = payloadModelName ? looksLikeAnthropicModelName(payloadModelName) : undefined;
155
202
  let isAnthropic;
156
203
  if (eventModel?.api || eventModel?.provider) {
157
204
  // Preferred path: gate on api shape + provider allowlist. Both fields
@@ -161,13 +208,15 @@ export function registerNativeSearchHooks(pi) {
161
208
  isAnthropic = supportsNativeWebSearch(eventModel);
162
209
  }
163
210
  else if (modelSelectFired) {
164
- isAnthropic = isAnthropicProvider;
211
+ // The model_select flag can be stale if the next request omits event.model
212
+ // after a provider switch. A concrete non-Claude payload must win so an
213
+ // Anthropic-only tool never leaks into OpenAI Responses requests.
214
+ isAnthropic = isAnthropicProvider && payloadLooksAnthropic !== false;
165
215
  }
166
216
  else {
167
217
  // Last resort: session-restore paths where the SDK doesn't pass model.
168
218
  // The model-name prefix is best-effort and assumes direct Anthropic.
169
- const modelName = typeof payload.model === "string" ? payload.model : "";
170
- isAnthropic = modelName.startsWith("claude-");
219
+ isAnthropic = payloadLooksAnthropic === true;
171
220
  }
172
221
  if (!isAnthropic)
173
222
  return;