gsd-pi 2.33.1 → 2.34.0-dev.6769913

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 (1061) hide show
  1. package/dist/bundled-resource-path.d.ts +8 -0
  2. package/dist/bundled-resource-path.js +14 -0
  3. package/dist/cli.js +16 -0
  4. package/dist/headless-query.js +6 -6
  5. package/dist/resource-loader.d.ts +2 -0
  6. package/dist/resource-loader.js +39 -4
  7. package/dist/resources/extensions/ask-user-questions.js +217 -0
  8. package/dist/resources/extensions/async-jobs/async-bash-tool.js +180 -0
  9. package/dist/resources/extensions/async-jobs/await-tool.js +90 -0
  10. package/dist/resources/extensions/async-jobs/cancel-job-tool.js +28 -0
  11. package/dist/resources/extensions/async-jobs/index.js +119 -0
  12. package/dist/resources/extensions/async-jobs/job-manager.js +159 -0
  13. package/dist/resources/extensions/aws-auth/index.js +138 -0
  14. package/dist/resources/extensions/bg-shell/bg-shell-command.js +182 -0
  15. package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.js +343 -0
  16. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +831 -0
  17. package/dist/resources/extensions/bg-shell/index.js +41 -0
  18. package/dist/resources/extensions/bg-shell/interaction.js +160 -0
  19. package/dist/resources/extensions/bg-shell/output-formatter.js +245 -0
  20. package/dist/resources/extensions/bg-shell/overlay.js +378 -0
  21. package/dist/resources/extensions/bg-shell/process-manager.js +413 -0
  22. package/dist/resources/extensions/bg-shell/readiness-detector.js +109 -0
  23. package/dist/resources/extensions/bg-shell/types.js +96 -0
  24. package/dist/resources/extensions/bg-shell/utilities.js +50 -0
  25. package/dist/resources/extensions/browser-tools/capture.js +179 -0
  26. package/dist/resources/extensions/browser-tools/core.js +899 -0
  27. package/dist/resources/extensions/browser-tools/{evaluate-helpers.ts → evaluate-helpers.js} +0 -1
  28. package/dist/resources/extensions/browser-tools/index.js +123 -0
  29. package/dist/resources/extensions/browser-tools/lifecycle.js +222 -0
  30. package/dist/resources/extensions/browser-tools/refs.js +254 -0
  31. package/dist/resources/extensions/browser-tools/settle.js +173 -0
  32. package/dist/resources/extensions/browser-tools/state.js +126 -0
  33. package/dist/resources/extensions/browser-tools/tools/action-cache.js +179 -0
  34. package/dist/resources/extensions/browser-tools/tools/assertions.js +320 -0
  35. package/dist/resources/extensions/browser-tools/tools/codegen.js +242 -0
  36. package/dist/resources/extensions/browser-tools/tools/device.js +162 -0
  37. package/dist/resources/extensions/browser-tools/tools/extract.js +191 -0
  38. package/dist/resources/extensions/browser-tools/tools/forms.js +710 -0
  39. package/dist/resources/extensions/browser-tools/tools/injection-detect.js +178 -0
  40. package/dist/resources/extensions/browser-tools/tools/inspection.js +426 -0
  41. package/dist/resources/extensions/browser-tools/tools/intent.js +556 -0
  42. package/dist/resources/extensions/browser-tools/tools/interaction.js +776 -0
  43. package/dist/resources/extensions/browser-tools/tools/navigation.js +208 -0
  44. package/dist/resources/extensions/browser-tools/tools/network-mock.js +194 -0
  45. package/dist/resources/extensions/browser-tools/tools/pages.js +280 -0
  46. package/dist/resources/extensions/browser-tools/tools/pdf.js +74 -0
  47. package/dist/resources/extensions/browser-tools/tools/refs.js +485 -0
  48. package/dist/resources/extensions/browser-tools/tools/screenshot.js +87 -0
  49. package/dist/resources/extensions/browser-tools/tools/session.js +375 -0
  50. package/dist/resources/extensions/browser-tools/tools/state-persistence.js +180 -0
  51. package/dist/resources/extensions/browser-tools/tools/visual-diff.js +174 -0
  52. package/dist/resources/extensions/browser-tools/tools/wait.js +201 -0
  53. package/dist/resources/extensions/browser-tools/tools/zoom.js +90 -0
  54. package/dist/resources/extensions/browser-tools/utils.js +490 -0
  55. package/dist/resources/extensions/context7/index.js +337 -0
  56. package/dist/resources/extensions/get-secrets-from-user.js +492 -0
  57. package/dist/resources/extensions/google-search/index.js +373 -0
  58. package/dist/resources/extensions/gsd/activity-log.js +146 -0
  59. package/dist/resources/extensions/gsd/atomic-write.js +38 -0
  60. package/dist/resources/extensions/gsd/auto/session.js +182 -0
  61. package/dist/resources/extensions/gsd/auto-budget.js +30 -0
  62. package/dist/resources/extensions/gsd/auto-dashboard.js +429 -0
  63. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +185 -0
  64. package/dist/resources/extensions/gsd/auto-dispatch.js +353 -0
  65. package/dist/resources/extensions/gsd/auto-loop.js +956 -0
  66. package/dist/resources/extensions/gsd/auto-model-selection.js +133 -0
  67. package/dist/resources/extensions/gsd/auto-observability.js +56 -0
  68. package/dist/resources/extensions/gsd/auto-post-unit.js +385 -0
  69. package/dist/resources/extensions/gsd/auto-prompts.js +1153 -0
  70. package/dist/resources/extensions/gsd/auto-recovery.js +512 -0
  71. package/dist/resources/extensions/gsd/auto-start.js +414 -0
  72. package/dist/resources/extensions/gsd/auto-supervisor.js +47 -0
  73. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +183 -0
  74. package/dist/resources/extensions/gsd/auto-timers.js +180 -0
  75. package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
  76. package/dist/resources/extensions/gsd/auto-unit-closeout.js +30 -0
  77. package/dist/resources/extensions/gsd/auto-verification.js +171 -0
  78. package/dist/resources/extensions/gsd/auto-worktree-sync.js +167 -0
  79. package/dist/resources/extensions/gsd/auto-worktree.js +830 -0
  80. package/dist/resources/extensions/gsd/auto.js +765 -0
  81. package/dist/resources/extensions/gsd/{cache.ts → cache.js} +5 -7
  82. package/dist/resources/extensions/gsd/captures.js +354 -0
  83. package/dist/resources/extensions/gsd/changelog.js +162 -0
  84. package/dist/resources/extensions/gsd/claude-import.js +540 -0
  85. package/dist/resources/extensions/gsd/collision-diagnostics.js +226 -0
  86. package/dist/resources/extensions/gsd/commands-bootstrap.js +224 -0
  87. package/dist/resources/extensions/gsd/commands-config.js +89 -0
  88. package/dist/resources/extensions/gsd/commands-extensions.js +259 -0
  89. package/dist/resources/extensions/gsd/commands-handlers.js +310 -0
  90. package/dist/resources/extensions/gsd/commands-inspect.js +70 -0
  91. package/dist/resources/extensions/gsd/commands-logs.js +468 -0
  92. package/dist/resources/extensions/gsd/commands-maintenance.js +185 -0
  93. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +660 -0
  94. package/dist/resources/extensions/gsd/commands-workflow-templates.js +408 -0
  95. package/dist/resources/extensions/gsd/commands.js +1031 -0
  96. package/dist/resources/extensions/gsd/complexity-classifier.js +257 -0
  97. package/dist/resources/extensions/gsd/{constants.ts → constants.js} +0 -6
  98. package/dist/resources/extensions/gsd/context-budget.js +187 -0
  99. package/dist/resources/extensions/gsd/context-store.js +165 -0
  100. package/dist/resources/extensions/gsd/crash-recovery.js +110 -0
  101. package/dist/resources/extensions/gsd/dashboard-overlay.js +562 -0
  102. package/dist/resources/extensions/gsd/db-writer.js +298 -0
  103. package/dist/resources/extensions/gsd/debug-logger.js +161 -0
  104. package/dist/resources/extensions/gsd/detection.js +373 -0
  105. package/dist/resources/extensions/gsd/diff-context.js +168 -0
  106. package/dist/resources/extensions/gsd/dispatch-guard.js +75 -0
  107. package/dist/resources/extensions/gsd/docs/preferences-reference.md +25 -18
  108. package/dist/resources/extensions/gsd/doctor-checks.js +562 -0
  109. package/dist/resources/extensions/gsd/doctor-environment.js +429 -0
  110. package/dist/resources/extensions/gsd/doctor-format.js +71 -0
  111. package/dist/resources/extensions/gsd/doctor-proactive.js +239 -0
  112. package/dist/resources/extensions/gsd/doctor-providers.js +292 -0
  113. package/dist/resources/extensions/gsd/doctor-types.js +12 -0
  114. package/dist/resources/extensions/gsd/doctor.js +672 -0
  115. package/dist/resources/extensions/gsd/error-utils.js +6 -0
  116. package/dist/resources/extensions/gsd/{errors.ts → errors.js} +6 -11
  117. package/dist/resources/extensions/gsd/exit-command.js +11 -0
  118. package/dist/resources/extensions/gsd/{export-html.ts → export-html.js} +482 -614
  119. package/dist/resources/extensions/gsd/export.js +268 -0
  120. package/dist/resources/extensions/gsd/file-watcher.js +76 -0
  121. package/dist/resources/extensions/gsd/files.js +937 -0
  122. package/dist/resources/extensions/gsd/forensics.js +511 -0
  123. package/dist/resources/extensions/gsd/{git-constants.ts → git-constants.js} +4 -5
  124. package/dist/resources/extensions/gsd/git-self-heal.js +113 -0
  125. package/dist/resources/extensions/gsd/git-service.js +460 -0
  126. package/dist/resources/extensions/gsd/{gitignore.ts → gitignore.js} +98 -125
  127. package/dist/resources/extensions/gsd/gsd-db.js +735 -0
  128. package/dist/resources/extensions/gsd/guided-flow-queue.js +366 -0
  129. package/dist/resources/extensions/gsd/guided-flow.js +1158 -0
  130. package/dist/resources/extensions/gsd/health-widget.js +141 -0
  131. package/dist/resources/extensions/gsd/history.js +118 -0
  132. package/dist/resources/extensions/gsd/index.js +1114 -0
  133. package/dist/resources/extensions/gsd/init-wizard.js +479 -0
  134. package/dist/resources/extensions/gsd/json-persistence.js +62 -0
  135. package/dist/resources/extensions/gsd/{jsonl-utils.ts → jsonl-utils.js} +10 -7
  136. package/dist/resources/extensions/gsd/key-manager.js +829 -0
  137. package/dist/resources/extensions/gsd/marketplace-discovery.js +356 -0
  138. package/dist/resources/extensions/gsd/md-importer.js +440 -0
  139. package/dist/resources/extensions/gsd/memory-extractor.js +295 -0
  140. package/dist/resources/extensions/gsd/memory-store.js +351 -0
  141. package/dist/resources/extensions/gsd/metrics.js +377 -0
  142. package/dist/resources/extensions/gsd/migrate/command.js +157 -0
  143. package/dist/resources/extensions/gsd/migrate/index.js +7 -0
  144. package/dist/resources/extensions/gsd/migrate/parser.js +268 -0
  145. package/dist/resources/extensions/gsd/migrate/parsers.js +477 -0
  146. package/dist/resources/extensions/gsd/migrate/preview.js +47 -0
  147. package/dist/resources/extensions/gsd/migrate/transformer.js +278 -0
  148. package/dist/resources/extensions/gsd/migrate/types.js +4 -0
  149. package/dist/resources/extensions/gsd/migrate/validator.js +41 -0
  150. package/dist/resources/extensions/gsd/migrate/writer.js +477 -0
  151. package/dist/resources/extensions/gsd/migrate-external.js +130 -0
  152. package/dist/resources/extensions/gsd/milestone-actions.js +111 -0
  153. package/dist/resources/extensions/gsd/{milestone-ids.ts → milestone-ids.js} +50 -63
  154. package/dist/resources/extensions/gsd/model-cost-table.js +48 -0
  155. package/dist/resources/extensions/gsd/model-router.js +187 -0
  156. package/dist/resources/extensions/gsd/namespaced-registry.js +322 -0
  157. package/dist/resources/extensions/gsd/namespaced-resolver.js +176 -0
  158. package/dist/resources/extensions/gsd/native-git-bridge.js +842 -0
  159. package/dist/resources/extensions/gsd/native-parser-bridge.js +156 -0
  160. package/dist/resources/extensions/gsd/notifications.js +58 -0
  161. package/dist/resources/extensions/gsd/observability-validator.js +398 -0
  162. package/dist/resources/extensions/gsd/parallel-eligibility.js +182 -0
  163. package/dist/resources/extensions/gsd/parallel-merge.js +121 -0
  164. package/dist/resources/extensions/gsd/parallel-orchestrator.js +687 -0
  165. package/dist/resources/extensions/gsd/paths.js +414 -0
  166. package/dist/resources/extensions/gsd/plugin-importer.js +254 -0
  167. package/dist/resources/extensions/gsd/post-unit-hooks.js +433 -0
  168. package/dist/resources/extensions/gsd/preferences-models.js +294 -0
  169. package/dist/resources/extensions/gsd/preferences-skills.js +154 -0
  170. package/dist/resources/extensions/gsd/preferences-types.js +73 -0
  171. package/dist/resources/extensions/gsd/preferences-validation.js +607 -0
  172. package/dist/resources/extensions/gsd/preferences.js +325 -0
  173. package/dist/resources/extensions/gsd/progress-score.js +102 -0
  174. package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +150 -0
  175. package/dist/resources/extensions/gsd/prompt-compressor.js +393 -0
  176. package/dist/resources/extensions/gsd/prompt-loader.js +119 -0
  177. package/dist/resources/extensions/gsd/prompt-ordering.js +170 -0
  178. package/dist/resources/extensions/gsd/provider-error-pause.js +60 -0
  179. package/dist/resources/extensions/gsd/queue-order.js +178 -0
  180. package/dist/resources/extensions/gsd/queue-reorder-ui.js +234 -0
  181. package/dist/resources/extensions/gsd/quick.js +206 -0
  182. package/dist/resources/extensions/gsd/repo-identity.js +187 -0
  183. package/dist/resources/extensions/gsd/{reports.ts → reports.js} +146 -241
  184. package/dist/resources/extensions/gsd/{resource-version.ts → resource-version.js} +50 -53
  185. package/dist/resources/extensions/gsd/roadmap-slices.js +130 -0
  186. package/dist/resources/extensions/gsd/routing-history.js +210 -0
  187. package/dist/resources/extensions/gsd/safe-fs.js +52 -0
  188. package/dist/resources/extensions/gsd/semantic-chunker.js +254 -0
  189. package/dist/resources/extensions/gsd/session-forensics.js +427 -0
  190. package/dist/resources/extensions/gsd/session-lock.js +397 -0
  191. package/dist/resources/extensions/gsd/session-status-io.js +134 -0
  192. package/dist/resources/extensions/gsd/skill-discovery.js +121 -0
  193. package/dist/resources/extensions/gsd/skill-health.js +324 -0
  194. package/dist/resources/extensions/gsd/{skill-telemetry.ts → skill-telemetry.js} +58 -74
  195. package/dist/resources/extensions/gsd/state.js +653 -0
  196. package/dist/resources/extensions/gsd/structured-data-formatter.js +97 -0
  197. package/dist/resources/extensions/gsd/summary-distiller.js +212 -0
  198. package/dist/resources/extensions/gsd/templates/preferences.md +1 -0
  199. package/dist/resources/extensions/gsd/token-counter.js +54 -0
  200. package/dist/resources/extensions/gsd/triage-resolution.js +217 -0
  201. package/dist/resources/extensions/gsd/triage-ui.js +125 -0
  202. package/dist/resources/extensions/gsd/types.js +4 -0
  203. package/dist/resources/extensions/gsd/undo.js +205 -0
  204. package/dist/resources/extensions/gsd/unit-id.js +7 -0
  205. package/dist/resources/extensions/gsd/unit-runtime.js +131 -0
  206. package/dist/resources/extensions/gsd/validate-directory.js +143 -0
  207. package/dist/resources/extensions/gsd/verification-evidence.js +122 -0
  208. package/dist/resources/extensions/gsd/verification-gate.js +514 -0
  209. package/dist/resources/extensions/gsd/visualizer-data.js +612 -0
  210. package/dist/resources/extensions/gsd/visualizer-overlay.js +501 -0
  211. package/dist/resources/extensions/gsd/visualizer-views.js +893 -0
  212. package/dist/resources/extensions/gsd/workflow-templates.js +188 -0
  213. package/dist/resources/extensions/gsd/workspace-index.js +139 -0
  214. package/dist/resources/extensions/gsd/worktree-command-bootstrap.js +40 -0
  215. package/dist/resources/extensions/gsd/worktree-command.js +682 -0
  216. package/dist/resources/extensions/gsd/worktree-manager.js +358 -0
  217. package/dist/resources/extensions/gsd/worktree-resolver.js +344 -0
  218. package/dist/resources/extensions/gsd/worktree.js +199 -0
  219. package/dist/resources/extensions/mac-tools/index.js +768 -0
  220. package/dist/resources/extensions/mcp-client/index.js +364 -0
  221. package/dist/resources/extensions/package.json +3 -0
  222. package/dist/resources/extensions/remote-questions/config.js +70 -0
  223. package/dist/resources/extensions/remote-questions/discord-adapter.js +134 -0
  224. package/dist/resources/extensions/remote-questions/format.js +234 -0
  225. package/dist/resources/extensions/remote-questions/http-client.js +43 -0
  226. package/dist/resources/extensions/remote-questions/manager.js +156 -0
  227. package/dist/resources/extensions/remote-questions/{mod.ts → mod.js} +1 -10
  228. package/dist/resources/extensions/remote-questions/notify.js +89 -0
  229. package/dist/resources/extensions/remote-questions/remote-command.js +453 -0
  230. package/dist/resources/extensions/remote-questions/slack-adapter.js +123 -0
  231. package/dist/resources/extensions/remote-questions/status.js +25 -0
  232. package/dist/resources/extensions/remote-questions/store.js +70 -0
  233. package/dist/resources/extensions/remote-questions/telegram-adapter.js +123 -0
  234. package/dist/resources/extensions/remote-questions/types.js +5 -0
  235. package/dist/resources/extensions/search-the-web/cache.js +74 -0
  236. package/dist/resources/extensions/search-the-web/command-search-provider.js +79 -0
  237. package/dist/resources/extensions/search-the-web/format.js +161 -0
  238. package/dist/resources/extensions/search-the-web/http.js +178 -0
  239. package/dist/resources/extensions/search-the-web/index.js +41 -0
  240. package/dist/resources/extensions/search-the-web/native-search.js +166 -0
  241. package/dist/resources/extensions/search-the-web/provider.js +143 -0
  242. package/dist/resources/extensions/search-the-web/tavily.js +82 -0
  243. package/dist/resources/extensions/search-the-web/tool-fetch-page.js +452 -0
  244. package/dist/resources/extensions/search-the-web/tool-llm-context.js +455 -0
  245. package/dist/resources/extensions/search-the-web/tool-search.js +482 -0
  246. package/dist/resources/extensions/search-the-web/url-utils.js +121 -0
  247. package/dist/resources/extensions/shared/confirm-ui.js +96 -0
  248. package/dist/resources/extensions/shared/{format-utils.ts → format-utils.js} +85 -91
  249. package/dist/resources/extensions/shared/frontmatter.js +109 -0
  250. package/dist/resources/extensions/shared/interview-ui.js +569 -0
  251. package/dist/resources/extensions/shared/{mod.ts → mod.js} +2 -24
  252. package/dist/resources/extensions/shared/next-action-ui.js +168 -0
  253. package/dist/resources/extensions/shared/{path-display.ts → path-display.js} +2 -3
  254. package/dist/resources/extensions/shared/sanitize.js +17 -0
  255. package/dist/resources/extensions/shared/terminal.js +21 -0
  256. package/dist/resources/extensions/shared/ui.js +245 -0
  257. package/dist/resources/extensions/shared/wizard-ui.js +478 -0
  258. package/dist/resources/extensions/slash-commands/audit.js +72 -0
  259. package/dist/resources/extensions/slash-commands/clear.js +8 -0
  260. package/dist/resources/extensions/slash-commands/create-extension.js +264 -0
  261. package/dist/resources/extensions/slash-commands/create-slash-command.js +208 -0
  262. package/dist/resources/extensions/slash-commands/index.js +10 -0
  263. package/dist/resources/extensions/subagent/agents.js +103 -0
  264. package/dist/resources/extensions/subagent/index.js +905 -0
  265. package/dist/resources/extensions/subagent/isolation.js +384 -0
  266. package/dist/resources/extensions/subagent/worker-registry.js +73 -0
  267. package/dist/resources/extensions/ttsr/index.js +144 -0
  268. package/dist/resources/extensions/ttsr/rule-loader.js +70 -0
  269. package/dist/resources/extensions/ttsr/ttsr-manager.js +380 -0
  270. package/dist/resources/extensions/universal-config/discovery.js +94 -0
  271. package/dist/resources/extensions/universal-config/format.js +178 -0
  272. package/dist/resources/extensions/universal-config/index.js +99 -0
  273. package/dist/resources/extensions/universal-config/scanners.js +574 -0
  274. package/dist/resources/extensions/universal-config/tools.js +57 -0
  275. package/dist/resources/extensions/universal-config/types.js +8 -0
  276. package/dist/resources/extensions/voice/index.js +247 -0
  277. package/dist/startup-timings.d.ts +2 -0
  278. package/dist/startup-timings.js +22 -0
  279. package/dist/tool-bootstrap.js +59 -11
  280. package/dist/worktree-cli.js +7 -7
  281. package/package.json +1 -1
  282. package/packages/native/dist/native.d.ts +0 -2
  283. package/packages/native/dist/native.js +0 -2
  284. package/packages/native/src/native.ts +0 -3
  285. package/packages/pi-agent-core/dist/agent-loop.d.ts +14 -0
  286. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  287. package/packages/pi-agent-core/dist/agent-loop.js +24 -27
  288. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  289. package/packages/pi-agent-core/dist/agent.d.ts +1 -0
  290. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  291. package/packages/pi-agent-core/dist/agent.js +11 -22
  292. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  293. package/packages/pi-agent-core/dist/proxy.d.ts +1 -25
  294. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  295. package/packages/pi-agent-core/dist/proxy.js +1 -1
  296. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  297. package/packages/pi-agent-core/src/agent-loop.ts +30 -27
  298. package/packages/pi-agent-core/src/agent.ts +12 -23
  299. package/packages/pi-agent-core/src/proxy.ts +1 -1
  300. package/packages/pi-ai/dist/api-registry.d.ts +0 -2
  301. package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
  302. package/packages/pi-ai/dist/api-registry.js +0 -10
  303. package/packages/pi-ai/dist/api-registry.js.map +1 -1
  304. package/packages/pi-ai/dist/providers/anthropic.d.ts +0 -8
  305. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  306. package/packages/pi-ai/dist/providers/anthropic.js +1 -1
  307. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  308. package/packages/pi-ai/dist/providers/github-copilot-headers.d.ts +0 -1
  309. package/packages/pi-ai/dist/providers/github-copilot-headers.d.ts.map +1 -1
  310. package/packages/pi-ai/dist/providers/github-copilot-headers.js +1 -1
  311. package/packages/pi-ai/dist/providers/github-copilot-headers.js.map +1 -1
  312. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts +1 -43
  313. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  314. package/packages/pi-ai/dist/providers/google-gemini-cli.js +2 -2
  315. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  316. package/packages/pi-ai/dist/providers/google-shared.d.ts +0 -4
  317. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/providers/google-shared.js +1 -1
  319. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  320. package/packages/pi-ai/dist/providers/register-builtins.d.ts +0 -1
  321. package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  322. package/packages/pi-ai/dist/providers/register-builtins.js +1 -1
  323. package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
  324. package/packages/pi-ai/dist/utils/event-stream.d.ts +0 -2
  325. package/packages/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
  326. package/packages/pi-ai/dist/utils/event-stream.js +0 -4
  327. package/packages/pi-ai/dist/utils/event-stream.js.map +1 -1
  328. package/packages/pi-ai/dist/utils/overflow.d.ts +0 -4
  329. package/packages/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  330. package/packages/pi-ai/dist/utils/overflow.js +0 -6
  331. package/packages/pi-ai/dist/utils/overflow.js.map +1 -1
  332. package/packages/pi-ai/dist/utils/validation.d.ts +0 -8
  333. package/packages/pi-ai/dist/utils/validation.d.ts.map +1 -1
  334. package/packages/pi-ai/dist/utils/validation.js +0 -14
  335. package/packages/pi-ai/dist/utils/validation.js.map +1 -1
  336. package/packages/pi-ai/src/api-registry.ts +0 -12
  337. package/packages/pi-ai/src/providers/anthropic.ts +1 -1
  338. package/packages/pi-ai/src/providers/github-copilot-headers.ts +1 -1
  339. package/packages/pi-ai/src/providers/google-gemini-cli.ts +2 -2
  340. package/packages/pi-ai/src/providers/google-shared.ts +1 -1
  341. package/packages/pi-ai/src/providers/register-builtins.ts +1 -1
  342. package/packages/pi-ai/src/utils/event-stream.ts +0 -5
  343. package/packages/pi-ai/src/utils/overflow.ts +1 -8
  344. package/packages/pi-ai/src/utils/validation.ts +0 -15
  345. package/packages/pi-coding-agent/dist/config.d.ts +0 -9
  346. package/packages/pi-coding-agent/dist/config.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/config.js +4 -8
  348. package/packages/pi-coding-agent/dist/config.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +4 -0
  350. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/core/agent-session.js +24 -5
  352. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.d.ts +0 -4
  354. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.js +1 -1
  356. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  358. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  359. package/packages/pi-coding-agent/dist/core/extensions/index.js +1 -1
  360. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  361. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +1 -0
  362. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/extensions/loader.js +31 -4
  364. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  365. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +0 -5
  366. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  367. package/packages/pi-coding-agent/dist/core/extensions/runner.js +0 -13
  368. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  369. package/packages/pi-coding-agent/dist/core/keybindings.d.ts +0 -8
  370. package/packages/pi-coding-agent/dist/core/keybindings.d.ts.map +1 -1
  371. package/packages/pi-coding-agent/dist/core/keybindings.js +2 -2
  372. package/packages/pi-coding-agent/dist/core/keybindings.js.map +1 -1
  373. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +0 -17
  374. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/lsp/client.js +3 -62
  376. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  377. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts +0 -2
  378. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/lsp/config.js +0 -7
  380. package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts +0 -5
  382. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/lsp/edits.js +1 -1
  384. package/packages/pi-coding-agent/dist/core/lsp/edits.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts +0 -1
  386. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  387. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +1 -1
  388. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  389. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts +1 -6
  390. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts.map +1 -1
  391. package/packages/pi-coding-agent/dist/core/lsp/utils.js +1 -28
  392. package/packages/pi-coding-agent/dist/core/lsp/utils.js.map +1 -1
  393. package/packages/pi-coding-agent/dist/core/messages.d.ts +0 -8
  394. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  395. package/packages/pi-coding-agent/dist/core/messages.js +5 -5
  396. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  397. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +0 -3
  398. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  399. package/packages/pi-coding-agent/dist/core/model-registry.js +1 -3
  400. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  401. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts +1 -26
  402. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  403. package/packages/pi-coding-agent/dist/core/model-resolver.js +3 -59
  404. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  405. package/packages/pi-coding-agent/dist/core/prompt-templates.d.ts +0 -17
  406. package/packages/pi-coding-agent/dist/core/prompt-templates.d.ts.map +1 -1
  407. package/packages/pi-coding-agent/dist/core/prompt-templates.js +2 -2
  408. package/packages/pi-coding-agent/dist/core/prompt-templates.js.map +1 -1
  409. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +0 -4
  410. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  411. package/packages/pi-coding-agent/dist/core/session-manager.js +2 -4
  412. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  413. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +8 -12
  414. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  415. package/packages/pi-coding-agent/dist/core/settings-manager.js +78 -168
  416. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  417. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  418. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  419. package/packages/pi-coding-agent/dist/index.js +1 -1
  420. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  421. package/packages/pi-coding-agent/dist/migrations.d.ts +0 -16
  422. package/packages/pi-coding-agent/dist/migrations.d.ts.map +1 -1
  423. package/packages/pi-coding-agent/dist/migrations.js +2 -2
  424. package/packages/pi-coding-agent/dist/migrations.js.map +1 -1
  425. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.d.ts +0 -2
  426. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  427. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js +2 -2
  428. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  429. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -24
  430. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  431. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +50 -512
  432. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  433. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +71 -0
  434. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -0
  435. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +514 -0
  436. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -0
  437. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +65 -4
  438. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  439. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +6 -23
  440. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  441. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +12 -0
  442. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  443. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +175 -0
  444. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -0
  445. package/packages/pi-coding-agent/dist/utils/changelog.d.ts +0 -4
  446. package/packages/pi-coding-agent/dist/utils/changelog.d.ts.map +1 -1
  447. package/packages/pi-coding-agent/dist/utils/changelog.js +1 -1
  448. package/packages/pi-coding-agent/dist/utils/changelog.js.map +1 -1
  449. package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts +0 -1
  450. package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts.map +1 -1
  451. package/packages/pi-coding-agent/dist/utils/clipboard-image.js +1 -1
  452. package/packages/pi-coding-agent/dist/utils/clipboard-image.js.map +1 -1
  453. package/packages/pi-coding-agent/dist/utils/photon.d.ts +0 -19
  454. package/packages/pi-coding-agent/dist/utils/photon.d.ts.map +1 -1
  455. package/packages/pi-coding-agent/dist/utils/photon.js +1 -120
  456. package/packages/pi-coding-agent/dist/utils/photon.js.map +1 -1
  457. package/packages/pi-coding-agent/dist/utils/tools-manager.d.ts +0 -1
  458. package/packages/pi-coding-agent/dist/utils/tools-manager.d.ts.map +1 -1
  459. package/packages/pi-coding-agent/dist/utils/tools-manager.js +1 -1
  460. package/packages/pi-coding-agent/dist/utils/tools-manager.js.map +1 -1
  461. package/packages/pi-coding-agent/package.json +1 -1
  462. package/packages/pi-coding-agent/src/config.ts +5 -10
  463. package/packages/pi-coding-agent/src/core/agent-session.ts +26 -5
  464. package/packages/pi-coding-agent/src/core/export-html/ansi-to-html.ts +1 -1
  465. package/packages/pi-coding-agent/src/core/extensions/index.ts +1 -0
  466. package/packages/pi-coding-agent/src/core/extensions/loader.ts +35 -4
  467. package/packages/pi-coding-agent/src/core/extensions/runner.ts +0 -13
  468. package/packages/pi-coding-agent/src/core/keybindings.ts +2 -2
  469. package/packages/pi-coding-agent/src/core/lsp/client.ts +3 -73
  470. package/packages/pi-coding-agent/src/core/lsp/config.ts +0 -11
  471. package/packages/pi-coding-agent/src/core/lsp/edits.ts +1 -1
  472. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +1 -1
  473. package/packages/pi-coding-agent/src/core/lsp/utils.ts +1 -33
  474. package/packages/pi-coding-agent/src/core/messages.ts +5 -5
  475. package/packages/pi-coding-agent/src/core/model-registry.ts +0 -2
  476. package/packages/pi-coding-agent/src/core/model-resolver.ts +3 -77
  477. package/packages/pi-coding-agent/src/core/prompt-templates.ts +2 -2
  478. package/packages/pi-coding-agent/src/core/session-manager.ts +2 -4
  479. package/packages/pi-coding-agent/src/core/settings-manager.ts +87 -166
  480. package/packages/pi-coding-agent/src/index.ts +1 -0
  481. package/packages/pi-coding-agent/src/migrations.ts +2 -2
  482. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector-search.ts +2 -2
  483. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +50 -561
  484. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +653 -0
  485. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +7 -26
  486. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +196 -0
  487. package/packages/pi-coding-agent/src/utils/changelog.ts +1 -1
  488. package/packages/pi-coding-agent/src/utils/clipboard-image.ts +1 -1
  489. package/packages/pi-coding-agent/src/utils/photon.ts +0 -137
  490. package/packages/pi-coding-agent/src/utils/tools-manager.ts +1 -1
  491. package/packages/pi-tui/dist/components/editor.d.ts +0 -10
  492. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  493. package/packages/pi-tui/dist/components/editor.js +1 -1
  494. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  495. package/packages/pi-tui/dist/overlay-layout.d.ts +55 -0
  496. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -0
  497. package/packages/pi-tui/dist/overlay-layout.js +288 -0
  498. package/packages/pi-tui/dist/overlay-layout.js.map +1 -0
  499. package/packages/pi-tui/dist/tui.d.ts +0 -22
  500. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  501. package/packages/pi-tui/dist/tui.js +6 -272
  502. package/packages/pi-tui/dist/tui.js.map +1 -1
  503. package/packages/pi-tui/dist/utils.d.ts +0 -7
  504. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  505. package/packages/pi-tui/dist/utils.js +0 -44
  506. package/packages/pi-tui/dist/utils.js.map +1 -1
  507. package/packages/pi-tui/src/components/editor.ts +1 -1
  508. package/packages/pi-tui/src/overlay-layout.ts +372 -0
  509. package/packages/pi-tui/src/tui.ts +11 -312
  510. package/packages/pi-tui/src/utils.ts +0 -43
  511. package/pkg/dist/core/export-html/ansi-to-html.d.ts +0 -4
  512. package/pkg/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  513. package/pkg/dist/core/export-html/ansi-to-html.js +1 -1
  514. package/pkg/dist/core/export-html/ansi-to-html.js.map +1 -1
  515. package/pkg/dist/modes/interactive/theme/theme.d.ts +65 -4
  516. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  517. package/pkg/dist/modes/interactive/theme/theme.js +6 -23
  518. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  519. package/pkg/dist/modes/interactive/theme/themes.d.ts +12 -0
  520. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  521. package/pkg/dist/modes/interactive/theme/themes.js +175 -0
  522. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -0
  523. package/pkg/package.json +1 -1
  524. package/src/resources/extensions/bg-shell/index.ts +41 -46
  525. package/src/resources/extensions/browser-tools/index.ts +156 -67
  526. package/src/resources/extensions/gsd/auto/session.ts +47 -30
  527. package/src/resources/extensions/gsd/auto-dashboard.ts +28 -131
  528. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +6 -1
  529. package/src/resources/extensions/gsd/auto-dispatch.ts +135 -91
  530. package/src/resources/extensions/gsd/auto-loop.ts +1665 -0
  531. package/src/resources/extensions/gsd/auto-observability.ts +4 -2
  532. package/src/resources/extensions/gsd/auto-post-unit.ts +85 -228
  533. package/src/resources/extensions/gsd/auto-prompts.ts +138 -109
  534. package/src/resources/extensions/gsd/auto-recovery.ts +124 -118
  535. package/src/resources/extensions/gsd/auto-start.ts +440 -354
  536. package/src/resources/extensions/gsd/auto-supervisor.ts +5 -12
  537. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +8 -8
  538. package/src/resources/extensions/gsd/auto-timers.ts +3 -4
  539. package/src/resources/extensions/gsd/auto-verification.ts +76 -72
  540. package/src/resources/extensions/gsd/auto-worktree-sync.ts +204 -0
  541. package/src/resources/extensions/gsd/auto-worktree.ts +453 -133
  542. package/src/resources/extensions/gsd/auto.ts +516 -1189
  543. package/src/resources/extensions/gsd/captures.ts +10 -4
  544. package/src/resources/extensions/gsd/changelog.ts +213 -0
  545. package/src/resources/extensions/gsd/commands-bootstrap.ts +253 -0
  546. package/src/resources/extensions/gsd/commands.ts +48 -32
  547. package/src/resources/extensions/gsd/dispatch-guard.ts +13 -9
  548. package/src/resources/extensions/gsd/docs/preferences-reference.md +25 -18
  549. package/src/resources/extensions/gsd/doctor-checks.ts +3 -4
  550. package/src/resources/extensions/gsd/git-service.ts +32 -12
  551. package/src/resources/extensions/gsd/gitignore.ts +4 -2
  552. package/src/resources/extensions/gsd/gsd-db.ts +375 -180
  553. package/src/resources/extensions/gsd/guided-flow.ts +22 -11
  554. package/src/resources/extensions/gsd/index.ts +76 -163
  555. package/src/resources/extensions/gsd/post-unit-hooks.ts +13 -13
  556. package/src/resources/extensions/gsd/progress-score.ts +65 -200
  557. package/src/resources/extensions/gsd/quick.ts +121 -76
  558. package/src/resources/extensions/gsd/repo-identity.ts +56 -22
  559. package/src/resources/extensions/gsd/session-lock.ts +17 -0
  560. package/src/resources/extensions/gsd/templates/preferences.md +1 -0
  561. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +32 -59
  562. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +75 -27
  563. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
  564. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +37 -0
  565. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1458 -0
  566. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +8 -162
  567. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +2 -108
  568. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +1 -3
  569. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +0 -3
  570. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +58 -0
  571. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -55
  572. package/src/resources/extensions/gsd/tests/git-service.test.ts +16 -7
  573. package/src/resources/extensions/gsd/tests/headless-query.test.ts +22 -0
  574. package/src/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +8 -11
  575. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +4 -6
  576. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +281 -0
  577. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -0
  578. package/src/resources/extensions/gsd/tests/run-uat.test.ts +3 -3
  579. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +64 -0
  580. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +181 -0
  581. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -3
  582. package/src/resources/extensions/gsd/tests/token-profile.test.ts +6 -6
  583. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +6 -6
  584. package/src/resources/extensions/gsd/tests/undo.test.ts +6 -0
  585. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +24 -26
  586. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +7 -136
  587. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +205 -0
  588. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +442 -0
  589. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +0 -3
  590. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +705 -0
  591. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +57 -106
  592. package/src/resources/extensions/gsd/tests/worktree.test.ts +5 -1
  593. package/src/resources/extensions/gsd/tests/write-gate.test.ts +43 -132
  594. package/src/resources/extensions/gsd/types.ts +90 -77
  595. package/src/resources/extensions/gsd/undo.ts +42 -46
  596. package/src/resources/extensions/gsd/unit-runtime.ts +14 -18
  597. package/src/resources/extensions/gsd/verification-evidence.ts +0 -2
  598. package/src/resources/extensions/gsd/verification-gate.ts +4 -16
  599. package/src/resources/extensions/gsd/worktree-command-bootstrap.ts +46 -0
  600. package/src/resources/extensions/gsd/worktree-command.ts +29 -11
  601. package/src/resources/extensions/gsd/worktree-manager.ts +2 -3
  602. package/src/resources/extensions/gsd/worktree-resolver.ts +485 -0
  603. package/src/resources/extensions/gsd/worktree.ts +7 -44
  604. package/src/resources/extensions/mcp-client/index.ts +2 -1
  605. package/src/resources/extensions/package.json +3 -0
  606. package/src/resources/extensions/search-the-web/command-search-provider.ts +1 -1
  607. package/src/resources/extensions/search-the-web/index.ts +35 -52
  608. package/src/resources/extensions/search-the-web/tavily.ts +1 -1
  609. package/dist/resources/extensions/ask-user-questions.ts +0 -290
  610. package/dist/resources/extensions/async-jobs/async-bash-tool.ts +0 -212
  611. package/dist/resources/extensions/async-jobs/await-tool.ts +0 -103
  612. package/dist/resources/extensions/async-jobs/cancel-job-tool.ts +0 -35
  613. package/dist/resources/extensions/async-jobs/index.ts +0 -141
  614. package/dist/resources/extensions/async-jobs/job-manager.ts +0 -211
  615. package/dist/resources/extensions/aws-auth/index.ts +0 -144
  616. package/dist/resources/extensions/bg-shell/bg-shell-command.ts +0 -219
  617. package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.ts +0 -400
  618. package/dist/resources/extensions/bg-shell/bg-shell-tool.ts +0 -985
  619. package/dist/resources/extensions/bg-shell/index.ts +0 -59
  620. package/dist/resources/extensions/bg-shell/interaction.ts +0 -198
  621. package/dist/resources/extensions/bg-shell/output-formatter.ts +0 -279
  622. package/dist/resources/extensions/bg-shell/overlay.ts +0 -437
  623. package/dist/resources/extensions/bg-shell/process-manager.ts +0 -464
  624. package/dist/resources/extensions/bg-shell/readiness-detector.ts +0 -126
  625. package/dist/resources/extensions/bg-shell/types.ts +0 -303
  626. package/dist/resources/extensions/bg-shell/utilities.ts +0 -57
  627. package/dist/resources/extensions/browser-tools/capture.ts +0 -199
  628. package/dist/resources/extensions/browser-tools/core.ts +0 -1196
  629. package/dist/resources/extensions/browser-tools/index.ts +0 -71
  630. package/dist/resources/extensions/browser-tools/lifecycle.ts +0 -270
  631. package/dist/resources/extensions/browser-tools/refs.ts +0 -264
  632. package/dist/resources/extensions/browser-tools/settle.ts +0 -197
  633. package/dist/resources/extensions/browser-tools/state.ts +0 -408
  634. package/dist/resources/extensions/browser-tools/tools/action-cache.ts +0 -216
  635. package/dist/resources/extensions/browser-tools/tools/assertions.ts +0 -342
  636. package/dist/resources/extensions/browser-tools/tools/codegen.ts +0 -274
  637. package/dist/resources/extensions/browser-tools/tools/device.ts +0 -183
  638. package/dist/resources/extensions/browser-tools/tools/extract.ts +0 -229
  639. package/dist/resources/extensions/browser-tools/tools/forms.ts +0 -801
  640. package/dist/resources/extensions/browser-tools/tools/injection-detect.ts +0 -221
  641. package/dist/resources/extensions/browser-tools/tools/inspection.ts +0 -492
  642. package/dist/resources/extensions/browser-tools/tools/intent.ts +0 -614
  643. package/dist/resources/extensions/browser-tools/tools/interaction.ts +0 -865
  644. package/dist/resources/extensions/browser-tools/tools/navigation.ts +0 -232
  645. package/dist/resources/extensions/browser-tools/tools/network-mock.ts +0 -244
  646. package/dist/resources/extensions/browser-tools/tools/pages.ts +0 -303
  647. package/dist/resources/extensions/browser-tools/tools/pdf.ts +0 -92
  648. package/dist/resources/extensions/browser-tools/tools/refs.ts +0 -541
  649. package/dist/resources/extensions/browser-tools/tools/screenshot.ts +0 -101
  650. package/dist/resources/extensions/browser-tools/tools/session.ts +0 -400
  651. package/dist/resources/extensions/browser-tools/tools/state-persistence.ts +0 -202
  652. package/dist/resources/extensions/browser-tools/tools/visual-diff.ts +0 -209
  653. package/dist/resources/extensions/browser-tools/tools/wait.ts +0 -247
  654. package/dist/resources/extensions/browser-tools/tools/zoom.ts +0 -104
  655. package/dist/resources/extensions/browser-tools/utils.ts +0 -660
  656. package/dist/resources/extensions/context7/index.ts +0 -428
  657. package/dist/resources/extensions/get-secrets-from-user.ts +0 -607
  658. package/dist/resources/extensions/google-search/index.ts +0 -466
  659. package/dist/resources/extensions/gsd/activity-log.ts +0 -162
  660. package/dist/resources/extensions/gsd/atomic-write.ts +0 -35
  661. package/dist/resources/extensions/gsd/auto/session.ts +0 -236
  662. package/dist/resources/extensions/gsd/auto-budget.ts +0 -32
  663. package/dist/resources/extensions/gsd/auto-constants.ts +0 -6
  664. package/dist/resources/extensions/gsd/auto-dashboard.ts +0 -626
  665. package/dist/resources/extensions/gsd/auto-direct-dispatch.ts +0 -224
  666. package/dist/resources/extensions/gsd/auto-dispatch.ts +0 -409
  667. package/dist/resources/extensions/gsd/auto-idempotency.ts +0 -151
  668. package/dist/resources/extensions/gsd/auto-model-selection.ts +0 -179
  669. package/dist/resources/extensions/gsd/auto-observability.ts +0 -72
  670. package/dist/resources/extensions/gsd/auto-post-unit.ts +0 -618
  671. package/dist/resources/extensions/gsd/auto-prompts.ts +0 -1273
  672. package/dist/resources/extensions/gsd/auto-recovery.ts +0 -578
  673. package/dist/resources/extensions/gsd/auto-start.ts +0 -483
  674. package/dist/resources/extensions/gsd/auto-stuck-detection.ts +0 -221
  675. package/dist/resources/extensions/gsd/auto-supervisor.ts +0 -61
  676. package/dist/resources/extensions/gsd/auto-timeout-recovery.ts +0 -263
  677. package/dist/resources/extensions/gsd/auto-timers.ts +0 -224
  678. package/dist/resources/extensions/gsd/auto-tool-tracking.ts +0 -54
  679. package/dist/resources/extensions/gsd/auto-unit-closeout.ts +0 -48
  680. package/dist/resources/extensions/gsd/auto-verification.ts +0 -229
  681. package/dist/resources/extensions/gsd/auto-worktree.ts +0 -658
  682. package/dist/resources/extensions/gsd/auto.ts +0 -1834
  683. package/dist/resources/extensions/gsd/captures.ts +0 -427
  684. package/dist/resources/extensions/gsd/claude-import.ts +0 -656
  685. package/dist/resources/extensions/gsd/collision-diagnostics.ts +0 -332
  686. package/dist/resources/extensions/gsd/commands-config.ts +0 -102
  687. package/dist/resources/extensions/gsd/commands-extensions.ts +0 -328
  688. package/dist/resources/extensions/gsd/commands-handlers.ts +0 -395
  689. package/dist/resources/extensions/gsd/commands-inspect.ts +0 -91
  690. package/dist/resources/extensions/gsd/commands-logs.ts +0 -536
  691. package/dist/resources/extensions/gsd/commands-maintenance.ts +0 -206
  692. package/dist/resources/extensions/gsd/commands-prefs-wizard.ts +0 -780
  693. package/dist/resources/extensions/gsd/commands-workflow-templates.ts +0 -543
  694. package/dist/resources/extensions/gsd/commands.ts +0 -1149
  695. package/dist/resources/extensions/gsd/complexity-classifier.ts +0 -320
  696. package/dist/resources/extensions/gsd/context-budget.ts +0 -266
  697. package/dist/resources/extensions/gsd/context-store.ts +0 -195
  698. package/dist/resources/extensions/gsd/crash-recovery.ts +0 -121
  699. package/dist/resources/extensions/gsd/dashboard-overlay.ts +0 -681
  700. package/dist/resources/extensions/gsd/db-writer.ts +0 -360
  701. package/dist/resources/extensions/gsd/debug-logger.ts +0 -178
  702. package/dist/resources/extensions/gsd/detection.ts +0 -470
  703. package/dist/resources/extensions/gsd/diff-context.ts +0 -214
  704. package/dist/resources/extensions/gsd/dispatch-guard.ts +0 -81
  705. package/dist/resources/extensions/gsd/doctor-checks.ts +0 -612
  706. package/dist/resources/extensions/gsd/doctor-environment.ts +0 -497
  707. package/dist/resources/extensions/gsd/doctor-format.ts +0 -78
  708. package/dist/resources/extensions/gsd/doctor-proactive.ts +0 -292
  709. package/dist/resources/extensions/gsd/doctor-providers.ts +0 -343
  710. package/dist/resources/extensions/gsd/doctor-types.ts +0 -87
  711. package/dist/resources/extensions/gsd/doctor.ts +0 -722
  712. package/dist/resources/extensions/gsd/error-utils.ts +0 -6
  713. package/dist/resources/extensions/gsd/exit-command.ts +0 -18
  714. package/dist/resources/extensions/gsd/export.ts +0 -317
  715. package/dist/resources/extensions/gsd/file-watcher.ts +0 -97
  716. package/dist/resources/extensions/gsd/files.ts +0 -1058
  717. package/dist/resources/extensions/gsd/forensics.ts +0 -629
  718. package/dist/resources/extensions/gsd/git-self-heal.ts +0 -127
  719. package/dist/resources/extensions/gsd/git-service.ts +0 -580
  720. package/dist/resources/extensions/gsd/gsd-db.ts +0 -685
  721. package/dist/resources/extensions/gsd/guided-flow-queue.ts +0 -440
  722. package/dist/resources/extensions/gsd/guided-flow.ts +0 -1303
  723. package/dist/resources/extensions/gsd/health-widget.ts +0 -167
  724. package/dist/resources/extensions/gsd/history.ts +0 -143
  725. package/dist/resources/extensions/gsd/index.ts +0 -1390
  726. package/dist/resources/extensions/gsd/init-wizard.ts +0 -587
  727. package/dist/resources/extensions/gsd/json-persistence.ts +0 -67
  728. package/dist/resources/extensions/gsd/key-manager.ts +0 -996
  729. package/dist/resources/extensions/gsd/marketplace-discovery.ts +0 -508
  730. package/dist/resources/extensions/gsd/md-importer.ts +0 -527
  731. package/dist/resources/extensions/gsd/mechanical-completion.ts +0 -430
  732. package/dist/resources/extensions/gsd/memory-extractor.ts +0 -352
  733. package/dist/resources/extensions/gsd/memory-store.ts +0 -441
  734. package/dist/resources/extensions/gsd/metrics.ts +0 -532
  735. package/dist/resources/extensions/gsd/migrate/command.ts +0 -219
  736. package/dist/resources/extensions/gsd/migrate/index.ts +0 -42
  737. package/dist/resources/extensions/gsd/migrate/parser.ts +0 -323
  738. package/dist/resources/extensions/gsd/migrate/parsers.ts +0 -539
  739. package/dist/resources/extensions/gsd/migrate/preview.ts +0 -48
  740. package/dist/resources/extensions/gsd/migrate/transformer.ts +0 -346
  741. package/dist/resources/extensions/gsd/migrate/types.ts +0 -370
  742. package/dist/resources/extensions/gsd/migrate/validator.ts +0 -55
  743. package/dist/resources/extensions/gsd/migrate/writer.ts +0 -579
  744. package/dist/resources/extensions/gsd/migrate-external.ts +0 -140
  745. package/dist/resources/extensions/gsd/milestone-actions.ts +0 -126
  746. package/dist/resources/extensions/gsd/model-cost-table.ts +0 -65
  747. package/dist/resources/extensions/gsd/model-router.ts +0 -256
  748. package/dist/resources/extensions/gsd/namespaced-registry.ts +0 -467
  749. package/dist/resources/extensions/gsd/namespaced-resolver.ts +0 -307
  750. package/dist/resources/extensions/gsd/native-git-bridge.ts +0 -1041
  751. package/dist/resources/extensions/gsd/native-parser-bridge.ts +0 -267
  752. package/dist/resources/extensions/gsd/notifications.ts +0 -87
  753. package/dist/resources/extensions/gsd/observability-validator.ts +0 -429
  754. package/dist/resources/extensions/gsd/parallel-eligibility.ts +0 -233
  755. package/dist/resources/extensions/gsd/parallel-merge.ts +0 -157
  756. package/dist/resources/extensions/gsd/parallel-orchestrator.ts +0 -826
  757. package/dist/resources/extensions/gsd/paths.ts +0 -449
  758. package/dist/resources/extensions/gsd/plugin-importer.ts +0 -411
  759. package/dist/resources/extensions/gsd/post-unit-hooks.ts +0 -520
  760. package/dist/resources/extensions/gsd/preferences-models.ts +0 -329
  761. package/dist/resources/extensions/gsd/preferences-skills.ts +0 -169
  762. package/dist/resources/extensions/gsd/preferences-types.ts +0 -229
  763. package/dist/resources/extensions/gsd/preferences-validation.ts +0 -590
  764. package/dist/resources/extensions/gsd/preferences.ts +0 -416
  765. package/dist/resources/extensions/gsd/progress-score.ts +0 -273
  766. package/dist/resources/extensions/gsd/prompt-cache-optimizer.ts +0 -213
  767. package/dist/resources/extensions/gsd/prompt-compressor.ts +0 -508
  768. package/dist/resources/extensions/gsd/prompt-loader.ts +0 -130
  769. package/dist/resources/extensions/gsd/prompt-ordering.ts +0 -200
  770. package/dist/resources/extensions/gsd/provider-error-pause.ts +0 -88
  771. package/dist/resources/extensions/gsd/queue-order.ts +0 -230
  772. package/dist/resources/extensions/gsd/queue-reorder-ui.ts +0 -276
  773. package/dist/resources/extensions/gsd/quick.ts +0 -212
  774. package/dist/resources/extensions/gsd/repo-identity.ts +0 -169
  775. package/dist/resources/extensions/gsd/roadmap-slices.ts +0 -149
  776. package/dist/resources/extensions/gsd/routing-history.ts +0 -286
  777. package/dist/resources/extensions/gsd/safe-fs.ts +0 -47
  778. package/dist/resources/extensions/gsd/semantic-chunker.ts +0 -336
  779. package/dist/resources/extensions/gsd/session-forensics.ts +0 -537
  780. package/dist/resources/extensions/gsd/session-lock.ts +0 -426
  781. package/dist/resources/extensions/gsd/session-status-io.ts +0 -179
  782. package/dist/resources/extensions/gsd/skill-discovery.ts +0 -139
  783. package/dist/resources/extensions/gsd/skill-health.ts +0 -417
  784. package/dist/resources/extensions/gsd/state.ts +0 -727
  785. package/dist/resources/extensions/gsd/structured-data-formatter.ts +0 -144
  786. package/dist/resources/extensions/gsd/summary-distiller.ts +0 -258
  787. package/dist/resources/extensions/gsd/tests/activity-log.test.ts +0 -213
  788. package/dist/resources/extensions/gsd/tests/agent-end-retry.test.ts +0 -107
  789. package/dist/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +0 -200
  790. package/dist/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +0 -50
  791. package/dist/resources/extensions/gsd/tests/auto-dashboard.test.ts +0 -166
  792. package/dist/resources/extensions/gsd/tests/auto-dispatch-loop.test.ts +0 -691
  793. package/dist/resources/extensions/gsd/tests/auto-lock-creation.test.ts +0 -186
  794. package/dist/resources/extensions/gsd/tests/auto-preflight.test.ts +0 -40
  795. package/dist/resources/extensions/gsd/tests/auto-recovery.test.ts +0 -640
  796. package/dist/resources/extensions/gsd/tests/auto-reentrancy-guard.test.ts +0 -127
  797. package/dist/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +0 -302
  798. package/dist/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +0 -257
  799. package/dist/resources/extensions/gsd/tests/auto-skip-loop.test.ts +0 -123
  800. package/dist/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +0 -340
  801. package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +0 -167
  802. package/dist/resources/extensions/gsd/tests/budget-prediction.test.ts +0 -220
  803. package/dist/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +0 -317
  804. package/dist/resources/extensions/gsd/tests/captures.test.ts +0 -438
  805. package/dist/resources/extensions/gsd/tests/claude-import-tui.test.ts +0 -351
  806. package/dist/resources/extensions/gsd/tests/collect-from-manifest.test.ts +0 -469
  807. package/dist/resources/extensions/gsd/tests/collision-diagnostics.test.ts +0 -705
  808. package/dist/resources/extensions/gsd/tests/commands-logs.test.ts +0 -241
  809. package/dist/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -209
  810. package/dist/resources/extensions/gsd/tests/complexity-classifier.test.ts +0 -181
  811. package/dist/resources/extensions/gsd/tests/context-budget.test.ts +0 -352
  812. package/dist/resources/extensions/gsd/tests/context-compression.test.ts +0 -193
  813. package/dist/resources/extensions/gsd/tests/context-store.test.ts +0 -462
  814. package/dist/resources/extensions/gsd/tests/continue-here.test.ts +0 -285
  815. package/dist/resources/extensions/gsd/tests/cost-projection.test.ts +0 -134
  816. package/dist/resources/extensions/gsd/tests/crash-recovery.test.ts +0 -134
  817. package/dist/resources/extensions/gsd/tests/dashboard-budget.test.ts +0 -346
  818. package/dist/resources/extensions/gsd/tests/db-writer.test.ts +0 -602
  819. package/dist/resources/extensions/gsd/tests/debug-logger.test.ts +0 -185
  820. package/dist/resources/extensions/gsd/tests/derive-state-db.test.ts +0 -405
  821. package/dist/resources/extensions/gsd/tests/derive-state-deps.test.ts +0 -421
  822. package/dist/resources/extensions/gsd/tests/derive-state-draft.test.ts +0 -308
  823. package/dist/resources/extensions/gsd/tests/derive-state.test.ts +0 -788
  824. package/dist/resources/extensions/gsd/tests/detection.test.ts +0 -398
  825. package/dist/resources/extensions/gsd/tests/diff-context.test.ts +0 -136
  826. package/dist/resources/extensions/gsd/tests/discuss-prompt.test.ts +0 -15
  827. package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -128
  828. package/dist/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +0 -132
  829. package/dist/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +0 -126
  830. package/dist/resources/extensions/gsd/tests/doctor-environment.test.ts +0 -314
  831. package/dist/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +0 -245
  832. package/dist/resources/extensions/gsd/tests/doctor-git.test.ts +0 -344
  833. package/dist/resources/extensions/gsd/tests/doctor-proactive.test.ts +0 -278
  834. package/dist/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -298
  835. package/dist/resources/extensions/gsd/tests/doctor-runtime.test.ts +0 -302
  836. package/dist/resources/extensions/gsd/tests/doctor.test.ts +0 -652
  837. package/dist/resources/extensions/gsd/tests/draft-promotion.test.ts +0 -169
  838. package/dist/resources/extensions/gsd/tests/exit-command.test.ts +0 -50
  839. package/dist/resources/extensions/gsd/tests/export-html-all.test.ts +0 -105
  840. package/dist/resources/extensions/gsd/tests/export-html-enhancements.test.ts +0 -378
  841. package/dist/resources/extensions/gsd/tests/extension-selector-separator.test.ts +0 -144
  842. package/dist/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +0 -424
  843. package/dist/resources/extensions/gsd/tests/git-self-heal.test.ts +0 -131
  844. package/dist/resources/extensions/gsd/tests/git-service.test.ts +0 -1172
  845. package/dist/resources/extensions/gsd/tests/gsd-db.test.ts +0 -353
  846. package/dist/resources/extensions/gsd/tests/gsd-inspect.test.ts +0 -125
  847. package/dist/resources/extensions/gsd/tests/gsd-tools.test.ts +0 -326
  848. package/dist/resources/extensions/gsd/tests/headless-answers.test.ts +0 -340
  849. package/dist/resources/extensions/gsd/tests/headless-query.test.ts +0 -162
  850. package/dist/resources/extensions/gsd/tests/idle-recovery.test.ts +0 -485
  851. package/dist/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +0 -32
  852. package/dist/resources/extensions/gsd/tests/init-wizard.test.ts +0 -197
  853. package/dist/resources/extensions/gsd/tests/integration/headless-command.ts +0 -534
  854. package/dist/resources/extensions/gsd/tests/integration-edge.test.ts +0 -228
  855. package/dist/resources/extensions/gsd/tests/integration-lifecycle.test.ts +0 -277
  856. package/dist/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +0 -523
  857. package/dist/resources/extensions/gsd/tests/key-manager.test.ts +0 -414
  858. package/dist/resources/extensions/gsd/tests/knowledge.test.ts +0 -161
  859. package/dist/resources/extensions/gsd/tests/loop-regression.test.ts +0 -877
  860. package/dist/resources/extensions/gsd/tests/manifest-status.test.ts +0 -283
  861. package/dist/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +0 -91
  862. package/dist/resources/extensions/gsd/tests/md-importer.test.ts +0 -410
  863. package/dist/resources/extensions/gsd/tests/mechanical-completion.test.ts +0 -356
  864. package/dist/resources/extensions/gsd/tests/memory-extractor.test.ts +0 -180
  865. package/dist/resources/extensions/gsd/tests/memory-leak-guards.test.ts +0 -91
  866. package/dist/resources/extensions/gsd/tests/memory-store.test.ts +0 -345
  867. package/dist/resources/extensions/gsd/tests/metrics.test.ts +0 -253
  868. package/dist/resources/extensions/gsd/tests/migrate-command.test.ts +0 -369
  869. package/dist/resources/extensions/gsd/tests/migrate-parser.test.ts +0 -757
  870. package/dist/resources/extensions/gsd/tests/migrate-transformer.test.ts +0 -635
  871. package/dist/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +0 -414
  872. package/dist/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +0 -303
  873. package/dist/resources/extensions/gsd/tests/migrate-writer.test.ts +0 -398
  874. package/dist/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +0 -147
  875. package/dist/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -69
  876. package/dist/resources/extensions/gsd/tests/model-isolation.test.ts +0 -157
  877. package/dist/resources/extensions/gsd/tests/model-router.test.ts +0 -167
  878. package/dist/resources/extensions/gsd/tests/must-have-parser.test.ts +0 -291
  879. package/dist/resources/extensions/gsd/tests/namespaced-registry.test.ts +0 -1027
  880. package/dist/resources/extensions/gsd/tests/namespaced-resolver.test.ts +0 -671
  881. package/dist/resources/extensions/gsd/tests/native-has-changes-cache.test.ts +0 -61
  882. package/dist/resources/extensions/gsd/tests/next-milestone-id.test.ts +0 -23
  883. package/dist/resources/extensions/gsd/tests/none-mode-gates.test.ts +0 -114
  884. package/dist/resources/extensions/gsd/tests/notifications.test.ts +0 -67
  885. package/dist/resources/extensions/gsd/tests/overrides.test.ts +0 -131
  886. package/dist/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -331
  887. package/dist/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +0 -298
  888. package/dist/resources/extensions/gsd/tests/parallel-merge.test.ts +0 -468
  889. package/dist/resources/extensions/gsd/tests/parallel-orchestration.test.ts +0 -685
  890. package/dist/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +0 -171
  891. package/dist/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +0 -354
  892. package/dist/resources/extensions/gsd/tests/park-edge-cases.test.ts +0 -276
  893. package/dist/resources/extensions/gsd/tests/park-milestone.test.ts +0 -401
  894. package/dist/resources/extensions/gsd/tests/parsers.test.ts +0 -1704
  895. package/dist/resources/extensions/gsd/tests/plan-milestone.test.ts +0 -133
  896. package/dist/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -363
  897. package/dist/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +0 -42
  898. package/dist/resources/extensions/gsd/tests/plugin-importer-live.test.ts +0 -481
  899. package/dist/resources/extensions/gsd/tests/plugin-importer.test.ts +0 -1383
  900. package/dist/resources/extensions/gsd/tests/post-unit-hooks.test.ts +0 -337
  901. package/dist/resources/extensions/gsd/tests/preferences.test.ts +0 -276
  902. package/dist/resources/extensions/gsd/tests/progress-score.test.ts +0 -206
  903. package/dist/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +0 -464
  904. package/dist/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +0 -314
  905. package/dist/resources/extensions/gsd/tests/prompt-compressor.test.ts +0 -529
  906. package/dist/resources/extensions/gsd/tests/prompt-db.test.ts +0 -385
  907. package/dist/resources/extensions/gsd/tests/prompt-ordering.test.ts +0 -296
  908. package/dist/resources/extensions/gsd/tests/provider-errors.test.ts +0 -338
  909. package/dist/resources/extensions/gsd/tests/queue-draft-detection.test.ts +0 -126
  910. package/dist/resources/extensions/gsd/tests/queue-order.test.ts +0 -204
  911. package/dist/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +0 -282
  912. package/dist/resources/extensions/gsd/tests/reassess-detection.test.ts +0 -154
  913. package/dist/resources/extensions/gsd/tests/reassess-prompt.test.ts +0 -145
  914. package/dist/resources/extensions/gsd/tests/regex-hardening.test.ts +0 -281
  915. package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +0 -642
  916. package/dist/resources/extensions/gsd/tests/remote-status.test.ts +0 -99
  917. package/dist/resources/extensions/gsd/tests/replan-slice.test.ts +0 -538
  918. package/dist/resources/extensions/gsd/tests/requirements.test.ts +0 -106
  919. package/dist/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +0 -358
  920. package/dist/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -66
  921. package/dist/resources/extensions/gsd/tests/routing-history.test.ts +0 -240
  922. package/dist/resources/extensions/gsd/tests/run-uat.test.ts +0 -416
  923. package/dist/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -185
  924. package/dist/resources/extensions/gsd/tests/semantic-chunker.test.ts +0 -426
  925. package/dist/resources/extensions/gsd/tests/session-lock-regression.test.ts +0 -216
  926. package/dist/resources/extensions/gsd/tests/session-lock.test.ts +0 -434
  927. package/dist/resources/extensions/gsd/tests/skill-lifecycle.test.ts +0 -126
  928. package/dist/resources/extensions/gsd/tests/smart-entry-draft.test.ts +0 -123
  929. package/dist/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -142
  930. package/dist/resources/extensions/gsd/tests/stop-auto-remote.test.ts +0 -156
  931. package/dist/resources/extensions/gsd/tests/structured-data-formatter.test.ts +0 -365
  932. package/dist/resources/extensions/gsd/tests/summary-distiller.test.ts +0 -323
  933. package/dist/resources/extensions/gsd/tests/test-helpers.ts +0 -61
  934. package/dist/resources/extensions/gsd/tests/token-counter.test.ts +0 -129
  935. package/dist/resources/extensions/gsd/tests/token-optimization-benchmark.test.ts +0 -1272
  936. package/dist/resources/extensions/gsd/tests/token-optimization-prefs.test.ts +0 -164
  937. package/dist/resources/extensions/gsd/tests/token-profile.test.ts +0 -268
  938. package/dist/resources/extensions/gsd/tests/token-savings.test.ts +0 -366
  939. package/dist/resources/extensions/gsd/tests/triage-dispatch.test.ts +0 -340
  940. package/dist/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -416
  941. package/dist/resources/extensions/gsd/tests/undo.test.ts +0 -136
  942. package/dist/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +0 -219
  943. package/dist/resources/extensions/gsd/tests/unit-runtime.test.ts +0 -258
  944. package/dist/resources/extensions/gsd/tests/update-command.test.ts +0 -67
  945. package/dist/resources/extensions/gsd/tests/validate-directory.test.ts +0 -222
  946. package/dist/resources/extensions/gsd/tests/validate-milestone.test.ts +0 -375
  947. package/dist/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -745
  948. package/dist/resources/extensions/gsd/tests/verification-gate.test.ts +0 -1208
  949. package/dist/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +0 -145
  950. package/dist/resources/extensions/gsd/tests/visualizer-data.test.ts +0 -446
  951. package/dist/resources/extensions/gsd/tests/visualizer-overlay.test.ts +0 -237
  952. package/dist/resources/extensions/gsd/tests/visualizer-views.test.ts +0 -718
  953. package/dist/resources/extensions/gsd/tests/worker-registry.test.ts +0 -148
  954. package/dist/resources/extensions/gsd/tests/workflow-templates.test.ts +0 -173
  955. package/dist/resources/extensions/gsd/tests/workspace-index.test.ts +0 -38
  956. package/dist/resources/extensions/gsd/tests/worktree-bugfix.test.ts +0 -120
  957. package/dist/resources/extensions/gsd/tests/worktree-e2e.test.ts +0 -244
  958. package/dist/resources/extensions/gsd/tests/worktree-integration.test.ts +0 -207
  959. package/dist/resources/extensions/gsd/tests/worktree-manager.test.ts +0 -141
  960. package/dist/resources/extensions/gsd/tests/worktree-post-create-hook.test.ts +0 -165
  961. package/dist/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +0 -206
  962. package/dist/resources/extensions/gsd/tests/worktree.test.ts +0 -171
  963. package/dist/resources/extensions/gsd/tests/write-gate.test.ts +0 -211
  964. package/dist/resources/extensions/gsd/token-counter.ts +0 -65
  965. package/dist/resources/extensions/gsd/triage-resolution.ts +0 -284
  966. package/dist/resources/extensions/gsd/triage-ui.ts +0 -175
  967. package/dist/resources/extensions/gsd/types.ts +0 -425
  968. package/dist/resources/extensions/gsd/undo.ts +0 -223
  969. package/dist/resources/extensions/gsd/unit-id.ts +0 -14
  970. package/dist/resources/extensions/gsd/unit-runtime.ts +0 -192
  971. package/dist/resources/extensions/gsd/validate-directory.ts +0 -164
  972. package/dist/resources/extensions/gsd/verification-evidence.ts +0 -188
  973. package/dist/resources/extensions/gsd/verification-gate.ts +0 -643
  974. package/dist/resources/extensions/gsd/visualizer-data.ts +0 -866
  975. package/dist/resources/extensions/gsd/visualizer-overlay.ts +0 -566
  976. package/dist/resources/extensions/gsd/visualizer-views.ts +0 -1171
  977. package/dist/resources/extensions/gsd/workflow-templates.ts +0 -241
  978. package/dist/resources/extensions/gsd/workspace-index.ts +0 -217
  979. package/dist/resources/extensions/gsd/worktree-command.ts +0 -807
  980. package/dist/resources/extensions/gsd/worktree-manager.ts +0 -449
  981. package/dist/resources/extensions/gsd/worktree.ts +0 -257
  982. package/dist/resources/extensions/mac-tools/index.ts +0 -852
  983. package/dist/resources/extensions/mcp-client/index.ts +0 -459
  984. package/dist/resources/extensions/remote-questions/config.ts +0 -83
  985. package/dist/resources/extensions/remote-questions/discord-adapter.ts +0 -148
  986. package/dist/resources/extensions/remote-questions/format.ts +0 -315
  987. package/dist/resources/extensions/remote-questions/http-client.ts +0 -76
  988. package/dist/resources/extensions/remote-questions/manager.ts +0 -184
  989. package/dist/resources/extensions/remote-questions/notify.ts +0 -90
  990. package/dist/resources/extensions/remote-questions/remote-command.ts +0 -457
  991. package/dist/resources/extensions/remote-questions/slack-adapter.ts +0 -141
  992. package/dist/resources/extensions/remote-questions/status.ts +0 -31
  993. package/dist/resources/extensions/remote-questions/store.ts +0 -81
  994. package/dist/resources/extensions/remote-questions/telegram-adapter.ts +0 -149
  995. package/dist/resources/extensions/remote-questions/types.ts +0 -102
  996. package/dist/resources/extensions/search-the-web/cache.ts +0 -78
  997. package/dist/resources/extensions/search-the-web/command-search-provider.ts +0 -101
  998. package/dist/resources/extensions/search-the-web/format.ts +0 -258
  999. package/dist/resources/extensions/search-the-web/http.ts +0 -238
  1000. package/dist/resources/extensions/search-the-web/index.ts +0 -65
  1001. package/dist/resources/extensions/search-the-web/native-search.ts +0 -193
  1002. package/dist/resources/extensions/search-the-web/provider.ts +0 -148
  1003. package/dist/resources/extensions/search-the-web/tavily.ts +0 -116
  1004. package/dist/resources/extensions/search-the-web/tool-fetch-page.ts +0 -589
  1005. package/dist/resources/extensions/search-the-web/tool-llm-context.ts +0 -608
  1006. package/dist/resources/extensions/search-the-web/tool-search.ts +0 -649
  1007. package/dist/resources/extensions/search-the-web/url-utils.ts +0 -125
  1008. package/dist/resources/extensions/shared/confirm-ui.ts +0 -126
  1009. package/dist/resources/extensions/shared/frontmatter.ts +0 -117
  1010. package/dist/resources/extensions/shared/interview-ui.ts +0 -613
  1011. package/dist/resources/extensions/shared/next-action-ui.ts +0 -212
  1012. package/dist/resources/extensions/shared/sanitize.ts +0 -19
  1013. package/dist/resources/extensions/shared/terminal.ts +0 -23
  1014. package/dist/resources/extensions/shared/tests/format-utils.test.ts +0 -153
  1015. package/dist/resources/extensions/shared/ui.ts +0 -400
  1016. package/dist/resources/extensions/shared/wizard-ui.ts +0 -551
  1017. package/dist/resources/extensions/slash-commands/audit.ts +0 -88
  1018. package/dist/resources/extensions/slash-commands/clear.ts +0 -10
  1019. package/dist/resources/extensions/slash-commands/create-extension.ts +0 -297
  1020. package/dist/resources/extensions/slash-commands/create-slash-command.ts +0 -234
  1021. package/dist/resources/extensions/slash-commands/index.ts +0 -12
  1022. package/dist/resources/extensions/subagent/agents.ts +0 -126
  1023. package/dist/resources/extensions/subagent/index.ts +0 -1121
  1024. package/dist/resources/extensions/subagent/isolation.ts +0 -501
  1025. package/dist/resources/extensions/subagent/worker-registry.ts +0 -99
  1026. package/dist/resources/extensions/ttsr/index.ts +0 -168
  1027. package/dist/resources/extensions/ttsr/rule-loader.ts +0 -74
  1028. package/dist/resources/extensions/ttsr/ttsr-manager.ts +0 -456
  1029. package/dist/resources/extensions/universal-config/discovery.ts +0 -104
  1030. package/dist/resources/extensions/universal-config/format.ts +0 -191
  1031. package/dist/resources/extensions/universal-config/index.ts +0 -120
  1032. package/dist/resources/extensions/universal-config/scanners.ts +0 -642
  1033. package/dist/resources/extensions/universal-config/tests/discovery.test.ts +0 -119
  1034. package/dist/resources/extensions/universal-config/tests/format.test.ts +0 -127
  1035. package/dist/resources/extensions/universal-config/tests/scanners.test.ts +0 -456
  1036. package/dist/resources/extensions/universal-config/tools.ts +0 -60
  1037. package/dist/resources/extensions/universal-config/types.ts +0 -135
  1038. package/dist/resources/extensions/voice/index.ts +0 -272
  1039. package/dist/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +0 -51
  1040. package/dist/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +0 -143
  1041. package/packages/pi-coding-agent/dist/modes/interactive/theme/dark.json +0 -85
  1042. package/packages/pi-coding-agent/dist/modes/interactive/theme/light.json +0 -84
  1043. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.json +0 -335
  1044. package/packages/pi-coding-agent/src/modes/interactive/theme/dark.json +0 -85
  1045. package/packages/pi-coding-agent/src/modes/interactive/theme/light.json +0 -84
  1046. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.json +0 -335
  1047. package/pkg/dist/modes/interactive/theme/dark.json +0 -85
  1048. package/pkg/dist/modes/interactive/theme/light.json +0 -84
  1049. package/pkg/dist/modes/interactive/theme/theme-schema.json +0 -335
  1050. package/src/resources/extensions/gsd/auto-constants.ts +0 -6
  1051. package/src/resources/extensions/gsd/auto-idempotency.ts +0 -151
  1052. package/src/resources/extensions/gsd/auto-stuck-detection.ts +0 -221
  1053. package/src/resources/extensions/gsd/mechanical-completion.ts +0 -430
  1054. package/src/resources/extensions/gsd/tests/auto-dispatch-loop.test.ts +0 -691
  1055. package/src/resources/extensions/gsd/tests/auto-reentrancy-guard.test.ts +0 -127
  1056. package/src/resources/extensions/gsd/tests/auto-skip-loop.test.ts +0 -123
  1057. package/src/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +0 -126
  1058. package/src/resources/extensions/gsd/tests/loop-regression.test.ts +0 -877
  1059. package/src/resources/extensions/gsd/tests/mechanical-completion.test.ts +0 -356
  1060. package/src/resources/extensions/gsd/tests/progress-score.test.ts +0 -206
  1061. package/src/resources/extensions/gsd/tests/session-lock.test.ts +0 -434
@@ -0,0 +1,1458 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { readFileSync } from "node:fs";
4
+ import { resolve } from "node:path";
5
+
6
+ import {
7
+ resolveAgentEnd,
8
+ runUnit,
9
+ autoLoop,
10
+ _resetPendingResolve,
11
+ _setActiveSession,
12
+ isSessionSwitchInFlight,
13
+ type UnitResult,
14
+ type AgentEndEvent,
15
+ type LoopDeps,
16
+ } from "../auto-loop.js";
17
+
18
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
19
+
20
+ function makeEvent(
21
+ messages: unknown[] = [{ role: "assistant" }],
22
+ ): AgentEndEvent {
23
+ return { messages };
24
+ }
25
+
26
+ /**
27
+ * Build a minimal mock AutoSession with controllable newSession behavior.
28
+ */
29
+ function makeMockSession(opts?: {
30
+ newSessionResult?: { cancelled: boolean };
31
+ newSessionThrows?: string;
32
+ newSessionDelayMs?: number;
33
+ onNewSessionStart?: (session: any) => void;
34
+ onNewSessionSettle?: (session: any) => void;
35
+ }) {
36
+ const session = {
37
+ active: true,
38
+ verbose: false,
39
+ sessionSwitchInFlight: false,
40
+ pendingResolve: null,
41
+ pendingAgentEndQueue: [],
42
+ cmdCtx: {
43
+ newSession: () => {
44
+ opts?.onNewSessionStart?.(session);
45
+ if (opts?.newSessionThrows) {
46
+ return Promise.reject(new Error(opts.newSessionThrows));
47
+ }
48
+ const result = opts?.newSessionResult ?? { cancelled: false };
49
+ const delay = opts?.newSessionDelayMs ?? 0;
50
+ if (delay > 0) {
51
+ return new Promise<{ cancelled: boolean }>((res) =>
52
+ setTimeout(() => {
53
+ opts?.onNewSessionSettle?.(session);
54
+ res(result);
55
+ }, delay),
56
+ );
57
+ }
58
+ opts?.onNewSessionSettle?.(session);
59
+ return Promise.resolve(result);
60
+ },
61
+ },
62
+ clearTimers: () => {},
63
+ } as any;
64
+ return session;
65
+ }
66
+
67
+ /**
68
+ * Build a minimal mock ExtensionContext.
69
+ */
70
+ function makeMockCtx() {
71
+ return {
72
+ ui: { notify: () => {} },
73
+ model: { id: "test-model" },
74
+ } as any;
75
+ }
76
+
77
+ /**
78
+ * Build a minimal mock ExtensionAPI that records sendMessage calls.
79
+ */
80
+ function makeMockPi() {
81
+ const calls: unknown[] = [];
82
+ return {
83
+ sendMessage: (...args: unknown[]) => {
84
+ calls.push(args);
85
+ },
86
+ calls,
87
+ } as any;
88
+ }
89
+
90
+ // ─── Tests ───────────────────────────────────────────────────────────────────
91
+
92
+ test("resolveAgentEnd resolves a pending runUnit promise", async () => {
93
+ _resetPendingResolve();
94
+
95
+ const ctx = makeMockCtx();
96
+ const pi = makeMockPi();
97
+ const s = makeMockSession();
98
+ _setActiveSession(s);
99
+ const event = makeEvent();
100
+
101
+ // Start runUnit — it will create the promise and send a message,
102
+ // then block awaiting agent_end
103
+ const resultPromise = runUnit(
104
+ ctx,
105
+ pi,
106
+ s,
107
+ "task",
108
+ "T01",
109
+ "do stuff",
110
+ undefined,
111
+ );
112
+
113
+ // Give the microtask queue a tick so runUnit reaches the await
114
+ await new Promise((r) => setTimeout(r, 10));
115
+
116
+ // Now resolve the agent_end
117
+ resolveAgentEnd(event);
118
+
119
+ const result = await resultPromise;
120
+ assert.equal(result.status, "completed");
121
+ assert.deepEqual(result.event, event);
122
+ });
123
+
124
+ test("resolveAgentEnd queues event when no promise is pending", () => {
125
+ _resetPendingResolve();
126
+ const s = makeMockSession();
127
+ _setActiveSession(s);
128
+
129
+ // Should not throw — queues the event for the next runUnit
130
+ assert.doesNotThrow(() => {
131
+ resolveAgentEnd(makeEvent());
132
+ });
133
+ assert.equal(s.pendingAgentEndQueue.length, 1, "event should be queued");
134
+ });
135
+
136
+ test("double resolveAgentEnd only resolves once (second is queued)", async () => {
137
+ _resetPendingResolve();
138
+
139
+ const ctx = makeMockCtx();
140
+ const pi = makeMockPi();
141
+ const s = makeMockSession();
142
+ _setActiveSession(s);
143
+ const event1 = makeEvent([{ id: 1 }]);
144
+ const event2 = makeEvent([{ id: 2 }]);
145
+
146
+ const resultPromise = runUnit(ctx, pi, s, "task", "T01", "prompt", undefined);
147
+
148
+ await new Promise((r) => setTimeout(r, 10));
149
+
150
+ // First resolve — should work
151
+ resolveAgentEnd(event1);
152
+
153
+ // Second resolve — should be queued (no pending promise)
154
+ assert.doesNotThrow(() => {
155
+ resolveAgentEnd(event2);
156
+ });
157
+ assert.equal(
158
+ s.pendingAgentEndQueue.length,
159
+ 1,
160
+ "second event should be queued",
161
+ );
162
+
163
+ const result = await resultPromise;
164
+ assert.equal(result.status, "completed");
165
+ // Should have the first event, not the second
166
+ assert.deepEqual(result.event, event1);
167
+ });
168
+
169
+ test("runUnit returns cancelled when session creation fails", async () => {
170
+ _resetPendingResolve();
171
+
172
+ const ctx = makeMockCtx();
173
+ const pi = makeMockPi();
174
+ const s = makeMockSession({ newSessionThrows: "connection refused" });
175
+
176
+ const result = await runUnit(ctx, pi, s, "task", "T01", "prompt", undefined);
177
+
178
+ assert.equal(result.status, "cancelled");
179
+ assert.equal(result.event, undefined);
180
+ // sendMessage should NOT have been called
181
+ assert.equal(pi.calls.length, 0);
182
+ });
183
+
184
+ test("runUnit returns cancelled when session creation times out", async () => {
185
+ _resetPendingResolve();
186
+
187
+ const ctx = makeMockCtx();
188
+ const pi = makeMockPi();
189
+ // Session returns cancelled: true (simulates the timeout race outcome)
190
+ const s = makeMockSession({ newSessionResult: { cancelled: true } });
191
+
192
+ const result = await runUnit(ctx, pi, s, "task", "T01", "prompt", undefined);
193
+
194
+ assert.equal(result.status, "cancelled");
195
+ assert.equal(result.event, undefined);
196
+ assert.equal(pi.calls.length, 0);
197
+ });
198
+
199
+ test("runUnit returns cancelled when s.active is false before sendMessage", async () => {
200
+ _resetPendingResolve();
201
+
202
+ const ctx = makeMockCtx();
203
+ const pi = makeMockPi();
204
+ const s = makeMockSession();
205
+ s.active = false;
206
+
207
+ const result = await runUnit(ctx, pi, s, "task", "T01", "prompt", undefined);
208
+
209
+ assert.equal(result.status, "cancelled");
210
+ assert.equal(pi.calls.length, 0);
211
+ });
212
+
213
+ test("runUnit only arms pendingResolve after newSession completes", async () => {
214
+ _resetPendingResolve();
215
+
216
+ let sawSwitchFlag = false;
217
+ let sawPendingResolve: unknown = "unset";
218
+
219
+ const ctx = makeMockCtx();
220
+ const pi = makeMockPi();
221
+ const s = makeMockSession({
222
+ newSessionDelayMs: 20,
223
+ onNewSessionStart: (session) => {
224
+ sawSwitchFlag = session.sessionSwitchInFlight;
225
+ sawPendingResolve = session.pendingResolve;
226
+ },
227
+ });
228
+ _setActiveSession(s);
229
+
230
+ const resultPromise = runUnit(ctx, pi, s, "task", "T01", "prompt", undefined);
231
+
232
+ await new Promise((r) => setTimeout(r, 30));
233
+
234
+ assert.equal(sawSwitchFlag, true, "session switch guard should be active during newSession");
235
+ assert.equal(sawPendingResolve, null, "pendingResolve should not be armed before newSession completes");
236
+ assert.equal(isSessionSwitchInFlight(), false, "session switch guard should clear after newSession settles");
237
+
238
+ resolveAgentEnd(makeEvent());
239
+
240
+ const result = await resultPromise;
241
+ assert.equal(result.status, "completed");
242
+ assert.equal(pi.calls.length, 1);
243
+ });
244
+
245
+ // ─── Structural assertions ───────────────────────────────────────────────────
246
+
247
+ test("auto-loop.ts exports autoLoop, runUnit, resolveAgentEnd", async () => {
248
+ const mod = await import("../auto-loop.js");
249
+ assert.equal(
250
+ typeof mod.autoLoop,
251
+ "function",
252
+ "autoLoop should be exported as a function",
253
+ );
254
+ assert.equal(
255
+ typeof mod.runUnit,
256
+ "function",
257
+ "runUnit should be exported as a function",
258
+ );
259
+ assert.equal(
260
+ typeof mod.resolveAgentEnd,
261
+ "function",
262
+ "resolveAgentEnd should be exported as a function",
263
+ );
264
+ });
265
+
266
+ test("auto-loop.ts contains a while keyword", () => {
267
+ const src = readFileSync(
268
+ resolve(import.meta.dirname, "..", "auto-loop.ts"),
269
+ "utf-8",
270
+ );
271
+ assert.ok(
272
+ src.includes("while"),
273
+ "auto-loop.ts should contain a while keyword (loop or placeholder)",
274
+ );
275
+ });
276
+
277
+ test("auto-loop.ts one-shot pattern: pendingResolve is nulled before calling resolver", () => {
278
+ const src = readFileSync(
279
+ resolve(import.meta.dirname, "..", "auto-loop.ts"),
280
+ "utf-8",
281
+ );
282
+ // The one-shot pattern requires: save ref, null the variable, then call
283
+ // Look for the pattern: s.pendingResolve = null appearing before r(
284
+ const resolveBlock = src.slice(
285
+ src.indexOf("export function resolveAgentEnd"),
286
+ src.indexOf("export function resolveAgentEnd") + 600,
287
+ );
288
+ const nullIdx = resolveBlock.indexOf("pendingResolve = null");
289
+ const callIdx = resolveBlock.indexOf("r({");
290
+ assert.ok(nullIdx > 0, "should null pendingResolve in resolveAgentEnd");
291
+ assert.ok(callIdx > 0, "should call resolver in resolveAgentEnd");
292
+ assert.ok(
293
+ nullIdx < callIdx,
294
+ "pendingResolve should be nulled before calling the resolver (one-shot)",
295
+ );
296
+ });
297
+
298
+ // ─── autoLoop tests (T02) ─────────────────────────────────────────────────
299
+
300
+ /**
301
+ * Build a mock LoopDeps that tracks call order and allows controlling
302
+ * behavior via overrides.
303
+ */
304
+ function makeMockDeps(
305
+ overrides?: Partial<LoopDeps>,
306
+ ): LoopDeps & { callLog: string[] } {
307
+ const callLog: string[] = [];
308
+
309
+ const baseDeps: LoopDeps = {
310
+ lockBase: () => "/tmp/test-lock",
311
+ buildSnapshotOpts: () => ({}),
312
+ stopAuto: async () => {
313
+ callLog.push("stopAuto");
314
+ },
315
+ pauseAuto: async () => {
316
+ callLog.push("pauseAuto");
317
+ },
318
+ clearUnitTimeout: () => {},
319
+ updateProgressWidget: () => {},
320
+ invalidateAllCaches: () => {
321
+ callLog.push("invalidateAllCaches");
322
+ },
323
+ deriveState: async () => {
324
+ callLog.push("deriveState");
325
+ return {
326
+ phase: "executing",
327
+ activeMilestone: {
328
+ id: "M001",
329
+ title: "Test Milestone",
330
+ status: "active",
331
+ },
332
+ activeSlice: { id: "S01", title: "Test Slice" },
333
+ activeTask: { id: "T01" },
334
+ registry: [{ id: "M001", status: "active" }],
335
+ blockers: [],
336
+ } as any;
337
+ },
338
+ loadEffectiveGSDPreferences: () => ({ preferences: {} }),
339
+ preDispatchHealthGate: async () => ({ proceed: true, fixesApplied: [] }),
340
+ syncProjectRootToWorktree: () => {},
341
+ checkResourcesStale: () => null,
342
+ validateSessionLock: () => true,
343
+ updateSessionLock: () => {
344
+ callLog.push("updateSessionLock");
345
+ },
346
+ handleLostSessionLock: () => {
347
+ callLog.push("handleLostSessionLock");
348
+ },
349
+ sendDesktopNotification: () => {},
350
+ setActiveMilestoneId: () => {},
351
+ pruneQueueOrder: () => {},
352
+ isInAutoWorktree: () => false,
353
+ shouldUseWorktreeIsolation: () => false,
354
+ mergeMilestoneToMain: () => ({ pushed: false }),
355
+ teardownAutoWorktree: () => {},
356
+ createAutoWorktree: () => "/tmp/wt",
357
+ captureIntegrationBranch: () => {},
358
+ getIsolationMode: () => "none",
359
+ getCurrentBranch: () => "main",
360
+ autoWorktreeBranch: () => "auto/M001",
361
+ resolveMilestoneFile: () => null,
362
+ reconcileMergeState: () => false,
363
+ getLedger: () => null,
364
+ getProjectTotals: () => ({ cost: 0 }),
365
+ formatCost: (c: number) => `$${c.toFixed(2)}`,
366
+ getBudgetAlertLevel: () => 0,
367
+ getNewBudgetAlertLevel: () => 0,
368
+ getBudgetEnforcementAction: () => "none",
369
+ getManifestStatus: async () => null,
370
+ collectSecretsFromManifest: async () => null,
371
+ resolveDispatch: async () => {
372
+ callLog.push("resolveDispatch");
373
+ return {
374
+ action: "dispatch" as const,
375
+ unitType: "execute-task",
376
+ unitId: "M001/S01/T01",
377
+ prompt: "do the thing",
378
+ };
379
+ },
380
+ runPreDispatchHooks: () => ({ firedHooks: [], action: "proceed" }),
381
+ getPriorSliceCompletionBlocker: () => null,
382
+ getMainBranch: () => "main",
383
+ collectObservabilityWarnings: async () => [],
384
+ buildObservabilityRepairBlock: () => null,
385
+ closeoutUnit: async () => {},
386
+ verifyExpectedArtifact: () => true,
387
+ clearUnitRuntimeRecord: () => {},
388
+ writeUnitRuntimeRecord: () => {},
389
+ recordOutcome: () => {},
390
+ writeLock: () => {},
391
+ captureAvailableSkills: () => {},
392
+ ensurePreconditions: () => {},
393
+ updateSliceProgressCache: () => {},
394
+ selectAndApplyModel: async () => ({ routing: null }),
395
+ startUnitSupervision: () => {},
396
+ getDeepDiagnostic: () => null,
397
+ isDbAvailable: () => false,
398
+ reorderForCaching: (p: string) => p,
399
+ existsSync: () => false,
400
+ readFileSync: () => "",
401
+ atomicWriteSync: () => {},
402
+ GitServiceImpl: class {} as any,
403
+ resolver: {
404
+ get workPath() {
405
+ return "/tmp/project";
406
+ },
407
+ get projectRoot() {
408
+ return "/tmp/project";
409
+ },
410
+ get lockPath() {
411
+ return "/tmp/project";
412
+ },
413
+ enterMilestone: () => {},
414
+ exitMilestone: () => {},
415
+ mergeAndExit: () => {},
416
+ mergeAndEnterNext: () => {},
417
+ } as any,
418
+ postUnitPreVerification: async () => {
419
+ callLog.push("postUnitPreVerification");
420
+ return "continue" as const;
421
+ },
422
+ runPostUnitVerification: async () => {
423
+ callLog.push("runPostUnitVerification");
424
+ return "continue" as const;
425
+ },
426
+ postUnitPostVerification: async () => {
427
+ callLog.push("postUnitPostVerification");
428
+ return "continue" as const;
429
+ },
430
+ getSessionFile: () => "/tmp/session.json",
431
+ };
432
+
433
+ const merged = { ...baseDeps, ...overrides, callLog };
434
+ return merged;
435
+ }
436
+
437
+ /**
438
+ * Build a mock session for autoLoop testing — needs more fields than the
439
+ * runUnit mock (dispatch counters, milestone state, etc.).
440
+ */
441
+ function makeLoopSession(overrides?: Partial<Record<string, unknown>>) {
442
+ return {
443
+ active: true,
444
+ verbose: false,
445
+ stepMode: false,
446
+ paused: false,
447
+ basePath: "/tmp/project",
448
+ originalBasePath: "",
449
+ currentMilestoneId: "M001",
450
+ currentUnit: null,
451
+ currentUnitRouting: null,
452
+ completedUnits: [],
453
+ resourceVersionOnStart: null,
454
+ lastPromptCharCount: undefined,
455
+ lastBaselineCharCount: undefined,
456
+ lastBudgetAlertLevel: 0,
457
+ pendingVerificationRetry: null,
458
+ pendingCrashRecovery: null,
459
+ pendingQuickTasks: [],
460
+ sidecarQueue: [],
461
+ autoModeStartModel: null,
462
+ pendingResolve: null,
463
+ pendingAgentEndQueue: [],
464
+ unitDispatchCount: new Map<string, number>(),
465
+ unitLifetimeDispatches: new Map<string, number>(),
466
+ unitRecoveryCount: new Map<string, number>(),
467
+ verificationRetryCount: new Map<string, number>(),
468
+ gitService: null,
469
+ autoStartTime: Date.now(),
470
+ cmdCtx: {
471
+ newSession: () => Promise.resolve({ cancelled: false }),
472
+ getContextUsage: () => ({ percent: 10, tokens: 1000, limit: 10000 }),
473
+ },
474
+ clearTimers: () => {},
475
+ ...overrides,
476
+ } as any;
477
+ }
478
+
479
+ test("autoLoop exits when s.active is set to false", async (t) => {
480
+ _resetPendingResolve();
481
+
482
+ const ctx = makeMockCtx();
483
+ ctx.ui.setStatus = () => {};
484
+ const pi = makeMockPi();
485
+ const s = makeLoopSession({ active: false });
486
+
487
+ const deps = makeMockDeps();
488
+ await autoLoop(ctx, pi, s, deps);
489
+
490
+ // Loop body should not have executed (deriveState never called)
491
+ assert.ok(
492
+ !deps.callLog.includes("deriveState"),
493
+ "loop should not have iterated",
494
+ );
495
+ });
496
+
497
+ test("autoLoop exits on terminal complete state", async (t) => {
498
+ _resetPendingResolve();
499
+
500
+ const ctx = makeMockCtx();
501
+ ctx.ui.setStatus = () => {};
502
+ const pi = makeMockPi();
503
+ const s = makeLoopSession();
504
+
505
+ const deps = makeMockDeps({
506
+ deriveState: async () => {
507
+ deps.callLog.push("deriveState");
508
+ return {
509
+ phase: "complete",
510
+ activeMilestone: { id: "M001", title: "Test", status: "complete" },
511
+ activeSlice: null,
512
+ activeTask: null,
513
+ registry: [{ id: "M001", status: "complete" }],
514
+ blockers: [],
515
+ } as any;
516
+ },
517
+ });
518
+
519
+ await autoLoop(ctx, pi, s, deps);
520
+
521
+ assert.ok(deps.callLog.includes("deriveState"), "should have derived state");
522
+ assert.ok(
523
+ deps.callLog.includes("stopAuto"),
524
+ "should have called stopAuto for complete state",
525
+ );
526
+ // Should NOT have dispatched a unit
527
+ assert.ok(
528
+ !deps.callLog.includes("resolveDispatch"),
529
+ "should not dispatch when complete",
530
+ );
531
+ });
532
+
533
+ test("autoLoop exits on terminal blocked state", async (t) => {
534
+ _resetPendingResolve();
535
+
536
+ const ctx = makeMockCtx();
537
+ ctx.ui.setStatus = () => {};
538
+ const pi = makeMockPi();
539
+ const s = makeLoopSession();
540
+
541
+ const deps = makeMockDeps({
542
+ deriveState: async () => {
543
+ deps.callLog.push("deriveState");
544
+ return {
545
+ phase: "blocked",
546
+ activeMilestone: { id: "M001", title: "Test", status: "active" },
547
+ activeSlice: null,
548
+ activeTask: null,
549
+ registry: [{ id: "M001", status: "active" }],
550
+ blockers: ["Missing API key"],
551
+ } as any;
552
+ },
553
+ });
554
+
555
+ await autoLoop(ctx, pi, s, deps);
556
+
557
+ assert.ok(deps.callLog.includes("deriveState"), "should have derived state");
558
+ assert.ok(
559
+ deps.callLog.includes("stopAuto"),
560
+ "should have called stopAuto for blocked state",
561
+ );
562
+ assert.ok(
563
+ !deps.callLog.includes("resolveDispatch"),
564
+ "should not dispatch when blocked",
565
+ );
566
+ });
567
+
568
+ test("autoLoop calls deriveState → resolveDispatch → runUnit in sequence", async (t) => {
569
+ _resetPendingResolve();
570
+
571
+ const ctx = makeMockCtx();
572
+ ctx.ui.setStatus = () => {};
573
+ ctx.sessionManager = { getSessionFile: () => "/tmp/session.json" };
574
+ const pi = makeMockPi();
575
+
576
+ let loopCount = 0;
577
+ const s = makeLoopSession();
578
+
579
+ const deps = makeMockDeps({
580
+ deriveState: async () => {
581
+ deps.callLog.push("deriveState");
582
+ return {
583
+ phase: "executing",
584
+ activeMilestone: { id: "M001", title: "Test", status: "active" },
585
+ activeSlice: { id: "S01", title: "Slice 1" },
586
+ activeTask: { id: "T01" },
587
+ registry: [{ id: "M001", status: "active" }],
588
+ blockers: [],
589
+ } as any;
590
+ },
591
+ resolveDispatch: async () => {
592
+ deps.callLog.push("resolveDispatch");
593
+ return {
594
+ action: "dispatch" as const,
595
+ unitType: "execute-task",
596
+ unitId: "M001/S01/T01",
597
+ prompt: "do the thing",
598
+ };
599
+ },
600
+ postUnitPostVerification: async () => {
601
+ deps.callLog.push("postUnitPostVerification");
602
+ loopCount++;
603
+ // After first iteration, deactivate to exit the loop
604
+ if (loopCount >= 1) {
605
+ s.active = false;
606
+ }
607
+ return "continue" as const;
608
+ },
609
+ });
610
+
611
+ // Run autoLoop — it will call runUnit internally which creates a promise.
612
+ // We need to resolve the promise from outside via resolveAgentEnd.
613
+ const loopPromise = autoLoop(ctx, pi, s, deps);
614
+
615
+ // Give the loop time to reach runUnit's await
616
+ await new Promise((r) => setTimeout(r, 50));
617
+
618
+ // Resolve the first unit's agent_end
619
+ resolveAgentEnd(makeEvent());
620
+
621
+ await loopPromise;
622
+
623
+ // Verify the sequence: deriveState → resolveDispatch → then finalize callbacks
624
+ const deriveIdx = deps.callLog.indexOf("deriveState");
625
+ const dispatchIdx = deps.callLog.indexOf("resolveDispatch");
626
+ const preVerIdx = deps.callLog.indexOf("postUnitPreVerification");
627
+ const verIdx = deps.callLog.indexOf("runPostUnitVerification");
628
+ const postVerIdx = deps.callLog.indexOf("postUnitPostVerification");
629
+
630
+ assert.ok(deriveIdx >= 0, "deriveState should have been called");
631
+ assert.ok(
632
+ dispatchIdx > deriveIdx,
633
+ "resolveDispatch should come after deriveState",
634
+ );
635
+ assert.ok(
636
+ preVerIdx > dispatchIdx,
637
+ "postUnitPreVerification should come after resolveDispatch",
638
+ );
639
+ assert.ok(
640
+ verIdx > preVerIdx,
641
+ "runPostUnitVerification should come after pre-verification",
642
+ );
643
+ assert.ok(
644
+ postVerIdx > verIdx,
645
+ "postUnitPostVerification should come after verification",
646
+ );
647
+ });
648
+
649
+ test("autoLoop handles verification retry by continuing loop", async (t) => {
650
+ _resetPendingResolve();
651
+
652
+ const ctx = makeMockCtx();
653
+ ctx.ui.setStatus = () => {};
654
+ ctx.sessionManager = { getSessionFile: () => "/tmp/session.json" };
655
+ const pi = makeMockPi();
656
+
657
+ let verifyCallCount = 0;
658
+ let deriveCallCount = 0;
659
+ const s = makeLoopSession();
660
+
661
+ const deps = makeMockDeps({
662
+ deriveState: async () => {
663
+ deriveCallCount++;
664
+ deps.callLog.push("deriveState");
665
+ return {
666
+ phase: "executing",
667
+ activeMilestone: { id: "M001", title: "Test", status: "active" },
668
+ activeSlice: { id: "S01", title: "Slice 1" },
669
+ activeTask: { id: "T01" },
670
+ registry: [{ id: "M001", status: "active" }],
671
+ blockers: [],
672
+ } as any;
673
+ },
674
+ runPostUnitVerification: async () => {
675
+ verifyCallCount++;
676
+ deps.callLog.push("runPostUnitVerification");
677
+ if (verifyCallCount === 1) {
678
+ // First call: simulate retry — set pendingVerificationRetry on session
679
+ s.pendingVerificationRetry = {
680
+ unitId: "M001/S01/T01",
681
+ failureContext: "test failed: expected X got Y",
682
+ attempt: 1,
683
+ };
684
+ return "retry" as const;
685
+ }
686
+ // Second call: pass
687
+ return "continue" as const;
688
+ },
689
+ postUnitPostVerification: async () => {
690
+ deps.callLog.push("postUnitPostVerification");
691
+ // After the retry cycle completes, deactivate
692
+ s.active = false;
693
+ return "continue" as const;
694
+ },
695
+ });
696
+
697
+ const loopPromise = autoLoop(ctx, pi, s, deps);
698
+
699
+ // First iteration: runUnit → verification returns "retry" → loop continues
700
+ await new Promise((r) => setTimeout(r, 50));
701
+ resolveAgentEnd(makeEvent()); // resolve first unit
702
+
703
+ // Second iteration: runUnit → verification returns "continue"
704
+ await new Promise((r) => setTimeout(r, 50));
705
+ resolveAgentEnd(makeEvent()); // resolve retry unit
706
+
707
+ await loopPromise;
708
+
709
+ // Verify deriveState was called twice (two iterations)
710
+ const deriveCount = deps.callLog.filter((c) => c === "deriveState").length;
711
+ assert.ok(
712
+ deriveCount >= 2,
713
+ `deriveState should be called at least 2 times (got ${deriveCount})`,
714
+ );
715
+
716
+ // Verify verification was called twice
717
+ assert.equal(
718
+ verifyCallCount,
719
+ 2,
720
+ "verification should have been called twice (once retry, once pass)",
721
+ );
722
+ });
723
+
724
+ test("autoLoop handles dispatch stop action", async (t) => {
725
+ _resetPendingResolve();
726
+
727
+ const ctx = makeMockCtx();
728
+ ctx.ui.setStatus = () => {};
729
+ const pi = makeMockPi();
730
+ const s = makeLoopSession();
731
+
732
+ const deps = makeMockDeps({
733
+ resolveDispatch: async () => {
734
+ deps.callLog.push("resolveDispatch");
735
+ return {
736
+ action: "stop" as const,
737
+ reason: "test-stop-reason",
738
+ level: "info" as const,
739
+ };
740
+ },
741
+ });
742
+
743
+ await autoLoop(ctx, pi, s, deps);
744
+
745
+ assert.ok(
746
+ deps.callLog.includes("resolveDispatch"),
747
+ "should have called resolveDispatch",
748
+ );
749
+ assert.ok(
750
+ deps.callLog.includes("stopAuto"),
751
+ "should have stopped on dispatch stop action",
752
+ );
753
+ });
754
+
755
+ test("autoLoop handles dispatch skip action by continuing", async (t) => {
756
+ _resetPendingResolve();
757
+
758
+ const ctx = makeMockCtx();
759
+ ctx.ui.setStatus = () => {};
760
+ const pi = makeMockPi();
761
+ const s = makeLoopSession();
762
+
763
+ let dispatchCallCount = 0;
764
+ const deps = makeMockDeps({
765
+ resolveDispatch: async () => {
766
+ dispatchCallCount++;
767
+ deps.callLog.push("resolveDispatch");
768
+ if (dispatchCallCount === 1) {
769
+ return { action: "skip" as const };
770
+ }
771
+ // Second time: stop to exit the loop
772
+ return {
773
+ action: "stop" as const,
774
+ reason: "done",
775
+ level: "info" as const,
776
+ };
777
+ },
778
+ });
779
+
780
+ await autoLoop(ctx, pi, s, deps);
781
+
782
+ // Should have called resolveDispatch twice (skip → re-derive → stop)
783
+ const dispatchCalls = deps.callLog.filter((c) => c === "resolveDispatch");
784
+ assert.equal(
785
+ dispatchCalls.length,
786
+ 2,
787
+ "resolveDispatch should be called twice (skip then stop)",
788
+ );
789
+ const deriveCalls = deps.callLog.filter((c) => c === "deriveState");
790
+ assert.ok(
791
+ deriveCalls.length >= 2,
792
+ "deriveState should be called at least twice (one per iteration)",
793
+ );
794
+ });
795
+
796
+ test("autoLoop drains sidecar queue after postUnitPostVerification enqueues items", async (t) => {
797
+ _resetPendingResolve();
798
+
799
+ const ctx = makeMockCtx();
800
+ ctx.ui.setStatus = () => {};
801
+ ctx.sessionManager = { getSessionFile: () => "/tmp/session.json" };
802
+ const pi = makeMockPi();
803
+ const s = makeLoopSession();
804
+
805
+ let postVerCallCount = 0;
806
+ const deps = makeMockDeps({
807
+ postUnitPostVerification: async () => {
808
+ postVerCallCount++;
809
+ deps.callLog.push("postUnitPostVerification");
810
+ if (postVerCallCount === 1) {
811
+ // First call (main unit): enqueue a sidecar item
812
+ s.sidecarQueue.push({
813
+ kind: "hook" as const,
814
+ unitType: "hook/review",
815
+ unitId: "M001/S01/T01/review",
816
+ prompt: "review the code",
817
+ });
818
+ return "continue" as const;
819
+ }
820
+ // Second call (sidecar unit completed): done
821
+ s.active = false;
822
+ return "continue" as const;
823
+ },
824
+ });
825
+
826
+ const loopPromise = autoLoop(ctx, pi, s, deps);
827
+
828
+ // Wait for main unit's runUnit to be awaiting
829
+ await new Promise((r) => setTimeout(r, 50));
830
+ resolveAgentEnd(makeEvent()); // resolve main unit
831
+
832
+ // Wait for the sidecar unit's runUnit to be awaiting
833
+ await new Promise((r) => setTimeout(r, 50));
834
+ resolveAgentEnd(makeEvent()); // resolve sidecar unit
835
+
836
+ await loopPromise;
837
+
838
+ // postUnitPostVerification should have been called twice (main + sidecar)
839
+ assert.equal(
840
+ postVerCallCount,
841
+ 2,
842
+ "postUnitPostVerification should be called twice (main + sidecar)",
843
+ );
844
+ });
845
+
846
+ test("autoLoop exits when no active milestone found", async (t) => {
847
+ _resetPendingResolve();
848
+
849
+ const ctx = makeMockCtx();
850
+ ctx.ui.setStatus = () => {};
851
+ const pi = makeMockPi();
852
+ const s = makeLoopSession({ currentMilestoneId: null });
853
+
854
+ const deps = makeMockDeps({
855
+ deriveState: async () => {
856
+ deps.callLog.push("deriveState");
857
+ return {
858
+ phase: "executing",
859
+ activeMilestone: null,
860
+ activeSlice: null,
861
+ activeTask: null,
862
+ registry: [],
863
+ blockers: [],
864
+ } as any;
865
+ },
866
+ });
867
+
868
+ await autoLoop(ctx, pi, s, deps);
869
+
870
+ assert.ok(
871
+ deps.callLog.includes("stopAuto"),
872
+ "should stop when no milestone and all complete",
873
+ );
874
+ });
875
+
876
+ test("autoLoop exports LoopDeps type", async () => {
877
+ const src = readFileSync(
878
+ resolve(import.meta.dirname, "..", "auto-loop.ts"),
879
+ "utf-8",
880
+ );
881
+ assert.ok(
882
+ src.includes("export interface LoopDeps"),
883
+ "auto-loop.ts should export LoopDeps interface",
884
+ );
885
+ });
886
+
887
+ test("autoLoop signature accepts deps parameter", async () => {
888
+ const src = readFileSync(
889
+ resolve(import.meta.dirname, "..", "auto-loop.ts"),
890
+ "utf-8",
891
+ );
892
+ assert.ok(
893
+ src.includes("deps: LoopDeps"),
894
+ "autoLoop should accept a deps: LoopDeps parameter",
895
+ );
896
+ });
897
+
898
+ test("autoLoop contains while (s.active) loop", () => {
899
+ const src = readFileSync(
900
+ resolve(import.meta.dirname, "..", "auto-loop.ts"),
901
+ "utf-8",
902
+ );
903
+ assert.ok(
904
+ src.includes("while (s.active)"),
905
+ "autoLoop should contain a while (s.active) loop",
906
+ );
907
+ });
908
+
909
+ // ── T03: End-to-end wiring structural assertions ─────────────────────────────
910
+
911
+ test("auto-loop.ts exports autoLoop, runUnit, and resolveAgentEnd", () => {
912
+ const src = readFileSync(
913
+ resolve(import.meta.dirname, "..", "auto-loop.ts"),
914
+ "utf-8",
915
+ );
916
+ assert.ok(
917
+ src.includes("export async function autoLoop"),
918
+ "must export autoLoop",
919
+ );
920
+ assert.ok(
921
+ src.includes("export async function runUnit"),
922
+ "must export runUnit",
923
+ );
924
+ assert.ok(
925
+ src.includes("export function resolveAgentEnd"),
926
+ "must export resolveAgentEnd",
927
+ );
928
+ });
929
+
930
+ test("auto.ts startAuto calls autoLoop (not dispatchNextUnit as first dispatch)", () => {
931
+ const src = readFileSync(
932
+ resolve(import.meta.dirname, "..", "auto.ts"),
933
+ "utf-8",
934
+ );
935
+ // Find the startAuto function body
936
+ const fnIdx = src.indexOf("export async function startAuto");
937
+ assert.ok(fnIdx > -1, "startAuto must exist in auto.ts");
938
+ const fnEnd = src.indexOf("\n// ─── ", fnIdx + 100);
939
+ const fnBlock =
940
+ fnEnd > -1 ? src.slice(fnIdx, fnEnd) : src.slice(fnIdx, fnIdx + 5000);
941
+ assert.ok(
942
+ fnBlock.includes("autoLoop("),
943
+ "startAuto must call autoLoop() instead of dispatchNextUnit()",
944
+ );
945
+ });
946
+
947
+ test("index.ts agent_end handler calls resolveAgentEnd (not handleAgentEnd)", () => {
948
+ const src = readFileSync(
949
+ resolve(import.meta.dirname, "..", "index.ts"),
950
+ "utf-8",
951
+ );
952
+ // Find the agent_end handler success path
953
+ const handlerIdx = src.indexOf('pi.on("agent_end"');
954
+ assert.ok(handlerIdx > -1, "index.ts must have an agent_end handler");
955
+ const handlerBlock = src.slice(handlerIdx, handlerIdx + 10000);
956
+ assert.ok(
957
+ handlerBlock.includes("resolveAgentEnd(event)"),
958
+ "agent_end success path must call resolveAgentEnd(event) instead of handleAgentEnd(ctx, pi)",
959
+ );
960
+ assert.ok(
961
+ handlerBlock.includes("isSessionSwitchInFlight()"),
962
+ "agent_end handler must ignore session-switch agent_end events from cmdCtx.newSession()",
963
+ );
964
+ });
965
+
966
+ test("auto-verification.ts runPostUnitVerification does not take dispatchNextUnit callback", () => {
967
+ const src = readFileSync(
968
+ resolve(import.meta.dirname, "..", "auto-verification.ts"),
969
+ "utf-8",
970
+ );
971
+ const fnIdx = src.indexOf("export async function runPostUnitVerification");
972
+ assert.ok(fnIdx > -1, "runPostUnitVerification must exist");
973
+ const sigEnd = src.indexOf("): Promise<VerificationResult>", fnIdx);
974
+ const signature = src.slice(fnIdx, sigEnd);
975
+ assert.ok(
976
+ !signature.includes("dispatchNextUnit"),
977
+ "runPostUnitVerification must not take a dispatchNextUnit callback parameter",
978
+ );
979
+ assert.ok(
980
+ !signature.includes("startDispatchGapWatchdog"),
981
+ "runPostUnitVerification must not take a startDispatchGapWatchdog callback parameter",
982
+ );
983
+ });
984
+
985
+ test("auto-timeout-recovery.ts calls resolveAgentEnd instead of dispatchNextUnit", () => {
986
+ const src = readFileSync(
987
+ resolve(import.meta.dirname, "..", "auto-timeout-recovery.ts"),
988
+ "utf-8",
989
+ );
990
+ assert.ok(
991
+ !src.includes("await dispatchNextUnit"),
992
+ "auto-timeout-recovery.ts must not call dispatchNextUnit",
993
+ );
994
+ assert.ok(
995
+ src.includes("resolveAgentEnd("),
996
+ "auto-timeout-recovery.ts must call resolveAgentEnd to re-iterate the loop on timeout recovery",
997
+ );
998
+ });
999
+
1000
+ test("handleAgentEnd in auto.ts is a thin wrapper calling resolveAgentEnd", () => {
1001
+ const src = readFileSync(
1002
+ resolve(import.meta.dirname, "..", "auto.ts"),
1003
+ "utf-8",
1004
+ );
1005
+ const fnIdx = src.indexOf("export async function handleAgentEnd");
1006
+ assert.ok(fnIdx > -1, "handleAgentEnd must exist");
1007
+ const fnEnd = src.indexOf("\n// ─── ", fnIdx + 100);
1008
+ const fnBlock =
1009
+ fnEnd > -1 ? src.slice(fnIdx, fnEnd) : src.slice(fnIdx, fnIdx + 1000);
1010
+ assert.ok(
1011
+ fnBlock.includes("resolveAgentEnd("),
1012
+ "handleAgentEnd must call resolveAgentEnd",
1013
+ );
1014
+ // The function should be short — no reentrancy guard, no verification, no dispatch
1015
+ assert.ok(
1016
+ !fnBlock.includes("dispatchNextUnit"),
1017
+ "handleAgentEnd must not call dispatchNextUnit (it's now a thin wrapper)",
1018
+ );
1019
+ assert.ok(
1020
+ !fnBlock.includes("postUnitPreVerification") &&
1021
+ !fnBlock.includes("postUnitPostVerification"),
1022
+ "handleAgentEnd must not contain verification logic (moved to autoLoop)",
1023
+ );
1024
+ });
1025
+
1026
+ // ── Stuck counter tests ──────────────────────────────────────────────────────
1027
+
1028
+ test("stuck counter: stops when deriveState returns same unit 5 consecutive times", async () => {
1029
+ _resetPendingResolve();
1030
+
1031
+ const ctx = makeMockCtx();
1032
+ ctx.ui.setStatus = () => {};
1033
+ ctx.ui.notify = () => {};
1034
+ const pi = makeMockPi();
1035
+ const s = makeLoopSession();
1036
+
1037
+ let stopReason = "";
1038
+ const deps = makeMockDeps({
1039
+ deriveState: async () =>
1040
+ ({
1041
+ phase: "executing",
1042
+ activeMilestone: { id: "M001", title: "Test", status: "active" },
1043
+ activeSlice: { id: "S01", title: "Slice 1" },
1044
+ activeTask: { id: "T01" },
1045
+ registry: [{ id: "M001", status: "active" }],
1046
+ blockers: [],
1047
+ }) as any,
1048
+ resolveDispatch: async () => ({
1049
+ action: "dispatch" as const,
1050
+ unitType: "execute-task",
1051
+ unitId: "M001/S01/T01",
1052
+ prompt: "do the thing",
1053
+ }),
1054
+ stopAuto: async (_ctx?: any, _pi?: any, reason?: string) => {
1055
+ deps.callLog.push("stopAuto");
1056
+ stopReason = reason ?? "";
1057
+ s.active = false;
1058
+ },
1059
+ });
1060
+
1061
+ const loopPromise = autoLoop(ctx, pi, s, deps);
1062
+
1063
+ // The loop will dispatch the same unit each iteration. On iteration 1, sameUnitCount
1064
+ // starts at 0 and the unit key is set. On iterations 2-5, sameUnitCount increments.
1065
+ // At sameUnitCount=5 (iteration 6), stopAuto is called.
1066
+ // Each iteration requires resolving an agent_end event.
1067
+ // But the stuck counter fires BEFORE runUnit, so we only need to resolve 4 times
1068
+ // (iterations 1-4 each run a unit, iteration 5 increments to 5 and stops).
1069
+
1070
+ // Actually: iteration 1 sets lastDerivedUnit (sameUnitCount=0).
1071
+ // Iteration 2: derivedKey === lastDerivedUnit → sameUnitCount=1.
1072
+ // Iteration 3: sameUnitCount=2. Iteration 4: sameUnitCount=3.
1073
+ // Iteration 5: sameUnitCount=4. Iteration 6: sameUnitCount=5 → stop.
1074
+ // So we need to resolve 5 agent_end events (iterations 1-5 each run a unit).
1075
+
1076
+ for (let i = 0; i < 5; i++) {
1077
+ await new Promise((r) => setTimeout(r, 30));
1078
+ resolveAgentEnd(makeEvent());
1079
+ }
1080
+
1081
+ await loopPromise;
1082
+
1083
+ assert.ok(
1084
+ deps.callLog.includes("stopAuto"),
1085
+ "stopAuto should have been called",
1086
+ );
1087
+ assert.ok(
1088
+ stopReason.includes("Stuck"),
1089
+ `stop reason should mention 'Stuck', got: ${stopReason}`,
1090
+ );
1091
+ assert.ok(
1092
+ stopReason.includes("execute-task"),
1093
+ "stop reason should include unitType",
1094
+ );
1095
+ assert.ok(
1096
+ stopReason.includes("M001/S01/T01"),
1097
+ "stop reason should include unitId",
1098
+ );
1099
+ });
1100
+
1101
+ test("stuck counter: resets when deriveState returns a different unit", async () => {
1102
+ _resetPendingResolve();
1103
+
1104
+ const ctx = makeMockCtx();
1105
+ ctx.ui.setStatus = () => {};
1106
+ ctx.ui.notify = () => {};
1107
+ const pi = makeMockPi();
1108
+ const s = makeLoopSession();
1109
+
1110
+ let deriveCallCount = 0;
1111
+ let stopCalled = false;
1112
+
1113
+ const deps = makeMockDeps({
1114
+ deriveState: async () => {
1115
+ deriveCallCount++;
1116
+ deps.callLog.push("deriveState");
1117
+ return {
1118
+ phase: "executing",
1119
+ activeMilestone: { id: "M001", title: "Test", status: "active" },
1120
+ activeSlice: { id: "S01", title: "Slice 1" },
1121
+ activeTask: { id: deriveCallCount <= 3 ? "T01" : "T02" },
1122
+ registry: [{ id: "M001", status: "active" }],
1123
+ blockers: [],
1124
+ } as any;
1125
+ },
1126
+ resolveDispatch: async () => {
1127
+ deps.callLog.push("resolveDispatch");
1128
+ // Return dispatch matching the task from deriveState
1129
+ const taskId = deriveCallCount <= 3 ? "T01" : "T02";
1130
+ return {
1131
+ action: "dispatch" as const,
1132
+ unitType: "execute-task",
1133
+ unitId: `M001/S01/${taskId}`,
1134
+ prompt: "do the thing",
1135
+ };
1136
+ },
1137
+ stopAuto: async (_ctx?: any, _pi?: any, reason?: string) => {
1138
+ deps.callLog.push("stopAuto");
1139
+ stopCalled = true;
1140
+ s.active = false;
1141
+ },
1142
+ postUnitPostVerification: async () => {
1143
+ deps.callLog.push("postUnitPostVerification");
1144
+ // After 4th iteration (unit changed on iter 4), exit
1145
+ if (deriveCallCount >= 4) {
1146
+ s.active = false;
1147
+ }
1148
+ return "continue" as const;
1149
+ },
1150
+ });
1151
+
1152
+ const loopPromise = autoLoop(ctx, pi, s, deps);
1153
+
1154
+ // Resolve agent_end for iterations 1-4
1155
+ for (let i = 0; i < 4; i++) {
1156
+ await new Promise((r) => setTimeout(r, 30));
1157
+ resolveAgentEnd(makeEvent());
1158
+ }
1159
+
1160
+ await loopPromise;
1161
+
1162
+ // The counter should have reset when T02 was derived — no stuck stop
1163
+ assert.ok(
1164
+ !stopCalled,
1165
+ "stopAuto should NOT have been called — counter reset on unit change",
1166
+ );
1167
+ assert.ok(
1168
+ deriveCallCount >= 4,
1169
+ `deriveState should have been called at least 4 times (got ${deriveCallCount})`,
1170
+ );
1171
+ });
1172
+
1173
+ test("stuck counter: does not increment during verification retry", async () => {
1174
+ _resetPendingResolve();
1175
+
1176
+ const ctx = makeMockCtx();
1177
+ ctx.ui.setStatus = () => {};
1178
+ ctx.ui.notify = () => {};
1179
+ const pi = makeMockPi();
1180
+ const s = makeLoopSession();
1181
+
1182
+ let verifyCallCount = 0;
1183
+ let stopReason = "";
1184
+
1185
+ const deps = makeMockDeps({
1186
+ deriveState: async () =>
1187
+ ({
1188
+ phase: "executing",
1189
+ activeMilestone: { id: "M001", title: "Test", status: "active" },
1190
+ activeSlice: { id: "S01", title: "Slice 1" },
1191
+ activeTask: { id: "T01" },
1192
+ registry: [{ id: "M001", status: "active" }],
1193
+ blockers: [],
1194
+ }) as any,
1195
+ resolveDispatch: async () => ({
1196
+ action: "dispatch" as const,
1197
+ unitType: "execute-task",
1198
+ unitId: "M001/S01/T01",
1199
+ prompt: "do the thing",
1200
+ }),
1201
+ runPostUnitVerification: async () => {
1202
+ verifyCallCount++;
1203
+ deps.callLog.push("runPostUnitVerification");
1204
+ if (verifyCallCount <= 3) {
1205
+ // Set pendingVerificationRetry — should prevent stuck counter increment
1206
+ s.pendingVerificationRetry = {
1207
+ unitId: "M001/S01/T01",
1208
+ failureContext: "test failed",
1209
+ attempt: verifyCallCount,
1210
+ };
1211
+ return "retry" as const;
1212
+ }
1213
+ // After 3 retries, exit gracefully
1214
+ s.active = false;
1215
+ return "continue" as const;
1216
+ },
1217
+ stopAuto: async (_ctx?: any, _pi?: any, reason?: string) => {
1218
+ deps.callLog.push("stopAuto");
1219
+ stopReason = reason ?? "";
1220
+ s.active = false;
1221
+ },
1222
+ });
1223
+
1224
+ const loopPromise = autoLoop(ctx, pi, s, deps);
1225
+
1226
+ // Resolve agent_end for 4 iterations (1 initial + 3 retries)
1227
+ for (let i = 0; i < 4; i++) {
1228
+ await new Promise((r) => setTimeout(r, 30));
1229
+ resolveAgentEnd(makeEvent());
1230
+ }
1231
+
1232
+ await loopPromise;
1233
+
1234
+ // Even though same unit was derived 4 times, verification retries should
1235
+ // not count, so stuck counter should not have fired
1236
+ assert.ok(
1237
+ !stopReason.includes("Stuck"),
1238
+ `stuck counter should not fire during verification retries, got: ${stopReason}`,
1239
+ );
1240
+ assert.equal(
1241
+ verifyCallCount,
1242
+ 4,
1243
+ "verification should have been called 4 times (1 initial + 3 retries)",
1244
+ );
1245
+ });
1246
+
1247
+ test("stuck counter: logs debug output with stuck-detected phase", () => {
1248
+ // Structural test: verify the auto-loop.ts source contains both
1249
+ // stuck-detected and stuck-counter-reset debug log phases
1250
+ const src = readFileSync(
1251
+ resolve(import.meta.dirname, "..", "auto-loop.ts"),
1252
+ "utf-8",
1253
+ );
1254
+ assert.ok(
1255
+ src.includes('"stuck-detected"'),
1256
+ "auto-loop.ts must log phase: 'stuck-detected' when stuck counter fires",
1257
+ );
1258
+ assert.ok(
1259
+ src.includes('"stuck-counter-reset"'),
1260
+ "auto-loop.ts must log phase: 'stuck-counter-reset' when counter resets on new unit",
1261
+ );
1262
+ assert.ok(
1263
+ src.includes("sameUnitCount"),
1264
+ "auto-loop.ts must track sameUnitCount for stuck detection",
1265
+ );
1266
+ });
1267
+
1268
+ // ── Lifecycle test (S05/T02) ─────────────────────────────────────────────────
1269
+
1270
+ test("autoLoop lifecycle: advances through research → plan → execute → verify → complete across iterations", async () => {
1271
+ _resetPendingResolve();
1272
+
1273
+ const ctx = makeMockCtx();
1274
+ ctx.ui.setStatus = () => {};
1275
+ ctx.ui.notify = () => {};
1276
+ ctx.sessionManager = { getSessionFile: () => "/tmp/session.json" };
1277
+ const pi = makeMockPi();
1278
+ const s = makeLoopSession();
1279
+
1280
+ let deriveCallCount = 0;
1281
+ let dispatchCallCount = 0;
1282
+ const dispatchedUnitTypes: string[] = [];
1283
+
1284
+ // Phase sequence: each deriveState call returns a different phase.
1285
+ // On the 6th call (start of iteration 6), we deactivate to exit.
1286
+ const phases = [
1287
+ // Call 1: researching → dispatches research-slice
1288
+ {
1289
+ phase: "researching",
1290
+ activeSlice: { id: "S01", title: "Research Slice" },
1291
+ activeTask: null,
1292
+ },
1293
+ // Call 2: planning → dispatches plan-slice
1294
+ {
1295
+ phase: "planning",
1296
+ activeSlice: { id: "S01", title: "Plan Slice" },
1297
+ activeTask: null,
1298
+ },
1299
+ // Call 3: executing → dispatches execute-task
1300
+ {
1301
+ phase: "executing",
1302
+ activeSlice: { id: "S01", title: "Execute Slice" },
1303
+ activeTask: { id: "T01" },
1304
+ },
1305
+ // Call 4: verifying → dispatches verify-slice
1306
+ {
1307
+ phase: "verifying",
1308
+ activeSlice: { id: "S01", title: "Verify Slice" },
1309
+ activeTask: null,
1310
+ },
1311
+ // Call 5: completing → dispatches complete-slice
1312
+ {
1313
+ phase: "completing",
1314
+ activeSlice: { id: "S01", title: "Complete Slice" },
1315
+ activeTask: null,
1316
+ },
1317
+ ];
1318
+
1319
+ const dispatches = [
1320
+ { unitType: "research-slice", unitId: "M001/S01", prompt: "research" },
1321
+ { unitType: "plan-slice", unitId: "M001/S01", prompt: "plan" },
1322
+ { unitType: "execute-task", unitId: "M001/S01/T01", prompt: "execute" },
1323
+ { unitType: "verify-slice", unitId: "M001/S01", prompt: "verify" },
1324
+ { unitType: "complete-slice", unitId: "M001/S01", prompt: "complete" },
1325
+ ];
1326
+
1327
+ const deps = makeMockDeps({
1328
+ deriveState: async () => {
1329
+ deriveCallCount++;
1330
+ deps.callLog.push("deriveState");
1331
+
1332
+ if (deriveCallCount > phases.length) {
1333
+ // 6th+ call: deactivate to exit the loop
1334
+ s.active = false;
1335
+ return {
1336
+ phase: "complete",
1337
+ activeMilestone: { id: "M001", title: "Test", status: "complete" },
1338
+ activeSlice: null,
1339
+ activeTask: null,
1340
+ registry: [{ id: "M001", status: "complete" }],
1341
+ blockers: [],
1342
+ } as any;
1343
+ }
1344
+
1345
+ const p = phases[deriveCallCount - 1];
1346
+ return {
1347
+ phase: p.phase,
1348
+ activeMilestone: { id: "M001", title: "Test", status: "active" },
1349
+ activeSlice: p.activeSlice,
1350
+ activeTask: p.activeTask,
1351
+ registry: [{ id: "M001", status: "active" }],
1352
+ blockers: [],
1353
+ } as any;
1354
+ },
1355
+ resolveDispatch: async () => {
1356
+ dispatchCallCount++;
1357
+ deps.callLog.push("resolveDispatch");
1358
+
1359
+ if (dispatchCallCount > dispatches.length) {
1360
+ // Safety: shouldn't reach here, but stop if it does
1361
+ return {
1362
+ action: "stop" as const,
1363
+ reason: "done",
1364
+ level: "info" as const,
1365
+ };
1366
+ }
1367
+
1368
+ const d = dispatches[dispatchCallCount - 1];
1369
+ dispatchedUnitTypes.push(d.unitType);
1370
+ return {
1371
+ action: "dispatch" as const,
1372
+ unitType: d.unitType,
1373
+ unitId: d.unitId,
1374
+ prompt: d.prompt,
1375
+ };
1376
+ },
1377
+ postUnitPostVerification: async () => {
1378
+ deps.callLog.push("postUnitPostVerification");
1379
+ return "continue" as const;
1380
+ },
1381
+ });
1382
+
1383
+ const loopPromise = autoLoop(ctx, pi, s, deps);
1384
+
1385
+ // Resolve each iteration's agent_end — 5 iterations, each dispatches a unit
1386
+ for (let i = 0; i < 5; i++) {
1387
+ await new Promise((r) => setTimeout(r, 30));
1388
+ resolveAgentEnd(makeEvent());
1389
+ }
1390
+
1391
+ await loopPromise;
1392
+
1393
+ // Assert deriveState was called at least 5 times (once per iteration)
1394
+ assert.ok(
1395
+ deriveCallCount >= 5,
1396
+ `deriveState should be called at least 5 times (got ${deriveCallCount})`,
1397
+ );
1398
+
1399
+ // Assert the dispatched unit types cover the full lifecycle sequence
1400
+ assert.ok(
1401
+ dispatchedUnitTypes.includes("research-slice"),
1402
+ `should have dispatched research-slice, got: ${dispatchedUnitTypes.join(", ")}`,
1403
+ );
1404
+ assert.ok(
1405
+ dispatchedUnitTypes.includes("plan-slice"),
1406
+ `should have dispatched plan-slice, got: ${dispatchedUnitTypes.join(", ")}`,
1407
+ );
1408
+ assert.ok(
1409
+ dispatchedUnitTypes.includes("execute-task"),
1410
+ `should have dispatched execute-task, got: ${dispatchedUnitTypes.join(", ")}`,
1411
+ );
1412
+ assert.ok(
1413
+ dispatchedUnitTypes.includes("verify-slice"),
1414
+ `should have dispatched verify-slice, got: ${dispatchedUnitTypes.join(", ")}`,
1415
+ );
1416
+ assert.ok(
1417
+ dispatchedUnitTypes.includes("complete-slice"),
1418
+ `should have dispatched complete-slice, got: ${dispatchedUnitTypes.join(", ")}`,
1419
+ );
1420
+
1421
+ // Assert call sequence: deriveState and resolveDispatch entries are interleaved
1422
+ const deriveEntries = deps.callLog.filter((c) => c === "deriveState");
1423
+ const dispatchEntries = deps.callLog.filter((c) => c === "resolveDispatch");
1424
+ assert.ok(
1425
+ deriveEntries.length >= 5,
1426
+ `callLog should have at least 5 deriveState entries (got ${deriveEntries.length})`,
1427
+ );
1428
+ assert.ok(
1429
+ dispatchEntries.length >= 5,
1430
+ `callLog should have at least 5 resolveDispatch entries (got ${dispatchEntries.length})`,
1431
+ );
1432
+
1433
+ // Verify interleaving: each resolveDispatch should follow a deriveState
1434
+ let dispatchSeen = 0;
1435
+ for (const entry of deps.callLog) {
1436
+ if (entry === "resolveDispatch") {
1437
+ dispatchSeen++;
1438
+ }
1439
+ if (entry === "deriveState" && dispatchSeen > 0) {
1440
+ // A deriveState after a resolveDispatch confirms the loop advanced
1441
+ break;
1442
+ }
1443
+ }
1444
+ assert.ok(dispatchSeen > 0, "resolveDispatch should appear in callLog");
1445
+
1446
+ // Assert the exact sequence of dispatched unit types
1447
+ assert.deepEqual(
1448
+ dispatchedUnitTypes,
1449
+ [
1450
+ "research-slice",
1451
+ "plan-slice",
1452
+ "execute-task",
1453
+ "verify-slice",
1454
+ "complete-slice",
1455
+ ],
1456
+ "dispatched unit types should follow the full lifecycle sequence",
1457
+ );
1458
+ });