gsd-pi 2.77.0 → 2.78.0

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 (798) hide show
  1. package/README.md +18 -36
  2. package/dist/claude-cli-check.js +5 -1
  3. package/dist/cli-web-branch.d.ts +1 -0
  4. package/dist/cli-web-branch.js +3 -0
  5. package/dist/cli.js +38 -2
  6. package/dist/extension-discovery.d.ts +6 -0
  7. package/dist/extension-discovery.js +37 -0
  8. package/dist/extension-registry.d.ts +3 -0
  9. package/dist/extension-sort.d.ts +18 -0
  10. package/dist/extension-sort.js +114 -0
  11. package/dist/extension-validator.d.ts +47 -0
  12. package/dist/extension-validator.js +127 -0
  13. package/dist/headless.js +49 -4
  14. package/dist/loader.js +35 -7
  15. package/dist/provider-migrations.d.ts +18 -0
  16. package/dist/provider-migrations.js +14 -0
  17. package/dist/resource-loader.d.ts +40 -0
  18. package/dist/resource-loader.js +32 -13
  19. package/dist/resources/extensions/browser-tools/capture.js +9 -0
  20. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  21. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  22. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  23. package/dist/resources/extensions/browser-tools/tools/forms.js +5 -1
  24. package/dist/resources/extensions/browser-tools/tools/intent.js +5 -1
  25. package/dist/resources/extensions/claude-code-cli/readiness.js +5 -1
  26. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +552 -67
  27. package/dist/resources/extensions/cmux/index.js +20 -0
  28. package/dist/resources/extensions/github-sync/templates.js +103 -0
  29. package/dist/resources/extensions/google-search/extension-manifest.json +5 -4
  30. package/dist/resources/extensions/google-search/index.js +3 -375
  31. package/dist/resources/extensions/gsd/abandon-detect.js +44 -0
  32. package/dist/resources/extensions/gsd/auto/loop.js +124 -2
  33. package/dist/resources/extensions/gsd/auto/phases.js +57 -39
  34. package/dist/resources/extensions/gsd/auto/resolve.js +24 -0
  35. package/dist/resources/extensions/gsd/auto/run-unit.js +10 -2
  36. package/dist/resources/extensions/gsd/auto/session.js +6 -2
  37. package/dist/resources/extensions/gsd/auto/turn-epoch.js +95 -0
  38. package/dist/resources/extensions/gsd/auto-dispatch.js +201 -38
  39. package/dist/resources/extensions/gsd/auto-loop.js +1 -1
  40. package/dist/resources/extensions/gsd/auto-model-selection.js +124 -4
  41. package/dist/resources/extensions/gsd/auto-post-unit.js +215 -64
  42. package/dist/resources/extensions/gsd/auto-prompts.js +372 -104
  43. package/dist/resources/extensions/gsd/auto-recovery.js +210 -24
  44. package/dist/resources/extensions/gsd/auto-start.js +122 -30
  45. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +11 -5
  46. package/dist/resources/extensions/gsd/auto-tool-tracking.js +47 -7
  47. package/dist/resources/extensions/gsd/auto-unit-closeout.js +11 -2
  48. package/dist/resources/extensions/gsd/auto-worktree.js +180 -34
  49. package/dist/resources/extensions/gsd/auto.js +107 -35
  50. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +19 -1
  51. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +209 -0
  52. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +5 -6
  53. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +11 -0
  54. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -3
  55. package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -6
  56. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +127 -9
  57. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +31 -4
  58. package/dist/resources/extensions/gsd/commands-cmux.js +9 -6
  59. package/dist/resources/extensions/gsd/commands-extensions.js +634 -43
  60. package/dist/resources/extensions/gsd/component-loader.js +447 -0
  61. package/dist/resources/extensions/gsd/component-types.js +69 -0
  62. package/dist/resources/extensions/gsd/context-store.js +23 -7
  63. package/dist/resources/extensions/gsd/detection.js +49 -1
  64. package/dist/resources/extensions/gsd/dispatch-guard.js +29 -3
  65. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  66. package/dist/resources/extensions/gsd/file-lock.js +49 -9
  67. package/dist/resources/extensions/gsd/forensics.js +106 -0
  68. package/dist/resources/extensions/gsd/gate-registry.js +2 -2
  69. package/dist/resources/extensions/gsd/git-constants.js +28 -1
  70. package/dist/resources/extensions/gsd/git-self-heal.js +27 -0
  71. package/dist/resources/extensions/gsd/git-service.js +127 -2
  72. package/dist/resources/extensions/gsd/gitignore.js +1 -0
  73. package/dist/resources/extensions/gsd/gsd-db.js +6 -3
  74. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -1
  75. package/dist/resources/extensions/gsd/guided-flow.js +39 -13
  76. package/dist/resources/extensions/gsd/journal.js +17 -2
  77. package/dist/resources/extensions/gsd/memory-extractor.js +7 -1
  78. package/dist/resources/extensions/gsd/milestone-actions.js +15 -0
  79. package/dist/resources/extensions/gsd/milestone-scope-classifier.js +299 -0
  80. package/dist/resources/extensions/gsd/milestone-summary-classifier.js +37 -0
  81. package/dist/resources/extensions/gsd/model-cost-table.js +3 -0
  82. package/dist/resources/extensions/gsd/model-router.js +6 -0
  83. package/dist/resources/extensions/gsd/native-git-bridge.js +34 -4
  84. package/dist/resources/extensions/gsd/notifications.js +30 -16
  85. package/dist/resources/extensions/gsd/preferences-validation.js +23 -0
  86. package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +4 -0
  87. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  88. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
  89. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  90. package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  91. package/dist/resources/extensions/gsd/prompts/system.md +1 -0
  92. package/dist/resources/extensions/gsd/reports.js +5 -4
  93. package/dist/resources/extensions/gsd/safety/git-checkpoint.js +11 -0
  94. package/dist/resources/extensions/gsd/service-tier.js +5 -2
  95. package/dist/resources/extensions/gsd/session-lock.js +19 -10
  96. package/dist/resources/extensions/gsd/skill-manifest.js +168 -0
  97. package/dist/resources/extensions/gsd/slice-cadence.js +238 -0
  98. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +278 -8
  99. package/dist/resources/extensions/gsd/state-transition-matrix.js +118 -0
  100. package/dist/resources/extensions/gsd/state.js +69 -58
  101. package/dist/resources/extensions/gsd/sync-lock.js +98 -42
  102. package/dist/resources/extensions/gsd/tools/complete-slice.js +21 -0
  103. package/dist/resources/extensions/gsd/tools/complete-task.js +31 -0
  104. package/dist/resources/extensions/gsd/tools/validate-milestone.js +7 -2
  105. package/dist/resources/extensions/gsd/unit-context-composer.js +147 -0
  106. package/dist/resources/extensions/gsd/unit-context-manifest.js +370 -0
  107. package/dist/resources/extensions/gsd/uok/audit.js +18 -2
  108. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +33 -0
  109. package/dist/resources/extensions/gsd/uok/execution-graph.js +10 -0
  110. package/dist/resources/extensions/gsd/uok/gate-runner.js +53 -5
  111. package/dist/resources/extensions/gsd/uok/gitops.js +2 -1
  112. package/dist/resources/extensions/gsd/uok/loop-adapter.js +37 -10
  113. package/dist/resources/extensions/gsd/uok/parity-report.js +58 -0
  114. package/dist/resources/extensions/gsd/uok/plan-v2.js +10 -4
  115. package/dist/resources/extensions/gsd/uok/writer.js +82 -0
  116. package/dist/resources/extensions/gsd/workflow-logger.js +10 -2
  117. package/dist/resources/extensions/gsd/workflow-mcp.js +6 -0
  118. package/dist/resources/extensions/gsd/worktree-manager.js +86 -8
  119. package/dist/resources/extensions/gsd/worktree-resolver.js +86 -7
  120. package/dist/resources/extensions/gsd/worktree-telemetry.js +198 -0
  121. package/dist/resources/extensions/mcp-client/auth.js +10 -1
  122. package/dist/resources/extensions/mcp-client/index.js +121 -10
  123. package/dist/resources/extensions/ollama/index.js +5 -1
  124. package/dist/resources/extensions/remote-questions/manager.js +11 -5
  125. package/dist/resources/extensions/shared/cmux-events.js +12 -0
  126. package/dist/resources/extensions/shared/rtk-session-stats.js +1 -2
  127. package/dist/resources/skills/create-skill/SKILL.md +2 -2
  128. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  129. package/dist/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  130. package/dist/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  131. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  132. package/dist/web/standalone/.next/BUILD_ID +1 -1
  133. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  134. package/dist/web/standalone/.next/build-manifest.json +3 -3
  135. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/notifications/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/session/events/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  212. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  216. package/dist/web/standalone/.next/server/app/index.html +1 -1
  217. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  220. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  221. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  222. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  223. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  224. package/dist/web/standalone/.next/server/chunks/1926.js +1 -0
  225. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  226. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  227. package/dist/web/standalone/.next/server/middleware-manifest.json +1 -1
  228. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  229. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  230. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  231. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +11 -0
  232. package/dist/web/standalone/.next/static/chunks/{webpack-5fc74f13a25fa1bb.js → webpack-2e68521d7c82f7c2.js} +1 -1
  233. package/package.json +17 -16
  234. package/packages/daemon/package.json +2 -2
  235. package/packages/daemon/src/logger.ts +4 -3
  236. package/packages/mcp-server/README.md +3 -3
  237. package/packages/mcp-server/dist/env-writer.d.ts +1 -0
  238. package/packages/mcp-server/dist/env-writer.d.ts.map +1 -1
  239. package/packages/mcp-server/dist/env-writer.js +74 -6
  240. package/packages/mcp-server/dist/env-writer.js.map +1 -1
  241. package/packages/mcp-server/dist/server.d.ts +24 -0
  242. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  243. package/packages/mcp-server/dist/server.js +111 -87
  244. package/packages/mcp-server/dist/server.js.map +1 -1
  245. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  246. package/packages/mcp-server/dist/workflow-tools.js +15 -6
  247. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  248. package/packages/mcp-server/package.json +7 -2
  249. package/packages/mcp-server/src/env-writer.test.ts +79 -1
  250. package/packages/mcp-server/src/env-writer.ts +76 -6
  251. package/packages/mcp-server/src/mcp-server.test.ts +25 -3
  252. package/packages/mcp-server/src/readers/graph.test.ts +87 -15
  253. package/packages/mcp-server/src/readers/readers.test.ts +5 -1
  254. package/packages/mcp-server/src/secure-env-collect.test.ts +232 -237
  255. package/packages/mcp-server/src/server.ts +158 -105
  256. package/packages/mcp-server/src/workflow-tools.test.ts +85 -0
  257. package/packages/mcp-server/src/workflow-tools.ts +19 -6
  258. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  259. package/packages/native/package.json +7 -2
  260. package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
  261. package/packages/native/src/__tests__/clipboard.test.mjs +69 -23
  262. package/packages/native/src/__tests__/module-compat.test.mjs +59 -27
  263. package/packages/native/src/__tests__/ps.test.mjs +14 -8
  264. package/packages/native/src/__tests__/stream-process.test.mjs +23 -2
  265. package/packages/native/src/__tests__/truncate.test.mjs +17 -2
  266. package/packages/native/tsconfig.tsbuildinfo +1 -1
  267. package/packages/pi-agent-core/package.json +6 -1
  268. package/packages/pi-agent-core/src/agent-loop.test.ts +226 -31
  269. package/packages/pi-agent-core/src/agent.test.ts +96 -102
  270. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  271. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  272. package/packages/pi-ai/dist/models/capability-patches.js +9 -2
  273. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  274. package/packages/pi-ai/dist/models/generated/index.d.ts +34 -0
  275. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  276. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  277. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  278. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  279. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  280. package/packages/pi-ai/dist/models/generated/openai.d.ts +17 -0
  281. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -1
  282. package/packages/pi-ai/dist/models/generated/openai.js +17 -0
  283. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -1
  284. package/packages/pi-ai/dist/models.generated.test.js +43 -70
  285. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  286. package/packages/pi-ai/dist/models.test.js +36 -11
  287. package/packages/pi-ai/dist/models.test.js.map +1 -1
  288. package/packages/pi-ai/package.json +6 -1
  289. package/packages/pi-ai/scripts/generate-models.ts +44 -0
  290. package/packages/pi-ai/src/models/capability-patches.ts +10 -2
  291. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  292. package/packages/pi-ai/src/models/generated/openai.ts +17 -0
  293. package/packages/pi-ai/src/models.generated.test.ts +46 -73
  294. package/packages/pi-ai/src/models.test.ts +48 -11
  295. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  296. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +96 -32
  297. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  298. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js +75 -12
  299. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +99 -31
  301. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +25 -0
  303. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  304. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +105 -6
  305. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  306. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +230 -28
  307. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  308. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts +30 -2
  309. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
  310. package/packages/pi-coding-agent/dist/core/compaction/utils.js +113 -12
  311. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +1 -0
  313. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +29 -18
  315. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  316. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts +2 -0
  317. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts.map +1 -0
  318. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js +130 -0
  319. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js.map +1 -0
  320. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +56 -1
  321. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +8 -15
  323. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts +25 -0
  325. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts.map +1 -0
  326. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js +109 -0
  327. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js.map +1 -0
  328. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts +67 -0
  329. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts.map +1 -0
  330. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js +167 -0
  331. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js.map +1 -0
  332. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +8 -2
  333. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  334. package/packages/pi-coding-agent/dist/core/extensions/loader.js +85 -8
  335. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  336. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +7 -0
  337. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  338. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  339. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +41 -4
  340. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +19 -2
  342. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  343. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +76 -18
  344. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -1
  346. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  347. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  348. package/packages/pi-coding-agent/dist/core/retry-handler.js +2 -6
  349. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  350. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +5 -1
  351. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
  352. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts +18 -0
  353. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts.map +1 -0
  354. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js +18 -0
  355. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js.map +1 -0
  356. package/packages/pi-coding-agent/dist/core/sdk.d.ts +1 -0
  357. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/core/sdk.js +4 -1
  359. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/core/sdk.test.js +19 -1
  361. package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -1
  362. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +20 -0
  363. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  364. package/packages/pi-coding-agent/dist/core/system-prompt.js +19 -5
  365. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js +2 -1
  367. package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js.map +1 -1
  368. package/packages/pi-coding-agent/dist/index.d.ts +1 -0
  369. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  370. package/packages/pi-coding-agent/dist/index.js +1 -0
  371. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  372. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +15 -6
  373. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +36 -5
  375. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  376. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +20 -13
  377. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
  378. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -5
  380. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts +7 -1
  382. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  383. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +31 -9
  384. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  386. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +30 -12
  387. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  388. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  389. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +18 -3
  390. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  391. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +139 -0
  392. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  393. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +2 -0
  394. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  395. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  396. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +4 -0
  397. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  398. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +105 -13
  399. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  400. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts +2 -0
  401. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts.map +1 -0
  402. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js +130 -0
  403. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js.map +1 -0
  404. package/packages/pi-coding-agent/package.json +6 -1
  405. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +113 -37
  406. package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +89 -17
  407. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +112 -43
  408. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +368 -28
  409. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +122 -6
  410. package/packages/pi-coding-agent/src/core/compaction/utils.ts +111 -13
  411. package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +154 -0
  412. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +32 -18
  413. package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +68 -1
  414. package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +9 -18
  415. package/packages/pi-coding-agent/src/core/extensions/extension-discovery.ts +119 -0
  416. package/packages/pi-coding-agent/src/core/extensions/extension-registry.ts +222 -0
  417. package/packages/pi-coding-agent/src/core/extensions/loader.ts +82 -11
  418. package/packages/pi-coding-agent/src/core/extensions/types.ts +8 -0
  419. package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +48 -4
  420. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +22 -2
  421. package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +93 -28
  422. package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -1
  423. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +5 -1
  424. package/packages/pi-coding-agent/src/core/retry-handler.ts +2 -8
  425. package/packages/pi-coding-agent/src/core/retryable-error-regex.ts +18 -0
  426. package/packages/pi-coding-agent/src/core/sdk.test.ts +25 -1
  427. package/packages/pi-coding-agent/src/core/sdk.ts +10 -3
  428. package/packages/pi-coding-agent/src/core/system-prompt.ts +38 -4
  429. package/packages/pi-coding-agent/src/core/tools/path-utils.test.ts +2 -1
  430. package/packages/pi-coding-agent/src/index.ts +1 -0
  431. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +17 -7
  432. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +49 -3
  433. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +26 -20
  434. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +14 -5
  435. package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +45 -11
  436. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +48 -9
  437. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +160 -1
  438. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +20 -3
  439. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +2 -0
  440. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +119 -13
  441. package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
  442. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  443. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +31 -14
  444. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  445. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +128 -17
  446. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  447. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +51 -6
  448. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
  449. package/packages/pi-tui/dist/__tests__/tui.test.js +18 -30
  450. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  451. package/packages/pi-tui/dist/components/__tests__/input.test.js +10 -3
  452. package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
  453. package/packages/pi-tui/dist/components/__tests__/loader.test.js +53 -9
  454. package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -1
  455. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +6 -2
  456. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -1
  457. package/packages/pi-tui/dist/components/editor.d.ts +14 -0
  458. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  459. package/packages/pi-tui/dist/components/editor.js +19 -0
  460. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  461. package/packages/pi-tui/dist/components/image.test.js +6 -5
  462. package/packages/pi-tui/dist/components/image.test.js.map +1 -1
  463. package/packages/pi-tui/dist/editor-component.d.ts +2 -0
  464. package/packages/pi-tui/dist/editor-component.d.ts.map +1 -1
  465. package/packages/pi-tui/dist/editor-component.js.map +1 -1
  466. package/packages/pi-tui/dist/stdin-buffer.d.ts +7 -0
  467. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  468. package/packages/pi-tui/dist/stdin-buffer.js +20 -0
  469. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  470. package/packages/pi-tui/package.json +6 -1
  471. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +46 -15
  472. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +140 -17
  473. package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +62 -6
  474. package/packages/pi-tui/src/__tests__/tui.test.ts +18 -37
  475. package/packages/pi-tui/src/components/__tests__/input.test.ts +19 -3
  476. package/packages/pi-tui/src/components/__tests__/loader.test.ts +112 -35
  477. package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +9 -2
  478. package/packages/pi-tui/src/components/editor.ts +22 -0
  479. package/packages/pi-tui/src/components/image.test.ts +10 -5
  480. package/packages/pi-tui/src/editor-component.ts +3 -0
  481. package/packages/pi-tui/src/stdin-buffer.ts +26 -0
  482. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  483. package/packages/rpc-client/dist/rpc-client.test.js +101 -51
  484. package/packages/rpc-client/dist/rpc-client.test.js.map +1 -1
  485. package/packages/rpc-client/package.json +6 -1
  486. package/packages/rpc-client/src/rpc-client.test.ts +109 -52
  487. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  488. package/pkg/package.json +1 -1
  489. package/scripts/install.js +526 -0
  490. package/scripts/lib/workspace-manifest.cjs +86 -0
  491. package/scripts/link-workspace-packages.cjs +5 -17
  492. package/scripts/postinstall.js +9 -178
  493. package/src/resources/extensions/browser-tools/capture.ts +12 -0
  494. package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  495. package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  496. package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  497. package/src/resources/extensions/browser-tools/tools/forms.ts +5 -1
  498. package/src/resources/extensions/browser-tools/tools/intent.ts +5 -1
  499. package/src/resources/extensions/claude-code-cli/readiness.ts +5 -1
  500. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +602 -73
  501. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +1028 -91
  502. package/src/resources/extensions/cmux/index.ts +35 -10
  503. package/src/resources/extensions/github-sync/templates.ts +151 -0
  504. package/src/resources/extensions/github-sync/tests/cli.test.ts +76 -7
  505. package/src/resources/extensions/github-sync/tests/templates.test.ts +92 -1
  506. package/src/resources/extensions/google-search/extension-manifest.json +5 -4
  507. package/src/resources/extensions/google-search/index.ts +9 -470
  508. package/src/resources/extensions/gsd/abandon-detect.ts +62 -0
  509. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  510. package/src/resources/extensions/gsd/auto/loop.ts +142 -2
  511. package/src/resources/extensions/gsd/auto/phases.ts +62 -38
  512. package/src/resources/extensions/gsd/auto/resolve.ts +29 -0
  513. package/src/resources/extensions/gsd/auto/run-unit.ts +16 -2
  514. package/src/resources/extensions/gsd/auto/session.ts +7 -2
  515. package/src/resources/extensions/gsd/auto/turn-epoch.ts +108 -0
  516. package/src/resources/extensions/gsd/auto/types.ts +1 -1
  517. package/src/resources/extensions/gsd/auto-dispatch.ts +214 -37
  518. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  519. package/src/resources/extensions/gsd/auto-model-selection.ts +131 -4
  520. package/src/resources/extensions/gsd/auto-post-unit.ts +226 -73
  521. package/src/resources/extensions/gsd/auto-prompts.ts +385 -93
  522. package/src/resources/extensions/gsd/auto-recovery.ts +240 -25
  523. package/src/resources/extensions/gsd/auto-start.ts +146 -14
  524. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -5
  525. package/src/resources/extensions/gsd/auto-tool-tracking.ts +51 -7
  526. package/src/resources/extensions/gsd/auto-unit-closeout.ts +14 -3
  527. package/src/resources/extensions/gsd/auto-worktree.ts +190 -31
  528. package/src/resources/extensions/gsd/auto.ts +127 -41
  529. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +20 -1
  530. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +221 -0
  531. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +6 -6
  532. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +11 -0
  533. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -3
  534. package/src/resources/extensions/gsd/bootstrap/system-context.ts +13 -9
  535. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +158 -9
  536. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +27 -8
  537. package/src/resources/extensions/gsd/commands-cmux.ts +10 -6
  538. package/src/resources/extensions/gsd/commands-extensions.ts +747 -41
  539. package/src/resources/extensions/gsd/component-loader.ts +598 -0
  540. package/src/resources/extensions/gsd/component-types.ts +362 -0
  541. package/src/resources/extensions/gsd/context-store.ts +25 -8
  542. package/src/resources/extensions/gsd/detection.ts +58 -1
  543. package/src/resources/extensions/gsd/dispatch-guard.ts +26 -2
  544. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  545. package/src/resources/extensions/gsd/file-lock.ts +84 -11
  546. package/src/resources/extensions/gsd/forensics.ts +118 -1
  547. package/src/resources/extensions/gsd/gate-registry.ts +2 -2
  548. package/src/resources/extensions/gsd/git-constants.ts +30 -1
  549. package/src/resources/extensions/gsd/git-self-heal.ts +31 -0
  550. package/src/resources/extensions/gsd/git-service.ts +150 -2
  551. package/src/resources/extensions/gsd/gitignore.ts +1 -0
  552. package/src/resources/extensions/gsd/gsd-db.ts +6 -3
  553. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -1
  554. package/src/resources/extensions/gsd/guided-flow.ts +57 -14
  555. package/src/resources/extensions/gsd/journal.ts +38 -3
  556. package/src/resources/extensions/gsd/memory-extractor.ts +11 -3
  557. package/src/resources/extensions/gsd/milestone-actions.ts +18 -0
  558. package/src/resources/extensions/gsd/milestone-scope-classifier.ts +366 -0
  559. package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
  560. package/src/resources/extensions/gsd/model-cost-table.ts +3 -0
  561. package/src/resources/extensions/gsd/model-router.ts +6 -0
  562. package/src/resources/extensions/gsd/native-git-bridge.ts +34 -4
  563. package/src/resources/extensions/gsd/notifications.ts +27 -15
  564. package/src/resources/extensions/gsd/preferences-validation.ts +21 -0
  565. package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +4 -0
  566. package/src/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  567. package/src/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
  568. package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  569. package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  570. package/src/resources/extensions/gsd/prompts/system.md +1 -0
  571. package/src/resources/extensions/gsd/reports.ts +5 -4
  572. package/src/resources/extensions/gsd/safety/git-checkpoint.ts +15 -0
  573. package/src/resources/extensions/gsd/service-tier.ts +5 -2
  574. package/src/resources/extensions/gsd/session-lock.ts +20 -10
  575. package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
  576. package/src/resources/extensions/gsd/slice-cadence.ts +299 -0
  577. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +309 -8
  578. package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
  579. package/src/resources/extensions/gsd/state.ts +76 -66
  580. package/src/resources/extensions/gsd/sync-lock.ts +97 -39
  581. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +270 -0
  582. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +2 -1
  583. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +341 -0
  584. package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +264 -0
  585. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +135 -285
  586. package/src/resources/extensions/gsd/tests/auto-mode-guards.test.ts +79 -0
  587. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +742 -0
  588. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +78 -0
  589. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +61 -0
  590. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +166 -0
  591. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +4 -1
  592. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +8 -194
  593. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +64 -0
  594. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +2 -2
  595. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +15 -58
  596. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +2 -2
  597. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +3 -2
  598. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +3 -2
  599. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -1
  600. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +17 -21
  601. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +108 -0
  602. package/src/resources/extensions/gsd/tests/cmux.test.ts +5 -9
  603. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +263 -0
  604. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +25 -0
  605. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +192 -0
  606. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +2 -1
  607. package/src/resources/extensions/gsd/tests/complete-task.test.ts +16 -8
  608. package/src/resources/extensions/gsd/tests/component-loader.test.ts +589 -0
  609. package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
  610. package/src/resources/extensions/gsd/tests/context-store.test.ts +79 -0
  611. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +2 -1
  612. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +50 -1
  613. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +159 -0
  614. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -0
  615. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -3
  616. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +40 -0
  617. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +91 -3
  618. package/src/resources/extensions/gsd/tests/derive-state.test.ts +4 -4
  619. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +2 -1
  620. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +2 -1
  621. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +14 -9
  622. package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +77 -0
  623. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +25 -0
  624. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +14 -0
  625. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +3 -2
  626. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +4 -3
  627. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +4 -3
  628. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +173 -0
  629. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +139 -129
  630. package/src/resources/extensions/gsd/tests/file-lock.test.ts +86 -12
  631. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +8 -104
  632. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +102 -0
  633. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +1 -1
  634. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +131 -0
  635. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +117 -0
  636. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +4 -55
  637. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +7 -56
  638. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +20 -0
  639. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +30 -0
  640. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +18 -2
  641. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  642. package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +10 -4
  643. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +144 -7
  644. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +4 -0
  645. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +2 -16
  646. package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +11 -0
  647. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +9 -3
  648. package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +6 -9
  649. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +64 -0
  650. package/src/resources/extensions/gsd/tests/knowledge.test.ts +93 -1
  651. package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +47 -0
  652. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +5 -15
  653. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +227 -55
  654. package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +187 -0
  655. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +3 -3
  656. package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
  657. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +4 -2
  658. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
  659. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  660. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +6 -48
  661. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +6 -3
  662. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +59 -2
  663. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +5 -0
  664. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +273 -130
  665. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +150 -0
  666. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +301 -0
  667. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +32 -1
  668. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +2 -1
  669. package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +12 -0
  670. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +15 -4
  671. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +54 -41
  672. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +213 -0
  673. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +3 -2
  674. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +4 -5
  675. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +13 -7
  676. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +75 -2
  677. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +132 -0
  678. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +8 -40
  679. package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +136 -256
  680. package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +170 -0
  681. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +114 -0
  682. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +6 -3
  683. package/src/resources/extensions/gsd/tests/rewrite-docs-abandon-detect.test.ts +195 -0
  684. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +148 -0
  685. package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
  686. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +29 -0
  687. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +3 -2
  688. package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +55 -95
  689. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +158 -0
  690. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +120 -1
  691. package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
  692. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +242 -0
  693. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +3 -2
  694. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +164 -1
  695. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +2 -1
  696. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +112 -0
  697. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +29 -5
  698. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
  699. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +3 -3
  700. package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +11 -92
  701. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +2 -2
  702. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +7 -6
  703. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +102 -101
  704. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +31 -0
  705. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +4 -3
  706. package/src/resources/extensions/gsd/tests/test-helpers.test.ts +98 -0
  707. package/src/resources/extensions/gsd/tests/test-helpers.ts +153 -0
  708. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
  709. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +61 -1
  710. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -1
  711. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +50 -2
  712. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +162 -0
  713. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +355 -0
  714. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +258 -0
  715. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +51 -0
  716. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +16 -0
  717. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +75 -0
  718. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +49 -26
  719. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +65 -0
  720. package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
  721. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +19 -2
  722. package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
  723. package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +168 -0
  724. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +139 -5
  725. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +144 -80
  726. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -54
  727. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +342 -277
  728. package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +37 -29
  729. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +25 -2
  730. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +226 -266
  731. package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +103 -67
  732. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +92 -90
  733. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +238 -59
  734. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +113 -161
  735. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +210 -0
  736. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +262 -0
  737. package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +186 -0
  738. package/src/resources/extensions/gsd/tests/write-gate.test.ts +7 -5
  739. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +80 -96
  740. package/src/resources/extensions/gsd/tools/complete-slice.ts +38 -0
  741. package/src/resources/extensions/gsd/tools/complete-task.ts +49 -0
  742. package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -2
  743. package/src/resources/extensions/gsd/types.ts +3 -3
  744. package/src/resources/extensions/gsd/unit-context-composer.ts +218 -0
  745. package/src/resources/extensions/gsd/unit-context-manifest.ts +574 -0
  746. package/src/resources/extensions/gsd/uok/audit.ts +20 -2
  747. package/src/resources/extensions/gsd/uok/contracts.ts +65 -0
  748. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +56 -0
  749. package/src/resources/extensions/gsd/uok/execution-graph.ts +22 -0
  750. package/src/resources/extensions/gsd/uok/gate-runner.ts +65 -5
  751. package/src/resources/extensions/gsd/uok/gitops.ts +6 -1
  752. package/src/resources/extensions/gsd/uok/loop-adapter.ts +45 -10
  753. package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
  754. package/src/resources/extensions/gsd/uok/plan-v2.ts +13 -5
  755. package/src/resources/extensions/gsd/uok/writer.ts +113 -0
  756. package/src/resources/extensions/gsd/workflow-logger.ts +22 -3
  757. package/src/resources/extensions/gsd/workflow-mcp.ts +6 -0
  758. package/src/resources/extensions/gsd/worktree-manager.ts +109 -7
  759. package/src/resources/extensions/gsd/worktree-resolver.ts +96 -9
  760. package/src/resources/extensions/gsd/worktree-telemetry.ts +322 -0
  761. package/src/resources/extensions/mcp-client/auth.ts +12 -1
  762. package/src/resources/extensions/mcp-client/index.ts +132 -11
  763. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +70 -36
  764. package/src/resources/extensions/ollama/index.ts +5 -1
  765. package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +123 -15
  766. package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +206 -19
  767. package/src/resources/extensions/remote-questions/manager.ts +36 -4
  768. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +200 -190
  769. package/src/resources/extensions/shared/cmux-events.ts +59 -0
  770. package/src/resources/extensions/shared/rtk-session-stats.ts +1 -2
  771. package/src/resources/extensions/shared/tests/interview-preview.test.ts +11 -3
  772. package/src/resources/extensions/voice/tests/linux-ready.test.ts +129 -113
  773. package/src/resources/skills/create-skill/SKILL.md +2 -2
  774. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  775. package/src/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  776. package/src/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  777. package/dist/web/standalone/.next/server/chunks/7461.js +0 -1
  778. package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +0 -9
  779. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +0 -2
  780. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +0 -1
  781. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +0 -289
  782. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +0 -1
  783. package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +0 -363
  784. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +0 -143
  785. package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +0 -142
  786. package/src/resources/extensions/gsd/tests/dashboard-model-label-ordering.test.ts +0 -107
  787. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +0 -48
  788. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -159
  789. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
  790. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -79
  791. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +0 -74
  792. package/src/resources/extensions/gsd/tests/forensics-journal.test.ts +0 -162
  793. package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +0 -38
  794. package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +0 -73
  795. package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +0 -125
  796. package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +0 -42
  797. /package/dist/web/standalone/.next/static/{pV-mPo7rYGb5JBC09C8GG → C1zT2kEfoLhDdbWPWKrXd}/_buildManifest.js +0 -0
  798. /package/dist/web/standalone/.next/static/{pV-mPo7rYGb5JBC09C8GG → C1zT2kEfoLhDdbWPWKrXd}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-client.test.js","sourceRoot":"","sources":["../src/rpc-client.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, it, beforeEach, afterEach } from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { PassThrough } from \"node:stream\";\nimport { serializeJsonLine, attachJsonlLineReader } from \"./jsonl.js\";\nimport type {\n\tRpcInitResult,\n\tRpcExecutionCompleteEvent,\n\tRpcCostUpdateEvent,\n\tRpcProtocolVersion,\n\tSessionStats,\n\tRpcV2Event,\n} from \"./rpc-types.js\";\nimport { RpcClient } from \"./rpc-client.js\";\nimport type { SdkAgentEvent } from \"./rpc-client.js\";\n\n// ============================================================================\n// JSONL Tests\n// ============================================================================\n\ndescribe(\"serializeJsonLine\", () => {\n\tit(\"produces valid JSON terminated with LF\", () => {\n\t\tconst result = serializeJsonLine({ type: \"test\", value: 42 });\n\t\tassert.ok(result.endsWith(\"\\n\"), \"must end with LF\");\n\t\tconst parsed = JSON.parse(result.trim());\n\t\tassert.equal(parsed.type, \"test\");\n\t\tassert.equal(parsed.value, 42);\n\t});\n\n\tit(\"serializes strings with special characters\", () => {\n\t\tconst result = serializeJsonLine({ msg: \"hello\\nworld\" });\n\t\tassert.ok(result.endsWith(\"\\n\"));\n\t\t// The embedded \\n must be escaped inside the JSON — only the trailing LF is the framing delimiter\n\t\tconst lines = result.split(\"\\n\");\n\t\t// Should be exactly 2 parts: the JSON line and the empty string after trailing LF\n\t\tassert.equal(lines.length, 2);\n\t\tassert.equal(lines[1], \"\");\n\t\tconst parsed = JSON.parse(lines[0]);\n\t\tassert.equal(parsed.msg, \"hello\\nworld\");\n\t});\n\n\tit(\"handles empty objects\", () => {\n\t\tconst result = serializeJsonLine({});\n\t\tassert.equal(result, \"{}\\n\");\n\t});\n});\n\ndescribe(\"attachJsonlLineReader\", () => {\n\tit(\"splits on LF correctly\", async () => {\n\t\tconst stream = new PassThrough();\n\t\tconst lines: string[] = [];\n\n\t\tattachJsonlLineReader(stream, (line) => lines.push(line));\n\n\t\tstream.write('{\"a\":1}\\n{\"b\":2}\\n');\n\t\tstream.end();\n\n\t\t// Let microtask queue flush\n\t\tawait new Promise((r) => setTimeout(r, 10));\n\n\t\tassert.equal(lines.length, 2);\n\t\tassert.equal(JSON.parse(lines[0]).a, 1);\n\t\tassert.equal(JSON.parse(lines[1]).b, 2);\n\t});\n\n\tit(\"handles chunked data across boundaries\", async () => {\n\t\tconst stream = new PassThrough();\n\t\tconst lines: string[] = [];\n\n\t\tattachJsonlLineReader(stream, (line) => lines.push(line));\n\n\t\t// Write in fragments that split mid-line\n\t\tstream.write('{\"type\":\"hel');\n\t\tstream.write('lo\"}\\n{\"type\":\"w');\n\t\tstream.write('orld\"}\\n');\n\t\tstream.end();\n\n\t\tawait new Promise((r) => setTimeout(r, 10));\n\n\t\tassert.equal(lines.length, 2);\n\t\tassert.equal(JSON.parse(lines[0]).type, \"hello\");\n\t\tassert.equal(JSON.parse(lines[1]).type, \"world\");\n\t});\n\n\tit(\"emits trailing data on stream end\", async () => {\n\t\tconst stream = new PassThrough();\n\t\tconst lines: string[] = [];\n\n\t\tattachJsonlLineReader(stream, (line) => lines.push(line));\n\n\t\tstream.write('{\"final\":true}');\n\t\tstream.end();\n\n\t\tawait new Promise((r) => setTimeout(r, 10));\n\n\t\tassert.equal(lines.length, 1);\n\t\tassert.equal(JSON.parse(lines[0]).final, true);\n\t});\n\n\tit(\"returns a detach function that stops reading\", async () => {\n\t\tconst stream = new PassThrough();\n\t\tconst lines: string[] = [];\n\n\t\tconst detach = attachJsonlLineReader(stream, (line) => lines.push(line));\n\n\t\tstream.write('{\"a\":1}\\n');\n\t\tawait new Promise((r) => setTimeout(r, 10));\n\t\tassert.equal(lines.length, 1);\n\n\t\tdetach();\n\n\t\tstream.write('{\"b\":2}\\n');\n\t\tstream.end();\n\t\tawait new Promise((r) => setTimeout(r, 10));\n\n\t\t// Should still be 1 — detach removed listeners\n\t\tassert.equal(lines.length, 1);\n\t});\n\n\tit(\"strips CR from CRLF line endings\", async () => {\n\t\tconst stream = new PassThrough();\n\t\tconst lines: string[] = [];\n\n\t\tattachJsonlLineReader(stream, (line) => lines.push(line));\n\n\t\tstream.write('{\"v\":1}\\r\\n');\n\t\tstream.end();\n\n\t\tawait new Promise((r) => setTimeout(r, 10));\n\n\t\tassert.equal(lines.length, 1);\n\t\tassert.equal(JSON.parse(lines[0]).v, 1);\n\t});\n});\n\n// ============================================================================\n// Type Shape Tests\n// ============================================================================\n\ndescribe(\"type shapes\", () => {\n\tit(\"RpcInitResult has protocolVersion, sessionId, capabilities\", () => {\n\t\tconst init: RpcInitResult = {\n\t\t\tprotocolVersion: 2,\n\t\t\tsessionId: \"sess_123\",\n\t\t\tcapabilities: {\n\t\t\t\tevents: [\"execution_complete\", \"cost_update\"],\n\t\t\t\tcommands: [\"prompt\", \"steer\"],\n\t\t\t},\n\t\t};\n\t\tassert.equal(init.protocolVersion, 2);\n\t\tassert.equal(init.sessionId, \"sess_123\");\n\t\tassert.ok(Array.isArray(init.capabilities.events));\n\t\tassert.ok(Array.isArray(init.capabilities.commands));\n\t});\n\n\tit(\"RpcExecutionCompleteEvent has required fields\", () => {\n\t\tconst event: RpcExecutionCompleteEvent = {\n\t\t\ttype: \"execution_complete\",\n\t\t\trunId: \"run_abc\",\n\t\t\tstatus: \"completed\",\n\t\t\tstats: {\n\t\t\t\tsessionFile: \"/tmp/session.json\",\n\t\t\t\tsessionId: \"sess_123\",\n\t\t\t\tuserMessages: 5,\n\t\t\t\tassistantMessages: 5,\n\t\t\t\ttoolCalls: 3,\n\t\t\t\ttoolResults: 3,\n\t\t\t\ttotalMessages: 10,\n\t\t\t\ttokens: { input: 1000, output: 500, cacheRead: 200, cacheWrite: 100, total: 1800 },\n\t\t\t\tcost: 0.05,\n\t\t\t},\n\t\t};\n\t\tassert.equal(event.type, \"execution_complete\");\n\t\tassert.equal(event.runId, \"run_abc\");\n\t\tassert.equal(event.status, \"completed\");\n\t\tassert.ok(event.stats);\n\t\tassert.equal(event.stats.sessionId, \"sess_123\");\n\t});\n\n\tit(\"RpcCostUpdateEvent has required fields\", () => {\n\t\tconst event: RpcCostUpdateEvent = {\n\t\t\ttype: \"cost_update\",\n\t\t\trunId: \"run_abc\",\n\t\t\tturnCost: 0.01,\n\t\t\tcumulativeCost: 0.05,\n\t\t\ttokens: { input: 500, output: 200, cacheRead: 100, cacheWrite: 50 },\n\t\t};\n\t\tassert.equal(event.type, \"cost_update\");\n\t\tassert.equal(event.runId, \"run_abc\");\n\t\tassert.equal(event.turnCost, 0.01);\n\t\tassert.equal(event.cumulativeCost, 0.05);\n\t\tassert.ok(event.tokens);\n\t});\n\n\tit(\"SessionStats has all expected fields\", () => {\n\t\tconst stats: SessionStats = {\n\t\t\tsessionFile: \"/tmp/session.json\",\n\t\t\tsessionId: \"s1\",\n\t\t\tuserMessages: 10,\n\t\t\tassistantMessages: 10,\n\t\t\ttoolCalls: 5,\n\t\t\ttoolResults: 5,\n\t\t\ttotalMessages: 20,\n\t\t\ttokens: { input: 2000, output: 1000, cacheRead: 500, cacheWrite: 200, total: 3700 },\n\t\t\tcost: 0.10,\n\t\t};\n\t\tassert.equal(stats.sessionId, \"s1\");\n\t\tassert.equal(stats.userMessages, 10);\n\t\tassert.equal(stats.tokens.total, 3700);\n\t\tassert.equal(stats.cost, 0.10);\n\t});\n\n\tit(\"RpcProtocolVersion accepts 1 and 2\", () => {\n\t\tconst v1: RpcProtocolVersion = 1;\n\t\tconst v2: RpcProtocolVersion = 2;\n\t\tassert.equal(v1, 1);\n\t\tassert.equal(v2, 2);\n\t});\n\n\tit(\"RpcV2Event discriminated union covers both event types\", () => {\n\t\tconst events: RpcV2Event[] = [\n\t\t\t{\n\t\t\t\ttype: \"execution_complete\",\n\t\t\t\trunId: \"r1\",\n\t\t\t\tstatus: \"completed\",\n\t\t\t\tstats: {\n\t\t\t\t\tsessionFile: undefined,\n\t\t\t\t\tsessionId: \"s1\",\n\t\t\t\t\tuserMessages: 1,\n\t\t\t\t\tassistantMessages: 1,\n\t\t\t\t\ttoolCalls: 0,\n\t\t\t\t\ttoolResults: 0,\n\t\t\t\t\ttotalMessages: 2,\n\t\t\t\t\ttokens: { input: 100, output: 50, cacheRead: 0, cacheWrite: 0, total: 150 },\n\t\t\t\t\tcost: 0.001,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: \"cost_update\",\n\t\t\t\trunId: \"r1\",\n\t\t\t\tturnCost: 0.001,\n\t\t\t\tcumulativeCost: 0.001,\n\t\t\t\ttokens: { input: 100, output: 50, cacheRead: 0, cacheWrite: 0 },\n\t\t\t},\n\t\t];\n\t\tassert.equal(events.length, 2);\n\t\tassert.equal(events[0].type, \"execution_complete\");\n\t\tassert.equal(events[1].type, \"cost_update\");\n\t});\n});\n\n// ============================================================================\n// RpcClient Construction Tests\n// ============================================================================\n\ndescribe(\"RpcClient construction\", () => {\n\tit(\"creates with default options\", () => {\n\t\tconst client = new RpcClient();\n\t\tassert.ok(client);\n\t});\n\n\tit(\"creates with custom options\", () => {\n\t\tconst client = new RpcClient({\n\t\t\tcliPath: \"/usr/local/bin/gsd\",\n\t\t\tcwd: \"/tmp\",\n\t\t\tenv: { NODE_ENV: \"test\" },\n\t\t\tprovider: \"anthropic\",\n\t\t\tmodel: \"claude-sonnet\",\n\t\t\targs: [\"--verbose\"],\n\t\t});\n\t\tassert.ok(client);\n\t});\n});\n\n// ============================================================================\n// events() Generator Tests\n// ============================================================================\n\ndescribe(\"events() async generator\", () => {\n\tit(\"yields events from a mock stream in order\", async () => {\n\t\tconst client = new RpcClient();\n\n\t\t// Reach into the client to set up a mock process with a PassThrough stdout\n\t\tconst mockStdout = new PassThrough();\n\t\tconst mockStderr = new PassThrough();\n\t\tconst mockStdin = new PassThrough();\n\n\t\t// Simulate a started process by setting internal state\n\t\t// We use Object.assign to set private fields for testing\n\t\tconst clientAny = client as any;\n\t\tclientAny.process = {\n\t\t\tstdout: mockStdout,\n\t\t\tstderr: mockStderr,\n\t\t\tstdin: mockStdin,\n\t\t\texitCode: null,\n\t\t\tkill: () => {},\n\t\t\ton: (event: string, handler: (...args: any[]) => void) => {\n\t\t\t\tif (event === \"exit\") {\n\t\t\t\t\t// Store exit handler so we can trigger it\n\t\t\t\t\tclientAny._testExitHandler = handler;\n\t\t\t\t}\n\t\t\t},\n\t\t\tremoveListener: () => {},\n\t\t};\n\n\t\t// Attach the JSONL reader like start() does\n\t\tclientAny.stopReadingStdout = attachJsonlLineReader(mockStdout, (line: string) => {\n\t\t\tclientAny.handleLine(line);\n\t\t});\n\n\t\t// Collect events from the generator\n\t\tconst received: SdkAgentEvent[] = [];\n\t\tconst genPromise = (async () => {\n\t\t\tfor await (const event of client.events()) {\n\t\t\t\treceived.push(event);\n\t\t\t\tif (event.type === \"done\") break;\n\t\t\t}\n\t\t})();\n\n\t\t// Simulate server sending events\n\t\tawait new Promise((r) => setTimeout(r, 20));\n\t\tmockStdout.write(serializeJsonLine({ type: \"agent_start\", runId: \"r1\" }));\n\t\tawait new Promise((r) => setTimeout(r, 20));\n\t\tmockStdout.write(serializeJsonLine({ type: \"token\", text: \"hello\" }));\n\t\tawait new Promise((r) => setTimeout(r, 20));\n\t\tmockStdout.write(serializeJsonLine({ type: \"done\" }));\n\n\t\tawait genPromise;\n\n\t\tassert.equal(received.length, 3);\n\t\tassert.equal(received[0].type, \"agent_start\");\n\t\tassert.equal(received[1].type, \"token\");\n\t\tassert.equal(received[2].type, \"done\");\n\t});\n\n\tit(\"terminates when process exits\", async () => {\n\t\tconst client = new RpcClient();\n\t\tconst mockStdout = new PassThrough();\n\t\tconst mockStderr = new PassThrough();\n\t\tconst mockStdin = new PassThrough();\n\n\t\tconst exitHandlers: Array<() => void> = [];\n\t\tconst clientAny = client as any;\n\t\tclientAny.process = {\n\t\t\tstdout: mockStdout,\n\t\t\tstderr: mockStderr,\n\t\t\tstdin: mockStdin,\n\t\t\texitCode: null,\n\t\t\tkill: () => {},\n\t\t\ton: (event: string, handler: () => void) => {\n\t\t\t\tif (event === \"exit\") exitHandlers.push(handler);\n\t\t\t},\n\t\t\tremoveListener: (event: string, handler: () => void) => {\n\t\t\t\tconst idx = exitHandlers.indexOf(handler);\n\t\t\t\tif (idx !== -1) exitHandlers.splice(idx, 1);\n\t\t\t},\n\t\t};\n\n\t\tclientAny.stopReadingStdout = attachJsonlLineReader(mockStdout, (line: string) => {\n\t\t\tclientAny.handleLine(line);\n\t\t});\n\n\t\tconst received: SdkAgentEvent[] = [];\n\t\tconst genPromise = (async () => {\n\t\t\tfor await (const event of client.events()) {\n\t\t\t\treceived.push(event);\n\t\t\t}\n\t\t})();\n\n\t\t// Send one event, then simulate process exit\n\t\tawait new Promise((r) => setTimeout(r, 20));\n\t\tmockStdout.write(serializeJsonLine({ type: \"agent_start\" }));\n\t\tawait new Promise((r) => setTimeout(r, 20));\n\n\t\t// Fire exit handlers\n\t\tfor (const h of exitHandlers) h();\n\n\t\tawait genPromise;\n\n\t\tassert.equal(received.length, 1);\n\t\tassert.equal(received[0].type, \"agent_start\");\n\t});\n\n\tit(\"throws if client not started\", async () => {\n\t\tconst client = new RpcClient();\n\t\tawait assert.rejects(async () => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t\tfor await (const _event of client.events()) {\n\t\t\t\t// should not reach\n\t\t\t}\n\t\t}, /Client not started/);\n\t});\n});\n\n// ============================================================================\n// sendUIResponse Serialization Test\n// ============================================================================\n\ndescribe(\"sendUIResponse serialization\", () => {\n\tit(\"writes correct JSONL to stdin\", () => {\n\t\tconst client = new RpcClient();\n\t\tconst chunks: string[] = [];\n\t\tconst mockStdin = {\n\t\t\twrite: (data: string) => {\n\t\t\t\tchunks.push(data);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t};\n\n\t\tconst clientAny = client as any;\n\t\tclientAny.process = { stdin: mockStdin };\n\n\t\tclient.sendUIResponse(\"ui_1\", { value: \"hello\" });\n\n\t\tassert.equal(chunks.length, 1);\n\t\tconst parsed = JSON.parse(chunks[0].trim());\n\t\tassert.equal(parsed.type, \"extension_ui_response\");\n\t\tassert.equal(parsed.id, \"ui_1\");\n\t\tassert.equal(parsed.value, \"hello\");\n\t});\n\n\tit(\"serializes confirmed response\", () => {\n\t\tconst client = new RpcClient();\n\t\tconst chunks: string[] = [];\n\t\tconst mockStdin = {\n\t\t\twrite: (data: string) => {\n\t\t\t\tchunks.push(data);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t};\n\t\tconst clientAny = client as any;\n\t\tclientAny.process = { stdin: mockStdin };\n\n\t\tclient.sendUIResponse(\"ui_2\", { confirmed: true });\n\n\t\tconst parsed = JSON.parse(chunks[0].trim());\n\t\tassert.equal(parsed.confirmed, true);\n\t\tassert.equal(parsed.id, \"ui_2\");\n\t});\n\n\tit(\"serializes cancelled response\", () => {\n\t\tconst client = new RpcClient();\n\t\tconst chunks: string[] = [];\n\t\tconst mockStdin = {\n\t\t\twrite: (data: string) => {\n\t\t\t\tchunks.push(data);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t};\n\t\tconst clientAny = client as any;\n\t\tclientAny.process = { stdin: mockStdin };\n\n\t\tclient.sendUIResponse(\"ui_3\", { cancelled: true });\n\n\t\tconst parsed = JSON.parse(chunks[0].trim());\n\t\tassert.equal(parsed.cancelled, true);\n\t});\n});\n\n// ============================================================================\n// init/shutdown/subscribe Serialization Tests\n// ============================================================================\n\ndescribe(\"v2 command serialization\", () => {\n\t// Helper: capture what the client sends to stdin\n\tfunction createMockClient(): { client: RpcClient; sent: any[]; respondNext: (data?: any) => void } {\n\t\tconst client = new RpcClient();\n\t\tconst sent: any[] = [];\n\t\tlet respondFn: ((data: any) => void) | null = null;\n\n\t\tconst clientAny = client as any;\n\t\tclientAny.process = {\n\t\t\tstdin: {\n\t\t\t\twrite: (data: string) => {\n\t\t\t\t\tconst parsed = JSON.parse(data.trim());\n\t\t\t\t\tsent.push(parsed);\n\t\t\t\t\t// Auto-respond with success after a tick\n\t\t\t\t\tif (respondFn) {\n\t\t\t\t\t\tsetTimeout(() => respondFn!(parsed), 5);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t},\n\t\t\tstderr: new PassThrough(),\n\t\t\texitCode: null,\n\t\t\tkill: () => {},\n\t\t\ton: () => {},\n\t\t\tremoveListener: () => {},\n\t\t};\n\n\t\tconst respondNext = (overrides: any = {}) => {\n\t\t\trespondFn = (parsed) => {\n\t\t\t\tconst response = {\n\t\t\t\t\ttype: \"response\",\n\t\t\t\t\tid: parsed.id,\n\t\t\t\t\tcommand: parsed.type,\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tdata: {},\n\t\t\t\t\t...overrides,\n\t\t\t\t};\n\t\t\t\tclientAny.handleLine(JSON.stringify(response));\n\t\t\t};\n\t\t};\n\n\t\treturn { client, sent, respondNext };\n\t}\n\n\tit(\"init sends correct v2 init command\", async () => {\n\t\tconst { client, sent, respondNext } = createMockClient();\n\t\trespondNext({ data: { protocolVersion: 2, sessionId: \"s1\", capabilities: { events: [], commands: [] } } });\n\n\t\tconst result = await client.init({ clientId: \"test-app\" });\n\n\t\tassert.equal(sent.length, 1);\n\t\tassert.equal(sent[0].type, \"init\");\n\t\tassert.equal(sent[0].protocolVersion, 2);\n\t\tassert.equal(sent[0].clientId, \"test-app\");\n\t\tassert.equal(result.protocolVersion, 2);\n\t\tassert.equal(result.sessionId, \"s1\");\n\t});\n\n\tit(\"shutdown sends shutdown command\", async () => {\n\t\tconst { client, sent, respondNext } = createMockClient();\n\n\t\t// Override the process exit wait\n\t\tconst clientAny = client as any;\n\t\tconst originalProcess = clientAny.process;\n\t\tconst exitHandlers: Array<(code: number) => void> = [];\n\t\tclientAny.process = {\n\t\t\t...originalProcess,\n\t\t\ton: (event: string, handler: (code: number) => void) => {\n\t\t\t\tif (event === \"exit\") exitHandlers.push(handler);\n\t\t\t},\n\t\t};\n\n\t\trespondNext();\n\n\t\t// Call shutdown and simulate process exit\n\t\tconst shutdownPromise = client.shutdown();\n\t\tawait new Promise((r) => setTimeout(r, 20));\n\t\tfor (const h of exitHandlers) h(0);\n\n\t\tawait shutdownPromise;\n\n\t\tassert.equal(sent.length, 1);\n\t\tassert.equal(sent[0].type, \"shutdown\");\n\t});\n\n\tit(\"subscribe sends subscribe command with event list\", async () => {\n\t\tconst { client, sent, respondNext } = createMockClient();\n\t\trespondNext();\n\n\t\tawait client.subscribe([\"execution_complete\", \"cost_update\"]);\n\n\t\tassert.equal(sent.length, 1);\n\t\tassert.equal(sent[0].type, \"subscribe\");\n\t\tassert.deepEqual(sent[0].events, [\"execution_complete\", \"cost_update\"]);\n\t});\n\n\tit(\"subscribe with wildcard\", async () => {\n\t\tconst { client, sent, respondNext } = createMockClient();\n\t\trespondNext();\n\n\t\tawait client.subscribe([\"*\"]);\n\n\t\tassert.equal(sent[0].events.length, 1);\n\t\tassert.equal(sent[0].events[0], \"*\");\n\t});\n});\n"]}
1
+ {"version":3,"file":"rpc-client.test.js","sourceRoot":"","sources":["../src/rpc-client.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, it } from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { PassThrough } from \"node:stream\";\nimport { once } from \"node:events\";\nimport { serializeJsonLine, attachJsonlLineReader } from \"./jsonl.js\";\nimport type {\n\tRpcInitResult,\n\tRpcExecutionCompleteEvent,\n\tRpcCostUpdateEvent,\n\tRpcProtocolVersion,\n\tSessionStats,\n\tRpcV2Event,\n} from \"./rpc-types.js\";\nimport { RpcClient } from \"./rpc-client.js\";\nimport type { SdkAgentEvent } from \"./rpc-client.js\";\n\n/**\n * Flush pending microtasks and one turn of the macrotask queue.\n *\n * Used in places where the test needs \"every already-queued stream event has\n * been delivered\" — cheaper than a wall-clock sleep and deterministic because\n * `setImmediate` runs strictly after any I/O callbacks already queued by a\n * synchronous `stream.write(...)`.\n */\nfunction flushIO(): Promise<void> {\n\treturn new Promise((resolve) => setImmediate(resolve));\n}\n\n// ============================================================================\n// JSONL Tests\n// ============================================================================\n\ndescribe(\"serializeJsonLine\", () => {\n\tit(\"produces valid JSON terminated with LF\", () => {\n\t\tconst result = serializeJsonLine({ type: \"test\", value: 42 });\n\t\tassert.ok(result.endsWith(\"\\n\"), \"must end with LF\");\n\t\tconst parsed = JSON.parse(result.trim());\n\t\tassert.equal(parsed.type, \"test\");\n\t\tassert.equal(parsed.value, 42);\n\t});\n\n\tit(\"serializes strings with special characters\", () => {\n\t\tconst result = serializeJsonLine({ msg: \"hello\\nworld\" });\n\t\tassert.ok(result.endsWith(\"\\n\"));\n\t\t// The embedded \\n must be escaped inside the JSON — only the trailing LF is the framing delimiter\n\t\tconst lines = result.split(\"\\n\");\n\t\t// Should be exactly 2 parts: the JSON line and the empty string after trailing LF\n\t\tassert.equal(lines.length, 2);\n\t\tassert.equal(lines[1], \"\");\n\t\tconst parsed = JSON.parse(lines[0]);\n\t\tassert.equal(parsed.msg, \"hello\\nworld\");\n\t});\n\n\tit(\"handles empty objects\", () => {\n\t\tconst result = serializeJsonLine({});\n\t\tassert.equal(result, \"{}\\n\");\n\t});\n});\n\ndescribe(\"attachJsonlLineReader\", () => {\n\tit(\"splits on LF correctly\", async () => {\n\t\tconst stream = new PassThrough();\n\t\tconst lines: string[] = [];\n\n\t\tattachJsonlLineReader(stream, (line) => lines.push(line));\n\n\t\tstream.write('{\"a\":1}\\n{\"b\":2}\\n');\n\t\tstream.end();\n\n\t\t// The reader registers its `end` listener first; awaiting `end` here\n\t\t// runs strictly after the reader has drained any trailing buffer.\n\t\tawait once(stream, \"end\");\n\n\t\tassert.equal(lines.length, 2);\n\t\tassert.equal(JSON.parse(lines[0]).a, 1);\n\t\tassert.equal(JSON.parse(lines[1]).b, 2);\n\t});\n\n\tit(\"handles chunked data across boundaries\", async () => {\n\t\tconst stream = new PassThrough();\n\t\tconst lines: string[] = [];\n\n\t\tattachJsonlLineReader(stream, (line) => lines.push(line));\n\n\t\t// Write in fragments that split mid-line\n\t\tstream.write('{\"type\":\"hel');\n\t\tstream.write('lo\"}\\n{\"type\":\"w');\n\t\tstream.write('orld\"}\\n');\n\t\tstream.end();\n\n\t\tawait once(stream, \"end\");\n\n\t\tassert.equal(lines.length, 2);\n\t\tassert.equal(JSON.parse(lines[0]).type, \"hello\");\n\t\tassert.equal(JSON.parse(lines[1]).type, \"world\");\n\t});\n\n\tit(\"emits trailing data on stream end\", async () => {\n\t\tconst stream = new PassThrough();\n\t\tconst lines: string[] = [];\n\n\t\tattachJsonlLineReader(stream, (line) => lines.push(line));\n\n\t\tstream.write('{\"final\":true}');\n\t\tstream.end();\n\n\t\tawait once(stream, \"end\");\n\n\t\tassert.equal(lines.length, 1);\n\t\tassert.equal(JSON.parse(lines[0]).final, true);\n\t});\n\n\tit(\"returns a detach function that stops reading\", async () => {\n\t\tconst stream = new PassThrough();\n\t\tconst lines: string[] = [];\n\n\t\t// Use an explicit promise to signal \"first line has been observed\".\n\t\t// This is deterministic — we resume exactly when the reader fires the\n\t\t// callback, not after an arbitrary wall-clock delay.\n\t\tlet signalFirstLine!: () => void;\n\t\tconst firstLineSeen = new Promise<void>((resolve) => {\n\t\t\tsignalFirstLine = resolve;\n\t\t});\n\n\t\tconst detach = attachJsonlLineReader(stream, (line) => {\n\t\t\tlines.push(line);\n\t\t\tif (lines.length === 1) signalFirstLine();\n\t\t});\n\n\t\tstream.write('{\"a\":1}\\n');\n\t\tawait firstLineSeen;\n\t\tassert.equal(lines.length, 1);\n\n\t\tdetach();\n\n\t\tstream.write('{\"b\":2}\\n');\n\t\tstream.end();\n\t\t// Drain any queued data events post-detach. `setImmediate` runs strictly\n\t\t// after any 'data' events that were already queued by the write above.\n\t\tawait flushIO();\n\n\t\t// Should still be 1 — detach removed listeners\n\t\tassert.equal(lines.length, 1);\n\t});\n\n\tit(\"strips CR from CRLF line endings\", async () => {\n\t\tconst stream = new PassThrough();\n\t\tconst lines: string[] = [];\n\n\t\tattachJsonlLineReader(stream, (line) => lines.push(line));\n\n\t\tstream.write('{\"v\":1}\\r\\n');\n\t\tstream.end();\n\n\t\tawait once(stream, \"end\");\n\n\t\tassert.equal(lines.length, 1);\n\t\tassert.equal(JSON.parse(lines[0]).v, 1);\n\t});\n});\n\n// ============================================================================\n// JSONL Round-Trip Tests\n//\n// These previously lived under a \"type shapes\" block that only asserted that\n// a typed literal retained its own field values — pure type-system\n// tautologies. They are now replaced with round-trips through\n// `serializeJsonLine` + `JSON.parse`, which exercises the actual framing\n// pipeline the wire protocol uses. A regression where `serializeJsonLine`\n// mangles payloads or the LF terminator will now fail these tests.\n// ============================================================================\n\ndescribe(\"JSONL round-trip of v2 payloads\", () => {\n\tfunction roundTrip<T>(value: T): T {\n\t\tconst serialized = serializeJsonLine(value);\n\t\tassert.ok(serialized.endsWith(\"\\n\"), \"wire format must terminate with LF\");\n\t\t// Ensure we did not emit embedded unescaped LFs that would corrupt framing\n\t\tassert.equal(serialized.indexOf(\"\\n\"), serialized.length - 1, \"no unescaped LF inside payload\");\n\t\treturn JSON.parse(serialized.trim()) as T;\n\t}\n\n\tit(\"RpcInitResult round-trips through serializeJsonLine\", () => {\n\t\tconst init: RpcInitResult = {\n\t\t\tprotocolVersion: 2,\n\t\t\tsessionId: \"sess_123\",\n\t\t\tcapabilities: {\n\t\t\t\tevents: [\"execution_complete\", \"cost_update\"],\n\t\t\t\tcommands: [\"prompt\", \"steer\"],\n\t\t\t},\n\t\t};\n\t\tconst parsed = roundTrip(init);\n\t\tassert.deepEqual(parsed, init);\n\t});\n\n\tit(\"RpcExecutionCompleteEvent round-trips preserving nested stats\", () => {\n\t\tconst event: RpcExecutionCompleteEvent = {\n\t\t\ttype: \"execution_complete\",\n\t\t\trunId: \"run_abc\",\n\t\t\tstatus: \"completed\",\n\t\t\tstats: {\n\t\t\t\tsessionFile: \"/tmp/session.json\",\n\t\t\t\tsessionId: \"sess_123\",\n\t\t\t\tuserMessages: 5,\n\t\t\t\tassistantMessages: 5,\n\t\t\t\ttoolCalls: 3,\n\t\t\t\ttoolResults: 3,\n\t\t\t\ttotalMessages: 10,\n\t\t\t\ttokens: { input: 1000, output: 500, cacheRead: 200, cacheWrite: 100, total: 1800 },\n\t\t\t\tcost: 0.05,\n\t\t\t},\n\t\t};\n\t\tconst parsed = roundTrip(event);\n\t\tassert.deepEqual(parsed, event);\n\t});\n\n\tit(\"RpcCostUpdateEvent round-trips with numeric precision intact\", () => {\n\t\tconst event: RpcCostUpdateEvent = {\n\t\t\ttype: \"cost_update\",\n\t\t\trunId: \"run_abc\",\n\t\t\tturnCost: 0.01,\n\t\t\tcumulativeCost: 0.05,\n\t\t\ttokens: { input: 500, output: 200, cacheRead: 100, cacheWrite: 50 },\n\t\t};\n\t\tconst parsed = roundTrip(event);\n\t\tassert.deepEqual(parsed, event);\n\t});\n\n\tit(\"SessionStats round-trips preserving totals\", () => {\n\t\tconst stats: SessionStats = {\n\t\t\tsessionFile: \"/tmp/session.json\",\n\t\t\tsessionId: \"s1\",\n\t\t\tuserMessages: 10,\n\t\t\tassistantMessages: 10,\n\t\t\ttoolCalls: 5,\n\t\t\ttoolResults: 5,\n\t\t\ttotalMessages: 20,\n\t\t\ttokens: { input: 2000, output: 1000, cacheRead: 500, cacheWrite: 200, total: 3700 },\n\t\t\tcost: 0.1,\n\t\t};\n\t\tconst parsed = roundTrip(stats);\n\t\tassert.deepEqual(parsed, stats);\n\t\tassert.equal(\n\t\t\tparsed.tokens.input + parsed.tokens.output + parsed.tokens.cacheRead + parsed.tokens.cacheWrite,\n\t\t\tparsed.tokens.total,\n\t\t\t\"tokens.total should equal the sum of components after round-trip\",\n\t\t);\n\t});\n\n\tit(\"RpcProtocolVersion values 1 and 2 survive round-trip\", () => {\n\t\tconst v1: RpcProtocolVersion = 1;\n\t\tconst v2: RpcProtocolVersion = 2;\n\t\tassert.strictEqual(roundTrip({ v: v1 }).v, 1);\n\t\tassert.strictEqual(roundTrip({ v: v2 }).v, 2);\n\t});\n\n\tit(\"RpcV2Event discriminated union survives round-trip for each arm\", () => {\n\t\tconst events: RpcV2Event[] = [\n\t\t\t{\n\t\t\t\ttype: \"execution_complete\",\n\t\t\t\trunId: \"r1\",\n\t\t\t\tstatus: \"completed\",\n\t\t\t\tstats: {\n\t\t\t\t\tsessionFile: undefined,\n\t\t\t\t\tsessionId: \"s1\",\n\t\t\t\t\tuserMessages: 1,\n\t\t\t\t\tassistantMessages: 1,\n\t\t\t\t\ttoolCalls: 0,\n\t\t\t\t\ttoolResults: 0,\n\t\t\t\t\ttotalMessages: 2,\n\t\t\t\t\ttokens: { input: 100, output: 50, cacheRead: 0, cacheWrite: 0, total: 150 },\n\t\t\t\t\tcost: 0.001,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: \"cost_update\",\n\t\t\t\trunId: \"r1\",\n\t\t\t\tturnCost: 0.001,\n\t\t\t\tcumulativeCost: 0.001,\n\t\t\t\ttokens: { input: 100, output: 50, cacheRead: 0, cacheWrite: 0 },\n\t\t\t},\n\t\t];\n\n\t\tfor (const evt of events) {\n\t\t\tconst parsed = roundTrip(evt);\n\t\t\tassert.equal(parsed.type, evt.type, \"discriminator must round-trip\");\n\t\t\tif (parsed.type === \"execution_complete\" && evt.type === \"execution_complete\") {\n\t\t\t\t// `sessionFile: undefined` is dropped by JSON.stringify by design;\n\t\t\t\t// compare the remaining observable fields.\n\t\t\t\tassert.equal(parsed.runId, evt.runId);\n\t\t\t\tassert.equal(parsed.status, evt.status);\n\t\t\t\tassert.deepEqual(parsed.stats.tokens, evt.stats.tokens);\n\t\t\t}\n\t\t\tif (parsed.type === \"cost_update\" && evt.type === \"cost_update\") {\n\t\t\t\tassert.deepEqual(parsed, evt);\n\t\t\t}\n\t\t}\n\t});\n});\n\n// ============================================================================\n// RpcClient Construction Tests\n// ============================================================================\n\ndescribe(\"RpcClient construction\", () => {\n\tit(\"creates with default options\", () => {\n\t\tconst client = new RpcClient();\n\t\tassert.ok(client);\n\t});\n\n\tit(\"creates with custom options\", () => {\n\t\tconst client = new RpcClient({\n\t\t\tcliPath: \"/usr/local/bin/gsd\",\n\t\t\tcwd: \"/tmp\",\n\t\t\tenv: { NODE_ENV: \"test\" },\n\t\t\tprovider: \"anthropic\",\n\t\t\tmodel: \"claude-sonnet\",\n\t\t\targs: [\"--verbose\"],\n\t\t});\n\t\tassert.ok(client);\n\t});\n});\n\n// ============================================================================\n// events() Generator Tests\n// ============================================================================\n\ndescribe(\"events() async generator\", () => {\n\tit(\"yields events from a mock stream in order\", async () => {\n\t\tconst client = new RpcClient();\n\n\t\t// Reach into the client to set up a mock process with a PassThrough stdout\n\t\tconst mockStdout = new PassThrough();\n\t\tconst mockStderr = new PassThrough();\n\t\tconst mockStdin = new PassThrough();\n\n\t\t// Simulate a started process by setting internal state\n\t\t// We use Object.assign to set private fields for testing\n\t\tconst clientAny = client as any;\n\t\tclientAny.process = {\n\t\t\tstdout: mockStdout,\n\t\t\tstderr: mockStderr,\n\t\t\tstdin: mockStdin,\n\t\t\texitCode: null,\n\t\t\tkill: () => {},\n\t\t\ton: (event: string, handler: (...args: any[]) => void) => {\n\t\t\t\tif (event === \"exit\") {\n\t\t\t\t\t// Store exit handler so we can trigger it\n\t\t\t\t\tclientAny._testExitHandler = handler;\n\t\t\t\t}\n\t\t\t},\n\t\t\tremoveListener: () => {},\n\t\t};\n\n\t\t// Attach the JSONL reader like start() does\n\t\tclientAny.stopReadingStdout = attachJsonlLineReader(mockStdout, (line: string) => {\n\t\t\tclientAny.handleLine(line);\n\t\t});\n\n\t\t// Collect events from the generator\n\t\tconst received: SdkAgentEvent[] = [];\n\t\tconst genPromise = (async () => {\n\t\t\tfor await (const event of client.events()) {\n\t\t\t\treceived.push(event);\n\t\t\t\tif (event.type === \"done\") break;\n\t\t\t}\n\t\t})();\n\n\t\t// Drive the mock stream. The PassThrough pipeline delivers 'data'\n\t\t// synchronously off the write; yielding one macrotask between writes\n\t\t// lets the generator's awaiting promise resolve before we queue the\n\t\t// next event, preserving the observable ordering.\n\t\tmockStdout.write(serializeJsonLine({ type: \"agent_start\", runId: \"r1\" }));\n\t\tawait flushIO();\n\t\tmockStdout.write(serializeJsonLine({ type: \"token\", text: \"hello\" }));\n\t\tawait flushIO();\n\t\tmockStdout.write(serializeJsonLine({ type: \"done\" }));\n\n\t\tawait genPromise;\n\n\t\tassert.equal(received.length, 3);\n\t\tassert.equal(received[0].type, \"agent_start\");\n\t\tassert.equal(received[1].type, \"token\");\n\t\tassert.equal(received[2].type, \"done\");\n\t});\n\n\tit(\"terminates when process exits\", async () => {\n\t\tconst client = new RpcClient();\n\t\tconst mockStdout = new PassThrough();\n\t\tconst mockStderr = new PassThrough();\n\t\tconst mockStdin = new PassThrough();\n\n\t\tconst exitHandlers: Array<() => void> = [];\n\t\tconst clientAny = client as any;\n\t\tclientAny.process = {\n\t\t\tstdout: mockStdout,\n\t\t\tstderr: mockStderr,\n\t\t\tstdin: mockStdin,\n\t\t\texitCode: null,\n\t\t\tkill: () => {},\n\t\t\ton: (event: string, handler: () => void) => {\n\t\t\t\tif (event === \"exit\") exitHandlers.push(handler);\n\t\t\t},\n\t\t\tremoveListener: (event: string, handler: () => void) => {\n\t\t\t\tconst idx = exitHandlers.indexOf(handler);\n\t\t\t\tif (idx !== -1) exitHandlers.splice(idx, 1);\n\t\t\t},\n\t\t};\n\n\t\tclientAny.stopReadingStdout = attachJsonlLineReader(mockStdout, (line: string) => {\n\t\t\tclientAny.handleLine(line);\n\t\t});\n\n\t\tconst received: SdkAgentEvent[] = [];\n\t\tconst genPromise = (async () => {\n\t\t\tfor await (const event of client.events()) {\n\t\t\t\treceived.push(event);\n\t\t\t}\n\t\t})();\n\n\t\t// Send one event, let it propagate, then simulate process exit.\n\t\tmockStdout.write(serializeJsonLine({ type: \"agent_start\" }));\n\t\tawait flushIO();\n\n\t\t// Fire exit handlers\n\t\tfor (const h of exitHandlers) h();\n\n\t\tawait genPromise;\n\n\t\tassert.equal(received.length, 1);\n\t\tassert.equal(received[0].type, \"agent_start\");\n\t});\n\n\tit(\"throws if client not started\", async () => {\n\t\tconst client = new RpcClient();\n\t\tawait assert.rejects(async () => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t\tfor await (const _event of client.events()) {\n\t\t\t\t// should not reach\n\t\t\t}\n\t\t}, /Client not started/);\n\t});\n});\n\n// ============================================================================\n// sendUIResponse Serialization Test\n// ============================================================================\n\ndescribe(\"sendUIResponse serialization\", () => {\n\tit(\"writes correct JSONL to stdin\", () => {\n\t\tconst client = new RpcClient();\n\t\tconst chunks: string[] = [];\n\t\tconst mockStdin = {\n\t\t\twrite: (data: string) => {\n\t\t\t\tchunks.push(data);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t};\n\n\t\tconst clientAny = client as any;\n\t\tclientAny.process = { stdin: mockStdin };\n\n\t\tclient.sendUIResponse(\"ui_1\", { value: \"hello\" });\n\n\t\tassert.equal(chunks.length, 1);\n\t\tconst parsed = JSON.parse(chunks[0].trim());\n\t\tassert.equal(parsed.type, \"extension_ui_response\");\n\t\tassert.equal(parsed.id, \"ui_1\");\n\t\tassert.equal(parsed.value, \"hello\");\n\t});\n\n\tit(\"serializes confirmed response\", () => {\n\t\tconst client = new RpcClient();\n\t\tconst chunks: string[] = [];\n\t\tconst mockStdin = {\n\t\t\twrite: (data: string) => {\n\t\t\t\tchunks.push(data);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t};\n\t\tconst clientAny = client as any;\n\t\tclientAny.process = { stdin: mockStdin };\n\n\t\tclient.sendUIResponse(\"ui_2\", { confirmed: true });\n\n\t\tconst parsed = JSON.parse(chunks[0].trim());\n\t\tassert.equal(parsed.confirmed, true);\n\t\tassert.equal(parsed.id, \"ui_2\");\n\t});\n\n\tit(\"serializes cancelled response\", () => {\n\t\tconst client = new RpcClient();\n\t\tconst chunks: string[] = [];\n\t\tconst mockStdin = {\n\t\t\twrite: (data: string) => {\n\t\t\t\tchunks.push(data);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t};\n\t\tconst clientAny = client as any;\n\t\tclientAny.process = { stdin: mockStdin };\n\n\t\tclient.sendUIResponse(\"ui_3\", { cancelled: true });\n\n\t\tconst parsed = JSON.parse(chunks[0].trim());\n\t\tassert.equal(parsed.cancelled, true);\n\t});\n});\n\n// ============================================================================\n// init/shutdown/subscribe Serialization Tests\n// ============================================================================\n\ndescribe(\"v2 command serialization\", () => {\n\t// Helper: capture what the client sends to stdin\n\tfunction createMockClient(): { client: RpcClient; sent: any[]; respondNext: (data?: any) => void } {\n\t\tconst client = new RpcClient();\n\t\tconst sent: any[] = [];\n\t\tlet respondFn: ((data: any) => void) | null = null;\n\n\t\tconst clientAny = client as any;\n\t\tclientAny.process = {\n\t\t\tstdin: {\n\t\t\t\twrite: (data: string) => {\n\t\t\t\t\tconst parsed = JSON.parse(data.trim());\n\t\t\t\t\tsent.push(parsed);\n\t\t\t\t\t// Auto-respond on the microtask queue. This is deterministic —\n\t\t\t\t\t// any `await` in the caller yields before the callback runs,\n\t\t\t\t\t// so the caller's `pendingRequests` entry is installed before\n\t\t\t\t\t// `handleLine` tries to resolve it.\n\t\t\t\t\tif (respondFn) {\n\t\t\t\t\t\tqueueMicrotask(() => respondFn!(parsed));\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t},\n\t\t\tstderr: new PassThrough(),\n\t\t\texitCode: null,\n\t\t\tkill: () => {},\n\t\t\ton: () => {},\n\t\t\tremoveListener: () => {},\n\t\t};\n\n\t\tconst respondNext = (overrides: any = {}) => {\n\t\t\trespondFn = (parsed) => {\n\t\t\t\tconst response = {\n\t\t\t\t\ttype: \"response\",\n\t\t\t\t\tid: parsed.id,\n\t\t\t\t\tcommand: parsed.type,\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tdata: {},\n\t\t\t\t\t...overrides,\n\t\t\t\t};\n\t\t\t\tclientAny.handleLine(JSON.stringify(response));\n\t\t\t};\n\t\t};\n\n\t\treturn { client, sent, respondNext };\n\t}\n\n\tit(\"init sends correct v2 init command\", async () => {\n\t\tconst { client, sent, respondNext } = createMockClient();\n\t\trespondNext({ data: { protocolVersion: 2, sessionId: \"s1\", capabilities: { events: [], commands: [] } } });\n\n\t\tconst result = await client.init({ clientId: \"test-app\" });\n\n\t\tassert.equal(sent.length, 1);\n\t\tassert.equal(sent[0].type, \"init\");\n\t\tassert.equal(sent[0].protocolVersion, 2);\n\t\tassert.equal(sent[0].clientId, \"test-app\");\n\t\tassert.equal(result.protocolVersion, 2);\n\t\tassert.equal(result.sessionId, \"s1\");\n\t});\n\n\tit(\"shutdown sends shutdown command\", async () => {\n\t\tconst { client, sent, respondNext } = createMockClient();\n\n\t\t// Override the process exit wait\n\t\tconst clientAny = client as any;\n\t\tconst originalProcess = clientAny.process;\n\t\tconst exitHandlers: Array<(code: number) => void> = [];\n\t\tclientAny.process = {\n\t\t\t...originalProcess,\n\t\t\ton: (event: string, handler: (code: number) => void) => {\n\t\t\t\tif (event === \"exit\") exitHandlers.push(handler);\n\t\t\t},\n\t\t};\n\n\t\trespondNext();\n\n\t\t// Call shutdown and simulate process exit. `flushIO` drains the\n\t\t// queued stdin write -> auto-respond -> handleLine chain that our\n\t\t// mock triggers on every `send`, so by the time we fire the exit\n\t\t// handlers the shutdown ack has been observed.\n\t\tconst shutdownPromise = client.shutdown();\n\t\tawait flushIO();\n\t\tawait flushIO();\n\t\tfor (const h of exitHandlers) h(0);\n\n\t\tawait shutdownPromise;\n\n\t\tassert.equal(sent.length, 1);\n\t\tassert.equal(sent[0].type, \"shutdown\");\n\t});\n\n\tit(\"subscribe sends subscribe command with event list\", async () => {\n\t\tconst { client, sent, respondNext } = createMockClient();\n\t\trespondNext();\n\n\t\tawait client.subscribe([\"execution_complete\", \"cost_update\"]);\n\n\t\tassert.equal(sent.length, 1);\n\t\tassert.equal(sent[0].type, \"subscribe\");\n\t\tassert.deepEqual(sent[0].events, [\"execution_complete\", \"cost_update\"]);\n\t});\n\n\tit(\"subscribe with wildcard\", async () => {\n\t\tconst { client, sent, respondNext } = createMockClient();\n\t\trespondNext();\n\n\t\tawait client.subscribe([\"*\"]);\n\n\t\tassert.equal(sent[0].events.length, 1);\n\t\tassert.equal(sent[0].events[0], \"*\");\n\t});\n});\n"]}
@@ -1,8 +1,13 @@
1
1
  {
2
2
  "name": "@gsd-build/rpc-client",
3
- "version": "2.77.0",
3
+ "version": "2.78.0",
4
4
  "description": "Standalone RPC client SDK for GSD — zero internal dependencies",
5
5
  "license": "MIT",
6
+ "gsd": {
7
+ "linkable": true,
8
+ "scope": "@gsd-build",
9
+ "name": "rpc-client"
10
+ },
6
11
  "repository": {
7
12
  "type": "git",
8
13
  "url": "https://github.com/gsd-build/gsd-2.git",
@@ -1,6 +1,7 @@
1
- import { describe, it, beforeEach, afterEach } from "node:test";
1
+ import { describe, it } from "node:test";
2
2
  import assert from "node:assert/strict";
3
3
  import { PassThrough } from "node:stream";
4
+ import { once } from "node:events";
4
5
  import { serializeJsonLine, attachJsonlLineReader } from "./jsonl.js";
5
6
  import type {
6
7
  RpcInitResult,
@@ -13,6 +14,18 @@ import type {
13
14
  import { RpcClient } from "./rpc-client.js";
14
15
  import type { SdkAgentEvent } from "./rpc-client.js";
15
16
 
17
+ /**
18
+ * Flush pending microtasks and one turn of the macrotask queue.
19
+ *
20
+ * Used in places where the test needs "every already-queued stream event has
21
+ * been delivered" — cheaper than a wall-clock sleep and deterministic because
22
+ * `setImmediate` runs strictly after any I/O callbacks already queued by a
23
+ * synchronous `stream.write(...)`.
24
+ */
25
+ function flushIO(): Promise<void> {
26
+ return new Promise((resolve) => setImmediate(resolve));
27
+ }
28
+
16
29
  // ============================================================================
17
30
  // JSONL Tests
18
31
  // ============================================================================
@@ -54,8 +67,9 @@ describe("attachJsonlLineReader", () => {
54
67
  stream.write('{"a":1}\n{"b":2}\n');
55
68
  stream.end();
56
69
 
57
- // Let microtask queue flush
58
- await new Promise((r) => setTimeout(r, 10));
70
+ // The reader registers its `end` listener first; awaiting `end` here
71
+ // runs strictly after the reader has drained any trailing buffer.
72
+ await once(stream, "end");
59
73
 
60
74
  assert.equal(lines.length, 2);
61
75
  assert.equal(JSON.parse(lines[0]).a, 1);
@@ -74,7 +88,7 @@ describe("attachJsonlLineReader", () => {
74
88
  stream.write('orld"}\n');
75
89
  stream.end();
76
90
 
77
- await new Promise((r) => setTimeout(r, 10));
91
+ await once(stream, "end");
78
92
 
79
93
  assert.equal(lines.length, 2);
80
94
  assert.equal(JSON.parse(lines[0]).type, "hello");
@@ -90,7 +104,7 @@ describe("attachJsonlLineReader", () => {
90
104
  stream.write('{"final":true}');
91
105
  stream.end();
92
106
 
93
- await new Promise((r) => setTimeout(r, 10));
107
+ await once(stream, "end");
94
108
 
95
109
  assert.equal(lines.length, 1);
96
110
  assert.equal(JSON.parse(lines[0]).final, true);
@@ -100,17 +114,30 @@ describe("attachJsonlLineReader", () => {
100
114
  const stream = new PassThrough();
101
115
  const lines: string[] = [];
102
116
 
103
- const detach = attachJsonlLineReader(stream, (line) => lines.push(line));
117
+ // Use an explicit promise to signal "first line has been observed".
118
+ // This is deterministic — we resume exactly when the reader fires the
119
+ // callback, not after an arbitrary wall-clock delay.
120
+ let signalFirstLine!: () => void;
121
+ const firstLineSeen = new Promise<void>((resolve) => {
122
+ signalFirstLine = resolve;
123
+ });
124
+
125
+ const detach = attachJsonlLineReader(stream, (line) => {
126
+ lines.push(line);
127
+ if (lines.length === 1) signalFirstLine();
128
+ });
104
129
 
105
130
  stream.write('{"a":1}\n');
106
- await new Promise((r) => setTimeout(r, 10));
131
+ await firstLineSeen;
107
132
  assert.equal(lines.length, 1);
108
133
 
109
134
  detach();
110
135
 
111
136
  stream.write('{"b":2}\n');
112
137
  stream.end();
113
- await new Promise((r) => setTimeout(r, 10));
138
+ // Drain any queued data events post-detach. `setImmediate` runs strictly
139
+ // after any 'data' events that were already queued by the write above.
140
+ await flushIO();
114
141
 
115
142
  // Should still be 1 — detach removed listeners
116
143
  assert.equal(lines.length, 1);
@@ -125,7 +152,7 @@ describe("attachJsonlLineReader", () => {
125
152
  stream.write('{"v":1}\r\n');
126
153
  stream.end();
127
154
 
128
- await new Promise((r) => setTimeout(r, 10));
155
+ await once(stream, "end");
129
156
 
130
157
  assert.equal(lines.length, 1);
131
158
  assert.equal(JSON.parse(lines[0]).v, 1);
@@ -133,11 +160,26 @@ describe("attachJsonlLineReader", () => {
133
160
  });
134
161
 
135
162
  // ============================================================================
136
- // Type Shape Tests
163
+ // JSONL Round-Trip Tests
164
+ //
165
+ // These previously lived under a "type shapes" block that only asserted that
166
+ // a typed literal retained its own field values — pure type-system
167
+ // tautologies. They are now replaced with round-trips through
168
+ // `serializeJsonLine` + `JSON.parse`, which exercises the actual framing
169
+ // pipeline the wire protocol uses. A regression where `serializeJsonLine`
170
+ // mangles payloads or the LF terminator will now fail these tests.
137
171
  // ============================================================================
138
172
 
139
- describe("type shapes", () => {
140
- it("RpcInitResult has protocolVersion, sessionId, capabilities", () => {
173
+ describe("JSONL round-trip of v2 payloads", () => {
174
+ function roundTrip<T>(value: T): T {
175
+ const serialized = serializeJsonLine(value);
176
+ assert.ok(serialized.endsWith("\n"), "wire format must terminate with LF");
177
+ // Ensure we did not emit embedded unescaped LFs that would corrupt framing
178
+ assert.equal(serialized.indexOf("\n"), serialized.length - 1, "no unescaped LF inside payload");
179
+ return JSON.parse(serialized.trim()) as T;
180
+ }
181
+
182
+ it("RpcInitResult round-trips through serializeJsonLine", () => {
141
183
  const init: RpcInitResult = {
142
184
  protocolVersion: 2,
143
185
  sessionId: "sess_123",
@@ -146,13 +188,11 @@ describe("type shapes", () => {
146
188
  commands: ["prompt", "steer"],
147
189
  },
148
190
  };
149
- assert.equal(init.protocolVersion, 2);
150
- assert.equal(init.sessionId, "sess_123");
151
- assert.ok(Array.isArray(init.capabilities.events));
152
- assert.ok(Array.isArray(init.capabilities.commands));
191
+ const parsed = roundTrip(init);
192
+ assert.deepEqual(parsed, init);
153
193
  });
154
194
 
155
- it("RpcExecutionCompleteEvent has required fields", () => {
195
+ it("RpcExecutionCompleteEvent round-trips preserving nested stats", () => {
156
196
  const event: RpcExecutionCompleteEvent = {
157
197
  type: "execution_complete",
158
198
  runId: "run_abc",
@@ -169,14 +209,11 @@ describe("type shapes", () => {
169
209
  cost: 0.05,
170
210
  },
171
211
  };
172
- assert.equal(event.type, "execution_complete");
173
- assert.equal(event.runId, "run_abc");
174
- assert.equal(event.status, "completed");
175
- assert.ok(event.stats);
176
- assert.equal(event.stats.sessionId, "sess_123");
212
+ const parsed = roundTrip(event);
213
+ assert.deepEqual(parsed, event);
177
214
  });
178
215
 
179
- it("RpcCostUpdateEvent has required fields", () => {
216
+ it("RpcCostUpdateEvent round-trips with numeric precision intact", () => {
180
217
  const event: RpcCostUpdateEvent = {
181
218
  type: "cost_update",
182
219
  runId: "run_abc",
@@ -184,14 +221,11 @@ describe("type shapes", () => {
184
221
  cumulativeCost: 0.05,
185
222
  tokens: { input: 500, output: 200, cacheRead: 100, cacheWrite: 50 },
186
223
  };
187
- assert.equal(event.type, "cost_update");
188
- assert.equal(event.runId, "run_abc");
189
- assert.equal(event.turnCost, 0.01);
190
- assert.equal(event.cumulativeCost, 0.05);
191
- assert.ok(event.tokens);
224
+ const parsed = roundTrip(event);
225
+ assert.deepEqual(parsed, event);
192
226
  });
193
227
 
194
- it("SessionStats has all expected fields", () => {
228
+ it("SessionStats round-trips preserving totals", () => {
195
229
  const stats: SessionStats = {
196
230
  sessionFile: "/tmp/session.json",
197
231
  sessionId: "s1",
@@ -201,22 +235,25 @@ describe("type shapes", () => {
201
235
  toolResults: 5,
202
236
  totalMessages: 20,
203
237
  tokens: { input: 2000, output: 1000, cacheRead: 500, cacheWrite: 200, total: 3700 },
204
- cost: 0.10,
238
+ cost: 0.1,
205
239
  };
206
- assert.equal(stats.sessionId, "s1");
207
- assert.equal(stats.userMessages, 10);
208
- assert.equal(stats.tokens.total, 3700);
209
- assert.equal(stats.cost, 0.10);
240
+ const parsed = roundTrip(stats);
241
+ assert.deepEqual(parsed, stats);
242
+ assert.equal(
243
+ parsed.tokens.input + parsed.tokens.output + parsed.tokens.cacheRead + parsed.tokens.cacheWrite,
244
+ parsed.tokens.total,
245
+ "tokens.total should equal the sum of components after round-trip",
246
+ );
210
247
  });
211
248
 
212
- it("RpcProtocolVersion accepts 1 and 2", () => {
249
+ it("RpcProtocolVersion values 1 and 2 survive round-trip", () => {
213
250
  const v1: RpcProtocolVersion = 1;
214
251
  const v2: RpcProtocolVersion = 2;
215
- assert.equal(v1, 1);
216
- assert.equal(v2, 2);
252
+ assert.strictEqual(roundTrip({ v: v1 }).v, 1);
253
+ assert.strictEqual(roundTrip({ v: v2 }).v, 2);
217
254
  });
218
255
 
219
- it("RpcV2Event discriminated union covers both event types", () => {
256
+ it("RpcV2Event discriminated union survives round-trip for each arm", () => {
220
257
  const events: RpcV2Event[] = [
221
258
  {
222
259
  type: "execution_complete",
@@ -242,9 +279,21 @@ describe("type shapes", () => {
242
279
  tokens: { input: 100, output: 50, cacheRead: 0, cacheWrite: 0 },
243
280
  },
244
281
  ];
245
- assert.equal(events.length, 2);
246
- assert.equal(events[0].type, "execution_complete");
247
- assert.equal(events[1].type, "cost_update");
282
+
283
+ for (const evt of events) {
284
+ const parsed = roundTrip(evt);
285
+ assert.equal(parsed.type, evt.type, "discriminator must round-trip");
286
+ if (parsed.type === "execution_complete" && evt.type === "execution_complete") {
287
+ // `sessionFile: undefined` is dropped by JSON.stringify by design;
288
+ // compare the remaining observable fields.
289
+ assert.equal(parsed.runId, evt.runId);
290
+ assert.equal(parsed.status, evt.status);
291
+ assert.deepEqual(parsed.stats.tokens, evt.stats.tokens);
292
+ }
293
+ if (parsed.type === "cost_update" && evt.type === "cost_update") {
294
+ assert.deepEqual(parsed, evt);
295
+ }
296
+ }
248
297
  });
249
298
  });
250
299
 
@@ -316,12 +365,14 @@ describe("events() async generator", () => {
316
365
  }
317
366
  })();
318
367
 
319
- // Simulate server sending events
320
- await new Promise((r) => setTimeout(r, 20));
368
+ // Drive the mock stream. The PassThrough pipeline delivers 'data'
369
+ // synchronously off the write; yielding one macrotask between writes
370
+ // lets the generator's awaiting promise resolve before we queue the
371
+ // next event, preserving the observable ordering.
321
372
  mockStdout.write(serializeJsonLine({ type: "agent_start", runId: "r1" }));
322
- await new Promise((r) => setTimeout(r, 20));
373
+ await flushIO();
323
374
  mockStdout.write(serializeJsonLine({ type: "token", text: "hello" }));
324
- await new Promise((r) => setTimeout(r, 20));
375
+ await flushIO();
325
376
  mockStdout.write(serializeJsonLine({ type: "done" }));
326
377
 
327
378
  await genPromise;
@@ -366,10 +417,9 @@ describe("events() async generator", () => {
366
417
  }
367
418
  })();
368
419
 
369
- // Send one event, then simulate process exit
370
- await new Promise((r) => setTimeout(r, 20));
420
+ // Send one event, let it propagate, then simulate process exit.
371
421
  mockStdout.write(serializeJsonLine({ type: "agent_start" }));
372
- await new Promise((r) => setTimeout(r, 20));
422
+ await flushIO();
373
423
 
374
424
  // Fire exit handlers
375
425
  for (const h of exitHandlers) h();
@@ -473,9 +523,12 @@ describe("v2 command serialization", () => {
473
523
  write: (data: string) => {
474
524
  const parsed = JSON.parse(data.trim());
475
525
  sent.push(parsed);
476
- // Auto-respond with success after a tick
526
+ // Auto-respond on the microtask queue. This is deterministic —
527
+ // any `await` in the caller yields before the callback runs,
528
+ // so the caller's `pendingRequests` entry is installed before
529
+ // `handleLine` tries to resolve it.
477
530
  if (respondFn) {
478
- setTimeout(() => respondFn!(parsed), 5);
531
+ queueMicrotask(() => respondFn!(parsed));
479
532
  }
480
533
  return true;
481
534
  },
@@ -534,9 +587,13 @@ describe("v2 command serialization", () => {
534
587
 
535
588
  respondNext();
536
589
 
537
- // Call shutdown and simulate process exit
590
+ // Call shutdown and simulate process exit. `flushIO` drains the
591
+ // queued stdin write -> auto-respond -> handleLine chain that our
592
+ // mock triggers on every `send`, so by the time we fire the exit
593
+ // handlers the shutdown ack has been observed.
538
594
  const shutdownPromise = client.shutdown();
539
- await new Promise((r) => setTimeout(r, 20));
595
+ await flushIO();
596
+ await flushIO();
540
597
  for (const h of exitHandlers) h(0);
541
598
 
542
599
  await shutdownPromise;