gsd-pi 2.78.1-dev.84a383f51 → 2.78.1

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 (474) hide show
  1. package/README.md +7 -7
  2. package/dist/cli.js +55 -95
  3. package/dist/headless-query.d.ts +0 -22
  4. package/dist/headless-query.js +4 -24
  5. package/dist/headless.d.ts +0 -10
  6. package/dist/headless.js +1 -16
  7. package/dist/loader.js +10 -7
  8. package/dist/onboarding.d.ts +0 -10
  9. package/dist/onboarding.js +2 -2
  10. package/dist/provider-migrations.d.ts +2 -2
  11. package/dist/provider-migrations.js +2 -5
  12. package/dist/resource-loader.d.ts +2 -5
  13. package/dist/resource-loader.js +5 -28
  14. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +601 -0
  15. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +651 -0
  16. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +91 -0
  17. package/dist/resources/extensions/gsd/auto/loop.js +0 -23
  18. package/dist/resources/extensions/gsd/auto/phases.js +2 -2
  19. package/dist/resources/extensions/gsd/auto/run-unit.js +1 -3
  20. package/dist/resources/extensions/gsd/auto/session.js +0 -3
  21. package/dist/resources/extensions/gsd/auto-recovery.js +4 -43
  22. package/dist/resources/extensions/gsd/auto-start.js +1 -1
  23. package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -2
  24. package/dist/resources/extensions/gsd/auto-worktree.js +0 -30
  25. package/dist/resources/extensions/gsd/auto.js +5 -14
  26. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +2 -14
  27. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +5 -7
  28. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  29. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +4 -5
  30. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +31 -94
  31. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +6 -11
  32. package/dist/resources/extensions/gsd/bootstrap/system-context.js +8 -34
  33. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +2 -38
  34. package/dist/resources/extensions/gsd/commands/catalog.js +5 -69
  35. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -22
  36. package/dist/resources/extensions/gsd/commands-mcp-status.js +1 -3
  37. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -10
  38. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  39. package/dist/resources/extensions/gsd/docs/preferences-reference.md +0 -4
  40. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +1 -39
  41. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  42. package/dist/resources/extensions/gsd/forensics.js +2 -2
  43. package/dist/resources/extensions/gsd/git-service.js +5 -12
  44. package/dist/resources/extensions/gsd/gsd-db.js +2 -11
  45. package/dist/resources/extensions/gsd/guided-flow.js +23 -23
  46. package/dist/resources/extensions/gsd/memory-store.js +31 -66
  47. package/dist/resources/extensions/gsd/model-router.js +9 -114
  48. package/dist/resources/extensions/gsd/native-git-bridge.js +1 -7
  49. package/dist/resources/extensions/gsd/preferences-models.js +15 -91
  50. package/dist/resources/extensions/gsd/preferences-types.js +0 -2
  51. package/dist/resources/extensions/gsd/preferences-validation.js +0 -32
  52. package/dist/resources/extensions/gsd/preferences.js +3 -5
  53. package/dist/resources/extensions/gsd/prompt-loader.js +12 -23
  54. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -9
  55. package/dist/resources/extensions/gsd/state.js +0 -42
  56. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +0 -1
  57. package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +53 -0
  58. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +112 -0
  59. package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +23 -0
  60. package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +5 -0
  61. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -18
  62. package/dist/resources/extensions/gsd/visualizer-overlay.js +1 -1
  63. package/dist/resources/extensions/gsd/watch/header-renderer.js +1 -3
  64. package/dist/resources/extensions/gsd/worktree-command.js +46 -26
  65. package/dist/resources/extensions/mcp-client/index.js +3 -6
  66. package/dist/resources/extensions/slash-commands/create-extension.js +22 -36
  67. package/dist/resources/skills/create-gsd-extension/SKILL.md +5 -9
  68. package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
  69. package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
  70. package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
  71. package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
  72. package/dist/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
  73. package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
  74. package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
  75. package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +12 -32
  76. package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
  77. package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +608 -0
  78. package/dist/rtk-shared.d.ts +0 -3
  79. package/dist/rtk-shared.js +0 -17
  80. package/dist/rtk.d.ts +5 -2
  81. package/dist/rtk.js +20 -3
  82. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  83. package/dist/web/standalone/.next/BUILD_ID +1 -1
  84. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  85. package/dist/web/standalone/.next/build-manifest.json +4 -4
  86. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  87. package/dist/web/standalone/.next/react-loadable-manifest.json +4 -44
  88. package/dist/web/standalone/.next/required-server-files.json +3 -3
  89. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  90. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  100. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  116. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  128. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  148. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  158. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -4
  164. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  178. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  180. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  182. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  184. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/index.html +1 -1
  194. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  195. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  196. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  197. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  198. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  199. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  200. package/dist/web/standalone/.next/server/app/page.js +2 -2
  201. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  203. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  204. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  205. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  207. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/middleware.js +2 -2
  209. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  211. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  212. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  213. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  214. package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
  215. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +11 -0
  216. package/dist/web/standalone/.next/static/chunks/3621.fc7480022c972438.js +20 -0
  217. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
  218. package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
  219. package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +1 -0
  220. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
  221. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
  222. package/dist/web/standalone/.next/static/chunks/webpack-2e68521d7c82f7c2.js +1 -0
  223. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  224. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  225. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  226. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  227. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  228. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  229. package/dist/web/standalone/package.json +1 -2
  230. package/dist/web/standalone/server.js +1 -1
  231. package/package.json +1 -1
  232. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  233. package/packages/mcp-server/dist/workflow-tools.js +46 -74
  234. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  235. package/packages/mcp-server/src/workflow-tools.test.ts +0 -26
  236. package/packages/mcp-server/src/workflow-tools.ts +58 -93
  237. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  238. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  239. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  240. package/packages/pi-ai/dist/providers/anthropic-shared.js +19 -48
  241. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  242. package/packages/pi-ai/dist/types.d.ts +0 -13
  243. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  244. package/packages/pi-ai/dist/types.js.map +1 -1
  245. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -1
  246. package/packages/pi-ai/dist/utils/repair-tool-json.js +3 -24
  247. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -1
  248. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +0 -26
  249. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -1
  250. package/packages/pi-ai/src/providers/anthropic-shared.ts +20 -52
  251. package/packages/pi-ai/src/types.ts +0 -13
  252. package/packages/pi-ai/src/utils/repair-tool-json.ts +3 -24
  253. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +0 -32
  254. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  255. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  256. package/packages/pi-coding-agent/dist/core/agent-session.js +0 -6
  257. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  258. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/messages.js +0 -4
  260. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +2 -19
  262. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +0 -10
  264. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/model-registry.js +0 -18
  266. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +0 -13
  268. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/system-prompt.js +16 -20
  270. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  271. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +1 -1
  272. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  273. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -14
  274. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  275. package/packages/pi-coding-agent/src/core/agent-session.ts +0 -7
  276. package/packages/pi-coding-agent/src/core/messages.ts +0 -4
  277. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +2 -32
  278. package/packages/pi-coding-agent/src/core/model-registry.ts +0 -21
  279. package/packages/pi-coding-agent/src/core/system-prompt.ts +15 -33
  280. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -17
  281. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +1 -1
  282. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  283. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +3 -17
  284. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  285. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +3 -20
  286. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  287. package/src/resources/extensions/gsd/auto/loop.ts +2 -24
  288. package/src/resources/extensions/gsd/auto/phases.ts +3 -3
  289. package/src/resources/extensions/gsd/auto/run-unit.ts +1 -3
  290. package/src/resources/extensions/gsd/auto/session.ts +0 -3
  291. package/src/resources/extensions/gsd/auto/types.ts +0 -1
  292. package/src/resources/extensions/gsd/auto-recovery.ts +8 -46
  293. package/src/resources/extensions/gsd/auto-start.ts +1 -1
  294. package/src/resources/extensions/gsd/auto-tool-tracking.ts +4 -2
  295. package/src/resources/extensions/gsd/auto-worktree.ts +0 -38
  296. package/src/resources/extensions/gsd/auto.ts +4 -14
  297. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -15
  298. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +7 -8
  299. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  300. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +9 -10
  301. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +31 -102
  302. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +6 -12
  303. package/src/resources/extensions/gsd/bootstrap/system-context.ts +8 -39
  304. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +11 -39
  305. package/src/resources/extensions/gsd/commands/catalog.ts +5 -75
  306. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -22
  307. package/src/resources/extensions/gsd/commands-mcp-status.ts +1 -3
  308. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -15
  309. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  310. package/src/resources/extensions/gsd/docs/preferences-reference.md +0 -4
  311. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +1 -39
  312. package/src/resources/extensions/gsd/doctor-types.ts +1 -3
  313. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  314. package/src/resources/extensions/gsd/forensics.ts +2 -2
  315. package/src/resources/extensions/gsd/git-service.ts +5 -13
  316. package/src/resources/extensions/gsd/gsd-db.ts +2 -12
  317. package/src/resources/extensions/gsd/guided-flow.ts +25 -25
  318. package/src/resources/extensions/gsd/memory-store.ts +28 -81
  319. package/src/resources/extensions/gsd/model-router.ts +9 -172
  320. package/src/resources/extensions/gsd/native-git-bridge.ts +1 -7
  321. package/src/resources/extensions/gsd/preferences-models.ts +15 -101
  322. package/src/resources/extensions/gsd/preferences-types.ts +0 -6
  323. package/src/resources/extensions/gsd/preferences-validation.ts +0 -35
  324. package/src/resources/extensions/gsd/preferences.ts +2 -16
  325. package/src/resources/extensions/gsd/prompt-loader.ts +12 -26
  326. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +3 -9
  327. package/src/resources/extensions/gsd/state.ts +0 -42
  328. package/src/resources/extensions/gsd/templates/PREFERENCES.md +0 -1
  329. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1 -178
  330. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +0 -58
  331. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +5 -9
  332. package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +4 -21
  333. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +1 -1
  334. package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +211 -138
  335. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +59 -142
  336. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +4 -7
  337. package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +32 -89
  338. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +22 -0
  339. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +23 -41
  340. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +43 -3
  341. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +3 -5
  342. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +87 -22
  343. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +118 -7
  344. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +47 -0
  345. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +60 -18
  346. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +76 -14
  347. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +75 -0
  348. package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +83 -22
  349. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +63 -1
  350. package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +1 -26
  351. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +0 -30
  352. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +4 -14
  353. package/src/resources/extensions/gsd/tests/health-widget.test.ts +12 -22
  354. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +1 -64
  355. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +0 -22
  356. package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +23 -0
  357. package/src/resources/extensions/gsd/tests/memory-store.test.ts +0 -128
  358. package/src/resources/extensions/gsd/tests/memory-tools.test.ts +1 -33
  359. package/src/resources/extensions/gsd/tests/model-router.test.ts +8 -169
  360. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +0 -8
  361. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +43 -32
  362. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +10 -4
  363. package/src/resources/extensions/gsd/tests/preferences.test.ts +0 -127
  364. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +0 -16
  365. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +0 -7
  366. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +6 -6
  367. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +19 -168
  368. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +1 -7
  369. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +1 -23
  370. package/src/resources/extensions/gsd/tests/token-profile.test.ts +4 -51
  371. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +16 -7
  372. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +7 -5
  373. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +1 -15
  374. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -6
  375. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +0 -15
  376. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -17
  377. package/src/resources/extensions/gsd/unit-context-manifest.ts +8 -8
  378. package/src/resources/extensions/gsd/visualizer-overlay.ts +1 -1
  379. package/src/resources/extensions/gsd/watch/header-renderer.ts +1 -3
  380. package/src/resources/extensions/gsd/workflow-logger.ts +0 -1
  381. package/src/resources/extensions/gsd/worktree-command.ts +44 -31
  382. package/src/resources/extensions/mcp-client/index.ts +3 -6
  383. package/src/resources/extensions/slash-commands/create-extension.ts +24 -38
  384. package/src/resources/skills/create-gsd-extension/SKILL.md +5 -9
  385. package/src/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
  386. package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
  387. package/src/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
  388. package/src/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
  389. package/src/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
  390. package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
  391. package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
  392. package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +2 -2
  393. package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +3 -3
  394. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +12 -32
  395. package/dist/cli-policy.d.ts +0 -13
  396. package/dist/cli-policy.js +0 -17
  397. package/dist/resources/.managed-resources-content-hash +0 -1
  398. package/dist/resources/extensions/gsd/auto-runtime-state.js +0 -31
  399. package/dist/resources/extensions/gsd/milestone-id-reservation.js +0 -36
  400. package/dist/resources/extensions/gsd/worktree-session-state.js +0 -33
  401. package/dist/runtime-checks.d.ts +0 -27
  402. package/dist/runtime-checks.js +0 -38
  403. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  404. package/dist/web/standalone/.next/static/chunks/2824.08296bc2f9654698.js +0 -1
  405. package/dist/web/standalone/.next/static/chunks/3026.3af53b279375f082.js +0 -1
  406. package/dist/web/standalone/.next/static/chunks/315.6f68ae79b67d25cf.js +0 -1
  407. package/dist/web/standalone/.next/static/chunks/3497.4bfc60a3b3dea717.js +0 -1
  408. package/dist/web/standalone/.next/static/chunks/5516.4a07c872b5c3a663.js +0 -1
  409. package/dist/web/standalone/.next/static/chunks/8336.31b019697882acfb.js +0 -10
  410. package/dist/web/standalone/.next/static/chunks/8845.c9702695e8c5a9c5.js +0 -2
  411. package/dist/web/standalone/.next/static/chunks/9058.01ef3a463bda88f1.js +0 -20
  412. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  413. package/dist/web/standalone/.next/static/chunks/app/page-9bf2e0c50fb2ca05.js +0 -1
  414. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
  415. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
  416. package/dist/web/standalone/.next/static/chunks/webpack-f9f0dc45e4f3ac10.js +0 -1
  417. package/dist/worktree-status-banner.d.ts +0 -1
  418. package/dist/worktree-status-banner.js +0 -132
  419. package/packages/mcp-server/dist/alias-telemetry.d.ts +0 -8
  420. package/packages/mcp-server/dist/alias-telemetry.d.ts.map +0 -1
  421. package/packages/mcp-server/dist/alias-telemetry.js +0 -30
  422. package/packages/mcp-server/dist/alias-telemetry.js.map +0 -1
  423. package/packages/mcp-server/src/alias-telemetry.test.ts +0 -78
  424. package/packages/mcp-server/src/alias-telemetry.ts +0 -30
  425. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts +0 -2
  426. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts.map +0 -1
  427. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js +0 -231
  428. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js.map +0 -1
  429. package/packages/pi-ai/src/providers/anthropic-shared.cache-breakpoint.test.ts +0 -289
  430. package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts +0 -37
  431. package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts.map +0 -1
  432. package/packages/pi-coding-agent/dist/core/token-telemetry.js +0 -49
  433. package/packages/pi-coding-agent/dist/core/token-telemetry.js.map +0 -1
  434. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts +0 -2
  435. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts.map +0 -1
  436. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +0 -133
  437. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +0 -1
  438. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts +0 -2
  439. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts.map +0 -1
  440. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js +0 -78
  441. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js.map +0 -1
  442. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts +0 -2
  443. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts.map +0 -1
  444. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js +0 -181
  445. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js.map +0 -1
  446. package/packages/pi-coding-agent/src/core/token-telemetry.ts +0 -77
  447. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +0 -212
  448. package/packages/pi-coding-agent/src/tests/system-prompt-cache-stability.test.ts +0 -102
  449. package/packages/pi-coding-agent/src/tests/token-telemetry.test.ts +0 -200
  450. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts +0 -2
  451. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts.map +0 -1
  452. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js +0 -161
  453. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js.map +0 -1
  454. package/packages/pi-tui/src/components/__tests__/leak-fixes-runtime.test.ts +0 -219
  455. package/src/resources/extensions/gsd/auto-runtime-state.ts +0 -51
  456. package/src/resources/extensions/gsd/milestone-id-reservation.ts +0 -47
  457. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +0 -116
  458. package/src/resources/extensions/gsd/tests/doctor-orphan-milestone-4996.test.ts +0 -100
  459. package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +0 -93
  460. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed-runtime.test.ts +0 -47
  461. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +0 -63
  462. package/src/resources/extensions/gsd/tests/gsd-no-project-error-runtime.test.ts +0 -81
  463. package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +0 -57
  464. package/src/resources/extensions/gsd/tests/import-done-milestones-runtime.test.ts +0 -145
  465. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +0 -124
  466. package/src/resources/extensions/gsd/tests/milestone-id-gap-reuse-4996.test.ts +0 -152
  467. package/src/resources/extensions/gsd/tests/native-git-infra-errors.test.ts +0 -50
  468. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +0 -93
  469. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +0 -101
  470. package/src/resources/extensions/gsd/worktree-session-state.ts +0 -35
  471. package/src/resources/extensions/mcp-client/tests/global-config.test.ts +0 -91
  472. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +0 -58
  473. /package/dist/web/standalone/.next/static/{UF5VF4F1tB0miEtJS7LyX → 7afp7gq8-DVbxum83zRQ-}/_buildManifest.js +0 -0
  474. /package/dist/web/standalone/.next/static/{UF5VF4F1tB0miEtJS7LyX → 7afp7gq8-DVbxum83zRQ-}/_ssgManifest.js +0 -0
@@ -5,7 +5,6 @@ import {
5
5
  resolveModelForComplexity,
6
6
  escalateTier,
7
7
  defaultRoutingConfig,
8
- resolveModelForTier,
9
8
  scoreModel,
10
9
  computeTaskRequirements,
11
10
  scoreEligibleModels,
@@ -249,172 +248,6 @@ test("#2192: known model is still downgraded normally", () => {
249
248
  assert.notEqual(result.modelId, "claude-opus-4-6");
250
249
  });
251
250
 
252
- // ─── Cross-provider fallback ──────────────────────────────────────────────────
253
-
254
- test("uses cross-provider equivalent when configured primary is unavailable", () => {
255
- const config = { ...defaultRoutingConfig(), enabled: true };
256
- // Profile default says claude-opus-4-6 for planning, but user is on GPT only
257
- const result = resolveModelForComplexity(
258
- makeClassification("heavy"),
259
- { primary: "claude-opus-4-6", fallbacks: [] },
260
- config,
261
- ["gpt-4o", "gpt-4o-mini", "o1"],
262
- );
263
- // o1 is the heavy-tier GPT model — should be selected as cross-provider equivalent
264
- assert.equal(result.modelId, "o1");
265
- assert.equal(result.wasDowngraded, false);
266
- assert.match(result.reason, /cross-provider/);
267
- });
268
-
269
- test("cross-provider: selects standard-tier equivalent when primary unavailable", () => {
270
- const config = { ...defaultRoutingConfig(), enabled: true };
271
- // Planning configured with Opus, but only GPT standard models available
272
- const result = resolveModelForComplexity(
273
- makeClassification("heavy"),
274
- { primary: "claude-opus-4-6", fallbacks: [] },
275
- config,
276
- ["gpt-4o", "gpt-4o-mini"],
277
- );
278
- // gpt-4o is standard tier, not heavy — no heavy-tier model available
279
- // Should fall back to gpt-4o (best available)
280
- assert.ok(result.modelId === "gpt-4o" || result.modelId === "claude-opus-4-6");
281
- assert.equal(result.wasDowngraded, false);
282
- });
283
-
284
- test("cross-provider: configured primary available by bare ID wins over equivalent", () => {
285
- const config = { ...defaultRoutingConfig(), enabled: true };
286
- // Provider-prefixed ID — bare match should find it
287
- const result = resolveModelForComplexity(
288
- makeClassification("heavy"),
289
- { primary: "claude-opus-4-6", fallbacks: [] },
290
- config,
291
- ["anthropic/claude-opus-4-6", "o1"],
292
- );
293
- assert.equal(result.modelId, "claude-opus-4-6");
294
- assert.equal(result.wasDowngraded, false);
295
- });
296
-
297
- // ─── resolveModelForTier (provider-agnostic tier resolution) ────────────────
298
-
299
- test("resolveModelForTier: returns canonical Anthropic model when no available models", () => {
300
- assert.equal(resolveModelForTier("heavy", []), "claude-opus-4-6");
301
- assert.equal(resolveModelForTier("standard", []), "claude-sonnet-4-6");
302
- assert.equal(resolveModelForTier("light", []), "claude-haiku-4-5");
303
- });
304
-
305
- test("resolveModelForTier: returns canonical model when it is available", () => {
306
- assert.equal(
307
- resolveModelForTier("heavy", ["claude-opus-4-6", "claude-sonnet-4-6"]),
308
- "claude-opus-4-6",
309
- );
310
- });
311
-
312
- test("resolveModelForTier: does not prefer canonical over cheaper same-tier model", () => {
313
- const result = resolveModelForTier("light", ["claude-haiku-4-5", "gpt-4o-mini"]);
314
- assert.equal(result, "gpt-4o-mini");
315
- });
316
-
317
- test("resolveModelForTier: honors configured tier_models pins", () => {
318
- const config: DynamicRoutingConfig = {
319
- ...defaultRoutingConfig(),
320
- tier_models: { light: "claude-haiku-4-5" },
321
- };
322
- const result = resolveModelForTier("light", ["claude-haiku-4-5", "gpt-4o-mini"], config);
323
- assert.equal(result, "claude-haiku-4-5");
324
- });
325
-
326
- test("resolveModelForTier: picks cross-provider equivalent when Anthropic unavailable", () => {
327
- // Only OpenAI models available
328
- const result = resolveModelForTier("heavy", ["gpt-4o", "gpt-4o-mini", "o1"]);
329
- // o1 is the heavy-tier model in the OpenAI lineup
330
- assert.equal(result, "o1");
331
- });
332
-
333
- test("resolveModelForTier: picks standard-tier cross-provider model", () => {
334
- const result = resolveModelForTier("standard", ["gpt-4o", "gpt-4o-mini"]);
335
- assert.equal(result, "gpt-4o");
336
- });
337
-
338
- test("resolveModelForTier: picks light-tier cross-provider model", () => {
339
- const result = resolveModelForTier("light", ["gpt-4o", "gpt-4o-mini"]);
340
- assert.equal(result, "gpt-4o-mini");
341
- });
342
-
343
- test("resolveModelForTier: falls back to canonical when no tier match available", () => {
344
- // Only unknown models available — getModelTier classifies unknowns as
345
- // "standard", so a request for "heavy" finds no match and the canonical
346
- // Anthropic ID is returned as a documented fallback.
347
- const result = resolveModelForTier("heavy", ["some-custom-model"]);
348
- assert.equal(result, "claude-opus-4-6");
349
- });
350
-
351
- test("resolveModelForTier: handles provider-prefixed available models", () => {
352
- const result = resolveModelForTier("heavy", ["anthropic/claude-opus-4-6"]);
353
- assert.equal(result, "claude-opus-4-6");
354
- });
355
-
356
- test("resolveModelForTier: picks Gemini models when only Google available", () => {
357
- const result = resolveModelForTier("light", ["gemini-2.5-pro", "gemini-2.0-flash"]);
358
- assert.equal(result, "gemini-2.0-flash");
359
- });
360
-
361
- // ─── Behavioral: profile defaults are provider-agnostic at runtime ──────────
362
-
363
- test("resolveProfileDefaults: balanced with only OpenAI models returns OpenAI IDs", async () => {
364
- const { resolveProfileDefaults } = await import("../preferences-models.js");
365
- const defaults = resolveProfileDefaults("balanced", ["gpt-4o", "gpt-4o-mini"]);
366
- assert.ok(defaults.models, "balanced should populate models");
367
- // All slots must resolve to an available OpenAI ID — not a claude- canonical.
368
- for (const [phase, modelId] of Object.entries(defaults.models!)) {
369
- assert.ok(typeof modelId === "string" && modelId.length > 0, `${phase} should resolve to a model ID`);
370
- assert.ok(
371
- !String(modelId).startsWith("claude-"),
372
- `${phase} resolved to ${modelId} but no claude-* model is available — should be OpenAI`,
373
- );
374
- }
375
- });
376
-
377
- test("resolveProfileDefaults: budget with only OpenAI models picks gpt-4o-mini for light slots", async () => {
378
- const { resolveProfileDefaults } = await import("../preferences-models.js");
379
- const defaults = resolveProfileDefaults("budget", ["gpt-4o", "gpt-4o-mini"]);
380
- // light-tier slots in budget: research, execution_simple, completion, subagent
381
- assert.equal(defaults.models?.research, "gpt-4o-mini");
382
- assert.equal(defaults.models?.execution_simple, "gpt-4o-mini");
383
- assert.equal(defaults.models?.completion, "gpt-4o-mini");
384
- assert.equal(defaults.models?.subagent, "gpt-4o-mini");
385
- // standard-tier slots: planning, execution
386
- assert.equal(defaults.models?.planning, "gpt-4o");
387
- assert.equal(defaults.models?.execution, "gpt-4o");
388
- });
389
-
390
- test("resolveProfileDefaults: honors dynamic routing tier_models pins", async () => {
391
- const { resolveProfileDefaults } = await import("../preferences-models.js");
392
- const defaults = resolveProfileDefaults(
393
- "budget",
394
- ["claude-haiku-4-5", "gpt-4o-mini", "gpt-4o"],
395
- { ...defaultRoutingConfig(), tier_models: { light: "claude-haiku-4-5" } },
396
- );
397
- assert.equal(defaults.models?.research, "claude-haiku-4-5");
398
- assert.equal(defaults.models?.execution_simple, "claude-haiku-4-5");
399
- assert.equal(defaults.models?.completion, "claude-haiku-4-5");
400
- assert.equal(defaults.models?.subagent, "claude-haiku-4-5");
401
- });
402
-
403
- test("resolveProfileDefaults: empty availableModelIds falls back to canonical Anthropic IDs", async () => {
404
- const { resolveProfileDefaults } = await import("../preferences-models.js");
405
- const defaults = resolveProfileDefaults("balanced", []);
406
- // Documented fallback only — when registry is unavailable at bootstrap.
407
- const planningModel = defaults.models?.planning;
408
- assert.ok(typeof planningModel === "string" && planningModel.startsWith("claude-"));
409
- });
410
-
411
- test("resolveProfileDefaults: burn-max omits models so user choice is preserved", async () => {
412
- const { resolveProfileDefaults } = await import("../preferences-models.js");
413
- const defaults = resolveProfileDefaults("burn-max", ["gpt-4o"]);
414
- assert.equal(defaults.models, undefined, "burn-max must not write model defaults");
415
- assert.equal(defaults.dynamic_routing?.enabled, false);
416
- });
417
-
418
251
  // ─── Capability Scoring (ADR-004 Phase 2) ───────────────────────────────────
419
252
 
420
253
  test("defaultRoutingConfig includes capability_routing: true", () => {
@@ -446,8 +279,14 @@ test("scoreModel computes weighted average of capability × requirement", () =>
446
279
  assert.ok(Math.abs(score - 88.21) < 0.1, `score ${score} should be ~88.21`);
447
280
  });
448
281
 
449
- // (Removed duplicate "scoreModel returns 50 for empty requirements" the
450
- // `describe("scoreModel")` block below has the same scenario.)
282
+ test("scoreModel returns 50 for empty requirements", () => {
283
+ const caps: ModelCapabilities = {
284
+ coding: 90, debugging: 80, research: 70,
285
+ reasoning: 85, speed: 50, longContext: 60, instruction: 75,
286
+ };
287
+ const score = scoreModel(caps, {});
288
+ assert.equal(score, 50);
289
+ });
451
290
 
452
291
  test("computeTaskRequirements returns base vector for known unit type", () => {
453
292
  const reqs = computeTaskRequirements("execute-task");
@@ -101,14 +101,6 @@ describe("auditOrphanedMilestoneBranches", () => {
101
101
  result.warnings.some(w => w.includes("NOT merged")),
102
102
  "should warn about unmerged branch",
103
103
  );
104
- assert.ok(
105
- result.warnings.some(w => w.includes("/gsd doctor fix")),
106
- `warning should suggest the real remediation command; got: ${JSON.stringify(result.warnings)}`,
107
- );
108
- assert.ok(
109
- result.warnings.every(w => !w.includes("/gsd health --fix")),
110
- `warning must not suggest the removed health --fix command; got: ${JSON.stringify(result.warnings)}`,
111
- );
112
104
 
113
105
  // Branch should still exist (data safety)
114
106
  const branches = run("git branch --list milestone/M001", dir);
@@ -19,15 +19,13 @@ import { join } from "node:path";
19
19
  import { tmpdir } from "node:os";
20
20
 
21
21
  import {
22
+ persistState,
22
23
  restoreState,
23
24
  resetOrchestrator,
25
+ getOrchestratorState,
24
26
  type PersistedState,
25
27
  } from "../parallel-orchestrator.ts";
26
- import {
27
- writeSessionStatus,
28
- readAllSessionStatuses,
29
- cleanupStaleSessions,
30
- } from "../session-status-io.ts";
28
+ import { writeSessionStatus, readAllSessionStatuses, removeSessionStatus } from "../session-status-io.ts";
31
29
  // ─── Helpers ──────────────────────────────────────────────────────────────────
32
30
 
33
31
  function makeTempDir(): string {
@@ -59,20 +57,17 @@ function makePersistedState(overrides: Partial<PersistedState> = {}): PersistedS
59
57
 
60
58
 
61
59
  describe('parallel-crash-recovery', () => {
62
- test('Test 1: orchestrator.json round-trips through restoreState (preserves worker fields)', () => {
60
+ test('Test 1: persistState writes valid JSON', () => {
63
61
  const basePath = makeTempDir();
64
62
  try {
65
- // Write a full state file to disk and then exercise the real production
66
- // restoreState() reader against it. This verifies the persisted file
67
- // schema (the contract between persistState's writer and the reader)
68
- // — earlier this test inlined a test-only writer and re-parsed JSON,
69
- // bypassing production code entirely.
63
+ // We can't call persistState directly without internal state set up,
64
+ // so we test the round-trip by writing a state file and reading it back
70
65
  const state = makePersistedState({
71
66
  workers: [
72
67
  {
73
68
  milestoneId: "M001",
74
69
  title: "M001",
75
- pid: process.pid, // alive — survives restoreState's PID filter
70
+ pid: process.pid,
76
71
  worktreePath: "/tmp/wt-M001",
77
72
  startedAt: Date.now(),
78
73
  state: "running",
@@ -83,13 +78,13 @@ test('Test 1: orchestrator.json round-trips through restoreState (preserves work
83
78
  });
84
79
  writeStateFile(basePath, state);
85
80
 
86
- const restored = restoreState(basePath);
87
- assert.ok(restored !== null, "restoreState: returns state for live worker");
88
- assert.deepStrictEqual(restored!.active, true, "active field preserved through round-trip");
89
- assert.deepStrictEqual(restored!.workers.length, 1, "worker count preserved");
90
- assert.deepStrictEqual(restored!.workers[0].milestoneId, "M001", "milestoneId preserved");
91
- assert.deepStrictEqual(restored!.workers[0].cost, 0.15, "cost preserved");
92
- assert.deepStrictEqual(restored!.totalCost, 0.15, "totalCost preserved");
81
+ const raw = readFileSync(stateFilePath(basePath), "utf-8");
82
+ const parsed = JSON.parse(raw) as PersistedState;
83
+ assert.deepStrictEqual(parsed.active, true, "persistState: active field preserved");
84
+ assert.deepStrictEqual(parsed.workers.length, 1, "persistState: worker count preserved");
85
+ assert.deepStrictEqual(parsed.workers[0].milestoneId, "M001", "persistState: milestoneId preserved");
86
+ assert.deepStrictEqual(parsed.workers[0].cost, 0.15, "persistState: cost preserved");
87
+ assert.deepStrictEqual(parsed.totalCost, 0.15, "persistState: totalCost preserved");
93
88
  } finally {
94
89
  rmSync(basePath, { recursive: true, force: true });
95
90
  }
@@ -206,12 +201,11 @@ test('Test 5: restoreState skips stopped/error workers even with alive PIDs', ()
206
201
  }
207
202
  });
208
203
 
209
- test('Test 6: cleanupStaleSessions removes dead-PID sessions and keeps live ones', () => {
204
+ test('Test 6: orphan detection finds stale sessions', () => {
210
205
  const basePath = makeTempDir();
211
206
  try {
207
+ // Write a session status with a dead PID
212
208
  mkdirSync(join(basePath, ".gsd", "parallel"), { recursive: true });
213
-
214
- // Dead PID
215
209
  writeSessionStatus(basePath, {
216
210
  milestoneId: "M001",
217
211
  pid: 99999999,
@@ -224,7 +218,7 @@ test('Test 6: cleanupStaleSessions removes dead-PID sessions and keeps live ones
224
218
  worktreePath: "/tmp/wt-M001",
225
219
  });
226
220
 
227
- // Live PID (this process)
221
+ // Write a session status with alive PID
228
222
  writeSessionStatus(basePath, {
229
223
  milestoneId: "M002",
230
224
  pid: process.pid,
@@ -237,20 +231,37 @@ test('Test 6: cleanupStaleSessions removes dead-PID sessions and keeps live ones
237
231
  worktreePath: "/tmp/wt-M002",
238
232
  });
239
233
 
234
+ // Read all sessions — both should exist initially
240
235
  const before = readAllSessionStatuses(basePath);
241
- assert.deepStrictEqual(before.length, 2, "both sessions exist before cleanup");
236
+ assert.deepStrictEqual(before.length, 2, "orphan: both sessions exist before detection");
242
237
 
243
- // Drive the real production cleanup function. Earlier this test
244
- // re-implemented the cleanup loop inline (process.kill + remove*) and
245
- // never exercised cleanupStaleSessions itself so changes to the
246
- // production sweep would not have been caught.
247
- const removed = cleanupStaleSessions(basePath);
238
+ // Now simulate orphan detection logic (same as prepareParallelStart)
239
+ const sessions = readAllSessionStatuses(basePath);
240
+ const orphans: Array<{ milestoneId: string; pid: number; alive: boolean }> = [];
241
+ for (const session of sessions) {
242
+ let alive: boolean;
243
+ try {
244
+ process.kill(session.pid, 0);
245
+ alive = true;
246
+ } catch {
247
+ alive = false;
248
+ }
249
+ orphans.push({ milestoneId: session.milestoneId, pid: session.pid, alive });
250
+ if (!alive) {
251
+ removeSessionStatus(basePath, session.milestoneId);
252
+ }
253
+ }
248
254
 
249
- assert.deepStrictEqual(removed, ["M001"], "dead-PID session id is reported as removed");
255
+ assert.ok(orphans.length === 2, "orphan: detected both sessions");
256
+ const deadOrphan = orphans.find(o => o.milestoneId === "M001");
257
+ assert.ok(deadOrphan !== undefined && !deadOrphan.alive, "orphan: M001 detected as dead");
258
+ const aliveOrphan = orphans.find(o => o.milestoneId === "M002");
259
+ assert.ok(aliveOrphan !== undefined && aliveOrphan.alive, "orphan: M002 detected as alive");
250
260
 
261
+ // Dead session should be cleaned up
251
262
  const after = readAllSessionStatuses(basePath);
252
- assert.deepStrictEqual(after.length, 1, "dead session cleaned up");
253
- assert.deepStrictEqual(after[0].milestoneId, "M002", "alive session remains");
263
+ assert.deepStrictEqual(after.length, 1, "orphan: dead session cleaned up");
264
+ assert.deepStrictEqual(after[0].milestoneId, "M002", "orphan: alive session remains");
254
265
  } finally {
255
266
  rmSync(basePath, { recursive: true, force: true });
256
267
  }
@@ -18,14 +18,20 @@ const phasesSrc = readFileSync(phasesPath, "utf-8");
18
18
 
19
19
  console.log("\n=== #2766: Non-MergeConflictError stops auto mode ===");
20
20
 
21
- // ── Test 1: every mergeAndExit call site has a catch (mergeErr) block ──
21
+ // ── Test 1: phases.ts calls logError for non-conflict merge errors ──────
22
+
23
+ assertTrue(
24
+ phasesPath.length > 0 && phasesPath.endsWith("phases.ts"),
25
+ "phases.ts file exists and is readable",
26
+ );
22
27
 
23
28
  // Count all mergeAndExit catch blocks by finding "} catch (mergeErr)" patterns
24
- const mergeAndExitCallCount = [...phasesSrc.matchAll(/\.mergeAndExit\(/g)].length;
29
+ const mergeErrCatches = [...phasesPath.matchAll(/\} catch \(mergeErr\)/g)];
30
+ // Use the source itself for matching
25
31
  const mergeErrCatchCount = [...phasesSrc.matchAll(/\} catch \(mergeErr\)/g)].length;
26
32
  assertTrue(
27
- mergeErrCatchCount === mergeAndExitCallCount && mergeAndExitCallCount > 0,
28
- `every mergeAndExit call site has a catch (mergeErr) block (calls=${mergeAndExitCallCount}, catches=${mergeErrCatchCount})`,
33
+ mergeErrCatchCount >= 3,
34
+ `all mergeAndExit call sites have catch (mergeErr) blocks (found ${mergeErrCatchCount}, expected >= 3)`,
29
35
  );
30
36
 
31
37
  // ── Test 2: Every mergeErr catch block handles non-MergeConflictError ───
@@ -236,20 +236,6 @@ test("valid values pass through correctly", () => {
236
236
  assert.equal(p3.auto_supervisor?.model, "claude-opus-4-6");
237
237
  });
238
238
 
239
- test("min_request_interval_ms floors decimals and rejects timer overflow values", () => {
240
- const valid = validatePreferences({ min_request_interval_ms: 1000.9 });
241
- assert.equal(valid.errors.length, 0);
242
- assert.equal(valid.preferences.min_request_interval_ms, 1000);
243
-
244
- const max = validatePreferences({ min_request_interval_ms: 2_147_483_647 });
245
- assert.equal(max.errors.length, 0);
246
- assert.equal(max.preferences.min_request_interval_ms, 2_147_483_647);
247
-
248
- const tooHigh = validatePreferences({ min_request_interval_ms: 2_147_483_648 });
249
- assert.ok(tooHigh.errors.some(e => e.includes("min_request_interval_ms must be a non-negative number <= 2147483647")));
250
- assert.equal(tooHigh.preferences.min_request_interval_ms, undefined);
251
- });
252
-
253
239
  test("mixed valid/invalid/unknown keys handled correctly", () => {
254
240
  const { preferences, errors, warnings } = validatePreferences({
255
241
  uat_dispatch: true, totally_made_up: "value", budget_ceiling: "garbage",
@@ -260,71 +246,6 @@ test("mixed valid/invalid/unknown keys handled correctly", () => {
260
246
  assert.equal(preferences.budget_ceiling, undefined);
261
247
  });
262
248
 
263
- test("disabled_model_providers validates and normalizes string arrays", () => {
264
- const { preferences, errors } = validatePreferences({
265
- disabled_model_providers: ["google-gemini-cli", " google-gemini-cli ", "openai-codex", " "],
266
- });
267
- assert.equal(errors.length, 0);
268
- assert.deepEqual(preferences.disabled_model_providers, ["google-gemini-cli", "openai-codex"]);
269
- });
270
-
271
- test("disabled_model_providers rejects non-array values", () => {
272
- const { errors } = validatePreferences({ disabled_model_providers: "google-gemini-cli" as any });
273
- assert.ok(errors.some((e) => e.includes("disabled_model_providers must be an array of strings")));
274
- });
275
-
276
- test("loadEffectiveGSDPreferences preserves disabled_model_providers across merge layers", () => {
277
- const originalCwd = process.cwd();
278
- const originalGsdHome = process.env.GSD_HOME;
279
- const tempProject = mkdtempSync(join(tmpdir(), "gsd-disabled-provider-project-"));
280
- const tempGsdHome = mkdtempSync(join(tmpdir(), "gsd-disabled-provider-home-"));
281
-
282
- try {
283
- mkdirSync(join(tempProject, ".gsd"), { recursive: true });
284
-
285
- writeFileSync(
286
- join(tempGsdHome, "PREFERENCES.md"),
287
- [
288
- "---",
289
- "version: 1",
290
- "disabled_model_providers:",
291
- " - google-gemini-cli",
292
- "---",
293
- ].join("\n"),
294
- "utf-8",
295
- );
296
-
297
- writeFileSync(
298
- join(tempProject, ".gsd", "PREFERENCES.md"),
299
- [
300
- "---",
301
- "version: 1",
302
- "disabled_model_providers:",
303
- " - openai-codex",
304
- " - google-gemini-cli",
305
- "---",
306
- ].join("\n"),
307
- "utf-8",
308
- );
309
-
310
- process.env.GSD_HOME = tempGsdHome;
311
- process.chdir(tempProject);
312
-
313
- const loaded = loadEffectiveGSDPreferences();
314
- assert.notEqual(loaded, null);
315
- assert.deepEqual(
316
- loaded!.preferences.disabled_model_providers,
317
- ["google-gemini-cli", "openai-codex"],
318
- );
319
- } finally {
320
- process.chdir(originalCwd);
321
- if (originalGsdHome === undefined) delete process.env.GSD_HOME;
322
- else process.env.GSD_HOME = originalGsdHome;
323
- rmSync(tempProject, { recursive: true, force: true });
324
- rmSync(tempGsdHome, { recursive: true, force: true });
325
- }
326
- });
327
-
328
249
  // ── Wizard fields ────────────────────────────────────────────────────────────
329
250
 
330
251
  test("budget fields validate correctly", () => {
@@ -762,54 +683,6 @@ test("loadEffectiveGSDPreferences exposes slice_parallel prefs to runtime caller
762
683
  }
763
684
  });
764
685
 
765
- test("loadEffectiveGSDPreferences merges min_request_interval_ms with project overriding global (#2996)", () => {
766
- const originalCwd = process.cwd();
767
- const originalGsdHome = process.env.GSD_HOME;
768
- const tempProject = mkdtempSync(join(tmpdir(), "gsd-rate-limit-project-"));
769
- const tempGsdHome = mkdtempSync(join(tmpdir(), "gsd-rate-limit-home-"));
770
-
771
- try {
772
- mkdirSync(join(tempProject, ".gsd"), { recursive: true });
773
-
774
- writeFileSync(
775
- join(tempGsdHome, "PREFERENCES.md"),
776
- [
777
- "---",
778
- "version: 1",
779
- "min_request_interval_ms: 250",
780
- "budget_ceiling: 45",
781
- "---",
782
- ].join("\n"),
783
- "utf-8",
784
- );
785
-
786
- writeFileSync(
787
- join(tempProject, ".gsd", "PREFERENCES.md"),
788
- [
789
- "---",
790
- "version: 1",
791
- "min_request_interval_ms: 100",
792
- "---",
793
- ].join("\n"),
794
- "utf-8",
795
- );
796
-
797
- process.env.GSD_HOME = tempGsdHome;
798
- process.chdir(tempProject);
799
-
800
- const loaded = loadEffectiveGSDPreferences();
801
- assert.notEqual(loaded, null);
802
- assert.equal(loaded!.preferences.min_request_interval_ms, 100);
803
- assert.equal(loaded!.preferences.budget_ceiling, 45);
804
- } finally {
805
- process.chdir(originalCwd);
806
- if (originalGsdHome === undefined) delete process.env.GSD_HOME;
807
- else process.env.GSD_HOME = originalGsdHome;
808
- rmSync(tempProject, { recursive: true, force: true });
809
- rmSync(tempGsdHome, { recursive: true, force: true });
810
- }
811
- });
812
-
813
686
  test("preferences paths use canonical uppercase filenames", () => {
814
687
  const originalCwd = process.cwd();
815
688
  const originalGsdHome = process.env.GSD_HOME;
@@ -93,20 +93,4 @@ describe('register-hooks session_before_compact (#3696)', () => {
93
93
  'session_before_compact should not check isAutoPaused',
94
94
  );
95
95
  });
96
-
97
- test('session_before_compact does not gate checkpointing to executing phase (#4258)', () => {
98
- const compactIdx = registerHooksSrc.indexOf('session_before_compact');
99
- assert.ok(compactIdx > -1, 'session_before_compact hook should exist');
100
-
101
- const preCheckpointSection = registerHooksSrc.slice(
102
- compactIdx,
103
- registerHooksSrc.indexOf('const sliceDir', compactIdx),
104
- );
105
-
106
- const normalized = preCheckpointSection.replace(/\/\/.*$/gm, '');
107
- assert.ok(
108
- !/if\s*\(\s*state\.phase\s*!==\s*['"]executing['"]\s*\)\s*\{?\s*return\b/.test(normalized),
109
- 'session_before_compact should not early-return on non-executing phases',
110
- );
111
- });
112
96
  });
@@ -103,13 +103,6 @@ test("classifyError detects Codex server_error from extracted message", () => {
103
103
  assert.ok("retryAfterMs" in result && result.retryAfterMs === 30_000);
104
104
  });
105
105
 
106
- test("classifyError detects stream INTERNAL_ERROR received from peer as transient server", () => {
107
- const result = classifyError("stream error: stream ID 75; INTERNAL_ERROR; received from peer");
108
- assert.ok(isTransient(result));
109
- assert.equal(result.kind, "server");
110
- assert.ok("retryAfterMs" in result && result.retryAfterMs === 30_000);
111
- });
112
-
113
106
  test("classifyError detects overloaded error", () => {
114
107
  const result = classifyError("overloaded_error: Overloaded");
115
108
  assert.ok(isTransient(result));
@@ -23,19 +23,19 @@ describe("quick task turn_end cleanup (#2668)", () => {
23
23
  "utf-8",
24
24
  );
25
25
 
26
- it("register-hooks.ts loads cleanupQuickBranch from quick.ts", () => {
26
+ it("register-hooks.ts imports cleanupQuickBranch from quick.ts", () => {
27
27
  assert.ok(
28
28
  hooksSource.includes("cleanupQuickBranch"),
29
29
  "register-hooks.ts must reference cleanupQuickBranch",
30
30
  );
31
31
 
32
- // Verify it is loaded from quick.ts (static or lazy), not just mentioned in a comment.
33
- const importMatch =
34
- hooksSource.match(/import\s*\{[^}]*cleanupQuickBranch[^}]*\}\s*from\s*["'][^"']*quick/) ||
35
- hooksSource.match(/const\s+\{\s*cleanupQuickBranch\s*\}\s*=\s*await\s+import\(["'][^"']*quick\.js["']\)/);
32
+ // Verify it's imported (not just mentioned in a comment)
33
+ const importMatch = hooksSource.match(
34
+ /import\s*\{[^}]*cleanupQuickBranch[^}]*\}\s*from\s*["'][^"']*quick/,
35
+ );
36
36
  assert.ok(
37
37
  importMatch,
38
- "cleanupQuickBranch must be loaded from quick module",
38
+ "cleanupQuickBranch must be imported from quick module",
39
39
  );
40
40
  });
41
41