gsd-pi 2.80.0-dev.c5f2443b3 → 2.80.0-dev.d4fc28e6b

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 (580) hide show
  1. package/README.md +4 -2
  2. package/dist/cli.js +0 -19
  3. package/dist/resources/.managed-resources-content-hash +1 -1
  4. package/dist/resources/GSD-WORKFLOW.md +2 -2
  5. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +29 -0
  6. package/dist/resources/extensions/github-sync/templates.js +39 -8
  7. package/dist/resources/extensions/gsd/auto/loop.js +119 -18
  8. package/dist/resources/extensions/gsd/auto/phases.js +212 -135
  9. package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
  10. package/dist/resources/extensions/gsd/auto/run-unit.js +41 -45
  11. package/dist/resources/extensions/gsd/auto/session.js +8 -0
  12. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
  13. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
  14. package/dist/resources/extensions/gsd/auto-dashboard.js +51 -15
  15. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
  16. package/dist/resources/extensions/gsd/auto-dispatch.js +26 -0
  17. package/dist/resources/extensions/gsd/auto-post-unit.js +27 -14
  18. package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
  19. package/dist/resources/extensions/gsd/auto-recovery.js +197 -9
  20. package/dist/resources/extensions/gsd/auto-start.js +199 -9
  21. package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
  22. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
  23. package/dist/resources/extensions/gsd/auto-worktree.js +111 -1
  24. package/dist/resources/extensions/gsd/auto.js +95 -27
  25. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +103 -3
  26. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +49 -36
  27. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +15 -5
  28. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +33 -20
  29. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +7 -1
  30. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +9 -3
  31. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +8 -2
  32. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +330 -55
  33. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  34. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +129 -1
  35. package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
  36. package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
  37. package/dist/resources/extensions/gsd/commands-extract-learnings.js +17 -12
  38. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  39. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  40. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  41. package/dist/resources/extensions/gsd/custom-workflow-engine.js +22 -2
  42. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  43. package/dist/resources/extensions/gsd/db-base-schema.js +18 -2
  44. package/dist/resources/extensions/gsd/db-migration-steps.js +22 -0
  45. package/dist/resources/extensions/gsd/detection.js +106 -0
  46. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  47. package/dist/resources/extensions/gsd/git-service.js +36 -4
  48. package/dist/resources/extensions/gsd/graph.js +9 -3
  49. package/dist/resources/extensions/gsd/gsd-db.js +146 -13
  50. package/dist/resources/extensions/gsd/guided-flow.js +129 -44
  51. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  52. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  53. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  54. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  55. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  56. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  57. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  58. package/dist/resources/extensions/gsd/pr-evidence.js +57 -16
  59. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  60. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  61. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +21 -19
  62. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  63. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  64. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  65. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  66. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  67. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  68. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  69. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  70. package/dist/resources/extensions/gsd/quick.js +34 -2
  71. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  72. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  73. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  74. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  75. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  76. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  77. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  78. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  79. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  80. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  81. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  82. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  83. package/dist/resources/extensions/gsd/working-output-messages.js +64 -0
  84. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  85. package/dist/resources/extensions/gsd/worktree-resolver.js +68 -21
  86. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  87. package/dist/web/standalone/.next/BUILD_ID +1 -1
  88. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  89. package/dist/web/standalone/.next/build-manifest.json +3 -3
  90. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  91. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  109. package/dist/web/standalone/.next/server/app/index.html +1 -1
  110. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  117. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  118. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  121. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  122. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  123. package/dist/web/standalone/.next/static/chunks/{8336.6f6f30e410419aff.js → 8336.631939fb583761fa.js} +1 -1
  124. package/dist/web/standalone/.next/static/chunks/{webpack-d82dbee6356c1733.js → webpack-0481f1221120a7c6.js} +1 -1
  125. package/dist/welcome-screen.d.ts +2 -0
  126. package/dist/welcome-screen.js +9 -7
  127. package/package.json +12 -8
  128. package/packages/contracts/package.json +1 -1
  129. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  130. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  131. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  132. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  133. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  134. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  135. package/packages/native/tsconfig.tsbuildinfo +1 -1
  136. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  137. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  138. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  139. package/packages/pi-agent-core/dist/agent.d.ts +5 -0
  140. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  141. package/packages/pi-agent-core/dist/agent.js +2 -0
  142. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  143. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  144. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  145. package/packages/pi-agent-core/dist/index.js +2 -0
  146. package/packages/pi-agent-core/dist/index.js.map +1 -1
  147. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  148. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  149. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  150. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  151. package/packages/pi-agent-core/dist/types.d.ts +9 -0
  152. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  153. package/packages/pi-agent-core/dist/types.js.map +1 -1
  154. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  155. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  156. package/packages/pi-agent-core/src/agent.ts +8 -0
  157. package/packages/pi-agent-core/src/index.ts +2 -0
  158. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  159. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  160. package/packages/pi-agent-core/src/types.ts +14 -0
  161. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  162. package/packages/pi-ai/dist/models/fake-model.d.ts +12 -0
  163. package/packages/pi-ai/dist/models/fake-model.d.ts.map +1 -0
  164. package/packages/pi-ai/dist/models/fake-model.js +27 -0
  165. package/packages/pi-ai/dist/models/fake-model.js.map +1 -0
  166. package/packages/pi-ai/dist/models/index.d.ts.map +1 -1
  167. package/packages/pi-ai/dist/models/index.js +8 -0
  168. package/packages/pi-ai/dist/models/index.js.map +1 -1
  169. package/packages/pi-ai/dist/providers/fake.d.ts +42 -0
  170. package/packages/pi-ai/dist/providers/fake.d.ts.map +1 -0
  171. package/packages/pi-ai/dist/providers/fake.js +319 -0
  172. package/packages/pi-ai/dist/providers/fake.js.map +1 -0
  173. package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  174. package/packages/pi-ai/dist/providers/register-builtins.js +24 -0
  175. package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
  176. package/packages/pi-ai/src/models/fake-model.ts +30 -0
  177. package/packages/pi-ai/src/models/index.ts +9 -0
  178. package/packages/pi-ai/src/providers/fake.ts +376 -0
  179. package/packages/pi-ai/src/providers/register-builtins.ts +23 -0
  180. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  181. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +32 -0
  182. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  183. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +18 -0
  184. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  185. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +12 -0
  186. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  187. package/packages/pi-coding-agent/dist/core/agent-session.js +44 -7
  188. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  189. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +76 -0
  190. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  191. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  192. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  193. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  194. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  195. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  196. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  197. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  198. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  199. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  200. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  201. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  202. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  203. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  204. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  205. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  206. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  207. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  208. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  209. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  210. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -0
  211. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  212. package/packages/pi-coding-agent/dist/core/extensions/runner.js +20 -7
  213. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  214. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +102 -3
  215. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  216. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +39 -1
  217. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  218. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  219. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  220. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  221. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  222. package/packages/pi-coding-agent/dist/core/model-registry.js +5 -0
  223. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  224. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  225. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  226. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  227. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  228. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  229. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  230. package/packages/pi-coding-agent/dist/core/sdk.js +74 -2
  231. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  232. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +24 -0
  233. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  234. package/packages/pi-coding-agent/dist/core/settings-manager.js +33 -0
  235. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  236. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  237. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  238. package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
  239. package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
  240. package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  241. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  242. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  243. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  244. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  245. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
  246. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  247. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +54 -15
  248. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  249. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +26 -0
  250. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -0
  251. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +112 -0
  252. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -0
  253. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts +2 -0
  254. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts.map +1 -0
  255. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +51 -0
  256. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -0
  257. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  258. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  259. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  260. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +10 -9
  261. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  262. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +3 -0
  263. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  264. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +11 -0
  265. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  266. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +7 -6
  267. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +17 -0
  269. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  270. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +109 -17
  271. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  273. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +69 -2
  274. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  275. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +93 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  277. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -0
  278. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  279. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +1 -0
  280. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  281. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  282. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +3 -0
  283. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +26 -0
  285. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  286. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +20 -0
  288. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  289. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts +2 -0
  290. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts.map +1 -0
  291. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js +79 -0
  292. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js.map +1 -0
  293. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
  294. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  295. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +13 -0
  296. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  298. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  299. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +18 -1
  300. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  301. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  302. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
  303. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts +11 -0
  305. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts.map +1 -0
  306. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js +18 -0
  307. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js.map +1 -0
  308. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts +2 -0
  309. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts.map +1 -0
  310. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +48 -0
  311. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -0
  312. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  313. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  314. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +10 -0
  315. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  316. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  317. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  318. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  319. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +36 -0
  320. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +25 -0
  321. package/packages/pi-coding-agent/src/core/agent-session.ts +48 -7
  322. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +89 -0
  323. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  324. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  325. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  326. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  327. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  328. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +113 -3
  329. package/packages/pi-coding-agent/src/core/extensions/runner.ts +24 -6
  330. package/packages/pi-coding-agent/src/core/extensions/types.ts +42 -1
  331. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  332. package/packages/pi-coding-agent/src/core/model-registry.ts +4 -0
  333. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  334. package/packages/pi-coding-agent/src/core/sdk.ts +85 -3
  335. package/packages/pi-coding-agent/src/core/settings-manager.ts +51 -1
  336. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  337. package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
  338. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  339. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
  340. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +78 -15
  341. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +59 -0
  342. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +160 -0
  343. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
  344. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +10 -9
  345. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
  346. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +10 -9
  347. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +122 -17
  348. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +99 -1
  349. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +92 -3
  350. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -0
  351. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +1 -1
  352. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +28 -0
  353. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +95 -0
  354. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +24 -1
  355. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +13 -0
  356. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +32 -2
  357. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
  358. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +65 -0
  359. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +29 -0
  360. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +14 -0
  361. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  362. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  363. package/packages/pi-tui/dist/__tests__/style.test.d.ts +2 -0
  364. package/packages/pi-tui/dist/__tests__/style.test.d.ts.map +1 -0
  365. package/packages/pi-tui/dist/__tests__/style.test.js +63 -0
  366. package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -0
  367. package/packages/pi-tui/dist/__tests__/tui.test.js +24 -3
  368. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  369. package/packages/pi-tui/dist/index.d.ts +1 -0
  370. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  371. package/packages/pi-tui/dist/index.js +2 -0
  372. package/packages/pi-tui/dist/index.js.map +1 -1
  373. package/packages/pi-tui/dist/style.d.ts +41 -0
  374. package/packages/pi-tui/dist/style.d.ts.map +1 -0
  375. package/packages/pi-tui/dist/style.js +158 -0
  376. package/packages/pi-tui/dist/style.js.map +1 -0
  377. package/packages/pi-tui/dist/tui.d.ts +0 -1
  378. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  379. package/packages/pi-tui/dist/tui.js +21 -16
  380. package/packages/pi-tui/dist/tui.js.map +1 -1
  381. package/packages/pi-tui/src/__tests__/style.test.ts +76 -0
  382. package/packages/pi-tui/src/__tests__/tui.test.ts +29 -3
  383. package/packages/pi-tui/src/index.ts +9 -0
  384. package/packages/pi-tui/src/style.ts +225 -0
  385. package/packages/pi-tui/src/tui.ts +23 -16
  386. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  387. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
  388. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  389. package/pkg/dist/modes/interactive/theme/theme-schema.js +13 -0
  390. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  391. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  392. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  393. package/pkg/dist/modes/interactive/theme/theme.js +18 -1
  394. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  395. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  396. package/pkg/dist/modes/interactive/theme/themes.js +36 -27
  397. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  398. package/src/resources/GSD-WORKFLOW.md +2 -2
  399. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +30 -0
  400. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +26 -0
  401. package/src/resources/extensions/github-sync/templates.ts +38 -8
  402. package/src/resources/extensions/github-sync/tests/inline-code.test.ts +66 -0
  403. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -2
  404. package/src/resources/extensions/gsd/auto/loop.ts +151 -26
  405. package/src/resources/extensions/gsd/auto/phases.ts +289 -196
  406. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  407. package/src/resources/extensions/gsd/auto/run-unit.ts +52 -44
  408. package/src/resources/extensions/gsd/auto/session.ts +8 -0
  409. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  410. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  411. package/src/resources/extensions/gsd/auto-dashboard.ts +57 -8
  412. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  413. package/src/resources/extensions/gsd/auto-dispatch.ts +33 -0
  414. package/src/resources/extensions/gsd/auto-post-unit.ts +28 -14
  415. package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
  416. package/src/resources/extensions/gsd/auto-recovery.ts +207 -7
  417. package/src/resources/extensions/gsd/auto-start.ts +237 -15
  418. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  419. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  420. package/src/resources/extensions/gsd/auto-worktree.ts +123 -0
  421. package/src/resources/extensions/gsd/auto.ts +110 -22
  422. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +119 -2
  423. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +50 -36
  424. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +16 -5
  425. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +34 -19
  426. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +8 -1
  427. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +10 -3
  428. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +9 -2
  429. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +386 -55
  430. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  431. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +135 -1
  432. package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
  433. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  434. package/src/resources/extensions/gsd/commands-extract-learnings.ts +17 -12
  435. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  436. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  437. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  438. package/src/resources/extensions/gsd/custom-workflow-engine.ts +24 -1
  439. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  440. package/src/resources/extensions/gsd/db-base-schema.ts +19 -2
  441. package/src/resources/extensions/gsd/db-migration-steps.ts +25 -0
  442. package/src/resources/extensions/gsd/detection.ts +128 -0
  443. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  444. package/src/resources/extensions/gsd/git-service.ts +46 -8
  445. package/src/resources/extensions/gsd/graph.ts +12 -5
  446. package/src/resources/extensions/gsd/gsd-db.ts +168 -13
  447. package/src/resources/extensions/gsd/guided-flow.ts +150 -51
  448. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  449. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  450. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  451. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  452. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  453. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  454. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  455. package/src/resources/extensions/gsd/pr-evidence.ts +63 -5
  456. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  457. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  458. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  459. package/src/resources/extensions/gsd/prompts/complete-milestone.md +21 -19
  460. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  461. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  462. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  463. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  464. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  465. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  466. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  467. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  468. package/src/resources/extensions/gsd/quick.ts +37 -2
  469. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  470. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +2 -2
  471. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +7 -1
  472. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +33 -0
  473. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +516 -15
  474. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +56 -13
  475. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +184 -2
  476. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +168 -6
  477. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
  478. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +9 -0
  479. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  480. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  481. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  482. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  483. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  484. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +55 -0
  485. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  486. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +117 -7
  487. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +40 -2
  488. package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +428 -0
  489. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +2 -2
  490. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  491. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  492. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  493. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  494. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  495. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  496. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
  497. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-basic.md +52 -0
  498. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-empty-optionals.md +42 -0
  499. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +55 -0
  500. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +60 -0
  501. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +10 -0
  502. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -0
  503. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
  504. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +54 -0
  505. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +6 -3
  506. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +239 -1
  507. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  508. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  509. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  510. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
  511. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  512. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  513. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
  514. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  515. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
  516. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
  517. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  518. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  519. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  520. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  521. package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +102 -0
  522. package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +165 -0
  523. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  524. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  525. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  526. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +19 -0
  527. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +3 -3
  528. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  529. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +38 -17
  530. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  531. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  532. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  533. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  534. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  535. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
  536. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  537. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +38 -0
  538. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  539. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +101 -2
  540. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
  541. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +9 -0
  542. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  543. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  544. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  545. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  546. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  547. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  548. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -4
  549. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  550. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  551. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  552. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  553. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  554. package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +93 -0
  555. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +37 -6
  556. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
  557. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  558. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  559. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  560. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  561. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +167 -4
  562. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +179 -0
  563. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  564. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  565. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  566. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  567. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  568. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  569. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  570. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  571. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  572. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  573. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  574. package/src/resources/extensions/gsd/working-output-messages.ts +120 -0
  575. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  576. package/src/resources/extensions/gsd/worktree-resolver.ts +85 -19
  577. package/packages/contracts/tsconfig.tsbuildinfo +0 -1
  578. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +0 -97
  579. /package/dist/web/standalone/.next/static/{bQDK5_LtkGVS64AirQgQG → cWaxzf-sdbSSbbwYu8q7a}/_buildManifest.js +0 -0
  580. /package/dist/web/standalone/.next/static/{bQDK5_LtkGVS64AirQgQG → cWaxzf-sdbSSbbwYu8q7a}/_ssgManifest.js +0 -0
@@ -38,8 +38,53 @@ export function canRestoreSessionModel(
38
38
  ): boolean {
39
39
  return modelRegistry.isProviderRequestReady(model.provider);
40
40
  }
41
- import { Agent, type AgentMessage, type ThinkingLevel } from "@gsd/pi-agent-core";
42
- import type { Message, Model } from "@gsd/pi-ai";
41
+
42
+ const PROVIDER_TOOL_LIMITS: Record<string, number> = {
43
+ groq: 128,
44
+ };
45
+
46
+ function resolveProviderToolLimit(
47
+ providerCaps: ReturnType<typeof getProviderCapabilities>,
48
+ provider: string | undefined,
49
+ ): number {
50
+ if (provider && PROVIDER_TOOL_LIMITS[provider]) {
51
+ return PROVIDER_TOOL_LIMITS[provider];
52
+ }
53
+ return providerCaps.maxTools > 0 ? providerCaps.maxTools : 0;
54
+ }
55
+
56
+ export function filterToolsForProviderRequest(
57
+ tools: AgentTool[],
58
+ model: Pick<Model<any>, "api" | "provider">,
59
+ ): { compatible: AgentTool[]; filtered: AgentTool[] } {
60
+ const providerCaps = getProviderCapabilities(model.api);
61
+ if (!providerCaps.toolCalling) {
62
+ return { compatible: [], filtered: tools };
63
+ }
64
+
65
+ const compatible: AgentTool[] = [];
66
+ const filtered: AgentTool[] = [];
67
+ for (const tool of tools) {
68
+ const compat = getToolCompatibility(tool.name);
69
+ if (
70
+ (compat?.producesImages && !providerCaps.imageToolResults) ||
71
+ compat?.schemaFeatures?.some((feature) => providerCaps.unsupportedSchemaFeatures.includes(feature))
72
+ ) {
73
+ filtered.push(tool);
74
+ } else {
75
+ compatible.push(tool);
76
+ }
77
+ }
78
+
79
+ const toolLimit = resolveProviderToolLimit(providerCaps, model.provider);
80
+ if (toolLimit > 0 && compatible.length > toolLimit) {
81
+ filtered.push(...compatible.splice(toolLimit));
82
+ }
83
+
84
+ return { compatible, filtered };
85
+ }
86
+ import { Agent, maybeLogProviderPayloadAudit, type AgentMessage, type AgentTool, type ThinkingLevel } from "@gsd/pi-agent-core";
87
+ import { getProviderCapabilities, type Message, type Model } from "@gsd/pi-ai";
43
88
  import { getAgentDir, getDocsPath } from "../config.js";
44
89
  import { AgentSession } from "./agent-session.js";
45
90
  import { AuthStorage } from "./auth-storage.js";
@@ -82,6 +127,22 @@ import {
82
127
  type ToolName,
83
128
  writeTool,
84
129
  } from "./tools/index.js";
130
+ import { getToolCompatibility } from "./tools/tool-compatibility-registry.js";
131
+
132
+ export function getAdjustToolSetRequestCustomMessages(
133
+ messages: readonly AgentMessage[] | undefined,
134
+ ): Array<{ index: number; customType: string }> {
135
+ if (!messages) return [];
136
+ const requestMessages: Array<{ index: number; customType: string }> = [];
137
+ for (let index = messages.length - 1; index >= 0; index--) {
138
+ const message = messages[index] as { role?: unknown; customType?: unknown };
139
+ if (message?.role === "assistant") break;
140
+ if (message?.role === "custom" && typeof message.customType === "string") {
141
+ requestMessages.push({ index, customType: message.customType });
142
+ }
143
+ }
144
+ return requestMessages.reverse();
145
+ }
85
146
 
86
147
  export interface CreateAgentSessionOptions {
87
148
  /** Working directory for project-local discovery. Default: process.cwd() */
@@ -390,9 +451,12 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
390
451
  onPayload: async (payload, currentModel) => {
391
452
  const runner = extensionRunnerRef.current;
392
453
  if (!runner?.hasHandlers("before_provider_request")) {
454
+ maybeLogProviderPayloadAudit(payload, "before_provider_request:unchanged");
393
455
  return payload;
394
456
  }
395
- return runner.emitBeforeProviderRequest(payload, currentModel);
457
+ const nextPayload = await runner.emitBeforeProviderRequest(payload, currentModel);
458
+ maybeLogProviderPayloadAudit(nextPayload, "before_provider_request:after");
459
+ return nextPayload;
396
460
  },
397
461
  sessionId: sessionManager.getSessionId(),
398
462
  transformContext: async (messages) => {
@@ -400,6 +464,24 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
400
464
  if (!runner) return messages;
401
465
  return runner.emitContext(messages);
402
466
  },
467
+ filterTools: async (tools, _signal, messages) => {
468
+ const currentModel = agent.state.activeInferenceModel ?? agent.state.model ?? model;
469
+ if (!currentModel) return tools;
470
+ const providerFiltered = filterToolsForProviderRequest(tools, currentModel);
471
+ const runner = extensionRunnerRef.current;
472
+ if (!runner?.hasHandlers("adjust_tool_set")) return providerFiltered.compatible;
473
+ const result = await runner.emitAdjustToolSet({
474
+ selectedModelApi: currentModel.api,
475
+ selectedModelProvider: currentModel.provider,
476
+ selectedModelId: currentModel.id,
477
+ activeToolNames: providerFiltered.compatible.map((tool) => tool.name),
478
+ filteredTools: providerFiltered.filtered.map((tool) => tool.name),
479
+ requestCustomMessages: getAdjustToolSetRequestCustomMessages(messages),
480
+ });
481
+ if (!result?.toolNames) return providerFiltered.compatible;
482
+ const allowedNames = new Set(result.toolNames);
483
+ return providerFiltered.compatible.filter((tool) => allowedNames.has(tool.name));
484
+ },
403
485
  steeringMode: settingsManager.getSteeringMode(),
404
486
  followUpMode: settingsManager.getFollowUpMode(),
405
487
  transport: settingsManager.getTransport(),
@@ -15,6 +15,13 @@ export interface CompactionSettings {
15
15
  enabled?: boolean; // default: true
16
16
  reserveTokens?: number; // default: 16384
17
17
  keepRecentTokens?: number; // default: 20000
18
+ /**
19
+ * Optional percent-of-context-window trigger (0 < value < 1). When set,
20
+ * compaction fires at `contextWindow * thresholdPercent` and overrides
21
+ * `reserveTokens`. Typically set as a runtime override by host integrations
22
+ * (see `setCompactionThresholdOverride`) and not persisted by users directly.
23
+ */
24
+ thresholdPercent?: number;
18
25
  }
19
26
 
20
27
  export interface BranchSummarySettings {
@@ -32,6 +39,7 @@ export interface RetrySettings {
32
39
  export interface TerminalSettings {
33
40
  showImages?: boolean; // default: true (only relevant if terminal supports images)
34
41
  clearOnShrink?: boolean; // default: false (clear empty rows when content shrinks)
42
+ adaptiveMode?: AdaptiveTuiMode; // default: "auto"
35
43
  }
36
44
 
37
45
  export interface ImageSettings {
@@ -149,6 +157,7 @@ export interface HooksSettings {
149
157
  }
150
158
 
151
159
  export type TransportSetting = Transport;
160
+ export type AdaptiveTuiMode = "auto" | "chat" | "workflow" | "validation" | "debug" | "compact";
152
161
 
153
162
  /**
154
163
  * Package source for npm/git packages.
@@ -810,11 +819,42 @@ export class SettingsManager {
810
819
  return this.settings.compaction?.keepRecentTokens ?? COMPACTION_KEEP_RECENT_TOKENS;
811
820
  }
812
821
 
813
- getCompactionSettings(): { enabled: boolean; reserveTokens: number; keepRecentTokens: number } {
822
+ getCompactionThresholdPercent(): number | undefined {
823
+ return this.settings.compaction?.thresholdPercent;
824
+ }
825
+
826
+ /**
827
+ * Set or clear an in-memory compaction threshold-percent override.
828
+ *
829
+ * Applied to `this.settings` only; never persisted to disk. Pass `undefined`
830
+ * to clear a previously set override (necessary for idempotent re-sync from
831
+ * host integrations whose preference may have been removed).
832
+ *
833
+ * Direct mutation is used instead of `applyOverrides()` because deep-merge
834
+ * semantics skip `undefined` values, which would prevent clearing.
835
+ */
836
+ setCompactionThresholdOverride(percent: number | undefined): void {
837
+ if (!this.settings.compaction) {
838
+ this.settings.compaction = {};
839
+ }
840
+ if (percent === undefined) {
841
+ delete this.settings.compaction.thresholdPercent;
842
+ } else {
843
+ this.settings.compaction.thresholdPercent = percent;
844
+ }
845
+ }
846
+
847
+ getCompactionSettings(): {
848
+ enabled: boolean;
849
+ reserveTokens: number;
850
+ keepRecentTokens: number;
851
+ thresholdPercent?: number;
852
+ } {
814
853
  return {
815
854
  enabled: this.getCompactionEnabled(),
816
855
  reserveTokens: this.getCompactionReserveTokens(),
817
856
  keepRecentTokens: this.getCompactionKeepRecentTokens(),
857
+ thresholdPercent: this.getCompactionThresholdPercent(),
818
858
  };
819
859
  }
820
860
 
@@ -978,6 +1018,16 @@ export class SettingsManager {
978
1018
  this.setNestedGlobalSetting("terminal", "clearOnShrink", enabled);
979
1019
  }
980
1020
 
1021
+ getAdaptiveMode(): AdaptiveTuiMode {
1022
+ const mode = this.settings.terminal?.adaptiveMode;
1023
+ const valid: AdaptiveTuiMode[] = ["auto", "chat", "workflow", "validation", "debug", "compact"];
1024
+ return mode && valid.includes(mode) ? mode : "auto";
1025
+ }
1026
+
1027
+ setAdaptiveMode(mode: AdaptiveTuiMode): void {
1028
+ this.setNestedGlobalSetting("terminal", "adaptiveMode", mode);
1029
+ }
1030
+
981
1031
  getImageAutoResize(): boolean {
982
1032
  return this.settings.images?.autoResize ?? true;
983
1033
  }
@@ -1,3 +1,6 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Tests skill invocation and prompt-only skill visibility behavior.
3
+
1
4
  import assert from "node:assert/strict";
2
5
  import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
3
6
  import { tmpdir } from "node:os";
@@ -86,4 +89,29 @@ describe("Skill tool", () => {
86
89
  assert.match(message, /^Skill "nonexistent" not found\. Available skills: /);
87
90
  assert.match(message, /swift-testing/);
88
91
  });
92
+
93
+ it("filters skill catalog without unloading skills or disabling Skill tool", async () => {
94
+ writeSkill(testDir, "alpha", "Use alpha.");
95
+ writeSkill(testDir, "beta", "Use beta.");
96
+ const session = await createSession();
97
+
98
+ assert.match(session.systemPrompt, /<name>alpha<\/name>/);
99
+ assert.match(session.systemPrompt, /<name>beta<\/name>/);
100
+
101
+ session.setVisibleSkillsByName(["alpha"]);
102
+ assert.deepEqual(session.getVisibleSkillNames(), ["alpha"]);
103
+ assert.match(session.systemPrompt, /<name>alpha<\/name>/);
104
+ assert.doesNotMatch(session.systemPrompt, /<name>beta<\/name>/);
105
+
106
+ const tool = session.state.tools.find((entry) => entry.name === "Skill");
107
+ assert.ok(tool, "Skill tool should remain active");
108
+ const result = await tool.execute("call-3", { skill: "beta" });
109
+ const text = result.content[0]?.type === "text" ? result.content[0].text : "";
110
+ assert.match(text, /<skill name="beta"/);
111
+
112
+ session.setVisibleSkillsByName(undefined);
113
+ assert.equal(session.getVisibleSkillNames(), undefined);
114
+ assert.match(session.systemPrompt, /<name>alpha<\/name>/);
115
+ assert.match(session.systemPrompt, /<name>beta<\/name>/);
116
+ });
89
117
  });
@@ -38,5 +38,6 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
38
38
  { name: "thinking", description: "Set thinking level (off/minimal/low/medium/high/xhigh)" },
39
39
  { name: "edit-mode", description: "Toggle edit mode (standard/hashline)" },
40
40
  { name: "terminal", description: "Run a shell command directly (e.g. /terminal ping -c3 1.1.1.1)" },
41
+ { name: "tui", description: "Configure TUI layout mode (e.g. /tui mode workflow)" },
41
42
  { name: "quit", description: "Quit pi" },
42
43
  ];
@@ -59,13 +59,12 @@ export interface BuildSystemPromptOptions {
59
59
  * Append a `Current date and time: <toLocaleString>` line to the system
60
60
  * prompt. Default: `false`.
61
61
  *
62
- * Anthropic prompt caching matches on byte-for-byte prefix equality.
63
- * Embedding a per-call timestamp in the system prompt invalidates the
64
- * cache on every request, forcing a full re-write that costs *more*
65
- * than an uncached call (cache-write premium). Most agentic flows do
66
- * not need wall-clock awareness in the system prompt opt in only
67
- * when the consumer genuinely needs it (e.g. a clock-sensitive agent),
68
- * and inject it via a non-cached channel (user message) when possible.
62
+ * Provider prompt caches generally depend on stable prompt prefixes.
63
+ * Embedding a per-call timestamp in the system prompt invalidates that
64
+ * stability on every request, often forcing full prompt reprocessing.
65
+ * Most agentic flows do not need wall-clock awareness in the system
66
+ * prompt opt in only when the consumer genuinely needs it, and inject
67
+ * it via a non-cached channel (user message) when possible.
69
68
  */
70
69
  includeDateTime?: boolean;
71
70
  }
@@ -86,9 +85,8 @@ export function buildSystemPrompt(options: BuildSystemPromptOptions = {}): strin
86
85
  } = options;
87
86
  const resolvedCwd = toPosixPath(cwd ?? process.cwd());
88
87
 
89
- // Per-call timestamps invalidate Anthropic prompt caching (the cache
90
- // matches on byte-for-byte prefix equality). Compute lazily and only
91
- // when explicitly opted in via `includeDateTime`.
88
+ // Per-call timestamps invalidate provider prompt cache stability. Compute
89
+ // lazily and only when explicitly opted in via `includeDateTime`.
92
90
  const dateTimeLine = includeDateTime
93
91
  ? `\nCurrent date and time: ${new Date().toLocaleString("en-US", {
94
92
  weekday: "long",
@@ -1,3 +1,4 @@
1
+ // GSD2 TUI Tests - Chat frame card visual contract coverage.
1
2
  import { test, describe } from "node:test";
2
3
  import assert from "node:assert/strict";
3
4
  import stripAnsi from "strip-ansi";
@@ -8,12 +9,12 @@ initTheme("dark", false);
8
9
 
9
10
  // Regression tests for the "compaction" tone added to renderChatFrame.
10
11
  // The compaction notice shares the same visual frame as user / assistant
11
- // messages (top rule, `• label` header, `│ ` body prefix) but uses the
12
+ // messages (top rule, label header, `│ ` body prefix) but uses the
12
13
  // purple `customMessageLabel` color key so it is visually distinct from
13
14
  // conversation turns.
14
15
 
15
16
  describe("renderChatFrame — compaction tone", () => {
16
- test("produces a top rule, `• compaction` header row, and a │ body margin", () => {
17
+ test("produces a top rule, compaction header row, and a │ body margin", () => {
17
18
  const lines = renderChatFrame(
18
19
  ["Compacted from 1,224,262 tokens (ctrl+o to expand)"],
19
20
  60,
@@ -33,11 +34,12 @@ describe("renderChatFrame — compaction tone", () => {
33
34
  // Top rule is a solid horizontal bar
34
35
  assert.match(plain[0], /^─+$/, "first line should be the solid top rule");
35
36
 
36
- // Header row contains `• compaction`
37
+ // Header row contains `compaction`
37
38
  assert.ok(
38
- plain[1].includes("compaction"),
39
- `expected header to contain "compaction", got ${JSON.stringify(plain[1])}`,
39
+ plain[1].includes("compaction"),
40
+ `expected header to contain "compaction", got ${JSON.stringify(plain[1])}`,
40
41
  );
42
+ assert.ok(!plain[1].includes("•"), `header should not render a bullet prefix, got ${JSON.stringify(plain[1])}`);
41
43
 
42
44
  // Body line(s) start with `│ `
43
45
  assert.ok(
@@ -1,7 +1,8 @@
1
+ // GSD-2 Interactive Tool Execution Rendering Tests
1
2
  import { describe, test } from "node:test";
2
3
  import assert from "node:assert/strict";
3
4
  import stripAnsi from "strip-ansi";
4
- import { ToolExecutionComponent } from "../tool-execution.js";
5
+ import { ToolExecutionComponent, ToolPhaseSummaryComponent, type ToolExecutionPhase } from "../tool-execution.js";
5
6
  import { initTheme } from "../../theme/theme.js";
6
7
 
7
8
  initTheme("dark", false);
@@ -50,25 +51,85 @@ function renderToolCollapsed(
50
51
  }
51
52
 
52
53
  describe("ToolExecutionComponent", () => {
53
- test("renders framed header with Running status while tool is partial", () => {
54
+ test("renders framed header with running status while tool is partial", () => {
54
55
  const rendered = renderToolCollapsed("mcp__demo__do_thing", { ok: true });
55
56
 
56
- assert.match(rendered, /Tool demo\u00b7do_thing/);
57
- assert.match(rendered, /Running/);
57
+ assert.match(rendered, /demo\u00b7do_thing/);
58
+ assert.doesNotMatch(rendered, /Tool demo\u00b7do_thing/);
59
+ assert.match(rendered, /running/);
60
+ assert.match(rendered, /running · \d+(ms|s)/);
58
61
  });
59
62
 
60
- test("renders framed header with Error status for failed tool result", () => {
63
+ test("renders framed header with failed status for failed tool result", () => {
61
64
  const rendered = renderTool(
62
65
  "mcp__demo__do_thing",
63
66
  { ok: true },
64
67
  { content: [{ type: "text", text: "boom" }], isError: true },
65
68
  );
66
69
 
67
- assert.match(rendered, /Tool demo\u00b7do_thing/);
68
- assert.match(rendered, /Error/);
70
+ assert.match(rendered, /demo\u00b7do_thing/);
71
+ assert.doesNotMatch(rendered, /Tool demo\u00b7do_thing/);
72
+ assert.match(rendered, /failed/);
73
+ assert.match(rendered, /failed · \d+(ms|s)/);
69
74
  assert.match(rendered, /boom/);
70
75
  });
71
76
 
77
+ test("collapses successful low-signal tool cards by default", () => {
78
+ const rendered = renderToolCollapsed(
79
+ "mcp__demo__noop",
80
+ { ok: true },
81
+ { content: [], isError: false },
82
+ );
83
+
84
+ assert.match(rendered, /success · \d+(ms|s)/);
85
+ assert.match(rendered, /demo\u00b7noop/);
86
+ assert.doesNotMatch(rendered, /Completed/);
87
+ assert.doesNotMatch(rendered, /ok=true/);
88
+ });
89
+
90
+ test("exposes phase metadata for successful low-signal tool rows", () => {
91
+ const component = new ToolExecutionComponent(
92
+ "gsd_requirement_update",
93
+ { id: "R001" },
94
+ {},
95
+ { label: "Update Requirement" } as any,
96
+ { requestRender() {} } as any,
97
+ );
98
+ component.updateResult({ content: [], isError: false });
99
+
100
+ assert.deepEqual(component.getRollupPhase()?.label, "Requirement writes");
101
+ });
102
+
103
+ test("exposes phase metadata for collapsed output-bearing generic tools", () => {
104
+ const component = new ToolExecutionComponent(
105
+ "mcp__demo__do_thing",
106
+ { ok: true },
107
+ {},
108
+ undefined,
109
+ { requestRender() {} } as any,
110
+ );
111
+ component.updateResult({ content: [{ type: "text", text: "important output" }], isError: false });
112
+
113
+ assert.deepEqual(component.getRollupPhase()?.label, "Other tool actions");
114
+ });
115
+
116
+ test("renders phase-based summaries for rolled-up tool executions", () => {
117
+ const phases: ToolExecutionPhase[] = [
118
+ { label: "Setup / shell", count: 6, durationMs: 12 },
119
+ { label: "Context reads", count: 4, durationMs: 6 },
120
+ { label: "Requirement writes", count: 4, durationMs: 4 },
121
+ { label: "Memory lookups", count: 4, durationMs: 4 },
122
+ { label: "Finalization", count: 1, durationMs: 1 },
123
+ ];
124
+ const rendered = stripAnsi(new ToolPhaseSummaryComponent(phases).render(120).join("\n"));
125
+
126
+ assert.match(rendered, /Setup \/ shell 6 actions\s+success · 12ms/);
127
+ assert.match(rendered, /Context reads 4 actions\s+success · 6ms/);
128
+ assert.match(rendered, /Requirement writes 4 actions\s+success · 4ms/);
129
+ assert.match(rendered, /Memory lookups 4 actions\s+success · 4ms/);
130
+ assert.match(rendered, /Finalization 1 action\s+success · 1ms/);
131
+ });
132
+
72
133
  test("passes failed result status to custom result renderers", () => {
73
134
  const rendered = renderTool(
74
135
  "gsd_requirement_save",
@@ -85,7 +146,7 @@ describe("ToolExecutionComponent", () => {
85
146
  },
86
147
  );
87
148
 
88
- assert.match(rendered, /Error/);
149
+ assert.match(rendered, /failed/);
89
150
  assert.match(rendered, /custom saw error/);
90
151
  assert.doesNotMatch(rendered, /custom saw success/);
91
152
  });
@@ -148,14 +209,16 @@ describe("ToolExecutionComponent", () => {
148
209
  { label: "Complete Slice" },
149
210
  );
150
211
 
151
- assert.match(rendered, /Tool Complete Slice/);
212
+ assert.match(rendered, /Complete Slice/);
213
+ assert.doesNotMatch(rendered, /Tool Complete Slice/);
152
214
  assert.doesNotMatch(rendered, /gsd_slice_complete/);
153
215
  });
154
216
 
155
217
  test("frame header strips gsd_ prefix and title-cases when no label is registered", () => {
156
218
  const rendered = renderToolCollapsed("gsd_requirement_update", { id: "R005" });
157
219
 
158
- assert.match(rendered, /Tool Requirement Update/);
220
+ assert.match(rendered, /Requirement Update/);
221
+ assert.doesNotMatch(rendered, /Tool Requirement Update/);
159
222
  assert.doesNotMatch(rendered, /gsd_requirement_update/);
160
223
  });
161
224
 
@@ -184,7 +247,7 @@ describe("ToolExecutionComponent", () => {
184
247
  assert.doesNotMatch(rendered, /…/);
185
248
  });
186
249
 
187
- test("generic fallback truncates long output when collapsed", () => {
250
+ test("generic fallback collapses successful output rows until expanded", () => {
188
251
  const longOutput = Array.from({ length: 25 }, (_, i) => `line ${i + 1}`).join("\n");
189
252
  const rendered = renderToolCollapsed(
190
253
  "mcp__demo__do_thing",
@@ -192,10 +255,10 @@ describe("ToolExecutionComponent", () => {
192
255
  { content: [{ type: "text", text: longOutput }], isError: false },
193
256
  );
194
257
 
195
- assert.match(rendered, /line 1\b/);
196
- assert.match(rendered, /line 10\b/);
197
- assert.doesNotMatch(rendered, /line 20\b/);
198
- assert.match(rendered, /\(15 more lines/);
258
+ assert.match(rendered, /demo\u00b7do_thing/);
259
+ assert.match(rendered, /success · \d+(ms|s)/);
260
+ assert.doesNotMatch(rendered, /line 1\b/);
261
+ assert.doesNotMatch(rendered, /\(15 more lines/);
199
262
  });
200
263
 
201
264
  test("generic fallback falls back to truncated JSON for complex args", () => {
@@ -0,0 +1,59 @@
1
+ // GSD2 - Runtime tests for adaptive terminal layout rendering
2
+
3
+ import assert from "node:assert/strict";
4
+ import { describe, it, before } from "node:test";
5
+ import stripAnsi from "strip-ansi";
6
+ import { AdaptiveLayoutComponent } from "./adaptive-layout.js";
7
+ import { initTheme } from "../theme/theme.js";
8
+
9
+ before(() => {
10
+ initTheme("dark", false);
11
+ });
12
+
13
+ function render(component: AdaptiveLayoutComponent, width: number): string {
14
+ return component.render(width).map(stripAnsi).join("\n");
15
+ }
16
+
17
+ describe("AdaptiveLayoutComponent", () => {
18
+ it("renders workflow command center and inspector on wide terminals", () => {
19
+ const component = new AdaptiveLayoutComponent(() => ({
20
+ override: "workflow",
21
+ activeToolCount: 2,
22
+ gsdPhase: "executing milestone M001",
23
+ sessionName: "demo",
24
+ cwd: "/tmp/demo",
25
+ }));
26
+
27
+ const output = render(component, 132);
28
+ assert.match(output, /GSD Command Center/);
29
+ assert.match(output, /signals/);
30
+ assert.match(output, /2 running/);
31
+ });
32
+
33
+ it("falls back to a single compact row for narrow workflow terminals", () => {
34
+ const component = new AdaptiveLayoutComponent(() => ({
35
+ override: "workflow",
36
+ activeToolCount: 1,
37
+ gsdPhase: "executing milestone M001",
38
+ cwd: "/tmp/demo",
39
+ }));
40
+
41
+ const output = render(component, 68);
42
+ assert.match(output, /GSD compact/);
43
+ assert.doesNotMatch(output, /signals/);
44
+ });
45
+
46
+ it("renders blocking failure context in debug mode", () => {
47
+ const component = new AdaptiveLayoutComponent(() => ({
48
+ override: "auto",
49
+ activeToolCount: 0,
50
+ lastError: "Cannot find module @gsd/native",
51
+ cwd: "/tmp/demo",
52
+ }));
53
+
54
+ const output = render(component, 120);
55
+ assert.match(output, /blocking failure/);
56
+ assert.match(output, /Cannot find module/);
57
+ assert.match(output, /inspect the failed output/);
58
+ });
59
+ });