gsd-pi 2.76.0 → 2.77.0-dev.1594b263e

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