gsd-pi 2.75.0-dev.063e5a3 → 2.75.0-dev.fd2382b9f

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 (606) hide show
  1. package/README.md +186 -149
  2. package/dist/claude-cli-check.d.ts +10 -0
  3. package/dist/claude-cli-check.js +13 -3
  4. package/dist/headless-events.d.ts +1 -1
  5. package/dist/headless-events.js +5 -2
  6. package/dist/headless.js +5 -6
  7. package/dist/loader.js +0 -0
  8. package/dist/onboarding.js +39 -14
  9. package/dist/resources/extensions/ask-user-questions.js +17 -5
  10. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  11. package/dist/resources/extensions/claude-code-cli/readiness.js +12 -2
  12. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +76 -4
  13. package/dist/resources/extensions/gsd/auto/detect-stuck.js +9 -0
  14. package/dist/resources/extensions/gsd/auto/loop.js +67 -4
  15. package/dist/resources/extensions/gsd/auto/phases.js +70 -47
  16. package/dist/resources/extensions/gsd/auto/resolve.js +1 -1
  17. package/dist/resources/extensions/gsd/auto/run-unit.js +10 -1
  18. package/dist/resources/extensions/gsd/auto/session.js +5 -0
  19. package/dist/resources/extensions/gsd/auto-artifact-paths.js +20 -0
  20. package/dist/resources/extensions/gsd/auto-dashboard.js +15 -7
  21. package/dist/resources/extensions/gsd/auto-dispatch.js +112 -6
  22. package/dist/resources/extensions/gsd/auto-loop.js +1 -1
  23. package/dist/resources/extensions/gsd/auto-model-selection.js +10 -2
  24. package/dist/resources/extensions/gsd/auto-post-unit.js +9 -7
  25. package/dist/resources/extensions/gsd/auto-prompts.js +151 -37
  26. package/dist/resources/extensions/gsd/auto-recovery.js +57 -0
  27. package/dist/resources/extensions/gsd/auto-start.js +5 -3
  28. package/dist/resources/extensions/gsd/auto-verification.js +3 -3
  29. package/dist/resources/extensions/gsd/auto-worktree.js +55 -1
  30. package/dist/resources/extensions/gsd/auto.js +50 -25
  31. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +8 -21
  32. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +22 -4
  33. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -0
  35. package/dist/resources/extensions/gsd/commands/catalog.js +67 -3
  36. package/dist/resources/extensions/gsd/commands/handlers/core.js +6 -0
  37. package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
  38. package/dist/resources/extensions/gsd/commands/handlers/ops.js +16 -0
  39. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +228 -29
  40. package/dist/resources/extensions/gsd/commands-cmux.js +5 -2
  41. package/dist/resources/extensions/gsd/commands-debug.js +388 -0
  42. package/dist/resources/extensions/gsd/commands-do.js +1 -0
  43. package/dist/resources/extensions/gsd/commands-handlers.js +21 -2
  44. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
  45. package/dist/resources/extensions/gsd/commands-scan.js +94 -0
  46. package/dist/resources/extensions/gsd/commands-workflow-templates.js +101 -2
  47. package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
  48. package/dist/resources/extensions/gsd/db-writer.js +1 -0
  49. package/dist/resources/extensions/gsd/debug-session-store.js +238 -0
  50. package/dist/resources/extensions/gsd/definition-loader.js +7 -0
  51. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -9
  52. package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
  53. package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
  54. package/dist/resources/extensions/gsd/doctor-providers.js +48 -20
  55. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +22 -4
  56. package/dist/resources/extensions/gsd/doctor.js +7 -1
  57. package/dist/resources/extensions/gsd/error-classifier.js +6 -3
  58. package/dist/resources/extensions/gsd/escalation.js +321 -0
  59. package/dist/resources/extensions/gsd/forensics.js +26 -29
  60. package/dist/resources/extensions/gsd/git-service.js +0 -1
  61. package/dist/resources/extensions/gsd/graph.js +26 -2
  62. package/dist/resources/extensions/gsd/gsd-db.js +254 -29
  63. package/dist/resources/extensions/gsd/health-widget-core.js +42 -14
  64. package/dist/resources/extensions/gsd/health-widget.js +7 -4
  65. package/dist/resources/extensions/gsd/metrics.js +1 -0
  66. package/dist/resources/extensions/gsd/model-cost-table.js +3 -1
  67. package/dist/resources/extensions/gsd/model-router.js +7 -1
  68. package/dist/resources/extensions/gsd/native-git-bridge.js +137 -5
  69. package/dist/resources/extensions/gsd/notification-widget.js +24 -39
  70. package/dist/resources/extensions/gsd/notifications.js +4 -0
  71. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
  72. package/dist/resources/extensions/gsd/pre-execution-checks.js +97 -4
  73. package/dist/resources/extensions/gsd/preferences-models.js +1 -0
  74. package/dist/resources/extensions/gsd/preferences-types.js +2 -1
  75. package/dist/resources/extensions/gsd/preferences-validation.js +42 -8
  76. package/dist/resources/extensions/gsd/preferences.js +10 -10
  77. package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
  78. package/dist/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  79. package/dist/resources/extensions/gsd/prompts/execute-task.md +12 -0
  80. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  81. package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  82. package/dist/resources/extensions/gsd/prompts/scan.md +79 -0
  83. package/dist/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  84. package/dist/resources/extensions/gsd/run-manager.js +37 -17
  85. package/dist/resources/extensions/gsd/state.js +47 -3
  86. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  87. package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
  88. package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -12
  89. package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
  90. package/dist/resources/extensions/gsd/uok/flags.js +7 -7
  91. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  92. package/dist/resources/extensions/gsd/workflow-dispatch.js +64 -0
  93. package/dist/resources/extensions/gsd/workflow-install.js +327 -0
  94. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
  95. package/dist/resources/extensions/gsd/workflow-mcp.js +1 -6
  96. package/dist/resources/extensions/gsd/workflow-plugins.js +346 -0
  97. package/dist/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  98. package/dist/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  99. package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  100. package/dist/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  101. package/dist/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  102. package/dist/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  103. package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  104. package/dist/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  105. package/dist/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  106. package/dist/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  107. package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  108. package/dist/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  109. package/dist/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  110. package/dist/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  111. package/dist/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  112. package/dist/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  113. package/dist/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  114. package/dist/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  115. package/dist/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  116. package/dist/resources/extensions/gsd/workflow-templates/release.md +118 -0
  117. package/dist/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  118. package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  119. package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  120. package/dist/resources/extensions/gsd/workflow-templates/spike.md +1 -0
  121. package/dist/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  122. package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
  123. package/dist/resources/extensions/remote-questions/commands.js +380 -0
  124. package/dist/resources/extensions/remote-questions/manager.js +39 -5
  125. package/dist/resources/extensions/remote-questions/telegram-adapter.js +79 -4
  126. package/dist/resources/extensions/shared/interview-ui.js +189 -1
  127. package/dist/resources/extensions/shared/layout-utils.js +17 -0
  128. package/dist/resources/extensions/shared/rtk-shared.js +47 -0
  129. package/dist/resources/extensions/shared/rtk.js +3 -46
  130. package/dist/resources/skills/create-workflow/SKILL.md +33 -6
  131. package/dist/rtk-shared.d.ts +10 -0
  132. package/dist/rtk-shared.js +47 -0
  133. package/dist/rtk.d.ts +2 -6
  134. package/dist/rtk.js +3 -48
  135. package/dist/shared/workspace-types.d.ts +52 -0
  136. package/dist/shared/workspace-types.js +1 -0
  137. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  138. package/dist/update-check.d.ts +10 -0
  139. package/dist/update-check.js +24 -3
  140. package/dist/web/standalone/.next/BUILD_ID +1 -1
  141. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  142. package/dist/web/standalone/.next/build-manifest.json +3 -3
  143. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  144. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  145. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  147. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  153. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  154. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  156. package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
  157. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  158. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  159. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  160. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  161. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  163. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/index.html +1 -1
  166. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  167. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  169. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  171. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  172. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  174. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  175. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  177. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  179. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  180. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  181. package/dist/web/standalone/.next/static/chunks/2826.02df9631042cc18e.js +9 -0
  182. package/dist/web/standalone/.next/static/chunks/{webpack-b868033a5834586d.js → webpack-6c7cda3e318eedb6.js} +1 -1
  183. package/dist/web/standalone/.next/static/css/3e9cdadb4d23b8a4.css +1 -0
  184. package/dist/welcome-screen.js +48 -24
  185. package/dist/wizard.js +2 -2
  186. package/dist/worktree-cli.d.ts +6 -5
  187. package/dist/worktree-cli.js +23 -7
  188. package/package.json +3 -3
  189. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  190. package/packages/native/tsconfig.tsbuildinfo +1 -1
  191. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  192. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  193. package/packages/pi-ai/dist/models/capability-patches.js +3 -2
  194. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  195. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +68 -0
  196. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -1
  197. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +68 -0
  198. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -1
  199. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +17 -0
  200. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -1
  201. package/packages/pi-ai/dist/models/generated/anthropic.js +17 -0
  202. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -1
  203. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +17 -0
  204. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -1
  205. package/packages/pi-ai/dist/models/generated/google-antigravity.js +17 -0
  206. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -1
  207. package/packages/pi-ai/dist/models/generated/groq.d.ts +0 -153
  208. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -1
  209. package/packages/pi-ai/dist/models/generated/groq.js +0 -153
  210. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -1
  211. package/packages/pi-ai/dist/models/generated/index.d.ts +136 -153
  212. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  213. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  214. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  215. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  216. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  217. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +17 -0
  218. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -1
  219. package/packages/pi-ai/dist/models/generated/openrouter.js +17 -0
  220. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -1
  221. package/packages/pi-ai/dist/models.generated.test.js +17 -0
  222. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  223. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts +22 -1
  224. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  225. package/packages/pi-ai/dist/providers/amazon-bedrock.js +40 -6
  226. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  227. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts +2 -0
  228. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts.map +1 -0
  229. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js +106 -0
  230. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js.map +1 -0
  231. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +42 -1
  232. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  233. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +20 -1
  234. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  235. package/packages/pi-ai/dist/providers/anthropic-shared.js +32 -2
  236. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  237. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +12 -1
  238. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
  239. package/packages/pi-ai/dist/providers/anthropic.d.ts +11 -0
  240. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  241. package/packages/pi-ai/dist/providers/anthropic.js +18 -1
  242. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  243. package/packages/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  244. package/packages/pi-ai/dist/utils/oauth/openai-codex.js +12 -0
  245. package/packages/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  246. package/packages/pi-ai/package.json +1 -1
  247. package/packages/pi-ai/scripts/generate-models.ts +50 -0
  248. package/packages/pi-ai/src/models/capability-patches.ts +5 -2
  249. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +68 -0
  250. package/packages/pi-ai/src/models/generated/anthropic.ts +17 -0
  251. package/packages/pi-ai/src/models/generated/google-antigravity.ts +17 -0
  252. package/packages/pi-ai/src/models/generated/groq.ts +0 -153
  253. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  254. package/packages/pi-ai/src/models/generated/openrouter.ts +17 -0
  255. package/packages/pi-ai/src/models.generated.test.ts +17 -0
  256. package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
  257. package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -7
  258. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
  259. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +15 -1
  260. package/packages/pi-ai/src/providers/anthropic-shared.ts +36 -3
  261. package/packages/pi-ai/src/providers/anthropic.ts +19 -1
  262. package/packages/pi-ai/src/utils/oauth/openai-codex.ts +15 -0
  263. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  264. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts +2 -0
  265. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts.map +1 -0
  266. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +38 -0
  267. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -0
  268. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +14 -0
  269. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  270. package/packages/pi-coding-agent/dist/core/auth-storage.js +34 -0
  271. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +74 -0
  273. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +4 -1
  275. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +32 -0
  277. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/sdk.js +32 -0
  280. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +2 -2
  282. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +17 -7
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +48 -34
  288. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  289. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +4 -0
  290. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  291. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +83 -33
  292. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  294. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  295. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +77 -0
  296. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  297. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -66
  298. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  299. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +1 -75
  300. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  301. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +1 -1
  302. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +192 -24
  304. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  305. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +56 -0
  306. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +83 -0
  307. package/packages/pi-coding-agent/src/core/auth-storage.ts +35 -0
  308. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +4 -1
  309. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
  310. package/packages/pi-coding-agent/src/core/sdk.ts +41 -0
  311. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +2 -2
  312. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +19 -7
  313. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
  314. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +88 -36
  315. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +83 -0
  316. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +2 -83
  317. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +208 -27
  318. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  319. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  320. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  321. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  322. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  323. package/pkg/dist/modes/interactive/theme/theme-schema.js +77 -0
  324. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  325. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -66
  326. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  327. package/pkg/dist/modes/interactive/theme/theme.js +1 -75
  328. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  329. package/pkg/dist/modes/interactive/theme/themes.d.ts +1 -1
  330. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  331. package/pkg/dist/modes/interactive/theme/themes.js +192 -24
  332. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  333. package/src/resources/extensions/ask-user-questions.ts +24 -6
  334. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  335. package/src/resources/extensions/claude-code-cli/readiness.ts +13 -2
  336. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +94 -4
  337. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +84 -0
  338. package/src/resources/extensions/gsd/auto/detect-stuck.ts +10 -0
  339. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  340. package/src/resources/extensions/gsd/auto/loop.ts +109 -3
  341. package/src/resources/extensions/gsd/auto/phases.ts +94 -60
  342. package/src/resources/extensions/gsd/auto/resolve.ts +1 -1
  343. package/src/resources/extensions/gsd/auto/run-unit.ts +11 -1
  344. package/src/resources/extensions/gsd/auto/session.ts +7 -0
  345. package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
  346. package/src/resources/extensions/gsd/auto-dashboard.ts +21 -4
  347. package/src/resources/extensions/gsd/auto-dispatch.ts +123 -5
  348. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  349. package/src/resources/extensions/gsd/auto-model-selection.ts +13 -2
  350. package/src/resources/extensions/gsd/auto-post-unit.ts +9 -7
  351. package/src/resources/extensions/gsd/auto-prompts.ts +178 -38
  352. package/src/resources/extensions/gsd/auto-recovery.ts +63 -1
  353. package/src/resources/extensions/gsd/auto-start.ts +8 -6
  354. package/src/resources/extensions/gsd/auto-verification.ts +3 -3
  355. package/src/resources/extensions/gsd/auto-worktree.ts +65 -0
  356. package/src/resources/extensions/gsd/auto.ts +53 -28
  357. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -21
  358. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +22 -4
  359. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
  360. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
  361. package/src/resources/extensions/gsd/commands/catalog.ts +60 -3
  362. package/src/resources/extensions/gsd/commands/handlers/core.ts +6 -0
  363. package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
  364. package/src/resources/extensions/gsd/commands/handlers/ops.ts +16 -0
  365. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +279 -29
  366. package/src/resources/extensions/gsd/commands-cmux.ts +6 -2
  367. package/src/resources/extensions/gsd/commands-debug.ts +484 -0
  368. package/src/resources/extensions/gsd/commands-do.ts +1 -0
  369. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  370. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
  371. package/src/resources/extensions/gsd/commands-scan.ts +125 -0
  372. package/src/resources/extensions/gsd/commands-workflow-templates.ts +129 -2
  373. package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
  374. package/src/resources/extensions/gsd/db-writer.ts +3 -0
  375. package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
  376. package/src/resources/extensions/gsd/definition-loader.ts +7 -0
  377. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -9
  378. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -1
  379. package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
  380. package/src/resources/extensions/gsd/doctor-providers.ts +52 -22
  381. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +23 -4
  382. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  383. package/src/resources/extensions/gsd/doctor.ts +7 -1
  384. package/src/resources/extensions/gsd/error-classifier.ts +6 -3
  385. package/src/resources/extensions/gsd/escalation.ts +367 -0
  386. package/src/resources/extensions/gsd/forensics.ts +25 -29
  387. package/src/resources/extensions/gsd/git-service.ts +0 -1
  388. package/src/resources/extensions/gsd/graph.ts +33 -3
  389. package/src/resources/extensions/gsd/gsd-db.ts +306 -29
  390. package/src/resources/extensions/gsd/health-widget-core.ts +43 -14
  391. package/src/resources/extensions/gsd/health-widget.ts +7 -3
  392. package/src/resources/extensions/gsd/metrics.ts +1 -0
  393. package/src/resources/extensions/gsd/model-cost-table.ts +3 -1
  394. package/src/resources/extensions/gsd/model-router.ts +15 -1
  395. package/src/resources/extensions/gsd/native-git-bridge.ts +134 -6
  396. package/src/resources/extensions/gsd/notification-widget.ts +25 -43
  397. package/src/resources/extensions/gsd/notifications.ts +6 -0
  398. package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
  399. package/src/resources/extensions/gsd/pre-execution-checks.ts +98 -8
  400. package/src/resources/extensions/gsd/preferences-models.ts +1 -0
  401. package/src/resources/extensions/gsd/preferences-types.ts +10 -2
  402. package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
  403. package/src/resources/extensions/gsd/preferences.ts +10 -10
  404. package/src/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
  405. package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  406. package/src/resources/extensions/gsd/prompts/execute-task.md +12 -0
  407. package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  408. package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  409. package/src/resources/extensions/gsd/prompts/scan.md +79 -0
  410. package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  411. package/src/resources/extensions/gsd/run-manager.ts +53 -19
  412. package/src/resources/extensions/gsd/state.ts +50 -2
  413. package/src/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  414. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +1 -34
  415. package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
  416. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +45 -31
  417. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
  418. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
  419. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +39 -0
  420. package/src/resources/extensions/gsd/tests/commands-do.test.ts +48 -0
  421. package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
  422. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +8 -6
  423. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  424. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  425. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
  426. package/src/resources/extensions/gsd/tests/debug-command-handler.test.ts +905 -0
  427. package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
  428. package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
  429. package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +64 -0
  430. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +67 -0
  431. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +62 -18
  432. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
  433. package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
  434. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +29 -12
  435. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +106 -0
  436. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +74 -0
  437. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -4
  438. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -1
  439. package/src/resources/extensions/gsd/tests/health-widget.test.ts +8 -2
  440. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +39 -0
  441. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
  442. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +68 -1
  443. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +109 -11
  444. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +51 -0
  445. package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
  446. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +171 -1
  447. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  448. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  449. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +3 -2
  450. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +2 -2
  451. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  452. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
  453. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
  454. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
  455. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
  456. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +275 -6
  457. package/src/resources/extensions/gsd/tests/preferences.test.ts +69 -1
  458. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
  459. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
  460. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +27 -0
  461. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
  462. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +1 -1
  463. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +33 -0
  464. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +67 -0
  465. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +107 -0
  466. package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
  467. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
  468. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
  469. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
  470. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +15 -0
  471. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
  472. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +2 -1
  473. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +31 -1
  474. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +166 -0
  475. package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
  476. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +15 -6
  477. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  478. package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
  479. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
  480. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +8 -2
  481. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
  482. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
  483. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  484. package/src/resources/extensions/gsd/tools/plan-milestone.ts +42 -8
  485. package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
  486. package/src/resources/extensions/gsd/types.ts +62 -0
  487. package/src/resources/extensions/gsd/unit-runtime.ts +1 -0
  488. package/src/resources/extensions/gsd/uok/contracts.ts +2 -1
  489. package/src/resources/extensions/gsd/uok/flags.ts +7 -7
  490. package/src/resources/extensions/gsd/uok/kernel.ts +16 -4
  491. package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
  492. package/src/resources/extensions/gsd/workflow-install.ts +423 -0
  493. package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
  494. package/src/resources/extensions/gsd/workflow-mcp.ts +1 -6
  495. package/src/resources/extensions/gsd/workflow-plugins.ts +403 -0
  496. package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  497. package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  498. package/src/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  499. package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  500. package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  501. package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  502. package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  503. package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  504. package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  505. package/src/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  506. package/src/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  507. package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  508. package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  509. package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  510. package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  511. package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  512. package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  513. package/src/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  514. package/src/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  515. package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
  516. package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  517. package/src/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  518. package/src/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  519. package/src/resources/extensions/gsd/workflow-templates/spike.md +1 -0
  520. package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  521. package/src/resources/extensions/gsd/workflow-templates.ts +7 -0
  522. package/src/resources/extensions/gsd/workspace-index.ts +9 -4
  523. package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
  524. package/src/resources/extensions/remote-questions/commands.ts +480 -0
  525. package/src/resources/extensions/remote-questions/manager.ts +49 -4
  526. package/src/resources/extensions/remote-questions/telegram-adapter.ts +86 -4
  527. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +246 -0
  528. package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
  529. package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
  530. package/src/resources/extensions/shared/interview-ui.ts +195 -1
  531. package/src/resources/extensions/shared/layout-utils.ts +26 -0
  532. package/src/resources/extensions/shared/rtk-shared.ts +58 -0
  533. package/src/resources/extensions/shared/rtk.ts +12 -52
  534. package/src/resources/extensions/shared/tests/interview-preview.test.ts +177 -0
  535. package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
  536. package/src/resources/skills/create-workflow/SKILL.md +33 -6
  537. package/dist/web/standalone/.next/static/chunks/2826.dd3dc8bbd3025fa5.js +0 -9
  538. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
  539. package/packages/native/dist/ps/types.d.ts +0 -5
  540. package/packages/native/dist/ps/types.js +0 -2
  541. package/packages/native/src/ps/types.ts +0 -5
  542. package/packages/pi-ai/node_modules/@smithy/node-http-handler/LICENSE +0 -201
  543. package/packages/pi-ai/node_modules/@smithy/node-http-handler/README.md +0 -9
  544. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-cjs/index.js +0 -762
  545. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +0 -19
  546. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/constants.js +0 -1
  547. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js +0 -9
  548. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/index.js +0 -3
  549. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +0 -230
  550. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +0 -87
  551. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js +0 -32
  552. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +0 -169
  553. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +0 -21
  554. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +0 -88
  555. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js +0 -36
  556. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js +0 -21
  557. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js +0 -22
  558. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js +0 -23
  559. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +0 -8
  560. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js +0 -41
  561. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +0 -21
  562. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/timing.js +0 -4
  563. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +0 -63
  564. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +0 -10
  565. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/constants.d.ts +0 -5
  566. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +0 -4
  567. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/index.d.ts +0 -3
  568. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +0 -46
  569. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +0 -24
  570. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +0 -12
  571. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-handler.d.ts +0 -63
  572. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +0 -13
  573. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +0 -12
  574. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +0 -2
  575. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +0 -6
  576. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +0 -6
  577. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +0 -2
  578. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +0 -5
  579. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/index.d.ts +0 -6
  580. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +0 -13
  581. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/timing.d.ts +0 -8
  582. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +0 -10
  583. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/constants.d.ts +0 -5
  584. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +0 -4
  585. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/index.d.ts +0 -3
  586. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +0 -46
  587. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +0 -24
  588. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +0 -12
  589. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-handler.d.ts +0 -63
  590. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +0 -13
  591. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +0 -12
  592. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +0 -2
  593. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +0 -6
  594. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +0 -6
  595. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +0 -2
  596. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +0 -5
  597. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/index.d.ts +0 -6
  598. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +0 -13
  599. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/timing.d.ts +0 -8
  600. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +0 -12
  601. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +0 -12
  602. package/packages/pi-ai/node_modules/@smithy/node-http-handler/package.json +0 -68
  603. package/packages/pi-ai/oauth.d.ts +0 -1
  604. package/packages/pi-ai/oauth.js +0 -1
  605. /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → jaWw1Jh0TYayjbfOrFe8D}/_buildManifest.js +0 -0
  606. /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → jaWw1Jh0TYayjbfOrFe8D}/_ssgManifest.js +0 -0
@@ -1,6 +1,6 @@
1
1
  import { describe, test } from 'node:test';
2
2
  import assert from 'node:assert/strict';
3
- import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, symlinkSync } from "node:fs";
3
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, symlinkSync, readFileSync } from "node:fs";
4
4
  import { join, dirname } from "node:path";
5
5
  import { tmpdir } from "node:os";
6
6
  import { execSync } from "node:child_process";
@@ -1247,8 +1247,8 @@ describe('git-service', async () => {
1247
1247
 
1248
1248
  test('nativeAddAllWithExclusions: symlinked .gsd fallback', () => {
1249
1249
  // When .gsd is a symlink, git rejects `:!.gsd/...` pathspecs with
1250
- // "fatal: pathspec '...' is beyond a symbolic link". The fix falls
1251
- // back to `git add -u` (tracked files only), NOT `git add -A`.
1250
+ // "fatal: pathspec '...' is beyond a symbolic link". When `.gsd` is
1251
+ // already gitignored, the fallback should still stage untracked real files.
1252
1252
  const repo = initTempRepo();
1253
1253
 
1254
1254
  // Create the real .gsd directory outside the repo, then symlink it
@@ -1269,9 +1269,9 @@ describe('git-service', async () => {
1269
1269
  run('git commit -m "add app"', repo);
1270
1270
  writeFileSync(join(repo, "src/app.ts"), "export const x = 2;");
1271
1271
 
1272
- // Create an untracked file simulating large data (NOT in .gitignore)
1273
- // This is the key scenario: large untracked dirs that git add -A would traverse
1274
- createFile(repo, "data/large-model.bin", "pretend this is 10GB");
1272
+ // Create an untracked file that should still be staged by the fallback
1273
+ // because `.gsd` itself is already protected by .gitignore.
1274
+ createFile(repo, "src/new-feature.ts", "export const fresh = true;");
1275
1275
 
1276
1276
  // nativeAddAllWithExclusions should NOT throw despite .gsd being a symlink
1277
1277
  let threw = false;
@@ -1287,17 +1287,115 @@ describe('git-service', async () => {
1287
1287
  const staged = run("git diff --cached --name-only", repo);
1288
1288
  assert.ok(staged.includes("src/app.ts"), "modified tracked file staged despite symlinked .gsd");
1289
1289
 
1290
- // CRITICAL: untracked files must NOT be staged — the symlink fallback
1291
- // should use `git add -u` (tracked only), not `git add -A` (all files).
1292
- // Using `git add -A` on a repo with large untracked data dirs hangs. (#1977)
1293
- assert.ok(!staged.includes("data/large-model.bin"),
1294
- "symlink fallback must not stage untracked files (would hang on large repos)");
1290
+ assert.ok(staged.includes("src/new-feature.ts"),
1291
+ "symlink fallback should still stage new real files when .gsd is gitignored");
1295
1292
  assert.ok(!staged.includes(".gsd"), ".gsd content not staged");
1296
1293
 
1297
1294
  rmSync(repo, { recursive: true, force: true });
1298
1295
  rmSync(externalGsd, { recursive: true, force: true });
1299
1296
  });
1300
1297
 
1298
+ test('nativeAddAllWithExclusions: self-heals symlinked .gsd when .gitignore lacks it (#4423)', () => {
1299
+ // When `.gsd` is a symlink AND not listed in `.gitignore`, the staging
1300
+ // fallback must self-heal by appending `.gsd` to `.gitignore` and retrying
1301
+ // `git add -A`. Without this, new user files are silently dropped.
1302
+ const repo = initTempRepo();
1303
+
1304
+ const externalGsd = mkdtempSync(join(tmpdir(), "gsd-external-unignored-"));
1305
+ mkdirSync(join(externalGsd, "activity"), { recursive: true });
1306
+ writeFileSync(join(externalGsd, "activity", "log.jsonl"), "log data");
1307
+ writeFileSync(join(externalGsd, "STATE.md"), "# State");
1308
+
1309
+ symlinkSync(externalGsd, join(repo, ".gsd"));
1310
+
1311
+ createFile(repo, "src/app.ts", "export const x = 1;");
1312
+ run("git add -A", repo);
1313
+ run('git commit -m "add app"', repo);
1314
+ writeFileSync(join(repo, "src/app.ts"), "export const x = 2;");
1315
+ createFile(repo, "src/new-feature.ts", "export const fresh = true;");
1316
+
1317
+ let threw = false;
1318
+ try {
1319
+ nativeAddAllWithExclusions(repo, RUNTIME_EXCLUSION_PATHS);
1320
+ } catch (e) {
1321
+ threw = true;
1322
+ console.error(" unexpected error:", e);
1323
+ }
1324
+ assert.ok(!threw, "nativeAddAllWithExclusions does not throw with symlinked .gsd when .gsd is not gitignored");
1325
+
1326
+ const staged = run("git diff --cached --name-only", repo);
1327
+ assert.ok(staged.includes("src/app.ts"), "tracked modifications stage");
1328
+ assert.ok(
1329
+ staged.includes("src/new-feature.ts"),
1330
+ "self-heal adds .gsd to .gitignore so new user files are staged",
1331
+ );
1332
+ assert.ok(!staged.includes(".gsd"), ".gsd contents stay unstaged after self-heal");
1333
+
1334
+ // Verify the self-heal actually wrote to .gitignore
1335
+ const gitignore = readFileSync(join(repo, ".gitignore"), "utf-8");
1336
+ assert.ok(/^\.gsd\/?$/m.test(gitignore), ".gitignore contains .gsd entry after self-heal");
1337
+
1338
+ rmSync(repo, { recursive: true, force: true });
1339
+ rmSync(externalGsd, { recursive: true, force: true });
1340
+ });
1341
+
1342
+ test('nativeAddAllWithExclusions: explicit staging protects work when manage_gitignore:false (#4423)', () => {
1343
+ // When `git.manage_gitignore: false` is set in PREFERENCES.md, the
1344
+ // self-heal path is disabled. The fallback must still protect user work
1345
+ // by explicitly staging untracked real files while skipping `.gsd`.
1346
+ const repo = initTempRepo();
1347
+
1348
+ const externalGsd = mkdtempSync(join(tmpdir(), "gsd-external-optout-"));
1349
+ mkdirSync(join(externalGsd, "activity"), { recursive: true });
1350
+ writeFileSync(join(externalGsd, "activity", "log.jsonl"), "log data");
1351
+ writeFileSync(join(externalGsd, "STATE.md"), "# State");
1352
+
1353
+ symlinkSync(externalGsd, join(repo, ".gsd"));
1354
+
1355
+ // Create PREFERENCES.md inside the symlink target (the linked .gsd dir)
1356
+ // with the opt-out flag. The regex matches a top-level occurrence.
1357
+ writeFileSync(
1358
+ join(repo, ".gsd", "PREFERENCES.md"),
1359
+ "---\nversion: 1\ngit:\n manage_gitignore: false\n---\n",
1360
+ );
1361
+
1362
+ createFile(repo, "src/app.ts", "export const x = 1;");
1363
+ run("git add -A", repo);
1364
+ run('git commit -m "add app"', repo);
1365
+ writeFileSync(join(repo, "src/app.ts"), "export const x = 2;");
1366
+ createFile(repo, "src/new-feature.ts", "export const fresh = true;");
1367
+
1368
+ let threw = false;
1369
+ try {
1370
+ nativeAddAllWithExclusions(repo, RUNTIME_EXCLUSION_PATHS);
1371
+ } catch (e) {
1372
+ threw = true;
1373
+ console.error(" unexpected error:", e);
1374
+ }
1375
+ assert.ok(!threw, "nativeAddAllWithExclusions does not throw under manage_gitignore:false");
1376
+
1377
+ const staged = run("git diff --cached --name-only", repo);
1378
+ assert.ok(staged.includes("src/app.ts"), "tracked modifications stage");
1379
+ assert.ok(
1380
+ staged.includes("src/new-feature.ts"),
1381
+ "explicit staging protects new files even when self-heal is disabled",
1382
+ );
1383
+ assert.ok(!staged.includes(".gsd"), ".gsd contents stay unstaged");
1384
+
1385
+ // Self-heal must NOT have written to .gitignore
1386
+ const gitignoreExists = existsSync(join(repo, ".gitignore"));
1387
+ if (gitignoreExists) {
1388
+ const gitignore = readFileSync(join(repo, ".gitignore"), "utf-8");
1389
+ assert.ok(
1390
+ !/^\.gsd\/?$/m.test(gitignore),
1391
+ "manage_gitignore:false must prevent writes to .gitignore",
1392
+ );
1393
+ }
1394
+
1395
+ rmSync(repo, { recursive: true, force: true });
1396
+ rmSync(externalGsd, { recursive: true, force: true });
1397
+ });
1398
+
1301
1399
  // ─── nativeAddAllWithExclusions: non-symlinked .gsd still works ───────
1302
1400
 
1303
1401
  test('nativeAddAllWithExclusions: non-symlinked .gsd still works', () => {
@@ -358,6 +358,57 @@ test('writeBlockerPlaceholder: does NOT update DB for non-execute-task types', a
358
358
  }
359
359
  });
360
360
 
361
+ test('writeBlockerPlaceholder: updates execute-task plan checkbox after DB recovery (#4126)', async () => {
362
+ const base = createFixtureBase();
363
+ try {
364
+ const {
365
+ openDatabase,
366
+ closeDatabase,
367
+ insertMilestone,
368
+ insertSlice,
369
+ insertTask,
370
+ getTask,
371
+ isDbAvailable,
372
+ } = await import("../../gsd-db.ts");
373
+
374
+ const dbPath = join(base, ".gsd", "gsd.db");
375
+ const sliceDir = join(base, ".gsd", "milestones", "M001", "slices", "S01");
376
+ const tasksDir = join(sliceDir, "tasks");
377
+
378
+ mkdirSync(tasksDir, { recursive: true });
379
+ writeFileSync(join(sliceDir, "S01-PLAN.md"), [
380
+ "# S01: Test Slice",
381
+ "",
382
+ "## Tasks",
383
+ "",
384
+ "- [ ] **T01: Recoverable task** `est:5m`",
385
+ ].join("\n"));
386
+
387
+ openDatabase(dbPath);
388
+ try {
389
+ insertMilestone({ id: "M001", title: "Test", status: "active" });
390
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Slice", status: "active" });
391
+ insertTask({ id: "T01", sliceId: "S01", milestoneId: "M001", title: "Recoverable task", status: "pending" });
392
+
393
+ writeBlockerPlaceholder("execute-task", "M001/S01/T01", base, "context exhaustion recovery");
394
+
395
+ const task = getTask("M001", "S01", "T01");
396
+ assert.equal(task?.status, "complete", "execute-task recovery should still mark the DB task complete");
397
+
398
+ const planContent = readFileSync(join(sliceDir, "S01-PLAN.md"), "utf-8");
399
+ assert.match(
400
+ planContent,
401
+ /\- \[x\] \*\*T01: Recoverable task\*\*/,
402
+ "execute-task recovery should re-render the slice plan checkbox after marking the DB row complete",
403
+ );
404
+ } finally {
405
+ if (isDbAvailable()) closeDatabase();
406
+ }
407
+ } finally {
408
+ cleanup(base);
409
+ }
410
+ });
411
+
361
412
  test('writeBlockerPlaceholder: updates DB slice status for complete-slice (#2653)', async () => {
362
413
  const base = createFixtureBase();
363
414
  try {
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Test isolation utilities for integration tests.
3
+ *
4
+ * Integration tests often call `mergeMilestoneToMain` and other functions that
5
+ * load preferences. If the user's global ~/.gsd/preferences.md has
6
+ * `git.main_branch: master`, tests fail because test repos use `main`.
7
+ *
8
+ * These utilities isolate tests from the user's global environment.
9
+ */
10
+
11
+ import { mkdtempSync, rmSync, realpathSync } from "node:fs";
12
+ import { tmpdir } from "node:os";
13
+ import { join } from "node:path";
14
+
15
+ import { _resetServiceCache } from "../../worktree.ts";
16
+ import { _clearGsdRootCache } from "../../paths.ts";
17
+
18
+ let originalHome: string | undefined;
19
+ let fakeHome: string | null = null;
20
+
21
+ /**
22
+ * Isolate the test environment from user's global preferences.
23
+ * Creates a fake HOME directory so loadEffectiveGSDPreferences() returns
24
+ * empty global preferences instead of the user's ~/.gsd/preferences.md.
25
+ *
26
+ * Call this in a test.before() hook.
27
+ */
28
+ export function isolateFromGlobalPreferences(): void {
29
+ originalHome = process.env.HOME;
30
+ fakeHome = realpathSync(mkdtempSync(join(tmpdir(), "gsd-test-home-")));
31
+ process.env.HOME = fakeHome;
32
+ _clearGsdRootCache();
33
+ _resetServiceCache();
34
+ }
35
+
36
+ /**
37
+ * Restore the original HOME and clean up the fake home directory.
38
+ *
39
+ * Call this in a test.after() hook.
40
+ */
41
+ export function restoreGlobalPreferences(): void {
42
+ if (originalHome !== undefined) {
43
+ process.env.HOME = originalHome;
44
+ } else {
45
+ delete process.env.HOME;
46
+ }
47
+ _clearGsdRootCache();
48
+ _resetServiceCache();
49
+ if (fakeHome) {
50
+ rmSync(fakeHome, { recursive: true, force: true });
51
+ fakeHome = null;
52
+ }
53
+ }
@@ -10,13 +10,17 @@
10
10
  import test from "node:test";
11
11
  import assert from "node:assert/strict";
12
12
  import { randomUUID } from "node:crypto";
13
+ import { execFileSync } from "node:child_process";
14
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
15
+ import { tmpdir } from "node:os";
13
16
  import { join } from "node:path";
14
17
 
15
18
  import type { JournalEntry } from "../journal.js";
16
19
  import type { LoopDeps } from "../auto/loop-deps.js";
17
20
  import type { IterationContext, LoopState, PreDispatchData, IterationData } from "../auto/types.js";
18
21
  import type { SessionLockStatus } from "../session-lock.js";
19
- import { runDispatch, runUnitPhase, runPreDispatch } from "../auto/phases.js";
22
+ import { runDispatch, runUnitPhase, runPreDispatch, runFinalize } from "../auto/phases.js";
23
+ import { readUnitRuntimeRecord } from "../unit-runtime.js";
20
24
 
21
25
  // ─── Helpers ─────────────────────────────────────────────────────────────────
22
26
 
@@ -317,6 +321,75 @@ test("runDispatch checks prior-slice completion against the project root in work
317
321
  ]);
318
322
  });
319
323
 
324
+ test("runDispatch pauses when complete-milestone summary exists on disk but the unit is still stuck (#4289)", async (t) => {
325
+ const capture = createEventCapture();
326
+ let pauseCalls = 0;
327
+ let stopCalls = 0;
328
+ const base = join(tmpdir(), `gsd-stuck-complete-${randomUUID()}`);
329
+ t.after(() => {
330
+ rmSync(base, { recursive: true, force: true });
331
+ });
332
+
333
+ mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
334
+ mkdirSync(join(base, "src"), { recursive: true });
335
+ writeFileSync(join(base, ".gsd", "milestones", "M001", "M001-SUMMARY.md"), "# Summary\nDone.\n");
336
+ writeFileSync(join(base, "src", "app.ts"), "export const ok = true;\n");
337
+
338
+ execFileSync("git", ["init", "-b", "main"], { cwd: base, stdio: "ignore" });
339
+ execFileSync("git", ["config", "user.name", "Codex"], { cwd: base, stdio: "ignore" });
340
+ execFileSync("git", ["config", "user.email", "codex@example.com"], { cwd: base, stdio: "ignore" });
341
+ writeFileSync(join(base, "README.md"), "# test\n");
342
+ execFileSync("git", ["add", "README.md"], { cwd: base, stdio: "ignore" });
343
+ execFileSync("git", ["commit", "-m", "chore: seed"], { cwd: base, stdio: "ignore" });
344
+ execFileSync("git", ["checkout", "-b", "fix/test"], { cwd: base, stdio: "ignore" });
345
+ execFileSync("git", ["add", ".gsd/milestones/M001/M001-SUMMARY.md", "src/app.ts"], { cwd: base, stdio: "ignore" });
346
+ execFileSync("git", ["commit", "-m", "feat: summary exists but db is stale"], { cwd: base, stdio: "ignore" });
347
+
348
+ const deps = makeMockDeps(capture, {
349
+ pauseAuto: async () => { pauseCalls++; },
350
+ stopAuto: async () => { stopCalls++; },
351
+ resolveDispatch: async () => ({
352
+ action: "dispatch" as const,
353
+ unitType: "complete-milestone",
354
+ unitId: "M001",
355
+ prompt: "complete the milestone",
356
+ matchedRule: "completing-milestone-rule",
357
+ }),
358
+ });
359
+
360
+ const ic = makeIC(deps, {
361
+ s: {
362
+ ...makeSession(),
363
+ basePath: base,
364
+ currentMilestoneId: "M001",
365
+ } as any,
366
+ });
367
+ const preData: PreDispatchData = {
368
+ state: {
369
+ phase: "completing-milestone",
370
+ activeMilestone: { id: "M001", title: "Test", status: "active" },
371
+ registry: [{ id: "M001", status: "active" }],
372
+ blockers: [],
373
+ } as any,
374
+ mid: "M001",
375
+ midTitle: "Test Milestone",
376
+ };
377
+
378
+ const result = await runDispatch(ic, preData, {
379
+ recentUnits: [
380
+ { key: "complete-milestone/M001" },
381
+ { key: "complete-milestone/M001" },
382
+ ],
383
+ stuckRecoveryAttempts: 0,
384
+ consecutiveFinalizeTimeouts: 0,
385
+ });
386
+
387
+ assert.equal(result.action, "break");
388
+ assert.equal((result as any).reason, "complete-milestone-artifact-db-mismatch");
389
+ assert.equal(pauseCalls, 1, "complete-milestone disk/db mismatch should pause auto-mode");
390
+ assert.equal(stopCalls, 0, "mismatch pause should not hard-stop the loop");
391
+ });
392
+
320
393
  test("runUnitPhase emits unit-start and unit-end with causedBy reference", async () => {
321
394
  const capture = createEventCapture();
322
395
 
@@ -380,6 +453,41 @@ test("runUnitPhase emits unit-start and unit-end with causedBy reference", async
380
453
  assert.equal(endEvents[0].causedBy!.seq, startEvents[0].seq, "unit-end causedBy.seq must match unit-start.seq");
381
454
  });
382
455
 
456
+ test("runUnitPhase increments unitDispatchCount for repeated artifact-missing retries", async () => {
457
+ const capture = createEventCapture();
458
+ const { resolveAgentEnd, _resetPendingResolve } = await import("../auto-loop.js");
459
+ _resetPendingResolve();
460
+
461
+ const deps = makeMockDeps(capture);
462
+ const ic = makeIC(deps);
463
+ const iterData: IterationData = {
464
+ unitType: "execute-task",
465
+ unitId: "M001/S01/T01",
466
+ prompt: "do stuff",
467
+ finalPrompt: "do stuff",
468
+ pauseAfterUatDispatch: false,
469
+ state: { phase: "executing", activeMilestone: { id: "M001" }, activeSlice: { id: "S01" }, registry: [], blockers: [] } as any,
470
+ mid: "M001",
471
+ midTitle: "Test",
472
+ isRetry: false,
473
+ previousTier: undefined,
474
+ };
475
+ const loopState: LoopState = { recentUnits: [{ key: "execute-task/M001/S01/T01" }], stuckRecoveryAttempts: 0, consecutiveFinalizeTimeouts: 0 };
476
+
477
+ const firstRun = runUnitPhase(ic, iterData, loopState);
478
+ await new Promise(r => setTimeout(r, 50));
479
+ resolveAgentEnd({ messages: [{ role: "assistant" }] });
480
+ await firstRun;
481
+ assert.equal(ic.s.unitDispatchCount.get("execute-task/M001/S01/T01"), 1);
482
+
483
+ _resetPendingResolve();
484
+ const secondRun = runUnitPhase(ic, iterData, loopState);
485
+ await new Promise(r => setTimeout(r, 50));
486
+ resolveAgentEnd({ messages: [{ role: "assistant" }] });
487
+ await secondRun;
488
+ assert.equal(ic.s.unitDispatchCount.get("execute-task/M001/S01/T01"), 2);
489
+ });
490
+
383
491
  test("all events from a mock iteration have monotonically increasing seq and same flowId", async () => {
384
492
  const capture = createEventCapture();
385
493
  const { resolveAgentEnd, _resetPendingResolve } = await import("../auto-loop.js");
@@ -667,3 +775,65 @@ test("session-failed cancellations close out and emit unit-end before hard stop"
667
775
  assert.equal((endEvents[0].data as any).artifactVerified, false);
668
776
  assert.equal((endEvents[0].data as any).errorContext.category, "session-failed");
669
777
  });
778
+
779
+ test("runFinalize pauses and emits unit-end when pre-verification times out", async () => {
780
+ const capture = createEventCapture();
781
+ let pauseCalls = 0;
782
+ const basePath = mkdtempSync(join(tmpdir(), "gsd-finalize-timeout-"));
783
+
784
+ const deps = makeMockDeps(capture, {
785
+ pauseAuto: async () => { pauseCalls++; },
786
+ postUnitPreVerification: async () => {
787
+ await new Promise(() => {});
788
+ return "continue" as const;
789
+ },
790
+ });
791
+
792
+ const ic = makeIC(deps, {
793
+ s: {
794
+ ...makeSession(),
795
+ basePath,
796
+ currentUnit: { type: "execute-task", id: "M001/S01/T01", startedAt: 1234 },
797
+ } as any,
798
+ });
799
+ const iterData: IterationData = {
800
+ unitType: "execute-task",
801
+ unitId: "M001/S01/T01",
802
+ prompt: "do stuff",
803
+ finalPrompt: "do stuff",
804
+ pauseAfterUatDispatch: false,
805
+ state: { phase: "executing", activeMilestone: { id: "M001" }, activeSlice: { id: "S01" }, registry: [], blockers: [] } as any,
806
+ mid: "M001",
807
+ midTitle: "Test",
808
+ isRetry: false,
809
+ previousTier: undefined,
810
+ };
811
+ const loopState: LoopState = { recentUnits: [], stuckRecoveryAttempts: 0, consecutiveFinalizeTimeouts: 0 };
812
+
813
+ const originalSetTimeout = globalThis.setTimeout;
814
+ try {
815
+ globalThis.setTimeout = ((handler: (...args: any[]) => void, _timeout?: number, ...args: any[]) =>
816
+ originalSetTimeout(handler, 0, ...args)) as typeof setTimeout;
817
+
818
+ const result = await runFinalize(ic, iterData, loopState);
819
+ assert.equal(result.action, "break");
820
+ assert.equal((result as any).reason, "finalize-pre-timeout");
821
+ } finally {
822
+ globalThis.setTimeout = originalSetTimeout;
823
+ }
824
+
825
+ assert.equal(pauseCalls, 1, "pre-verification timeout should pause auto-mode");
826
+ assert.equal(loopState.consecutiveFinalizeTimeouts, 1, "timeout should increment finalize timeout counter");
827
+ assert.equal(ic.s.currentUnit, null, "timed-out finalize should detach currentUnit");
828
+
829
+ const runtime = readUnitRuntimeRecord(basePath, "execute-task", "M001/S01/T01");
830
+ assert.ok(runtime, "timed-out finalize should persist a runtime record");
831
+ assert.equal(runtime?.phase, "finalize-timeout");
832
+ assert.equal(runtime?.lastProgressKind, "finalize-pre-timeout");
833
+
834
+ const endEvents = capture.events.filter((e) => e.eventType === "unit-end");
835
+ assert.equal(endEvents.length, 1, "timed-out finalize should emit terminal unit-end");
836
+ assert.equal((endEvents[0].data as any).status, "timed-out-finalize");
837
+ assert.equal((endEvents[0].data as any).artifactVerified, false);
838
+ assert.equal((endEvents[0].data as any).finalizeStage, "pre");
839
+ });
@@ -363,7 +363,7 @@ test('md-importer: schema v1→v2 migration', () => {
363
363
  openDatabase(':memory:');
364
364
  const adapter = _getAdapter();
365
365
  const version = adapter?.prepare('SELECT MAX(version) as v FROM schema_version').get();
366
- assert.deepStrictEqual(version?.v, 15, 'new DB should be at schema version 15');
366
+ assert.deepStrictEqual(version?.v, 17, 'new DB should be at schema version 17');
367
367
 
368
368
  // Artifacts table should exist
369
369
  const tableCheck = adapter?.prepare("SELECT count(*) as c FROM sqlite_master WHERE type='table' AND name='artifacts'").get();
@@ -323,9 +323,9 @@ test('memory-store: schema includes memories table', () => {
323
323
  const viewCount = adapter.prepare('SELECT count(*) as cnt FROM active_memories').get();
324
324
  assert.deepStrictEqual(viewCount?.['cnt'], 0, 'active_memories view should exist');
325
325
 
326
- // Verify schema version is 15 (UOK gate/git/audit projection tables included)
326
+ // Verify schema version is 17 (ADR-011 P2 escalation columns included)
327
327
  const version = adapter.prepare('SELECT MAX(version) as v FROM schema_version').get();
328
- assert.deepStrictEqual(version?.['v'], 15, 'schema version should be 15');
328
+ assert.deepStrictEqual(version?.['v'], 17, 'schema version should be 17');
329
329
 
330
330
  closeDatabase();
331
331
  });
@@ -79,8 +79,9 @@ function seedTask(milestoneId: string, sliceId: string, taskId: string, status:
79
79
  test("registerQueryTools registers gsd_milestone_status tool", () => {
80
80
  const pi = makeMockPi();
81
81
  registerQueryTools(pi);
82
- assert.equal(pi.tools.length, 1, "Should register exactly one tool");
83
- assert.equal(pi.tools[0].name, "gsd_milestone_status");
82
+ const names = pi.tools.map((t: { name: string }) => t.name);
83
+ assert.ok(names.includes("gsd_milestone_status"), "Should register gsd_milestone_status");
84
+ assert.ok(names.includes("gsd_checkpoint_db"), "Should register gsd_checkpoint_db");
84
85
  });
85
86
 
86
87
  test("gsd_milestone_status has promptGuidelines mentioning prohibited alternatives", () => {
@@ -74,7 +74,7 @@ test("#2885: cost table includes openai-codex provider models", () => {
74
74
  const ids = BUNDLED_COST_TABLE.map(e => e.id);
75
75
  const codexModels = [
76
76
  "gpt-5.1", "gpt-5.1-codex-max", "gpt-5.1-codex-mini",
77
- "gpt-5.2", "gpt-5.2-codex", "gpt-5.3-codex", "gpt-5.3-codex-spark", "gpt-5.4",
77
+ "gpt-5.2", "gpt-5.2-codex", "gpt-5.3-codex", "gpt-5.3-codex-spark", "gpt-5.4", "gpt-5.4-mini",
78
78
  ];
79
79
  for (const model of codexModels) {
80
80
  assert.ok(ids.includes(model), `cost table should include openai-codex model "${model}"`);
@@ -94,7 +94,7 @@ test("#2885: cost table includes modern OpenAI models", () => {
94
94
  });
95
95
 
96
96
  test("#2885: lookupModelCost returns costs for new models (not 999 fallback)", () => {
97
- const newModels = ["o4-mini", "gpt-4.1", "gpt-5", "gpt-5.4", "gpt-5.1-codex-mini"];
97
+ const newModels = ["o4-mini", "gpt-4.1", "gpt-5", "gpt-5.4", "gpt-5.4-mini", "gpt-5.1-codex-mini"];
98
98
  for (const model of newModels) {
99
99
  const entry = lookupModelCost(model);
100
100
  assert.ok(entry, `lookupModelCost should find "${model}"`);
@@ -298,7 +298,7 @@ test("MODEL_CAPABILITY_PROFILES has entries for all tier-mapped models", () => {
298
298
 
299
299
  test("#2885: openai-codex light-tier models are recognized", () => {
300
300
  const config = { ...defaultRoutingConfig(), enabled: true };
301
- const lightModels = ["gpt-4.1-mini", "gpt-4.1-nano", "gpt-5-mini", "gpt-5-nano", "gpt-5.1-codex-mini", "gpt-5.3-codex-spark"];
301
+ const lightModels = ["gpt-4.1-mini", "gpt-4.1-nano", "gpt-5-mini", "gpt-5-nano", "gpt-5.1-codex-mini", "gpt-5.3-codex-spark", "gpt-5.4-mini"];
302
302
  for (const model of lightModels) {
303
303
  const result = resolveModelForComplexity(
304
304
  makeClassification("light"),
@@ -215,6 +215,65 @@ test("unitVerb handles discuss-slice", () => {
215
215
  // auto-artifact-paths.ts: artifact resolution
216
216
  // ═══════════════════════════════════════════════════════════════════════════
217
217
 
218
+ // ═══════════════════════════════════════════════════════════════════════════
219
+ // ADR-011: meta-test — every KNOWN_UNIT_TYPES entry must appear in all four
220
+ // downstream registries so a future unit type added to KNOWN_UNIT_TYPES can't
221
+ // silently fall through to wrong defaults in metrics/dashboard/artifacts/post-unit.
222
+ // ═══════════════════════════════════════════════════════════════════════════
223
+
224
+ // Intentional exceptions — unit types that legitimately rely on default/null
225
+ // behavior in a specific registry. Entries captured here reflect the current
226
+ // baseline at the time ADR-011 landed; adding to this allowlist for a NEW unit
227
+ // type requires explicit justification in the commit.
228
+ //
229
+ // Test intent: catch the case where someone adds a new unit type to
230
+ // KNOWN_UNIT_TYPES but forgets to wire it into one of the four registries.
231
+ // The allowlist freezes the baseline so pre-existing omissions do not block
232
+ // the test, but any brand-new addition must be either handled or justified.
233
+ const REGISTRY_EXCEPTIONS: Record<string, Set<string>> = {
234
+ // metrics.ts classifyUnitPhase uses default → "execution" for most unit types.
235
+ "metrics.ts": new Set([
236
+ "worktree-merge", "custom-step",
237
+ "rewrite-docs", "run-uat", "gate-evaluate", "replan-slice",
238
+ "reactive-execute", "validate-milestone", "complete-milestone",
239
+ ]),
240
+ "auto-dashboard.ts": new Set([
241
+ "worktree-merge",
242
+ "gate-evaluate", "reactive-execute", "validate-milestone", "complete-milestone",
243
+ ]),
244
+ "auto-artifact-paths.ts": new Set([
245
+ "rewrite-docs", "gate-evaluate", "reactive-execute", "discuss-slice", "worktree-merge",
246
+ ]),
247
+ "auto-post-unit.ts": new Set([
248
+ "execute-task", "reactive-execute", "gate-evaluate", "worktree-merge",
249
+ ]),
250
+ };
251
+
252
+ const REGISTRY_SOURCES: Array<[string, string]> = [
253
+ ["metrics.ts", metricsSrc],
254
+ ["auto-dashboard.ts", dashboardSrc],
255
+ ["auto-artifact-paths.ts", artifactSrc],
256
+ ["auto-post-unit.ts", postUnitSrc],
257
+ ];
258
+
259
+ test("ADR-011 meta: every KNOWN_UNIT_TYPES entry appears in all 4 downstream registries", () => {
260
+ const missing: Array<{ registry: string; unitType: string }> = [];
261
+ for (const [registry, src] of REGISTRY_SOURCES) {
262
+ for (const ut of ALL_KNOWN_UNIT_TYPES) {
263
+ if (REGISTRY_EXCEPTIONS[registry]?.has(ut)) continue;
264
+ if (!src.includes(`"${ut}"`)) {
265
+ missing.push({ registry, unitType: ut });
266
+ }
267
+ }
268
+ }
269
+ assert.deepEqual(
270
+ missing,
271
+ [],
272
+ "Each listed unit type is absent from the given registry — either add a handler or add to REGISTRY_EXCEPTIONS with justification:\n" +
273
+ missing.map((m) => ` ${m.registry}: "${m.unitType}"`).join("\n"),
274
+ );
275
+ });
276
+
218
277
  test("resolveExpectedArtifactPath handles discuss-slice", () => {
219
278
  assert.ok(artifactSrc.includes('"discuss-slice"'), "missing discuss-slice in artifact paths");
220
279
  });
@@ -17,7 +17,7 @@ test("buildNotificationWidgetLines shows unread count with shortcut pair", () =>
17
17
 
18
18
  const lines = buildNotificationWidgetLines();
19
19
  assert.equal(lines.length, 1);
20
- assert.match(lines[0]!, /Notifications:\s+1 unread/);
20
+ assert.match(lines[0]!, /🔔\s+1 unread/);
21
21
  assert.match(lines[0]!, /\(.+\/.+\)/);
22
22
  } finally {
23
23
  _resetNotificationStore();
@@ -148,6 +148,23 @@ test('handlePlanSlice surfaces render failures without changing parse-visible ta
148
148
  }
149
149
  });
150
150
 
151
+ test('handlePlanSlice reactivates a deferred parent slice to pending', async (t) => {
152
+ const base = makeTmpBase();
153
+ t.after(() => cleanup(base));
154
+ openDatabase(join(base, '.gsd', 'gsd.db'));
155
+
156
+ insertMilestone({ id: 'M001', title: 'Milestone', status: 'active' });
157
+ insertSlice({ id: 'S02', milestoneId: 'M001', title: 'Planning slice', status: 'deferred', demo: 'Rendered plans exist.' });
158
+
159
+ const result = await handlePlanSlice(validParams(), base);
160
+ assert.ok(!('error' in result), `unexpected error: ${'error' in result ? result.error : ''}`);
161
+
162
+ const slice = getSlice('M001', 'S02');
163
+ assert.ok(slice);
164
+ assert.equal(slice?.status, 'pending', 'deferred slice must be reactivated to pending so auto-mode can dispatch it');
165
+ assert.equal(slice?.goal, 'Persist slice planning through the DB.');
166
+ });
167
+
151
168
  test('handlePlanSlice reruns idempotently and refreshes parse-visible state', async () => {
152
169
  const base = makeTmpBase();
153
170
  openDatabase(join(base, '.gsd', 'gsd.db'));