gsd-pi 2.80.0-dev.96f4d89d5 → 2.80.0-dev.a947d025c

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 (720) hide show
  1. package/README.md +35 -59
  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 +40 -3
  16. package/dist/resources/extensions/github-sync/sync.js +4 -1
  17. package/dist/resources/extensions/gsd/auto/contracts.js +2 -0
  18. package/dist/resources/extensions/gsd/auto/loop.js +103 -9
  19. package/dist/resources/extensions/gsd/auto/orchestrator.js +48 -4
  20. package/dist/resources/extensions/gsd/auto/phases.js +311 -154
  21. package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
  22. package/dist/resources/extensions/gsd/auto/run-unit.js +22 -30
  23. package/dist/resources/extensions/gsd/auto/session.js +9 -1
  24. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -0
  25. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
  26. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
  27. package/dist/resources/extensions/gsd/auto-dashboard.js +18 -0
  28. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
  29. package/dist/resources/extensions/gsd/auto-dispatch.js +26 -0
  30. package/dist/resources/extensions/gsd/auto-post-unit.js +122 -88
  31. package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
  32. package/dist/resources/extensions/gsd/auto-recovery.js +197 -9
  33. package/dist/resources/extensions/gsd/auto-start.js +254 -17
  34. package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
  35. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
  36. package/dist/resources/extensions/gsd/auto-worktree.js +229 -336
  37. package/dist/resources/extensions/gsd/auto.js +273 -87
  38. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +122 -11
  39. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
  40. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
  41. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +30 -20
  42. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
  43. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
  44. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
  45. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  46. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +341 -55
  47. package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
  48. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  49. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +147 -2
  50. package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
  51. package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
  52. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  53. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  54. package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
  55. package/dist/resources/extensions/gsd/commands-extract-learnings.js +17 -12
  56. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  57. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  58. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  59. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  60. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  61. package/dist/resources/extensions/gsd/db-base-schema.js +18 -2
  62. package/dist/resources/extensions/gsd/db-migration-steps.js +22 -0
  63. package/dist/resources/extensions/gsd/detection.js +106 -0
  64. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  65. package/dist/resources/extensions/gsd/git-service.js +73 -5
  66. package/dist/resources/extensions/gsd/gsd-db.js +146 -13
  67. package/dist/resources/extensions/gsd/guided-flow.js +149 -48
  68. package/dist/resources/extensions/gsd/health-widget.js +3 -0
  69. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  70. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  71. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  72. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  73. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  74. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  75. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  76. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  77. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  78. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  79. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  80. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  81. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  82. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  83. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  84. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  85. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  86. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  87. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  88. package/dist/resources/extensions/gsd/quick.js +34 -2
  89. package/dist/resources/extensions/gsd/recovery-classification.js +94 -0
  90. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  91. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  92. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  93. package/dist/resources/extensions/gsd/state-reconciliation.js +27 -0
  94. package/dist/resources/extensions/gsd/tool-contract.js +50 -0
  95. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
  96. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  97. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  98. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  99. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  100. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  101. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  102. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  103. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  104. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  105. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  106. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  107. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  108. package/dist/resources/extensions/gsd/worktree-lifecycle.js +958 -0
  109. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  110. package/dist/resources/extensions/gsd/worktree-safety.js +119 -0
  111. package/dist/resources/extensions/gsd/worktree-state-projection.js +317 -0
  112. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  113. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  114. package/dist/web/standalone/.next/BUILD_ID +1 -1
  115. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  116. package/dist/web/standalone/.next/build-manifest.json +3 -3
  117. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  118. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  119. package/dist/web/standalone/.next/required-server-files.json +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/index.html +1 -1
  139. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  140. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  141. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  142. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  147. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/middleware.js +3 -3
  150. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  151. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  152. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  153. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  154. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  155. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  156. package/dist/web/standalone/server.js +1 -1
  157. package/dist/welcome-screen.d.ts +2 -0
  158. package/dist/welcome-screen.js +9 -7
  159. package/package.json +6 -4
  160. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  161. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  162. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  163. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  164. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  165. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  166. package/packages/native/tsconfig.tsbuildinfo +1 -1
  167. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  168. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  169. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  170. package/packages/pi-agent-core/dist/agent.d.ts +9 -2
  171. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  172. package/packages/pi-agent-core/dist/agent.js +43 -11
  173. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  174. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  175. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  176. package/packages/pi-agent-core/dist/index.js +2 -0
  177. package/packages/pi-agent-core/dist/index.js.map +1 -1
  178. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  179. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  180. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  181. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  182. package/packages/pi-agent-core/dist/types.d.ts +31 -0
  183. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  184. package/packages/pi-agent-core/dist/types.js.map +1 -1
  185. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  186. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  187. package/packages/pi-agent-core/src/agent.ts +52 -11
  188. package/packages/pi-agent-core/src/index.ts +2 -0
  189. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  190. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  191. package/packages/pi-agent-core/src/types.ts +26 -10
  192. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  193. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  194. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  195. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  196. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  197. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  198. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  199. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  200. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  201. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  202. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  203. package/packages/pi-ai/dist/types.d.ts +2 -0
  204. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  205. package/packages/pi-ai/dist/types.js.map +1 -1
  206. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  207. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  208. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  209. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  210. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  211. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  212. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  213. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  214. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  215. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  216. package/packages/pi-ai/src/types.ts +3 -0
  217. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  218. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  219. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  220. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  221. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +36 -1
  222. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  223. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +30 -1
  224. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  225. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +21 -2
  226. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  227. package/packages/pi-coding-agent/dist/core/agent-session.js +94 -16
  228. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  229. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +78 -0
  230. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  231. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  232. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  233. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  234. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  235. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  236. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  237. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  238. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  239. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  240. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  241. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  242. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  243. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  244. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  245. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  246. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  247. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  249. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -0
  251. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  252. package/packages/pi-coding-agent/dist/core/extensions/runner.js +20 -7
  253. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  254. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +102 -3
  255. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  256. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +60 -4
  257. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  258. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  260. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  262. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  263. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  264. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  265. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  266. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/sdk.js +81 -4
  268. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  270. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  272. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  273. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  274. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  275. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  276. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  277. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  278. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  280. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  282. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  284. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  286. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  288. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  289. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  290. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  291. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  292. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  294. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  296. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  298. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  299. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  300. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  301. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  302. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  304. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  305. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  306. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  307. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  308. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  309. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  310. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  311. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  312. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  313. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  314. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  316. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  317. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  318. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  319. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  320. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  321. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  322. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  323. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  324. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  325. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  326. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +137 -19
  330. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +2 -2
  332. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  334. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +2 -1
  337. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +32 -7
  339. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  340. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +18 -0
  341. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +225 -16
  343. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  344. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  345. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +85 -2
  346. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  347. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
  348. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  350. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -3
  352. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  354. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
  355. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +21 -0
  357. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  358. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
  359. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  361. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  362. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  363. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  364. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  365. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  366. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  367. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +40 -1
  368. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
  369. package/packages/pi-coding-agent/src/core/agent-session.ts +102 -16
  370. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +91 -0
  371. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  372. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  373. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  374. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  375. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  376. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +113 -3
  377. package/packages/pi-coding-agent/src/core/extensions/runner.ts +24 -6
  378. package/packages/pi-coding-agent/src/core/extensions/types.ts +63 -2
  379. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  380. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  381. package/packages/pi-coding-agent/src/core/sdk.ts +92 -4
  382. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
  383. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  384. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  385. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  386. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  387. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  388. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  389. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  390. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  391. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  392. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  393. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  394. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  395. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  396. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  397. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  398. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
  399. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +185 -19
  400. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +2 -2
  401. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
  402. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +2 -1
  403. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +41 -10
  404. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +260 -16
  405. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
  406. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +107 -3
  407. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +27 -3
  408. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
  409. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +25 -0
  410. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +1 -1
  411. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  412. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  413. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  414. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  415. package/packages/pi-tui/dist/tui.js +18 -8
  416. package/packages/pi-tui/dist/tui.js.map +1 -1
  417. package/packages/pi-tui/src/tui.ts +20 -8
  418. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  419. package/packages/rpc-client/README.md +7 -0
  420. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  421. package/pkg/dist/modes/interactive/theme/themes.js +36 -27
  422. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  423. package/src/resources/GSD-WORKFLOW.md +2 -2
  424. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  425. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
  426. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -0
  427. package/src/resources/extensions/github-sync/sync.ts +8 -1
  428. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  429. package/src/resources/extensions/gsd/auto/contracts.ts +19 -2
  430. package/src/resources/extensions/gsd/auto/loop-deps.ts +11 -11
  431. package/src/resources/extensions/gsd/auto/loop.ts +134 -16
  432. package/src/resources/extensions/gsd/auto/orchestrator.ts +52 -4
  433. package/src/resources/extensions/gsd/auto/phases.ts +427 -220
  434. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  435. package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
  436. package/src/resources/extensions/gsd/auto/session.ts +9 -1
  437. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  438. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +15 -0
  439. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  440. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  441. package/src/resources/extensions/gsd/auto-dashboard.ts +20 -0
  442. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  443. package/src/resources/extensions/gsd/auto-dispatch.ts +33 -0
  444. package/src/resources/extensions/gsd/auto-post-unit.ts +134 -90
  445. package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
  446. package/src/resources/extensions/gsd/auto-recovery.ts +207 -7
  447. package/src/resources/extensions/gsd/auto-start.ts +326 -25
  448. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  449. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  450. package/src/resources/extensions/gsd/auto-worktree.ts +259 -360
  451. package/src/resources/extensions/gsd/auto.ts +336 -89
  452. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +147 -11
  453. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
  454. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
  455. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
  456. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
  457. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
  458. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
  459. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  460. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +396 -55
  461. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
  462. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  463. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +153 -2
  464. package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
  465. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  466. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  467. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  468. package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
  469. package/src/resources/extensions/gsd/commands-extract-learnings.ts +17 -12
  470. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  471. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  472. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  473. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  474. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  475. package/src/resources/extensions/gsd/db-base-schema.ts +19 -2
  476. package/src/resources/extensions/gsd/db-migration-steps.ts +25 -0
  477. package/src/resources/extensions/gsd/detection.ts +128 -0
  478. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  479. package/src/resources/extensions/gsd/git-service.ts +87 -10
  480. package/src/resources/extensions/gsd/gsd-db.ts +168 -13
  481. package/src/resources/extensions/gsd/guided-flow.ts +175 -55
  482. package/src/resources/extensions/gsd/health-widget.ts +3 -0
  483. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  484. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  485. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  486. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  487. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  488. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  489. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  490. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  491. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  492. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  493. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  494. package/src/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  495. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  496. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  497. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  498. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  499. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  500. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  501. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  502. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  503. package/src/resources/extensions/gsd/quick.ts +37 -2
  504. package/src/resources/extensions/gsd/recovery-classification.ts +122 -0
  505. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  506. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  507. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  508. package/src/resources/extensions/gsd/state-reconciliation.ts +57 -0
  509. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  510. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  511. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  512. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  513. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +544 -41
  514. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  515. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +119 -2
  516. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  517. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  518. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +175 -11
  519. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  520. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  521. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +184 -2
  522. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  523. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  524. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  525. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  526. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  527. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +142 -0
  528. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  529. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  530. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  531. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  532. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  533. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  534. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  535. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
  536. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  537. package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
  538. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  539. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  540. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +9 -0
  541. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  542. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  543. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
  544. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  545. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  546. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  547. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  548. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  549. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  550. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  551. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +18 -10
  552. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  553. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  554. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +2 -2
  555. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +6 -11
  556. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  557. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  558. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  559. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  560. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  561. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  562. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  563. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  564. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  565. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  566. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  567. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  568. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  569. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +151 -0
  570. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  571. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  572. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -0
  573. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
  574. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  575. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
  576. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
  577. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  578. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
  579. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  580. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  581. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  582. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +248 -10
  583. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  584. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  585. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  586. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  587. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  588. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +37 -7
  589. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  590. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  591. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +267 -0
  592. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +88 -98
  593. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  594. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  595. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  596. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  597. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +44 -9
  598. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +144 -0
  599. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  600. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  601. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  602. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  603. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +95 -75
  604. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  605. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  606. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  607. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  608. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  609. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
  610. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  611. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  612. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  613. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  614. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  615. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  616. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  617. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  618. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  619. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  620. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  621. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  622. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  623. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  624. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  625. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  626. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  627. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  628. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  629. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  630. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  631. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +91 -0
  632. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  633. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  634. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  635. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  636. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  637. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +222 -0
  638. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  639. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  640. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  641. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  642. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  643. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  644. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  645. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  646. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -59
  647. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  648. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  649. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  650. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  651. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  652. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  653. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +101 -2
  654. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -4
  655. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  656. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
  657. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  658. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  659. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  660. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  661. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  662. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  663. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  664. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  665. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +210 -0
  666. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  667. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  668. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  669. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  670. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  671. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  672. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  673. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  674. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  675. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  676. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  677. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  678. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  679. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  680. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  681. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +38 -6
  682. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +50 -31
  683. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +434 -0
  684. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  685. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  686. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  687. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  688. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  689. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +373 -76
  690. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +327 -0
  691. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +120 -0
  692. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +179 -0
  693. package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
  694. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  695. package/src/resources/extensions/gsd/tool-contract.ts +82 -0
  696. package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
  697. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  698. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  699. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  700. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  701. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  702. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  703. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  704. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  705. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  706. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  707. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  708. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  709. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1255 -0
  710. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  711. package/src/resources/extensions/gsd/worktree-safety.ts +282 -0
  712. package/src/resources/extensions/gsd/worktree-state-projection.ts +404 -0
  713. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  714. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  715. package/dist/resources/extensions/gsd/worktree-resolver.js +0 -733
  716. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  717. package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +0 -434
  718. package/src/resources/extensions/gsd/worktree-resolver.ts +0 -909
  719. /package/dist/web/standalone/.next/static/{y7d--cnc6Cibuva-Lzzw_ → 8G7Lc96dfT0V6VXh6O6Ka}/_buildManifest.js +0 -0
  720. /package/dist/web/standalone/.next/static/{y7d--cnc6Cibuva-Lzzw_ → 8G7Lc96dfT0V6VXh6O6Ka}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"tool-card-cleanup-and-success-runtime.test.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Runtime regression tests for the post-compaction tool-card cleanup and the\n// green-bordered success-notification rendering. Replaces the source-grep\n// `src/tests/tui-running-and-success-box.test.ts` that was deleted in #4875\n// (tracked as #4872).\n//\n// The previous tests asserted on identifier presence and method signature\n// shape via regex. A regression that routed `success` notifications through\n// `showStatus` (dim text) by accident would not have failed because the\n// `showSuccess` method would still exist and still match the regex. These\n// tests instead drive the components through the actual scenario and assert\n// on rendered output.\n\nimport assert from \"node:assert/strict\";\nimport { describe, it, before } from \"node:test\";\n\nimport { Container, Text } from \"@gsd/pi-tui\";\nimport stripAnsi from \"strip-ansi\";\n\nimport { initTheme, theme } from \"../theme/theme.js\";\nimport { renderExtensionNotifyInChat, shouldRenderExtensionNotifyInChat } from \"../interactive-mode.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\nimport { ToolExecutionComponent } from \"./tool-execution.js\";\n\n// Theme is a globalThis-shared singleton that throws if not initialized.\n// Initialize once before any test that exercises themed rendering.\nbefore(() => {\n\tinitTheme(\"dark\");\n});\n\ndescribe(\"Extension warning notifications\", () => {\n\tit(\"do not render into chat output\", () => {\n\t\tassert.equal(shouldRenderExtensionNotifyInChat(\"warning\"), false);\n\t\tassert.equal(shouldRenderExtensionNotifyInChat(\"error\"), true);\n\t\tassert.equal(shouldRenderExtensionNotifyInChat(\"success\"), true);\n\t\tassert.equal(shouldRenderExtensionNotifyInChat(\"info\"), true);\n\t\tassert.equal(shouldRenderExtensionNotifyInChat(undefined), true);\n\n\t\tconst warningChat = new Container();\n\t\tconst warningResult = renderExtensionNotifyInChat(warningChat, \"extension warning\", \"warning\");\n\t\tassert.equal(warningResult.rendered, false);\n\t\tassert.equal(\n\t\t\twarningChat.render(80).map(stripAnsi).join(\"\\n\"),\n\t\t\t\"\",\n\t\t\t\"warning notifications must not add chat output\",\n\t\t);\n\n\t\tfor (const type of [\"error\", \"success\", \"info\"] as const) {\n\t\t\tconst chat = new Container();\n\t\t\tconst result = renderExtensionNotifyInChat(chat, `${type} notification`, type);\n\t\t\tassert.equal(result.rendered, true, `${type} notification should render`);\n\t\t\tassert.match(\n\t\t\t\tchat.render(80).map(stripAnsi).join(\"\\n\"),\n\t\t\t\tnew RegExp(`${type} notification`),\n\t\t\t\t`${type} notification text should appear in chat output`,\n\t\t\t);\n\t\t}\n\t});\n});\n\ninterface MockTui {\n\trenderCount: number;\n\trequestRender(): void;\n}\n\nfunction makeMockTUI(): MockTui {\n\treturn {\n\t\trenderCount: 0,\n\t\trequestRender() {\n\t\t\tthis.renderCount++;\n\t\t},\n\t};\n}\n\n// ─── Bug 1: tool cards stuck in \"Running\" after compaction ──────────────\n\ndescribe(\"ToolExecutionComponent post-compaction cleanup\", () => {\n\tit(\"renders 'Running' status while the tool call has no result\", () => {\n\t\t// Baseline: a freshly-constructed component (mid-stream) must show\n\t\t// the running badge — this is the state we need to flip OUT of when\n\t\t// compaction removes the result message.\n\t\tconst ui = makeMockTUI();\n\t\tconst c = new ToolExecutionComponent(\n\t\t\t\"read_file\",\n\t\t\t{ path: \"/tmp/x.txt\" },\n\t\t\t{},\n\t\t\tundefined,\n\t\t\tui as never,\n\t\t);\n\t\tconst rendered = c.render(60).map(stripAnsi).join(\"\\n\");\n\t\tassert.ok(\n\t\t\trendered.includes(\"Running\"),\n\t\t\t\"freshly constructed component should render 'Running' badge\",\n\t\t);\n\t});\n\n\tit(\"markHistoricalNoResult flips a stuck tool card OUT of 'Running'\", () => {\n\t\t// Real bug: after session-history replay (post-compaction or session\n\t\t// switch), tool calls without matching tool_result messages stay in\n\t\t// isPartial = true forever. markHistoricalNoResult must produce a\n\t\t// rendered output that no longer reads \"Running\".\n\t\tconst ui = makeMockTUI();\n\t\tconst c = new ToolExecutionComponent(\n\t\t\t\"read_file\",\n\t\t\t{ path: \"/tmp/x.txt\" },\n\t\t\t{},\n\t\t\tundefined,\n\t\t\tui as never,\n\t\t);\n\n\t\tc.markHistoricalNoResult();\n\n\t\tconst rendered = c.render(60).map(stripAnsi).join(\"\\n\");\n\t\tassert.ok(\n\t\t\t!rendered.includes(\"Running\"),\n\t\t\t\"after markHistoricalNoResult, the tool card must NOT render 'Running' — got:\\n\" +\n\t\t\t\trendered,\n\t\t);\n\t\tassert.ok(\n\t\t\trendered.includes(\"Done\"),\n\t\t\t\"flipped card should render 'Done' status (no-result success)\",\n\t\t);\n\t});\n\n\tit(\"markHistoricalNoResult is idempotent when a real result already exists\", () => {\n\t\t// Late-arriving stream events must not clobber legitimate results.\n\t\t// We observe the no-clobber via behaviour: a card that completed\n\t\t// with a real result keeps its \"Done\" badge and content even if\n\t\t// markHistoricalNoResult fires again afterwards.\n\t\tconst ui = makeMockTUI();\n\t\tconst c = new ToolExecutionComponent(\n\t\t\t\"read_file\",\n\t\t\t{ path: \"/tmp/x.txt\" },\n\t\t\t{},\n\t\t\tundefined,\n\t\t\tui as never,\n\t\t);\n\n\t\t// Use the public completion path the runtime calls.\n\t\tc.updateResult(\n\t\t\t{\n\t\t\t\tcontent: [{ type: \"text\", text: \"real-result-payload\" }],\n\t\t\t\tisError: false,\n\t\t\t},\n\t\t\tfalse, // isPartial = false → \"Done\"\n\t\t);\n\n\t\tconst before = c.render(60).map(stripAnsi).join(\"\\n\");\n\t\tassert.ok(before.includes(\"Done\"), \"after complete(), card shows 'Done'\");\n\n\t\tc.markHistoricalNoResult(); // must early-return\n\t\tconst after = c.render(60).map(stripAnsi).join(\"\\n\");\n\t\tassert.equal(\n\t\t\tafter,\n\t\t\tbefore,\n\t\t\t\"markHistoricalNoResult must NOT mutate state when a real result is already present\",\n\t\t);\n\t});\n});\n\n// ─── Bug 2: success notifications render as a green bordered box ────────\n\ndescribe(\"Success-notification rendering — DynamicBorder + success theme\", () => {\n\t// We drive the same component composition that interactive-mode.showSuccess\n\t// builds (DynamicBorder + Text + DynamicBorder, all themed with\n\t// theme.fg(\"success\", …)) and assert on the rendered output, rather than\n\t// trying to instantiate the full InteractiveMode (which requires a real\n\t// session, bridge, and TUI runtime).\n\tfunction buildSuccessNotification(message: string): Container {\n\t\tconst c = new Container();\n\t\tconst successColor = (text: string) => theme.fg(\"success\", text);\n\t\tc.addChild(new DynamicBorder(successColor));\n\t\tc.addChild(new Text(theme.fg(\"success\", message), 1, 0));\n\t\tc.addChild(new DynamicBorder(successColor));\n\t\treturn c;\n\t}\n\n\tit(\"renders a top and bottom horizontal border framing the message\", () => {\n\t\tconst c = buildSuccessNotification(\"Milestone M042 ready.\");\n\t\tconst lines = c.render(40);\n\n\t\t// First and last lines should be horizontal-rule borders\n\t\t// (DynamicBorder renders a row of \"─\" characters).\n\t\tconst firstStripped = stripAnsi(lines[0]);\n\t\tconst lastStripped = stripAnsi(lines[lines.length - 1]);\n\n\t\tassert.ok(\n\t\t\tfirstStripped.includes(\"─\"),\n\t\t\t`first line should be a border (got: ${JSON.stringify(firstStripped)})`,\n\t\t);\n\t\tassert.ok(\n\t\t\tlastStripped.includes(\"─\"),\n\t\t\t`last line should be a border (got: ${JSON.stringify(lastStripped)})`,\n\t\t);\n\t\tassert.ok(\n\t\t\tlines.length >= 3,\n\t\t\t`success notification must have at least 3 lines (top border, message, bottom border) — got ${lines.length}`,\n\t\t);\n\t});\n\n\tit(\"the message text appears between the two borders\", () => {\n\t\tconst c = buildSuccessNotification(\"Milestone M042 ready.\");\n\t\tconst lines = c.render(40);\n\n\t\tconst messageRow = lines.findIndex((l) => stripAnsi(l).includes(\"Milestone M042 ready.\"));\n\t\tassert.ok(messageRow > 0, \"message must appear after the top border\");\n\t\tassert.ok(\n\t\t\tmessageRow < lines.length - 1,\n\t\t\t\"message must appear before the bottom border\",\n\t\t);\n\t});\n\n\tit(\"borders carry ANSI styling (not plain dim text like showStatus)\", () => {\n\t\t// Goodhart-resistant: if a regression routed success through\n\t\t// showStatus, the borders would be missing AND the rendered text\n\t\t// would be plain (or only dim-styled, not success-colored). We\n\t\t// observe the border lines carry ANSI escape codes — the literal\n\t\t// foreground color depends on the theme (which is system-dependent\n\t\t// in CI), so we don't pin a specific code but DO require styling\n\t\t// to be present.\n\t\tconst c = buildSuccessNotification(\"ok\");\n\t\tconst lines = c.render(40);\n\t\tconst top = lines[0];\n\t\tassert.ok(\n\t\t\ttop !== stripAnsi(top),\n\t\t\t\"top border must contain ANSI styling — a plain unstyled border \" +\n\t\t\t\t\"would indicate the rendering bypassed theme.fg('success', ...)\",\n\t\t);\n\t});\n\n\tit(\"plain Text status (the showStatus path) does NOT produce a bordered box\", () => {\n\t\t// Counter-test: this is what the bug looked like — a single dim Text\n\t\t// with no surrounding border. If anyone ever \"fixes\" the showSuccess\n\t\t// regression by also adding borders to showStatus, this test will\n\t\t// surface the conflation.\n\t\tconst plain = new Text(theme.fg(\"dim\", \"Milestone M042 ready.\"), 1, 0);\n\t\tconst lines = plain.render(40);\n\t\tconst joined = lines.map(stripAnsi).join(\"\\n\");\n\t\tassert.ok(\n\t\t\t!joined.includes(\"─\"),\n\t\t\t\"plain Text (showStatus path) must NOT contain border characters\",\n\t\t);\n\t});\n});\n"]}
1
+ {"version":3,"file":"tool-card-cleanup-and-success-runtime.test.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: GSD-2\n// File Purpose: Runtime tests for TUI tool cards, success notifications, and blocking errors.\n// GSD2 TUI Tests - Runtime coverage for tool-card cleanup and success notification rendering.\n// Runtime regression tests for the post-compaction tool-card cleanup and the\n// green-bordered success-notification rendering. Replaces the source-grep\n// `src/tests/tui-running-and-success-box.test.ts` that was deleted in #4875\n// (tracked as #4872).\n//\n// The previous tests asserted on identifier presence and method signature\n// shape via regex. A regression that routed `success` notifications through\n// `showStatus` (dim text) by accident would not have failed because the\n// `showSuccess` method would still exist and still match the regex. These\n// tests instead drive the components through the actual scenario and assert\n// on rendered output.\n\nimport assert from \"node:assert/strict\";\nimport { describe, it, before } from \"node:test\";\n\nimport { Container, Text } from \"@gsd/pi-tui\";\nimport stripAnsi from \"strip-ansi\";\n\nimport { initTheme, theme } from \"../theme/theme.js\";\nimport { renderBlockingErrorBanner, renderExtensionNotifyInChat, shouldRenderExtensionNotifyInChat } from \"../interactive-mode.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\nimport { ToolExecutionComponent } from \"./tool-execution.js\";\n\n// Theme is a globalThis-shared singleton that throws if not initialized.\n// Initialize once before any test that exercises themed rendering.\nbefore(() => {\n\tinitTheme(\"dark\");\n});\n\ndescribe(\"Extension warning notifications\", () => {\n\tit(\"do not render into chat output\", () => {\n\t\tassert.equal(shouldRenderExtensionNotifyInChat(\"warning\"), false);\n\t\tassert.equal(shouldRenderExtensionNotifyInChat(\"error\"), true);\n\t\tassert.equal(shouldRenderExtensionNotifyInChat(\"success\"), true);\n\t\tassert.equal(shouldRenderExtensionNotifyInChat(\"info\"), true);\n\t\tassert.equal(shouldRenderExtensionNotifyInChat(undefined), true);\n\n\t\tconst warningChat = new Container();\n\t\tconst warningResult = renderExtensionNotifyInChat(warningChat, \"extension warning\", \"warning\");\n\t\tassert.equal(warningResult.rendered, false);\n\t\tassert.equal(\n\t\t\twarningChat.render(80).map(stripAnsi).join(\"\\n\"),\n\t\t\t\"\",\n\t\t\t\"warning notifications must not add chat output\",\n\t\t);\n\n\t\tfor (const type of [\"error\", \"success\", \"info\"] as const) {\n\t\t\tconst chat = new Container();\n\t\t\tconst result = renderExtensionNotifyInChat(chat, `${type} notification`, type);\n\t\t\tassert.equal(result.rendered, true, `${type} notification should render`);\n\t\t\tassert.match(\n\t\t\t\tchat.render(80).map(stripAnsi).join(\"\\n\"),\n\t\t\t\tnew RegExp(`${type} notification`),\n\t\t\t\t`${type} notification text should appear in chat output`,\n\t\t\t);\n\t\t}\n\t});\n});\n\ndescribe(\"Blocking error banner\", () => {\n\tit(\"keeps full error notifications renderable outside chat history\", () => {\n\t\tconst banner = new Container();\n\t\tconst message = [\n\t\t\t\"Pre-execution checks failed: 3 blocking issues found\",\n\t\t\t\" - [file] lib/types.ts: Task T01 references 'lib/types.ts'\",\n\t\t\t\"See .gsd/milestones/M001/slices/S02/S02-PRE-EXEC-VERIFY.json for full details.\",\n\t\t].join(\"\\n\");\n\n\t\trenderBlockingErrorBanner(banner, message);\n\n\t\tconst rendered = banner.render(140).map(stripAnsi).join(\"\\n\");\n\t\tassert.match(rendered, /Error: Pre-execution checks failed: 3 blocking issues found/);\n\t\tassert.match(rendered, /Task T01 references 'lib\\/types\\.ts'/);\n\t\tassert.match(rendered, /S02-PRE-EXEC-VERIFY\\.json/);\n\t});\n\n\tit(\"clears the sticky banner when the blocking error is cleared\", () => {\n\t\tconst banner = new Container();\n\n\t\trenderBlockingErrorBanner(banner, \"Provider failed\");\n\t\tassert.match(banner.render(80).map(stripAnsi).join(\"\\n\"), /Provider failed/);\n\n\t\trenderBlockingErrorBanner(banner, undefined);\n\t\tassert.equal(banner.render(80).map(stripAnsi).join(\"\\n\"), \"\");\n\t});\n});\n\ninterface MockTui {\n\trenderCount: number;\n\trequestRender(): void;\n}\n\nfunction makeMockTUI(): MockTui {\n\treturn {\n\t\trenderCount: 0,\n\t\trequestRender() {\n\t\t\tthis.renderCount++;\n\t\t},\n\t};\n}\n\n// ─── Bug 1: tool cards stuck in \"Running\" after compaction ──────────────\n\ndescribe(\"ToolExecutionComponent post-compaction cleanup\", () => {\n\tit(\"renders 'running' status while the tool call has no result\", () => {\n\t\t// Baseline: a freshly-constructed component (mid-stream) must show\n\t\t// the running badge — this is the state we need to flip OUT of when\n\t\t// compaction removes the result message.\n\t\tconst ui = makeMockTUI();\n\t\tconst c = new ToolExecutionComponent(\n\t\t\t\"read_file\",\n\t\t\t{ path: \"/tmp/x.txt\" },\n\t\t\t{},\n\t\t\tundefined,\n\t\t\tui as never,\n\t\t);\n\t\tconst rendered = c.render(60).map(stripAnsi).join(\"\\n\");\n\t\tassert.ok(\n\t\t\trendered.includes(\"running\"),\n\t\t\t\"freshly constructed component should render 'running' badge\",\n\t\t);\n\t});\n\n\tit(\"markHistoricalNoResult flips a stuck tool card OUT of 'running'\", () => {\n\t\t// Real bug: after session-history replay (post-compaction or session\n\t\t// switch), tool calls without matching tool_result messages stay in\n\t\t// isPartial = true forever. markHistoricalNoResult must produce a\n\t\t// rendered output that no longer reads \"Running\".\n\t\tconst ui = makeMockTUI();\n\t\tconst c = new ToolExecutionComponent(\n\t\t\t\"read_file\",\n\t\t\t{ path: \"/tmp/x.txt\" },\n\t\t\t{},\n\t\t\tundefined,\n\t\t\tui as never,\n\t\t);\n\n\t\tc.markHistoricalNoResult();\n\n\t\tconst rendered = c.render(60).map(stripAnsi).join(\"\\n\");\n\t\tassert.ok(\n\t\t\t!rendered.includes(\"running\"),\n\t\t\t\"after markHistoricalNoResult, the tool card must NOT render 'running' -- got:\\n\" +\n\t\t\t\trendered,\n\t\t);\n\t\tassert.ok(\n\t\t\trendered.includes(\"success\"),\n\t\t\t\"flipped card should render 'success' status (no-result success)\",\n\t\t);\n\t});\n\n\tit(\"markHistoricalNoResult is idempotent when a real result already exists\", () => {\n\t\t// Late-arriving stream events must not clobber legitimate results.\n\t\t// We observe the no-clobber via behaviour: a card that completed\n\t\t// with a real result keeps its \"Done\" badge and content even if\n\t\t// markHistoricalNoResult fires again afterwards.\n\t\tconst ui = makeMockTUI();\n\t\tconst c = new ToolExecutionComponent(\n\t\t\t\"read_file\",\n\t\t\t{ path: \"/tmp/x.txt\" },\n\t\t\t{},\n\t\t\tundefined,\n\t\t\tui as never,\n\t\t);\n\n\t\t// Use the public completion path the runtime calls.\n\t\tc.updateResult(\n\t\t\t{\n\t\t\t\tcontent: [{ type: \"text\", text: \"real-result-payload\" }],\n\t\t\t\tisError: false,\n\t\t\t},\n\t\t\tfalse, // isPartial = false → \"Done\"\n\t\t);\n\n\t\tconst before = c.render(60).map(stripAnsi).join(\"\\n\");\n\t\tassert.ok(before.includes(\"success\"), \"after complete(), card shows 'success'\");\n\n\t\tc.markHistoricalNoResult(); // must early-return\n\t\tconst after = c.render(60).map(stripAnsi).join(\"\\n\");\n\t\tassert.equal(\n\t\t\tafter,\n\t\t\tbefore,\n\t\t\t\"markHistoricalNoResult must NOT mutate state when a real result is already present\",\n\t\t);\n\t});\n});\n\n// ─── Bug 2: success notifications render as a green bordered box ────────\n\ndescribe(\"Success-notification rendering — DynamicBorder + success theme\", () => {\n\t// We drive the same component composition that interactive-mode.showSuccess\n\t// builds (DynamicBorder + Text + DynamicBorder, all themed with\n\t// theme.fg(\"success\", …)) and assert on the rendered output, rather than\n\t// trying to instantiate the full InteractiveMode (which requires a real\n\t// session, bridge, and TUI runtime).\n\tfunction buildSuccessNotification(message: string): Container {\n\t\tconst c = new Container();\n\t\tconst successColor = (text: string) => theme.fg(\"success\", text);\n\t\tc.addChild(new DynamicBorder(successColor));\n\t\tc.addChild(new Text(theme.fg(\"success\", message), 1, 0));\n\t\tc.addChild(new DynamicBorder(successColor));\n\t\treturn c;\n\t}\n\n\tit(\"renders a top and bottom horizontal border framing the message\", () => {\n\t\tconst c = buildSuccessNotification(\"Milestone M042 ready.\");\n\t\tconst lines = c.render(40);\n\n\t\t// First and last lines should be horizontal-rule borders\n\t\t// (DynamicBorder renders a row of \"─\" characters).\n\t\tconst firstStripped = stripAnsi(lines[0]);\n\t\tconst lastStripped = stripAnsi(lines[lines.length - 1]);\n\n\t\tassert.ok(\n\t\t\tfirstStripped.includes(\"─\"),\n\t\t\t`first line should be a border (got: ${JSON.stringify(firstStripped)})`,\n\t\t);\n\t\tassert.ok(\n\t\t\tlastStripped.includes(\"─\"),\n\t\t\t`last line should be a border (got: ${JSON.stringify(lastStripped)})`,\n\t\t);\n\t\tassert.ok(\n\t\t\tlines.length >= 3,\n\t\t\t`success notification must have at least 3 lines (top border, message, bottom border) — got ${lines.length}`,\n\t\t);\n\t});\n\n\tit(\"the message text appears between the two borders\", () => {\n\t\tconst c = buildSuccessNotification(\"Milestone M042 ready.\");\n\t\tconst lines = c.render(40);\n\n\t\tconst messageRow = lines.findIndex((l) => stripAnsi(l).includes(\"Milestone M042 ready.\"));\n\t\tassert.ok(messageRow > 0, \"message must appear after the top border\");\n\t\tassert.ok(\n\t\t\tmessageRow < lines.length - 1,\n\t\t\t\"message must appear before the bottom border\",\n\t\t);\n\t});\n\n\tit(\"borders carry ANSI styling (not plain dim text like showStatus)\", () => {\n\t\t// Goodhart-resistant: if a regression routed success through\n\t\t// showStatus, the borders would be missing AND the rendered text\n\t\t// would be plain (or only dim-styled, not success-colored). We\n\t\t// observe the border lines carry ANSI escape codes — the literal\n\t\t// foreground color depends on the theme (which is system-dependent\n\t\t// in CI), so we don't pin a specific code but DO require styling\n\t\t// to be present.\n\t\tconst c = buildSuccessNotification(\"ok\");\n\t\tconst lines = c.render(40);\n\t\tconst top = lines[0];\n\t\tassert.ok(\n\t\t\ttop !== stripAnsi(top),\n\t\t\t\"top border must contain ANSI styling — a plain unstyled border \" +\n\t\t\t\t\"would indicate the rendering bypassed theme.fg('success', ...)\",\n\t\t);\n\t});\n\n\tit(\"plain Text status (the showStatus path) does NOT produce a bordered box\", () => {\n\t\t// Counter-test: this is what the bug looked like — a single dim Text\n\t\t// with no surrounding border. If anyone ever \"fixes\" the showSuccess\n\t\t// regression by also adding borders to showStatus, this test will\n\t\t// surface the conflation.\n\t\tconst plain = new Text(theme.fg(\"dim\", \"Milestone M042 ready.\"), 1, 0);\n\t\tconst lines = plain.render(40);\n\t\tconst joined = lines.map(stripAnsi).join(\"\\n\");\n\t\tassert.ok(\n\t\t\t!joined.includes(\"─\"),\n\t\t\t\"plain Text (showStatus path) must NOT contain border characters\",\n\t\t);\n\t});\n});\n"]}
@@ -1,5 +1,12 @@
1
1
  import { Container, type TUI } from "@gsd/pi-tui";
2
2
  import type { ToolDefinition } from "../../../core/extensions/types.js";
3
+ export type ToolExecutionPhase = {
4
+ label: string;
5
+ count: number;
6
+ durationMs: number;
7
+ targets?: string[];
8
+ actionLabel?: string;
9
+ };
3
10
  export interface ToolExecutionOptions {
4
11
  showImages?: boolean;
5
12
  }
@@ -84,7 +91,12 @@ export declare class ToolExecutionComponent extends Container {
84
91
  invalidate(): void;
85
92
  render(width: number): string[];
86
93
  private shouldRenderCompactSuccess;
94
+ getRollupPhase(): ToolExecutionPhase | null;
95
+ private getPhaseLabel;
87
96
  private getCompactSummary;
97
+ private getCompactAction;
98
+ private getTargetMetadata;
99
+ private getCompactTarget;
88
100
  private updateDisplay;
89
101
  /**
90
102
  * Render bash content using visual line truncation (like bash-execution.ts)
@@ -93,4 +105,10 @@ export declare class ToolExecutionComponent extends Container {
93
105
  private getTextOutput;
94
106
  private formatToolExecution;
95
107
  }
108
+ export declare class ToolPhaseSummaryComponent extends Container {
109
+ private readonly phases;
110
+ constructor(phases: ToolExecutionPhase[]);
111
+ getPhases(): ToolExecutionPhase[];
112
+ render(width: number): string[];
113
+ }
96
114
  //# sourceMappingURL=tool-execution.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-execution.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,SAAS,EAQT,KAAK,GAAG,EAGR,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAmKxE,MAAM,WAAW,oBAAoB;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAUD;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,SAAS;IACpD,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,WAAW,CAAO;IAC1B,OAAO,CAAC,eAAe,CAAe;IACtC,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,EAAE,CAAM;IAChB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,MAAM,CAAC,CAIb;IAEF,OAAO,CAAC,eAAe,CAAC,CAAiC;IACzD,OAAO,CAAC,eAAe,CAAC,CAAS;IAEjC,OAAO,CAAC,eAAe,CAA8D;IAGrF,OAAO,CAAC,uBAAuB,CAA2C;IAE1E,OAAO,CAAC,mBAAmB,CAAC,CAAsB;IAElD,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,KAAK,kBAAkB,GAE7B;gBAGA,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,oBAAoB,YAAK,EAClC,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,EAAE,EAAE,GAAG,EACP,GAAG,GAAE,MAAsB;IA2B5B;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAOhC,OAAO,IAAI,IAAI;IASf,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAQ3B,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,2BAA2B;IAYnC,OAAO,CAAC,8BAA8B;IAkBtC,OAAO,CAAC,oCAAoC;IAyD5C;;;OAGG;IACH,eAAe,IAAI,IAAI;IAWvB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA6B5B,YAAY,CACX,MAAM,EAAE;QACP,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAClF,OAAO,CAAC,EAAE,GAAG,CAAC;QACd,OAAO,EAAE,OAAO,CAAC;KACjB,EACD,SAAS,UAAQ,GACf,IAAI;IAkBP;;;;;;OAMG;IACH,sBAAsB,IAAI,IAAI;IAW9B;;OAEG;IACH,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAqBzC;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IA2BlC,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAKpC,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAKzB,UAAU,IAAI,IAAI;IAKlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA+BxC,OAAO,CAAC,0BAA0B;IAMlC,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,aAAa;IAoKrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA+EzB,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,mBAAmB;CAsX3B"}
1
+ {"version":3,"file":"tool-execution.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/tool-execution.ts"],"names":[],"mappings":"AACA,OAAO,EAEN,SAAS,EAQT,KAAK,GAAG,EAGR,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AA4IxE,MAAM,MAAM,kBAAkB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AA+JF,MAAM,WAAW,oBAAoB;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAUD;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,SAAS;IACpD,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,WAAW,CAAO;IAC1B,OAAO,CAAC,eAAe,CAAe;IACtC,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,EAAE,CAAM;IAChB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,MAAM,CAAC,CAIb;IAEF,OAAO,CAAC,eAAe,CAAC,CAAiC;IACzD,OAAO,CAAC,eAAe,CAAC,CAAS;IAEjC,OAAO,CAAC,eAAe,CAA8D;IAGrF,OAAO,CAAC,uBAAuB,CAA2C;IAE1E,OAAO,CAAC,mBAAmB,CAAC,CAAsB;IAElD,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,KAAK,kBAAkB,GAE7B;gBAGA,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,oBAAoB,YAAK,EAClC,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,EAAE,EAAE,GAAG,EACP,GAAG,GAAE,MAAsB;IA2B5B;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAOhC,OAAO,IAAI,IAAI;IASf,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAQ3B,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,2BAA2B;IAYnC,OAAO,CAAC,8BAA8B;IAkBtC,OAAO,CAAC,oCAAoC;IAyD5C;;;OAGG;IACH,eAAe,IAAI,IAAI;IAWvB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA6B5B,YAAY,CACX,MAAM,EAAE;QACP,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAClF,OAAO,CAAC,EAAE,GAAG,CAAC;QACd,OAAO,EAAE,OAAO,CAAC;KACjB,EACD,SAAS,UAAQ,GACf,IAAI;IAkBP;;;;;;OAMG;IACH,sBAAsB,IAAI,IAAI;IAW9B;;OAEG;IACH,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAqBzC;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IA2BlC,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAKpC,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAKzB,UAAU,IAAI,IAAI;IAKlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA0BxC,OAAO,CAAC,0BAA0B;IAMlC,cAAc,IAAI,kBAAkB,GAAG,IAAI;IAc3C,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,gBAAgB;IA6BxB,OAAO,CAAC,aAAa;IAoKrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmFzB,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,mBAAmB;CAsX3B;AAED,qBAAa,yBAA0B,SAAQ,SAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,kBAAkB,EAAE;IAIzD,SAAS,IAAI,kBAAkB,EAAE;IAIxB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAgBxC"}
@@ -1,3 +1,4 @@
1
+ // GSD-2 Interactive Tool Execution Rendering
1
2
  import { Box, Container, getCapabilities, Image, imageFallback, Spacer, style, Text, truncateToWidth, visibleWidth, } from "@gsd/pi-tui";
2
3
  import stripAnsi from "strip-ansi";
3
4
  import { computeEditDiff } from "../../../core/tools/edit-diff.js";
@@ -81,24 +82,40 @@ function renderToolFrame(contentLines, width, opts) {
81
82
  const contentWidth = Math.max(1, outerWidth - 2); // "│ " + content
82
83
  const borderColor = opts.tone === "error" ? "toolError" : opts.tone === "pending" ? "toolRunning" : "toolSuccess";
83
84
  const topColor = borderColor;
84
- const labelColor = opts.tone === "error" ? "toolError" : "surfaceTitle";
85
+ const labelColor = opts.tone === "error" ? "toolError" : opts.tone === "pending" ? "toolRunning" : "toolSuccess";
85
86
  const statusColor = opts.tone === "error" ? "toolError" : opts.tone === "pending" ? "toolRunning" : "toolSuccess";
86
- const leftStyled = theme.fg(labelColor, theme.bold(`• ${opts.label}`));
87
+ const leftStyled = theme.fg(labelColor, theme.bold(opts.label));
87
88
  const rightStyled = theme.fg(statusColor, opts.status);
88
- const gap = Math.max(1, outerWidth - visibleWidth(leftStyled) - visibleWidth(rightStyled));
89
+ const titleWidth = Math.max(1, outerWidth - 4);
90
+ const gap = Math.max(1, titleWidth - visibleWidth(leftStyled) - visibleWidth(rightStyled));
89
91
  const headerRow = `${leftStyled}${" ".repeat(gap)}${rightStyled}`;
90
- const headerPad = Math.max(0, outerWidth - visibleWidth(headerRow));
92
+ const headerPad = Math.max(0, titleWidth - visibleWidth(headerRow));
91
93
  const sourceLines = trimOuterBlankLines(contentLines);
92
94
  const bodyLines = (sourceLines.length > 0 ? sourceLines : [""]).map((line) => {
93
95
  const clipped = truncateToWidth(line, contentWidth, "");
94
96
  return clipped;
95
97
  });
96
98
  return style()
97
- .border("rule")
99
+ .border("rounded")
98
100
  .borderColor((line) => theme.fg(line.startsWith("─") ? topColor : borderColor, line))
99
101
  .title(headerRow + " ".repeat(headerPad))
100
102
  .render(bodyLines, outerWidth);
101
103
  }
104
+ function renderCollapsedToolRow(label, status, width, tone) {
105
+ const outerWidth = Math.max(20, width);
106
+ const contentWidth = Math.max(1, outerWidth - 2);
107
+ const statusColor = tone === "success" ? "toolSuccess" : "toolMuted";
108
+ const labelStyled = theme.fg(statusColor, label);
109
+ const statusStyled = theme.fg(statusColor, status);
110
+ const labelWidth = Math.max(1, contentWidth - visibleWidth(statusStyled) - 1);
111
+ const clippedLabel = truncateToWidth(labelStyled, labelWidth, "");
112
+ const gap = Math.max(1, contentWidth - visibleWidth(clippedLabel) - visibleWidth(statusStyled));
113
+ const line = `${clippedLabel}${" ".repeat(gap)}${statusStyled}`;
114
+ return style()
115
+ .border("minimal")
116
+ .borderColor((text) => theme.fg(statusColor, text))
117
+ .render([line], outerWidth);
118
+ }
102
119
  const COMPACT_ARG_VALUE_LIMIT = 60;
103
120
  const GENERIC_OUTPUT_PREVIEW_LINES = 10;
104
121
  const GENERIC_ARGS_JSON_PREVIEW_LINES = 10;
@@ -107,6 +124,97 @@ function formatElapsed(ms) {
107
124
  return `${ms}ms`;
108
125
  return `${Math.max(1, Math.round(ms / 1000))}s`;
109
126
  }
127
+ function formatCommandPreview(command) {
128
+ return truncateToWidth(command.replace(/\s+/g, " ").trim(), 64, "");
129
+ }
130
+ function appendLineOrRange(displayPath, target) {
131
+ if (!displayPath)
132
+ return undefined;
133
+ if (typeof target.line === "number" && Number.isFinite(target.line)) {
134
+ return `${displayPath}:${target.line}`;
135
+ }
136
+ const start = target.range?.start;
137
+ if (typeof start === "number" && Number.isFinite(start)) {
138
+ const end = target.range?.end;
139
+ const suffix = typeof end === "number" && Number.isFinite(end) && end !== start
140
+ ? `${start}-${end}`
141
+ : `${start}`;
142
+ return `${displayPath}:${suffix}`;
143
+ }
144
+ return displayPath;
145
+ }
146
+ function formatToolTarget(target) {
147
+ const path = target.resolvedPath || target.inputPath;
148
+ const displayPath = path ? shortenPath(path) : undefined;
149
+ if (target.kind === "search") {
150
+ const searchTarget = displayPath ?? target.inputPath ?? ".";
151
+ const label = target.pattern ? `${target.pattern} in ${searchTarget}` : searchTarget;
152
+ return target.glob ? `${label} (${target.glob})` : label;
153
+ }
154
+ return appendLineOrRange(displayPath, target);
155
+ }
156
+ function formatArgsPathTarget(path, args) {
157
+ if (!path)
158
+ return undefined;
159
+ const start = typeof args.offset === "number" ? args.offset : undefined;
160
+ const limit = typeof args.limit === "number" ? args.limit : undefined;
161
+ const range = start !== undefined || limit !== undefined
162
+ ? {
163
+ start: start ?? 1,
164
+ end: limit !== undefined ? (start ?? 1) + Math.max(0, limit - 1) : undefined,
165
+ }
166
+ : undefined;
167
+ return appendLineOrRange(shortenPath(path), { range });
168
+ }
169
+ function stripLineSuffix(target) {
170
+ return target.replace(/:\d+(?:-\d+)?$/, "");
171
+ }
172
+ function uniqueTargets(targets) {
173
+ const seen = new Set();
174
+ const unique = [];
175
+ for (const target of targets ?? []) {
176
+ if (!target || seen.has(target))
177
+ continue;
178
+ seen.add(target);
179
+ unique.push(target);
180
+ }
181
+ return unique;
182
+ }
183
+ function summarizePhaseLabel(phase) {
184
+ const phaseTargets = uniqueTargets(phase.targets);
185
+ const baseTargets = uniqueTargets(phaseTargets.map(stripLineSuffix));
186
+ if (phase.label === "File changes" && baseTargets.length > 0) {
187
+ const fileWord = baseTargets.length === 1 ? "file" : "files";
188
+ const actionWord = phase.actionLabel === "write"
189
+ ? phase.count === 1
190
+ ? "write"
191
+ : "writes"
192
+ : phase.actionLabel === undefined
193
+ ? phase.count === 1
194
+ ? "action"
195
+ : "actions"
196
+ : phase.count === 1
197
+ ? "edit"
198
+ : "edits";
199
+ return `${phase.label} · ${baseTargets.length} ${fileWord}, ${phase.count} ${actionWord}`;
200
+ }
201
+ if (phase.label === "Context reads" && baseTargets.length > 0) {
202
+ const fileWord = baseTargets.length === 1 ? "file" : "files";
203
+ return `${phase.label} · ${baseTargets.length} ${fileWord}`;
204
+ }
205
+ if (phase.label === "Setup / shell" && phaseTargets.length > 0) {
206
+ return `${phase.label} · ${phase.count} ${phase.count === 1 ? "command" : "commands"}`;
207
+ }
208
+ return `${phase.label} ${phase.count} ${phase.count === 1 ? "action" : "actions"}`;
209
+ }
210
+ function summarizePhaseTargets(phase, width) {
211
+ const phaseTargets = uniqueTargets(phase.targets);
212
+ if (phaseTargets.length === 0)
213
+ return undefined;
214
+ const shown = phaseTargets.slice(0, 3);
215
+ const suffix = phaseTargets.length > shown.length ? ` +${phaseTargets.length - shown.length} more` : "";
216
+ return truncateToWidth(shown.join(" · ") + suffix, width, "");
217
+ }
110
218
  /**
111
219
  * Format tool args for the generic-renderer fallback. Produces a one-line
112
220
  * `k=v, k=v` summary when every value is a primitive that fits inline; falls
@@ -444,18 +552,13 @@ export class ToolExecutionComponent extends Container {
444
552
  const contentWidth = Math.max(1, frameWidth - 4);
445
553
  const frameTone = this.result?.isError ? "error" : this.isPartial || !this.result ? "pending" : "success";
446
554
  const elapsed = formatElapsed((this.endedAt ?? Date.now()) - this.startedAt);
447
- const frameStatus = `${this.isPartial || !this.result ? "Running" : this.result.isError ? "Error" : "Done"} · ${elapsed}`;
555
+ const frameStatus = `${this.isPartial || !this.result ? "running" : this.result.isError ? "failed" : "success"} · ${elapsed}`;
448
556
  const parsed = parseMcpToolName(this.toolName);
449
557
  const frameLabel = parsed
450
- ? `Tool ${parsed.server}·${parsed.tool}`
451
- : `Tool ${prettifyToolName(this.toolName, this.toolDefinition?.label) || "unknown"}`;
558
+ ? `${parsed.server}·${parsed.tool}`
559
+ : prettifyToolName(this.toolName, this.toolDefinition?.label) || "unknown";
452
560
  if (this.shouldRenderCompactSuccess()) {
453
- const availableWidth = Math.max(1, frameWidth - 2);
454
- const summaryWidth = Math.max(1, availableWidth - visibleWidth(frameStatus) - 1);
455
- const summary = truncateToWidth(this.getCompactSummary(frameLabel), summaryWidth, "");
456
- const gap = Math.max(1, availableWidth - visibleWidth(summary) - visibleWidth(frameStatus));
457
- const line = `${theme.fg("toolSuccess", summary)}${" ".repeat(gap)}${theme.fg("toolSuccess", frameStatus)}`;
458
- return ["", ...style().border("minimal").borderColor((text) => theme.fg("toolSuccess", text)).render([line], frameWidth)];
561
+ return ["", ...renderCollapsedToolRow(this.getCompactSummary(frameLabel), frameStatus, frameWidth, "success")];
459
562
  }
460
563
  const lines = super.render(contentWidth);
461
564
  const framed = renderToolFrame(lines, frameWidth, {
@@ -469,10 +572,88 @@ export class ToolExecutionComponent extends Container {
469
572
  if (this.expanded || this.isPartial || !this.result || this.result.isError)
470
573
  return false;
471
574
  const hasImages = this.result.content?.some((block) => block.type === "image") ?? false;
472
- return !hasImages && this.getTextOutput().trim().length === 0;
575
+ return !hasImages;
576
+ }
577
+ getRollupPhase() {
578
+ if (!this.shouldRenderCompactSuccess())
579
+ return null;
580
+ const label = this.getPhaseLabel();
581
+ const endedAt = this.endedAt ?? Date.now();
582
+ const target = this.getCompactTarget();
583
+ return {
584
+ label,
585
+ count: 1,
586
+ durationMs: Math.max(0, endedAt - this.startedAt),
587
+ targets: target ? [target] : undefined,
588
+ actionLabel: this.getCompactAction(),
589
+ };
590
+ }
591
+ getPhaseLabel() {
592
+ const name = this.normalizedToolName;
593
+ const displayName = prettifyToolName(this.toolName, this.toolDefinition?.label);
594
+ if (name === "bash")
595
+ return "Setup / shell";
596
+ if (name === "read" || name === "ls" || name === "find" || name === "grep")
597
+ return "Context reads";
598
+ if (name === "write" || name === "edit")
599
+ return "File changes";
600
+ if (name === "web_search" || displayName === "ToolSearch")
601
+ return "Discovery";
602
+ if (displayName === "Memory Query" || displayName === "Memory Capture" || displayName === "Gsd Graph") {
603
+ return "Memory lookups";
604
+ }
605
+ if (displayName === "Update Requirement" || displayName === "Save Requirement")
606
+ return "Requirement writes";
607
+ if (displayName.startsWith("Complete "))
608
+ return "Finalization";
609
+ return "Other tool actions";
473
610
  }
474
611
  getCompactSummary(frameLabel) {
475
- return `${frameLabel} Completed`;
612
+ if (this.normalizedToolName === "bash") {
613
+ const command = str(this.args?.command);
614
+ return command ? `bash ${formatCommandPreview(command)}` : frameLabel;
615
+ }
616
+ const target = this.getCompactTarget();
617
+ return target ? `${this.getCompactAction()} ${target}` : frameLabel;
618
+ }
619
+ getCompactAction() {
620
+ const target = this.getTargetMetadata();
621
+ if (target?.action)
622
+ return target.action === "list" ? "ls" : target.action;
623
+ return this.normalizedToolName;
624
+ }
625
+ getTargetMetadata() {
626
+ const target = this.result?.details?.target;
627
+ return target && typeof target === "object" ? target : undefined;
628
+ }
629
+ getCompactTarget() {
630
+ const metadata = this.getTargetMetadata();
631
+ const metadataTarget = metadata ? formatToolTarget(metadata) : undefined;
632
+ if (metadataTarget)
633
+ return metadataTarget;
634
+ const path = str(this.args?.file_path ?? this.args?.path);
635
+ if (path === null)
636
+ return undefined;
637
+ if (this.normalizedToolName === "read" || this.normalizedToolName === "hashline_read") {
638
+ return formatArgsPathTarget(path, this.args);
639
+ }
640
+ if (this.normalizedToolName === "write" || this.normalizedToolName === "edit") {
641
+ return path ? shortenPath(path) : undefined;
642
+ }
643
+ if (this.normalizedToolName === "ls") {
644
+ return shortenPath(path || ".");
645
+ }
646
+ if (this.normalizedToolName === "find") {
647
+ const pattern = str(this.args?.pattern);
648
+ return pattern ? `${pattern} in ${shortenPath(path || ".")}` : shortenPath(path || ".");
649
+ }
650
+ if (this.normalizedToolName === "grep") {
651
+ const pattern = str(this.args?.pattern);
652
+ const glob = str(this.args?.glob);
653
+ const label = pattern ? `${pattern} in ${shortenPath(path || ".")}` : shortenPath(path || ".");
654
+ return glob ? `${label} (${glob})` : label;
655
+ }
656
+ return undefined;
476
657
  }
477
658
  updateDisplay() {
478
659
  // Tool body now uses transparent background; status is conveyed in the frame header.
@@ -661,6 +842,10 @@ export class ToolExecutionComponent extends Container {
661
842
  // Truncation warnings
662
843
  const truncation = this.result.details?.truncation;
663
844
  const fullOutputPath = this.result.details?.fullOutputPath;
845
+ const cwd = this.result.details?.cwd;
846
+ if (this.expanded && typeof cwd === "string" && cwd.length > 0) {
847
+ this.contentBox.addChild(new Text(`\n${theme.fg("muted", `cwd ${shortenPath(cwd)}`)}`, 0, 0));
848
+ }
664
849
  if (truncation?.truncated || fullOutputPath) {
665
850
  const warnings = [];
666
851
  if (fullOutputPath) {
@@ -1045,4 +1230,28 @@ export class ToolExecutionComponent extends Container {
1045
1230
  return text;
1046
1231
  }
1047
1232
  }
1233
+ export class ToolPhaseSummaryComponent extends Container {
1234
+ constructor(phases) {
1235
+ super();
1236
+ this.phases = phases;
1237
+ }
1238
+ getPhases() {
1239
+ return this.phases.map((phase) => ({ ...phase, targets: phase.targets ? [...phase.targets] : undefined }));
1240
+ }
1241
+ render(width) {
1242
+ const frameWidth = Math.max(20, width);
1243
+ const rows = this.phases.flatMap((phase) => {
1244
+ const left = summarizePhaseLabel(phase);
1245
+ const right = `success · ${formatElapsed(phase.durationMs)}`;
1246
+ const contentWidth = Math.max(1, frameWidth - 2);
1247
+ const leftWidth = Math.max(1, contentWidth - visibleWidth(right) - 1);
1248
+ const leftText = truncateToWidth(left, leftWidth, "");
1249
+ const gap = Math.max(1, contentWidth - visibleWidth(leftText) - visibleWidth(right));
1250
+ const summaryRow = `${theme.fg("toolSuccess", leftText)}${" ".repeat(gap)}${theme.fg("toolSuccess", right)}`;
1251
+ const targetRow = summarizePhaseTargets(phase, contentWidth);
1252
+ return targetRow ? [summaryRow, theme.fg("muted", targetRow)] : [summaryRow];
1253
+ });
1254
+ return ["", ...style().border("minimal").borderColor((text) => theme.fg("toolSuccess", text)).render(rows, frameWidth)];
1255
+ }
1256
+ }
1048
1257
  //# sourceMappingURL=tool-execution.js.map