gsd-pi 2.77.0 → 2.78.0-dev.aeeb2ca00

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 (878) hide show
  1. package/README.md +51 -33
  2. package/dist/claude-cli-check.js +46 -10
  3. package/dist/cli-web-branch.d.ts +1 -0
  4. package/dist/cli-web-branch.js +3 -0
  5. package/dist/cli.js +38 -2
  6. package/dist/extension-discovery.d.ts +6 -0
  7. package/dist/extension-discovery.js +37 -0
  8. package/dist/extension-registry.d.ts +3 -0
  9. package/dist/extension-sort.d.ts +18 -0
  10. package/dist/extension-sort.js +114 -0
  11. package/dist/extension-validator.d.ts +47 -0
  12. package/dist/extension-validator.js +127 -0
  13. package/dist/headless.js +49 -4
  14. package/dist/loader.js +35 -7
  15. package/dist/provider-migrations.d.ts +18 -0
  16. package/dist/provider-migrations.js +14 -0
  17. package/dist/resource-loader.d.ts +40 -0
  18. package/dist/resource-loader.js +32 -13
  19. package/dist/resources/extensions/browser-tools/capture.js +9 -0
  20. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  21. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  22. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  23. package/dist/resources/extensions/browser-tools/tools/forms.js +5 -1
  24. package/dist/resources/extensions/browser-tools/tools/intent.js +5 -1
  25. package/dist/resources/extensions/claude-code-cli/readiness.js +72 -16
  26. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +552 -67
  27. package/dist/resources/extensions/cmux/index.js +20 -0
  28. package/dist/resources/extensions/github-sync/templates.js +103 -0
  29. package/dist/resources/extensions/google-search/extension-manifest.json +5 -4
  30. package/dist/resources/extensions/google-search/index.js +3 -375
  31. package/dist/resources/extensions/gsd/abandon-detect.js +44 -0
  32. package/dist/resources/extensions/gsd/auto/loop.js +124 -2
  33. package/dist/resources/extensions/gsd/auto/phases.js +57 -39
  34. package/dist/resources/extensions/gsd/auto/resolve.js +24 -0
  35. package/dist/resources/extensions/gsd/auto/run-unit.js +10 -2
  36. package/dist/resources/extensions/gsd/auto/session.js +6 -2
  37. package/dist/resources/extensions/gsd/auto/turn-epoch.js +95 -0
  38. package/dist/resources/extensions/gsd/auto-dispatch.js +201 -38
  39. package/dist/resources/extensions/gsd/auto-loop.js +1 -1
  40. package/dist/resources/extensions/gsd/auto-model-selection.js +124 -4
  41. package/dist/resources/extensions/gsd/auto-post-unit.js +215 -64
  42. package/dist/resources/extensions/gsd/auto-prompts.js +372 -104
  43. package/dist/resources/extensions/gsd/auto-recovery.js +210 -24
  44. package/dist/resources/extensions/gsd/auto-start.js +122 -30
  45. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +11 -5
  46. package/dist/resources/extensions/gsd/auto-tool-tracking.js +47 -7
  47. package/dist/resources/extensions/gsd/auto-unit-closeout.js +11 -2
  48. package/dist/resources/extensions/gsd/auto-worktree.js +180 -34
  49. package/dist/resources/extensions/gsd/auto.js +107 -35
  50. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +19 -1
  51. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +209 -0
  52. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +5 -6
  53. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +11 -0
  54. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -3
  55. package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -6
  56. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +127 -9
  57. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +31 -4
  58. package/dist/resources/extensions/gsd/commands-cmux.js +9 -6
  59. package/dist/resources/extensions/gsd/commands-extensions.js +634 -43
  60. package/dist/resources/extensions/gsd/component-loader.js +447 -0
  61. package/dist/resources/extensions/gsd/component-types.js +69 -0
  62. package/dist/resources/extensions/gsd/context-store.js +23 -7
  63. package/dist/resources/extensions/gsd/detection.js +49 -1
  64. package/dist/resources/extensions/gsd/dispatch-guard.js +29 -3
  65. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  66. package/dist/resources/extensions/gsd/file-lock.js +49 -9
  67. package/dist/resources/extensions/gsd/forensics.js +106 -0
  68. package/dist/resources/extensions/gsd/gate-registry.js +2 -2
  69. package/dist/resources/extensions/gsd/git-constants.js +28 -1
  70. package/dist/resources/extensions/gsd/git-self-heal.js +27 -0
  71. package/dist/resources/extensions/gsd/git-service.js +127 -2
  72. package/dist/resources/extensions/gsd/gitignore.js +1 -0
  73. package/dist/resources/extensions/gsd/gsd-db.js +6 -3
  74. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -1
  75. package/dist/resources/extensions/gsd/guided-flow.js +39 -13
  76. package/dist/resources/extensions/gsd/journal.js +17 -2
  77. package/dist/resources/extensions/gsd/memory-extractor.js +7 -1
  78. package/dist/resources/extensions/gsd/milestone-actions.js +15 -0
  79. package/dist/resources/extensions/gsd/milestone-scope-classifier.js +299 -0
  80. package/dist/resources/extensions/gsd/milestone-summary-classifier.js +37 -0
  81. package/dist/resources/extensions/gsd/model-cost-table.js +3 -0
  82. package/dist/resources/extensions/gsd/model-router.js +6 -0
  83. package/dist/resources/extensions/gsd/native-git-bridge.js +34 -4
  84. package/dist/resources/extensions/gsd/notifications.js +30 -16
  85. package/dist/resources/extensions/gsd/preferences-validation.js +23 -0
  86. package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +4 -0
  87. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  88. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
  89. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  90. package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  91. package/dist/resources/extensions/gsd/prompts/system.md +1 -0
  92. package/dist/resources/extensions/gsd/reports.js +5 -4
  93. package/dist/resources/extensions/gsd/safety/git-checkpoint.js +11 -0
  94. package/dist/resources/extensions/gsd/service-tier.js +5 -2
  95. package/dist/resources/extensions/gsd/session-lock.js +19 -10
  96. package/dist/resources/extensions/gsd/skill-manifest.js +168 -0
  97. package/dist/resources/extensions/gsd/slice-cadence.js +238 -0
  98. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +278 -8
  99. package/dist/resources/extensions/gsd/state-transition-matrix.js +118 -0
  100. package/dist/resources/extensions/gsd/state.js +69 -58
  101. package/dist/resources/extensions/gsd/sync-lock.js +98 -42
  102. package/dist/resources/extensions/gsd/tools/complete-slice.js +21 -0
  103. package/dist/resources/extensions/gsd/tools/complete-task.js +31 -0
  104. package/dist/resources/extensions/gsd/tools/validate-milestone.js +7 -2
  105. package/dist/resources/extensions/gsd/unit-context-composer.js +147 -0
  106. package/dist/resources/extensions/gsd/unit-context-manifest.js +370 -0
  107. package/dist/resources/extensions/gsd/uok/audit.js +18 -2
  108. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +33 -0
  109. package/dist/resources/extensions/gsd/uok/execution-graph.js +10 -0
  110. package/dist/resources/extensions/gsd/uok/gate-runner.js +53 -5
  111. package/dist/resources/extensions/gsd/uok/gitops.js +2 -1
  112. package/dist/resources/extensions/gsd/uok/loop-adapter.js +37 -10
  113. package/dist/resources/extensions/gsd/uok/parity-report.js +58 -0
  114. package/dist/resources/extensions/gsd/uok/plan-v2.js +10 -4
  115. package/dist/resources/extensions/gsd/uok/writer.js +82 -0
  116. package/dist/resources/extensions/gsd/workflow-logger.js +10 -2
  117. package/dist/resources/extensions/gsd/workflow-mcp.js +6 -0
  118. package/dist/resources/extensions/gsd/worktree-manager.js +86 -8
  119. package/dist/resources/extensions/gsd/worktree-resolver.js +86 -7
  120. package/dist/resources/extensions/gsd/worktree-telemetry.js +198 -0
  121. package/dist/resources/extensions/mcp-client/auth.js +10 -1
  122. package/dist/resources/extensions/mcp-client/index.js +121 -10
  123. package/dist/resources/extensions/ollama/index.js +5 -1
  124. package/dist/resources/extensions/remote-questions/manager.js +11 -5
  125. package/dist/resources/extensions/shared/cmux-events.js +12 -0
  126. package/dist/resources/extensions/shared/rtk-session-stats.js +1 -2
  127. package/dist/resources/skills/create-skill/SKILL.md +2 -2
  128. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  129. package/dist/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  130. package/dist/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  131. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  132. package/dist/web/standalone/.next/BUILD_ID +1 -1
  133. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  134. package/dist/web/standalone/.next/build-manifest.json +4 -4
  135. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  136. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  137. package/dist/web/standalone/.next/required-server-files.json +3 -3
  138. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  139. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  141. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  149. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  151. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  152. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  153. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  154. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  155. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  156. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  157. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  158. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  168. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  177. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  184. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  205. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  211. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  213. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  227. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  233. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  235. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  244. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  246. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  247. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  249. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  250. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  252. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  253. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  254. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  255. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  256. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  257. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  259. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  260. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  261. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  262. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  263. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  264. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  265. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  266. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  267. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  268. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  269. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  270. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  271. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  272. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  273. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  274. package/dist/web/standalone/.next/server/app/index.html +1 -1
  275. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  276. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  277. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  278. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  279. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  280. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  281. package/dist/web/standalone/.next/server/app/page.js +2 -2
  282. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  283. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  284. package/dist/web/standalone/.next/server/chunks/1926.js +1 -0
  285. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  286. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  287. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  288. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  289. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  290. package/dist/web/standalone/.next/server/middleware.js +2 -2
  291. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  292. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  293. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  294. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  295. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  296. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +11 -0
  297. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  298. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  299. package/dist/web/standalone/.next/static/chunks/app/page-5b113fd32bc2a1c3.js +1 -0
  300. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  301. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  302. package/dist/web/standalone/.next/static/chunks/{webpack-5fc74f13a25fa1bb.js → webpack-2e68521d7c82f7c2.js} +1 -1
  303. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  304. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  305. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  306. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  307. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  308. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  309. package/dist/web/standalone/server.js +1 -1
  310. package/package.json +17 -16
  311. package/packages/daemon/package.json +2 -2
  312. package/packages/daemon/src/logger.ts +4 -3
  313. package/packages/mcp-server/README.md +3 -3
  314. package/packages/mcp-server/dist/env-writer.d.ts +1 -0
  315. package/packages/mcp-server/dist/env-writer.d.ts.map +1 -1
  316. package/packages/mcp-server/dist/env-writer.js +74 -6
  317. package/packages/mcp-server/dist/env-writer.js.map +1 -1
  318. package/packages/mcp-server/dist/server.d.ts +24 -0
  319. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  320. package/packages/mcp-server/dist/server.js +111 -87
  321. package/packages/mcp-server/dist/server.js.map +1 -1
  322. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  323. package/packages/mcp-server/dist/workflow-tools.js +15 -6
  324. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  325. package/packages/mcp-server/package.json +7 -2
  326. package/packages/mcp-server/src/env-writer.test.ts +79 -1
  327. package/packages/mcp-server/src/env-writer.ts +76 -6
  328. package/packages/mcp-server/src/mcp-server.test.ts +25 -3
  329. package/packages/mcp-server/src/readers/graph.test.ts +87 -15
  330. package/packages/mcp-server/src/readers/readers.test.ts +5 -1
  331. package/packages/mcp-server/src/secure-env-collect.test.ts +232 -237
  332. package/packages/mcp-server/src/server.ts +158 -105
  333. package/packages/mcp-server/src/workflow-tools.test.ts +85 -0
  334. package/packages/mcp-server/src/workflow-tools.ts +19 -6
  335. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  336. package/packages/native/package.json +7 -2
  337. package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
  338. package/packages/native/src/__tests__/clipboard.test.mjs +69 -23
  339. package/packages/native/src/__tests__/module-compat.test.mjs +59 -27
  340. package/packages/native/src/__tests__/ps.test.mjs +14 -8
  341. package/packages/native/src/__tests__/stream-process.test.mjs +23 -2
  342. package/packages/native/src/__tests__/truncate.test.mjs +17 -2
  343. package/packages/native/tsconfig.tsbuildinfo +1 -1
  344. package/packages/pi-agent-core/package.json +6 -1
  345. package/packages/pi-agent-core/src/agent-loop.test.ts +226 -31
  346. package/packages/pi-agent-core/src/agent.test.ts +96 -102
  347. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  348. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  349. package/packages/pi-ai/dist/models/capability-patches.js +9 -2
  350. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  351. package/packages/pi-ai/dist/models/generated/index.d.ts +34 -0
  352. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  353. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  354. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  355. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  356. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  357. package/packages/pi-ai/dist/models/generated/openai.d.ts +17 -0
  358. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -1
  359. package/packages/pi-ai/dist/models/generated/openai.js +17 -0
  360. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -1
  361. package/packages/pi-ai/dist/models.generated.test.js +43 -70
  362. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  363. package/packages/pi-ai/dist/models.test.js +36 -11
  364. package/packages/pi-ai/dist/models.test.js.map +1 -1
  365. package/packages/pi-ai/package.json +6 -1
  366. package/packages/pi-ai/scripts/generate-models.ts +44 -0
  367. package/packages/pi-ai/src/models/capability-patches.ts +10 -2
  368. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  369. package/packages/pi-ai/src/models/generated/openai.ts +17 -0
  370. package/packages/pi-ai/src/models.generated.test.ts +46 -73
  371. package/packages/pi-ai/src/models.test.ts +48 -11
  372. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  373. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +96 -32
  374. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js +75 -12
  376. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js.map +1 -1
  377. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +99 -31
  378. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +25 -0
  380. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +105 -6
  382. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +230 -28
  384. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts +30 -2
  386. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
  387. package/packages/pi-coding-agent/dist/core/compaction/utils.js +113 -12
  388. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  389. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +1 -0
  390. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
  391. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +29 -18
  392. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  393. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts +2 -0
  394. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts.map +1 -0
  395. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js +130 -0
  396. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js.map +1 -0
  397. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +56 -1
  398. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -1
  399. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +8 -15
  400. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js.map +1 -1
  401. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts +25 -0
  402. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts.map +1 -0
  403. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js +109 -0
  404. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js.map +1 -0
  405. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts +67 -0
  406. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts.map +1 -0
  407. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js +167 -0
  408. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js.map +1 -0
  409. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +8 -2
  410. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  411. package/packages/pi-coding-agent/dist/core/extensions/loader.js +85 -8
  412. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  413. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +7 -0
  414. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  415. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  416. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +41 -4
  417. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
  418. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +19 -2
  419. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  420. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +76 -18
  421. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -1
  422. package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -1
  423. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  424. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  425. package/packages/pi-coding-agent/dist/core/retry-handler.js +2 -6
  426. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  427. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +5 -1
  428. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
  429. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts +18 -0
  430. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts.map +1 -0
  431. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js +18 -0
  432. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js.map +1 -0
  433. package/packages/pi-coding-agent/dist/core/sdk.d.ts +1 -0
  434. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  435. package/packages/pi-coding-agent/dist/core/sdk.js +4 -1
  436. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  437. package/packages/pi-coding-agent/dist/core/sdk.test.js +19 -1
  438. package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -1
  439. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +20 -0
  440. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  441. package/packages/pi-coding-agent/dist/core/system-prompt.js +19 -5
  442. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  443. package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js +2 -1
  444. package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js.map +1 -1
  445. package/packages/pi-coding-agent/dist/index.d.ts +1 -0
  446. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  447. package/packages/pi-coding-agent/dist/index.js +1 -0
  448. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  449. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +15 -6
  450. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js.map +1 -1
  451. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +36 -5
  452. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  453. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +20 -13
  454. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
  455. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  456. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -5
  457. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  458. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts +7 -1
  459. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  460. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +31 -9
  461. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
  462. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  463. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +30 -12
  464. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  465. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  466. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +18 -3
  467. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  468. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +139 -0
  469. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  470. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +2 -0
  471. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  472. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  473. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +4 -0
  474. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  475. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +105 -13
  476. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  477. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts +2 -0
  478. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts.map +1 -0
  479. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js +130 -0
  480. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js.map +1 -0
  481. package/packages/pi-coding-agent/package.json +6 -1
  482. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +113 -37
  483. package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +89 -17
  484. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +112 -43
  485. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +368 -28
  486. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +122 -6
  487. package/packages/pi-coding-agent/src/core/compaction/utils.ts +111 -13
  488. package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +154 -0
  489. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +32 -18
  490. package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +68 -1
  491. package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +9 -18
  492. package/packages/pi-coding-agent/src/core/extensions/extension-discovery.ts +119 -0
  493. package/packages/pi-coding-agent/src/core/extensions/extension-registry.ts +222 -0
  494. package/packages/pi-coding-agent/src/core/extensions/loader.ts +82 -11
  495. package/packages/pi-coding-agent/src/core/extensions/types.ts +8 -0
  496. package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +48 -4
  497. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +22 -2
  498. package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +93 -28
  499. package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -1
  500. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +5 -1
  501. package/packages/pi-coding-agent/src/core/retry-handler.ts +2 -8
  502. package/packages/pi-coding-agent/src/core/retryable-error-regex.ts +18 -0
  503. package/packages/pi-coding-agent/src/core/sdk.test.ts +25 -1
  504. package/packages/pi-coding-agent/src/core/sdk.ts +10 -3
  505. package/packages/pi-coding-agent/src/core/system-prompt.ts +38 -4
  506. package/packages/pi-coding-agent/src/core/tools/path-utils.test.ts +2 -1
  507. package/packages/pi-coding-agent/src/index.ts +1 -0
  508. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +17 -7
  509. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +49 -3
  510. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +26 -20
  511. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +14 -5
  512. package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +45 -11
  513. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +48 -9
  514. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +160 -1
  515. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +20 -3
  516. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +2 -0
  517. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +119 -13
  518. package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
  519. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  520. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +31 -14
  521. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  522. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +128 -17
  523. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  524. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +51 -6
  525. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
  526. package/packages/pi-tui/dist/__tests__/tui.test.js +18 -30
  527. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  528. package/packages/pi-tui/dist/components/__tests__/input.test.js +10 -3
  529. package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
  530. package/packages/pi-tui/dist/components/__tests__/loader.test.js +53 -9
  531. package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -1
  532. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +6 -2
  533. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -1
  534. package/packages/pi-tui/dist/components/editor.d.ts +14 -0
  535. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  536. package/packages/pi-tui/dist/components/editor.js +19 -0
  537. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  538. package/packages/pi-tui/dist/components/image.test.js +6 -5
  539. package/packages/pi-tui/dist/components/image.test.js.map +1 -1
  540. package/packages/pi-tui/dist/editor-component.d.ts +2 -0
  541. package/packages/pi-tui/dist/editor-component.d.ts.map +1 -1
  542. package/packages/pi-tui/dist/editor-component.js.map +1 -1
  543. package/packages/pi-tui/dist/stdin-buffer.d.ts +7 -0
  544. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  545. package/packages/pi-tui/dist/stdin-buffer.js +20 -0
  546. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  547. package/packages/pi-tui/package.json +6 -1
  548. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +46 -15
  549. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +140 -17
  550. package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +62 -6
  551. package/packages/pi-tui/src/__tests__/tui.test.ts +18 -37
  552. package/packages/pi-tui/src/components/__tests__/input.test.ts +19 -3
  553. package/packages/pi-tui/src/components/__tests__/loader.test.ts +112 -35
  554. package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +9 -2
  555. package/packages/pi-tui/src/components/editor.ts +22 -0
  556. package/packages/pi-tui/src/components/image.test.ts +10 -5
  557. package/packages/pi-tui/src/editor-component.ts +3 -0
  558. package/packages/pi-tui/src/stdin-buffer.ts +26 -0
  559. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  560. package/packages/rpc-client/dist/rpc-client.test.js +101 -51
  561. package/packages/rpc-client/dist/rpc-client.test.js.map +1 -1
  562. package/packages/rpc-client/package.json +6 -1
  563. package/packages/rpc-client/src/rpc-client.test.ts +109 -52
  564. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  565. package/pkg/package.json +1 -1
  566. package/scripts/install.js +526 -0
  567. package/scripts/lib/workspace-manifest.cjs +86 -0
  568. package/scripts/link-workspace-packages.cjs +5 -17
  569. package/scripts/postinstall.js +9 -178
  570. package/src/resources/extensions/browser-tools/capture.ts +12 -0
  571. package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  572. package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  573. package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  574. package/src/resources/extensions/browser-tools/tools/forms.ts +5 -1
  575. package/src/resources/extensions/browser-tools/tools/intent.ts +5 -1
  576. package/src/resources/extensions/claude-code-cli/readiness.ts +75 -16
  577. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +602 -73
  578. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +1028 -91
  579. package/src/resources/extensions/cmux/index.ts +35 -10
  580. package/src/resources/extensions/github-sync/templates.ts +151 -0
  581. package/src/resources/extensions/github-sync/tests/cli.test.ts +76 -7
  582. package/src/resources/extensions/github-sync/tests/templates.test.ts +92 -1
  583. package/src/resources/extensions/google-search/extension-manifest.json +5 -4
  584. package/src/resources/extensions/google-search/index.ts +9 -470
  585. package/src/resources/extensions/gsd/abandon-detect.ts +62 -0
  586. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  587. package/src/resources/extensions/gsd/auto/loop.ts +142 -2
  588. package/src/resources/extensions/gsd/auto/phases.ts +62 -38
  589. package/src/resources/extensions/gsd/auto/resolve.ts +29 -0
  590. package/src/resources/extensions/gsd/auto/run-unit.ts +16 -2
  591. package/src/resources/extensions/gsd/auto/session.ts +7 -2
  592. package/src/resources/extensions/gsd/auto/turn-epoch.ts +108 -0
  593. package/src/resources/extensions/gsd/auto/types.ts +1 -1
  594. package/src/resources/extensions/gsd/auto-dispatch.ts +214 -37
  595. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  596. package/src/resources/extensions/gsd/auto-model-selection.ts +131 -4
  597. package/src/resources/extensions/gsd/auto-post-unit.ts +226 -73
  598. package/src/resources/extensions/gsd/auto-prompts.ts +385 -93
  599. package/src/resources/extensions/gsd/auto-recovery.ts +240 -25
  600. package/src/resources/extensions/gsd/auto-start.ts +146 -14
  601. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -5
  602. package/src/resources/extensions/gsd/auto-tool-tracking.ts +51 -7
  603. package/src/resources/extensions/gsd/auto-unit-closeout.ts +14 -3
  604. package/src/resources/extensions/gsd/auto-worktree.ts +190 -31
  605. package/src/resources/extensions/gsd/auto.ts +127 -41
  606. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +20 -1
  607. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +221 -0
  608. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +6 -6
  609. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +11 -0
  610. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -3
  611. package/src/resources/extensions/gsd/bootstrap/system-context.ts +13 -9
  612. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +158 -9
  613. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +27 -8
  614. package/src/resources/extensions/gsd/commands-cmux.ts +10 -6
  615. package/src/resources/extensions/gsd/commands-extensions.ts +747 -41
  616. package/src/resources/extensions/gsd/component-loader.ts +598 -0
  617. package/src/resources/extensions/gsd/component-types.ts +362 -0
  618. package/src/resources/extensions/gsd/context-store.ts +25 -8
  619. package/src/resources/extensions/gsd/detection.ts +58 -1
  620. package/src/resources/extensions/gsd/dispatch-guard.ts +26 -2
  621. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  622. package/src/resources/extensions/gsd/file-lock.ts +84 -11
  623. package/src/resources/extensions/gsd/forensics.ts +118 -1
  624. package/src/resources/extensions/gsd/gate-registry.ts +2 -2
  625. package/src/resources/extensions/gsd/git-constants.ts +30 -1
  626. package/src/resources/extensions/gsd/git-self-heal.ts +31 -0
  627. package/src/resources/extensions/gsd/git-service.ts +150 -2
  628. package/src/resources/extensions/gsd/gitignore.ts +1 -0
  629. package/src/resources/extensions/gsd/gsd-db.ts +6 -3
  630. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -1
  631. package/src/resources/extensions/gsd/guided-flow.ts +57 -14
  632. package/src/resources/extensions/gsd/journal.ts +38 -3
  633. package/src/resources/extensions/gsd/memory-extractor.ts +11 -3
  634. package/src/resources/extensions/gsd/milestone-actions.ts +18 -0
  635. package/src/resources/extensions/gsd/milestone-scope-classifier.ts +366 -0
  636. package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
  637. package/src/resources/extensions/gsd/model-cost-table.ts +3 -0
  638. package/src/resources/extensions/gsd/model-router.ts +6 -0
  639. package/src/resources/extensions/gsd/native-git-bridge.ts +34 -4
  640. package/src/resources/extensions/gsd/notifications.ts +27 -15
  641. package/src/resources/extensions/gsd/preferences-validation.ts +21 -0
  642. package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +4 -0
  643. package/src/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  644. package/src/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
  645. package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  646. package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  647. package/src/resources/extensions/gsd/prompts/system.md +1 -0
  648. package/src/resources/extensions/gsd/reports.ts +5 -4
  649. package/src/resources/extensions/gsd/safety/git-checkpoint.ts +15 -0
  650. package/src/resources/extensions/gsd/service-tier.ts +5 -2
  651. package/src/resources/extensions/gsd/session-lock.ts +20 -10
  652. package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
  653. package/src/resources/extensions/gsd/slice-cadence.ts +299 -0
  654. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +309 -8
  655. package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
  656. package/src/resources/extensions/gsd/state.ts +76 -66
  657. package/src/resources/extensions/gsd/sync-lock.ts +97 -39
  658. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +270 -0
  659. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +2 -1
  660. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +341 -0
  661. package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +264 -0
  662. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +135 -285
  663. package/src/resources/extensions/gsd/tests/auto-mode-guards.test.ts +79 -0
  664. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +742 -0
  665. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +78 -0
  666. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +61 -0
  667. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +166 -0
  668. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +4 -1
  669. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +8 -194
  670. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +64 -0
  671. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +2 -2
  672. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +15 -58
  673. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +2 -2
  674. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +3 -2
  675. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +3 -2
  676. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -1
  677. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +17 -21
  678. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +108 -0
  679. package/src/resources/extensions/gsd/tests/cmux.test.ts +5 -9
  680. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +263 -0
  681. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +25 -0
  682. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +192 -0
  683. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +2 -1
  684. package/src/resources/extensions/gsd/tests/complete-task.test.ts +16 -8
  685. package/src/resources/extensions/gsd/tests/component-loader.test.ts +589 -0
  686. package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
  687. package/src/resources/extensions/gsd/tests/context-store.test.ts +79 -0
  688. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +2 -1
  689. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +50 -1
  690. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +159 -0
  691. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -0
  692. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -3
  693. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +40 -0
  694. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +91 -3
  695. package/src/resources/extensions/gsd/tests/derive-state.test.ts +4 -4
  696. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +2 -1
  697. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +2 -1
  698. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +14 -9
  699. package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +77 -0
  700. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +25 -0
  701. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +14 -0
  702. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +3 -2
  703. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +4 -3
  704. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +4 -3
  705. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +173 -0
  706. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +139 -129
  707. package/src/resources/extensions/gsd/tests/file-lock.test.ts +86 -12
  708. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +8 -104
  709. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +102 -0
  710. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +1 -1
  711. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +131 -0
  712. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +117 -0
  713. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +4 -55
  714. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +7 -56
  715. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +20 -0
  716. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +30 -0
  717. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +18 -2
  718. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  719. package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +10 -4
  720. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +144 -7
  721. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +4 -0
  722. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +2 -16
  723. package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +11 -0
  724. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +9 -3
  725. package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +6 -9
  726. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +64 -0
  727. package/src/resources/extensions/gsd/tests/knowledge.test.ts +93 -1
  728. package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +47 -0
  729. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +5 -15
  730. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +227 -55
  731. package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +187 -0
  732. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +3 -3
  733. package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
  734. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +4 -2
  735. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
  736. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  737. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +6 -48
  738. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +6 -3
  739. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +59 -2
  740. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +5 -0
  741. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +273 -130
  742. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +150 -0
  743. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +301 -0
  744. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +32 -1
  745. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +2 -1
  746. package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +12 -0
  747. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +15 -4
  748. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +54 -41
  749. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +213 -0
  750. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +3 -2
  751. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +4 -5
  752. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +13 -7
  753. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +75 -2
  754. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +132 -0
  755. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +8 -40
  756. package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +136 -256
  757. package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +170 -0
  758. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +114 -0
  759. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +6 -3
  760. package/src/resources/extensions/gsd/tests/rewrite-docs-abandon-detect.test.ts +195 -0
  761. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +148 -0
  762. package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
  763. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +29 -0
  764. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +3 -2
  765. package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +55 -95
  766. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +158 -0
  767. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +120 -1
  768. package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
  769. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +242 -0
  770. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +3 -2
  771. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +164 -1
  772. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +2 -1
  773. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +112 -0
  774. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +29 -5
  775. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
  776. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +3 -3
  777. package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +11 -92
  778. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +2 -2
  779. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +7 -6
  780. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +102 -101
  781. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +31 -0
  782. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +4 -3
  783. package/src/resources/extensions/gsd/tests/test-helpers.test.ts +98 -0
  784. package/src/resources/extensions/gsd/tests/test-helpers.ts +153 -0
  785. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
  786. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +61 -1
  787. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -1
  788. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +50 -2
  789. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +162 -0
  790. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +355 -0
  791. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +258 -0
  792. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +51 -0
  793. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +16 -0
  794. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +75 -0
  795. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +49 -26
  796. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +65 -0
  797. package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
  798. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +19 -2
  799. package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
  800. package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +168 -0
  801. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +139 -5
  802. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +144 -80
  803. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -54
  804. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +342 -277
  805. package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +37 -29
  806. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +25 -2
  807. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +226 -266
  808. package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +103 -67
  809. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +92 -90
  810. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +238 -59
  811. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +113 -161
  812. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +210 -0
  813. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +262 -0
  814. package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +186 -0
  815. package/src/resources/extensions/gsd/tests/write-gate.test.ts +7 -5
  816. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +80 -96
  817. package/src/resources/extensions/gsd/tools/complete-slice.ts +38 -0
  818. package/src/resources/extensions/gsd/tools/complete-task.ts +49 -0
  819. package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -2
  820. package/src/resources/extensions/gsd/types.ts +3 -3
  821. package/src/resources/extensions/gsd/unit-context-composer.ts +218 -0
  822. package/src/resources/extensions/gsd/unit-context-manifest.ts +574 -0
  823. package/src/resources/extensions/gsd/uok/audit.ts +20 -2
  824. package/src/resources/extensions/gsd/uok/contracts.ts +65 -0
  825. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +56 -0
  826. package/src/resources/extensions/gsd/uok/execution-graph.ts +22 -0
  827. package/src/resources/extensions/gsd/uok/gate-runner.ts +65 -5
  828. package/src/resources/extensions/gsd/uok/gitops.ts +6 -1
  829. package/src/resources/extensions/gsd/uok/loop-adapter.ts +45 -10
  830. package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
  831. package/src/resources/extensions/gsd/uok/plan-v2.ts +13 -5
  832. package/src/resources/extensions/gsd/uok/writer.ts +113 -0
  833. package/src/resources/extensions/gsd/workflow-logger.ts +22 -3
  834. package/src/resources/extensions/gsd/workflow-mcp.ts +6 -0
  835. package/src/resources/extensions/gsd/worktree-manager.ts +109 -7
  836. package/src/resources/extensions/gsd/worktree-resolver.ts +96 -9
  837. package/src/resources/extensions/gsd/worktree-telemetry.ts +322 -0
  838. package/src/resources/extensions/mcp-client/auth.ts +12 -1
  839. package/src/resources/extensions/mcp-client/index.ts +132 -11
  840. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +70 -36
  841. package/src/resources/extensions/ollama/index.ts +5 -1
  842. package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +123 -15
  843. package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +206 -19
  844. package/src/resources/extensions/remote-questions/manager.ts +36 -4
  845. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +200 -190
  846. package/src/resources/extensions/shared/cmux-events.ts +59 -0
  847. package/src/resources/extensions/shared/rtk-session-stats.ts +1 -2
  848. package/src/resources/extensions/shared/tests/interview-preview.test.ts +11 -3
  849. package/src/resources/extensions/voice/tests/linux-ready.test.ts +129 -113
  850. package/src/resources/skills/create-skill/SKILL.md +2 -2
  851. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  852. package/src/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  853. package/src/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  854. package/dist/web/standalone/.next/server/chunks/7461.js +0 -1
  855. package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +0 -9
  856. package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +0 -1
  857. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  858. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  859. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +0 -2
  860. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +0 -1
  861. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +0 -289
  862. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +0 -1
  863. package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +0 -363
  864. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +0 -143
  865. package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +0 -142
  866. package/src/resources/extensions/gsd/tests/dashboard-model-label-ordering.test.ts +0 -107
  867. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +0 -48
  868. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -159
  869. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
  870. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -79
  871. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +0 -74
  872. package/src/resources/extensions/gsd/tests/forensics-journal.test.ts +0 -162
  873. package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +0 -38
  874. package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +0 -73
  875. package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +0 -125
  876. package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +0 -42
  877. /package/dist/web/standalone/.next/static/{pV-mPo7rYGb5JBC09C8GG → cAJH99yNS1UPbeSEiNRrV}/_buildManifest.js +0 -0
  878. /package/dist/web/standalone/.next/static/{pV-mPo7rYGb5JBC09C8GG → cAJH99yNS1UPbeSEiNRrV}/_ssgManifest.js +0 -0
@@ -3,8 +3,9 @@
3
3
  *
4
4
  * The SDK runs the full agentic loop (multi-turn, tool execution, compaction)
5
5
  * in one call. This adapter translates the SDK's streaming output into
6
- * AssistantMessageEvents for TUI rendering, then strips tool-call blocks from
7
- * the final AssistantMessage so GSD's agent loop doesn't try to dispatch them.
6
+ * AssistantMessageEvents for TUI rendering, then preserves externally executed
7
+ * tool-call blocks on the final AssistantMessage so Agent Core can render them
8
+ * while `externalToolExecution` prevents local redispatch.
8
9
  */
9
10
 
10
11
  import type {
@@ -20,6 +21,10 @@ import type {
20
21
  import type { ExtensionUIContext } from "@gsd/pi-coding-agent";
21
22
  import { EventStream } from "@gsd/pi-ai";
22
23
  import { execSync } from "node:child_process";
24
+ import { existsSync, readFileSync } from "node:fs";
25
+ import { homedir } from "node:os";
26
+ import { createRequire } from "node:module";
27
+ import { dirname, join } from "node:path";
23
28
  import { PartialMessageBuilder, ZERO_USAGE, mapUsage } from "./partial-builder.js";
24
29
  import { buildWorkflowMcpServers } from "../gsd/workflow-mcp.js";
25
30
  import { showInterviewRound, type Question, type RoundResult } from "../shared/tui.js";
@@ -177,34 +182,88 @@ export function getResultErrorMessage(result: SDKResultMessage): string {
177
182
  // Claude binary resolution
178
183
  // ---------------------------------------------------------------------------
179
184
 
180
- /** Cached result of the `which`/`where claude` lookup so the shell is only spawned once per process. */
185
+ /** Cached result of the Claude executable/script resolution so lookup runs once per process. */
181
186
  let cachedClaudePath: string | null = null;
187
+ const requireFromHere = createRequire(import.meta.url);
182
188
 
183
189
  /** Return the shell command used to locate the `claude` binary on the given platform. */
184
190
  export function getClaudeLookupCommand(platform: NodeJS.Platform = process.platform): string {
185
191
  return platform === "win32" ? "where claude" : "which claude";
186
192
  }
187
193
 
188
- /** Extract the first line of `which`/`where` output as the resolved binary path. */
189
- export function parseClaudeLookupOutput(output: Buffer | string): string {
190
- return output
194
+ /**
195
+ * Pick the most suitable path from `which`/`where` output.
196
+ *
197
+ * On Windows, `where claude` can return shim entries first (for example
198
+ * `...\\npm\\claude` / `...\\npm\\claude.cmd`) that the Claude Agent SDK treats
199
+ * as a native executable path and then fails to spawn. Prefer a native
200
+ * `.exe` candidate when present.
201
+ */
202
+ export function parseClaudeLookupOutput(output: Buffer | string, platform: NodeJS.Platform = process.platform): string {
203
+ const lines = output
191
204
  .toString()
192
- .trim()
193
- .split(/\r?\n/)[0] ?? "";
205
+ .split(/\r?\n/)
206
+ .map((line) => line.trim())
207
+ .filter(Boolean);
208
+
209
+ if (lines.length === 0) return "";
210
+ if (platform !== "win32") return lines[0] ?? "";
211
+
212
+ const exeCandidate = lines.find((line) => /\.exe$/i.test(line));
213
+ if (exeCandidate) return exeCandidate;
214
+
215
+ const cmdCandidate = lines.find((line) => /\.cmd$/i.test(line));
216
+ if (cmdCandidate) return cmdCandidate;
217
+
218
+ return lines[0] ?? "";
219
+ }
220
+
221
+ /** Resolve the SDK-bundled cli.js path if available. */
222
+ export function resolveBundledClaudeCliPath(): string | null {
223
+ try {
224
+ const sdkEntry = requireFromHere.resolve("@anthropic-ai/claude-agent-sdk");
225
+ const cliPath = join(dirname(sdkEntry), "cli.js");
226
+ return existsSync(cliPath) ? cliPath : null;
227
+ } catch {
228
+ return null;
229
+ }
194
230
  }
195
231
 
196
232
  /**
197
- * Resolve the path to the system-installed `claude` binary.
198
- * The SDK defaults to a bundled cli.js which doesn't exist when
199
- * installed as a library we need to point it at the real CLI.
233
+ * Normalize a discovered path for Claude Agent SDK consumption.
234
+ *
235
+ * On Windows, the SDK treats non-`.js` paths as native binaries. NPM shims
236
+ * like `claude`/`claude.cmd` are not native binaries and can fail with
237
+ * `ENOENT`/`EINVAL` in that mode. When no `.exe` is available, prefer the
238
+ * SDK-bundled `cli.js` so the SDK runs via Node.
200
239
  */
240
+ export function normalizeClaudePathForSdk(
241
+ resolvedPath: string,
242
+ platform: NodeJS.Platform = process.platform,
243
+ bundledCliPath: string | null = resolveBundledClaudeCliPath(),
244
+ ): string {
245
+ if (platform !== "win32") return resolvedPath;
246
+ if (/\.exe$/i.test(resolvedPath)) return resolvedPath;
247
+ if (bundledCliPath) return bundledCliPath;
248
+ return resolvedPath;
249
+ }
250
+
251
+ /** Resolve the path passed to `pathToClaudeCodeExecutable`. */
201
252
  function getClaudePath(): string {
202
253
  if (cachedClaudePath) return cachedClaudePath;
254
+
255
+ const fallback = process.platform === "win32"
256
+ ? (resolveBundledClaudeCliPath() ?? "claude.cmd")
257
+ : "claude";
258
+
203
259
  try {
204
- cachedClaudePath = parseClaudeLookupOutput(execSync(getClaudeLookupCommand(), { timeout: 5_000, stdio: "pipe" }));
260
+ const lookupOutput = execSync(getClaudeLookupCommand(), { timeout: 5_000, stdio: "pipe" });
261
+ const parsed = parseClaudeLookupOutput(lookupOutput, process.platform);
262
+ cachedClaudePath = normalizeClaudePathForSdk(parsed || fallback, process.platform);
205
263
  } catch {
206
- cachedClaudePath = "claude"; // fall back to PATH resolution
264
+ cachedClaudePath = fallback;
207
265
  }
266
+
208
267
  return cachedClaudePath;
209
268
  }
210
269
 
@@ -631,6 +690,439 @@ async function promptTextInputElicitation(
631
690
  return { action: "accept", content };
632
691
  }
633
692
 
693
+ // ---------------------------------------------------------------------------
694
+ // canUseTool handler
695
+ // ---------------------------------------------------------------------------
696
+
697
+ /** Options passed by the SDK to the canUseTool callback. */
698
+ interface CanUseToolOptions {
699
+ signal: AbortSignal;
700
+ suggestions?: Array<Record<string, unknown>>;
701
+ blockedPath?: string;
702
+ decisionReason?: string;
703
+ title?: string;
704
+ displayName?: string;
705
+ description?: string;
706
+ toolUseID: string;
707
+ agentID?: string;
708
+ }
709
+
710
+ /** Result returned by the canUseTool callback to the SDK. */
711
+ type CanUseToolPermissionResult =
712
+ | { behavior: "allow"; updatedInput?: Record<string, unknown>; updatedPermissions?: Array<Record<string, unknown>>; toolUseID?: string }
713
+ | { behavior: "deny"; message: string; interrupt?: boolean; toolUseID?: string };
714
+
715
+ /**
716
+ * Known CLI tools where the subcommand verb changes the risk profile.
717
+ * Value = number of subcommand tokens (beyond the executable) to capture
718
+ * in the "Always Allow" permission pattern.
719
+ *
720
+ * `git push` and `git log` are very different → depth 1 → `Bash(git push:*)`
721
+ * `gh pr create` and `gh pr list` differ at depth 2 → `Bash(gh pr create:*)`
722
+ * `ping` is always safe → not listed → `Bash(ping:*)`
723
+ */
724
+ const SUBCOMMAND_DEPTH: Record<string, number> = {
725
+ git: 1,
726
+ gh: 2,
727
+ npm: 1,
728
+ npx: 1,
729
+ yarn: 1,
730
+ pnpm: 1,
731
+ docker: 1,
732
+ kubectl: 1,
733
+ aws: 2,
734
+ az: 2,
735
+ gcloud: 2,
736
+ cargo: 1,
737
+ pip: 1,
738
+ pip3: 1,
739
+ brew: 1,
740
+ terraform: 1,
741
+ helm: 1,
742
+ dotnet: 1,
743
+ };
744
+
745
+ /** Command wrappers to skip when extracting the base executable. */
746
+ const CMD_PASSTHROUGH = new Set(["sudo", "env", "command"]);
747
+
748
+ /**
749
+ * Build a smart permission pattern for Bash "Always Allow".
750
+ *
751
+ * Simple commands → `Bash(ping:*)` (any args are fine)
752
+ * Subcommand-sensitive CLIs → `Bash(git push:*)` (verb is captured, args wildcarded)
753
+ */
754
+ export function buildBashPermissionPattern(command: string): string {
755
+ // When the command is a chain like "cd /foo && gh pr list", extract the
756
+ // last segment — `cd` is just setup, the meaningful operation is what follows.
757
+ const segments = command.split(/\s*(?:&&|\|\||;)\s*/);
758
+ // Skip leading `cd` (directory setup) and trailing error suppressors
759
+ // like `|| true`, `|| :`, `|| echo ...`. The meaningful command is
760
+ // the first segment that is *neither* of those.
761
+ const SETUP_RE = /^\s*cd\s/;
762
+ const SUPPRESSOR_RE = /^\s*(?:true|:|echo\b)/;
763
+ let meaningful: string | undefined;
764
+ if (segments.length > 1) {
765
+ // Strip suppressors, then strip cd prefixes; take the *last* remaining
766
+ // segment — that's the meaningful command.
767
+ const trimmed = segments.filter(s => !SUPPRESSOR_RE.test(s));
768
+ const core = trimmed.filter(s => !SETUP_RE.test(s));
769
+ meaningful = core.length > 0 ? core[core.length - 1] : trimmed[trimmed.length - 1];
770
+ }
771
+ meaningful = meaningful || segments[0] || command;
772
+ const rawTokens = meaningful.trim().split(/\s+/);
773
+
774
+ // Skip sudo/env wrappers and leading VAR=val assignments
775
+ let idx = 0;
776
+ while (idx < rawTokens.length) {
777
+ if (CMD_PASSTHROUGH.has(rawTokens[idx])) { idx++; continue; }
778
+ if (/^[A-Za-z_]\w*=/.test(rawTokens[idx])) { idx++; continue; }
779
+ break;
780
+ }
781
+ const tokens = rawTokens.slice(idx).filter(Boolean);
782
+ if (tokens.length === 0) return "Bash(*)";
783
+
784
+ // Strip path and .exe from executable name
785
+ const base = tokens[0].replace(/^.*[\\/]/, "").replace(/\.exe$/i, "");
786
+ const depth = SUBCOMMAND_DEPTH[base];
787
+
788
+ if (depth !== undefined) {
789
+ // Capture base + N subcommand tokens: "gh pr list" → Bash(gh pr list:*)
790
+ const significant = [base, ...tokens.slice(1, 1 + depth)].join(" ");
791
+ return `Bash(${significant}:*)`;
792
+ }
793
+
794
+ // Simple command — any args are fine: "ping" → Bash(ping:*)
795
+ return `Bash(${base}:*)`;
796
+ }
797
+
798
+ /**
799
+ * Build the list of granularity options presented after a user chooses
800
+ * "Always Allow" for a Bash command.
801
+ *
802
+ * Rather than assuming the user wants the default smart pattern, the UI
803
+ * shows every meaningful prefix so the user explicitly picks the scope:
804
+ *
805
+ * "gh pr list --limit 5" → [
806
+ * "Bash(gh:*)", // allow any gh command
807
+ * "Bash(gh pr:*)", // allow any gh pr subcommand
808
+ * "Bash(gh pr list:*)", // allow just this verb
809
+ * ]
810
+ *
811
+ * Flags (tokens starting with `-`) terminate the subcommand chain — they
812
+ * are call-site arguments, not stable verbs. Subcommand depth is capped
813
+ * at 3 to keep the menu short (max 4 options).
814
+ *
815
+ * Returns a single-entry list when there is no meaningful subcommand to
816
+ * choose from (e.g. `ls -la`). Callers can skip the second dialog in
817
+ * that case.
818
+ */
819
+ export function buildBashPermissionPatternOptions(command: string): string[] {
820
+ const segments = command.split(/\s*(?:&&|\|\||;)\s*/);
821
+ const SETUP_RE = /^\s*cd\s/;
822
+ const SUPPRESSOR_RE = /^\s*(?:true|:|echo\b)/;
823
+ let meaningful: string | undefined;
824
+ if (segments.length > 1) {
825
+ const trimmed = segments.filter(s => !SUPPRESSOR_RE.test(s));
826
+ const core = trimmed.filter(s => !SETUP_RE.test(s));
827
+ meaningful = core.length > 0 ? core[core.length - 1] : trimmed[trimmed.length - 1];
828
+ }
829
+ meaningful = meaningful || segments[0] || command;
830
+ const rawTokens = meaningful.trim().split(/\s+/);
831
+
832
+ let idx = 0;
833
+ while (idx < rawTokens.length) {
834
+ if (CMD_PASSTHROUGH.has(rawTokens[idx])) { idx++; continue; }
835
+ if (/^[A-Za-z_]\w*=/.test(rawTokens[idx])) { idx++; continue; }
836
+ break;
837
+ }
838
+ const tokens = rawTokens.slice(idx).filter(Boolean);
839
+ if (tokens.length === 0) return ["Bash(*)"];
840
+
841
+ const base = tokens[0].replace(/^.*[\\/]/, "").replace(/\.exe$/i, "");
842
+
843
+ // Collect up to 3 subcommand tokens, stopping at the first flag.
844
+ const subTokens: string[] = [];
845
+ for (let i = 1; i < tokens.length; i++) {
846
+ const t = tokens[i];
847
+ if (t.startsWith("-")) break;
848
+ subTokens.push(t);
849
+ if (subTokens.length >= 3) break;
850
+ }
851
+
852
+ const patterns: string[] = [`Bash(${base}:*)`];
853
+ for (let i = 1; i <= subTokens.length; i++) {
854
+ patterns.push(`Bash(${[base, ...subTokens.slice(0, i)].join(" ")}:*)`);
855
+ }
856
+ return patterns;
857
+ }
858
+
859
+ /**
860
+ * Read Bash allow-rule patterns from project and user settings files.
861
+ *
862
+ * Returns the ruleContent portion (e.g. `"gh pr list:*"`) for each
863
+ * `Bash(...)` entry found in `permissions.allow`.
864
+ */
865
+ function readBashAllowRulesFromSettings(): string[] {
866
+ const rules: string[] = [];
867
+ const paths = [
868
+ join(process.cwd(), ".claude", "settings.local.json"),
869
+ join(process.cwd(), ".claude", "settings.json"),
870
+ ];
871
+ try {
872
+ paths.push(join(homedir(), ".claude", "settings.json"));
873
+ } catch {
874
+ // homedir() can throw on some platforms
875
+ }
876
+ for (const settingsPath of paths) {
877
+ try {
878
+ if (!existsSync(settingsPath)) continue;
879
+ const raw = JSON.parse(readFileSync(settingsPath, "utf8"));
880
+ const allow = raw?.permissions?.allow;
881
+ if (!Array.isArray(allow)) continue;
882
+ for (const entry of allow) {
883
+ if (typeof entry !== "string") continue;
884
+ const m = /^Bash\((.+)\)$/.exec(entry);
885
+ if (m) rules.push(m[1]);
886
+ }
887
+ } catch {
888
+ // Ignore malformed settings files
889
+ }
890
+ }
891
+ return rules;
892
+ }
893
+
894
+ /**
895
+ * Check if a Bash compound command matches saved allow rules after
896
+ * extracting the meaningful segment.
897
+ *
898
+ * The SDK's built-in matcher refuses to match prefix rules against
899
+ * compound commands (e.g. `cd /path && gh pr list`). Claude Code
900
+ * routinely prepends `cd <cwd> &&` to commands, causing saved rules
901
+ * to never match on re-invocation. This function strips safe leading
902
+ * segments (only `cd` commands) and checks the remaining operation
903
+ * against saved rules.
904
+ *
905
+ * For compound commands, returns true only when all leading segments
906
+ * are `cd` commands and the final segment matches a saved rule.
907
+ * For simple (single-segment) commands, checks directly against saved
908
+ * rules — this covers the case where a rule was added mid-session and
909
+ * the SDK's in-memory cache is stale.
910
+ */
911
+ export function bashCommandMatchesSavedRules(command: string): boolean {
912
+ const segments = command.split(/\s*(?:&&|\|\||;)\s*/).filter(Boolean);
913
+ if (segments.length === 0) return false;
914
+
915
+ let meaningful: string;
916
+ if (segments.length === 1) {
917
+ meaningful = segments[0].trim();
918
+ } else {
919
+ // Strip trailing error suppressors (|| true, || :, || echo ...)
920
+ // and leading cd segments. The first remaining segment is the
921
+ // meaningful command. All other non-cd, non-suppressor segments
922
+ // must be absent — otherwise we can't safely auto-approve.
923
+ const SETUP_RE = /^cd\s/;
924
+ const SUPPRESSOR_RE = /^\s*(?:true|:|echo\b)/;
925
+ const trimmed = segments.filter(s => !SUPPRESSOR_RE.test(s.trim()));
926
+ const core = trimmed.filter(s => !SETUP_RE.test(s.trim()));
927
+ if (core.length !== 1) return false; // ambiguous — multiple real commands
928
+ meaningful = core[0].trim();
929
+ }
930
+ if (!meaningful) return false;
931
+
932
+ const rules = readBashAllowRulesFromSettings();
933
+ if (rules.length === 0) return false;
934
+
935
+ for (const rule of rules) {
936
+ const prefixMatch = /^(.+):\*$/.exec(rule);
937
+ if (prefixMatch) {
938
+ const prefix = prefixMatch[1];
939
+ if (meaningful === prefix || meaningful.startsWith(prefix + " ")) {
940
+ return true;
941
+ }
942
+ continue;
943
+ }
944
+ // Exact match
945
+ if (meaningful === rule) return true;
946
+ }
947
+
948
+ return false;
949
+ }
950
+
951
+ /** Format the tool input into a human-readable summary for the permission prompt. */
952
+ function formatToolInput(toolName: string, input: Record<string, unknown>): string {
953
+ // Bash — show the command
954
+ if (input.command && typeof input.command === "string") {
955
+ const cmd = input.command.length > 300 ? input.command.slice(0, 300) + "…" : input.command;
956
+ return cmd;
957
+ }
958
+ // File-oriented tools — show path
959
+ if (input.file_path && typeof input.file_path === "string") {
960
+ return `${toolName}: ${input.file_path}`;
961
+ }
962
+ // Generic fallback — compact JSON, truncated
963
+ const json = JSON.stringify(input);
964
+ if (json.length <= 200) return json;
965
+ return json.slice(0, 200) + "…";
966
+ }
967
+
968
+ /**
969
+ * Create a canUseTool handler that routes SDK permission requests through the
970
+ * extension UI's select dialog, or auto-approves when no UI is available.
971
+ *
972
+ * Presents three options:
973
+ * - **Allow** — approve this one invocation
974
+ * - **Always Allow** — approve and pass `suggestions` back as `updatedPermissions`
975
+ * so the SDK remembers the choice for the rest of the session
976
+ * - **Deny** — reject the invocation
977
+ *
978
+ * Follows the same pattern as {@link createClaudeCodeElicitationHandler}:
979
+ * takes an optional UI context and returns the callback or undefined.
980
+ *
981
+ * When UI is unavailable (headless / auto-mode sub-agents), returns a handler
982
+ * that always approves — replacing the old GSD_AUTO_MODE → bypassPermissions
983
+ * workaround.
984
+ */
985
+ export function createClaudeCodeCanUseToolHandler(
986
+ ui: ExtensionUIContext | undefined,
987
+ ): ((toolName: string, input: Record<string, unknown>, options: CanUseToolOptions) => Promise<CanUseToolPermissionResult>) | undefined {
988
+ if (!ui) return undefined;
989
+
990
+ return async (toolName, _input, options) => {
991
+ // Abort early if the signal is already fired
992
+ if (options.signal.aborted) {
993
+ return { behavior: "deny", message: "Aborted", toolUseID: options.toolUseID };
994
+ }
995
+
996
+ // For Bash compound commands (e.g. "cd /path && gh pr list"),
997
+ // check if the meaningful operation matches a saved allow rule.
998
+ // The SDK's built-in matcher rejects prefix rules for compound
999
+ // commands, but cd-prefixed commands are routine and the actual
1000
+ // operation is already approved.
1001
+ if (toolName === "Bash" && typeof _input.command === "string") {
1002
+ if (bashCommandMatchesSavedRules(_input.command)) {
1003
+ return { behavior: "allow", updatedInput: _input, toolUseID: options.toolUseID };
1004
+ }
1005
+ }
1006
+
1007
+ const inputSummary = formatToolInput(toolName, _input);
1008
+ const title = options.title || `Allow Claude Code to use: ${toolName}?`;
1009
+ const body = [
1010
+ options.description,
1011
+ inputSummary,
1012
+ ].filter(Boolean).join("\n");
1013
+
1014
+ // The 2nd menu (level picker) lets the user choose the exact pattern,
1015
+ // so the 1st menu just shows "Always Allow" without a command suffix.
1016
+ const alwaysAllowLabel = "Always Allow";
1017
+
1018
+ try {
1019
+ const choice = await ui.select(
1020
+ `${title}\n${body}`,
1021
+ ["Allow", alwaysAllowLabel, "Deny"],
1022
+ { signal: options.signal },
1023
+ );
1024
+
1025
+ if (options.signal.aborted) {
1026
+ return { behavior: "deny", message: "Aborted", toolUseID: options.toolUseID };
1027
+ }
1028
+
1029
+ if (choice === alwaysAllowLabel) {
1030
+ // Pass the SDK's own suggestions back as updatedPermissions so
1031
+ // it knows how to persist them (PermissionUpdate[] shape).
1032
+ // For Bash, patch the ruleContent with the user-chosen
1033
+ // granularity pattern (e.g. "gh", "gh pr", "gh pr list") so
1034
+ // the saved rule matches the scope the user actually wants.
1035
+ let perms = options.suggestions;
1036
+ let notifyLabel: string | undefined;
1037
+ if (toolName === "Bash" && typeof _input.command === "string") {
1038
+ // Present every meaningful prefix so the user picks the
1039
+ // scope explicitly rather than getting a blanket match.
1040
+ const patternOptions = buildBashPermissionPatternOptions(_input.command);
1041
+ let chosenPattern: string;
1042
+ if (patternOptions.length <= 1) {
1043
+ // No subcommand choice to make (e.g. "ls -la") — use
1044
+ // the single available pattern directly.
1045
+ chosenPattern = patternOptions[0] ?? buildBashPermissionPattern(_input.command);
1046
+ } else {
1047
+ const levelChoiceRaw = await ui.select(
1048
+ "Save permission at which level?",
1049
+ patternOptions,
1050
+ { signal: options.signal },
1051
+ );
1052
+ if (options.signal.aborted) {
1053
+ return { behavior: "deny", message: "Aborted", toolUseID: options.toolUseID };
1054
+ }
1055
+ const levelChoice = Array.isArray(levelChoiceRaw) ? levelChoiceRaw[0] : levelChoiceRaw;
1056
+ if (!levelChoice || !patternOptions.includes(levelChoice)) {
1057
+ // User dismissed the level picker — cancel the
1058
+ // tool use. Falling back to a one-time allow
1059
+ // here would leave the spawned agent running
1060
+ // with no clear signal that the user bailed.
1061
+ return {
1062
+ behavior: "deny",
1063
+ message: "User cancelled permission selection",
1064
+ toolUseID: options.toolUseID,
1065
+ };
1066
+ }
1067
+ chosenPattern = levelChoice;
1068
+ }
1069
+ notifyLabel = chosenPattern;
1070
+ // Extract the ruleContent portion from "Bash(gh pr list:*)" → "gh pr list:*"
1071
+ const ruleContent = chosenPattern.replace(/^Bash\(/, "").replace(/\)$/, "");
1072
+ if (perms && Array.isArray(perms) && perms.length > 0) {
1073
+ // Clone suggestions and patch ruleContent on any Bash addRules entry
1074
+ perms = perms.map((s: any) => {
1075
+ if (s.type === "addRules" && Array.isArray(s.rules)) {
1076
+ return {
1077
+ ...s,
1078
+ rules: s.rules.map((r: any) =>
1079
+ r.toolName === "Bash" ? { ...r, ruleContent } : r,
1080
+ ),
1081
+ };
1082
+ }
1083
+ return s;
1084
+ });
1085
+ } else {
1086
+ // No suggestions from SDK — build a proper PermissionUpdate
1087
+ perms = [{
1088
+ type: "addRules",
1089
+ rules: [{ toolName: "Bash", ruleContent }],
1090
+ behavior: "allow",
1091
+ destination: "localSettings",
1092
+ }];
1093
+ }
1094
+ }
1095
+ // Notify with the resolved pattern (label already previewed it)
1096
+ if (notifyLabel) {
1097
+ ui.notify(`Saved: ${notifyLabel}`, "info");
1098
+ }
1099
+ return {
1100
+ behavior: "allow",
1101
+ updatedInput: _input,
1102
+ toolUseID: options.toolUseID,
1103
+ ...(perms ? { updatedPermissions: perms } : {}),
1104
+ };
1105
+ }
1106
+
1107
+ if (choice === "Allow") {
1108
+ return {
1109
+ behavior: "allow",
1110
+ updatedInput: _input,
1111
+ toolUseID: options.toolUseID,
1112
+ };
1113
+ }
1114
+
1115
+ return { behavior: "deny", message: "User denied", toolUseID: options.toolUseID };
1116
+ } catch {
1117
+ return { behavior: "deny", message: "Aborted", toolUseID: options.toolUseID };
1118
+ }
1119
+ };
1120
+ }
1121
+
1122
+ // ---------------------------------------------------------------------------
1123
+ // Elicitation handler
1124
+ // ---------------------------------------------------------------------------
1125
+
634
1126
  /** Create an SDK elicitation handler that routes requests through the extension UI dialogs, or undefined if no UI is available. */
635
1127
  export function createClaudeCodeElicitationHandler(
636
1128
  ui: ExtensionUIContext | undefined,
@@ -702,6 +1194,12 @@ export function makeAbortedMessage(model: string, lastTextContent: string): Assi
702
1194
  * Set `GSD_CLAUDE_CODE_PERMISSION_MODE` to `bypassPermissions` to restore
703
1195
  * the old always-approve behaviour, or to `default` / `plan` for stricter
704
1196
  * modes.
1197
+ *
1198
+ * When `GSD_HEADLESS=1` is set (auto-mode / non-interactive runs), the
1199
+ * default flips to `bypassPermissions` because there is no UI to approve
1200
+ * permission dialogs — `acceptEdits` would hang verification commands like
1201
+ * `npx tsc --noEmit` or `npx vitest run` indefinitely (#4657). Explicit
1202
+ * overrides still win, so users can opt back into `acceptEdits` in headless.
705
1203
  */
706
1204
  export async function resolveClaudePermissionMode(
707
1205
  env: NodeJS.ProcessEnv = process.env,
@@ -710,7 +1208,13 @@ export async function resolveClaudePermissionMode(
710
1208
  if (override === "bypassPermissions" || override === "acceptEdits" || override === "default" || override === "plan") {
711
1209
  return override;
712
1210
  }
713
- return "acceptEdits";
1211
+ if (env.GSD_HEADLESS === "1") {
1212
+ console.warn(
1213
+ "[claude-code-cli] Headless mode detected (GSD_HEADLESS=1): defaulting permissionMode to 'bypassPermissions' so verification Bash commands can run. Set GSD_CLAUDE_CODE_PERMISSION_MODE=acceptEdits to opt out.",
1214
+ );
1215
+ return "bypassPermissions";
1216
+ }
1217
+ return "bypassPermissions";
714
1218
  }
715
1219
 
716
1220
  // NOTE: These helpers intentionally mirror @gsd/pi-ai anthropic-shared
@@ -770,21 +1274,25 @@ export function buildSdkOptions(
770
1274
  ): Record<string, unknown> {
771
1275
  const { reasoning, ...sdkExtraOptions } = extraOptions;
772
1276
  const mcpServers = buildWorkflowMcpServers();
773
- const permissionMode = overrides?.permissionMode ?? "acceptEdits";
774
- const disallowedTools = ["AskUserQuestion"];
775
- // Pre-authorize the safe built-ins and every registered workflow MCP
776
- // server's tools. `acceptEdits` mode (the interactive default) only
777
- // auto-approves file edits Read/Glob/Grep, basic shell inspection, and
778
- // every `mcp__gsd-workflow__*` call still surface as "This command
779
- // requires approval" and block GSD actions (#4099).
1277
+ const permissionMode = overrides?.permissionMode ?? "bypassPermissions";
1278
+ // Globally unblock all tools. Users reported that the `acceptEdits` default
1279
+ // plus a narrow allowlist silently declined most Bash/Agent/WebFetch calls
1280
+ // when `extensionUIContext` wasn't threaded through. Default to
1281
+ // bypassPermissions and an empty disallow list so every tool — including
1282
+ // `AskUserQuestion` and every `mcp__*` workflow tool is auto-approved.
1283
+ // Opt back into gated mode with GSD_CLAUDE_CODE_PERMISSION_MODE=acceptEdits.
1284
+ const disallowedTools: string[] = [];
780
1285
  const allowedTools = [
781
1286
  "Read",
782
1287
  "Write",
783
1288
  "Edit",
784
1289
  "Glob",
785
1290
  "Grep",
786
- "Bash(ls:*)",
787
- "Bash(pwd)",
1291
+ "Bash",
1292
+ "Agent",
1293
+ "WebFetch",
1294
+ "WebSearch",
1295
+ "AskUserQuestion",
788
1296
  ...(mcpServers ? Object.keys(mcpServers).map((serverName) => `mcp__${serverName}__*`) : []),
789
1297
  ];
790
1298
  const supportsAdaptive = modelSupportsAdaptiveThinking(modelId);
@@ -992,6 +1500,49 @@ function attachExternalResultsToToolBlocks(
992
1500
  }
993
1501
  }
994
1502
 
1503
+ /**
1504
+ * Build the final assistant content that Agent Core consumes in
1505
+ * `externalToolExecution` mode. This preserves tool-call blocks, attaches any
1506
+ * SDK-produced external results by tool-call id, and then appends the final
1507
+ * text/thinking blocks for the completed turn.
1508
+ */
1509
+ export function buildFinalAssistantContent(params: {
1510
+ intermediateToolBlocks: AssistantMessage["content"];
1511
+ pendingContent?: AssistantMessage["content"];
1512
+ toolResultsById: ReadonlyMap<string, ExternalToolResultPayload>;
1513
+ lastThinkingContent?: string;
1514
+ lastTextContent?: string;
1515
+ fallbackResultText?: string;
1516
+ }): AssistantMessage["content"] {
1517
+ const mergedToolBlocks = [...params.intermediateToolBlocks];
1518
+ if (params.pendingContent) {
1519
+ mergePendingToolCalls(mergedToolBlocks, params.pendingContent);
1520
+ }
1521
+ attachExternalResultsToToolBlocks(mergedToolBlocks, params.toolResultsById);
1522
+
1523
+ const finalContent: AssistantMessage["content"] = [...mergedToolBlocks];
1524
+ if (params.pendingContent && params.pendingContent.length > 0) {
1525
+ for (const block of params.pendingContent) {
1526
+ if (block.type === "text" || block.type === "thinking") {
1527
+ finalContent.push(block);
1528
+ }
1529
+ }
1530
+ } else {
1531
+ if (params.lastThinkingContent) {
1532
+ finalContent.push({ type: "thinking", thinking: params.lastThinkingContent });
1533
+ }
1534
+ if (params.lastTextContent) {
1535
+ finalContent.push({ type: "text", text: params.lastTextContent });
1536
+ }
1537
+ }
1538
+
1539
+ if (finalContent.length === 0 && params.fallbackResultText) {
1540
+ finalContent.push({ type: "text", text: params.fallbackResultText });
1541
+ }
1542
+
1543
+ return finalContent;
1544
+ }
1545
+
995
1546
  /**
996
1547
  * Merge tool-call blocks from the active partial-message builder into the
997
1548
  * running list of intermediate tool calls, preserving order and de-duping
@@ -1023,8 +1574,9 @@ export function mergePendingToolCalls(
1023
1574
  * GSD streamSimple function that delegates to the Claude Agent SDK.
1024
1575
  *
1025
1576
  * Emits AssistantMessageEvent deltas for real-time TUI rendering
1026
- * (thinking, text, tool calls). The final AssistantMessage has tool-call
1027
- * blocks stripped so the agent loop ends the turn without local dispatch.
1577
+ * (thinking, text, tool calls). The final AssistantMessage preserves
1578
+ * SDK-executed tool-call blocks for Agent Core's `externalToolExecution`
1579
+ * path, which renders the results without dispatching the tools locally.
1028
1580
  */
1029
1581
  export function streamViaClaudeCode(
1030
1582
  model: Model<any>,
@@ -1074,18 +1626,26 @@ async function pumpSdkMessages(
1074
1626
  const prompt = buildPromptFromContext(context);
1075
1627
  const queryPrompt = buildSdkQueryPrompt(context, prompt);
1076
1628
  const permissionMode = await resolveClaudePermissionMode();
1629
+ const uiContext = (options as ClaudeCodeStreamOptions | undefined)?.extensionUIContext;
1630
+ const canUseToolHandler = createClaudeCodeCanUseToolHandler(uiContext);
1631
+ // When no UI is available (headless / auto-mode), auto-approve all
1632
+ // tool requests. This replaces the old bypassPermissions workaround.
1633
+ const canUseToolFallback = canUseToolHandler
1634
+ ?? (async (_toolName: string, _input: Record<string, unknown>, opts: CanUseToolOptions): Promise<CanUseToolPermissionResult> =>
1635
+ ({ behavior: "allow", toolUseID: opts.toolUseID }));
1077
1636
  const sdkOpts = buildSdkOptions(
1078
1637
  modelId,
1079
1638
  prompt,
1080
1639
  { permissionMode },
1081
- typeof (options as ClaudeCodeStreamOptions | undefined)?.extensionUIContext === "object"
1082
- ? {
1083
- reasoning: options?.reasoning,
1084
- onElicitation: createClaudeCodeElicitationHandler(
1085
- (options as ClaudeCodeStreamOptions | undefined)?.extensionUIContext,
1086
- ),
1087
- }
1088
- : { reasoning: options?.reasoning },
1640
+ {
1641
+ reasoning: options?.reasoning,
1642
+ canUseTool: canUseToolFallback,
1643
+ ...(uiContext
1644
+ ? {
1645
+ onElicitation: createClaudeCodeElicitationHandler(uiContext),
1646
+ }
1647
+ : {}),
1648
+ },
1089
1649
  );
1090
1650
 
1091
1651
  const queryResult = sdk.query({
@@ -1225,46 +1785,15 @@ async function pumpSdkMessages(
1225
1785
  // -- Result (terminal) --
1226
1786
  case "result": {
1227
1787
  const result = msg as SDKResultMessage;
1228
-
1229
- // Build final message. Include intermediate tool calls so the
1230
- // agent loop's externalToolExecution path emits tool_execution
1231
- // events for proper TUI rendering, followed by the text response.
1232
- const finalContent: AssistantMessage["content"] = [];
1233
-
1234
- // If the final turn ended without a synthetic user message
1235
- // (e.g. stop_reason: "tool_use" followed directly by result,
1236
- // or a turn with text but no tool execution), the `builder`
1237
- // still holds toolCall blocks that were never pushed into
1238
- // `intermediateToolBlocks`. Fold them in here so they aren't
1239
- // dropped from the final AssistantMessage.
1240
- if (builder) {
1241
- mergePendingToolCalls(intermediateToolBlocks, builder.message.content);
1242
- }
1243
-
1244
- // Add tool calls from intermediate turns first (renders above text)
1245
- attachExternalResultsToToolBlocks(intermediateToolBlocks, toolResultsById);
1246
- finalContent.push(...intermediateToolBlocks);
1247
-
1248
- // Add text/thinking from the last turn
1249
- if (builder && builder.message.content.length > 0) {
1250
- for (const block of builder.message.content) {
1251
- if (block.type === "text" || block.type === "thinking") {
1252
- finalContent.push(block);
1253
- }
1254
- }
1255
- } else {
1256
- if (lastThinkingContent) {
1257
- finalContent.push({ type: "thinking", thinking: lastThinkingContent });
1258
- }
1259
- if (lastTextContent) {
1260
- finalContent.push({ type: "text", text: lastTextContent });
1261
- }
1262
- }
1263
-
1264
- // Fallback: use the SDK's result text if we have no content
1265
- if (finalContent.length === 0 && result.subtype === "success" && result.result) {
1266
- finalContent.push({ type: "text", text: result.result });
1267
- }
1788
+ const finalContent = buildFinalAssistantContent({
1789
+ intermediateToolBlocks,
1790
+ pendingContent: builder?.message.content,
1791
+ toolResultsById,
1792
+ lastThinkingContent,
1793
+ lastTextContent,
1794
+ fallbackResultText:
1795
+ result.subtype === "success" && result.result ? result.result : undefined,
1796
+ });
1268
1797
 
1269
1798
  const finalMessage: AssistantMessage = {
1270
1799
  role: "assistant",