gsd-pi 2.76.0 → 2.77.0-dev.2daa994b6

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 (1159) hide show
  1. package/README.md +32 -30
  2. package/dist/claude-cli-check.js +32 -3
  3. package/dist/cli-web-branch.d.ts +1 -0
  4. package/dist/cli-web-branch.js +3 -0
  5. package/dist/cli.js +38 -2
  6. package/dist/extension-discovery.d.ts +6 -0
  7. package/dist/extension-discovery.js +37 -0
  8. package/dist/extension-registry.d.ts +3 -0
  9. package/dist/extension-sort.d.ts +18 -0
  10. package/dist/extension-sort.js +114 -0
  11. package/dist/extension-validator.d.ts +47 -0
  12. package/dist/extension-validator.js +127 -0
  13. package/dist/headless.js +25 -4
  14. package/dist/loader.js +35 -7
  15. package/dist/mcp-server.d.ts +7 -0
  16. package/dist/mcp-server.js +35 -1
  17. package/dist/onboarding.js +45 -0
  18. package/dist/provider-migrations.d.ts +18 -0
  19. package/dist/provider-migrations.js +14 -0
  20. package/dist/resource-loader.d.ts +41 -1
  21. package/dist/resource-loader.js +34 -21
  22. package/dist/resources/agents/researcher.md +1 -1
  23. package/dist/resources/extensions/browser-tools/capture.js +9 -0
  24. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  25. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  26. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  27. package/dist/resources/extensions/browser-tools/tools/forms.js +5 -1
  28. package/dist/resources/extensions/browser-tools/tools/intent.js +5 -1
  29. package/dist/resources/extensions/claude-code-cli/readiness.js +31 -8
  30. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +144 -63
  31. package/dist/resources/extensions/cmux/index.js +20 -0
  32. package/dist/resources/extensions/github-sync/templates.js +103 -0
  33. package/dist/resources/extensions/google-search/extension-manifest.json +5 -4
  34. package/dist/resources/extensions/google-search/index.js +3 -375
  35. package/dist/resources/extensions/gsd/abandon-detect.js +44 -0
  36. package/dist/resources/extensions/gsd/auto/loop.js +90 -2
  37. package/dist/resources/extensions/gsd/auto/phases.js +150 -46
  38. package/dist/resources/extensions/gsd/auto/resolve.js +24 -0
  39. package/dist/resources/extensions/gsd/auto/run-unit.js +48 -4
  40. package/dist/resources/extensions/gsd/auto/session.js +28 -1
  41. package/dist/resources/extensions/gsd/auto/turn-epoch.js +95 -0
  42. package/dist/resources/extensions/gsd/auto-dispatch.js +152 -25
  43. package/dist/resources/extensions/gsd/auto-loop.js +1 -1
  44. package/dist/resources/extensions/gsd/auto-model-selection.js +53 -16
  45. package/dist/resources/extensions/gsd/auto-post-unit.js +169 -2
  46. package/dist/resources/extensions/gsd/auto-prompts.js +386 -104
  47. package/dist/resources/extensions/gsd/auto-recovery.js +46 -1
  48. package/dist/resources/extensions/gsd/auto-start.js +159 -84
  49. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +11 -5
  50. package/dist/resources/extensions/gsd/auto-unit-closeout.js +11 -2
  51. package/dist/resources/extensions/gsd/auto-verification.js +33 -0
  52. package/dist/resources/extensions/gsd/auto-worktree.js +109 -61
  53. package/dist/resources/extensions/gsd/auto.js +141 -38
  54. package/dist/resources/extensions/gsd/blocked-models.js +68 -0
  55. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +112 -2
  56. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +39 -9
  57. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +93 -0
  58. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +3 -0
  59. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +4 -2
  60. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +23 -0
  61. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +52 -6
  62. package/dist/resources/extensions/gsd/bootstrap/system-context.js +95 -29
  63. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +41 -3
  64. package/dist/resources/extensions/gsd/clean-root-preflight.js +93 -0
  65. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +31 -4
  66. package/dist/resources/extensions/gsd/commands-cmux.js +9 -6
  67. package/dist/resources/extensions/gsd/commands-extensions.js +634 -43
  68. package/dist/resources/extensions/gsd/commands-extract-learnings.js +54 -89
  69. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +968 -23
  70. package/dist/resources/extensions/gsd/compaction-snapshot.js +121 -0
  71. package/dist/resources/extensions/gsd/complexity-classifier.js +5 -3
  72. package/dist/resources/extensions/gsd/component-loader.js +447 -0
  73. package/dist/resources/extensions/gsd/component-types.js +69 -0
  74. package/dist/resources/extensions/gsd/context-store.js +23 -7
  75. package/dist/resources/extensions/gsd/db-writer.js +88 -16
  76. package/dist/resources/extensions/gsd/detection.js +49 -1
  77. package/dist/resources/extensions/gsd/dispatch-guard.js +29 -3
  78. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  79. package/dist/resources/extensions/gsd/doctor-git-checks.js +23 -29
  80. package/dist/resources/extensions/gsd/doctor-providers.js +51 -5
  81. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +1 -0
  82. package/dist/resources/extensions/gsd/error-classifier.js +31 -3
  83. package/dist/resources/extensions/gsd/exec-history.js +120 -0
  84. package/dist/resources/extensions/gsd/exec-sandbox.js +258 -0
  85. package/dist/resources/extensions/gsd/file-lock.js +49 -9
  86. package/dist/resources/extensions/gsd/forensics.js +106 -0
  87. package/dist/resources/extensions/gsd/git-service.js +1 -0
  88. package/dist/resources/extensions/gsd/gitignore.js +2 -0
  89. package/dist/resources/extensions/gsd/gsd-db.js +168 -23
  90. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -1
  91. package/dist/resources/extensions/gsd/guided-flow.js +214 -13
  92. package/dist/resources/extensions/gsd/health-widget.js +4 -1
  93. package/dist/resources/extensions/gsd/hook-emitter.js +108 -0
  94. package/dist/resources/extensions/gsd/init-wizard.js +15 -1
  95. package/dist/resources/extensions/gsd/journal.js +17 -2
  96. package/dist/resources/extensions/gsd/key-manager.js +28 -0
  97. package/dist/resources/extensions/gsd/memory-backfill.js +126 -0
  98. package/dist/resources/extensions/gsd/memory-extractor.js +7 -1
  99. package/dist/resources/extensions/gsd/memory-store.js +19 -0
  100. package/dist/resources/extensions/gsd/milestone-actions.js +15 -0
  101. package/dist/resources/extensions/gsd/milestone-scope-classifier.js +299 -0
  102. package/dist/resources/extensions/gsd/milestone-summary-classifier.js +37 -0
  103. package/dist/resources/extensions/gsd/model-cost-table.js +3 -0
  104. package/dist/resources/extensions/gsd/model-router.js +42 -3
  105. package/dist/resources/extensions/gsd/notifications.js +30 -16
  106. package/dist/resources/extensions/gsd/pre-execution-checks.js +44 -9
  107. package/dist/resources/extensions/gsd/preferences-types.js +9 -0
  108. package/dist/resources/extensions/gsd/preferences-validation.js +106 -0
  109. package/dist/resources/extensions/gsd/preferences.js +17 -17
  110. package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +4 -0
  111. package/dist/resources/extensions/gsd/prompt-loader.js +22 -7
  112. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  113. package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  114. package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +2 -0
  115. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +29 -2
  116. package/dist/resources/extensions/gsd/prompts/discuss.md +29 -2
  117. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  118. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  119. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
  120. package/dist/resources/extensions/gsd/prompts/plan-slice.md +16 -2
  121. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -0
  122. package/dist/resources/extensions/gsd/prompts/system.md +1 -0
  123. package/dist/resources/extensions/gsd/reports.js +5 -4
  124. package/dist/resources/extensions/gsd/safety/evidence-collector.js +96 -0
  125. package/dist/resources/extensions/gsd/safety/file-change-validator.js +13 -5
  126. package/dist/resources/extensions/gsd/safety/safety-harness.js +5 -1
  127. package/dist/resources/extensions/gsd/service-tier.js +5 -2
  128. package/dist/resources/extensions/gsd/skill-manifest.js +168 -0
  129. package/dist/resources/extensions/gsd/slice-cadence.js +238 -0
  130. package/dist/resources/extensions/gsd/state-transition-matrix.js +118 -0
  131. package/dist/resources/extensions/gsd/state.js +68 -29
  132. package/dist/resources/extensions/gsd/token-counter.js +22 -5
  133. package/dist/resources/extensions/gsd/tools/complete-milestone.js +16 -10
  134. package/dist/resources/extensions/gsd/tools/complete-slice.js +21 -0
  135. package/dist/resources/extensions/gsd/tools/complete-task.js +31 -0
  136. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +59 -0
  137. package/dist/resources/extensions/gsd/tools/exec-tool.js +126 -0
  138. package/dist/resources/extensions/gsd/tools/memory-tools.js +26 -1
  139. package/dist/resources/extensions/gsd/tools/resume-tool.js +23 -0
  140. package/dist/resources/extensions/gsd/tools/validate-milestone.js +7 -2
  141. package/dist/resources/extensions/gsd/unit-context-composer.js +147 -0
  142. package/dist/resources/extensions/gsd/unit-context-manifest.js +334 -0
  143. package/dist/resources/extensions/gsd/uok/audit.js +18 -2
  144. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +33 -0
  145. package/dist/resources/extensions/gsd/uok/execution-graph.js +10 -0
  146. package/dist/resources/extensions/gsd/uok/gitops.js +2 -1
  147. package/dist/resources/extensions/gsd/uok/loop-adapter.js +37 -10
  148. package/dist/resources/extensions/gsd/uok/parity-report.js +58 -0
  149. package/dist/resources/extensions/gsd/uok/plan-v2.js +30 -7
  150. package/dist/resources/extensions/gsd/uok/writer.js +82 -0
  151. package/dist/resources/extensions/gsd/workflow-logger.js +10 -2
  152. package/dist/resources/extensions/gsd/workflow-mcp.js +3 -0
  153. package/dist/resources/extensions/gsd/workflow-templates/spike.md +6 -0
  154. package/dist/resources/extensions/gsd/worktree-manager.js +52 -0
  155. package/dist/resources/extensions/gsd/worktree-resolver.js +136 -17
  156. package/dist/resources/extensions/gsd/worktree-telemetry.js +198 -0
  157. package/dist/resources/extensions/mcp-client/auth.js +10 -1
  158. package/dist/resources/extensions/mcp-client/index.js +121 -10
  159. package/dist/resources/extensions/ollama/index.js +5 -1
  160. package/dist/resources/extensions/remote-questions/manager.js +11 -5
  161. package/dist/resources/extensions/search-the-web/command-search-provider.js +5 -4
  162. package/dist/resources/extensions/search-the-web/native-search.js +45 -13
  163. package/dist/resources/extensions/shared/cmux-events.js +12 -0
  164. package/dist/resources/extensions/shared/rtk-session-stats.js +1 -2
  165. package/dist/resources/skills/api-design/SKILL.md +190 -0
  166. package/dist/resources/skills/create-mcp-server/SKILL.md +121 -0
  167. package/dist/resources/skills/create-skill/SKILL.md +2 -2
  168. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  169. package/dist/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  170. package/dist/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  171. package/dist/resources/skills/decompose-into-slices/SKILL.md +139 -0
  172. package/dist/resources/skills/dependency-upgrade/SKILL.md +158 -0
  173. package/dist/resources/skills/design-an-interface/SKILL.md +102 -0
  174. package/dist/resources/skills/forensics/SKILL.md +153 -0
  175. package/dist/resources/skills/grill-me/SKILL.md +93 -0
  176. package/dist/resources/skills/handoff/SKILL.md +121 -0
  177. package/dist/resources/skills/observability/SKILL.md +174 -0
  178. package/dist/resources/skills/security-review/SKILL.md +181 -0
  179. package/dist/resources/skills/spike-wrap-up/SKILL.md +138 -0
  180. package/dist/resources/skills/tdd/SKILL.md +112 -0
  181. package/dist/resources/skills/verify-before-complete/SKILL.md +98 -0
  182. package/dist/resources/skills/write-docs/SKILL.md +82 -0
  183. package/dist/resources/skills/write-milestone-brief/SKILL.md +135 -0
  184. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  185. package/dist/web/standalone/.next/BUILD_ID +1 -1
  186. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  187. package/dist/web/standalone/.next/build-manifest.json +4 -4
  188. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  189. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  190. package/dist/web/standalone/.next/required-server-files.json +4 -4
  191. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  192. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  194. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  195. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  196. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  197. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  198. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  199. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  200. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  201. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  202. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  204. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  205. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  206. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  207. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  208. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  209. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  210. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  211. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  213. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  216. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  219. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  221. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  235. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  236. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  237. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  239. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  240. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  243. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  244. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  246. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  249. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  254. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  255. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  256. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  258. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  259. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  260. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  261. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  262. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  263. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  264. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  265. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  266. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  267. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  268. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  269. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  270. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  271. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  272. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  273. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  274. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  275. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  276. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  277. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  278. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  279. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  280. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  281. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  282. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  283. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  284. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  285. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  286. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  287. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  288. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  289. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  290. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  291. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  292. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  293. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  294. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  295. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  296. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  297. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  298. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  299. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  300. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  301. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  302. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  303. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  304. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  305. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  306. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  307. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  308. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  309. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  310. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  311. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  312. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  313. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  314. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  315. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  316. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  317. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  318. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  319. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  320. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  321. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  322. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  323. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  324. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  325. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  326. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  327. package/dist/web/standalone/.next/server/app/index.html +1 -1
  328. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  329. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  330. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  331. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  332. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  333. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  334. package/dist/web/standalone/.next/server/app/page.js +2 -2
  335. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  336. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  337. package/dist/web/standalone/.next/server/chunks/1926.js +1 -0
  338. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  339. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  340. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  341. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  342. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  343. package/dist/web/standalone/.next/server/middleware.js +2 -2
  344. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  345. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  346. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  347. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  348. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  349. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +11 -0
  350. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  351. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  352. package/dist/web/standalone/.next/static/chunks/app/page-5b113fd32bc2a1c3.js +1 -0
  353. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  354. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  355. package/dist/web/standalone/.next/static/chunks/{webpack-5fc74f13a25fa1bb.js → webpack-2e68521d7c82f7c2.js} +1 -1
  356. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  357. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  358. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  359. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  360. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  361. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  362. package/dist/web/standalone/server.js +1 -1
  363. package/dist/welcome-screen.js +6 -1
  364. package/dist/wizard.js +2 -0
  365. package/package.json +16 -16
  366. package/packages/daemon/package.json +2 -2
  367. package/packages/mcp-server/README.md +3 -3
  368. package/packages/mcp-server/dist/env-writer.d.ts +1 -0
  369. package/packages/mcp-server/dist/env-writer.d.ts.map +1 -1
  370. package/packages/mcp-server/dist/env-writer.js +74 -6
  371. package/packages/mcp-server/dist/env-writer.js.map +1 -1
  372. package/packages/mcp-server/dist/remote-questions.d.ts +45 -0
  373. package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -0
  374. package/packages/mcp-server/dist/remote-questions.js +732 -0
  375. package/packages/mcp-server/dist/remote-questions.js.map +1 -0
  376. package/packages/mcp-server/dist/server.d.ts +7 -0
  377. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  378. package/packages/mcp-server/dist/server.js +95 -10
  379. package/packages/mcp-server/dist/server.js.map +1 -1
  380. package/packages/mcp-server/dist/session-manager.d.ts +14 -0
  381. package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
  382. package/packages/mcp-server/dist/session-manager.js +49 -1
  383. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  384. package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
  385. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  386. package/packages/mcp-server/dist/workflow-tools.js +178 -31
  387. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  388. package/packages/mcp-server/package.json +9 -3
  389. package/packages/mcp-server/src/env-writer.test.ts +79 -1
  390. package/packages/mcp-server/src/env-writer.ts +76 -6
  391. package/packages/mcp-server/src/mcp-server.test.ts +89 -0
  392. package/packages/mcp-server/src/readers/graph.test.ts +87 -15
  393. package/packages/mcp-server/src/readers/readers.test.ts +5 -1
  394. package/packages/mcp-server/src/remote-questions.test.ts +294 -0
  395. package/packages/mcp-server/src/remote-questions.ts +916 -0
  396. package/packages/mcp-server/src/server.ts +118 -16
  397. package/packages/mcp-server/src/session-manager.ts +43 -1
  398. package/packages/mcp-server/src/workflow-tools.test.ts +231 -1
  399. package/packages/mcp-server/src/workflow-tools.ts +234 -49
  400. package/packages/mcp-server/tsconfig.test.json +19 -0
  401. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  402. package/packages/native/package.json +7 -2
  403. package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
  404. package/packages/native/src/__tests__/clipboard.test.mjs +69 -23
  405. package/packages/native/src/__tests__/module-compat.test.mjs +59 -27
  406. package/packages/native/src/__tests__/ps.test.mjs +14 -8
  407. package/packages/native/src/__tests__/stream-process.test.mjs +23 -2
  408. package/packages/native/src/__tests__/truncate.test.mjs +17 -2
  409. package/packages/native/tsconfig.tsbuildinfo +1 -1
  410. package/packages/pi-agent-core/dist/agent-loop.js +12 -0
  411. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  412. package/packages/pi-agent-core/dist/types.d.ts +30 -0
  413. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  414. package/packages/pi-agent-core/dist/types.js.map +1 -1
  415. package/packages/pi-agent-core/package.json +6 -1
  416. package/packages/pi-agent-core/src/agent-loop.test.ts +226 -31
  417. package/packages/pi-agent-core/src/agent-loop.ts +14 -0
  418. package/packages/pi-agent-core/src/agent.test.ts +96 -102
  419. package/packages/pi-agent-core/src/types.ts +34 -0
  420. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  421. package/packages/pi-ai/dist/models/custom.d.ts +38 -0
  422. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -1
  423. package/packages/pi-ai/dist/models/custom.js +41 -0
  424. package/packages/pi-ai/dist/models/custom.js.map +1 -1
  425. package/packages/pi-ai/dist/models/generated/index.d.ts +34 -0
  426. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  427. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  428. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  429. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  430. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  431. package/packages/pi-ai/dist/models/generated/openai.d.ts +17 -0
  432. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -1
  433. package/packages/pi-ai/dist/models/generated/openai.js +17 -0
  434. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -1
  435. package/packages/pi-ai/dist/models.generated.test.js +43 -70
  436. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  437. package/packages/pi-ai/dist/models.test.js +29 -11
  438. package/packages/pi-ai/dist/models.test.js.map +1 -1
  439. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +1 -1
  440. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  441. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts +2 -0
  442. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts.map +1 -0
  443. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +13 -0
  444. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -0
  445. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  446. package/packages/pi-ai/dist/providers/anthropic-shared.js +27 -4
  447. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  448. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  449. package/packages/pi-ai/dist/providers/anthropic.js +13 -4
  450. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  451. package/packages/pi-ai/dist/providers/minimax-tool-name.test.d.ts +2 -0
  452. package/packages/pi-ai/dist/providers/minimax-tool-name.test.d.ts.map +1 -0
  453. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +80 -0
  454. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -0
  455. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  456. package/packages/pi-ai/dist/providers/openai-completions.js +60 -15
  457. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  458. package/packages/pi-ai/dist/providers/simple-options.d.ts +10 -0
  459. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  460. package/packages/pi-ai/dist/providers/simple-options.js +16 -1
  461. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  462. package/packages/pi-ai/dist/providers/think-tag-parser.d.ts +17 -0
  463. package/packages/pi-ai/dist/providers/think-tag-parser.d.ts.map +1 -0
  464. package/packages/pi-ai/dist/providers/think-tag-parser.js +75 -0
  465. package/packages/pi-ai/dist/providers/think-tag-parser.js.map +1 -0
  466. package/packages/pi-ai/dist/providers/think-tag-parser.test.d.ts +2 -0
  467. package/packages/pi-ai/dist/providers/think-tag-parser.test.d.ts.map +1 -0
  468. package/packages/pi-ai/dist/providers/think-tag-parser.test.js +41 -0
  469. package/packages/pi-ai/dist/providers/think-tag-parser.test.js.map +1 -0
  470. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  471. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +12 -2
  472. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  473. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +164 -14
  474. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  475. package/packages/pi-ai/dist/utils/oauth/google-antigravity.d.ts.map +1 -1
  476. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js +15 -3
  477. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js.map +1 -1
  478. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts +2 -0
  479. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts.map +1 -0
  480. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +67 -0
  481. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -0
  482. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.d.ts.map +1 -1
  483. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js +16 -3
  484. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js.map +1 -1
  485. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts +2 -0
  486. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts.map +1 -0
  487. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +67 -0
  488. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -0
  489. package/packages/pi-ai/package.json +6 -1
  490. package/packages/pi-ai/scripts/generate-models.ts +44 -0
  491. package/packages/pi-ai/src/models/custom.ts +42 -0
  492. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  493. package/packages/pi-ai/src/models/generated/openai.ts +17 -0
  494. package/packages/pi-ai/src/models.generated.test.ts +46 -73
  495. package/packages/pi-ai/src/models.test.ts +39 -11
  496. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +1 -1
  497. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -0
  498. package/packages/pi-ai/src/providers/anthropic-shared.ts +26 -5
  499. package/packages/pi-ai/src/providers/anthropic.ts +15 -4
  500. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +98 -0
  501. package/packages/pi-ai/src/providers/openai-completions.ts +57 -16
  502. package/packages/pi-ai/src/providers/simple-options.ts +17 -1
  503. package/packages/pi-ai/src/providers/think-tag-parser.test.ts +44 -0
  504. package/packages/pi-ai/src/providers/think-tag-parser.ts +94 -0
  505. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +200 -23
  506. package/packages/pi-ai/src/utils/oauth/github-copilot.ts +12 -2
  507. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +84 -0
  508. package/packages/pi-ai/src/utils/oauth/google-antigravity.ts +15 -5
  509. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +84 -0
  510. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.ts +16 -5
  511. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  512. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +96 -31
  513. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  514. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js +75 -12
  515. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js.map +1 -1
  516. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +99 -31
  517. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  518. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +2 -0
  519. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  520. package/packages/pi-coding-agent/dist/core/agent-session.js +32 -2
  521. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  522. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +25 -0
  523. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  524. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +105 -6
  525. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  526. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +230 -28
  527. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  528. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts +30 -2
  529. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
  530. package/packages/pi-coding-agent/dist/core/compaction/utils.js +113 -12
  531. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  532. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +1 -0
  533. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
  534. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +29 -18
  535. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  536. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts +2 -0
  537. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts.map +1 -0
  538. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js +130 -0
  539. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js.map +1 -0
  540. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +56 -1
  541. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -1
  542. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +8 -15
  543. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js.map +1 -1
  544. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts +25 -0
  545. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts.map +1 -0
  546. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js +109 -0
  547. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js.map +1 -0
  548. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts +67 -0
  549. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts.map +1 -0
  550. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js +167 -0
  551. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js.map +1 -0
  552. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  553. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  554. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  555. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +8 -2
  556. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  557. package/packages/pi-coding-agent/dist/core/extensions/loader.js +89 -8
  558. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  559. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +35 -2
  560. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  561. package/packages/pi-coding-agent/dist/core/extensions/runner.js +233 -0
  562. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  563. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +212 -2
  564. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  565. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  566. package/packages/pi-coding-agent/dist/core/hooks-runner.d.ts +53 -0
  567. package/packages/pi-coding-agent/dist/core/hooks-runner.d.ts.map +1 -0
  568. package/packages/pi-coding-agent/dist/core/hooks-runner.js +337 -0
  569. package/packages/pi-coding-agent/dist/core/hooks-runner.js.map +1 -0
  570. package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts +2 -0
  571. package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts.map +1 -0
  572. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +234 -0
  573. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -0
  574. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
  575. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  576. package/packages/pi-coding-agent/dist/core/index.js +1 -0
  577. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  578. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +41 -4
  579. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
  580. package/packages/pi-coding-agent/dist/core/model-discovery.d.ts +3 -1
  581. package/packages/pi-coding-agent/dist/core/model-discovery.d.ts.map +1 -1
  582. package/packages/pi-coding-agent/dist/core/model-discovery.js +92 -12
  583. package/packages/pi-coding-agent/dist/core/model-discovery.js.map +1 -1
  584. package/packages/pi-coding-agent/dist/core/model-discovery.test.js +16 -1
  585. package/packages/pi-coding-agent/dist/core/model-discovery.test.js.map +1 -1
  586. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts +2 -0
  587. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts.map +1 -0
  588. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js +40 -0
  589. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js.map +1 -0
  590. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +19 -2
  591. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  592. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts +2 -0
  593. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts.map +1 -0
  594. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js +203 -0
  595. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js.map +1 -0
  596. package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.js +61 -1
  597. package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.js.map +1 -1
  598. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +5 -0
  599. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  600. package/packages/pi-coding-agent/dist/core/model-registry.js +90 -10
  601. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  602. package/packages/pi-coding-agent/dist/core/redact-secrets.d.ts +2 -0
  603. package/packages/pi-coding-agent/dist/core/redact-secrets.d.ts.map +1 -0
  604. package/packages/pi-coding-agent/dist/core/redact-secrets.js +49 -0
  605. package/packages/pi-coding-agent/dist/core/redact-secrets.js.map +1 -0
  606. package/packages/pi-coding-agent/dist/core/redact-secrets.test.d.ts +2 -0
  607. package/packages/pi-coding-agent/dist/core/redact-secrets.test.d.ts.map +1 -0
  608. package/packages/pi-coding-agent/dist/core/redact-secrets.test.js +67 -0
  609. package/packages/pi-coding-agent/dist/core/redact-secrets.test.js.map +1 -0
  610. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +76 -18
  611. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -1
  612. package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -1
  613. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  614. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  615. package/packages/pi-coding-agent/dist/core/retry-handler.js +2 -6
  616. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  617. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +5 -1
  618. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
  619. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts +18 -0
  620. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts.map +1 -0
  621. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js +18 -0
  622. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js.map +1 -0
  623. package/packages/pi-coding-agent/dist/core/sdk.d.ts +1 -0
  624. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  625. package/packages/pi-coding-agent/dist/core/sdk.js +4 -1
  626. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  627. package/packages/pi-coding-agent/dist/core/sdk.test.js +19 -1
  628. package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -1
  629. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  630. package/packages/pi-coding-agent/dist/core/session-manager.js +10 -6
  631. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  632. package/packages/pi-coding-agent/dist/core/session-manager.test.js +45 -1
  633. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  634. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +55 -0
  635. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  636. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  637. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +20 -0
  638. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  639. package/packages/pi-coding-agent/dist/core/system-prompt.js +19 -5
  640. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  641. package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js +2 -1
  642. package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js.map +1 -1
  643. package/packages/pi-coding-agent/dist/index.d.ts +2 -1
  644. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  645. package/packages/pi-coding-agent/dist/index.js +1 -0
  646. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  647. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +15 -6
  648. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js.map +1 -1
  649. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +36 -5
  650. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  651. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +1 -1
  652. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  653. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +5 -4
  654. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  655. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +20 -13
  656. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
  657. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  658. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -5
  659. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  660. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts +7 -1
  661. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  662. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +31 -9
  663. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
  664. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
  665. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +13 -7
  666. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  667. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.d.ts +7 -6
  668. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  669. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +29 -21
  670. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  671. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  672. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +30 -12
  673. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  674. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +14 -0
  675. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  676. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  677. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +13 -1
  678. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  679. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts +2 -0
  680. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts.map +1 -0
  681. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js +130 -0
  682. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js.map +1 -0
  683. package/packages/pi-coding-agent/package.json +6 -1
  684. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +113 -36
  685. package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +89 -17
  686. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +112 -43
  687. package/packages/pi-coding-agent/src/core/agent-session.ts +38 -2
  688. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +368 -28
  689. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +122 -6
  690. package/packages/pi-coding-agent/src/core/compaction/utils.ts +111 -13
  691. package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +154 -0
  692. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +32 -18
  693. package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +68 -1
  694. package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +9 -18
  695. package/packages/pi-coding-agent/src/core/extensions/extension-discovery.ts +119 -0
  696. package/packages/pi-coding-agent/src/core/extensions/extension-registry.ts +222 -0
  697. package/packages/pi-coding-agent/src/core/extensions/index.ts +16 -0
  698. package/packages/pi-coding-agent/src/core/extensions/loader.ts +87 -11
  699. package/packages/pi-coding-agent/src/core/extensions/runner.ts +351 -0
  700. package/packages/pi-coding-agent/src/core/extensions/types.ts +266 -0
  701. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +269 -0
  702. package/packages/pi-coding-agent/src/core/hooks-runner.ts +460 -0
  703. package/packages/pi-coding-agent/src/core/index.ts +10 -0
  704. package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +48 -4
  705. package/packages/pi-coding-agent/src/core/model-discovery.test.ts +19 -0
  706. package/packages/pi-coding-agent/src/core/model-discovery.ts +99 -12
  707. package/packages/pi-coding-agent/src/core/model-registry-auth-header.test.ts +44 -0
  708. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +22 -2
  709. package/packages/pi-coding-agent/src/core/model-registry-custom-caps.test.ts +245 -0
  710. package/packages/pi-coding-agent/src/core/model-registry-discovery.test.ts +75 -0
  711. package/packages/pi-coding-agent/src/core/model-registry.ts +102 -10
  712. package/packages/pi-coding-agent/src/core/redact-secrets.test.ts +86 -0
  713. package/packages/pi-coding-agent/src/core/redact-secrets.ts +58 -0
  714. package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +93 -28
  715. package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -1
  716. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +5 -1
  717. package/packages/pi-coding-agent/src/core/retry-handler.ts +2 -8
  718. package/packages/pi-coding-agent/src/core/retryable-error-regex.ts +18 -0
  719. package/packages/pi-coding-agent/src/core/sdk.test.ts +25 -1
  720. package/packages/pi-coding-agent/src/core/sdk.ts +10 -3
  721. package/packages/pi-coding-agent/src/core/session-manager.test.ts +65 -1
  722. package/packages/pi-coding-agent/src/core/session-manager.ts +10 -6
  723. package/packages/pi-coding-agent/src/core/settings-manager.ts +57 -0
  724. package/packages/pi-coding-agent/src/core/system-prompt.ts +38 -4
  725. package/packages/pi-coding-agent/src/core/tools/path-utils.test.ts +2 -1
  726. package/packages/pi-coding-agent/src/index.ts +17 -0
  727. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +17 -7
  728. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +49 -3
  729. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +6 -6
  730. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +26 -20
  731. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +14 -5
  732. package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +45 -11
  733. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +16 -7
  734. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +36 -22
  735. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +48 -9
  736. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +14 -0
  737. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +13 -1
  738. package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
  739. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  740. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +31 -14
  741. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  742. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +128 -17
  743. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  744. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +51 -6
  745. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
  746. package/packages/pi-tui/dist/__tests__/tui.test.js +18 -30
  747. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  748. package/packages/pi-tui/dist/components/__tests__/input.test.js +10 -3
  749. package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
  750. package/packages/pi-tui/dist/components/__tests__/loader.test.js +53 -9
  751. package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -1
  752. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +6 -2
  753. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -1
  754. package/packages/pi-tui/dist/components/image.test.js +6 -5
  755. package/packages/pi-tui/dist/components/image.test.js.map +1 -1
  756. package/packages/pi-tui/dist/stdin-buffer.d.ts +7 -0
  757. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  758. package/packages/pi-tui/dist/stdin-buffer.js +20 -0
  759. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  760. package/packages/pi-tui/package.json +6 -1
  761. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +46 -15
  762. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +140 -17
  763. package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +62 -6
  764. package/packages/pi-tui/src/__tests__/tui.test.ts +18 -37
  765. package/packages/pi-tui/src/components/__tests__/input.test.ts +19 -3
  766. package/packages/pi-tui/src/components/__tests__/loader.test.ts +112 -35
  767. package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +9 -2
  768. package/packages/pi-tui/src/components/image.test.ts +10 -5
  769. package/packages/pi-tui/src/stdin-buffer.ts +26 -0
  770. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  771. package/packages/rpc-client/dist/rpc-client.test.js +101 -51
  772. package/packages/rpc-client/dist/rpc-client.test.js.map +1 -1
  773. package/packages/rpc-client/package.json +6 -1
  774. package/packages/rpc-client/src/rpc-client.test.ts +109 -52
  775. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  776. package/pkg/package.json +1 -1
  777. package/scripts/install.js +526 -0
  778. package/scripts/lib/workspace-manifest.cjs +86 -0
  779. package/scripts/link-workspace-packages.cjs +5 -16
  780. package/scripts/postinstall.js +9 -178
  781. package/src/resources/agents/researcher.md +1 -1
  782. package/src/resources/extensions/browser-tools/capture.ts +12 -0
  783. package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  784. package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  785. package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  786. package/src/resources/extensions/browser-tools/tools/forms.ts +5 -1
  787. package/src/resources/extensions/browser-tools/tools/intent.ts +5 -1
  788. package/src/resources/extensions/claude-code-cli/readiness.ts +32 -8
  789. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +158 -67
  790. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +331 -86
  791. package/src/resources/extensions/cmux/index.ts +35 -10
  792. package/src/resources/extensions/github-sync/templates.ts +151 -0
  793. package/src/resources/extensions/github-sync/tests/cli.test.ts +76 -7
  794. package/src/resources/extensions/github-sync/tests/templates.test.ts +92 -1
  795. package/src/resources/extensions/google-search/extension-manifest.json +5 -4
  796. package/src/resources/extensions/google-search/index.ts +9 -470
  797. package/src/resources/extensions/gsd/abandon-detect.ts +62 -0
  798. package/src/resources/extensions/gsd/auto/loop-deps.ts +15 -1
  799. package/src/resources/extensions/gsd/auto/loop.ts +104 -2
  800. package/src/resources/extensions/gsd/auto/phases.ts +182 -44
  801. package/src/resources/extensions/gsd/auto/resolve.ts +29 -0
  802. package/src/resources/extensions/gsd/auto/run-unit.ts +56 -4
  803. package/src/resources/extensions/gsd/auto/session.ts +42 -2
  804. package/src/resources/extensions/gsd/auto/turn-epoch.ts +108 -0
  805. package/src/resources/extensions/gsd/auto/types.ts +1 -1
  806. package/src/resources/extensions/gsd/auto-dispatch.ts +157 -24
  807. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  808. package/src/resources/extensions/gsd/auto-model-selection.ts +71 -15
  809. package/src/resources/extensions/gsd/auto-post-unit.ts +173 -3
  810. package/src/resources/extensions/gsd/auto-prompts.ts +413 -94
  811. package/src/resources/extensions/gsd/auto-recovery.ts +40 -1
  812. package/src/resources/extensions/gsd/auto-start.ts +185 -78
  813. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -5
  814. package/src/resources/extensions/gsd/auto-unit-closeout.ts +14 -3
  815. package/src/resources/extensions/gsd/auto-verification.ts +33 -0
  816. package/src/resources/extensions/gsd/auto-worktree.ts +122 -68
  817. package/src/resources/extensions/gsd/auto.ts +152 -42
  818. package/src/resources/extensions/gsd/blocked-models.ts +98 -0
  819. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +140 -2
  820. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +40 -9
  821. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +109 -0
  822. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +5 -0
  823. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +6 -2
  824. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +26 -0
  825. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +54 -6
  826. package/src/resources/extensions/gsd/bootstrap/system-context.ts +102 -35
  827. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +42 -3
  828. package/src/resources/extensions/gsd/clean-root-preflight.ts +111 -0
  829. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +27 -8
  830. package/src/resources/extensions/gsd/commands-cmux.ts +10 -6
  831. package/src/resources/extensions/gsd/commands-extensions.ts +747 -41
  832. package/src/resources/extensions/gsd/commands-extract-learnings.ts +55 -90
  833. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +898 -32
  834. package/src/resources/extensions/gsd/compaction-snapshot.ts +165 -0
  835. package/src/resources/extensions/gsd/complexity-classifier.ts +5 -3
  836. package/src/resources/extensions/gsd/component-loader.ts +598 -0
  837. package/src/resources/extensions/gsd/component-types.ts +362 -0
  838. package/src/resources/extensions/gsd/context-store.ts +25 -8
  839. package/src/resources/extensions/gsd/db-writer.ts +88 -17
  840. package/src/resources/extensions/gsd/detection.ts +58 -1
  841. package/src/resources/extensions/gsd/dispatch-guard.ts +26 -2
  842. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  843. package/src/resources/extensions/gsd/doctor-git-checks.ts +23 -27
  844. package/src/resources/extensions/gsd/doctor-providers.ts +59 -6
  845. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +2 -0
  846. package/src/resources/extensions/gsd/error-classifier.ts +36 -3
  847. package/src/resources/extensions/gsd/exec-history.ts +153 -0
  848. package/src/resources/extensions/gsd/exec-sandbox.ts +326 -0
  849. package/src/resources/extensions/gsd/file-lock.ts +84 -11
  850. package/src/resources/extensions/gsd/forensics.ts +118 -1
  851. package/src/resources/extensions/gsd/git-service.ts +17 -0
  852. package/src/resources/extensions/gsd/gitignore.ts +2 -1
  853. package/src/resources/extensions/gsd/gsd-db.ts +186 -23
  854. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -1
  855. package/src/resources/extensions/gsd/guided-flow.ts +261 -14
  856. package/src/resources/extensions/gsd/health-widget.ts +3 -1
  857. package/src/resources/extensions/gsd/hook-emitter.ts +188 -0
  858. package/src/resources/extensions/gsd/init-wizard.ts +15 -1
  859. package/src/resources/extensions/gsd/journal.ts +39 -3
  860. package/src/resources/extensions/gsd/key-manager.ts +28 -0
  861. package/src/resources/extensions/gsd/memory-backfill.ts +140 -0
  862. package/src/resources/extensions/gsd/memory-extractor.ts +11 -3
  863. package/src/resources/extensions/gsd/memory-store.ts +26 -0
  864. package/src/resources/extensions/gsd/milestone-actions.ts +18 -0
  865. package/src/resources/extensions/gsd/milestone-scope-classifier.ts +366 -0
  866. package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
  867. package/src/resources/extensions/gsd/model-cost-table.ts +3 -0
  868. package/src/resources/extensions/gsd/model-router.ts +48 -1
  869. package/src/resources/extensions/gsd/notifications.ts +27 -15
  870. package/src/resources/extensions/gsd/pre-execution-checks.ts +46 -10
  871. package/src/resources/extensions/gsd/preferences-types.ts +46 -0
  872. package/src/resources/extensions/gsd/preferences-validation.ts +100 -0
  873. package/src/resources/extensions/gsd/preferences.ts +17 -17
  874. package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +4 -0
  875. package/src/resources/extensions/gsd/prompt-loader.ts +30 -7
  876. package/src/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  877. package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  878. package/src/resources/extensions/gsd/prompts/debug-diagnose.md +2 -0
  879. package/src/resources/extensions/gsd/prompts/discuss-headless.md +29 -2
  880. package/src/resources/extensions/gsd/prompts/discuss.md +29 -2
  881. package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  882. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  883. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
  884. package/src/resources/extensions/gsd/prompts/plan-slice.md +16 -2
  885. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -0
  886. package/src/resources/extensions/gsd/prompts/system.md +1 -0
  887. package/src/resources/extensions/gsd/reports.ts +5 -4
  888. package/src/resources/extensions/gsd/safety/evidence-collector.ts +119 -0
  889. package/src/resources/extensions/gsd/safety/file-change-validator.ts +17 -4
  890. package/src/resources/extensions/gsd/safety/safety-harness.ts +9 -0
  891. package/src/resources/extensions/gsd/service-tier.ts +5 -2
  892. package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
  893. package/src/resources/extensions/gsd/slice-cadence.ts +299 -0
  894. package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
  895. package/src/resources/extensions/gsd/state.ts +80 -34
  896. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +2 -1
  897. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +253 -286
  898. package/src/resources/extensions/gsd/tests/auto-mode-guards.test.ts +79 -0
  899. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +95 -1
  900. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +12 -0
  901. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +122 -0
  902. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +4 -1
  903. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +8 -194
  904. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +141 -0
  905. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +64 -0
  906. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +2 -2
  907. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +15 -58
  908. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +2 -2
  909. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +39 -0
  910. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +3 -2
  911. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +23 -0
  912. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +98 -0
  913. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -1
  914. package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +54 -0
  915. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +17 -21
  916. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +108 -0
  917. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +186 -0
  918. package/src/resources/extensions/gsd/tests/cmux.test.ts +5 -9
  919. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +68 -66
  920. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +123 -0
  921. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +263 -0
  922. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +61 -1
  923. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +192 -0
  924. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +2 -1
  925. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  926. package/src/resources/extensions/gsd/tests/complete-task.test.ts +8 -4
  927. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +3 -3
  928. package/src/resources/extensions/gsd/tests/component-loader.test.ts +589 -0
  929. package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
  930. package/src/resources/extensions/gsd/tests/context-store.test.ts +79 -0
  931. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +2 -1
  932. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +161 -0
  933. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -0
  934. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +42 -0
  935. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +8 -4
  936. package/src/resources/extensions/gsd/tests/derive-state.test.ts +1 -2
  937. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +2 -1
  938. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +2 -1
  939. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +14 -9
  940. package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +77 -0
  941. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +25 -0
  942. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +14 -0
  943. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +148 -3
  944. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +4 -3
  945. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +4 -3
  946. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +306 -1
  947. package/src/resources/extensions/gsd/tests/escalation.test.ts +1 -1
  948. package/src/resources/extensions/gsd/tests/exec-history.test.ts +237 -0
  949. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +210 -0
  950. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +173 -0
  951. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +139 -129
  952. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +58 -0
  953. package/src/resources/extensions/gsd/tests/file-lock.test.ts +86 -12
  954. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +8 -104
  955. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +40 -9
  956. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +62 -0
  957. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +131 -0
  958. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +447 -1
  959. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +117 -0
  960. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +4 -55
  961. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +27 -0
  962. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +7 -56
  963. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +30 -0
  964. package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +11 -0
  965. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +78 -0
  966. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +18 -2
  967. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +4 -2
  968. package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +1 -0
  969. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +30 -0
  970. package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +10 -4
  971. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +1 -1
  972. package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +11 -0
  973. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +9 -3
  974. package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +6 -9
  975. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +1 -1
  976. package/src/resources/extensions/gsd/tests/issue-4540-regressions.test.ts +288 -0
  977. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +101 -0
  978. package/src/resources/extensions/gsd/tests/key-manager.test.ts +9 -0
  979. package/src/resources/extensions/gsd/tests/knowledge.test.ts +93 -1
  980. package/src/resources/extensions/gsd/tests/load-memory-block.test.ts +36 -0
  981. package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +47 -0
  982. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  983. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +5 -15
  984. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +12 -0
  985. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  986. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +227 -55
  987. package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +187 -0
  988. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +3 -3
  989. package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
  990. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +4 -2
  991. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
  992. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  993. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +6 -48
  994. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +6 -3
  995. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +59 -2
  996. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +5 -0
  997. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +274 -112
  998. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +150 -0
  999. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +301 -0
  1000. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +37 -0
  1001. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +14 -0
  1002. package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +272 -0
  1003. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +356 -0
  1004. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +2 -1
  1005. package/src/resources/extensions/gsd/tests/preferences.test.ts +110 -0
  1006. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +44 -0
  1007. package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +12 -0
  1008. package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +49 -0
  1009. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +15 -4
  1010. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +164 -45
  1011. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +181 -0
  1012. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +3 -2
  1013. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +4 -5
  1014. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +13 -7
  1015. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +388 -0
  1016. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +132 -0
  1017. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +8 -40
  1018. package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +136 -256
  1019. package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +170 -0
  1020. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +114 -0
  1021. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +15 -6
  1022. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +230 -0
  1023. package/src/resources/extensions/gsd/tests/rewrite-docs-abandon-detect.test.ts +195 -0
  1024. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +148 -0
  1025. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +205 -0
  1026. package/src/resources/extensions/gsd/tests/save-gate-result-render.test.ts +95 -0
  1027. package/src/resources/extensions/gsd/tests/schema-v21-sequence.test.ts +413 -0
  1028. package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
  1029. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +32 -40
  1030. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +3 -2
  1031. package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +55 -95
  1032. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +120 -1
  1033. package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
  1034. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +242 -0
  1035. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +3 -2
  1036. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +2 -1
  1037. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +112 -0
  1038. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +56 -0
  1039. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +24 -0
  1040. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
  1041. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +3 -3
  1042. package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +11 -92
  1043. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +2 -2
  1044. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +7 -6
  1045. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +102 -101
  1046. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +4 -3
  1047. package/src/resources/extensions/gsd/tests/test-helpers.test.ts +98 -0
  1048. package/src/resources/extensions/gsd/tests/test-helpers.ts +153 -0
  1049. package/src/resources/extensions/gsd/tests/token-counter.test.ts +105 -1
  1050. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
  1051. package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +107 -0
  1052. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +50 -2
  1053. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +162 -0
  1054. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +355 -0
  1055. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +203 -0
  1056. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +51 -0
  1057. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +16 -0
  1058. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +49 -26
  1059. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +65 -0
  1060. package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
  1061. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +42 -2
  1062. package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
  1063. package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +168 -0
  1064. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +148 -8
  1065. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +144 -80
  1066. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -54
  1067. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +342 -277
  1068. package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +37 -29
  1069. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +25 -2
  1070. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +65 -2
  1071. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +242 -247
  1072. package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +103 -67
  1073. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +6 -1
  1074. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +92 -90
  1075. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +78 -5
  1076. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +238 -59
  1077. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +113 -161
  1078. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +210 -0
  1079. package/src/resources/extensions/gsd/tests/write-gate.test.ts +64 -0
  1080. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +80 -94
  1081. package/src/resources/extensions/gsd/token-counter.ts +22 -5
  1082. package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
  1083. package/src/resources/extensions/gsd/tools/complete-slice.ts +38 -0
  1084. package/src/resources/extensions/gsd/tools/complete-task.ts +49 -0
  1085. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +81 -0
  1086. package/src/resources/extensions/gsd/tools/exec-tool.ts +183 -0
  1087. package/src/resources/extensions/gsd/tools/memory-tools.ts +31 -1
  1088. package/src/resources/extensions/gsd/tools/resume-tool.ts +40 -0
  1089. package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -2
  1090. package/src/resources/extensions/gsd/unit-context-composer.ts +218 -0
  1091. package/src/resources/extensions/gsd/unit-context-manifest.ts +492 -0
  1092. package/src/resources/extensions/gsd/uok/audit.ts +20 -2
  1093. package/src/resources/extensions/gsd/uok/contracts.ts +65 -0
  1094. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +56 -0
  1095. package/src/resources/extensions/gsd/uok/execution-graph.ts +22 -0
  1096. package/src/resources/extensions/gsd/uok/gitops.ts +6 -1
  1097. package/src/resources/extensions/gsd/uok/loop-adapter.ts +45 -10
  1098. package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
  1099. package/src/resources/extensions/gsd/uok/plan-v2.ts +39 -8
  1100. package/src/resources/extensions/gsd/uok/writer.ts +113 -0
  1101. package/src/resources/extensions/gsd/workflow-logger.ts +25 -3
  1102. package/src/resources/extensions/gsd/workflow-mcp.ts +3 -0
  1103. package/src/resources/extensions/gsd/workflow-templates/spike.md +6 -0
  1104. package/src/resources/extensions/gsd/worktree-manager.ts +54 -0
  1105. package/src/resources/extensions/gsd/worktree-resolver.ts +150 -18
  1106. package/src/resources/extensions/gsd/worktree-telemetry.ts +322 -0
  1107. package/src/resources/extensions/mcp-client/auth.ts +12 -1
  1108. package/src/resources/extensions/mcp-client/index.ts +132 -11
  1109. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +70 -36
  1110. package/src/resources/extensions/ollama/index.ts +5 -1
  1111. package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +123 -15
  1112. package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +206 -19
  1113. package/src/resources/extensions/remote-questions/manager.ts +36 -4
  1114. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +200 -190
  1115. package/src/resources/extensions/search-the-web/command-search-provider.ts +5 -4
  1116. package/src/resources/extensions/search-the-web/native-search.ts +48 -12
  1117. package/src/resources/extensions/shared/cmux-events.ts +59 -0
  1118. package/src/resources/extensions/shared/rtk-session-stats.ts +1 -2
  1119. package/src/resources/extensions/shared/tests/interview-preview.test.ts +11 -3
  1120. package/src/resources/extensions/voice/tests/linux-ready.test.ts +129 -113
  1121. package/src/resources/skills/api-design/SKILL.md +190 -0
  1122. package/src/resources/skills/create-mcp-server/SKILL.md +121 -0
  1123. package/src/resources/skills/create-skill/SKILL.md +2 -2
  1124. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  1125. package/src/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  1126. package/src/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  1127. package/src/resources/skills/decompose-into-slices/SKILL.md +139 -0
  1128. package/src/resources/skills/dependency-upgrade/SKILL.md +158 -0
  1129. package/src/resources/skills/design-an-interface/SKILL.md +102 -0
  1130. package/src/resources/skills/forensics/SKILL.md +153 -0
  1131. package/src/resources/skills/grill-me/SKILL.md +93 -0
  1132. package/src/resources/skills/handoff/SKILL.md +121 -0
  1133. package/src/resources/skills/observability/SKILL.md +174 -0
  1134. package/src/resources/skills/security-review/SKILL.md +181 -0
  1135. package/src/resources/skills/spike-wrap-up/SKILL.md +138 -0
  1136. package/src/resources/skills/tdd/SKILL.md +112 -0
  1137. package/src/resources/skills/verify-before-complete/SKILL.md +98 -0
  1138. package/src/resources/skills/write-docs/SKILL.md +82 -0
  1139. package/src/resources/skills/write-milestone-brief/SKILL.md +135 -0
  1140. package/dist/web/standalone/.next/server/chunks/7461.js +0 -1
  1141. package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +0 -9
  1142. package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +0 -1
  1143. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  1144. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  1145. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +0 -113
  1146. package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +0 -142
  1147. package/src/resources/extensions/gsd/tests/dashboard-model-label-ordering.test.ts +0 -107
  1148. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +0 -48
  1149. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -159
  1150. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
  1151. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -79
  1152. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +0 -74
  1153. package/src/resources/extensions/gsd/tests/forensics-journal.test.ts +0 -162
  1154. package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +0 -38
  1155. package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +0 -73
  1156. package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +0 -125
  1157. package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +0 -42
  1158. /package/dist/web/standalone/.next/static/{ssX7BLv3Dw9Fb4CtrCGeR → gYYky7yfxW8txb9vU2TrJ}/_buildManifest.js +0 -0
  1159. /package/dist/web/standalone/.next/static/{ssX7BLv3Dw9Fb4CtrCGeR → gYYky7yfxW8txb9vU2TrJ}/_ssgManifest.js +0 -0
package/dist/headless.js CHANGED
@@ -11,7 +11,7 @@
11
11
  * 10 — blocked (command reported a blocker)
12
12
  * 11 — cancelled (SIGINT/SIGTERM received)
13
13
  */
14
- import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
14
+ import { existsSync, mkdirSync, writeFileSync, writeSync } from 'node:fs';
15
15
  import { join } from 'node:path';
16
16
  import { resolve } from 'node:path';
17
17
  import { RpcClient, SessionManager } from '@gsd/pi-coding-agent';
@@ -616,7 +616,15 @@ async function runHeadlessOnce(options, restartCount) {
616
616
  });
617
617
  // Signal handling
618
618
  const signalHandler = () => {
619
- process.stderr.write('\n[headless] Interrupted, stopping child process...\n');
619
+ // Use writeSync on fd 2 to guarantee the Interrupted marker reaches
620
+ // consumers before process.exit() truncates pending async writes.
621
+ try {
622
+ writeSync(2, '\n[headless] Interrupted, stopping child process...\n');
623
+ }
624
+ catch {
625
+ // Fallback to async write if fd 2 is somehow unavailable.
626
+ process.stderr.write('\n[headless] Interrupted, stopping child process...\n');
627
+ }
620
628
  interrupted = true;
621
629
  exitCode = EXIT_CANCELLED;
622
630
  // Kill child process — don't await, just fire and exit.
@@ -635,8 +643,21 @@ async function runHeadlessOnce(options, restartCount) {
635
643
  }
636
644
  process.exit(exitCode);
637
645
  };
638
- process.on('SIGINT', signalHandler);
639
- process.on('SIGTERM', signalHandler);
646
+ // Use prependListener so our handler runs before pi-coding-agent's
647
+ // LSP-client module-load SIGINT handler, which calls process.exit(0)
648
+ // and would otherwise short-circuit our exit-code-11 contract.
649
+ process.prependListener('SIGINT', signalHandler);
650
+ process.prependListener('SIGTERM', signalHandler);
651
+ // Emit a deterministic readiness marker so test harnesses can wait for
652
+ // the SIGINT handler to be live before sending a signal. writeSync on
653
+ // fd 2 avoids any pipe-buffering race between the marker and subsequent
654
+ // signal delivery.
655
+ try {
656
+ writeSync(2, '[headless] signal-handlers-ready\n');
657
+ }
658
+ catch {
659
+ process.stderr.write('[headless] signal-handlers-ready\n');
660
+ }
640
661
  // Start the RPC session
641
662
  try {
642
663
  await client.start();
package/dist/loader.js CHANGED
@@ -3,7 +3,7 @@
3
3
  // Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
4
4
  import { fileURLToPath } from 'url';
5
5
  import { dirname, resolve, join, relative, delimiter } from 'path';
6
- import { existsSync, readFileSync, mkdirSync, symlinkSync, cpSync } from 'fs';
6
+ import { existsSync, readFileSync, readdirSync, statSync, mkdirSync, symlinkSync, cpSync } from 'fs';
7
7
  // Fast-path: handle --version/-v and --help/-h before importing any heavy
8
8
  // dependencies. This avoids loading the entire pi-coding-agent barrel import
9
9
  // (~1s) just to print a version string.
@@ -155,15 +155,42 @@ if (process.env.HTTP_PROXY || process.env.HTTPS_PROXY || process.env.http_proxy
155
155
  // On Windows without Developer Mode or admin rights, symlinkSync will throw even for
156
156
  // 'junction' type — so we fall back to cpSync (a full directory copy) which works
157
157
  // everywhere without elevated permissions.
158
- const gsdScopeDir = join(gsdNodeModules, '@gsd');
158
+ // Discover linkable workspace packages by scanning packages/*/package.json for
159
+ // `gsd.linkable === true`. This is the single source of truth — the same list
160
+ // read by scripts/link-workspace-packages.cjs and scripts/validate-pack.js.
161
+ // Adding a new linkable package requires only setting `gsd.linkable` in its
162
+ // package.json; there is no enumeration to keep in sync here.
159
163
  const packagesDir = join(gsdRoot, 'packages');
160
- const wsPackages = ['native', 'pi-agent-core', 'pi-ai', 'pi-coding-agent', 'pi-tui'];
164
+ const wsPackages = [];
165
+ try {
166
+ if (existsSync(packagesDir)) {
167
+ for (const dir of readdirSync(packagesDir)) {
168
+ const pkgPath = join(packagesDir, dir);
169
+ if (!statSync(pkgPath).isDirectory())
170
+ continue;
171
+ const pkgJsonPath = join(pkgPath, 'package.json');
172
+ if (!existsSync(pkgJsonPath))
173
+ continue;
174
+ try {
175
+ const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
176
+ const gsd = pkg.gsd;
177
+ if (!gsd || gsd.linkable !== true)
178
+ continue;
179
+ if (gsd.scope && gsd.name)
180
+ wsPackages.push({ dir, scope: gsd.scope, name: gsd.name });
181
+ }
182
+ catch { /* ignore malformed package.json */ }
183
+ }
184
+ }
185
+ }
186
+ catch { /* non-fatal — validation below catches missing critical packages */ }
161
187
  try {
162
- if (!existsSync(gsdScopeDir))
163
- mkdirSync(gsdScopeDir, { recursive: true });
164
188
  for (const pkg of wsPackages) {
165
- const target = join(gsdScopeDir, pkg);
166
- const source = join(packagesDir, pkg);
189
+ const scopeDir = join(gsdNodeModules, pkg.scope);
190
+ if (!existsSync(scopeDir))
191
+ mkdirSync(scopeDir, { recursive: true });
192
+ const target = join(scopeDir, pkg.name);
193
+ const source = join(packagesDir, pkg.dir);
167
194
  if (!existsSync(source) || existsSync(target))
168
195
  continue;
169
196
  try {
@@ -180,6 +207,7 @@ try {
180
207
  }
181
208
  }
182
209
  catch { /* non-fatal */ }
210
+ const gsdScopeDir = join(gsdNodeModules, '@gsd');
183
211
  // Validate critical workspace packages are resolvable. If still missing after the
184
212
  // symlink+copy attempts, emit a clear diagnostic instead of a cryptic
185
213
  // ERR_MODULE_NOT_FOUND from deep inside cli.js.
@@ -1,6 +1,11 @@
1
1
  /**
2
2
  * Minimal tool interface matching GSD's AgentTool shape.
3
3
  * Avoids a direct dependency on @gsd/pi-agent-core from this compiled module.
4
+ *
5
+ * `details` and `isError` are optional fields that runtime tool implementations
6
+ * may populate. The MCP transport drops non-standard fields, so the wrapper at
7
+ * the call site mirrors `details` into `structuredContent` and forwards
8
+ * `isError` directly. See #4472.
4
9
  */
5
10
  export interface McpToolDef {
6
11
  name: string;
@@ -13,6 +18,8 @@ export interface McpToolDef {
13
18
  data?: string;
14
19
  mimeType?: string;
15
20
  }>;
21
+ details?: Record<string, unknown>;
22
+ isError?: boolean;
16
23
  }>;
17
24
  }
18
25
  /**
@@ -1,3 +1,21 @@
1
+ /**
2
+ * Strict plain-object guard. True only for object literals and
3
+ * `Object.create(null)` — not for `Date`, `URL`, `Map`, `Set`, class instances,
4
+ * or arrays. Used to gate `structuredContent` forwarding so the MCP transport
5
+ * receives only true JSON objects (the protocol contract). See #4477 review.
6
+ *
7
+ * Mirrored in `packages/mcp-server/src/workflow-tools.ts` for the
8
+ * `adaptExecutorResult` adapter on the workflow path. Keep both copies in
9
+ * sync if the contract definition needs to evolve.
10
+ */
11
+ function isPlainObject(value) {
12
+ if (value === null || typeof value !== 'object')
13
+ return false;
14
+ if (Array.isArray(value))
15
+ return false;
16
+ const proto = Object.getPrototypeOf(value);
17
+ return proto === null || proto === Object.prototype;
18
+ }
1
19
  // MCP SDK subpath imports use wildcard exports (./*) in @modelcontextprotocol/sdk's
2
20
  // package.json export map. The wildcard maps "./foo" → "./dist/cjs/foo" (no .js
3
21
  // suffix), so bare subpath specifiers like `${MCP_PKG}/server/stdio` resolve to
@@ -83,7 +101,23 @@ export async function startMcpServer(options) {
83
101
  // by stringifying into a text block so clients see the payload.
84
102
  return { type: 'text', text: JSON.stringify(block) };
85
103
  });
86
- return { content };
104
+ // Forward a tool's runtime `details` field to MCP's `structuredContent`
105
+ // channel. The protocol drops non-standard fields on the wire, so tools
106
+ // that populate `details` for client-side renderers (e.g. save_gate_result)
107
+ // would otherwise arrive empty on the other side. See #4472.
108
+ //
109
+ // Use a strict plain-object guard (prototype-chain check) rather than just
110
+ // `typeof === 'object' && !Array.isArray()` — Date, URL, Map, Set, and
111
+ // class instances would otherwise pass through and end up as
112
+ // `structuredContent`, violating the protocol's JSON-object contract.
113
+ // The mirror discipline applies in `workflow-tools.ts adaptExecutorResult`.
114
+ const base = { content };
115
+ if (isPlainObject(result.details)) {
116
+ base.structuredContent = result.details;
117
+ }
118
+ if (result.isError === true)
119
+ base.isError = true;
120
+ return base;
87
121
  }
88
122
  catch (err) {
89
123
  // AbortError from a cancelled tool surfaces as a normal error — MCP
@@ -60,6 +60,8 @@ const OTHER_PROVIDERS = [
60
60
  { value: 'xai', label: 'xAI (Grok)', hint: 'console.x.ai' },
61
61
  { value: 'openrouter', label: 'OpenRouter', hint: '200+ models — openrouter.ai/keys' },
62
62
  { value: 'mistral', label: 'Mistral', hint: 'console.mistral.ai/api-keys' },
63
+ { value: 'minimax', label: 'MiniMax', hint: 'platform.minimax.io (Anthropic-compatible recommended)' },
64
+ { value: 'minimax-cn', label: 'MiniMax CN', hint: 'api.minimaxi.com (Anthropic-compatible)' },
63
65
  { value: 'ollama-cloud', label: 'Ollama Cloud' },
64
66
  { value: 'custom-openai', label: 'Custom (OpenAI-compatible)', hint: 'Ollama, LM Studio, vLLM, proxies — see docs/providers.md' },
65
67
  ];
@@ -131,6 +133,36 @@ function persistDefaultProvider(providerId) {
131
133
  // Non-fatal: startup fallback logic will still run.
132
134
  }
133
135
  }
136
+ /**
137
+ * Persist the selected default model to settings.json.
138
+ */
139
+ function persistDefaultModel(modelId) {
140
+ const settingsPath = join(agentDir, 'settings.json');
141
+ try {
142
+ const raw = existsSync(settingsPath) ? JSON.parse(readFileSync(settingsPath, 'utf-8')) : {};
143
+ raw.defaultModel = modelId;
144
+ mkdirSync(dirname(settingsPath), { recursive: true });
145
+ writeFileSync(settingsPath, JSON.stringify(raw, null, 2), 'utf-8');
146
+ }
147
+ catch {
148
+ // Non-fatal: startup fallback logic will still run.
149
+ }
150
+ }
151
+ function detectNativeProviderFromBaseUrl(baseUrl) {
152
+ try {
153
+ const hostname = new URL(baseUrl).hostname.toLowerCase();
154
+ if (hostname === 'api.minimax.io' || hostname.endsWith('.minimax.io')) {
155
+ return 'minimax';
156
+ }
157
+ if (hostname === 'api.minimaxi.com' || hostname.endsWith('.minimaxi.com')) {
158
+ return 'minimax-cn';
159
+ }
160
+ }
161
+ catch {
162
+ // ignore parse failures; handled by prior validation
163
+ }
164
+ return null;
165
+ }
134
166
  /** Sentinel returned by runStep when the user cancels — tells the caller
135
167
  * to abort the entire wizard. */
136
168
  const STEP_CANCELLED = Symbol('step-cancelled');
@@ -558,9 +590,22 @@ async function runCustomOpenAIFlow(p, pc, authStorage) {
558
590
  if (p.isCancel(modelId) || !modelId)
559
591
  return false;
560
592
  const trimmedModelId = modelId.trim();
593
+ const nativeProvider = detectNativeProviderFromBaseUrl(trimmedUrl);
594
+ if (nativeProvider) {
595
+ const envVar = nativeProvider === 'minimax' ? 'MINIMAX_API_KEY' : 'MINIMAX_CN_API_KEY';
596
+ authStorage.set(nativeProvider, { type: 'api_key', key: trimmedKey });
597
+ persistDefaultProvider(nativeProvider);
598
+ persistDefaultModel(trimmedModelId);
599
+ process.env[envVar] = trimmedKey;
600
+ p.log.success(`${pc.green('MiniMax')} detected — configured as native provider (${pc.cyan(nativeProvider)})`);
601
+ p.log.info(`Model: ${pc.cyan(trimmedModelId)}`);
602
+ p.log.info(pc.dim('Using Anthropic-compatible MiniMax integration for full model metadata and clean thinking output.'));
603
+ return true;
604
+ }
561
605
  // Save API key to auth storage
562
606
  authStorage.set('custom-openai', { type: 'api_key', key: trimmedKey });
563
607
  persistDefaultProvider('custom-openai');
608
+ persistDefaultModel(trimmedModelId);
564
609
  // Write or merge into models.json
565
610
  const modelsJsonPath = join(agentDir, 'models.json');
566
611
  let config = { providers: {} };
@@ -5,6 +5,24 @@ type AnthropicMigrationDeps = {
5
5
  defaultProvider: string | undefined;
6
6
  env?: NodeJS.ProcessEnv;
7
7
  };
8
+ type MigrationModel = {
9
+ provider: string;
10
+ id: string;
11
+ };
12
+ type AnthropicDefaultMigrationDeps = {
13
+ authStorage: Pick<AuthStorage, "getCredentialsForProvider">;
14
+ isClaudeCodeReady: boolean;
15
+ settingsManager: {
16
+ getDefaultProvider(): string | undefined;
17
+ getDefaultModel(): string | undefined;
18
+ setDefaultModelAndProvider(provider: string, modelId: string): void;
19
+ };
20
+ modelRegistry: {
21
+ getAvailable(): MigrationModel[];
22
+ };
23
+ env?: NodeJS.ProcessEnv;
24
+ };
8
25
  export declare function hasDirectAnthropicApiKey(authStorage: Pick<AuthStorage, "getCredentialsForProvider">, env?: NodeJS.ProcessEnv): boolean;
9
26
  export declare function shouldMigrateAnthropicToClaudeCode({ authStorage, isClaudeCodeReady, defaultProvider, env, }: AnthropicMigrationDeps): boolean;
27
+ export declare function migrateAnthropicDefaultToClaudeCode({ authStorage, isClaudeCodeReady, settingsManager, modelRegistry, env, }: AnthropicDefaultMigrationDeps): boolean;
10
28
  export {};
@@ -10,3 +10,17 @@ export function shouldMigrateAnthropicToClaudeCode({ authStorage, isClaudeCodeRe
10
10
  }
11
11
  return !hasDirectAnthropicApiKey(authStorage, env);
12
12
  }
13
+ export function migrateAnthropicDefaultToClaudeCode({ authStorage, isClaudeCodeReady, settingsManager, modelRegistry, env = process.env, }) {
14
+ const defaultProvider = settingsManager.getDefaultProvider();
15
+ if (!shouldMigrateAnthropicToClaudeCode({ authStorage, isClaudeCodeReady, defaultProvider, env })) {
16
+ return false;
17
+ }
18
+ const defaultModel = settingsManager.getDefaultModel();
19
+ const target = modelRegistry.getAvailable().find((model) => model.provider === "claude-code" && model.id === defaultModel) ||
20
+ modelRegistry.getAvailable().find((model) => model.provider === "claude-code");
21
+ if (!target) {
22
+ return false;
23
+ }
24
+ settingsManager.setDefaultModelAndProvider(target.provider, target.id);
25
+ return true;
26
+ }
@@ -2,7 +2,47 @@ import { DefaultResourceLoader } from '@gsd/pi-coding-agent';
2
2
  export { discoverExtensionEntryPaths } from './extension-discovery.js';
3
3
  export declare function getExtensionKey(entryPath: string, extensionsDir: string): string;
4
4
  export declare function readManagedResourceVersion(agentDir: string): string | null;
5
+ /**
6
+ * Computes a content fingerprint of a resources directory (defaults to the
7
+ * bundled resourcesDir).
8
+ *
9
+ * Walks all files under `rootDir` and hashes `${relativePath}:${sha256(contents)}`
10
+ * for each one. Using the file *contents* — not size — is what distinguishes
11
+ * this from the earlier implementation and closes #4787: a same-size edit
12
+ * (e.g. swapping one word for another word of the same byte length) produces
13
+ * a different file hash, bumps the aggregate fingerprint, and therefore
14
+ * triggers a full resync in `initResources`. The old path+size approach
15
+ * silently cached stale prompts across upgrades.
16
+ *
17
+ * Cost is ~1-2ms for a typical resources tree (~100 small .md files) —
18
+ * still negligible at startup. Files are streamed via `readFileSync` but
19
+ * bundled prompts are tiny so this is fine.
20
+ *
21
+ * Exported for unit tests and for callers that want to check a different
22
+ * directory (e.g. pre-install verification).
23
+ */
24
+ export declare function computeResourceFingerprint(rootDir?: string): string;
5
25
  export declare function getNewerManagedResourceVersion(agentDir: string, currentVersion: string): string | null;
26
+ /**
27
+ * Syncs a single bundled resource directory into the agent directory.
28
+ *
29
+ * 1. Makes the destination writable (handles Nix store read-only copies).
30
+ * 2. Removes destination subdirs that exist in source to clear stale files,
31
+ * while preserving user-created directories.
32
+ * 3. Copies source into destination.
33
+ * 4. Makes the result writable for the next upgrade cycle.
34
+ */
35
+ export declare function syncResourceDir(srcDir: string, destDir: string): void;
36
+ /** Check if any @gsd* scopes exist in internal but not in hoisted node_modules */
37
+ export declare function hasMissingWorkspaceScopes(hoisted: string, internal: string): boolean;
38
+ /**
39
+ * Create a real node_modules directory containing symlinks from both the
40
+ * hoisted root (external deps) and internal root (@gsd/* workspace packages).
41
+ * Used for pnpm global installs where @gsd/* isn't hoisted.
42
+ */
43
+ export declare function reconcileMergedNodeModules(agentNodeModules: string, hoisted: string, internal: string): void;
44
+ /** Build a cache fingerprint from packageRoot + sorted entry names of both directories */
45
+ export declare function mergedFingerprint(hoisted: string, internal: string): string;
6
46
  /**
7
47
  * Syncs all bundled resources to agentDir (~/.gsd/agent/) on every launch.
8
48
  *
@@ -21,6 +61,6 @@ export declare function getNewerManagedResourceVersion(agentDir: string, current
21
61
  *
22
62
  * Inspectable: `ls ~/.gsd/agent/extensions/`
23
63
  */
24
- export declare function initResources(agentDir: string): void;
64
+ export declare function initResources(agentDir: string, skillsDir?: string): void;
25
65
  export declare function hasStaleCompiledExtensionSiblings(extensionsDir: string, sourceDir?: string): boolean;
26
66
  export declare function buildResourceLoader(agentDir: string): DefaultResourceLoader;
@@ -101,17 +101,27 @@ function readManagedResourceManifest(agentDir) {
101
101
  }
102
102
  }
103
103
  /**
104
- * Computes a lightweight content fingerprint of the bundled resources directory.
104
+ * Computes a content fingerprint of a resources directory (defaults to the
105
+ * bundled resourcesDir).
105
106
  *
106
- * Walks all files under resourcesDir and hashes their relative paths + sizes.
107
- * This catches same-version content changes (npm link dev workflow, hotfixes
108
- * within a release) without the cost of reading every file's contents.
107
+ * Walks all files under `rootDir` and hashes `${relativePath}:${sha256(contents)}`
108
+ * for each one. Using the file *contents* not size — is what distinguishes
109
+ * this from the earlier implementation and closes #4787: a same-size edit
110
+ * (e.g. swapping one word for another word of the same byte length) produces
111
+ * a different file hash, bumps the aggregate fingerprint, and therefore
112
+ * triggers a full resync in `initResources`. The old path+size approach
113
+ * silently cached stale prompts across upgrades.
109
114
  *
110
- * ~1ms for a typical resources tree (~100 files) — just stat calls, no reads.
115
+ * Cost is ~1-2ms for a typical resources tree (~100 small .md files) —
116
+ * still negligible at startup. Files are streamed via `readFileSync` but
117
+ * bundled prompts are tiny so this is fine.
118
+ *
119
+ * Exported for unit tests and for callers that want to check a different
120
+ * directory (e.g. pre-install verification).
111
121
  */
112
- function computeResourceFingerprint() {
122
+ export function computeResourceFingerprint(rootDir = resourcesDir) {
113
123
  const entries = [];
114
- collectFileEntries(resourcesDir, resourcesDir, entries);
124
+ collectFileEntries(rootDir, rootDir, entries);
115
125
  entries.sort();
116
126
  return createHash('sha256').update(entries.join('\n')).digest('hex').slice(0, 16);
117
127
  }
@@ -125,8 +135,17 @@ function collectFileEntries(dir, root, out) {
125
135
  }
126
136
  else {
127
137
  const rel = relative(root, fullPath);
128
- const size = statSync(fullPath).size;
129
- out.push(`${rel}:${size}`);
138
+ // Hash the file contents — see function doc for #4787 rationale.
139
+ let contentHash;
140
+ try {
141
+ contentHash = createHash('sha256').update(readFileSync(fullPath)).digest('hex');
142
+ }
143
+ catch {
144
+ // Unreadable file — fall back to a stable marker so the entry still
145
+ // contributes to the aggregate hash and future reads will re-hash.
146
+ contentHash = 'unreadable';
147
+ }
148
+ out.push(`${rel}:${contentHash}`);
130
149
  }
131
150
  }
132
151
  }
@@ -188,7 +207,7 @@ function makeTreeWritable(dirPath) {
188
207
  * 3. Copies source into destination.
189
208
  * 4. Makes the result writable for the next upgrade cycle.
190
209
  */
191
- function syncResourceDir(srcDir, destDir) {
210
+ export function syncResourceDir(srcDir, destDir) {
192
211
  makeTreeWritable(destDir);
193
212
  if (existsSync(srcDir)) {
194
213
  pruneStaleSiblingFiles(srcDir, destDir);
@@ -282,7 +301,7 @@ function ensureNodeModulesSymlink(agentDir) {
282
301
  reconcileMergedNodeModules(agentNodeModules, hoistedNodeModules, internalNodeModules);
283
302
  }
284
303
  /** Check if any @gsd* scopes exist in internal but not in hoisted node_modules */
285
- function hasMissingWorkspaceScopes(hoisted, internal) {
304
+ export function hasMissingWorkspaceScopes(hoisted, internal) {
286
305
  if (!existsSync(internal))
287
306
  return false;
288
307
  try {
@@ -326,7 +345,7 @@ function reconcileSymlink(link, target) {
326
345
  * hoisted root (external deps) and internal root (@gsd/* workspace packages).
327
346
  * Used for pnpm global installs where @gsd/* isn't hoisted.
328
347
  */
329
- function reconcileMergedNodeModules(agentNodeModules, hoisted, internal) {
348
+ export function reconcileMergedNodeModules(agentNodeModules, hoisted, internal) {
330
349
  // Fast path: if already merged for this packageRoot + same directory contents, skip.
331
350
  // The fingerprint includes entry names from both roots so `pnpm add/remove` triggers rebuild.
332
351
  const marker = join(agentNodeModules, '.gsd-merged');
@@ -400,7 +419,7 @@ function reconcileMergedNodeModules(agentNodeModules, hoisted, internal) {
400
419
  }
401
420
  }
402
421
  /** Build a cache fingerprint from packageRoot + sorted entry names of both directories */
403
- function mergedFingerprint(hoisted, internal) {
422
+ export function mergedFingerprint(hoisted, internal) {
404
423
  try {
405
424
  const h = readdirSync(hoisted).sort().join(',');
406
425
  const i = readdirSync(internal).sort().join(',');
@@ -506,7 +525,7 @@ function pruneRemovedBundledExtensions(manifest, agentDir) {
506
525
  *
507
526
  * Inspectable: `ls ~/.gsd/agent/extensions/`
508
527
  */
509
- export function initResources(agentDir) {
528
+ export function initResources(agentDir, skillsDir = join(homedir(), '.agents', 'skills')) {
510
529
  mkdirSync(agentDir, { recursive: true });
511
530
  const currentVersion = getBundledGsdVersion();
512
531
  const manifest = readManagedResourceManifest(agentDir);
@@ -538,13 +557,7 @@ export function initResources(agentDir) {
538
557
  // Sync bundled resources — overwrite so updates land on next launch.
539
558
  syncResourceDir(bundledExtensionsDir, join(agentDir, 'extensions'));
540
559
  syncResourceDir(join(resourcesDir, 'agents'), join(agentDir, 'agents'));
541
- // Skills are no longer force-synced here. Users install skills via the
542
- // skills.sh CLI (`npx skills add <repo>`) into ~/.agents/skills/ which
543
- // is the industry-standard Agent Skills ecosystem directory.
544
- //
545
- // Migration from the legacy ~/.gsd/agent/skills/ directory is handled
546
- // above the manifest check so it runs on every launch (including retries
547
- // after partial copy failures).
560
+ syncResourceDir(join(resourcesDir, 'skills'), skillsDir);
548
561
  // Sync GSD-WORKFLOW.md to agentDir as a fallback for when GSD_WORKFLOW_PATH
549
562
  // env var is not set (e.g. fork/dev builds, alternative entry points).
550
563
  const workflowSrc = join(resourcesDir, 'GSD-WORKFLOW.md');
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: researcher
3
3
  description: Web researcher that finds and synthesizes current information using Brave Search
4
- tools: search-the-web, bash
4
+ tools: search-the-web, bash, capture_thought, memory_query, gsd_graph
5
5
  ---
6
6
 
7
7
  You are a web researcher. You find current, accurate information using web search and synthesize it into a clear, well-structured report.
@@ -21,6 +21,15 @@ async function getSharp() {
21
21
  }
22
22
  return _sharp;
23
23
  }
24
+ /**
25
+ * Test-only seam: override the cached sharp module. Pass `null` to simulate
26
+ * an environment where the sharp native dep is unavailable; pass `undefined`
27
+ * to clear the cache and let the next getSharp() call re-import. See
28
+ * tests/capture-sharp-optional.test.cjs.
29
+ */
30
+ export function __setSharpForTesting(value) {
31
+ _sharp = value;
32
+ }
24
33
  import { formatCompactStateSummary } from "./utils.js";
25
34
  // Anthropic vision: 1568px is the recommended optimal width. Height is capped
26
35
  // generously at 8000px so tall full-page screenshots remain readable rather
@@ -12,76 +12,25 @@
12
12
  import { describe, it, before, after } from "node:test";
13
13
  import assert from "node:assert/strict";
14
14
  import { chromium } from "playwright";
15
- import { readFileSync } from "node:fs";
16
- import { resolve, dirname } from "node:path";
15
+ import { dirname } from "node:path";
17
16
  import { fileURLToPath } from "node:url";
18
17
 
19
18
  const __dirname = dirname(fileURLToPath(import.meta.url));
20
- const ROOT = resolve(__dirname, "..");
21
19
 
22
20
  // ---------------------------------------------------------------------------
23
- // Source extractionget the IIFE strings we need for injection
21
+ // Source loadingimport the IIFE builders directly via jiti.
22
+ // The test-only named exports in tools/intent.ts and tools/forms.ts exist
23
+ // exactly so this test can call the real, in-tree builders. No brace
24
+ // walking, no regex stripping — a refactor of the signatures just updates
25
+ // the import surface, not the test.
24
26
  // ---------------------------------------------------------------------------
25
27
 
26
- // 1. EVALUATE_HELPERS_SOURCE — exported constant, extract via jiti
27
28
  import { createRequire } from "node:module";
28
29
  const require = createRequire(import.meta.url);
29
30
  const jiti = require("jiti")(__dirname, { interopDefault: true, debug: false });
30
31
  const { EVALUATE_HELPERS_SOURCE } = jiti("../evaluate-helpers.ts");
31
-
32
- // 2. Intent scoring module-private buildIntentScoringScript.
33
- // Extract the function from source, wrap it, and eval to get the builder.
34
- const intentSource = readFileSync(resolve(ROOT, "tools/intent.ts"), "utf-8");
35
-
36
- function extractBuildIntentScoringScript() {
37
- // Match the function body: starts with "function buildIntentScoringScript"
38
- // and returns a template literal string. We extract up to the matching closing brace.
39
- const startMarker = "function buildIntentScoringScript(intent: string, scope?: string): string {";
40
- const startIdx = intentSource.indexOf(startMarker);
41
- if (startIdx === -1) throw new Error("Could not find buildIntentScoringScript in intent.ts");
42
-
43
- // Walk from start, counting braces to find the end
44
- let depth = 0;
45
- let foundFirst = false;
46
- let endIdx = startIdx;
47
- for (let i = startIdx; i < intentSource.length; i++) {
48
- if (intentSource[i] === "{") { depth++; foundFirst = true; }
49
- if (intentSource[i] === "}") depth--;
50
- if (foundFirst && depth === 0) { endIdx = i + 1; break; }
51
- }
52
-
53
- let fnBody = intentSource.slice(startIdx, endIdx);
54
- // Strip TypeScript type annotations
55
- fnBody = fnBody.replace(/\(intent:\s*string,\s*scope\?:\s*string\):\s*string/, "(intent, scope)");
56
- return new Function("return " + fnBody)();
57
- }
58
-
59
- const buildIntentScoringScript = extractBuildIntentScoringScript();
60
-
61
- // 3. Form analysis — module-private buildFormAnalysisScript.
62
- const formsSource = readFileSync(resolve(ROOT, "tools/forms.ts"), "utf-8");
63
-
64
- function extractBuildFormAnalysisScript() {
65
- const startMarker = "function buildFormAnalysisScript(selector?: string): string {";
66
- const startIdx = formsSource.indexOf(startMarker);
67
- if (startIdx === -1) throw new Error("Could not find buildFormAnalysisScript in forms.ts");
68
-
69
- let depth = 0;
70
- let foundFirst = false;
71
- let endIdx = startIdx;
72
- for (let i = startIdx; i < formsSource.length; i++) {
73
- if (formsSource[i] === "{") { depth++; foundFirst = true; }
74
- if (formsSource[i] === "}") depth--;
75
- if (foundFirst && depth === 0) { endIdx = i + 1; break; }
76
- }
77
-
78
- let fnBody = formsSource.slice(startIdx, endIdx);
79
- // Strip TypeScript type annotation
80
- fnBody = fnBody.replace(/\(selector\?:\s*string\):\s*string/, "(selector)");
81
- return new Function("return " + fnBody)();
82
- }
83
-
84
- const buildFormAnalysisScript = extractBuildFormAnalysisScript();
32
+ const { buildIntentScoringScript } = jiti("../tools/intent.ts");
33
+ const { buildFormAnalysisScript } = jiti("../tools/forms.ts");
85
34
 
86
35
  // ---------------------------------------------------------------------------
87
36
  // Browser lifecycle
@@ -387,32 +387,44 @@ describe("formatArtifactTimestamp", () => {
387
387
  // ---------------------------------------------------------------------------
388
388
 
389
389
  describe("EVALUATE_HELPERS_SOURCE", () => {
390
- it("is a parseable string (valid JavaScript)", () => {
391
- assert.doesNotThrow(() => {
392
- new Function(EVALUATE_HELPERS_SOURCE);
393
- });
394
- });
390
+ // Behaviour test: executing the source in a Node vm sandbox must
391
+ // populate a `window.__pi` namespace with every expected helper.
392
+ // No source grep — we actually run the code and verify the resulting
393
+ // object shape.
394
+ it("executing the source assigns all expected helpers to window.__pi", () => {
395
+ const vm = require("node:vm");
396
+ const expectedFunctions = [
397
+ "cssPath",
398
+ "simpleHash",
399
+ "isVisible",
400
+ "isEnabled",
401
+ "inferRole",
402
+ "accessibleName",
403
+ "isInteractiveEl",
404
+ "domPath",
405
+ "selectorHints",
406
+ ];
395
407
 
396
- const expectedFunctions = [
397
- "cssPath",
398
- "simpleHash",
399
- "isVisible",
400
- "isEnabled",
401
- "inferRole",
402
- "accessibleName",
403
- "isInteractiveEl",
404
- "domPath",
405
- "selectorHints",
406
- ];
407
-
408
- for (const fnName of expectedFunctions) {
409
- it(`contains assignment for pi.${fnName}`, () => {
410
- assert.ok(
411
- EVALUATE_HELPERS_SOURCE.includes(`pi.${fnName} = function`),
412
- `Expected pi.${fnName} = function assignment in source`,
408
+ // Playwright evaluates the source in a page context where `window`
409
+ // exists, so the helpers attach to `window.__pi`. Provide a minimal
410
+ // window stub in a vm context so we avoid polluting the test globals.
411
+ const sandbox = { window: {} };
412
+ const script = new vm.Script(EVALUATE_HELPERS_SOURCE);
413
+ script.runInNewContext(sandbox, { timeout: 1000 });
414
+
415
+ assert.ok(
416
+ sandbox.window.__pi && typeof sandbox.window.__pi === "object",
417
+ "executing EVALUATE_HELPERS_SOURCE must assign window.__pi",
418
+ );
419
+
420
+ for (const fnName of expectedFunctions) {
421
+ assert.equal(
422
+ typeof sandbox.window.__pi[fnName],
423
+ "function",
424
+ `window.__pi.${fnName} must be a function after executing the source`,
413
425
  );
414
- });
415
- }
426
+ }
427
+ });
416
428
  });
417
429
 
418
430
  // ---------------------------------------------------------------------------