gsd-pi 2.80.0-dev.8b3a59f5c → 2.80.0-dev.b0acf17e9

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 (659) hide show
  1. package/README.md +4 -2
  2. package/dist/claude-cli-check.d.ts +30 -0
  3. package/dist/claude-cli-check.js +18 -7
  4. package/dist/cli.js +0 -19
  5. package/dist/headless-query.d.ts +10 -0
  6. package/dist/headless-query.js +6 -4
  7. package/dist/loader-entrypoint.d.ts +8 -0
  8. package/dist/loader-entrypoint.js +27 -0
  9. package/dist/loader.js +2 -11
  10. package/dist/mcp-server.d.ts +1 -0
  11. package/dist/mcp-server.js +6 -3
  12. package/dist/resources/.managed-resources-content-hash +1 -1
  13. package/dist/resources/GSD-WORKFLOW.md +2 -2
  14. package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
  15. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +29 -0
  16. package/dist/resources/extensions/github-sync/sync.js +4 -1
  17. package/dist/resources/extensions/gsd/auto/loop.js +103 -9
  18. package/dist/resources/extensions/gsd/auto/phases.js +240 -139
  19. package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
  20. package/dist/resources/extensions/gsd/auto/run-unit.js +22 -30
  21. package/dist/resources/extensions/gsd/auto/session.js +8 -0
  22. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
  23. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
  24. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
  25. package/dist/resources/extensions/gsd/auto-dispatch.js +26 -0
  26. package/dist/resources/extensions/gsd/auto-post-unit.js +103 -86
  27. package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
  28. package/dist/resources/extensions/gsd/auto-recovery.js +43 -1
  29. package/dist/resources/extensions/gsd/auto-start.js +240 -15
  30. package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
  31. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
  32. package/dist/resources/extensions/gsd/auto-worktree.js +165 -28
  33. package/dist/resources/extensions/gsd/auto.js +165 -45
  34. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +99 -10
  35. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +50 -37
  36. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +35 -10
  37. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +36 -20
  38. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +10 -1
  39. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +12 -4
  40. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +11 -3
  41. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  42. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +319 -54
  43. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  44. package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
  45. package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
  46. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  47. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  48. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  49. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  50. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  51. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  52. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  53. package/dist/resources/extensions/gsd/db-base-schema.js +4 -2
  54. package/dist/resources/extensions/gsd/db-migration-steps.js +6 -0
  55. package/dist/resources/extensions/gsd/detection.js +106 -0
  56. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  57. package/dist/resources/extensions/gsd/git-service.js +73 -5
  58. package/dist/resources/extensions/gsd/gsd-db.js +46 -13
  59. package/dist/resources/extensions/gsd/guided-flow.js +143 -48
  60. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  61. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  62. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  63. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  64. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  65. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  66. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  67. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  68. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  69. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  70. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +21 -19
  71. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  72. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  73. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  74. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  75. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  76. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  77. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  78. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  79. package/dist/resources/extensions/gsd/quick.js +34 -2
  80. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  81. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  82. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  83. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  84. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  85. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  86. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  87. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  88. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  89. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  90. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  91. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  92. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  93. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  94. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  95. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  96. package/dist/resources/extensions/gsd/worktree-resolver.js +90 -22
  97. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  98. package/dist/web/standalone/.next/BUILD_ID +1 -1
  99. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  100. package/dist/web/standalone/.next/build-manifest.json +3 -3
  101. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  102. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  103. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  105. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/index.html +1 -1
  122. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  123. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  124. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  125. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  130. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/middleware.js +3 -3
  133. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  134. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  135. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  136. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  137. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  138. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  139. package/dist/welcome-screen.d.ts +2 -0
  140. package/dist/welcome-screen.js +9 -7
  141. package/package.json +6 -4
  142. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  143. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  144. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  145. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  146. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  147. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  148. package/packages/native/tsconfig.tsbuildinfo +1 -1
  149. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  150. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  151. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  152. package/packages/pi-agent-core/dist/agent.d.ts +5 -0
  153. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  154. package/packages/pi-agent-core/dist/agent.js +2 -0
  155. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  156. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  157. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  158. package/packages/pi-agent-core/dist/index.js +2 -0
  159. package/packages/pi-agent-core/dist/index.js.map +1 -1
  160. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  161. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  162. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  163. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  164. package/packages/pi-agent-core/dist/types.d.ts +9 -0
  165. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  166. package/packages/pi-agent-core/dist/types.js.map +1 -1
  167. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  168. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  169. package/packages/pi-agent-core/src/agent.ts +8 -0
  170. package/packages/pi-agent-core/src/index.ts +2 -0
  171. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  172. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  173. package/packages/pi-agent-core/src/types.ts +14 -0
  174. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  175. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  176. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  177. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  178. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  179. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  180. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  181. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  182. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  183. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  184. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  185. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  186. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  187. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  188. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  189. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  190. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  191. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  192. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  193. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  194. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  195. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  196. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  197. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  198. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  199. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +32 -0
  200. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  201. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +18 -0
  202. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  203. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +12 -0
  204. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  205. package/packages/pi-coding-agent/dist/core/agent-session.js +44 -7
  206. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  207. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +35 -1
  208. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  209. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  210. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  211. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  212. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  213. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  214. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  215. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  216. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  217. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  218. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  219. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  220. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  221. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  222. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  223. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  224. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  225. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  226. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  227. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  228. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -0
  229. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  230. package/packages/pi-coding-agent/dist/core/extensions/runner.js +20 -7
  231. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  232. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +102 -3
  233. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  234. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +41 -3
  235. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  236. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  237. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  238. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  239. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  240. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  241. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  242. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  243. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  244. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  245. package/packages/pi-coding-agent/dist/core/sdk.js +74 -2
  246. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  247. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  248. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  249. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  250. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  251. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  252. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  253. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  254. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  255. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  256. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  257. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  258. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  260. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  262. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  264. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  266. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  268. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  270. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  272. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  273. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  274. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  275. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  276. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  277. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  278. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  280. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  281. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  282. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  284. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  286. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  288. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  289. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  290. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  291. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  292. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  294. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  295. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  296. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  297. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  298. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  299. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  300. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  301. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  302. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  304. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  305. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
  306. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  307. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +114 -22
  308. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  309. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +2 -2
  310. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  311. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  312. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  313. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  314. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +2 -1
  315. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  316. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +7 -6
  317. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +6 -0
  319. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  320. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +177 -19
  321. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  323. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +33 -6
  324. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  325. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
  326. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  328. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +3 -0
  329. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
  332. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +21 -0
  334. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  336. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  337. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  338. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  339. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  340. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  341. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  342. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +36 -0
  343. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +25 -0
  344. package/packages/pi-coding-agent/src/core/agent-session.ts +48 -7
  345. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +41 -1
  346. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  347. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  348. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  349. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  350. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  351. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +113 -3
  352. package/packages/pi-coding-agent/src/core/extensions/runner.ts +24 -6
  353. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -2
  354. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  355. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  356. package/packages/pi-coding-agent/src/core/sdk.ts +85 -3
  357. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
  358. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  359. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  360. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  361. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  362. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  363. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  364. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  365. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  366. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  367. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  368. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  369. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  370. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  371. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  372. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  373. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
  374. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +144 -22
  375. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +2 -2
  376. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
  377. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +2 -1
  378. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +10 -9
  379. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +208 -19
  380. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
  381. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +41 -8
  382. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +3 -0
  383. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
  384. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +25 -0
  385. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  386. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  387. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  388. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  389. package/packages/pi-tui/dist/tui.js +18 -8
  390. package/packages/pi-tui/dist/tui.js.map +1 -1
  391. package/packages/pi-tui/src/tui.ts +20 -8
  392. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  393. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  394. package/pkg/dist/modes/interactive/theme/themes.js +36 -27
  395. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  396. package/src/resources/GSD-WORKFLOW.md +2 -2
  397. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  398. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +30 -0
  399. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +26 -0
  400. package/src/resources/extensions/github-sync/sync.ts +8 -1
  401. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  402. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -2
  403. package/src/resources/extensions/gsd/auto/loop.ts +134 -16
  404. package/src/resources/extensions/gsd/auto/phases.ts +328 -200
  405. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  406. package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
  407. package/src/resources/extensions/gsd/auto/session.ts +8 -0
  408. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  409. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  410. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  411. package/src/resources/extensions/gsd/auto-dispatch.ts +33 -0
  412. package/src/resources/extensions/gsd/auto-post-unit.ts +116 -88
  413. package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
  414. package/src/resources/extensions/gsd/auto-recovery.ts +54 -0
  415. package/src/resources/extensions/gsd/auto-start.ts +293 -21
  416. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  417. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  418. package/src/resources/extensions/gsd/auto-worktree.ts +199 -30
  419. package/src/resources/extensions/gsd/auto.ts +216 -40
  420. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +120 -8
  421. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +51 -37
  422. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +35 -10
  423. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +38 -19
  424. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +11 -1
  425. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +13 -4
  426. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +12 -3
  427. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  428. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +369 -54
  429. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  430. package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
  431. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  432. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  433. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  434. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  435. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  436. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  437. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  438. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  439. package/src/resources/extensions/gsd/db-base-schema.ts +4 -2
  440. package/src/resources/extensions/gsd/db-migration-steps.ts +8 -0
  441. package/src/resources/extensions/gsd/detection.ts +128 -0
  442. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  443. package/src/resources/extensions/gsd/git-service.ts +87 -10
  444. package/src/resources/extensions/gsd/gsd-db.ts +50 -13
  445. package/src/resources/extensions/gsd/guided-flow.ts +169 -55
  446. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  447. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  448. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  449. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  450. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  451. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  452. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  453. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  454. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  455. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  456. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  457. package/src/resources/extensions/gsd/prompts/complete-milestone.md +21 -19
  458. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  459. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  460. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  461. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  462. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  463. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  464. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  465. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  466. package/src/resources/extensions/gsd/quick.ts +37 -2
  467. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  468. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  469. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  470. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  471. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  472. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  473. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  474. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +433 -11
  475. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  476. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  477. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  478. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +160 -11
  479. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  480. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  481. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +14 -1
  482. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  483. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  484. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  485. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  486. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  487. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +138 -0
  488. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  489. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  490. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  491. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  492. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  493. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  494. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  495. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
  496. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  497. package/src/resources/extensions/gsd/tests/cmux.test.ts +42 -53
  498. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  499. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  500. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  501. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  502. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  503. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  504. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  505. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  506. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  507. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  508. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  509. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +5 -1
  510. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  511. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  512. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +4 -9
  513. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  514. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  515. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  516. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  517. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  518. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  519. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  520. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  521. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  522. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  523. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  524. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  525. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  526. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
  527. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  528. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  529. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
  530. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  531. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +35 -0
  532. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  533. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
  534. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  535. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  536. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  537. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +239 -1
  538. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  539. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  540. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  541. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  542. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  543. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
  544. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  545. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  546. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
  547. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +79 -98
  548. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  549. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  550. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  551. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  552. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
  553. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
  554. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  555. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  556. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  557. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  558. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +91 -75
  559. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  560. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  561. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  562. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  563. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  564. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  565. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  566. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  567. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  568. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  569. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  570. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  571. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  572. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  573. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  574. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  575. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  576. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  577. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  578. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  579. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  580. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  581. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  582. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  583. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  584. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  585. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  586. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  587. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  588. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  589. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  590. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
  591. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  592. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  593. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  594. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  595. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  596. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  597. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  598. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  599. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -59
  600. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  601. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  602. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  603. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  604. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  605. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  606. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +101 -2
  607. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
  608. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  609. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +36 -45
  610. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  611. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  612. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  613. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  614. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  615. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  616. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  617. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  618. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  619. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  620. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  621. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  622. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  623. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  624. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  625. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  626. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  627. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  628. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  629. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  630. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  631. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  632. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  633. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +38 -6
  634. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
  635. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  636. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  637. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  638. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  639. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  640. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +203 -4
  641. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  642. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  643. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  644. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  645. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  646. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  647. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  648. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  649. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  650. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  651. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  652. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  653. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  654. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  655. package/src/resources/extensions/gsd/worktree-resolver.ts +119 -20
  656. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  657. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  658. /package/dist/web/standalone/.next/static/{k-MDjzPMF62Rg1-FR437h → naNyn5ToUBzCQtuLbEYXC}/_buildManifest.js +0 -0
  659. /package/dist/web/standalone/.next/static/{k-MDjzPMF62Rg1-FR437h → naNyn5ToUBzCQtuLbEYXC}/_ssgManifest.js +0 -0
@@ -69,6 +69,7 @@ import type {
69
69
  LsToolInput,
70
70
  ReadToolDetails,
71
71
  ReadToolInput,
72
+ WriteToolDetails,
72
73
  WriteToolInput,
73
74
  } from "../tools/index.js";
74
75
 
@@ -289,6 +290,12 @@ export interface ExtensionContext {
289
290
  compact(options?: CompactOptions): void;
290
291
  /** Get the current effective system prompt. */
291
292
  getSystemPrompt(): string;
293
+ /**
294
+ * Set or clear an in-memory compaction threshold-percent override (0 < value < 1).
295
+ * Pass `undefined` to clear. The override is not persisted; host integrations
296
+ * are expected to re-apply on each session_start.
297
+ */
298
+ setCompactionThresholdOverride(percent: number | undefined): void;
292
299
  }
293
300
 
294
301
  /**
@@ -303,10 +310,13 @@ export interface ExtensionCommandContext extends ExtensionContext {
303
310
  newSession(options?: {
304
311
  parentSession?: string;
305
312
  setup?: (sessionManager: SessionManager) => Promise<void>;
313
+ /** Explicit workspace root for the new session/tool runtime.
314
+ * When omitted, newSession() captures process.cwd() for backwards compatibility. */
315
+ workspaceRoot?: string;
306
316
  /** When aborted before the session is fully configured, newSession() returns
307
317
  * early without rebuilding the tool runtime. Used by runUnit() to discard
308
318
  * a late-resolving newSession() after the session-creation timeout fires,
309
- * preventing the tool runtime from being rebuilt with the wrong cwd (#3731). */
319
+ * preventing the tool runtime from being rebuilt with a stale workspace root (#3731). */
310
320
  abortSignal?: AbortSignal;
311
321
  }): Promise<{ cancelled: boolean }>;
312
322
 
@@ -842,6 +852,13 @@ export interface BeforeModelSelectResult {
842
852
  modelId: string;
843
853
  }
844
854
 
855
+ export interface AdjustToolSetRequestCustomMessage {
856
+ /** Index in the post-transform AgentMessage context. */
857
+ index: number;
858
+ /** Custom message type only; prompt/content text is intentionally omitted. */
859
+ customType: string;
860
+ }
861
+
845
862
  /**
846
863
  * Fired after model selection to allow extensions to adjust the active tool set (ADR-005 Phase 4).
847
864
  * Extensions can add, remove, or reorder tools based on the selected model's provider capabilities.
@@ -858,6 +875,12 @@ export interface AdjustToolSetEvent {
858
875
  activeToolNames: string[];
859
876
  /** Tools already filtered by provider compatibility */
860
877
  filteredTools: string[];
878
+ /**
879
+ * Custom message metadata in the current request tail, measured from the
880
+ * latest assistant message. This is metadata-only so extensions can scope
881
+ * queued custom-message turns without seeing raw prompt content.
882
+ */
883
+ requestCustomMessages?: AdjustToolSetRequestCustomMessage[];
861
884
  }
862
885
 
863
886
  /** Result from adjust_tool_set event handler. Return { toolNames } to override tool set. */
@@ -1009,7 +1032,7 @@ export interface EditToolResultEvent extends ToolResultEventBase {
1009
1032
 
1010
1033
  export interface WriteToolResultEvent extends ToolResultEventBase {
1011
1034
  toolName: "write";
1012
- details: undefined;
1035
+ details: WriteToolDetails | undefined;
1013
1036
  }
1014
1037
 
1015
1038
  export interface GrepToolResultEvent extends ToolResultEventBase {
@@ -1480,6 +1503,20 @@ export interface ExtensionAPI {
1480
1503
  /** Set the active tools by name. */
1481
1504
  setActiveTools(toolNames: string[]): void;
1482
1505
 
1506
+ /**
1507
+ * Get the prompt-only skill catalog filter, if one is active.
1508
+ * Undefined means all loaded skills remain visible in <available_skills>.
1509
+ */
1510
+ getVisibleSkills(): string[] | undefined;
1511
+
1512
+ /**
1513
+ * Set or clear the prompt-only skill catalog filter.
1514
+ *
1515
+ * This changes which loaded skills are advertised in <available_skills>;
1516
+ * it does not unload skills or disable the Skill tool.
1517
+ */
1518
+ setVisibleSkills(skillNames: string[] | undefined): void;
1519
+
1483
1520
  /** Get available slash commands in the current session. */
1484
1521
  getCommands(): SlashCommandInfo[];
1485
1522
 
@@ -1721,6 +1758,8 @@ export interface ExtensionActions {
1721
1758
  getActiveTools: () => string[];
1722
1759
  getAllTools: () => ToolInfo[];
1723
1760
  setActiveTools: (toolNames: string[]) => void;
1761
+ getVisibleSkills: () => string[] | undefined;
1762
+ setVisibleSkills: (skillNames: string[] | undefined) => void;
1724
1763
  refreshTools: () => void;
1725
1764
  getCommands: () => SlashCommandInfo[];
1726
1765
  setModel: (model: Model<any>, options?: { persist?: boolean }) => Promise<boolean>;
@@ -1741,6 +1780,7 @@ export interface ExtensionContextActions {
1741
1780
  getContextUsage: () => ContextUsage | undefined;
1742
1781
  compact: (options?: CompactOptions) => void;
1743
1782
  getSystemPrompt: () => string;
1783
+ setCompactionThresholdOverride: (percent: number | undefined) => void;
1744
1784
  }
1745
1785
 
1746
1786
  /**
@@ -1752,6 +1792,8 @@ export interface ExtensionCommandContextActions {
1752
1792
  newSession: (options?: {
1753
1793
  parentSession?: string;
1754
1794
  setup?: (sessionManager: SessionManager) => Promise<void>;
1795
+ /** See ExtensionCommandContext.newSession for docs. */
1796
+ workspaceRoot?: string;
1755
1797
  /** See ExtensionCommandContext.newSession for docs (#3731). */
1756
1798
  abortSignal?: AbortSignal;
1757
1799
  }) => Promise<{ cancelled: boolean }>;
@@ -38,6 +38,8 @@ function stubRuntime(): ExtensionRuntime {
38
38
  getActiveTools: () => [],
39
39
  getAllTools: () => [],
40
40
  setActiveTools: () => {},
41
+ getVisibleSkills: () => undefined,
42
+ setVisibleSkills: () => {},
41
43
  refreshTools: () => {},
42
44
  getCommands: () => [],
43
45
  setModel: async () => false,
@@ -0,0 +1,60 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Tests final provider request-time tool compatibility filtering.
3
+
4
+ import assert from "node:assert/strict";
5
+ import test from "node:test";
6
+ import { Type } from "@sinclair/typebox";
7
+ import type { AgentTool } from "@gsd/pi-agent-core";
8
+ import { filterToolsForProviderRequest, getAdjustToolSetRequestCustomMessages } from "./sdk.js";
9
+ import { registerToolCompatibility, resetToolCompatibilityRegistry } from "./tools/tool-compatibility-registry.js";
10
+
11
+ function tool(name: string): AgentTool {
12
+ return {
13
+ name,
14
+ label: name,
15
+ description: name,
16
+ parameters: Type.Object({}),
17
+ execute: async () => ({ content: [], details: undefined }),
18
+ };
19
+ }
20
+
21
+ test("filterToolsForProviderRequest removes provider-incompatible tools", () => {
22
+ resetToolCompatibilityRegistry();
23
+ try {
24
+ registerToolCompatibility("image_result_tool", { producesImages: true });
25
+ registerToolCompatibility("complex_schema_tool", { schemaFeatures: ["patternProperties"] });
26
+
27
+ const result = filterToolsForProviderRequest(
28
+ [tool("bash"), tool("image_result_tool"), tool("complex_schema_tool")],
29
+ { api: "google-generative-ai", provider: "google" },
30
+ );
31
+
32
+ assert.deepEqual(result.compatible.map((entry) => entry.name), ["bash", "image_result_tool"]);
33
+ assert.deepEqual(result.filtered.map((entry) => entry.name), ["complex_schema_tool"]);
34
+ } finally {
35
+ resetToolCompatibilityRegistry();
36
+ }
37
+ });
38
+
39
+ test("filterToolsForProviderRequest enforces provider-specific hard caps at send time", () => {
40
+ const result = filterToolsForProviderRequest(
41
+ Array.from({ length: 130 }, (_, index) => tool(`tool_${index}`)),
42
+ { api: "openai-completions", provider: "groq" },
43
+ );
44
+
45
+ assert.equal(result.compatible.length, 128);
46
+ assert.deepEqual(result.filtered.map((entry) => entry.name), ["tool_128", "tool_129"]);
47
+ });
48
+
49
+ test("getAdjustToolSetRequestCustomMessages only reports custom messages in the current request tail", () => {
50
+ const messages = [
51
+ { role: "custom", customType: "gsd-run", content: "old workflow", display: false, timestamp: 1 },
52
+ { role: "assistant", content: [{ type: "text", text: "done" }], timestamp: 2 },
53
+ { role: "user", content: [{ type: "text", text: "normal prompt" }], timestamp: 3 },
54
+ { role: "custom", customType: "gsd-doctor-heal", content: "current workflow", display: false, timestamp: 4 },
55
+ ] as any[];
56
+
57
+ assert.deepEqual(getAdjustToolSetRequestCustomMessages(messages), [
58
+ { index: 3, customType: "gsd-doctor-heal" },
59
+ ]);
60
+ });
@@ -38,8 +38,53 @@ export function canRestoreSessionModel(
38
38
  ): boolean {
39
39
  return modelRegistry.isProviderRequestReady(model.provider);
40
40
  }
41
- import { Agent, type AgentMessage, type ThinkingLevel } from "@gsd/pi-agent-core";
42
- import type { Message, Model } from "@gsd/pi-ai";
41
+
42
+ const PROVIDER_TOOL_LIMITS: Record<string, number> = {
43
+ groq: 128,
44
+ };
45
+
46
+ function resolveProviderToolLimit(
47
+ providerCaps: ReturnType<typeof getProviderCapabilities>,
48
+ provider: string | undefined,
49
+ ): number {
50
+ if (provider && PROVIDER_TOOL_LIMITS[provider]) {
51
+ return PROVIDER_TOOL_LIMITS[provider];
52
+ }
53
+ return providerCaps.maxTools > 0 ? providerCaps.maxTools : 0;
54
+ }
55
+
56
+ export function filterToolsForProviderRequest(
57
+ tools: AgentTool[],
58
+ model: Pick<Model<any>, "api" | "provider">,
59
+ ): { compatible: AgentTool[]; filtered: AgentTool[] } {
60
+ const providerCaps = getProviderCapabilities(model.api);
61
+ if (!providerCaps.toolCalling) {
62
+ return { compatible: [], filtered: tools };
63
+ }
64
+
65
+ const compatible: AgentTool[] = [];
66
+ const filtered: AgentTool[] = [];
67
+ for (const tool of tools) {
68
+ const compat = getToolCompatibility(tool.name);
69
+ if (
70
+ (compat?.producesImages && !providerCaps.imageToolResults) ||
71
+ compat?.schemaFeatures?.some((feature) => providerCaps.unsupportedSchemaFeatures.includes(feature))
72
+ ) {
73
+ filtered.push(tool);
74
+ } else {
75
+ compatible.push(tool);
76
+ }
77
+ }
78
+
79
+ const toolLimit = resolveProviderToolLimit(providerCaps, model.provider);
80
+ if (toolLimit > 0 && compatible.length > toolLimit) {
81
+ filtered.push(...compatible.splice(toolLimit));
82
+ }
83
+
84
+ return { compatible, filtered };
85
+ }
86
+ import { Agent, maybeLogProviderPayloadAudit, type AgentMessage, type AgentTool, type ThinkingLevel } from "@gsd/pi-agent-core";
87
+ import { getProviderCapabilities, type Message, type Model } from "@gsd/pi-ai";
43
88
  import { getAgentDir, getDocsPath } from "../config.js";
44
89
  import { AgentSession } from "./agent-session.js";
45
90
  import { AuthStorage } from "./auth-storage.js";
@@ -82,6 +127,22 @@ import {
82
127
  type ToolName,
83
128
  writeTool,
84
129
  } from "./tools/index.js";
130
+ import { getToolCompatibility } from "./tools/tool-compatibility-registry.js";
131
+
132
+ export function getAdjustToolSetRequestCustomMessages(
133
+ messages: readonly AgentMessage[] | undefined,
134
+ ): Array<{ index: number; customType: string }> {
135
+ if (!messages) return [];
136
+ const requestMessages: Array<{ index: number; customType: string }> = [];
137
+ for (let index = messages.length - 1; index >= 0; index--) {
138
+ const message = messages[index] as { role?: unknown; customType?: unknown };
139
+ if (message?.role === "assistant") break;
140
+ if (message?.role === "custom" && typeof message.customType === "string") {
141
+ requestMessages.push({ index, customType: message.customType });
142
+ }
143
+ }
144
+ return requestMessages.reverse();
145
+ }
85
146
 
86
147
  export interface CreateAgentSessionOptions {
87
148
  /** Working directory for project-local discovery. Default: process.cwd() */
@@ -390,9 +451,12 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
390
451
  onPayload: async (payload, currentModel) => {
391
452
  const runner = extensionRunnerRef.current;
392
453
  if (!runner?.hasHandlers("before_provider_request")) {
454
+ maybeLogProviderPayloadAudit(payload, "before_provider_request:unchanged");
393
455
  return payload;
394
456
  }
395
- return runner.emitBeforeProviderRequest(payload, currentModel);
457
+ const nextPayload = await runner.emitBeforeProviderRequest(payload, currentModel);
458
+ maybeLogProviderPayloadAudit(nextPayload, "before_provider_request:after");
459
+ return nextPayload;
396
460
  },
397
461
  sessionId: sessionManager.getSessionId(),
398
462
  transformContext: async (messages) => {
@@ -400,6 +464,24 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
400
464
  if (!runner) return messages;
401
465
  return runner.emitContext(messages);
402
466
  },
467
+ filterTools: async (tools, _signal, messages) => {
468
+ const currentModel = agent.state.activeInferenceModel ?? agent.state.model ?? model;
469
+ if (!currentModel) return tools;
470
+ const providerFiltered = filterToolsForProviderRequest(tools, currentModel);
471
+ const runner = extensionRunnerRef.current;
472
+ if (!runner?.hasHandlers("adjust_tool_set")) return providerFiltered.compatible;
473
+ const result = await runner.emitAdjustToolSet({
474
+ selectedModelApi: currentModel.api,
475
+ selectedModelProvider: currentModel.provider,
476
+ selectedModelId: currentModel.id,
477
+ activeToolNames: providerFiltered.compatible.map((tool) => tool.name),
478
+ filteredTools: providerFiltered.filtered.map((tool) => tool.name),
479
+ requestCustomMessages: getAdjustToolSetRequestCustomMessages(messages),
480
+ });
481
+ if (!result?.toolNames) return providerFiltered.compatible;
482
+ const allowedNames = new Set(result.toolNames);
483
+ return providerFiltered.compatible.filter((tool) => allowedNames.has(tool.name));
484
+ },
403
485
  steeringMode: settingsManager.getSteeringMode(),
404
486
  followUpMode: settingsManager.getFollowUpMode(),
405
487
  transport: settingsManager.getTransport(),
@@ -15,6 +15,13 @@ export interface CompactionSettings {
15
15
  enabled?: boolean; // default: true
16
16
  reserveTokens?: number; // default: 16384
17
17
  keepRecentTokens?: number; // default: 20000
18
+ /**
19
+ * Optional percent-of-context-window trigger (0 < value < 1). When set,
20
+ * compaction fires at `contextWindow * thresholdPercent` and overrides
21
+ * `reserveTokens`. Typically set as a runtime override by host integrations
22
+ * (see `setCompactionThresholdOverride`) and not persisted by users directly.
23
+ */
24
+ thresholdPercent?: number;
18
25
  }
19
26
 
20
27
  export interface BranchSummarySettings {
@@ -812,11 +819,42 @@ export class SettingsManager {
812
819
  return this.settings.compaction?.keepRecentTokens ?? COMPACTION_KEEP_RECENT_TOKENS;
813
820
  }
814
821
 
815
- getCompactionSettings(): { enabled: boolean; reserveTokens: number; keepRecentTokens: number } {
822
+ getCompactionThresholdPercent(): number | undefined {
823
+ return this.settings.compaction?.thresholdPercent;
824
+ }
825
+
826
+ /**
827
+ * Set or clear an in-memory compaction threshold-percent override.
828
+ *
829
+ * Applied to `this.settings` only; never persisted to disk. Pass `undefined`
830
+ * to clear a previously set override (necessary for idempotent re-sync from
831
+ * host integrations whose preference may have been removed).
832
+ *
833
+ * Direct mutation is used instead of `applyOverrides()` because deep-merge
834
+ * semantics skip `undefined` values, which would prevent clearing.
835
+ */
836
+ setCompactionThresholdOverride(percent: number | undefined): void {
837
+ if (!this.settings.compaction) {
838
+ this.settings.compaction = {};
839
+ }
840
+ if (percent === undefined) {
841
+ delete this.settings.compaction.thresholdPercent;
842
+ } else {
843
+ this.settings.compaction.thresholdPercent = percent;
844
+ }
845
+ }
846
+
847
+ getCompactionSettings(): {
848
+ enabled: boolean;
849
+ reserveTokens: number;
850
+ keepRecentTokens: number;
851
+ thresholdPercent?: number;
852
+ } {
816
853
  return {
817
854
  enabled: this.getCompactionEnabled(),
818
855
  reserveTokens: this.getCompactionReserveTokens(),
819
856
  keepRecentTokens: this.getCompactionKeepRecentTokens(),
857
+ thresholdPercent: this.getCompactionThresholdPercent(),
820
858
  };
821
859
  }
822
860
 
@@ -1,3 +1,6 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Tests skill invocation and prompt-only skill visibility behavior.
3
+
1
4
  import assert from "node:assert/strict";
2
5
  import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
3
6
  import { tmpdir } from "node:os";
@@ -86,4 +89,29 @@ describe("Skill tool", () => {
86
89
  assert.match(message, /^Skill "nonexistent" not found\. Available skills: /);
87
90
  assert.match(message, /swift-testing/);
88
91
  });
92
+
93
+ it("filters skill catalog without unloading skills or disabling Skill tool", async () => {
94
+ writeSkill(testDir, "alpha", "Use alpha.");
95
+ writeSkill(testDir, "beta", "Use beta.");
96
+ const session = await createSession();
97
+
98
+ assert.match(session.systemPrompt, /<name>alpha<\/name>/);
99
+ assert.match(session.systemPrompt, /<name>beta<\/name>/);
100
+
101
+ session.setVisibleSkillsByName(["alpha"]);
102
+ assert.deepEqual(session.getVisibleSkillNames(), ["alpha"]);
103
+ assert.match(session.systemPrompt, /<name>alpha<\/name>/);
104
+ assert.doesNotMatch(session.systemPrompt, /<name>beta<\/name>/);
105
+
106
+ const tool = session.state.tools.find((entry) => entry.name === "Skill");
107
+ assert.ok(tool, "Skill tool should remain active");
108
+ const result = await tool.execute("call-3", { skill: "beta" });
109
+ const text = result.content[0]?.type === "text" ? result.content[0].text : "";
110
+ assert.match(text, /<skill name="beta"/);
111
+
112
+ session.setVisibleSkillsByName(undefined);
113
+ assert.equal(session.getVisibleSkillNames(), undefined);
114
+ assert.match(session.systemPrompt, /<name>alpha<\/name>/);
115
+ assert.match(session.systemPrompt, /<name>beta<\/name>/);
116
+ });
89
117
  });
@@ -59,13 +59,12 @@ export interface BuildSystemPromptOptions {
59
59
  * Append a `Current date and time: <toLocaleString>` line to the system
60
60
  * prompt. Default: `false`.
61
61
  *
62
- * Anthropic prompt caching matches on byte-for-byte prefix equality.
63
- * Embedding a per-call timestamp in the system prompt invalidates the
64
- * cache on every request, forcing a full re-write that costs *more*
65
- * than an uncached call (cache-write premium). Most agentic flows do
66
- * not need wall-clock awareness in the system prompt opt in only
67
- * when the consumer genuinely needs it (e.g. a clock-sensitive agent),
68
- * and inject it via a non-cached channel (user message) when possible.
62
+ * Provider prompt caches generally depend on stable prompt prefixes.
63
+ * Embedding a per-call timestamp in the system prompt invalidates that
64
+ * stability on every request, often forcing full prompt reprocessing.
65
+ * Most agentic flows do not need wall-clock awareness in the system
66
+ * prompt opt in only when the consumer genuinely needs it, and inject
67
+ * it via a non-cached channel (user message) when possible.
69
68
  */
70
69
  includeDateTime?: boolean;
71
70
  }
@@ -86,9 +85,8 @@ export function buildSystemPrompt(options: BuildSystemPromptOptions = {}): strin
86
85
  } = options;
87
86
  const resolvedCwd = toPosixPath(cwd ?? process.cwd());
88
87
 
89
- // Per-call timestamps invalidate Anthropic prompt caching (the cache
90
- // matches on byte-for-byte prefix equality). Compute lazily and only
91
- // when explicitly opted in via `includeDateTime`.
88
+ // Per-call timestamps invalidate provider prompt cache stability. Compute
89
+ // lazily and only when explicitly opted in via `includeDateTime`.
92
90
  const dateTimeLine = includeDateTime
93
91
  ? `\nCurrent date and time: ${new Date().toLocaleString("en-US", {
94
92
  weekday: "long",
@@ -19,76 +19,32 @@
19
19
  import test from "node:test";
20
20
  import assert from "node:assert/strict";
21
21
  import { spawn } from "node:child_process";
22
+ import { createBashTool } from "./bash.js";
22
23
 
23
- // Verify the spawn option pattern used across the codebase.
24
- // This is a static/structural test it reads the source files and asserts
25
- // they use the platform-guarded detached flag.
26
- import { existsSync, readFileSync } from "node:fs";
27
- import { dirname, join, resolve } from "node:path";
28
- import { fileURLToPath } from "node:url";
29
-
30
- const __dirname = dirname(fileURLToPath(import.meta.url));
31
-
32
- function findRepoRoot(): string {
33
- const requiredFiles = [
34
- "packages/pi-coding-agent/src/core/tools/bash.ts",
35
- "packages/pi-coding-agent/src/core/bash-executor.ts",
36
- "packages/pi-coding-agent/src/utils/shell.ts",
37
- ];
38
- const candidates = [
39
- resolve(__dirname, "../../../../../"),
40
- resolve(__dirname, "../../../../../../"),
41
- ];
42
- for (const candidate of candidates) {
43
- if (requiredFiles.every((file) => existsSync(join(candidate, file)))) {
44
- return candidate;
45
- }
46
- }
47
- throw new Error(`Unable to resolve repository root from ${__dirname}`);
48
- }
49
-
50
- const REPO_ROOT = findRepoRoot();
51
-
52
- const SPAWN_FILES = [
53
- join(REPO_ROOT, "packages/pi-coding-agent/src/core/tools/bash.ts"),
54
- join(REPO_ROOT, "packages/pi-coding-agent/src/core/bash-executor.ts"),
55
- join(REPO_ROOT, "packages/pi-coding-agent/src/utils/shell.ts"),
56
- ];
57
-
58
- test("spawn calls use platform-guarded detached flag (no unconditional detached: true)", () => {
59
- for (const file of SPAWN_FILES) {
60
- const content = readFileSync(file, "utf-8");
61
- const lines = content.split("\n");
62
-
63
- for (let i = 0; i < lines.length; i++) {
64
- const line = lines[i]!;
65
- // Skip comments
66
- if (line.trim().startsWith("//") || line.trim().startsWith("*")) continue;
67
- // Check for unconditional `detached: true`
68
- if (/detached:\s*true\b/.test(line)) {
69
- assert.fail(
70
- `${file}:${i + 1} has unconditional 'detached: true' — ` +
71
- `must use 'detached: process.platform !== "win32"' ` +
72
- `to prevent EINVAL on Windows (ConPTY / VSCode terminal)`,
73
- );
74
- }
75
- }
76
- }
77
- });
24
+ test("bash tool delegates command execution through operations without forcing process detachment", async () => {
25
+ const calls: Array<{ command: string; cwd: string; env?: NodeJS.ProcessEnv }> = [];
26
+ const tool = createBashTool(process.cwd(), {
27
+ operations: {
28
+ async exec(command, cwd, options) {
29
+ calls.push({ command, cwd, env: options.env });
30
+ options.onData(Buffer.from("ok\n"));
31
+ return { exitCode: 0 };
32
+ },
33
+ },
34
+ });
78
35
 
79
- test("killProcessTree does not use detached: true for taskkill on Windows", () => {
80
- const shellFile = join(REPO_ROOT, "packages/pi-coding-agent/src/utils/shell.ts");
81
- const content = readFileSync(shellFile, "utf-8");
36
+ const result = await tool.execute("tool-call", { command: "echo ok" });
37
+ const firstContent = result.content[0];
82
38
 
83
- // Find the taskkill spawn call and ensure it doesn't have detached: true
84
- const taskkillRegion = content.match(/spawn\("taskkill"[\s\S]*?\}\)/);
85
- if (taskkillRegion) {
86
- assert.ok(
87
- !/detached:\s*true/.test(taskkillRegion[0]),
88
- "taskkill spawn should not use detached: true — " +
89
- "it can cause EINVAL on Windows and is unnecessary for a utility process",
90
- );
39
+ assert.ok(firstContent);
40
+ if (firstContent.type !== "text") {
41
+ assert.fail(`Expected text content, got ${firstContent.type}`);
91
42
  }
43
+ assert.equal(firstContent.text, "ok\n");
44
+ assert.deepEqual(calls.map((call) => ({ command: call.command, cwd: call.cwd })), [
45
+ { command: "echo ok", cwd: process.cwd() },
46
+ ]);
47
+ assert.ok(calls[0]?.env, "default bash context should provide an execution environment");
92
48
  });
93
49
 
94
50
  // Smoke test: spawn with platform-guarded detached flag actually works
@@ -116,6 +116,7 @@ const bashSchema = Type.Object({
116
116
  export type BashToolInput = Static<typeof bashSchema>;
117
117
 
118
118
  export interface BashToolDetails {
119
+ cwd?: string;
119
120
  truncation?: TruncationResult;
120
121
  fullOutputPath?: string;
121
122
  artifactId?: string;
@@ -384,6 +385,7 @@ export function createBashTool(cwd: string, options?: BashToolOptions): AgentToo
384
385
  onUpdate({
385
386
  content: [{ type: "text", text: truncation.content || "" }],
386
387
  details: {
388
+ cwd: spawnContext.cwd,
387
389
  truncation: truncation.truncated ? truncation : undefined,
388
390
  fullOutputPath: spillFilePath,
389
391
  },
@@ -412,10 +414,11 @@ export function createBashTool(cwd: string, options?: BashToolOptions): AgentToo
412
414
  let outputText = truncation.content || "(no output)";
413
415
 
414
416
  // Build details with truncation info
415
- let details: BashToolDetails | undefined;
417
+ let details: BashToolDetails | undefined = { cwd: spawnContext.cwd };
416
418
 
417
419
  if (truncation.truncated) {
418
420
  details = {
421
+ ...details,
419
422
  truncation,
420
423
  fullOutputPath: spillFilePath,
421
424
  ...(spillArtifactId ? { artifactId: spillArtifactId } : {}),
@@ -13,6 +13,7 @@ import {
13
13
  } from "./edit-diff.js";
14
14
  import { notifyFileChanged } from "../lsp/client.js";
15
15
  import { resolveToCwd } from "./path-utils.js";
16
+ import { createToolTarget, type ToolTargetMetadata } from "./tool-target.js";
16
17
 
17
18
  const editSchema = Type.Object({
18
19
  path: Type.String({ description: "Path to the file to edit (relative or absolute)" }),
@@ -27,6 +28,7 @@ export interface EditToolDetails {
27
28
  diff: string;
28
29
  /** Line number of the first change in the new file (for editor navigation) */
29
30
  firstChangedLine?: number;
31
+ target?: ToolTargetMetadata;
30
32
  }
31
33
 
32
34
  /**
@@ -208,7 +210,17 @@ export function createEditTool(cwd: string, options?: EditToolOptions): AgentToo
208
210
  text: `Successfully replaced text in ${path}.`,
209
211
  },
210
212
  ],
211
- details: { diff: diffResult.diff, firstChangedLine: diffResult.firstChangedLine },
213
+ details: {
214
+ diff: diffResult.diff,
215
+ firstChangedLine: diffResult.firstChangedLine,
216
+ target: createToolTarget({
217
+ kind: "file",
218
+ action: "edit",
219
+ inputPath: path,
220
+ resolvedPath: absolutePath,
221
+ line: diffResult.firstChangedLine,
222
+ }),
223
+ },
212
224
  });
213
225
  } catch (error: any) {
214
226
  // Clean up abort handler