@prestyj/cli 5.12.0 → 5.16.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 (1245) hide show
  1. package/README.md +51 -36
  2. package/assets/skills/bulletproof/SKILL.md +158 -0
  3. package/assets/skills/bulletproof/references/agent-surface.md +82 -0
  4. package/assets/skills/bulletproof/references/audit-protocol.md +147 -0
  5. package/assets/skills/bulletproof/references/platform-playbooks.md +176 -0
  6. package/assets/skills/bulletproof/references/provenance.md +45 -0
  7. package/assets/skills/bulletproof/references/secure-defaults.md +108 -0
  8. package/assets/skills/bulletproof/references/supply-chain.md +76 -0
  9. package/assets/skills/bulletproof/references/threat-landscape.md +74 -0
  10. package/assets/skills/bulletproof/references/verification.md +65 -0
  11. package/assets/skills/clarify/SKILL.md +30 -0
  12. package/assets/skills/code-review/SKILL.md +30 -0
  13. package/assets/skills/durable/SKILL.md +111 -0
  14. package/assets/skills/durable/references/backups-and-runtime.md +86 -0
  15. package/assets/skills/durable/references/migrations-and-schema.md +79 -0
  16. package/assets/skills/lean/SKILL.md +110 -0
  17. package/assets/skills/lean/references/memory-and-processes.md +98 -0
  18. package/assets/skills/lean/references/playbooks.md +107 -0
  19. package/assets/skills/root-cause/SKILL.md +36 -0
  20. package/assets/skills/shared-language/SKILL.md +30 -0
  21. package/assets/skills/tdd/SKILL.md +30 -0
  22. package/dist/app-sidecar.js +486 -95
  23. package/dist/app-sidecar.js.map +1 -1
  24. package/dist/chat-agents/research.d.ts +1 -1
  25. package/dist/chat-agents/research.d.ts.map +1 -1
  26. package/dist/chat-agents/research.js +1 -1
  27. package/dist/chat-agents/research.js.map +1 -1
  28. package/dist/cli/mcp.js +30 -10
  29. package/dist/cli/mcp.js.map +1 -1
  30. package/dist/cli/shared.d.ts.map +1 -1
  31. package/dist/cli/shared.js +2 -0
  32. package/dist/cli/shared.js.map +1 -1
  33. package/dist/cli.d.ts.map +1 -1
  34. package/dist/cli.js +16 -7
  35. package/dist/cli.js.map +1 -1
  36. package/dist/config.d.ts +12 -0
  37. package/dist/config.d.ts.map +1 -1
  38. package/dist/config.js +16 -0
  39. package/dist/config.js.map +1 -1
  40. package/dist/core/agent-session.d.ts +65 -4
  41. package/dist/core/agent-session.d.ts.map +1 -1
  42. package/dist/core/agent-session.js +281 -22
  43. package/dist/core/agent-session.js.map +1 -1
  44. package/dist/core/agents.d.ts +2 -3
  45. package/dist/core/agents.d.ts.map +1 -1
  46. package/dist/core/agents.js +4 -5
  47. package/dist/core/agents.js.map +1 -1
  48. package/dist/core/api-benchmark.d.ts +1 -1
  49. package/dist/core/api-benchmark.js +2 -2
  50. package/dist/core/ask-user.d.ts +63 -0
  51. package/dist/core/ask-user.d.ts.map +1 -0
  52. package/dist/core/ask-user.js +40 -0
  53. package/dist/core/ask-user.js.map +1 -0
  54. package/dist/core/auth-providers.d.ts +6 -0
  55. package/dist/core/auth-providers.d.ts.map +1 -1
  56. package/dist/core/auth-providers.js +30 -24
  57. package/dist/core/auth-providers.js.map +1 -1
  58. package/dist/core/bundled-agents.d.ts.map +1 -1
  59. package/dist/core/bundled-agents.js +17 -5
  60. package/dist/core/bundled-agents.js.map +1 -1
  61. package/dist/core/context-limits.d.ts +35 -0
  62. package/dist/core/context-limits.d.ts.map +1 -0
  63. package/dist/core/context-limits.js +35 -0
  64. package/dist/core/context-limits.js.map +1 -0
  65. package/dist/core/env-delta.d.ts +27 -0
  66. package/dist/core/env-delta.d.ts.map +1 -0
  67. package/dist/core/env-delta.js +65 -0
  68. package/dist/core/env-delta.js.map +1 -0
  69. package/dist/core/event-bus.d.ts +12 -2
  70. package/dist/core/event-bus.d.ts.map +1 -1
  71. package/dist/core/event-bus.js +1 -0
  72. package/dist/core/event-bus.js.map +1 -1
  73. package/dist/core/goal-worker.js +1 -1
  74. package/dist/core/goal-worker.js.map +1 -1
  75. package/dist/core/hashline-edit-benchmark.d.ts +2 -0
  76. package/dist/core/hashline-edit-benchmark.d.ts.map +1 -1
  77. package/dist/core/hashline-edit-benchmark.js +5 -1
  78. package/dist/core/hashline-edit-benchmark.js.map +1 -1
  79. package/dist/core/lsp/edit-telemetry.d.ts +27 -0
  80. package/dist/core/lsp/edit-telemetry.d.ts.map +1 -0
  81. package/dist/core/lsp/edit-telemetry.js +50 -0
  82. package/dist/core/lsp/edit-telemetry.js.map +1 -0
  83. package/dist/core/lsp/manager.d.ts +24 -1
  84. package/dist/core/lsp/manager.d.ts.map +1 -1
  85. package/dist/core/lsp/manager.js +53 -2
  86. package/dist/core/lsp/manager.js.map +1 -1
  87. package/dist/core/mcp/client.js +1 -1
  88. package/dist/core/mcp/client.js.map +1 -1
  89. package/dist/core/mcp/content.d.ts +5 -0
  90. package/dist/core/mcp/content.d.ts.map +1 -1
  91. package/dist/core/mcp/content.js +20 -2
  92. package/dist/core/mcp/content.js.map +1 -1
  93. package/dist/core/mcp/defaults.d.ts +7 -3
  94. package/dist/core/mcp/defaults.d.ts.map +1 -1
  95. package/dist/core/mcp/defaults.js +19 -14
  96. package/dist/core/mcp/defaults.js.map +1 -1
  97. package/dist/core/mcp/deferred-catalog.d.ts +9 -0
  98. package/dist/core/mcp/deferred-catalog.d.ts.map +1 -1
  99. package/dist/core/mcp/deferred-catalog.js +15 -1
  100. package/dist/core/mcp/deferred-catalog.js.map +1 -1
  101. package/dist/core/mcp/elicitation-bridge.d.ts.map +1 -1
  102. package/dist/core/mcp/elicitation-bridge.js +12 -28
  103. package/dist/core/mcp/elicitation-bridge.js.map +1 -1
  104. package/dist/core/mcp/shared-pool.d.ts +2 -2
  105. package/dist/core/mcp/shared-pool.js +2 -2
  106. package/dist/core/nolan-prompt.d.ts +1 -1
  107. package/dist/core/nolan-prompt.js +16 -8
  108. package/dist/core/nolan-prompt.js.map +1 -1
  109. package/dist/core/parked-requests.d.ts +44 -0
  110. package/dist/core/parked-requests.d.ts.map +1 -0
  111. package/dist/core/parked-requests.js +34 -0
  112. package/dist/core/parked-requests.js.map +1 -0
  113. package/dist/core/platform-clis.d.ts +16 -0
  114. package/dist/core/platform-clis.d.ts.map +1 -0
  115. package/dist/core/platform-clis.js +299 -0
  116. package/dist/core/platform-clis.js.map +1 -0
  117. package/dist/core/process-manager.d.ts +50 -1
  118. package/dist/core/process-manager.d.ts.map +1 -1
  119. package/dist/core/process-manager.js +155 -4
  120. package/dist/core/process-manager.js.map +1 -1
  121. package/dist/core/prompt-commands.d.ts.map +1 -1
  122. package/dist/core/prompt-commands.js +75 -37
  123. package/dist/core/prompt-commands.js.map +1 -1
  124. package/dist/core/sandbox.d.ts +17 -1
  125. package/dist/core/sandbox.d.ts.map +1 -1
  126. package/dist/core/sandbox.js +140 -9
  127. package/dist/core/sandbox.js.map +1 -1
  128. package/dist/core/session-manager.d.ts +18 -1
  129. package/dist/core/session-manager.d.ts.map +1 -1
  130. package/dist/core/session-manager.js +62 -23
  131. package/dist/core/session-manager.js.map +1 -1
  132. package/dist/core/settings-manager.d.ts +22 -2
  133. package/dist/core/settings-manager.d.ts.map +1 -1
  134. package/dist/core/settings-manager.js +64 -0
  135. package/dist/core/settings-manager.js.map +1 -1
  136. package/dist/core/skills.d.ts +16 -1
  137. package/dist/core/skills.d.ts.map +1 -1
  138. package/dist/core/skills.js +38 -6
  139. package/dist/core/skills.js.map +1 -1
  140. package/dist/core/steroids.d.ts +59 -0
  141. package/dist/core/steroids.d.ts.map +1 -0
  142. package/dist/core/steroids.js +227 -0
  143. package/dist/core/steroids.js.map +1 -0
  144. package/dist/core/subagent-manager.d.ts +17 -0
  145. package/dist/core/subagent-manager.d.ts.map +1 -1
  146. package/dist/core/subagent-manager.js +92 -1
  147. package/dist/core/subagent-manager.js.map +1 -1
  148. package/dist/core/subagent-turn-record.d.ts +17 -0
  149. package/dist/core/subagent-turn-record.d.ts.map +1 -0
  150. package/dist/core/subagent-turn-record.js +82 -0
  151. package/dist/core/subagent-turn-record.js.map +1 -0
  152. package/dist/core/verification-gate.d.ts +123 -0
  153. package/dist/core/verification-gate.d.ts.map +1 -0
  154. package/dist/core/verification-gate.js +446 -0
  155. package/dist/core/verification-gate.js.map +1 -0
  156. package/dist/core/workspace-guard.d.ts +6 -0
  157. package/dist/core/workspace-guard.d.ts.map +1 -1
  158. package/dist/core/workspace-guard.js +58 -7
  159. package/dist/core/workspace-guard.js.map +1 -1
  160. package/dist/hf-pull.d.ts +102 -0
  161. package/dist/hf-pull.d.ts.map +1 -0
  162. package/dist/hf-pull.js +225 -0
  163. package/dist/hf-pull.js.map +1 -0
  164. package/dist/modes/json-mode.d.ts +2 -2
  165. package/dist/modes/json-mode.d.ts.map +1 -1
  166. package/dist/modes/json-mode.js +2 -8
  167. package/dist/modes/json-mode.js.map +1 -1
  168. package/dist/modes/subagent-worker-mode.d.ts.map +1 -1
  169. package/dist/modes/subagent-worker-mode.js +66 -18
  170. package/dist/modes/subagent-worker-mode.js.map +1 -1
  171. package/dist/system-prompt.d.ts +5 -2
  172. package/dist/system-prompt.d.ts.map +1 -1
  173. package/dist/system-prompt.js +136 -36
  174. package/dist/system-prompt.js.map +1 -1
  175. package/dist/tools/ask-user.d.ts +35 -0
  176. package/dist/tools/ask-user.d.ts.map +1 -0
  177. package/dist/tools/ask-user.js +157 -0
  178. package/dist/tools/ask-user.js.map +1 -0
  179. package/dist/tools/bash.d.ts +4 -0
  180. package/dist/tools/bash.d.ts.map +1 -1
  181. package/dist/tools/bash.js +63 -4
  182. package/dist/tools/bash.js.map +1 -1
  183. package/dist/tools/edit.d.ts +2 -1
  184. package/dist/tools/edit.d.ts.map +1 -1
  185. package/dist/tools/edit.js +58 -9
  186. package/dist/tools/edit.js.map +1 -1
  187. package/dist/tools/index.d.ts +9 -0
  188. package/dist/tools/index.d.ts.map +1 -1
  189. package/dist/tools/index.js +8 -2
  190. package/dist/tools/index.js.map +1 -1
  191. package/dist/tools/operations.d.ts +48 -0
  192. package/dist/tools/operations.d.ts.map +1 -1
  193. package/dist/tools/operations.js +92 -2
  194. package/dist/tools/operations.js.map +1 -1
  195. package/dist/tools/path-utils.d.ts +28 -1
  196. package/dist/tools/path-utils.d.ts.map +1 -1
  197. package/dist/tools/path-utils.js +44 -2
  198. package/dist/tools/path-utils.js.map +1 -1
  199. package/dist/tools/prompt-hints.d.ts.map +1 -1
  200. package/dist/tools/prompt-hints.js +8 -6
  201. package/dist/tools/prompt-hints.js.map +1 -1
  202. package/dist/tools/read-only-bash.d.ts +6 -0
  203. package/dist/tools/read-only-bash.d.ts.map +1 -1
  204. package/dist/tools/read-only-bash.js +168 -9
  205. package/dist/tools/read-only-bash.js.map +1 -1
  206. package/dist/tools/read.d.ts.map +1 -1
  207. package/dist/tools/read.js +35 -3
  208. package/dist/tools/read.js.map +1 -1
  209. package/dist/tools/skill.d.ts +3 -2
  210. package/dist/tools/skill.d.ts.map +1 -1
  211. package/dist/tools/skill.js +11 -7
  212. package/dist/tools/skill.js.map +1 -1
  213. package/dist/tools/steroids.d.ts +46 -0
  214. package/dist/tools/steroids.d.ts.map +1 -0
  215. package/dist/tools/steroids.js +233 -0
  216. package/dist/tools/steroids.js.map +1 -0
  217. package/dist/tools/subagent-shared.d.ts +1 -1
  218. package/dist/tools/subagent-shared.d.ts.map +1 -1
  219. package/dist/tools/subagent-shared.js +1 -4
  220. package/dist/tools/subagent-shared.js.map +1 -1
  221. package/dist/tools/subagent.js +1 -1
  222. package/dist/tools/subagent.js.map +1 -1
  223. package/dist/tools/tool-search.d.ts +2 -1
  224. package/dist/tools/tool-search.d.ts.map +1 -1
  225. package/dist/tools/tool-search.js +28 -3
  226. package/dist/tools/tool-search.js.map +1 -1
  227. package/dist/tools/tool-tiers.d.ts.map +1 -1
  228. package/dist/tools/tool-tiers.js +5 -0
  229. package/dist/tools/tool-tiers.js.map +1 -1
  230. package/dist/tools/web-fetch.d.ts +7 -0
  231. package/dist/tools/web-fetch.d.ts.map +1 -1
  232. package/dist/tools/web-fetch.js +308 -20
  233. package/dist/tools/web-fetch.js.map +1 -1
  234. package/dist/tools/write.d.ts +1 -1
  235. package/dist/tools/write.d.ts.map +1 -1
  236. package/dist/tools/write.js +1 -1
  237. package/dist/tools/write.js.map +1 -1
  238. package/dist/ui/App.d.ts +3 -0
  239. package/dist/ui/App.d.ts.map +1 -1
  240. package/dist/ui/App.js +56 -30
  241. package/dist/ui/App.js.map +1 -1
  242. package/dist/ui/app-items.d.ts +5 -0
  243. package/dist/ui/app-items.d.ts.map +1 -1
  244. package/dist/ui/app-items.js +5 -0
  245. package/dist/ui/app-items.js.map +1 -1
  246. package/dist/ui/components/Footer.js +1 -1
  247. package/dist/ui/components/Footer.js.map +1 -1
  248. package/dist/ui/components/ModelSelector.d.ts.map +1 -1
  249. package/dist/ui/components/ModelSelector.js +1 -0
  250. package/dist/ui/components/ModelSelector.js.map +1 -1
  251. package/dist/ui/components/ToolExecution.d.ts.map +1 -1
  252. package/dist/ui/components/ToolExecution.js +10 -3
  253. package/dist/ui/components/ToolExecution.js.map +1 -1
  254. package/dist/ui/hooks/useAgentLoop.d.ts +1 -1
  255. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  256. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  257. package/dist/ui/login.d.ts.map +1 -1
  258. package/dist/ui/login.js +5 -33
  259. package/dist/ui/login.js.map +1 -1
  260. package/dist/ui/prompt-routing.d.ts +2 -2
  261. package/dist/ui/prompt-routing.d.ts.map +1 -1
  262. package/dist/ui/prompt-routing.js +20 -8
  263. package/dist/ui/prompt-routing.js.map +1 -1
  264. package/dist/ui/submit-prompt-command.d.ts.map +1 -1
  265. package/dist/ui/submit-prompt-command.js +1 -1
  266. package/dist/ui/submit-prompt-command.js.map +1 -1
  267. package/dist/ui/terminal-history.js +4 -2
  268. package/dist/ui/terminal-history.js.map +1 -1
  269. package/dist/ui/tool-group-summary.d.ts +2 -0
  270. package/dist/ui/tool-group-summary.d.ts.map +1 -1
  271. package/dist/ui/tool-group-summary.js +11 -25
  272. package/dist/ui/tool-group-summary.js.map +1 -1
  273. package/dist/ui/tool-line-summary.d.ts.map +1 -1
  274. package/dist/ui/tool-line-summary.js +12 -9
  275. package/dist/ui/tool-line-summary.js.map +1 -1
  276. package/dist/ui/transcript/tool-presentation.d.ts.map +1 -1
  277. package/dist/ui/transcript/tool-presentation.js +2 -7
  278. package/dist/ui/transcript/tool-presentation.js.map +1 -1
  279. package/dist/ui/utils/text-utils.d.ts +0 -6
  280. package/dist/ui/utils/text-utils.d.ts.map +1 -1
  281. package/dist/ui/utils/text-utils.js +8 -3
  282. package/dist/ui/utils/text-utils.js.map +1 -1
  283. package/dist/utils/image.d.ts.map +1 -1
  284. package/dist/utils/image.js.map +1 -1
  285. package/dist/utils/text.d.ts +41 -0
  286. package/dist/utils/text.d.ts.map +1 -1
  287. package/dist/utils/text.js +46 -0
  288. package/dist/utils/text.js.map +1 -1
  289. package/package.json +7 -8
  290. package/dist/app-sidecar-auth-broadcast.test.d.ts +0 -2
  291. package/dist/app-sidecar-auth-broadcast.test.d.ts.map +0 -1
  292. package/dist/app-sidecar-auth-broadcast.test.js +0 -348
  293. package/dist/app-sidecar-auth-broadcast.test.js.map +0 -1
  294. package/dist/app-sidecar-sessions.test.d.ts +0 -2
  295. package/dist/app-sidecar-sessions.test.d.ts.map +0 -1
  296. package/dist/app-sidecar-sessions.test.js +0 -178
  297. package/dist/app-sidecar-sessions.test.js.map +0 -1
  298. package/dist/chat-agents/general.test.d.ts +0 -2
  299. package/dist/chat-agents/general.test.d.ts.map +0 -1
  300. package/dist/chat-agents/general.test.js +0 -52
  301. package/dist/chat-agents/general.test.js.map +0 -1
  302. package/dist/chat-agents/jiwa.test.d.ts +0 -2
  303. package/dist/chat-agents/jiwa.test.d.ts.map +0 -1
  304. package/dist/chat-agents/jiwa.test.js +0 -66
  305. package/dist/chat-agents/jiwa.test.js.map +0 -1
  306. package/dist/chat-agents/memory.test.d.ts +0 -2
  307. package/dist/chat-agents/memory.test.d.ts.map +0 -1
  308. package/dist/chat-agents/memory.test.js +0 -165
  309. package/dist/chat-agents/memory.test.js.map +0 -1
  310. package/dist/chat-agents/specialists.test.d.ts +0 -2
  311. package/dist/chat-agents/specialists.test.d.ts.map +0 -1
  312. package/dist/chat-agents/specialists.test.js +0 -98
  313. package/dist/chat-agents/specialists.test.js.map +0 -1
  314. package/dist/cli/command-routing.test.d.ts +0 -2
  315. package/dist/cli/command-routing.test.d.ts.map +0 -1
  316. package/dist/cli/command-routing.test.js +0 -61
  317. package/dist/cli/command-routing.test.js.map +0 -1
  318. package/dist/config.test.d.ts +0 -2
  319. package/dist/config.test.d.ts.map +0 -1
  320. package/dist/config.test.js +0 -123
  321. package/dist/config.test.js.map +0 -1
  322. package/dist/core/agent-mcp-passthrough.test.d.ts +0 -2
  323. package/dist/core/agent-mcp-passthrough.test.d.ts.map +0 -1
  324. package/dist/core/agent-mcp-passthrough.test.js +0 -61
  325. package/dist/core/agent-mcp-passthrough.test.js.map +0 -1
  326. package/dist/core/agent-notifications.test.d.ts +0 -2
  327. package/dist/core/agent-notifications.test.d.ts.map +0 -1
  328. package/dist/core/agent-notifications.test.js +0 -97
  329. package/dist/core/agent-notifications.test.js.map +0 -1
  330. package/dist/core/agent-session-add-dir.test.d.ts +0 -2
  331. package/dist/core/agent-session-add-dir.test.d.ts.map +0 -1
  332. package/dist/core/agent-session-add-dir.test.js +0 -110
  333. package/dist/core/agent-session-add-dir.test.js.map +0 -1
  334. package/dist/core/agent-session-checkpoint-flush.test.d.ts +0 -2
  335. package/dist/core/agent-session-checkpoint-flush.test.d.ts.map +0 -1
  336. package/dist/core/agent-session-checkpoint-flush.test.js +0 -201
  337. package/dist/core/agent-session-checkpoint-flush.test.js.map +0 -1
  338. package/dist/core/agent-session-compaction.test.d.ts +0 -2
  339. package/dist/core/agent-session-compaction.test.d.ts.map +0 -1
  340. package/dist/core/agent-session-compaction.test.js +0 -1096
  341. package/dist/core/agent-session-compaction.test.js.map +0 -1
  342. package/dist/core/agent-session-crash-durability.test.d.ts +0 -2
  343. package/dist/core/agent-session-crash-durability.test.d.ts.map +0 -1
  344. package/dist/core/agent-session-crash-durability.test.js +0 -102
  345. package/dist/core/agent-session-crash-durability.test.js.map +0 -1
  346. package/dist/core/agent-session-marker-anchors.test.d.ts +0 -2
  347. package/dist/core/agent-session-marker-anchors.test.d.ts.map +0 -1
  348. package/dist/core/agent-session-marker-anchors.test.js +0 -326
  349. package/dist/core/agent-session-marker-anchors.test.js.map +0 -1
  350. package/dist/core/agent-session-memory-tail.test.d.ts +0 -2
  351. package/dist/core/agent-session-memory-tail.test.d.ts.map +0 -1
  352. package/dist/core/agent-session-memory-tail.test.js +0 -119
  353. package/dist/core/agent-session-memory-tail.test.js.map +0 -1
  354. package/dist/core/agent-session-model-switch.test.d.ts +0 -2
  355. package/dist/core/agent-session-model-switch.test.d.ts.map +0 -1
  356. package/dist/core/agent-session-model-switch.test.js +0 -161
  357. package/dist/core/agent-session-model-switch.test.js.map +0 -1
  358. package/dist/core/agent-session-notifications.test.d.ts +0 -2
  359. package/dist/core/agent-session-notifications.test.d.ts.map +0 -1
  360. package/dist/core/agent-session-notifications.test.js +0 -114
  361. package/dist/core/agent-session-notifications.test.js.map +0 -1
  362. package/dist/core/agent-session-process-gate.test.d.ts +0 -2
  363. package/dist/core/agent-session-process-gate.test.d.ts.map +0 -1
  364. package/dist/core/agent-session-process-gate.test.js +0 -98
  365. package/dist/core/agent-session-process-gate.test.js.map +0 -1
  366. package/dist/core/agent-session-queue.test.d.ts +0 -2
  367. package/dist/core/agent-session-queue.test.d.ts.map +0 -1
  368. package/dist/core/agent-session-queue.test.js +0 -184
  369. package/dist/core/agent-session-queue.test.js.map +0 -1
  370. package/dist/core/agent-session-review-coverage.test.d.ts +0 -2
  371. package/dist/core/agent-session-review-coverage.test.d.ts.map +0 -1
  372. package/dist/core/agent-session-review-coverage.test.js +0 -140
  373. package/dist/core/agent-session-review-coverage.test.js.map +0 -1
  374. package/dist/core/agent-session-slash-restore.test.d.ts +0 -2
  375. package/dist/core/agent-session-slash-restore.test.d.ts.map +0 -1
  376. package/dist/core/agent-session-slash-restore.test.js +0 -121
  377. package/dist/core/agent-session-slash-restore.test.js.map +0 -1
  378. package/dist/core/agent-session-subagent-policy.test.d.ts +0 -2
  379. package/dist/core/agent-session-subagent-policy.test.d.ts.map +0 -1
  380. package/dist/core/agent-session-subagent-policy.test.js +0 -40
  381. package/dist/core/agent-session-subagent-policy.test.js.map +0 -1
  382. package/dist/core/agent-session-tool-result-policy.test.d.ts +0 -2
  383. package/dist/core/agent-session-tool-result-policy.test.d.ts.map +0 -1
  384. package/dist/core/agent-session-tool-result-policy.test.js +0 -25
  385. package/dist/core/agent-session-tool-result-policy.test.js.map +0 -1
  386. package/dist/core/agent-session-tool-tiers.test.d.ts +0 -2
  387. package/dist/core/agent-session-tool-tiers.test.d.ts.map +0 -1
  388. package/dist/core/agent-session-tool-tiers.test.js +0 -138
  389. package/dist/core/agent-session-tool-tiers.test.js.map +0 -1
  390. package/dist/core/agent-tools-allowlist.test.d.ts +0 -2
  391. package/dist/core/agent-tools-allowlist.test.d.ts.map +0 -1
  392. package/dist/core/agent-tools-allowlist.test.js +0 -74
  393. package/dist/core/agent-tools-allowlist.test.js.map +0 -1
  394. package/dist/core/agents.test.d.ts +0 -2
  395. package/dist/core/agents.test.d.ts.map +0 -1
  396. package/dist/core/agents.test.js +0 -147
  397. package/dist/core/agents.test.js.map +0 -1
  398. package/dist/core/auto-update.test.d.ts +0 -2
  399. package/dist/core/auto-update.test.d.ts.map +0 -1
  400. package/dist/core/auto-update.test.js +0 -204
  401. package/dist/core/auto-update.test.js.map +0 -1
  402. package/dist/core/autopilot-cycle.test.d.ts +0 -2
  403. package/dist/core/autopilot-cycle.test.d.ts.map +0 -1
  404. package/dist/core/autopilot-cycle.test.js +0 -375
  405. package/dist/core/autopilot-cycle.test.js.map +0 -1
  406. package/dist/core/autopilot-gate.test.d.ts +0 -2
  407. package/dist/core/autopilot-gate.test.d.ts.map +0 -1
  408. package/dist/core/autopilot-gate.test.js +0 -295
  409. package/dist/core/autopilot-gate.test.js.map +0 -1
  410. package/dist/core/autopilot-verdict.test.d.ts +0 -2
  411. package/dist/core/autopilot-verdict.test.d.ts.map +0 -1
  412. package/dist/core/autopilot-verdict.test.js +0 -153
  413. package/dist/core/autopilot-verdict.test.js.map +0 -1
  414. package/dist/core/checkpoint-store.test.d.ts +0 -2
  415. package/dist/core/checkpoint-store.test.d.ts.map +0 -1
  416. package/dist/core/checkpoint-store.test.js +0 -111
  417. package/dist/core/checkpoint-store.test.js.map +0 -1
  418. package/dist/core/code-retrieval-chunkers.test.d.ts +0 -2
  419. package/dist/core/code-retrieval-chunkers.test.d.ts.map +0 -1
  420. package/dist/core/code-retrieval-chunkers.test.js +0 -203
  421. package/dist/core/code-retrieval-chunkers.test.js.map +0 -1
  422. package/dist/core/compaction/active-context.test.d.ts +0 -2
  423. package/dist/core/compaction/active-context.test.d.ts.map +0 -1
  424. package/dist/core/compaction/active-context.test.js +0 -57
  425. package/dist/core/compaction/active-context.test.js.map +0 -1
  426. package/dist/core/compaction/compactor.test.d.ts +0 -2
  427. package/dist/core/compaction/compactor.test.d.ts.map +0 -1
  428. package/dist/core/compaction/compactor.test.js +0 -1072
  429. package/dist/core/compaction/compactor.test.js.map +0 -1
  430. package/dist/core/compaction/policy.test.d.ts +0 -2
  431. package/dist/core/compaction/policy.test.d.ts.map +0 -1
  432. package/dist/core/compaction/policy.test.js +0 -35
  433. package/dist/core/compaction/policy.test.js.map +0 -1
  434. package/dist/core/compaction/query-aware-selector.test.d.ts +0 -2
  435. package/dist/core/compaction/query-aware-selector.test.d.ts.map +0 -1
  436. package/dist/core/compaction/query-aware-selector.test.js +0 -96
  437. package/dist/core/compaction/query-aware-selector.test.js.map +0 -1
  438. package/dist/core/compaction/token-estimator.test.d.ts +0 -2
  439. package/dist/core/compaction/token-estimator.test.d.ts.map +0 -1
  440. package/dist/core/compaction/token-estimator.test.js +0 -283
  441. package/dist/core/compaction/token-estimator.test.js.map +0 -1
  442. package/dist/core/compaction/tool-result-pruner.test.d.ts +0 -2
  443. package/dist/core/compaction/tool-result-pruner.test.d.ts.map +0 -1
  444. package/dist/core/compaction/tool-result-pruner.test.js +0 -320
  445. package/dist/core/compaction/tool-result-pruner.test.js.map +0 -1
  446. package/dist/core/continue-replay-inventory.test.d.ts +0 -2
  447. package/dist/core/continue-replay-inventory.test.d.ts.map +0 -1
  448. package/dist/core/continue-replay-inventory.test.js +0 -42
  449. package/dist/core/continue-replay-inventory.test.js.map +0 -1
  450. package/dist/core/encode-cwd.test.d.ts +0 -2
  451. package/dist/core/encode-cwd.test.d.ts.map +0 -1
  452. package/dist/core/encode-cwd.test.js +0 -80
  453. package/dist/core/encode-cwd.test.js.map +0 -1
  454. package/dist/core/extensions/plugin-bundles.test.d.ts +0 -2
  455. package/dist/core/extensions/plugin-bundles.test.d.ts.map +0 -1
  456. package/dist/core/extensions/plugin-bundles.test.js +0 -110
  457. package/dist/core/extensions/plugin-bundles.test.js.map +0 -1
  458. package/dist/core/foreign-session-import.test.d.ts +0 -2
  459. package/dist/core/foreign-session-import.test.d.ts.map +0 -1
  460. package/dist/core/foreign-session-import.test.js +0 -220
  461. package/dist/core/foreign-session-import.test.js.map +0 -1
  462. package/dist/core/goal-controller.test.d.ts +0 -2
  463. package/dist/core/goal-controller.test.d.ts.map +0 -1
  464. package/dist/core/goal-controller.test.js +0 -784
  465. package/dist/core/goal-controller.test.js.map +0 -1
  466. package/dist/core/goal-lifecycle-smoke.test.d.ts +0 -2
  467. package/dist/core/goal-lifecycle-smoke.test.d.ts.map +0 -1
  468. package/dist/core/goal-lifecycle-smoke.test.js +0 -248
  469. package/dist/core/goal-lifecycle-smoke.test.js.map +0 -1
  470. package/dist/core/goal-prerequisites.test.d.ts +0 -2
  471. package/dist/core/goal-prerequisites.test.d.ts.map +0 -1
  472. package/dist/core/goal-prerequisites.test.js +0 -118
  473. package/dist/core/goal-prerequisites.test.js.map +0 -1
  474. package/dist/core/goal-store.test.d.ts +0 -2
  475. package/dist/core/goal-store.test.d.ts.map +0 -1
  476. package/dist/core/goal-store.test.js +0 -398
  477. package/dist/core/goal-store.test.js.map +0 -1
  478. package/dist/core/goal-verifier.test.d.ts +0 -2
  479. package/dist/core/goal-verifier.test.d.ts.map +0 -1
  480. package/dist/core/goal-verifier.test.js +0 -131
  481. package/dist/core/goal-verifier.test.js.map +0 -1
  482. package/dist/core/goal-worker-dev-server-lifecycle.test.d.ts +0 -2
  483. package/dist/core/goal-worker-dev-server-lifecycle.test.d.ts.map +0 -1
  484. package/dist/core/goal-worker-dev-server-lifecycle.test.js +0 -68
  485. package/dist/core/goal-worker-dev-server-lifecycle.test.js.map +0 -1
  486. package/dist/core/goal-worker.test.d.ts +0 -2
  487. package/dist/core/goal-worker.test.d.ts.map +0 -1
  488. package/dist/core/goal-worker.test.js +0 -269
  489. package/dist/core/goal-worker.test.js.map +0 -1
  490. package/dist/core/hashline-edit-benchmark.test.d.ts +0 -2
  491. package/dist/core/hashline-edit-benchmark.test.d.ts.map +0 -1
  492. package/dist/core/hashline-edit-benchmark.test.js +0 -190
  493. package/dist/core/hashline-edit-benchmark.test.js.map +0 -1
  494. package/dist/core/ideal-review.test.d.ts +0 -2
  495. package/dist/core/ideal-review.test.d.ts.map +0 -1
  496. package/dist/core/ideal-review.test.js +0 -242
  497. package/dist/core/ideal-review.test.js.map +0 -1
  498. package/dist/core/input-normalization.test.d.ts +0 -2
  499. package/dist/core/input-normalization.test.d.ts.map +0 -1
  500. package/dist/core/input-normalization.test.js +0 -75
  501. package/dist/core/input-normalization.test.js.map +0 -1
  502. package/dist/core/json-mode-flag-parity.test.d.ts +0 -2
  503. package/dist/core/json-mode-flag-parity.test.d.ts.map +0 -1
  504. package/dist/core/json-mode-flag-parity.test.js +0 -66
  505. package/dist/core/json-mode-flag-parity.test.js.map +0 -1
  506. package/dist/core/language-detector.test.d.ts +0 -2
  507. package/dist/core/language-detector.test.d.ts.map +0 -1
  508. package/dist/core/language-detector.test.js +0 -109
  509. package/dist/core/language-detector.test.js.map +0 -1
  510. package/dist/core/local-endpoint-store.test.d.ts +0 -2
  511. package/dist/core/local-endpoint-store.test.d.ts.map +0 -1
  512. package/dist/core/local-endpoint-store.test.js +0 -131
  513. package/dist/core/local-endpoint-store.test.js.map +0 -1
  514. package/dist/core/loop-breaker.test.d.ts +0 -2
  515. package/dist/core/loop-breaker.test.d.ts.map +0 -1
  516. package/dist/core/loop-breaker.test.js +0 -238
  517. package/dist/core/loop-breaker.test.js.map +0 -1
  518. package/dist/core/lsp/client-navigation.test.d.ts +0 -2
  519. package/dist/core/lsp/client-navigation.test.d.ts.map +0 -1
  520. package/dist/core/lsp/client-navigation.test.js +0 -135
  521. package/dist/core/lsp/client-navigation.test.js.map +0 -1
  522. package/dist/core/lsp/format.test.d.ts +0 -2
  523. package/dist/core/lsp/format.test.d.ts.map +0 -1
  524. package/dist/core/lsp/format.test.js +0 -56
  525. package/dist/core/lsp/format.test.js.map +0 -1
  526. package/dist/core/lsp/integration.test.d.ts +0 -2
  527. package/dist/core/lsp/integration.test.d.ts.map +0 -1
  528. package/dist/core/lsp/integration.test.js +0 -60
  529. package/dist/core/lsp/integration.test.js.map +0 -1
  530. package/dist/core/lsp/jsonrpc.test.d.ts +0 -2
  531. package/dist/core/lsp/jsonrpc.test.d.ts.map +0 -1
  532. package/dist/core/lsp/jsonrpc.test.js +0 -127
  533. package/dist/core/lsp/jsonrpc.test.js.map +0 -1
  534. package/dist/core/lsp/manager-navigation.test.d.ts +0 -2
  535. package/dist/core/lsp/manager-navigation.test.d.ts.map +0 -1
  536. package/dist/core/lsp/manager-navigation.test.js +0 -121
  537. package/dist/core/lsp/manager-navigation.test.js.map +0 -1
  538. package/dist/core/lsp/manager.test.d.ts +0 -2
  539. package/dist/core/lsp/manager.test.d.ts.map +0 -1
  540. package/dist/core/lsp/manager.test.js +0 -220
  541. package/dist/core/lsp/manager.test.js.map +0 -1
  542. package/dist/core/lsp/pool.test.d.ts +0 -2
  543. package/dist/core/lsp/pool.test.d.ts.map +0 -1
  544. package/dist/core/lsp/pool.test.js +0 -286
  545. package/dist/core/lsp/pool.test.js.map +0 -1
  546. package/dist/core/lsp/servers.test.d.ts +0 -2
  547. package/dist/core/lsp/servers.test.d.ts.map +0 -1
  548. package/dist/core/lsp/servers.test.js +0 -67
  549. package/dist/core/lsp/servers.test.js.map +0 -1
  550. package/dist/core/lsp/uri.test.d.ts +0 -2
  551. package/dist/core/lsp/uri.test.d.ts.map +0 -1
  552. package/dist/core/lsp/uri.test.js +0 -56
  553. package/dist/core/lsp/uri.test.js.map +0 -1
  554. package/dist/core/lsp/windows.test.d.ts +0 -2
  555. package/dist/core/lsp/windows.test.d.ts.map +0 -1
  556. package/dist/core/lsp/windows.test.js +0 -239
  557. package/dist/core/lsp/windows.test.js.map +0 -1
  558. package/dist/core/mcp/catalog-cache.test.d.ts +0 -2
  559. package/dist/core/mcp/catalog-cache.test.d.ts.map +0 -1
  560. package/dist/core/mcp/catalog-cache.test.js +0 -99
  561. package/dist/core/mcp/catalog-cache.test.js.map +0 -1
  562. package/dist/core/mcp/client-session-recovery.test.d.ts +0 -2
  563. package/dist/core/mcp/client-session-recovery.test.d.ts.map +0 -1
  564. package/dist/core/mcp/client-session-recovery.test.js +0 -231
  565. package/dist/core/mcp/client-session-recovery.test.js.map +0 -1
  566. package/dist/core/mcp/content.test.d.ts +0 -2
  567. package/dist/core/mcp/content.test.d.ts.map +0 -1
  568. package/dist/core/mcp/content.test.js +0 -135
  569. package/dist/core/mcp/content.test.js.map +0 -1
  570. package/dist/core/mcp/elicitation.test.d.ts +0 -2
  571. package/dist/core/mcp/elicitation.test.d.ts.map +0 -1
  572. package/dist/core/mcp/elicitation.test.js +0 -158
  573. package/dist/core/mcp/elicitation.test.js.map +0 -1
  574. package/dist/core/mcp/legacy-negotiation.test.d.ts +0 -2
  575. package/dist/core/mcp/legacy-negotiation.test.d.ts.map +0 -1
  576. package/dist/core/mcp/legacy-negotiation.test.js +0 -80
  577. package/dist/core/mcp/legacy-negotiation.test.js.map +0 -1
  578. package/dist/core/mcp/loopback.test.d.ts +0 -2
  579. package/dist/core/mcp/loopback.test.d.ts.map +0 -1
  580. package/dist/core/mcp/loopback.test.js +0 -87
  581. package/dist/core/mcp/loopback.test.js.map +0 -1
  582. package/dist/core/mcp/oauth-store.test.d.ts +0 -2
  583. package/dist/core/mcp/oauth-store.test.d.ts.map +0 -1
  584. package/dist/core/mcp/oauth-store.test.js +0 -94
  585. package/dist/core/mcp/oauth-store.test.js.map +0 -1
  586. package/dist/core/mcp/parse-add-command.test.d.ts +0 -2
  587. package/dist/core/mcp/parse-add-command.test.d.ts.map +0 -1
  588. package/dist/core/mcp/parse-add-command.test.js +0 -81
  589. package/dist/core/mcp/parse-add-command.test.js.map +0 -1
  590. package/dist/core/mcp/resolve-stdio.test.d.ts +0 -2
  591. package/dist/core/mcp/resolve-stdio.test.d.ts.map +0 -1
  592. package/dist/core/mcp/resolve-stdio.test.js +0 -239
  593. package/dist/core/mcp/resolve-stdio.test.js.map +0 -1
  594. package/dist/core/mcp/session-elicitation-wiring.test.d.ts +0 -2
  595. package/dist/core/mcp/session-elicitation-wiring.test.d.ts.map +0 -1
  596. package/dist/core/mcp/session-elicitation-wiring.test.js +0 -138
  597. package/dist/core/mcp/session-elicitation-wiring.test.js.map +0 -1
  598. package/dist/core/mcp/shared-pool.test.d.ts +0 -2
  599. package/dist/core/mcp/shared-pool.test.d.ts.map +0 -1
  600. package/dist/core/mcp/shared-pool.test.js +0 -425
  601. package/dist/core/mcp/shared-pool.test.js.map +0 -1
  602. package/dist/core/mcp/store.test.d.ts +0 -2
  603. package/dist/core/mcp/store.test.d.ts.map +0 -1
  604. package/dist/core/mcp/store.test.js +0 -110
  605. package/dist/core/mcp/store.test.js.map +0 -1
  606. package/dist/core/mcp/when-connected.test.d.ts +0 -2
  607. package/dist/core/mcp/when-connected.test.d.ts.map +0 -1
  608. package/dist/core/mcp/when-connected.test.js +0 -46
  609. package/dist/core/mcp/when-connected.test.js.map +0 -1
  610. package/dist/core/message-images.test.d.ts +0 -2
  611. package/dist/core/message-images.test.d.ts.map +0 -1
  612. package/dist/core/message-images.test.js +0 -62
  613. package/dist/core/message-images.test.js.map +0 -1
  614. package/dist/core/network-guard.test.d.ts +0 -2
  615. package/dist/core/network-guard.test.d.ts.map +0 -1
  616. package/dist/core/network-guard.test.js +0 -72
  617. package/dist/core/network-guard.test.js.map +0 -1
  618. package/dist/core/nolan-context.test.d.ts +0 -2
  619. package/dist/core/nolan-context.test.d.ts.map +0 -1
  620. package/dist/core/nolan-context.test.js +0 -342
  621. package/dist/core/nolan-context.test.js.map +0 -1
  622. package/dist/core/nolan-model.test.d.ts +0 -2
  623. package/dist/core/nolan-model.test.d.ts.map +0 -1
  624. package/dist/core/nolan-model.test.js +0 -51
  625. package/dist/core/nolan-model.test.js.map +0 -1
  626. package/dist/core/nolan-prompt.test.d.ts +0 -2
  627. package/dist/core/nolan-prompt.test.d.ts.map +0 -1
  628. package/dist/core/nolan-prompt.test.js +0 -160
  629. package/dist/core/nolan-prompt.test.js.map +0 -1
  630. package/dist/core/persistent-shell.test.d.ts +0 -2
  631. package/dist/core/persistent-shell.test.d.ts.map +0 -1
  632. package/dist/core/persistent-shell.test.js +0 -84
  633. package/dist/core/persistent-shell.test.js.map +0 -1
  634. package/dist/core/pixel-fix.test.d.ts +0 -2
  635. package/dist/core/pixel-fix.test.d.ts.map +0 -1
  636. package/dist/core/pixel-fix.test.js +0 -310
  637. package/dist/core/pixel-fix.test.js.map +0 -1
  638. package/dist/core/pixel.test.d.ts +0 -2
  639. package/dist/core/pixel.test.d.ts.map +0 -1
  640. package/dist/core/pixel.test.js +0 -269
  641. package/dist/core/pixel.test.js.map +0 -1
  642. package/dist/core/process-gate.test.d.ts +0 -2
  643. package/dist/core/process-gate.test.d.ts.map +0 -1
  644. package/dist/core/process-gate.test.js +0 -87
  645. package/dist/core/process-gate.test.js.map +0 -1
  646. package/dist/core/process-manager-dev-server-repro.test.d.ts +0 -2
  647. package/dist/core/process-manager-dev-server-repro.test.d.ts.map +0 -1
  648. package/dist/core/process-manager-dev-server-repro.test.js +0 -225
  649. package/dist/core/process-manager-dev-server-repro.test.js.map +0 -1
  650. package/dist/core/process-manager-notifications.test.d.ts +0 -2
  651. package/dist/core/process-manager-notifications.test.d.ts.map +0 -1
  652. package/dist/core/process-manager-notifications.test.js +0 -227
  653. package/dist/core/process-manager-notifications.test.js.map +0 -1
  654. package/dist/core/progress/engine.test.d.ts +0 -2
  655. package/dist/core/progress/engine.test.d.ts.map +0 -1
  656. package/dist/core/progress/engine.test.js +0 -136
  657. package/dist/core/progress/engine.test.js.map +0 -1
  658. package/dist/core/progress/git-xp.test.d.ts +0 -2
  659. package/dist/core/progress/git-xp.test.d.ts.map +0 -1
  660. package/dist/core/progress/git-xp.test.js +0 -88
  661. package/dist/core/progress/git-xp.test.js.map +0 -1
  662. package/dist/core/progress/ranks.test.d.ts +0 -2
  663. package/dist/core/progress/ranks.test.d.ts.map +0 -1
  664. package/dist/core/progress/ranks.test.js +0 -100
  665. package/dist/core/progress/ranks.test.js.map +0 -1
  666. package/dist/core/progress/rebuild.test.d.ts +0 -2
  667. package/dist/core/progress/rebuild.test.d.ts.map +0 -1
  668. package/dist/core/progress/rebuild.test.js +0 -103
  669. package/dist/core/progress/rebuild.test.js.map +0 -1
  670. package/dist/core/progress/store.test.d.ts +0 -2
  671. package/dist/core/progress/store.test.d.ts.map +0 -1
  672. package/dist/core/progress/store.test.js +0 -108
  673. package/dist/core/progress/store.test.js.map +0 -1
  674. package/dist/core/project-discovery.test.d.ts +0 -2
  675. package/dist/core/project-discovery.test.d.ts.map +0 -1
  676. package/dist/core/project-discovery.test.js +0 -519
  677. package/dist/core/project-discovery.test.js.map +0 -1
  678. package/dist/core/prompt-commands.test.d.ts +0 -2
  679. package/dist/core/prompt-commands.test.d.ts.map +0 -1
  680. package/dist/core/prompt-commands.test.js +0 -175
  681. package/dist/core/prompt-commands.test.js.map +0 -1
  682. package/dist/core/radio.test.d.ts +0 -2
  683. package/dist/core/radio.test.d.ts.map +0 -1
  684. package/dist/core/radio.test.js +0 -117
  685. package/dist/core/radio.test.js.map +0 -1
  686. package/dist/core/regrounding.test.d.ts +0 -2
  687. package/dist/core/regrounding.test.d.ts.map +0 -1
  688. package/dist/core/regrounding.test.js +0 -38
  689. package/dist/core/regrounding.test.js.map +0 -1
  690. package/dist/core/resolve-start.test.d.ts +0 -2
  691. package/dist/core/resolve-start.test.d.ts.map +0 -1
  692. package/dist/core/resolve-start.test.js +0 -68
  693. package/dist/core/resolve-start.test.js.map +0 -1
  694. package/dist/core/run-claim.test.d.ts +0 -2
  695. package/dist/core/run-claim.test.d.ts.map +0 -1
  696. package/dist/core/run-claim.test.js +0 -107
  697. package/dist/core/run-claim.test.js.map +0 -1
  698. package/dist/core/run-journal.test.d.ts +0 -2
  699. package/dist/core/run-journal.test.d.ts.map +0 -1
  700. package/dist/core/run-journal.test.js +0 -195
  701. package/dist/core/run-journal.test.js.map +0 -1
  702. package/dist/core/run-lifecycle.test.d.ts +0 -2
  703. package/dist/core/run-lifecycle.test.d.ts.map +0 -1
  704. package/dist/core/run-lifecycle.test.js +0 -64
  705. package/dist/core/run-lifecycle.test.js.map +0 -1
  706. package/dist/core/sandbox-feedback.test.d.ts +0 -2
  707. package/dist/core/sandbox-feedback.test.d.ts.map +0 -1
  708. package/dist/core/sandbox-feedback.test.js +0 -32
  709. package/dist/core/sandbox-feedback.test.js.map +0 -1
  710. package/dist/core/sandbox.test.d.ts +0 -2
  711. package/dist/core/sandbox.test.d.ts.map +0 -1
  712. package/dist/core/sandbox.test.js +0 -157
  713. package/dist/core/sandbox.test.js.map +0 -1
  714. package/dist/core/semantic-search-benchmark.test.d.ts +0 -2
  715. package/dist/core/semantic-search-benchmark.test.d.ts.map +0 -1
  716. package/dist/core/semantic-search-benchmark.test.js +0 -89
  717. package/dist/core/semantic-search-benchmark.test.js.map +0 -1
  718. package/dist/core/session-compaction.test.d.ts +0 -2
  719. package/dist/core/session-compaction.test.d.ts.map +0 -1
  720. package/dist/core/session-compaction.test.js +0 -92
  721. package/dist/core/session-compaction.test.js.map +0 -1
  722. package/dist/core/session-export.test.d.ts +0 -2
  723. package/dist/core/session-export.test.d.ts.map +0 -1
  724. package/dist/core/session-export.test.js +0 -353
  725. package/dist/core/session-export.test.js.map +0 -1
  726. package/dist/core/session-history.test.d.ts +0 -2
  727. package/dist/core/session-history.test.d.ts.map +0 -1
  728. package/dist/core/session-history.test.js +0 -272
  729. package/dist/core/session-history.test.js.map +0 -1
  730. package/dist/core/session-manager.test.d.ts +0 -2
  731. package/dist/core/session-manager.test.d.ts.map +0 -1
  732. package/dist/core/session-manager.test.js +0 -573
  733. package/dist/core/session-manager.test.js.map +0 -1
  734. package/dist/core/session-notification-visibility.test.d.ts +0 -2
  735. package/dist/core/session-notification-visibility.test.d.ts.map +0 -1
  736. package/dist/core/session-notification-visibility.test.js +0 -113
  737. package/dist/core/session-notification-visibility.test.js.map +0 -1
  738. package/dist/core/session-restore-display.test.d.ts +0 -2
  739. package/dist/core/session-restore-display.test.d.ts.map +0 -1
  740. package/dist/core/session-restore-display.test.js +0 -103
  741. package/dist/core/session-restore-display.test.js.map +0 -1
  742. package/dist/core/session-storage-fd-leak.test.d.ts +0 -2
  743. package/dist/core/session-storage-fd-leak.test.d.ts.map +0 -1
  744. package/dist/core/session-storage-fd-leak.test.js +0 -116
  745. package/dist/core/session-storage-fd-leak.test.js.map +0 -1
  746. package/dist/core/session-storage.test.d.ts +0 -2
  747. package/dist/core/session-storage.test.d.ts.map +0 -1
  748. package/dist/core/session-storage.test.js +0 -277
  749. package/dist/core/session-storage.test.js.map +0 -1
  750. package/dist/core/setup-history.test.d.ts +0 -2
  751. package/dist/core/setup-history.test.d.ts.map +0 -1
  752. package/dist/core/setup-history.test.js +0 -59
  753. package/dist/core/setup-history.test.js.map +0 -1
  754. package/dist/core/shell.test.d.ts +0 -2
  755. package/dist/core/shell.test.d.ts.map +0 -1
  756. package/dist/core/shell.test.js +0 -87
  757. package/dist/core/shell.test.js.map +0 -1
  758. package/dist/core/shutdown.test.d.ts +0 -2
  759. package/dist/core/shutdown.test.d.ts.map +0 -1
  760. package/dist/core/shutdown.test.js +0 -160
  761. package/dist/core/shutdown.test.js.map +0 -1
  762. package/dist/core/sidecar-error-reporter.d.ts +0 -12
  763. package/dist/core/sidecar-error-reporter.d.ts.map +0 -1
  764. package/dist/core/sidecar-error-reporter.js +0 -57
  765. package/dist/core/sidecar-error-reporter.js.map +0 -1
  766. package/dist/core/sidecar-error-reporter.test.d.ts +0 -2
  767. package/dist/core/sidecar-error-reporter.test.d.ts.map +0 -1
  768. package/dist/core/sidecar-error-reporter.test.js +0 -61
  769. package/dist/core/sidecar-error-reporter.test.js.map +0 -1
  770. package/dist/core/skills-routing.test.d.ts +0 -2
  771. package/dist/core/skills-routing.test.d.ts.map +0 -1
  772. package/dist/core/skills-routing.test.js +0 -168
  773. package/dist/core/skills-routing.test.js.map +0 -1
  774. package/dist/core/slash-commands.test.d.ts +0 -2
  775. package/dist/core/slash-commands.test.d.ts.map +0 -1
  776. package/dist/core/slash-commands.test.js +0 -59
  777. package/dist/core/slash-commands.test.js.map +0 -1
  778. package/dist/core/source-maps.test.d.ts +0 -2
  779. package/dist/core/source-maps.test.d.ts.map +0 -1
  780. package/dist/core/source-maps.test.js +0 -175
  781. package/dist/core/source-maps.test.js.map +0 -1
  782. package/dist/core/speed-benchmark.test.d.ts +0 -2
  783. package/dist/core/speed-benchmark.test.d.ts.map +0 -1
  784. package/dist/core/speed-benchmark.test.js +0 -102
  785. package/dist/core/speed-benchmark.test.js.map +0 -1
  786. package/dist/core/subagent-manager.test.d.ts +0 -2
  787. package/dist/core/subagent-manager.test.d.ts.map +0 -1
  788. package/dist/core/subagent-manager.test.js +0 -375
  789. package/dist/core/subagent-manager.test.js.map +0 -1
  790. package/dist/core/subagent-store.test.d.ts +0 -2
  791. package/dist/core/subagent-store.test.d.ts.map +0 -1
  792. package/dist/core/subagent-store.test.js +0 -106
  793. package/dist/core/subagent-store.test.js.map +0 -1
  794. package/dist/core/verification-evidence.test.d.ts +0 -2
  795. package/dist/core/verification-evidence.test.d.ts.map +0 -1
  796. package/dist/core/verification-evidence.test.js +0 -103
  797. package/dist/core/verification-evidence.test.js.map +0 -1
  798. package/dist/core/verify-commands.test.d.ts +0 -2
  799. package/dist/core/verify-commands.test.d.ts.map +0 -1
  800. package/dist/core/verify-commands.test.js +0 -81
  801. package/dist/core/verify-commands.test.js.map +0 -1
  802. package/dist/core/workspace-guard.test.d.ts +0 -2
  803. package/dist/core/workspace-guard.test.d.ts.map +0 -1
  804. package/dist/core/workspace-guard.test.js +0 -107
  805. package/dist/core/workspace-guard.test.js.map +0 -1
  806. package/dist/modes/acp-mode.test.d.ts +0 -2
  807. package/dist/modes/acp-mode.test.d.ts.map +0 -1
  808. package/dist/modes/acp-mode.test.js +0 -1065
  809. package/dist/modes/acp-mode.test.js.map +0 -1
  810. package/dist/modes/json-mode.test.d.ts +0 -2
  811. package/dist/modes/json-mode.test.d.ts.map +0 -1
  812. package/dist/modes/json-mode.test.js +0 -84
  813. package/dist/modes/json-mode.test.js.map +0 -1
  814. package/dist/modes/subagent-worker-mode.test.d.ts +0 -2
  815. package/dist/modes/subagent-worker-mode.test.d.ts.map +0 -1
  816. package/dist/modes/subagent-worker-mode.test.js +0 -52
  817. package/dist/modes/subagent-worker-mode.test.js.map +0 -1
  818. package/dist/session.test.d.ts +0 -2
  819. package/dist/session.test.d.ts.map +0 -1
  820. package/dist/session.test.js +0 -35
  821. package/dist/session.test.js.map +0 -1
  822. package/dist/system-prompt.test.d.ts +0 -2
  823. package/dist/system-prompt.test.d.ts.map +0 -1
  824. package/dist/system-prompt.test.js +0 -536
  825. package/dist/system-prompt.test.js.map +0 -1
  826. package/dist/system-prompt.tiering.test.d.ts +0 -2
  827. package/dist/system-prompt.tiering.test.d.ts.map +0 -1
  828. package/dist/system-prompt.tiering.test.js +0 -105
  829. package/dist/system-prompt.tiering.test.js.map +0 -1
  830. package/dist/tools/bash.test.d.ts +0 -2
  831. package/dist/tools/bash.test.d.ts.map +0 -1
  832. package/dist/tools/bash.test.js +0 -204
  833. package/dist/tools/bash.test.js.map +0 -1
  834. package/dist/tools/checkpoint-hook.test.d.ts +0 -2
  835. package/dist/tools/checkpoint-hook.test.d.ts.map +0 -1
  836. package/dist/tools/checkpoint-hook.test.js +0 -65
  837. package/dist/tools/checkpoint-hook.test.js.map +0 -1
  838. package/dist/tools/code-nav.test.d.ts +0 -2
  839. package/dist/tools/code-nav.test.d.ts.map +0 -1
  840. package/dist/tools/code-nav.test.js +0 -136
  841. package/dist/tools/code-nav.test.js.map +0 -1
  842. package/dist/tools/code-skeleton.test.d.ts +0 -2
  843. package/dist/tools/code-skeleton.test.d.ts.map +0 -1
  844. package/dist/tools/code-skeleton.test.js +0 -115
  845. package/dist/tools/code-skeleton.test.js.map +0 -1
  846. package/dist/tools/compress-integration.test.d.ts +0 -2
  847. package/dist/tools/compress-integration.test.d.ts.map +0 -1
  848. package/dist/tools/compress-integration.test.js +0 -59
  849. package/dist/tools/compress-integration.test.js.map +0 -1
  850. package/dist/tools/compress.test.d.ts +0 -2
  851. package/dist/tools/compress.test.d.ts.map +0 -1
  852. package/dist/tools/compress.test.js +0 -60
  853. package/dist/tools/compress.test.js.map +0 -1
  854. package/dist/tools/edit-diff.test.d.ts +0 -2
  855. package/dist/tools/edit-diff.test.d.ts.map +0 -1
  856. package/dist/tools/edit-diff.test.js +0 -329
  857. package/dist/tools/edit-diff.test.js.map +0 -1
  858. package/dist/tools/edit-robustness.test.d.ts +0 -2
  859. package/dist/tools/edit-robustness.test.d.ts.map +0 -1
  860. package/dist/tools/edit-robustness.test.js +0 -417
  861. package/dist/tools/edit-robustness.test.js.map +0 -1
  862. package/dist/tools/edit.test.d.ts +0 -2
  863. package/dist/tools/edit.test.d.ts.map +0 -1
  864. package/dist/tools/edit.test.js +0 -940
  865. package/dist/tools/edit.test.js.map +0 -1
  866. package/dist/tools/exit-plan.test.d.ts +0 -2
  867. package/dist/tools/exit-plan.test.d.ts.map +0 -1
  868. package/dist/tools/exit-plan.test.js +0 -72
  869. package/dist/tools/exit-plan.test.js.map +0 -1
  870. package/dist/tools/generate-image.test.d.ts +0 -2
  871. package/dist/tools/generate-image.test.d.ts.map +0 -1
  872. package/dist/tools/generate-image.test.js +0 -240
  873. package/dist/tools/generate-image.test.js.map +0 -1
  874. package/dist/tools/goal-mode.test.d.ts +0 -2
  875. package/dist/tools/goal-mode.test.d.ts.map +0 -1
  876. package/dist/tools/goal-mode.test.js +0 -121
  877. package/dist/tools/goal-mode.test.js.map +0 -1
  878. package/dist/tools/goals.test.d.ts +0 -2
  879. package/dist/tools/goals.test.d.ts.map +0 -1
  880. package/dist/tools/goals.test.js +0 -795
  881. package/dist/tools/goals.test.js.map +0 -1
  882. package/dist/tools/grep-parity.test.d.ts +0 -2
  883. package/dist/tools/grep-parity.test.d.ts.map +0 -1
  884. package/dist/tools/grep-parity.test.js +0 -92
  885. package/dist/tools/grep-parity.test.js.map +0 -1
  886. package/dist/tools/grep-recall.test.d.ts +0 -2
  887. package/dist/tools/grep-recall.test.d.ts.map +0 -1
  888. package/dist/tools/grep-recall.test.js +0 -114
  889. package/dist/tools/grep-recall.test.js.map +0 -1
  890. package/dist/tools/grep-spawn.test.d.ts +0 -2
  891. package/dist/tools/grep-spawn.test.d.ts.map +0 -1
  892. package/dist/tools/grep-spawn.test.js +0 -66
  893. package/dist/tools/grep-spawn.test.js.map +0 -1
  894. package/dist/tools/grep.test.d.ts +0 -2
  895. package/dist/tools/grep.test.d.ts.map +0 -1
  896. package/dist/tools/grep.test.js +0 -82
  897. package/dist/tools/grep.test.js.map +0 -1
  898. package/dist/tools/html-extract.test.d.ts +0 -2
  899. package/dist/tools/html-extract.test.d.ts.map +0 -1
  900. package/dist/tools/html-extract.test.js +0 -60
  901. package/dist/tools/html-extract.test.js.map +0 -1
  902. package/dist/tools/index.test.d.ts +0 -2
  903. package/dist/tools/index.test.d.ts.map +0 -1
  904. package/dist/tools/index.test.js +0 -55
  905. package/dist/tools/index.test.js.map +0 -1
  906. package/dist/tools/overflow.test.d.ts +0 -2
  907. package/dist/tools/overflow.test.d.ts.map +0 -1
  908. package/dist/tools/overflow.test.js +0 -59
  909. package/dist/tools/overflow.test.js.map +0 -1
  910. package/dist/tools/path-utils.test.d.ts +0 -2
  911. package/dist/tools/path-utils.test.d.ts.map +0 -1
  912. package/dist/tools/path-utils.test.js +0 -54
  913. package/dist/tools/path-utils.test.js.map +0 -1
  914. package/dist/tools/pdf-extract.test.d.ts +0 -2
  915. package/dist/tools/pdf-extract.test.d.ts.map +0 -1
  916. package/dist/tools/pdf-extract.test.js +0 -15
  917. package/dist/tools/pdf-extract.test.js.map +0 -1
  918. package/dist/tools/plan-mode.test.d.ts +0 -2
  919. package/dist/tools/plan-mode.test.d.ts.map +0 -1
  920. package/dist/tools/plan-mode.test.js +0 -116
  921. package/dist/tools/plan-mode.test.js.map +0 -1
  922. package/dist/tools/read-only-bash.test.d.ts +0 -2
  923. package/dist/tools/read-only-bash.test.d.ts.map +0 -1
  924. package/dist/tools/read-only-bash.test.js +0 -47
  925. package/dist/tools/read-only-bash.test.js.map +0 -1
  926. package/dist/tools/read.test.d.ts +0 -2
  927. package/dist/tools/read.test.d.ts.map +0 -1
  928. package/dist/tools/read.test.js +0 -146
  929. package/dist/tools/read.test.js.map +0 -1
  930. package/dist/tools/screenshot.test.d.ts +0 -2
  931. package/dist/tools/screenshot.test.d.ts.map +0 -1
  932. package/dist/tools/screenshot.test.js +0 -145
  933. package/dist/tools/screenshot.test.js.map +0 -1
  934. package/dist/tools/search-code.test.d.ts +0 -2
  935. package/dist/tools/search-code.test.d.ts.map +0 -1
  936. package/dist/tools/search-code.test.js +0 -83
  937. package/dist/tools/search-code.test.js.map +0 -1
  938. package/dist/tools/source-path.test.d.ts +0 -2
  939. package/dist/tools/source-path.test.d.ts.map +0 -1
  940. package/dist/tools/source-path.test.js +0 -80
  941. package/dist/tools/source-path.test.js.map +0 -1
  942. package/dist/tools/subagent-control.test.d.ts +0 -2
  943. package/dist/tools/subagent-control.test.d.ts.map +0 -1
  944. package/dist/tools/subagent-control.test.js +0 -73
  945. package/dist/tools/subagent-control.test.js.map +0 -1
  946. package/dist/tools/subagent-shared.test.d.ts +0 -2
  947. package/dist/tools/subagent-shared.test.d.ts.map +0 -1
  948. package/dist/tools/subagent-shared.test.js +0 -83
  949. package/dist/tools/subagent-shared.test.js.map +0 -1
  950. package/dist/tools/subagent.test.d.ts +0 -2
  951. package/dist/tools/subagent.test.d.ts.map +0 -1
  952. package/dist/tools/subagent.test.js +0 -180
  953. package/dist/tools/subagent.test.js.map +0 -1
  954. package/dist/tools/task-send.test.d.ts +0 -2
  955. package/dist/tools/task-send.test.d.ts.map +0 -1
  956. package/dist/tools/task-send.test.js +0 -104
  957. package/dist/tools/task-send.test.js.map +0 -1
  958. package/dist/tools/tasks.test.d.ts +0 -2
  959. package/dist/tools/tasks.test.d.ts.map +0 -1
  960. package/dist/tools/tasks.test.js +0 -62
  961. package/dist/tools/tasks.test.js.map +0 -1
  962. package/dist/tools/tool-search.test.d.ts +0 -2
  963. package/dist/tools/tool-search.test.d.ts.map +0 -1
  964. package/dist/tools/tool-search.test.js +0 -69
  965. package/dist/tools/tool-search.test.js.map +0 -1
  966. package/dist/tools/tool-tiers.test.d.ts +0 -2
  967. package/dist/tools/tool-tiers.test.d.ts.map +0 -1
  968. package/dist/tools/tool-tiers.test.js +0 -48
  969. package/dist/tools/tool-tiers.test.js.map +0 -1
  970. package/dist/tools/truncate-utils.test.d.ts +0 -2
  971. package/dist/tools/truncate-utils.test.d.ts.map +0 -1
  972. package/dist/tools/truncate-utils.test.js +0 -93
  973. package/dist/tools/truncate-utils.test.js.map +0 -1
  974. package/dist/tools/truncate.test.d.ts +0 -2
  975. package/dist/tools/truncate.test.d.ts.map +0 -1
  976. package/dist/tools/truncate.test.js +0 -100
  977. package/dist/tools/truncate.test.js.map +0 -1
  978. package/dist/tools/web-fetch.test.d.ts +0 -2
  979. package/dist/tools/web-fetch.test.d.ts.map +0 -1
  980. package/dist/tools/web-fetch.test.js +0 -539
  981. package/dist/tools/web-fetch.test.js.map +0 -1
  982. package/dist/tools/web-search.test.d.ts +0 -2
  983. package/dist/tools/web-search.test.d.ts.map +0 -1
  984. package/dist/tools/web-search.test.js +0 -333
  985. package/dist/tools/web-search.test.js.map +0 -1
  986. package/dist/tools/write.test.d.ts +0 -2
  987. package/dist/tools/write.test.d.ts.map +0 -1
  988. package/dist/tools/write.test.js +0 -176
  989. package/dist/tools/write.test.js.map +0 -1
  990. package/dist/ui/anchor-pad-reclaim.test.d.ts +0 -2
  991. package/dist/ui/anchor-pad-reclaim.test.d.ts.map +0 -1
  992. package/dist/ui/anchor-pad-reclaim.test.js +0 -146
  993. package/dist/ui/anchor-pad-reclaim.test.js.map +0 -1
  994. package/dist/ui/app-items.test.d.ts +0 -2
  995. package/dist/ui/app-items.test.d.ts.map +0 -1
  996. package/dist/ui/app-items.test.js +0 -54
  997. package/dist/ui/app-items.test.js.map +0 -1
  998. package/dist/ui/app-state-persistence.test.d.ts +0 -2
  999. package/dist/ui/app-state-persistence.test.d.ts.map +0 -1
  1000. package/dist/ui/app-state-persistence.test.js +0 -71
  1001. package/dist/ui/app-state-persistence.test.js.map +0 -1
  1002. package/dist/ui/assistant-stream-flush-parity.test.d.ts +0 -2
  1003. package/dist/ui/assistant-stream-flush-parity.test.d.ts.map +0 -1
  1004. package/dist/ui/assistant-stream-flush-parity.test.js +0 -85
  1005. package/dist/ui/assistant-stream-flush-parity.test.js.map +0 -1
  1006. package/dist/ui/atomic-flush-regression.test.d.ts +0 -2
  1007. package/dist/ui/atomic-flush-regression.test.d.ts.map +0 -1
  1008. package/dist/ui/atomic-flush-regression.test.js +0 -218
  1009. package/dist/ui/atomic-flush-regression.test.js.map +0 -1
  1010. package/dist/ui/chat-layout-pinning.test.d.ts +0 -2
  1011. package/dist/ui/chat-layout-pinning.test.d.ts.map +0 -1
  1012. package/dist/ui/chat-layout-pinning.test.js +0 -525
  1013. package/dist/ui/chat-layout-pinning.test.js.map +0 -1
  1014. package/dist/ui/components/ActivityIndicator.test.d.ts +0 -2
  1015. package/dist/ui/components/ActivityIndicator.test.d.ts.map +0 -1
  1016. package/dist/ui/components/ActivityIndicator.test.js +0 -40
  1017. package/dist/ui/components/ActivityIndicator.test.js.map +0 -1
  1018. package/dist/ui/components/AssistantMessage.test.d.ts +0 -2
  1019. package/dist/ui/components/AssistantMessage.test.d.ts.map +0 -1
  1020. package/dist/ui/components/AssistantMessage.test.js +0 -418
  1021. package/dist/ui/components/AssistantMessage.test.js.map +0 -1
  1022. package/dist/ui/components/Footer.test.d.ts +0 -2
  1023. package/dist/ui/components/Footer.test.d.ts.map +0 -1
  1024. package/dist/ui/components/Footer.test.js +0 -16
  1025. package/dist/ui/components/Footer.test.js.map +0 -1
  1026. package/dist/ui/components/InputArea.test.d.ts +0 -2
  1027. package/dist/ui/components/InputArea.test.d.ts.map +0 -1
  1028. package/dist/ui/components/InputArea.test.js +0 -95
  1029. package/dist/ui/components/InputArea.test.js.map +0 -1
  1030. package/dist/ui/components/PlanOverlay.test.d.ts +0 -2
  1031. package/dist/ui/components/PlanOverlay.test.d.ts.map +0 -1
  1032. package/dist/ui/components/PlanOverlay.test.js +0 -24
  1033. package/dist/ui/components/PlanOverlay.test.js.map +0 -1
  1034. package/dist/ui/components/StreamingArea.test.d.ts +0 -2
  1035. package/dist/ui/components/StreamingArea.test.d.ts.map +0 -1
  1036. package/dist/ui/components/StreamingArea.test.js +0 -18
  1037. package/dist/ui/components/StreamingArea.test.js.map +0 -1
  1038. package/dist/ui/components/UserMessage.test.d.ts +0 -2
  1039. package/dist/ui/components/UserMessage.test.d.ts.map +0 -1
  1040. package/dist/ui/components/UserMessage.test.js +0 -39
  1041. package/dist/ui/components/UserMessage.test.js.map +0 -1
  1042. package/dist/ui/components/themed-output.test.d.ts +0 -2
  1043. package/dist/ui/components/themed-output.test.d.ts.map +0 -1
  1044. package/dist/ui/components/themed-output.test.js +0 -111
  1045. package/dist/ui/components/themed-output.test.js.map +0 -1
  1046. package/dist/ui/footer-jump-regression.test.d.ts +0 -2
  1047. package/dist/ui/footer-jump-regression.test.d.ts.map +0 -1
  1048. package/dist/ui/footer-jump-regression.test.js +0 -224
  1049. package/dist/ui/footer-jump-regression.test.js.map +0 -1
  1050. package/dist/ui/footer-status-layout.test.d.ts +0 -2
  1051. package/dist/ui/footer-status-layout.test.d.ts.map +0 -1
  1052. package/dist/ui/footer-status-layout.test.js +0 -71
  1053. package/dist/ui/footer-status-layout.test.js.map +0 -1
  1054. package/dist/ui/frame-clip-regression.test.d.ts +0 -2
  1055. package/dist/ui/frame-clip-regression.test.d.ts.map +0 -1
  1056. package/dist/ui/frame-clip-regression.test.js +0 -215
  1057. package/dist/ui/frame-clip-regression.test.js.map +0 -1
  1058. package/dist/ui/goal-events.test.d.ts +0 -2
  1059. package/dist/ui/goal-events.test.d.ts.map +0 -1
  1060. package/dist/ui/goal-events.test.js +0 -350
  1061. package/dist/ui/goal-events.test.js.map +0 -1
  1062. package/dist/ui/goal-lifecycle-orchestration.test.d.ts +0 -2
  1063. package/dist/ui/goal-lifecycle-orchestration.test.d.ts.map +0 -1
  1064. package/dist/ui/goal-lifecycle-orchestration.test.js +0 -512
  1065. package/dist/ui/goal-lifecycle-orchestration.test.js.map +0 -1
  1066. package/dist/ui/goal-overlay.test.d.ts +0 -2
  1067. package/dist/ui/goal-overlay.test.d.ts.map +0 -1
  1068. package/dist/ui/goal-overlay.test.js +0 -384
  1069. package/dist/ui/goal-overlay.test.js.map +0 -1
  1070. package/dist/ui/goal-status-bar.test.d.ts +0 -2
  1071. package/dist/ui/goal-status-bar.test.d.ts.map +0 -1
  1072. package/dist/ui/goal-status-bar.test.js +0 -172
  1073. package/dist/ui/goal-status-bar.test.js.map +0 -1
  1074. package/dist/ui/hooks/stall-retry-duplicate.test.d.ts +0 -2
  1075. package/dist/ui/hooks/stall-retry-duplicate.test.d.ts.map +0 -1
  1076. package/dist/ui/hooks/stall-retry-duplicate.test.js +0 -94
  1077. package/dist/ui/hooks/stall-retry-duplicate.test.js.map +0 -1
  1078. package/dist/ui/hooks/useAgentLoop.test.d.ts +0 -2
  1079. package/dist/ui/hooks/useAgentLoop.test.d.ts.map +0 -1
  1080. package/dist/ui/hooks/useAgentLoop.test.js +0 -66
  1081. package/dist/ui/hooks/useAgentLoop.test.js.map +0 -1
  1082. package/dist/ui/hooks/useContextCompaction.test.d.ts +0 -2
  1083. package/dist/ui/hooks/useContextCompaction.test.d.ts.map +0 -1
  1084. package/dist/ui/hooks/useContextCompaction.test.js +0 -135
  1085. package/dist/ui/hooks/useContextCompaction.test.js.map +0 -1
  1086. package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.d.ts +0 -2
  1087. package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.d.ts.map +0 -1
  1088. package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.js +0 -81
  1089. package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.js.map +0 -1
  1090. package/dist/ui/hooks/useTranscriptHistory.test.d.ts +0 -2
  1091. package/dist/ui/hooks/useTranscriptHistory.test.d.ts.map +0 -1
  1092. package/dist/ui/hooks/useTranscriptHistory.test.js +0 -61
  1093. package/dist/ui/hooks/useTranscriptHistory.test.js.map +0 -1
  1094. package/dist/ui/hooks/useTranscriptScroll.test.d.ts +0 -2
  1095. package/dist/ui/hooks/useTranscriptScroll.test.d.ts.map +0 -1
  1096. package/dist/ui/hooks/useTranscriptScroll.test.js +0 -119
  1097. package/dist/ui/hooks/useTranscriptScroll.test.js.map +0 -1
  1098. package/dist/ui/live-area-clamp.test.d.ts +0 -2
  1099. package/dist/ui/live-area-clamp.test.d.ts.map +0 -1
  1100. package/dist/ui/live-area-clamp.test.js +0 -125
  1101. package/dist/ui/live-area-clamp.test.js.map +0 -1
  1102. package/dist/ui/live-area-height.test.d.ts +0 -2
  1103. package/dist/ui/live-area-height.test.d.ts.map +0 -1
  1104. package/dist/ui/live-area-height.test.js +0 -76
  1105. package/dist/ui/live-area-height.test.js.map +0 -1
  1106. package/dist/ui/live-frame-height.test.d.ts +0 -2
  1107. package/dist/ui/live-frame-height.test.d.ts.map +0 -1
  1108. package/dist/ui/live-frame-height.test.js +0 -116
  1109. package/dist/ui/live-frame-height.test.js.map +0 -1
  1110. package/dist/ui/live-item-flush.test.d.ts +0 -2
  1111. package/dist/ui/live-item-flush.test.d.ts.map +0 -1
  1112. package/dist/ui/live-item-flush.test.js +0 -437
  1113. package/dist/ui/live-item-flush.test.js.map +0 -1
  1114. package/dist/ui/long-prompt-regression-harness.test.d.ts +0 -2
  1115. package/dist/ui/long-prompt-regression-harness.test.d.ts.map +0 -1
  1116. package/dist/ui/long-prompt-regression-harness.test.js +0 -195
  1117. package/dist/ui/long-prompt-regression-harness.test.js.map +0 -1
  1118. package/dist/ui/pixel.test.d.ts +0 -2
  1119. package/dist/ui/pixel.test.d.ts.map +0 -1
  1120. package/dist/ui/pixel.test.js +0 -138
  1121. package/dist/ui/pixel.test.js.map +0 -1
  1122. package/dist/ui/plan-overlay.test.d.ts +0 -2
  1123. package/dist/ui/plan-overlay.test.d.ts.map +0 -1
  1124. package/dist/ui/plan-overlay.test.js +0 -305
  1125. package/dist/ui/plan-overlay.test.js.map +0 -1
  1126. package/dist/ui/queued-message.test.d.ts +0 -2
  1127. package/dist/ui/queued-message.test.d.ts.map +0 -1
  1128. package/dist/ui/queued-message.test.js +0 -172
  1129. package/dist/ui/queued-message.test.js.map +0 -1
  1130. package/dist/ui/render.test.d.ts +0 -2
  1131. package/dist/ui/render.test.d.ts.map +0 -1
  1132. package/dist/ui/render.test.js +0 -42
  1133. package/dist/ui/render.test.js.map +0 -1
  1134. package/dist/ui/scroll-stabilization.test.d.ts +0 -2
  1135. package/dist/ui/scroll-stabilization.test.d.ts.map +0 -1
  1136. package/dist/ui/scroll-stabilization.test.js +0 -64
  1137. package/dist/ui/scroll-stabilization.test.js.map +0 -1
  1138. package/dist/ui/slash-command-images.test.d.ts +0 -2
  1139. package/dist/ui/slash-command-images.test.d.ts.map +0 -1
  1140. package/dist/ui/slash-command-images.test.js +0 -110
  1141. package/dist/ui/slash-command-images.test.js.map +0 -1
  1142. package/dist/ui/startup-banner-order.test.d.ts +0 -2
  1143. package/dist/ui/startup-banner-order.test.d.ts.map +0 -1
  1144. package/dist/ui/startup-banner-order.test.js +0 -105
  1145. package/dist/ui/startup-banner-order.test.js.map +0 -1
  1146. package/dist/ui/stores/transcript-scroll-store.test.d.ts +0 -2
  1147. package/dist/ui/stores/transcript-scroll-store.test.d.ts.map +0 -1
  1148. package/dist/ui/stores/transcript-scroll-store.test.js +0 -73
  1149. package/dist/ui/stores/transcript-scroll-store.test.js.map +0 -1
  1150. package/dist/ui/streaming-flush-bounce.test.d.ts +0 -2
  1151. package/dist/ui/streaming-flush-bounce.test.d.ts.map +0 -1
  1152. package/dist/ui/streaming-flush-bounce.test.js +0 -177
  1153. package/dist/ui/streaming-flush-bounce.test.js.map +0 -1
  1154. package/dist/ui/submit-boundary-gap.test.d.ts +0 -2
  1155. package/dist/ui/submit-boundary-gap.test.d.ts.map +0 -1
  1156. package/dist/ui/submit-boundary-gap.test.js +0 -180
  1157. package/dist/ui/submit-boundary-gap.test.js.map +0 -1
  1158. package/dist/ui/terminal-history-repaint.test.d.ts +0 -2
  1159. package/dist/ui/terminal-history-repaint.test.d.ts.map +0 -1
  1160. package/dist/ui/terminal-history-repaint.test.js +0 -73
  1161. package/dist/ui/terminal-history-repaint.test.js.map +0 -1
  1162. package/dist/ui/terminal-history-retry-dedup.test.d.ts +0 -2
  1163. package/dist/ui/terminal-history-retry-dedup.test.d.ts.map +0 -1
  1164. package/dist/ui/terminal-history-retry-dedup.test.js +0 -61
  1165. package/dist/ui/terminal-history-retry-dedup.test.js.map +0 -1
  1166. package/dist/ui/terminal-history.test.d.ts +0 -2
  1167. package/dist/ui/terminal-history.test.d.ts.map +0 -1
  1168. package/dist/ui/terminal-history.test.js +0 -557
  1169. package/dist/ui/terminal-history.test.js.map +0 -1
  1170. package/dist/ui/thinking-level-cycle.test.d.ts +0 -2
  1171. package/dist/ui/thinking-level-cycle.test.d.ts.map +0 -1
  1172. package/dist/ui/thinking-level-cycle.test.js +0 -45
  1173. package/dist/ui/thinking-level-cycle.test.js.map +0 -1
  1174. package/dist/ui/tool-group-summary.test.d.ts +0 -2
  1175. package/dist/ui/tool-group-summary.test.d.ts.map +0 -1
  1176. package/dist/ui/tool-group-summary.test.js +0 -79
  1177. package/dist/ui/tool-group-summary.test.js.map +0 -1
  1178. package/dist/ui/transcript/spacing.test.d.ts +0 -2
  1179. package/dist/ui/transcript/spacing.test.d.ts.map +0 -1
  1180. package/dist/ui/transcript/spacing.test.js +0 -191
  1181. package/dist/ui/transcript/spacing.test.js.map +0 -1
  1182. package/dist/ui/transcript/transcript-lines.test.d.ts +0 -2
  1183. package/dist/ui/transcript/transcript-lines.test.d.ts.map +0 -1
  1184. package/dist/ui/transcript/transcript-lines.test.js +0 -76
  1185. package/dist/ui/transcript/transcript-lines.test.js.map +0 -1
  1186. package/dist/ui/transcript-viewport-pinning.test.d.ts +0 -2
  1187. package/dist/ui/transcript-viewport-pinning.test.d.ts.map +0 -1
  1188. package/dist/ui/transcript-viewport-pinning.test.js +0 -148
  1189. package/dist/ui/transcript-viewport-pinning.test.js.map +0 -1
  1190. package/dist/ui/tui-history-parity.test.d.ts +0 -2
  1191. package/dist/ui/tui-history-parity.test.d.ts.map +0 -1
  1192. package/dist/ui/tui-history-parity.test.js +0 -388
  1193. package/dist/ui/tui-history-parity.test.js.map +0 -1
  1194. package/dist/ui/tui-simulation.test.d.ts +0 -2
  1195. package/dist/ui/tui-simulation.test.d.ts.map +0 -1
  1196. package/dist/ui/tui-simulation.test.js +0 -145
  1197. package/dist/ui/tui-simulation.test.js.map +0 -1
  1198. package/dist/ui/tui-terminal-recorder.test.d.ts +0 -2
  1199. package/dist/ui/tui-terminal-recorder.test.d.ts.map +0 -1
  1200. package/dist/ui/tui-terminal-recorder.test.js +0 -134
  1201. package/dist/ui/tui-terminal-recorder.test.js.map +0 -1
  1202. package/dist/ui/utils/assistant-stream-split.test.d.ts +0 -2
  1203. package/dist/ui/utils/assistant-stream-split.test.d.ts.map +0 -1
  1204. package/dist/ui/utils/assistant-stream-split.test.js +0 -74
  1205. package/dist/ui/utils/assistant-stream-split.test.js.map +0 -1
  1206. package/dist/ui/utils/markdown-renderer.test.d.ts +0 -2
  1207. package/dist/ui/utils/markdown-renderer.test.d.ts.map +0 -1
  1208. package/dist/ui/utils/markdown-renderer.test.js +0 -63
  1209. package/dist/ui/utils/markdown-renderer.test.js.map +0 -1
  1210. package/dist/ui/utils/table-text.test.d.ts +0 -2
  1211. package/dist/ui/utils/table-text.test.d.ts.map +0 -1
  1212. package/dist/ui/utils/table-text.test.js +0 -202
  1213. package/dist/ui/utils/table-text.test.js.map +0 -1
  1214. package/dist/ui/utils/terminal-graphics.test.d.ts +0 -2
  1215. package/dist/ui/utils/terminal-graphics.test.d.ts.map +0 -1
  1216. package/dist/ui/utils/terminal-graphics.test.js +0 -100
  1217. package/dist/ui/utils/terminal-graphics.test.js.map +0 -1
  1218. package/dist/ui/utils/terminal-input.test.d.ts +0 -2
  1219. package/dist/ui/utils/terminal-input.test.d.ts.map +0 -1
  1220. package/dist/ui/utils/terminal-input.test.js +0 -15
  1221. package/dist/ui/utils/terminal-input.test.js.map +0 -1
  1222. package/dist/utils/git.test.d.ts +0 -2
  1223. package/dist/utils/git.test.d.ts.map +0 -1
  1224. package/dist/utils/git.test.js +0 -36
  1225. package/dist/utils/git.test.js.map +0 -1
  1226. package/dist/utils/github.test.d.ts +0 -2
  1227. package/dist/utils/github.test.d.ts.map +0 -1
  1228. package/dist/utils/github.test.js +0 -23
  1229. package/dist/utils/github.test.js.map +0 -1
  1230. package/dist/utils/http-body.test.d.ts +0 -2
  1231. package/dist/utils/http-body.test.d.ts.map +0 -1
  1232. package/dist/utils/http-body.test.js +0 -68
  1233. package/dist/utils/http-body.test.js.map +0 -1
  1234. package/dist/utils/image.test.d.ts +0 -2
  1235. package/dist/utils/image.test.d.ts.map +0 -1
  1236. package/dist/utils/image.test.js +0 -139
  1237. package/dist/utils/image.test.js.map +0 -1
  1238. package/dist/utils/plan-steps.test.d.ts +0 -2
  1239. package/dist/utils/plan-steps.test.d.ts.map +0 -1
  1240. package/dist/utils/plan-steps.test.js +0 -159
  1241. package/dist/utils/plan-steps.test.js.map +0 -1
  1242. package/dist/utils/process.test.d.ts +0 -2
  1243. package/dist/utils/process.test.d.ts.map +0 -1
  1244. package/dist/utils/process.test.js +0 -42
  1245. package/dist/utils/process.test.js.map +0 -1
@@ -1,1065 +0,0 @@
1
- import fs from "node:fs/promises";
2
- import os from "node:os";
3
- import path from "node:path";
4
- import { spawn } from "node:child_process";
5
- import { fileURLToPath } from "node:url";
6
- import { afterEach, beforeEach, describe, expect, it } from "vitest";
7
- import { ACP_PROTOCOL_VERSION } from "./acp-mode.js";
8
- const FIXTURE = path.join(path.dirname(fileURLToPath(import.meta.url)), "__fixtures__", "acp-stdio-agent.mjs");
9
- /**
10
- * A HOME the fixture seeds sessions into, and the project directory they
11
- * belong to.
12
- *
13
- * Real files rather than a stub: `session/list` and `session/load` exist to
14
- * surface sessions the desktop wrote, so anything short of the real
15
- * `~/.ezcoder/sessions` layout would prove nothing about that.
16
- */
17
- let tmpHome;
18
- let tmpProject;
19
- /** A second checkout, so "list everything" can be told apart from "list here". */
20
- let tmpOtherProject;
21
- /**
22
- * A live ACP agent in a child process, driven exactly the way a client drives
23
- * it: NDJSON in on stdin, NDJSON out on stdout.
24
- */
25
- class AcpClient {
26
- child;
27
- buffer = "";
28
- frames = [];
29
- waiters = [];
30
- stderr = "";
31
- exit;
32
- constructor() {
33
- this.child = spawn(process.execPath, ["--import", "tsx", FIXTURE, tmpProject, tmpOtherProject], {
34
- // Run from the package root so `tsx` resolves; the project directory is
35
- // passed explicitly rather than inherited from the test runner.
36
- cwd: process.cwd(),
37
- env: {
38
- ...process.env,
39
- HOME: tmpHome,
40
- USERPROFILE: tmpHome,
41
- EZ_DISABLE_TELEMETRY: "1",
42
- },
43
- stdio: ["pipe", "pipe", "pipe"],
44
- });
45
- this.child.stdout.setEncoding("utf8");
46
- this.child.stdout.on("data", (chunk) => {
47
- this.buffer += chunk;
48
- const lines = this.buffer.split("\n");
49
- this.buffer = lines.pop() ?? "";
50
- for (const line of lines) {
51
- if (line.trim())
52
- this.frames.push(JSON.parse(line));
53
- }
54
- for (const wake of this.waiters.splice(0))
55
- wake();
56
- });
57
- this.child.stderr.setEncoding("utf8");
58
- this.child.stderr.on("data", (chunk) => {
59
- this.stderr += chunk;
60
- });
61
- this.exit = new Promise((resolve) => this.child.on("close", (code) => resolve(code)));
62
- }
63
- send(frame) {
64
- this.child.stdin.write(`${JSON.stringify(frame)}\n`);
65
- }
66
- /** Write bytes verbatim, so malformed input can be tested. */
67
- sendRaw(text) {
68
- this.child.stdin.write(text);
69
- }
70
- /** Close stdin, which is how an ACP client disconnects. */
71
- end() {
72
- this.child.stdin.end();
73
- }
74
- kill() {
75
- this.child.kill("SIGKILL");
76
- }
77
- /** Every frame received so far, in arrival order. */
78
- received() {
79
- return [...this.frames];
80
- }
81
- /**
82
- * Wait for the response to `id`, returning everything that arrived up to and
83
- * including it. Ordering is the assertion that matters: notifications for a
84
- * turn must precede that turn's response.
85
- */
86
- async until(id, timeoutMs = 20_000) {
87
- const deadline = Date.now() + timeoutMs;
88
- for (;;) {
89
- const index = this.frames.findIndex((frame) => frame.id === id);
90
- if (index >= 0)
91
- return this.frames.slice(0, index + 1);
92
- const remaining = deadline - Date.now();
93
- if (remaining <= 0) {
94
- throw new Error(`timed out waiting for response ${String(id)}; got ${JSON.stringify(this.frames)} stderr=${this.stderr}`);
95
- }
96
- await new Promise((resolve) => {
97
- const timer = setTimeout(resolve, Math.min(remaining, 50));
98
- this.waiters.push(() => {
99
- clearTimeout(timer);
100
- resolve();
101
- });
102
- });
103
- }
104
- }
105
- /** Drive the handshake and return the created session id. */
106
- async handshake() {
107
- this.send({ jsonrpc: "2.0", id: 1, method: "initialize", params: { protocolVersion: 1 } });
108
- await this.until(1);
109
- this.send({
110
- jsonrpc: "2.0",
111
- id: 2,
112
- method: "session/new",
113
- params: { cwd: tmpProject, mcpServers: [] },
114
- });
115
- const frames = await this.until(2);
116
- return frames.at(-1).result.sessionId;
117
- }
118
- /** Wait for a `session/update` notification of one kind, ignoring the rest. */
119
- async untilUpdate(kind, timeoutMs = 20_000) {
120
- const deadline = Date.now() + timeoutMs;
121
- for (;;) {
122
- const found = updates(this.frames).find((update) => update.sessionUpdate === kind);
123
- if (found)
124
- return found;
125
- if (Date.now() >= deadline) {
126
- throw new Error(`timed out waiting for ${kind}; stderr=${this.stderr}`);
127
- }
128
- await new Promise((resolve) => setTimeout(resolve, 25));
129
- }
130
- }
131
- /**
132
- * The stored sessions the fixture seeded, newest first.
133
- *
134
- * Omitting `cwd` asks for every project, which is what a phone wants; passing
135
- * one scopes to that checkout.
136
- */
137
- async list(id = 90, cwd) {
138
- this.send({
139
- jsonrpc: "2.0",
140
- id,
141
- method: "session/list",
142
- params: cwd ? { cwd } : {},
143
- });
144
- const frames = await this.until(id);
145
- return frames.at(-1).result.sessions;
146
- }
147
- }
148
- let client;
149
- beforeEach(async () => {
150
- tmpHome = await fs.mkdtemp(path.join(os.tmpdir(), "ez-acp-home-"));
151
- tmpProject = await fs.mkdtemp(path.join(os.tmpdir(), "ez-acp-project-"));
152
- tmpOtherProject = await fs.mkdtemp(path.join(os.tmpdir(), "ez-acp-other-"));
153
- });
154
- afterEach(async () => {
155
- client?.kill();
156
- client = undefined;
157
- await fs.rm(tmpHome, { recursive: true, force: true });
158
- await fs.rm(tmpProject, { recursive: true, force: true });
159
- await fs.rm(tmpOtherProject, { recursive: true, force: true });
160
- });
161
- /** Session updates only, unwrapped to the `update` payload. */
162
- function updates(frames) {
163
- return frames
164
- .filter((frame) => frame.method === "session/update")
165
- .map((frame) => frame.params.update);
166
- }
167
- /** Updates a session announces on its own schedule, not as part of a turn. */
168
- const OUT_OF_BAND_UPDATES = new Set([
169
- "available_commands_update",
170
- "usage_update",
171
- "session_info_update",
172
- ]);
173
- /**
174
- * Conversation updates only.
175
- *
176
- * The command list and the context-usage report are announced on their own
177
- * schedule after a session opens, so an exact-match transcript assertion would
178
- * otherwise pass or fail on timing.
179
- */
180
- function transcript(frames) {
181
- return updates(frames).filter((update) => !OUT_OF_BAND_UPDATES.has(update.sessionUpdate));
182
- }
183
- /** Context-usage notifications only, in arrival order. */
184
- function usageUpdates(frames) {
185
- return updates(frames).filter((update) => update.sessionUpdate === "usage_update");
186
- }
187
- /** Every update of one kind, in arrival order. */
188
- function updatesOfKind(frames, kind) {
189
- return updates(frames).filter((update) => update.sessionUpdate === kind);
190
- }
191
- describe("ACP mode over stdio", () => {
192
- it("negotiates initialize and creates a session", async () => {
193
- client = new AcpClient();
194
- client.send({ jsonrpc: "2.0", id: 1, method: "initialize", params: { protocolVersion: 1 } });
195
- const frames = await client.until(1);
196
- const initialize = frames.at(-1);
197
- expect(initialize.jsonrpc).toBe("2.0");
198
- expect(initialize.result).toMatchObject({
199
- protocolVersion: ACP_PROTOCOL_VERSION,
200
- authMethods: [],
201
- agentInfo: { name: "ezcoder", title: "EZ Coder", version: "0.0.0-test" },
202
- });
203
- // A client only offers resume and a session list when these are advertised,
204
- // and `{}` — not `true` — is how ACP spells "supported" for these two.
205
- expect(initialize.result.agentCapabilities).toMatchObject({
206
- loadSession: true,
207
- sessionCapabilities: { list: {}, resume: {}, close: {}, delete: {} },
208
- });
209
- client.send({ jsonrpc: "2.0", id: 2, method: "session/new", params: { cwd: tmpProject } });
210
- const created = (await client.until(2)).at(-1);
211
- expect(created.result.sessionId).toBe("acp-fixture-session");
212
- });
213
- it("lists sessions from every project, newest first, titled by their first user prompt", async () => {
214
- client = new AcpClient();
215
- await client.handshake();
216
- const sessions = await client.list();
217
- // No `cwd` means the whole machine, so the other checkout's session must be
218
- // here too — a phone asks "what have I been working on", not "what is in
219
- // this one directory". The empty seeded session must NOT appear: there is
220
- // nothing to resume.
221
- expect(sessions).toHaveLength(3);
222
- expect(sessions.map((entry) => entry.title)).toEqual([
223
- "other project: fix the parser",
224
- "newer: add the config panel",
225
- "older: rename the widget",
226
- ]);
227
- // Each entry carries its own project, which is what lets a client group by
228
- // checkout instead of showing one flat undifferentiated list.
229
- expect(sessions.map((entry) => entry.cwd)).toEqual([tmpOtherProject, tmpProject, tmpProject]);
230
- for (const entry of sessions)
231
- expect(Date.parse(entry.updatedAt)).not.toBeNaN();
232
- // Ids must be the ones the fixture actually wrote, or `session/load` is
233
- // addressing something that does not exist.
234
- expect(client.stderr).toContain(sessions[0].sessionId);
235
- expect(client.stderr).toContain(sessions[1].sessionId);
236
- });
237
- it("scopes the list to one project when a cwd is given", async () => {
238
- client = new AcpClient();
239
- await client.handshake();
240
- const scoped = await client.list(90, tmpProject);
241
- expect(scoped.map((entry) => entry.title)).toEqual([
242
- "newer: add the config panel",
243
- "older: rename the widget",
244
- ]);
245
- for (const entry of scoped)
246
- expect(entry.cwd).toBe(tmpProject);
247
- });
248
- it("replays a loaded session's transcript before answering, then resumes it", async () => {
249
- client = new AcpClient();
250
- await client.handshake();
251
- const [newest] = await client.list(90, tmpProject);
252
- client.send({
253
- jsonrpc: "2.0",
254
- id: 91,
255
- method: "session/load",
256
- params: { sessionId: newest.sessionId, cwd: tmpProject, mcpServers: [] },
257
- });
258
- const frames = await client.until(91);
259
- const replay = frames.filter((frame) => frame.method === "session/update" &&
260
- !OUT_OF_BAND_UPDATES.has(frame.params.update.sessionUpdate));
261
- // History must arrive BEFORE the response: a client draws a resumed session
262
- // with its live-turn renderer, so anything after the reply lands nowhere.
263
- expect(replay.length).toBeGreaterThan(0);
264
- expect(frames.at(-1).id).toBe(91);
265
- for (const frame of replay)
266
- expect(frame.params.sessionId).toBe(newest.sessionId);
267
- expect(transcript(frames)).toEqual([
268
- {
269
- sessionUpdate: "user_message_chunk",
270
- // Chunks carry the message they belong to, so a client can group them
271
- // into bubbles instead of guessing at boundaries.
272
- messageId: "hist-1",
273
- content: { type: "text", text: "newer: add the config panel" },
274
- },
275
- {
276
- sessionUpdate: "agent_message_chunk",
277
- messageId: "hist-2",
278
- content: { type: "text", text: "Reading the panel first." },
279
- },
280
- {
281
- sessionUpdate: "tool_call",
282
- toolCallId: "call-1",
283
- title: "read(/panel.tsx)",
284
- name: "read",
285
- kind: "read",
286
- // A replayed call is settled; `in_progress` would spin forever.
287
- status: "completed",
288
- rawInput: { file_path: "/panel.tsx" },
289
- },
290
- {
291
- sessionUpdate: "tool_call_update",
292
- toolCallId: "call-1",
293
- status: "completed",
294
- content: [{ type: "content", content: { type: "text", text: "panel source" } }],
295
- },
296
- {
297
- sessionUpdate: "agent_message_chunk",
298
- messageId: "hist-3",
299
- content: { type: "text", text: "Added the config panel." },
300
- },
301
- {
302
- sessionUpdate: "user_message_chunk",
303
- messageId: "hist-4",
304
- content: { type: "text", text: "after first compaction" },
305
- },
306
- {
307
- sessionUpdate: "agent_message_chunk",
308
- messageId: "hist-5",
309
- content: { type: "text", text: "First follow-up complete." },
310
- },
311
- {
312
- sessionUpdate: "user_message_chunk",
313
- messageId: "hist-6",
314
- content: { type: "text", text: "after second compaction" },
315
- },
316
- {
317
- sessionUpdate: "agent_message_chunk",
318
- messageId: "hist-7",
319
- content: { type: "text", text: "Second follow-up complete." },
320
- },
321
- ]);
322
- const replayText = transcript(frames)
323
- .map((update) => update.content?.text ?? "")
324
- .join("\n");
325
- expect(replayText).not.toContain("replacement summary");
326
- // Resuming is worthless if the session cannot then be prompted, and the
327
- // client must keep addressing it by the id it asked to load.
328
- client.send({
329
- jsonrpc: "2.0",
330
- id: 92,
331
- method: "session/prompt",
332
- params: { sessionId: newest.sessionId, prompt: [{ type: "text", text: "again" }] },
333
- });
334
- const turn = await client.until(92);
335
- expect(turn.at(-1).result).toEqual({ stopReason: "end_turn" });
336
- expect(turn
337
- .filter((frame) => frame.method === "session/update" &&
338
- !OUT_OF_BAND_UPDATES.has(frame.params.update.sessionUpdate))
339
- .every((frame) => frame.params.sessionId === newest.sessionId)).toBe(true);
340
- // Full replay is display-only: prompting still sees only generation 2.
341
- const contextStart = client.received().length;
342
- client.send({
343
- jsonrpc: "2.0",
344
- id: 93,
345
- method: "session/prompt",
346
- params: {
347
- sessionId: newest.sessionId,
348
- prompt: [{ type: "text", text: "report loaded context" }],
349
- },
350
- });
351
- const contextFrames = (await client.until(93)).slice(contextStart);
352
- const contextText = transcript(contextFrames)
353
- .map((update) => update.content?.text ?? "")
354
- .join("\n");
355
- expect(contextText).toContain("second replacement summary");
356
- expect(contextText).toContain("after second compaction");
357
- expect(contextText).not.toContain("newer: add the config panel");
358
- });
359
- it("loads a session listed under a different cwd than the one it is opened with", async () => {
360
- client = new AcpClient();
361
- await client.handshake();
362
- const [newest] = await client.list(90, tmpProject);
363
- // Exactly what pew2 does: its capability probe lists from its own working
364
- // directory, then resumes against the project the session belongs to. A
365
- // cwd-scoped lookup fails here, so this is the regression that matters.
366
- client.send({
367
- jsonrpc: "2.0",
368
- id: 91,
369
- method: "session/load",
370
- params: { sessionId: newest.sessionId, cwd: os.tmpdir(), mcpServers: [] },
371
- });
372
- const frames = await client.until(91);
373
- expect(frames.at(-1).error).toBeUndefined();
374
- expect(transcript(frames)[0]).toEqual({
375
- sessionUpdate: "user_message_chunk",
376
- messageId: "hist-1",
377
- content: { type: "text", text: "newer: add the config panel" },
378
- });
379
- });
380
- it("replays a compaction summary when the parent checkpoint is missing", async () => {
381
- client = new AcpClient();
382
- await client.handshake();
383
- const stored = await client.list(90, tmpProject);
384
- const older = stored.find((entry) => entry.title === "older: rename the widget");
385
- client.send({
386
- jsonrpc: "2.0",
387
- id: 91,
388
- method: "session/load",
389
- params: { sessionId: older.sessionId, cwd: tmpProject, mcpServers: [] },
390
- });
391
- const frames = await client.until(91);
392
- expect(transcript(frames)).toEqual([
393
- {
394
- sessionUpdate: "user_message_chunk",
395
- messageId: "hist-1",
396
- content: {
397
- type: "text",
398
- text: "[Previous conversation summary]\n\nolder fallback summary",
399
- },
400
- },
401
- {
402
- sessionUpdate: "agent_message_chunk",
403
- messageId: "hist-2",
404
- content: { type: "text", text: "Recovered from summary." },
405
- },
406
- ]);
407
- });
408
- it("refuses to load a session that does not exist", async () => {
409
- client = new AcpClient();
410
- await client.handshake();
411
- client.send({
412
- jsonrpc: "2.0",
413
- id: 91,
414
- method: "session/load",
415
- params: { sessionId: "no-such-session", cwd: tmpProject, mcpServers: [] },
416
- });
417
- expect((await client.until(91)).at(-1).error).toMatchObject({
418
- code: -32602,
419
- message: expect.stringContaining("no-such-session"),
420
- });
421
- });
422
- it("advertises model and thinking selectors, and applies changes to both", async () => {
423
- client = new AcpClient();
424
- client.send({ jsonrpc: "2.0", id: 1, method: "initialize", params: { protocolVersion: 1 } });
425
- await client.until(1);
426
- client.send({
427
- jsonrpc: "2.0",
428
- id: 2,
429
- method: "session/new",
430
- params: { cwd: tmpProject, mcpServers: [] },
431
- });
432
- const created = (await client.until(2)).at(-1);
433
- const initial = created.result.configOptions;
434
- const model = initial.find((option) => option.id === "model");
435
- const thinking = initial.find((option) => option.id === "thinking");
436
- // Categories are what let a client place these correctly without knowing
437
- // anything about ezcoder.
438
- expect(model).toMatchObject({ category: "model", type: "select" });
439
- expect(thinking).toMatchObject({ category: "thought_level", type: "select" });
440
- expect(model.currentValue).toBe("claude-opus-5");
441
- expect(model.options.length).toBeGreaterThan(1);
442
- expect(model.options.some((option) => option.value === "claude-opus-5")).toBe(true);
443
- expect(thinking.currentValue).toBe("off");
444
- expect(thinking.options[0]).toMatchObject({ value: "off" });
445
- client.send({
446
- jsonrpc: "2.0",
447
- id: 3,
448
- method: "session/set_config_option",
449
- params: { sessionId: "acp-fixture-session", configId: "thinking", value: "high" },
450
- });
451
- const afterThinking = (await client.until(3)).at(-1).result.configOptions;
452
- // The reply must carry the COMPLETE set, not just the field that changed.
453
- expect(afterThinking.map((option) => option.id).sort()).toEqual(["mode", "model", "thinking"]);
454
- expect(afterThinking.find((option) => option.id === "thinking").currentValue).toBe("high");
455
- client.send({
456
- jsonrpc: "2.0",
457
- id: 4,
458
- method: "session/set_config_option",
459
- params: {
460
- sessionId: "acp-fixture-session",
461
- configId: "model",
462
- value: "claude-haiku-4-5-20251001",
463
- },
464
- });
465
- const afterModel = (await client.until(4)).at(-1).result.configOptions;
466
- expect(afterModel.find((option) => option.id === "model").currentValue).toBe("claude-haiku-4-5-20251001");
467
- // Haiku's ceiling is `high`, so the ladder must shrink with the model rather
468
- // than keep offering a level it would silently ignore.
469
- const haikuLevels = afterModel.find((option) => option.id === "thinking").options;
470
- expect(haikuLevels.some((option) => option.value === "max")).toBe(false);
471
- expect(haikuLevels.at(-1)).toMatchObject({ value: "high" });
472
- // The level set before the switch is still legal here, so it must survive.
473
- expect(afterModel.find((option) => option.id === "thinking").currentValue).toBe("high");
474
- });
475
- it("clamps a thinking level the newly selected model cannot reach", async () => {
476
- client = new AcpClient();
477
- await client.handshake();
478
- client.send({
479
- jsonrpc: "2.0",
480
- id: 3,
481
- method: "session/set_config_option",
482
- params: { sessionId: "acp-fixture-session", configId: "thinking", value: "max" },
483
- });
484
- await client.until(3);
485
- client.send({
486
- jsonrpc: "2.0",
487
- id: 4,
488
- method: "session/set_config_option",
489
- params: {
490
- sessionId: "acp-fixture-session",
491
- configId: "model",
492
- value: "claude-haiku-4-5-20251001",
493
- },
494
- });
495
- const options = (await client.until(4)).at(-1).result.configOptions;
496
- // Reporting `max` here would be a control that lies: Haiku has no such tier,
497
- // so the session's real effort is `high` and the client must be told that.
498
- expect(options.find((option) => option.id === "thinking").currentValue).toBe("high");
499
- });
500
- it("advertises plan mode in both the config options and the modes block", async () => {
501
- client = new AcpClient();
502
- client.send({ jsonrpc: "2.0", id: 1, method: "initialize", params: { protocolVersion: 1 } });
503
- await client.until(1);
504
- client.send({
505
- jsonrpc: "2.0",
506
- id: 2,
507
- method: "session/new",
508
- params: { cwd: tmpProject, mcpServers: [] },
509
- });
510
- const created = (await client.until(2)).at(-1).result;
511
- // Two surfaces, one truth: spec clients (Zed) read `modes`; pew2 reads the
512
- // config option. They must agree or the two pickers would disagree.
513
- expect(created.modes).toEqual({
514
- currentModeId: "default",
515
- availableModes: [
516
- { id: "default", name: "Default", description: "Full tool access" },
517
- { id: "plan", name: "Plan", description: "Read-only research until a plan is approved" },
518
- ],
519
- });
520
- const mode = created.configOptions.find((option) => option.id === "mode");
521
- expect(mode).toMatchObject({ category: "mode", type: "select", currentValue: "default" });
522
- expect(mode.options.map((option) => option.value)).toEqual(["default", "plan"]);
523
- });
524
- it("announces available commands after session/new, merging built-ins with project files", async () => {
525
- // A project command, and one whose name collides with a built-in template.
526
- const commandsDir = path.join(tmpProject, ".ezcoder", "commands");
527
- await fs.mkdir(commandsDir, { recursive: true });
528
- await fs.writeFile(path.join(commandsDir, "commit.md"), "---\nname: commit\ndescription: Check, review, commit and push\n---\n\nRun the checks.\n");
529
- await fs.writeFile(path.join(commandsDir, "init.md"), "---\nname: init\ndescription: Shadowed by the built-in\n---\n\nNever runs.\n");
530
- // A project file whose name collides with a REGISTRY command (the fixture
531
- // registers `/new`). The session resolves a template body before consulting
532
- // the registry, so this file really is what `/new` runs here.
533
- await fs.writeFile(path.join(commandsDir, "new.md"), "---\nname: new\ndescription: Project override of the registry command\n---\n\nRuns.\n");
534
- client = new AcpClient();
535
- client.send({ jsonrpc: "2.0", id: 1, method: "initialize", params: { protocolVersion: 1 } });
536
- await client.until(1);
537
- client.send({
538
- jsonrpc: "2.0",
539
- id: 2,
540
- method: "session/new",
541
- params: { cwd: tmpProject, mcpServers: [] },
542
- });
543
- const frames = await client.until(2);
544
- // The announcement must not overtake the response that names the session.
545
- expect(updates(frames).some((u) => u.sessionUpdate === "available_commands_update")).toBe(false);
546
- const update = await client.untilUpdate("available_commands_update");
547
- const commands = update.availableCommands;
548
- const byName = new Map(commands.map((command) => [command.name, command]));
549
- // A built-in the client could not have discovered by scanning the disk.
550
- expect(byName.get("bullet-proof")).toMatchObject({
551
- description: "Audit exploitable weaknesses",
552
- input: { hint: expect.any(String) },
553
- });
554
- // A project file, carried with its own frontmatter description.
555
- expect(byName.get("commit").description).toBe("Check, review, commit and push");
556
- // Collisions resolve the way the session itself resolves them: a built-in
557
- // template beats a project file, and it is listed once.
558
- expect(commands.filter((command) => command.name === "init")).toHaveLength(1);
559
- expect(byName.get("init").description).toBe("Generate or update CLAUDE.md for this project");
560
- // ...but a project file beats a REGISTRY command, because that is the order
561
- // `resolveSlashInput` uses. Advertising the registry's `/new` here would
562
- // describe something the agent would never run.
563
- expect(commands.filter((command) => command.name === "new")).toHaveLength(1);
564
- expect(byName.get("new").description).toBe("Project override of the registry command");
565
- // A registry command with no collision is listed, with a hint parsed from
566
- // its usage rather than the template hint.
567
- expect(byName.get("quit")).toEqual({ name: "quit", description: "Exit the agent" });
568
- // Aliases are not separate commands.
569
- expect(byName.has("bp")).toBe(false);
570
- });
571
- it("switches mode via session/set_mode and tells the client with current_mode_update", async () => {
572
- client = new AcpClient();
573
- const sessionId = await client.handshake();
574
- client.send({
575
- jsonrpc: "2.0",
576
- id: 3,
577
- method: "session/set_mode",
578
- params: { sessionId, modeId: "plan" },
579
- });
580
- const frames = await client.until(3);
581
- expect(frames.at(-1).result).toEqual({});
582
- const notes = transcript(frames);
583
- expect(notes[0]).toEqual({ sessionUpdate: "current_mode_update", currentModeId: "plan" });
584
- // The full option set rides along so a client tracking config sees the
585
- // same truth the modes block would tell it.
586
- const configNote = notes.find((u) => u.sessionUpdate === "config_option_update");
587
- expect((configNote.configOptions ?? []).find((o) => o.id === "mode")
588
- .currentValue).toBe("plan");
589
- // And back — via the config-option route pew2 actually uses.
590
- client.send({
591
- jsonrpc: "2.0",
592
- id: 4,
593
- method: "session/set_config_option",
594
- params: { sessionId, configId: "mode", value: "default" },
595
- });
596
- const back = (await client.until(4)).at(-1).result.configOptions;
597
- expect(back.find((option) => option.id === "mode").currentValue).toBe("default");
598
- });
599
- it("rejects an unknown mode", async () => {
600
- client = new AcpClient();
601
- const sessionId = await client.handshake();
602
- client.send({
603
- jsonrpc: "2.0",
604
- id: 3,
605
- method: "session/set_mode",
606
- params: { sessionId, modeId: "yolo" },
607
- });
608
- expect((await client.until(3)).at(-1).error).toMatchObject({
609
- code: -32602,
610
- message: expect.stringContaining("yolo"),
611
- });
612
- });
613
- it("rejects config values the active model cannot honour", async () => {
614
- client = new AcpClient();
615
- await client.handshake();
616
- client.send({
617
- jsonrpc: "2.0",
618
- id: 3,
619
- method: "session/set_config_option",
620
- params: { sessionId: "acp-fixture-session", configId: "model", value: "not-a-model" },
621
- });
622
- expect((await client.until(3)).at(-1).error).toMatchObject({
623
- code: -32602,
624
- message: expect.stringContaining("not-a-model"),
625
- });
626
- client.send({
627
- jsonrpc: "2.0",
628
- id: 4,
629
- method: "session/set_config_option",
630
- params: { sessionId: "acp-fixture-session", configId: "nonsense", value: "x" },
631
- });
632
- expect((await client.until(4)).at(-1).error).toMatchObject({ code: -32602 });
633
- });
634
- it("maps the event bus onto session/update notifications, then answers with a stopReason", async () => {
635
- client = new AcpClient();
636
- const sessionId = await client.handshake();
637
- client.send({
638
- jsonrpc: "2.0",
639
- id: 3,
640
- method: "session/prompt",
641
- params: { sessionId, prompt: [{ type: "text", text: "world" }] },
642
- });
643
- const frames = await client.until(3);
644
- const turn = frames.filter((frame) => frame.method === "session/update" || frame.id === 3);
645
- // Every notification for the turn must arrive BEFORE its response, or a
646
- // client renders the finished turn with no content in it.
647
- expect(turn.at(-1).result).toEqual({ stopReason: "end_turn" });
648
- expect(turn.slice(0, -1).every((frame) => frame.method === "session/update")).toBe(true);
649
- for (const frame of frames.filter((f) => f.method === "session/update")) {
650
- expect(frame.params.sessionId).toBe(sessionId);
651
- }
652
- expect(transcript(frames)).toEqual([
653
- { sessionUpdate: "agent_thought_chunk", content: { type: "text", text: "planning" } },
654
- // Both deltas belong to the same message, so they share an id; the tool
655
- // call below ends it, and anything after starts a new one.
656
- {
657
- sessionUpdate: "agent_message_chunk",
658
- messageId: "msg-1",
659
- content: { type: "text", text: "Hello " },
660
- },
661
- {
662
- sessionUpdate: "agent_message_chunk",
663
- messageId: "msg-1",
664
- content: { type: "text", text: "world" },
665
- },
666
- {
667
- sessionUpdate: "tool_call",
668
- toolCallId: "t1",
669
- title: "read(/tmp/example.ts)",
670
- name: "read",
671
- kind: "read",
672
- status: "in_progress",
673
- rawInput: { file_path: "/tmp/example.ts" },
674
- // Drives "follow the agent": the client opens the file being read.
675
- locations: [{ path: "/tmp/example.ts" }],
676
- },
677
- {
678
- sessionUpdate: "tool_call_update",
679
- toolCallId: "t1",
680
- status: "in_progress",
681
- rawOutput: { progress: 0.5 },
682
- },
683
- {
684
- sessionUpdate: "tool_call_update",
685
- toolCallId: "t1",
686
- status: "completed",
687
- content: [{ type: "content", content: { type: "text", text: "file contents" } }],
688
- },
689
- {
690
- sessionUpdate: "tool_call",
691
- toolCallId: "t2",
692
- title: "bash(exit 1)",
693
- name: "bash",
694
- kind: "execute",
695
- status: "in_progress",
696
- rawInput: { command: "exit 1" },
697
- },
698
- {
699
- sessionUpdate: "tool_call_update",
700
- toolCallId: "t2",
701
- status: "failed",
702
- content: [{ type: "content", content: { type: "text", text: "boom" } }],
703
- },
704
- ]);
705
- });
706
- it("reports context usage after session/new, before any prompt runs", async () => {
707
- client = new AcpClient();
708
- const sessionId = await client.handshake();
709
- const usage = await client.untilUpdate("usage_update");
710
- // A fresh session must show its window immediately: a client that only
711
- // learns the size after the first reply cannot draw a context meter.
712
- expect(usage).toEqual({ sessionUpdate: "usage_update", used: 4200, size: 200_000 });
713
- const frame = client
714
- .received()
715
- .find((f) => f.params?.update?.sessionUpdate === "usage_update");
716
- expect(frame.params.sessionId).toBe(sessionId);
717
- });
718
- it("reports context usage on session/load so a resumed conversation shows it", async () => {
719
- client = new AcpClient();
720
- client.send({ jsonrpc: "2.0", id: 1, method: "initialize", params: { protocolVersion: 1 } });
721
- await client.until(1);
722
- const [newest] = await client.list(90, tmpProject);
723
- client.send({
724
- jsonrpc: "2.0",
725
- id: 91,
726
- method: "session/load",
727
- params: { sessionId: newest.sessionId, cwd: tmpProject, mcpServers: [] },
728
- });
729
- await client.until(91);
730
- const usage = await client.untilUpdate("usage_update");
731
- expect(usage).toEqual({ sessionUpdate: "usage_update", used: 4200, size: 200_000 });
732
- // Addressed to the id the client asked to load, not the session's internal
733
- // one, or the update lands on a session the client never heard of.
734
- const frame = client
735
- .received()
736
- .find((f) => f.params?.update?.sessionUpdate === "usage_update");
737
- expect(frame.params.sessionId).toBe(newest.sessionId);
738
- });
739
- it("reports context usage after each model response", async () => {
740
- client = new AcpClient();
741
- const sessionId = await client.handshake();
742
- await client.untilUpdate("usage_update");
743
- const beforeTurn = client.received().length;
744
- client.send({
745
- jsonrpc: "2.0",
746
- id: 3,
747
- method: "session/prompt",
748
- params: { sessionId, prompt: [{ type: "text", text: "world" }] },
749
- });
750
- const frames = await client.until(3);
751
- const turnUsage = usageUpdates(frames.slice(beforeTurn));
752
- expect(turnUsage).toEqual([{ sessionUpdate: "usage_update", used: 9200, size: 200_000 }]);
753
- // Like every other turn notification, it must precede the response.
754
- expect(frames.at(-1).id).toBe(3);
755
- });
756
- it("reports the post-compaction count, so a client can see the drop", async () => {
757
- client = new AcpClient();
758
- const sessionId = await client.handshake();
759
- await client.untilUpdate("usage_update");
760
- const beforeTurn = client.received().length;
761
- client.send({
762
- jsonrpc: "2.0",
763
- id: 3,
764
- method: "session/prompt",
765
- params: { sessionId, prompt: [{ type: "text", text: "compact me" }] },
766
- });
767
- const frames = await client.until(3);
768
- // Compaction is invisible on the wire except as a fall in `used` at an
769
- // unchanged `size`, so the emit right after it is the whole signal.
770
- expect(usageUpdates(frames.slice(beforeTurn))).toEqual([
771
- { sessionUpdate: "usage_update", used: 900, size: 200_000 },
772
- {
773
- sessionUpdate: "usage_update",
774
- used: 2400,
775
- size: 200_000,
776
- cost: { amount: 0.25, currency: "USD" },
777
- },
778
- ]);
779
- });
780
- it("sends file edits as a real diff instead of the tool's prose", async () => {
781
- client = new AcpClient();
782
- const sessionId = await client.handshake();
783
- client.send({
784
- jsonrpc: "2.0",
785
- id: 3,
786
- method: "session/prompt",
787
- params: { sessionId, prompt: [{ type: "text", text: "edit a file" }] },
788
- });
789
- const frames = await client.until(3);
790
- const completed = updatesOfKind(frames, "tool_call_update");
791
- // The BEFORE contents, captured while the tool was still running. Reading
792
- // the file twice after the fact would report "after" as both sides.
793
- expect(completed[0]).toMatchObject({
794
- toolCallId: "d1",
795
- status: "completed",
796
- content: [
797
- {
798
- type: "diff",
799
- path: path.join(tmpProject, "diffed.txt"),
800
- oldText: "before\n",
801
- newText: "after\n",
802
- },
803
- ],
804
- });
805
- // A new file has no old side; ACP spells that as null, which clients render
806
- // as an all-additions diff.
807
- expect(completed[1]).toMatchObject({
808
- toolCallId: "d2",
809
- content: [
810
- {
811
- type: "diff",
812
- path: path.join(tmpProject, "created.txt"),
813
- oldText: null,
814
- newText: "brand new\n",
815
- },
816
- ],
817
- });
818
- // Relative tool arguments are resolved against the session cwd, since the
819
- // client is running somewhere else and cannot resolve them itself.
820
- const starts = updatesOfKind(frames, "tool_call");
821
- expect(starts[1].locations).toEqual([{ path: path.join(tmpProject, "created.txt") }]);
822
- });
823
- it("publishes an approved plan and advances it from [DONE:n] markers", async () => {
824
- client = new AcpClient();
825
- const sessionId = await client.handshake();
826
- client.send({
827
- jsonrpc: "2.0",
828
- id: 3,
829
- method: "session/prompt",
830
- params: { sessionId, prompt: [{ type: "text", text: "approve a plan" }] },
831
- });
832
- const frames = await client.until(3);
833
- const plans = updatesOfKind(frames, "plan");
834
- expect(plans).toHaveLength(2);
835
- // On approval the whole plan appears, with the first step already active:
836
- // steps run in order, so that is what the agent is doing right now.
837
- expect(plans[0]).toEqual({
838
- sessionUpdate: "plan",
839
- entries: [
840
- { content: "Wire the transport layer", priority: "medium", status: "in_progress" },
841
- { content: "Render the results", priority: "medium", status: "pending" },
842
- { content: "Ship the thing", priority: "medium", status: "pending" },
843
- ],
844
- });
845
- // The marker was split across two text deltas and still registered.
846
- expect(plans[1]).toEqual({
847
- sessionUpdate: "plan",
848
- entries: [
849
- { content: "Wire the transport layer", priority: "medium", status: "completed" },
850
- { content: "Render the results", priority: "medium", status: "in_progress" },
851
- { content: "Ship the thing", priority: "medium", status: "pending" },
852
- ],
853
- });
854
- });
855
- it("names the session from its first prompt, once", async () => {
856
- client = new AcpClient();
857
- const sessionId = await client.handshake();
858
- for (const id of [3, 4]) {
859
- client.send({
860
- jsonrpc: "2.0",
861
- id,
862
- method: "session/prompt",
863
- params: { sessionId, prompt: [{ type: "text", text: `turn ${id}` }] },
864
- });
865
- await client.until(id);
866
- }
867
- const infos = updatesOfKind(client.received(), "session_info_update");
868
- // Titled after the FIRST exchange and never renamed underneath the user.
869
- expect(infos).toHaveLength(1);
870
- expect(infos[0].title).toBe("turn 3");
871
- expect(Date.parse(infos[0].updatedAt)).not.toBeNaN();
872
- });
873
- it("resumes a stored session without replaying its transcript", async () => {
874
- client = new AcpClient();
875
- client.send({ jsonrpc: "2.0", id: 1, method: "initialize", params: { protocolVersion: 1 } });
876
- await client.until(1);
877
- const [newest] = await client.list(90, tmpProject);
878
- client.send({
879
- jsonrpc: "2.0",
880
- id: 91,
881
- method: "session/resume",
882
- params: { sessionId: newest.sessionId, cwd: tmpProject, mcpServers: [] },
883
- });
884
- const frames = await client.until(91);
885
- expect(frames.at(-1).error).toBeUndefined();
886
- // The whole point of resume over load: the client already has the
887
- // transcript, so pushing it a second copy is what it asked to avoid.
888
- expect(transcript(frames)).toEqual([]);
889
- // The context is genuinely restored, not merely reported as restored.
890
- client.send({
891
- jsonrpc: "2.0",
892
- id: 92,
893
- method: "session/prompt",
894
- params: {
895
- sessionId: newest.sessionId,
896
- prompt: [{ type: "text", text: "report loaded context" }],
897
- },
898
- });
899
- const answered = await client.until(92);
900
- const replied = updatesOfKind(answered, "agent_message_chunk")
901
- .map((update) => update.content.text)
902
- .join("");
903
- // Generation 2, exactly as `session/load` restores it: the live context is
904
- // the newest checkpoint, not the pre-compaction transcript.
905
- expect(replied).toContain("after second compaction");
906
- expect(replied).not.toContain("newer: add the config panel");
907
- });
908
- it("closes an active session and refuses to close an unknown one", async () => {
909
- client = new AcpClient();
910
- const sessionId = await client.handshake();
911
- client.send({
912
- jsonrpc: "2.0",
913
- id: 3,
914
- method: "session/close",
915
- params: { sessionId: "not-a-session" },
916
- });
917
- const rejected = (await client.until(3)).at(-1);
918
- expect(rejected.error.code).toBe(-32602);
919
- client.send({ jsonrpc: "2.0", id: 4, method: "session/close", params: { sessionId } });
920
- const closed = (await client.until(4)).at(-1);
921
- expect(closed.result).toEqual({});
922
- // Closing frees the session, so prompting the closed id is now a client
923
- // sequencing error rather than a silently ignored no-op.
924
- client.send({
925
- jsonrpc: "2.0",
926
- id: 5,
927
- method: "session/prompt",
928
- params: { sessionId, prompt: [{ type: "text", text: "still there?" }] },
929
- });
930
- expect((await client.until(5)).at(-1).error.code).toBe(-32602);
931
- });
932
- it("waits for a cancelled turn to unwind before closing the session", async () => {
933
- client = new AcpClient();
934
- const sessionId = await client.handshake();
935
- client.send({
936
- jsonrpc: "2.0",
937
- id: 3,
938
- method: "session/prompt",
939
- params: { sessionId, prompt: [{ type: "text", text: "hang" }] },
940
- });
941
- // Let the turn actually start, or close would tear down an idle session and
942
- // the race this guards against could never happen.
943
- await new Promise((resolve) => setTimeout(resolve, 300));
944
- client.send({ jsonrpc: "2.0", id: 4, method: "session/close", params: { sessionId } });
945
- expect((await client.until(4)).at(-1).result).toEqual({});
946
- // The cancelled turn resolves as cancelled, not as an error.
947
- expect((await client.until(3)).at(-1).result).toEqual({ stopReason: "cancelled" });
948
- // Close only SIGNALS the abort; the turn keeps unwinding and persists its
949
- // tail on a later tick. Disposing without waiting drops that write, and a
950
- // resumed session comes back missing its last exchange.
951
- const witness = JSON.parse(await fs.readFile(path.join(tmpProject, "dispose-witness.json"), "utf8"));
952
- expect(witness.disposedMidTurn).toBe(false);
953
- });
954
- it("deletes a stored session, and succeeds when it is already gone", async () => {
955
- client = new AcpClient();
956
- await client.handshake();
957
- const before = await client.list(90, tmpProject);
958
- const target = before.find((entry) => entry.title === "older: rename the widget");
959
- client.send({
960
- jsonrpc: "2.0",
961
- id: 92,
962
- method: "session/delete",
963
- params: { sessionId: target.sessionId },
964
- });
965
- expect((await client.until(92)).at(-1).result).toEqual({});
966
- const after = await client.list(93, tmpProject);
967
- expect(after.map((entry) => entry.title)).not.toContain("older: rename the widget");
968
- // Idempotent by spec: the user's intent is already satisfied, so deleting
969
- // it again is a success, not an error.
970
- client.send({
971
- jsonrpc: "2.0",
972
- id: 94,
973
- method: "session/delete",
974
- params: { sessionId: target.sessionId },
975
- });
976
- expect((await client.until(94)).at(-1).result).toEqual({});
977
- });
978
- it("reports a refusal as its own stop reason", async () => {
979
- client = new AcpClient();
980
- const sessionId = await client.handshake();
981
- client.send({
982
- jsonrpc: "2.0",
983
- id: 3,
984
- method: "session/prompt",
985
- params: { sessionId, prompt: [{ type: "text", text: "refuse" }] },
986
- });
987
- expect((await client.until(3)).at(-1).result).toEqual({ stopReason: "refusal" });
988
- });
989
- it("resolves a cancelled turn with stopReason cancelled rather than an error", async () => {
990
- client = new AcpClient();
991
- const sessionId = await client.handshake();
992
- client.send({
993
- jsonrpc: "2.0",
994
- id: 3,
995
- method: "session/prompt",
996
- params: { sessionId, prompt: [{ type: "text", text: "hang" }] },
997
- });
998
- // Let the prompt actually start; cancelling before it does is a different
999
- // path and would make this test pass for the wrong reason.
1000
- await new Promise((resolve) => setTimeout(resolve, 300));
1001
- client.send({ jsonrpc: "2.0", method: "session/cancel", params: { sessionId } });
1002
- const frames = await client.until(3);
1003
- expect(frames.at(-1).result).toEqual({ stopReason: "cancelled" });
1004
- // A notification must never be answered — an id here is a protocol violation.
1005
- expect(frames.some((frame) => frame.id === null && frame.error)).toBe(false);
1006
- // Cancel ends ONE turn, not the session. This catches a stale aborted
1007
- // signal: AgentSession swallows that abort, so without re-arming this next
1008
- // request deceptively returns end_turn but streams no answer.
1009
- client.send({
1010
- jsonrpc: "2.0",
1011
- id: 4,
1012
- method: "session/prompt",
1013
- params: { sessionId, prompt: [{ type: "text", text: "after cancel" }] },
1014
- });
1015
- const resumed = await client.until(4);
1016
- expect(resumed.at(-1).result).toEqual({ stopReason: "end_turn" });
1017
- expect(updates(resumed).some((update) => update.sessionUpdate === "agent_message_chunk" &&
1018
- update.content?.text === "after cancel")).toBe(true);
1019
- });
1020
- it("rejects unknown methods and prompts sent before a session exists", async () => {
1021
- client = new AcpClient();
1022
- client.send({ jsonrpc: "2.0", id: 1, method: "initialize", params: { protocolVersion: 1 } });
1023
- await client.until(1);
1024
- client.send({
1025
- jsonrpc: "2.0",
1026
- id: 2,
1027
- method: "session/prompt",
1028
- params: { prompt: [{ type: "text", text: "hi" }] },
1029
- });
1030
- expect((await client.until(2)).at(-1).error).toMatchObject({
1031
- code: -32602,
1032
- message: expect.stringContaining("session/new"),
1033
- });
1034
- // Unimplemented methods must be refused, not silently accepted, so a client
1035
- // can fall back instead of hanging.
1036
- client.send({ jsonrpc: "2.0", id: 3, method: "session/fork", params: {} });
1037
- expect((await client.until(3)).at(-1).error).toMatchObject({ code: -32601 });
1038
- });
1039
- it("answers malformed input with a parse error and keeps serving", async () => {
1040
- client = new AcpClient();
1041
- client.send({ jsonrpc: "2.0", id: 1, method: "initialize", params: {} });
1042
- await client.until(1);
1043
- client.sendRaw("{ not json\n");
1044
- client.send({ jsonrpc: "2.0", id: 2, method: "initialize", params: {} });
1045
- const frames = await client.until(2);
1046
- expect(frames.some((f) => f.id === null && f.error?.code === -32700)).toBe(true);
1047
- expect(frames.at(-1).result.protocolVersion).toBe(ACP_PROTOCOL_VERSION);
1048
- });
1049
- it("disposes the session and exits cleanly when the client disconnects", async () => {
1050
- client = new AcpClient();
1051
- await client.handshake();
1052
- client.end();
1053
- expect(await client.exit).toBe(0);
1054
- expect(client.stderr).toContain("disposed=true");
1055
- });
1056
- // Every test in this suite spawns a real agent child process and seeds its
1057
- // session files, which costs seconds on a loaded CI runner. The headroom sits
1058
- // on the suite rather than on whichever tests happened to time out last, so a
1059
- // slow machine is never reported as a bug.
1060
- //
1061
- // Kept above the 20s harness budget in `until`/`untilUpdate` so a genuine hang
1062
- // surfaces their diagnostic (pending frames + child stderr) instead of
1063
- // vitest's bare "Test timed out".
1064
- }, 30_000);
1065
- //# sourceMappingURL=acp-mode.test.js.map