@tulex-cli/tulex-code 0.1.1

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 (3094) hide show
  1. package/README.md +54 -0
  2. package/dist/.last_build +0 -0
  3. package/dist/index.d.ts +7 -0
  4. package/dist/index.js +98 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/package.json +121 -0
  7. package/dist/src/acp-integration/acpAgent.d.ts +59 -0
  8. package/dist/src/acp-integration/acpAgent.js +3646 -0
  9. package/dist/src/acp-integration/acpAgent.js.map +1 -0
  10. package/dist/src/acp-integration/acpAgent.test.d.ts +6 -0
  11. package/dist/src/acp-integration/acpAgent.test.js +3690 -0
  12. package/dist/src/acp-integration/acpAgent.test.js.map +1 -0
  13. package/dist/src/acp-integration/acpAgent.worktree.test.d.ts +16 -0
  14. package/dist/src/acp-integration/acpAgent.worktree.test.js +354 -0
  15. package/dist/src/acp-integration/acpAgent.worktree.test.js.map +1 -0
  16. package/dist/src/acp-integration/authMethods.d.ts +9 -0
  17. package/dist/src/acp-integration/authMethods.js +28 -0
  18. package/dist/src/acp-integration/authMethods.js.map +1 -0
  19. package/dist/src/acp-integration/authMethods.test.d.ts +6 -0
  20. package/dist/src/acp-integration/authMethods.test.js +23 -0
  21. package/dist/src/acp-integration/authMethods.test.js.map +1 -0
  22. package/dist/src/acp-integration/authPreflight.test.d.ts +6 -0
  23. package/dist/src/acp-integration/authPreflight.test.js +54 -0
  24. package/dist/src/acp-integration/authPreflight.test.js.map +1 -0
  25. package/dist/src/acp-integration/errorCodes.d.ts +15 -0
  26. package/dist/src/acp-integration/errorCodes.js +22 -0
  27. package/dist/src/acp-integration/errorCodes.js.map +1 -0
  28. package/dist/src/acp-integration/runtimeOutputDirContext.d.ts +2 -0
  29. package/dist/src/acp-integration/runtimeOutputDirContext.js +5 -0
  30. package/dist/src/acp-integration/runtimeOutputDirContext.js.map +1 -0
  31. package/dist/src/acp-integration/runtimeOutputDirContext.test.d.ts +1 -0
  32. package/dist/src/acp-integration/runtimeOutputDirContext.test.js +29 -0
  33. package/dist/src/acp-integration/runtimeOutputDirContext.test.js.map +1 -0
  34. package/dist/src/acp-integration/service/filesystem.d.ts +17 -0
  35. package/dist/src/acp-integration/service/filesystem.js +73 -0
  36. package/dist/src/acp-integration/service/filesystem.js.map +1 -0
  37. package/dist/src/acp-integration/service/filesystem.test.d.ts +6 -0
  38. package/dist/src/acp-integration/service/filesystem.test.js +85 -0
  39. package/dist/src/acp-integration/service/filesystem.test.js.map +1 -0
  40. package/dist/src/acp-integration/session/HistoryReplayer.d.ts +63 -0
  41. package/dist/src/acp-integration/session/HistoryReplayer.js +222 -0
  42. package/dist/src/acp-integration/session/HistoryReplayer.js.map +1 -0
  43. package/dist/src/acp-integration/session/HistoryReplayer.test.d.ts +6 -0
  44. package/dist/src/acp-integration/session/HistoryReplayer.test.js +405 -0
  45. package/dist/src/acp-integration/session/HistoryReplayer.test.js.map +1 -0
  46. package/dist/src/acp-integration/session/Session.d.ts +150 -0
  47. package/dist/src/acp-integration/session/Session.js +2381 -0
  48. package/dist/src/acp-integration/session/Session.js.map +1 -0
  49. package/dist/src/acp-integration/session/Session.test.d.ts +6 -0
  50. package/dist/src/acp-integration/session/Session.test.js +3845 -0
  51. package/dist/src/acp-integration/session/Session.test.js.map +1 -0
  52. package/dist/src/acp-integration/session/Session.worktree.test.d.ts +18 -0
  53. package/dist/src/acp-integration/session/Session.worktree.test.js +195 -0
  54. package/dist/src/acp-integration/session/Session.worktree.test.js.map +1 -0
  55. package/dist/src/acp-integration/session/SubAgentTracker.d.ts +58 -0
  56. package/dist/src/acp-integration/session/SubAgentTracker.js +208 -0
  57. package/dist/src/acp-integration/session/SubAgentTracker.js.map +1 -0
  58. package/dist/src/acp-integration/session/SubAgentTracker.test.d.ts +6 -0
  59. package/dist/src/acp-integration/session/SubAgentTracker.test.js +612 -0
  60. package/dist/src/acp-integration/session/SubAgentTracker.test.js.map +1 -0
  61. package/dist/src/acp-integration/session/emitters/BaseEmitter.d.ts +34 -0
  62. package/dist/src/acp-integration/session/emitters/BaseEmitter.js +53 -0
  63. package/dist/src/acp-integration/session/emitters/BaseEmitter.js.map +1 -0
  64. package/dist/src/acp-integration/session/emitters/MessageEmitter.d.ts +61 -0
  65. package/dist/src/acp-integration/session/emitters/MessageEmitter.js +124 -0
  66. package/dist/src/acp-integration/session/emitters/MessageEmitter.js.map +1 -0
  67. package/dist/src/acp-integration/session/emitters/MessageEmitter.test.d.ts +6 -0
  68. package/dist/src/acp-integration/session/emitters/MessageEmitter.test.js +202 -0
  69. package/dist/src/acp-integration/session/emitters/MessageEmitter.test.js.map +1 -0
  70. package/dist/src/acp-integration/session/emitters/PlanEmitter.d.ts +39 -0
  71. package/dist/src/acp-integration/session/emitters/PlanEmitter.js +83 -0
  72. package/dist/src/acp-integration/session/emitters/PlanEmitter.js.map +1 -0
  73. package/dist/src/acp-integration/session/emitters/PlanEmitter.test.d.ts +6 -0
  74. package/dist/src/acp-integration/session/emitters/PlanEmitter.test.js +176 -0
  75. package/dist/src/acp-integration/session/emitters/PlanEmitter.test.js.map +1 -0
  76. package/dist/src/acp-integration/session/emitters/ToolCallEmitter.d.ts +82 -0
  77. package/dist/src/acp-integration/session/emitters/ToolCallEmitter.js +284 -0
  78. package/dist/src/acp-integration/session/emitters/ToolCallEmitter.js.map +1 -0
  79. package/dist/src/acp-integration/session/emitters/ToolCallEmitter.test.d.ts +6 -0
  80. package/dist/src/acp-integration/session/emitters/ToolCallEmitter.test.js +607 -0
  81. package/dist/src/acp-integration/session/emitters/ToolCallEmitter.test.js.map +1 -0
  82. package/dist/src/acp-integration/session/emitters/index.d.ts +9 -0
  83. package/dist/src/acp-integration/session/emitters/index.js +10 -0
  84. package/dist/src/acp-integration/session/emitters/index.js.map +1 -0
  85. package/dist/src/acp-integration/session/index.d.ts +24 -0
  86. package/dist/src/acp-integration/session/index.js +16 -0
  87. package/dist/src/acp-integration/session/index.js.map +1 -0
  88. package/dist/src/acp-integration/session/permissionUtils.d.ts +9 -0
  89. package/dist/src/acp-integration/session/permissionUtils.js +165 -0
  90. package/dist/src/acp-integration/session/permissionUtils.js.map +1 -0
  91. package/dist/src/acp-integration/session/permissionUtils.test.d.ts +6 -0
  92. package/dist/src/acp-integration/session/permissionUtils.test.js +83 -0
  93. package/dist/src/acp-integration/session/permissionUtils.test.js.map +1 -0
  94. package/dist/src/acp-integration/session/rewrite/LlmRewriter.d.ts +26 -0
  95. package/dist/src/acp-integration/session/rewrite/LlmRewriter.js +131 -0
  96. package/dist/src/acp-integration/session/rewrite/LlmRewriter.js.map +1 -0
  97. package/dist/src/acp-integration/session/rewrite/LlmRewriter.test.d.ts +6 -0
  98. package/dist/src/acp-integration/session/rewrite/LlmRewriter.test.js +188 -0
  99. package/dist/src/acp-integration/session/rewrite/LlmRewriter.test.js.map +1 -0
  100. package/dist/src/acp-integration/session/rewrite/MessageRewriteMiddleware.d.ts +42 -0
  101. package/dist/src/acp-integration/session/rewrite/MessageRewriteMiddleware.js +159 -0
  102. package/dist/src/acp-integration/session/rewrite/MessageRewriteMiddleware.js.map +1 -0
  103. package/dist/src/acp-integration/session/rewrite/MessageRewriteMiddleware.test.d.ts +6 -0
  104. package/dist/src/acp-integration/session/rewrite/MessageRewriteMiddleware.test.js +255 -0
  105. package/dist/src/acp-integration/session/rewrite/MessageRewriteMiddleware.test.js.map +1 -0
  106. package/dist/src/acp-integration/session/rewrite/README.md +35 -0
  107. package/dist/src/acp-integration/session/rewrite/TurnBuffer.d.ts +25 -0
  108. package/dist/src/acp-integration/session/rewrite/TurnBuffer.js +53 -0
  109. package/dist/src/acp-integration/session/rewrite/TurnBuffer.js.map +1 -0
  110. package/dist/src/acp-integration/session/rewrite/TurnBuffer.test.d.ts +6 -0
  111. package/dist/src/acp-integration/session/rewrite/TurnBuffer.test.js +95 -0
  112. package/dist/src/acp-integration/session/rewrite/TurnBuffer.test.js.map +1 -0
  113. package/dist/src/acp-integration/session/rewrite/config.d.ts +13 -0
  114. package/dist/src/acp-integration/session/rewrite/config.js +19 -0
  115. package/dist/src/acp-integration/session/rewrite/config.js.map +1 -0
  116. package/dist/src/acp-integration/session/rewrite/config.test.d.ts +6 -0
  117. package/dist/src/acp-integration/session/rewrite/config.test.js +72 -0
  118. package/dist/src/acp-integration/session/rewrite/config.test.js.map +1 -0
  119. package/dist/src/acp-integration/session/rewrite/index.d.ts +8 -0
  120. package/dist/src/acp-integration/session/rewrite/index.js +8 -0
  121. package/dist/src/acp-integration/session/rewrite/index.js.map +1 -0
  122. package/dist/src/acp-integration/session/rewrite/types.d.ts +36 -0
  123. package/dist/src/acp-integration/session/rewrite/types.js +7 -0
  124. package/dist/src/acp-integration/session/rewrite/types.js.map +1 -0
  125. package/dist/src/acp-integration/session/types.d.ts +93 -0
  126. package/dist/src/acp-integration/session/types.js +7 -0
  127. package/dist/src/acp-integration/session/types.js.map +1 -0
  128. package/dist/src/commands/auth.d.ts +9 -0
  129. package/dist/src/commands/auth.js +55 -0
  130. package/dist/src/commands/auth.js.map +1 -0
  131. package/dist/src/commands/auth.test.d.ts +6 -0
  132. package/dist/src/commands/auth.test.js +84 -0
  133. package/dist/src/commands/auth.test.js.map +1 -0
  134. package/dist/src/commands/channel/channel-registry.d.ts +4 -0
  135. package/dist/src/commands/channel/channel-registry.js +33 -0
  136. package/dist/src/commands/channel/channel-registry.js.map +1 -0
  137. package/dist/src/commands/channel/config-utils.d.ts +4 -0
  138. package/dist/src/commands/channel/config-utils.js +66 -0
  139. package/dist/src/commands/channel/config-utils.js.map +1 -0
  140. package/dist/src/commands/channel/config-utils.test.d.ts +1 -0
  141. package/dist/src/commands/channel/config-utils.test.js +142 -0
  142. package/dist/src/commands/channel/config-utils.test.js.map +1 -0
  143. package/dist/src/commands/channel/configure.d.ts +4 -0
  144. package/dist/src/commands/channel/configure.js +65 -0
  145. package/dist/src/commands/channel/configure.js.map +1 -0
  146. package/dist/src/commands/channel/pairing.d.ts +8 -0
  147. package/dist/src/commands/channel/pairing.js +49 -0
  148. package/dist/src/commands/channel/pairing.js.map +1 -0
  149. package/dist/src/commands/channel/pidfile.d.ts +25 -0
  150. package/dist/src/commands/channel/pidfile.js +104 -0
  151. package/dist/src/commands/channel/pidfile.js.map +1 -0
  152. package/dist/src/commands/channel/pidfile.test.d.ts +1 -0
  153. package/dist/src/commands/channel/pidfile.test.js +143 -0
  154. package/dist/src/commands/channel/pidfile.test.js.map +1 -0
  155. package/dist/src/commands/channel/start.d.ts +16 -0
  156. package/dist/src/commands/channel/start.js +352 -0
  157. package/dist/src/commands/channel/start.js.map +1 -0
  158. package/dist/src/commands/channel/start.test.d.ts +1 -0
  159. package/dist/src/commands/channel/start.test.js +156 -0
  160. package/dist/src/commands/channel/start.test.js.map +1 -0
  161. package/dist/src/commands/channel/status.d.ts +2 -0
  162. package/dist/src/commands/channel/status.js +58 -0
  163. package/dist/src/commands/channel/status.js.map +1 -0
  164. package/dist/src/commands/channel/stop.d.ts +2 -0
  165. package/dist/src/commands/channel/stop.js +34 -0
  166. package/dist/src/commands/channel/stop.js.map +1 -0
  167. package/dist/src/commands/channel.d.ts +2 -0
  168. package/dist/src/commands/channel.js +29 -0
  169. package/dist/src/commands/channel.js.map +1 -0
  170. package/dist/src/commands/extensions/consent.d.ts +47 -0
  171. package/dist/src/commands/extensions/consent.js +182 -0
  172. package/dist/src/commands/extensions/consent.js.map +1 -0
  173. package/dist/src/commands/extensions/consent.test.d.ts +6 -0
  174. package/dist/src/commands/extensions/consent.test.js +277 -0
  175. package/dist/src/commands/extensions/consent.test.js.map +1 -0
  176. package/dist/src/commands/extensions/disable.d.ts +13 -0
  177. package/dist/src/commands/extensions/disable.js +65 -0
  178. package/dist/src/commands/extensions/disable.js.map +1 -0
  179. package/dist/src/commands/extensions/disable.test.d.ts +6 -0
  180. package/dist/src/commands/extensions/disable.test.js +101 -0
  181. package/dist/src/commands/extensions/disable.test.js.map +1 -0
  182. package/dist/src/commands/extensions/enable.d.ts +13 -0
  183. package/dist/src/commands/extensions/enable.js +70 -0
  184. package/dist/src/commands/extensions/enable.js.map +1 -0
  185. package/dist/src/commands/extensions/enable.test.d.ts +6 -0
  186. package/dist/src/commands/extensions/enable.test.js +93 -0
  187. package/dist/src/commands/extensions/enable.test.js.map +1 -0
  188. package/dist/src/commands/extensions/examples/agent/agents/diary.md +86 -0
  189. package/dist/src/commands/extensions/examples/agent/qwen-extension.json +5 -0
  190. package/dist/src/commands/extensions/examples/commands/commands/fs/grep-code.md +3 -0
  191. package/dist/src/commands/extensions/examples/commands/qwen-extension.json +5 -0
  192. package/dist/src/commands/extensions/examples/context/QWEN.md +8 -0
  193. package/dist/src/commands/extensions/examples/context/qwen-extension.json +5 -0
  194. package/dist/src/commands/extensions/examples/mcp-server/example.ts +60 -0
  195. package/dist/src/commands/extensions/examples/mcp-server/package.json +18 -0
  196. package/dist/src/commands/extensions/examples/mcp-server/qwen-extension.json +12 -0
  197. package/dist/src/commands/extensions/examples/mcp-server/tsconfig.json +13 -0
  198. package/dist/src/commands/extensions/examples/skills/qwen-extension.json +5 -0
  199. package/dist/src/commands/extensions/examples/skills/skills/synonyms/SKILL.md +48 -0
  200. package/dist/src/commands/extensions/install.d.ts +17 -0
  201. package/dist/src/commands/extensions/install.js +105 -0
  202. package/dist/src/commands/extensions/install.js.map +1 -0
  203. package/dist/src/commands/extensions/install.test.d.ts +6 -0
  204. package/dist/src/commands/extensions/install.test.js +164 -0
  205. package/dist/src/commands/extensions/install.test.js.map +1 -0
  206. package/dist/src/commands/extensions/link.d.ts +12 -0
  207. package/dist/src/commands/extensions/link.js +48 -0
  208. package/dist/src/commands/extensions/link.js.map +1 -0
  209. package/dist/src/commands/extensions/link.test.d.ts +6 -0
  210. package/dist/src/commands/extensions/link.test.js +74 -0
  211. package/dist/src/commands/extensions/link.test.js.map +1 -0
  212. package/dist/src/commands/extensions/list.d.ts +8 -0
  213. package/dist/src/commands/extensions/list.js +35 -0
  214. package/dist/src/commands/extensions/list.js.map +1 -0
  215. package/dist/src/commands/extensions/list.test.d.ts +6 -0
  216. package/dist/src/commands/extensions/list.test.js +76 -0
  217. package/dist/src/commands/extensions/list.test.js.map +1 -0
  218. package/dist/src/commands/extensions/new.d.ts +7 -0
  219. package/dist/src/commands/extensions/new.js +95 -0
  220. package/dist/src/commands/extensions/new.js.map +1 -0
  221. package/dist/src/commands/extensions/new.test.d.ts +6 -0
  222. package/dist/src/commands/extensions/new.test.js +59 -0
  223. package/dist/src/commands/extensions/new.test.js.map +1 -0
  224. package/dist/src/commands/extensions/settings.d.ts +7 -0
  225. package/dist/src/commands/extensions/settings.js +115 -0
  226. package/dist/src/commands/extensions/settings.js.map +1 -0
  227. package/dist/src/commands/extensions/settings.test.d.ts +6 -0
  228. package/dist/src/commands/extensions/settings.test.js +251 -0
  229. package/dist/src/commands/extensions/settings.test.js.map +1 -0
  230. package/dist/src/commands/extensions/uninstall.d.ts +12 -0
  231. package/dist/src/commands/extensions/uninstall.js +50 -0
  232. package/dist/src/commands/extensions/uninstall.js.map +1 -0
  233. package/dist/src/commands/extensions/uninstall.test.d.ts +6 -0
  234. package/dist/src/commands/extensions/uninstall.test.js +18 -0
  235. package/dist/src/commands/extensions/uninstall.test.js.map +1 -0
  236. package/dist/src/commands/extensions/update.d.ts +13 -0
  237. package/dist/src/commands/extensions/update.js +102 -0
  238. package/dist/src/commands/extensions/update.js.map +1 -0
  239. package/dist/src/commands/extensions/update.test.d.ts +6 -0
  240. package/dist/src/commands/extensions/update.test.js +185 -0
  241. package/dist/src/commands/extensions/update.test.js.map +1 -0
  242. package/dist/src/commands/extensions/utils.d.ts +8 -0
  243. package/dist/src/commands/extensions/utils.js +79 -0
  244. package/dist/src/commands/extensions/utils.js.map +1 -0
  245. package/dist/src/commands/extensions/utils.test.d.ts +6 -0
  246. package/dist/src/commands/extensions/utils.test.js +147 -0
  247. package/dist/src/commands/extensions/utils.test.js.map +1 -0
  248. package/dist/src/commands/extensions.d.ts +7 -0
  249. package/dist/src/commands/extensions.js +35 -0
  250. package/dist/src/commands/extensions.js.map +1 -0
  251. package/dist/src/commands/extensions.test.d.ts +6 -0
  252. package/dist/src/commands/extensions.test.js +72 -0
  253. package/dist/src/commands/extensions.test.js.map +1 -0
  254. package/dist/src/commands/hooks.d.ts +7 -0
  255. package/dist/src/commands/hooks.js +20 -0
  256. package/dist/src/commands/hooks.js.map +1 -0
  257. package/dist/src/commands/mcp/add.d.ts +7 -0
  258. package/dist/src/commands/mcp/add.js +247 -0
  259. package/dist/src/commands/mcp/add.js.map +1 -0
  260. package/dist/src/commands/mcp/list.d.ts +8 -0
  261. package/dist/src/commands/mcp/list.js +118 -0
  262. package/dist/src/commands/mcp/list.js.map +1 -0
  263. package/dist/src/commands/mcp/reconnect.d.ts +7 -0
  264. package/dist/src/commands/mcp/reconnect.js +154 -0
  265. package/dist/src/commands/mcp/reconnect.js.map +1 -0
  266. package/dist/src/commands/mcp/remove.d.ts +7 -0
  267. package/dist/src/commands/mcp/remove.js +54 -0
  268. package/dist/src/commands/mcp/remove.js.map +1 -0
  269. package/dist/src/commands/mcp.d.ts +7 -0
  270. package/dist/src/commands/mcp.js +25 -0
  271. package/dist/src/commands/mcp.js.map +1 -0
  272. package/dist/src/commands/review/cleanup.d.ts +7 -0
  273. package/dist/src/commands/review/cleanup.js +81 -0
  274. package/dist/src/commands/review/cleanup.js.map +1 -0
  275. package/dist/src/commands/review/deterministic.d.ts +7 -0
  276. package/dist/src/commands/review/deterministic.js +474 -0
  277. package/dist/src/commands/review/deterministic.js.map +1 -0
  278. package/dist/src/commands/review/fetch-pr.d.ts +7 -0
  279. package/dist/src/commands/review/fetch-pr.js +124 -0
  280. package/dist/src/commands/review/fetch-pr.js.map +1 -0
  281. package/dist/src/commands/review/lib/gh.d.ts +34 -0
  282. package/dist/src/commands/review/lib/gh.js +64 -0
  283. package/dist/src/commands/review/lib/gh.js.map +1 -0
  284. package/dist/src/commands/review/lib/git.d.ts +18 -0
  285. package/dist/src/commands/review/lib/git.js +41 -0
  286. package/dist/src/commands/review/lib/git.js.map +1 -0
  287. package/dist/src/commands/review/lib/paths.d.ts +23 -0
  288. package/dist/src/commands/review/lib/paths.js +37 -0
  289. package/dist/src/commands/review/lib/paths.js.map +1 -0
  290. package/dist/src/commands/review/load-rules.d.ts +7 -0
  291. package/dist/src/commands/review/load-rules.js +112 -0
  292. package/dist/src/commands/review/load-rules.js.map +1 -0
  293. package/dist/src/commands/review/pr-context.d.ts +7 -0
  294. package/dist/src/commands/review/pr-context.js +214 -0
  295. package/dist/src/commands/review/pr-context.js.map +1 -0
  296. package/dist/src/commands/review/presubmit.d.ts +7 -0
  297. package/dist/src/commands/review/presubmit.js +190 -0
  298. package/dist/src/commands/review/presubmit.js.map +1 -0
  299. package/dist/src/commands/review.d.ts +7 -0
  300. package/dist/src/commands/review.js +28 -0
  301. package/dist/src/commands/review.js.map +1 -0
  302. package/dist/src/commands/serve.d.ts +21 -0
  303. package/dist/src/commands/serve.js +214 -0
  304. package/dist/src/commands/serve.js.map +1 -0
  305. package/dist/src/commands/sp.d.ts +7 -0
  306. package/dist/src/commands/sp.js +62 -0
  307. package/dist/src/commands/sp.js.map +1 -0
  308. package/dist/src/config/auth.d.ts +10 -0
  309. package/dist/src/config/auth.js +183 -0
  310. package/dist/src/config/auth.js.map +1 -0
  311. package/dist/src/config/auth.test.d.ts +6 -0
  312. package/dist/src/config/auth.test.js +292 -0
  313. package/dist/src/config/auth.test.js.map +1 -0
  314. package/dist/src/config/config.d.ts +144 -0
  315. package/dist/src/config/config.js +1618 -0
  316. package/dist/src/config/config.js.map +1 -0
  317. package/dist/src/config/jsonSchemaArg.test.d.ts +6 -0
  318. package/dist/src/config/jsonSchemaArg.test.js +305 -0
  319. package/dist/src/config/jsonSchemaArg.test.js.map +1 -0
  320. package/dist/src/config/keyBindings.d.ts +89 -0
  321. package/dist/src/config/keyBindings.js +188 -0
  322. package/dist/src/config/keyBindings.js.map +1 -0
  323. package/dist/src/config/keyBindings.test.d.ts +6 -0
  324. package/dist/src/config/keyBindings.test.js +51 -0
  325. package/dist/src/config/keyBindings.test.js.map +1 -0
  326. package/dist/src/config/loadedSettingsAdapter.d.ts +15 -0
  327. package/dist/src/config/loadedSettingsAdapter.js +80 -0
  328. package/dist/src/config/loadedSettingsAdapter.js.map +1 -0
  329. package/dist/src/config/loadedSettingsAdapter.test.d.ts +6 -0
  330. package/dist/src/config/loadedSettingsAdapter.test.js +127 -0
  331. package/dist/src/config/loadedSettingsAdapter.test.js.map +1 -0
  332. package/dist/src/config/migration/index.d.ts +59 -0
  333. package/dist/src/config/migration/index.js +94 -0
  334. package/dist/src/config/migration/index.js.map +1 -0
  335. package/dist/src/config/migration/index.test.d.ts +6 -0
  336. package/dist/src/config/migration/index.test.js +295 -0
  337. package/dist/src/config/migration/index.test.js.map +1 -0
  338. package/dist/src/config/migration/scheduler.d.ts +51 -0
  339. package/dist/src/config/migration/scheduler.js +95 -0
  340. package/dist/src/config/migration/scheduler.js.map +1 -0
  341. package/dist/src/config/migration/scheduler.test.d.ts +6 -0
  342. package/dist/src/config/migration/scheduler.test.js +129 -0
  343. package/dist/src/config/migration/scheduler.test.js.map +1 -0
  344. package/dist/src/config/migration/types.d.ts +53 -0
  345. package/dist/src/config/migration/types.js +7 -0
  346. package/dist/src/config/migration/types.js.map +1 -0
  347. package/dist/src/config/migration/versions/v1-to-v2-shared.d.ts +27 -0
  348. package/dist/src/config/migration/versions/v1-to-v2-shared.js +174 -0
  349. package/dist/src/config/migration/versions/v1-to-v2-shared.js.map +1 -0
  350. package/dist/src/config/migration/versions/v1-to-v2.d.ts +81 -0
  351. package/dist/src/config/migration/versions/v1-to-v2.js +222 -0
  352. package/dist/src/config/migration/versions/v1-to-v2.js.map +1 -0
  353. package/dist/src/config/migration/versions/v1-to-v2.test.d.ts +6 -0
  354. package/dist/src/config/migration/versions/v1-to-v2.test.js +189 -0
  355. package/dist/src/config/migration/versions/v1-to-v2.test.js.map +1 -0
  356. package/dist/src/config/migration/versions/v2-to-v3.d.ts +61 -0
  357. package/dist/src/config/migration/versions/v2-to-v3.js +185 -0
  358. package/dist/src/config/migration/versions/v2-to-v3.js.map +1 -0
  359. package/dist/src/config/migration/versions/v2-to-v3.test.d.ts +6 -0
  360. package/dist/src/config/migration/versions/v2-to-v3.test.js +337 -0
  361. package/dist/src/config/migration/versions/v2-to-v3.test.js.map +1 -0
  362. package/dist/src/config/migration/versions/v3-to-v4.d.ts +34 -0
  363. package/dist/src/config/migration/versions/v3-to-v4.js +126 -0
  364. package/dist/src/config/migration/versions/v3-to-v4.js.map +1 -0
  365. package/dist/src/config/migration/versions/v3-to-v4.test.d.ts +6 -0
  366. package/dist/src/config/migration/versions/v3-to-v4.test.js +164 -0
  367. package/dist/src/config/migration/versions/v3-to-v4.test.js.map +1 -0
  368. package/dist/src/config/modelProvidersScope.d.ts +20 -0
  369. package/dist/src/config/modelProvidersScope.js +39 -0
  370. package/dist/src/config/modelProvidersScope.js.map +1 -0
  371. package/dist/src/config/modelProvidersScope.test.d.ts +6 -0
  372. package/dist/src/config/modelProvidersScope.test.js +66 -0
  373. package/dist/src/config/modelProvidersScope.test.js.map +1 -0
  374. package/dist/src/config/path-freshness.test.d.ts +6 -0
  375. package/dist/src/config/path-freshness.test.js +52 -0
  376. package/dist/src/config/path-freshness.test.js.map +1 -0
  377. package/dist/src/config/sandboxConfig.d.ts +13 -0
  378. package/dist/src/config/sandboxConfig.js +74 -0
  379. package/dist/src/config/sandboxConfig.js.map +1 -0
  380. package/dist/src/config/settings.d.ts +119 -0
  381. package/dist/src/config/settings.js +1015 -0
  382. package/dist/src/config/settings.js.map +1 -0
  383. package/dist/src/config/settingsSchema.d.ts +2207 -0
  384. package/dist/src/config/settingsSchema.js +2246 -0
  385. package/dist/src/config/settingsSchema.js.map +1 -0
  386. package/dist/src/config/settingsSchema.test.d.ts +6 -0
  387. package/dist/src/config/settingsSchema.test.js +232 -0
  388. package/dist/src/config/settingsSchema.test.js.map +1 -0
  389. package/dist/src/config/trustedFolders.d.ts +54 -0
  390. package/dist/src/config/trustedFolders.js +176 -0
  391. package/dist/src/config/trustedFolders.js.map +1 -0
  392. package/dist/src/config/trustedFolders.test.d.ts +6 -0
  393. package/dist/src/config/trustedFolders.test.js +354 -0
  394. package/dist/src/config/trustedFolders.test.js.map +1 -0
  395. package/dist/src/core/auth.d.ts +13 -0
  396. package/dist/src/core/auth.js +34 -0
  397. package/dist/src/core/auth.js.map +1 -0
  398. package/dist/src/core/auth.test.d.ts +6 -0
  399. package/dist/src/core/auth.test.js +47 -0
  400. package/dist/src/core/auth.test.js.map +1 -0
  401. package/dist/src/core/initializer.d.ts +21 -0
  402. package/dist/src/core/initializer.js +42 -0
  403. package/dist/src/core/initializer.js.map +1 -0
  404. package/dist/src/core/initializer.test.d.ts +6 -0
  405. package/dist/src/core/initializer.test.js +123 -0
  406. package/dist/src/core/initializer.test.js.map +1 -0
  407. package/dist/src/core/theme.d.ts +12 -0
  408. package/dist/src/core/theme.js +25 -0
  409. package/dist/src/core/theme.js.map +1 -0
  410. package/dist/src/core/theme.test.d.ts +6 -0
  411. package/dist/src/core/theme.test.js +57 -0
  412. package/dist/src/core/theme.test.js.map +1 -0
  413. package/dist/src/dualOutput/DualOutputBridge.d.ts +84 -0
  414. package/dist/src/dualOutput/DualOutputBridge.js +293 -0
  415. package/dist/src/dualOutput/DualOutputBridge.js.map +1 -0
  416. package/dist/src/dualOutput/DualOutputBridge.test.d.ts +6 -0
  417. package/dist/src/dualOutput/DualOutputBridge.test.js +157 -0
  418. package/dist/src/dualOutput/DualOutputBridge.test.js.map +1 -0
  419. package/dist/src/dualOutput/DualOutputContext.d.ts +19 -0
  420. package/dist/src/dualOutput/DualOutputContext.js +22 -0
  421. package/dist/src/dualOutput/DualOutputContext.js.map +1 -0
  422. package/dist/src/dualOutput/index.d.ts +7 -0
  423. package/dist/src/dualOutput/index.js +8 -0
  424. package/dist/src/dualOutput/index.js.map +1 -0
  425. package/dist/src/export/index.d.ts +6 -0
  426. package/dist/src/export/index.js +7 -0
  427. package/dist/src/export/index.js.map +1 -0
  428. package/dist/src/gemini.d.ts +13 -0
  429. package/dist/src/gemini.js +908 -0
  430. package/dist/src/gemini.js.map +1 -0
  431. package/dist/src/gemini.test.d.ts +6 -0
  432. package/dist/src/gemini.test.js +975 -0
  433. package/dist/src/gemini.test.js.map +1 -0
  434. package/dist/src/generated/git-commit.d.ts +7 -0
  435. package/dist/src/generated/git-commit.js +10 -0
  436. package/dist/src/generated/git-commit.js.map +1 -0
  437. package/dist/src/i18n/index.d.ts +27 -0
  438. package/dist/src/i18n/index.js +213 -0
  439. package/dist/src/i18n/index.js.map +1 -0
  440. package/dist/src/i18n/index.test.d.ts +6 -0
  441. package/dist/src/i18n/index.test.js +103 -0
  442. package/dist/src/i18n/index.test.js.map +1 -0
  443. package/dist/src/i18n/languages.d.ts +43 -0
  444. package/dist/src/i18n/languages.js +138 -0
  445. package/dist/src/i18n/languages.js.map +1 -0
  446. package/dist/src/i18n/locales/ca.js +3951 -0
  447. package/dist/src/i18n/locales/de.js +2018 -0
  448. package/dist/src/i18n/locales/en.js +2161 -0
  449. package/dist/src/i18n/locales/fr.js +2013 -0
  450. package/dist/src/i18n/locales/ja.js +1780 -0
  451. package/dist/src/i18n/locales/pt.js +2005 -0
  452. package/dist/src/i18n/locales/ru.js +1993 -0
  453. package/dist/src/i18n/locales/zh-TW.js +1729 -0
  454. package/dist/src/i18n/locales/zh.js +1929 -0
  455. package/dist/src/i18n/mustTranslateKeys.d.ts +12 -0
  456. package/dist/src/i18n/mustTranslateKeys.js +111 -0
  457. package/dist/src/i18n/mustTranslateKeys.js.map +1 -0
  458. package/dist/src/i18n/mustTranslateKeys.test.d.ts +6 -0
  459. package/dist/src/i18n/mustTranslateKeys.test.js +103 -0
  460. package/dist/src/i18n/mustTranslateKeys.test.js.map +1 -0
  461. package/dist/src/i18n/translationDict.d.ts +9 -0
  462. package/dist/src/i18n/translationDict.js +17 -0
  463. package/dist/src/i18n/translationDict.js.map +1 -0
  464. package/dist/src/nonInteractive/control/ControlContext.d.ts +71 -0
  465. package/dist/src/nonInteractive/control/ControlContext.js +36 -0
  466. package/dist/src/nonInteractive/control/ControlContext.js.map +1 -0
  467. package/dist/src/nonInteractive/control/ControlDispatcher.d.ts +116 -0
  468. package/dist/src/nonInteractive/control/ControlDispatcher.js +290 -0
  469. package/dist/src/nonInteractive/control/ControlDispatcher.js.map +1 -0
  470. package/dist/src/nonInteractive/control/ControlDispatcher.test.d.ts +6 -0
  471. package/dist/src/nonInteractive/control/ControlDispatcher.test.js +614 -0
  472. package/dist/src/nonInteractive/control/ControlDispatcher.test.js.map +1 -0
  473. package/dist/src/nonInteractive/control/ControlService.d.ts +79 -0
  474. package/dist/src/nonInteractive/control/ControlService.js +139 -0
  475. package/dist/src/nonInteractive/control/ControlService.js.map +1 -0
  476. package/dist/src/nonInteractive/control/controllers/baseController.d.ts +53 -0
  477. package/dist/src/nonInteractive/control/controllers/baseController.js +136 -0
  478. package/dist/src/nonInteractive/control/controllers/baseController.js.map +1 -0
  479. package/dist/src/nonInteractive/control/controllers/hookController.d.ts +25 -0
  480. package/dist/src/nonInteractive/control/controllers/hookController.js +40 -0
  481. package/dist/src/nonInteractive/control/controllers/hookController.js.map +1 -0
  482. package/dist/src/nonInteractive/control/controllers/permissionController.d.ts +57 -0
  483. package/dist/src/nonInteractive/control/controllers/permissionController.js +361 -0
  484. package/dist/src/nonInteractive/control/controllers/permissionController.js.map +1 -0
  485. package/dist/src/nonInteractive/control/controllers/permissionController.test.d.ts +6 -0
  486. package/dist/src/nonInteractive/control/controllers/permissionController.test.js +140 -0
  487. package/dist/src/nonInteractive/control/controllers/permissionController.test.js.map +1 -0
  488. package/dist/src/nonInteractive/control/controllers/sdkMcpController.d.ts +54 -0
  489. package/dist/src/nonInteractive/control/controllers/sdkMcpController.js +80 -0
  490. package/dist/src/nonInteractive/control/controllers/sdkMcpController.js.map +1 -0
  491. package/dist/src/nonInteractive/control/controllers/systemController.d.ts +67 -0
  492. package/dist/src/nonInteractive/control/controllers/systemController.js +326 -0
  493. package/dist/src/nonInteractive/control/controllers/systemController.js.map +1 -0
  494. package/dist/src/nonInteractive/control/controllers/systemController.test.d.ts +6 -0
  495. package/dist/src/nonInteractive/control/controllers/systemController.test.js +121 -0
  496. package/dist/src/nonInteractive/control/controllers/systemController.test.js.map +1 -0
  497. package/dist/src/nonInteractive/control/types/serviceAPIs.d.ts +105 -0
  498. package/dist/src/nonInteractive/control/types/serviceAPIs.js +7 -0
  499. package/dist/src/nonInteractive/control/types/serviceAPIs.js.map +1 -0
  500. package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.d.ts +505 -0
  501. package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.js +1041 -0
  502. package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.js.map +1 -0
  503. package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.test.d.ts +6 -0
  504. package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.test.js +1304 -0
  505. package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.test.js.map +1 -0
  506. package/dist/src/nonInteractive/io/JsonOutputAdapter.d.ts +29 -0
  507. package/dist/src/nonInteractive/io/JsonOutputAdapter.js +64 -0
  508. package/dist/src/nonInteractive/io/JsonOutputAdapter.js.map +1 -0
  509. package/dist/src/nonInteractive/io/JsonOutputAdapter.test.d.ts +6 -0
  510. package/dist/src/nonInteractive/io/JsonOutputAdapter.test.js +684 -0
  511. package/dist/src/nonInteractive/io/JsonOutputAdapter.test.js.map +1 -0
  512. package/dist/src/nonInteractive/io/StreamJsonInputReader.d.ts +16 -0
  513. package/dist/src/nonInteractive/io/StreamJsonInputReader.js +54 -0
  514. package/dist/src/nonInteractive/io/StreamJsonInputReader.js.map +1 -0
  515. package/dist/src/nonInteractive/io/StreamJsonInputReader.test.d.ts +6 -0
  516. package/dist/src/nonInteractive/io/StreamJsonInputReader.test.js +178 -0
  517. package/dist/src/nonInteractive/io/StreamJsonInputReader.test.js.map +1 -0
  518. package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.d.ts +84 -0
  519. package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.dualOutput.test.d.ts +6 -0
  520. package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.dualOutput.test.js +118 -0
  521. package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.dualOutput.test.js.map +1 -0
  522. package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.js +227 -0
  523. package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.js.map +1 -0
  524. package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.test.d.ts +6 -0
  525. package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.test.js +1046 -0
  526. package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.test.js.map +1 -0
  527. package/dist/src/nonInteractive/io/index.d.ts +6 -0
  528. package/dist/src/nonInteractive/io/index.js +7 -0
  529. package/dist/src/nonInteractive/io/index.js.map +1 -0
  530. package/dist/src/nonInteractive/session.d.ts +8 -0
  531. package/dist/src/nonInteractive/session.js +664 -0
  532. package/dist/src/nonInteractive/session.js.map +1 -0
  533. package/dist/src/nonInteractive/session.test.d.ts +6 -0
  534. package/dist/src/nonInteractive/session.test.js +680 -0
  535. package/dist/src/nonInteractive/session.test.js.map +1 -0
  536. package/dist/src/nonInteractive/types.d.ts +415 -0
  537. package/dist/src/nonInteractive/types.js +77 -0
  538. package/dist/src/nonInteractive/types.js.map +1 -0
  539. package/dist/src/nonInteractiveCli.d.ts +33 -0
  540. package/dist/src/nonInteractiveCli.js +1058 -0
  541. package/dist/src/nonInteractiveCli.js.map +1 -0
  542. package/dist/src/nonInteractiveCliCommands.d.ts +59 -0
  543. package/dist/src/nonInteractiveCliCommands.js +326 -0
  544. package/dist/src/nonInteractiveCliCommands.js.map +1 -0
  545. package/dist/src/nonInteractiveCliCommands.test.d.ts +6 -0
  546. package/dist/src/nonInteractiveCliCommands.test.js +484 -0
  547. package/dist/src/nonInteractiveCliCommands.test.js.map +1 -0
  548. package/dist/src/patches/is-in-ci.d.ts +7 -0
  549. package/dist/src/patches/is-in-ci.js +15 -0
  550. package/dist/src/patches/is-in-ci.js.map +1 -0
  551. package/dist/src/remoteInput/RemoteInputContext.d.ts +8 -0
  552. package/dist/src/remoteInput/RemoteInputContext.js +9 -0
  553. package/dist/src/remoteInput/RemoteInputContext.js.map +1 -0
  554. package/dist/src/remoteInput/RemoteInputWatcher.d.ts +83 -0
  555. package/dist/src/remoteInput/RemoteInputWatcher.js +201 -0
  556. package/dist/src/remoteInput/RemoteInputWatcher.js.map +1 -0
  557. package/dist/src/remoteInput/RemoteInputWatcher.test.d.ts +6 -0
  558. package/dist/src/remoteInput/RemoteInputWatcher.test.js +100 -0
  559. package/dist/src/remoteInput/RemoteInputWatcher.test.js.map +1 -0
  560. package/dist/src/remoteInput/index.d.ts +7 -0
  561. package/dist/src/remoteInput/index.js +8 -0
  562. package/dist/src/remoteInput/index.js.map +1 -0
  563. package/dist/src/serve/auth/deviceFlow.d.ts +595 -0
  564. package/dist/src/serve/auth/deviceFlow.js +1243 -0
  565. package/dist/src/serve/auth/deviceFlow.js.map +1 -0
  566. package/dist/src/serve/auth/deviceFlow.test.d.ts +6 -0
  567. package/dist/src/serve/auth/deviceFlow.test.js +1314 -0
  568. package/dist/src/serve/auth/deviceFlow.test.js.map +1 -0
  569. package/dist/src/serve/auth/qwenDeviceFlowProvider.d.ts +30 -0
  570. package/dist/src/serve/auth/qwenDeviceFlowProvider.js +331 -0
  571. package/dist/src/serve/auth/qwenDeviceFlowProvider.js.map +1 -0
  572. package/dist/src/serve/auth/qwenDeviceFlowProvider.test.d.ts +6 -0
  573. package/dist/src/serve/auth/qwenDeviceFlowProvider.test.js +301 -0
  574. package/dist/src/serve/auth/qwenDeviceFlowProvider.test.js.map +1 -0
  575. package/dist/src/serve/auth.d.ts +101 -0
  576. package/dist/src/serve/auth.js +216 -0
  577. package/dist/src/serve/auth.js.map +1 -0
  578. package/dist/src/serve/capabilities.d.ts +196 -0
  579. package/dist/src/serve/capabilities.js +227 -0
  580. package/dist/src/serve/capabilities.js.map +1 -0
  581. package/dist/src/serve/daemonStatusProvider.d.ts +14 -0
  582. package/dist/src/serve/daemonStatusProvider.js +252 -0
  583. package/dist/src/serve/daemonStatusProvider.js.map +1 -0
  584. package/dist/src/serve/debugMode.d.ts +27 -0
  585. package/dist/src/serve/debugMode.js +33 -0
  586. package/dist/src/serve/debugMode.js.map +1 -0
  587. package/dist/src/serve/demo.d.ts +11 -0
  588. package/dist/src/serve/demo.js +640 -0
  589. package/dist/src/serve/demo.js.map +1 -0
  590. package/dist/src/serve/envSnapshot.d.ts +28 -0
  591. package/dist/src/serve/envSnapshot.js +199 -0
  592. package/dist/src/serve/envSnapshot.js.map +1 -0
  593. package/dist/src/serve/envSnapshot.test.d.ts +6 -0
  594. package/dist/src/serve/envSnapshot.test.js +181 -0
  595. package/dist/src/serve/envSnapshot.test.js.map +1 -0
  596. package/dist/src/serve/eventBus.d.ts +6 -0
  597. package/dist/src/serve/eventBus.js +15 -0
  598. package/dist/src/serve/eventBus.js.map +1 -0
  599. package/dist/src/serve/fs/audit.d.ts +144 -0
  600. package/dist/src/serve/fs/audit.js +193 -0
  601. package/dist/src/serve/fs/audit.js.map +1 -0
  602. package/dist/src/serve/fs/audit.test.d.ts +6 -0
  603. package/dist/src/serve/fs/audit.test.js +246 -0
  604. package/dist/src/serve/fs/audit.test.js.map +1 -0
  605. package/dist/src/serve/fs/contract.test.d.ts +6 -0
  606. package/dist/src/serve/fs/contract.test.js +211 -0
  607. package/dist/src/serve/fs/contract.test.js.map +1 -0
  608. package/dist/src/serve/fs/errors.d.ts +87 -0
  609. package/dist/src/serve/fs/errors.js +128 -0
  610. package/dist/src/serve/fs/errors.js.map +1 -0
  611. package/dist/src/serve/fs/errors.test.d.ts +6 -0
  612. package/dist/src/serve/fs/errors.test.js +152 -0
  613. package/dist/src/serve/fs/errors.test.js.map +1 -0
  614. package/dist/src/serve/fs/index.d.ts +10 -0
  615. package/dist/src/serve/fs/index.js +11 -0
  616. package/dist/src/serve/fs/index.js.map +1 -0
  617. package/dist/src/serve/fs/paths.d.ts +103 -0
  618. package/dist/src/serve/fs/paths.js +433 -0
  619. package/dist/src/serve/fs/paths.js.map +1 -0
  620. package/dist/src/serve/fs/paths.test.d.ts +6 -0
  621. package/dist/src/serve/fs/paths.test.js +309 -0
  622. package/dist/src/serve/fs/paths.test.js.map +1 -0
  623. package/dist/src/serve/fs/policy.d.ts +142 -0
  624. package/dist/src/serve/fs/policy.js +189 -0
  625. package/dist/src/serve/fs/policy.js.map +1 -0
  626. package/dist/src/serve/fs/policy.test.d.ts +6 -0
  627. package/dist/src/serve/fs/policy.test.js +193 -0
  628. package/dist/src/serve/fs/policy.test.js.map +1 -0
  629. package/dist/src/serve/fs/workspaceFileSystem.d.ts +157 -0
  630. package/dist/src/serve/fs/workspaceFileSystem.js +1377 -0
  631. package/dist/src/serve/fs/workspaceFileSystem.js.map +1 -0
  632. package/dist/src/serve/fs/workspaceFileSystem.test.d.ts +6 -0
  633. package/dist/src/serve/fs/workspaceFileSystem.test.js +880 -0
  634. package/dist/src/serve/fs/workspaceFileSystem.test.js.map +1 -0
  635. package/dist/src/serve/httpAcpBridge.d.ts +80 -0
  636. package/dist/src/serve/httpAcpBridge.js +3559 -0
  637. package/dist/src/serve/httpAcpBridge.js.map +1 -0
  638. package/dist/src/serve/httpAcpBridge.test.d.ts +6 -0
  639. package/dist/src/serve/httpAcpBridge.test.js +4987 -0
  640. package/dist/src/serve/httpAcpBridge.test.js.map +1 -0
  641. package/dist/src/serve/inMemoryChannel.d.ts +6 -0
  642. package/dist/src/serve/inMemoryChannel.js +14 -0
  643. package/dist/src/serve/inMemoryChannel.js.map +1 -0
  644. package/dist/src/serve/index.d.ts +15 -0
  645. package/dist/src/serve/index.js +16 -0
  646. package/dist/src/serve/index.js.map +1 -0
  647. package/dist/src/serve/loopbackBinds.d.ts +18 -0
  648. package/dist/src/serve/loopbackBinds.js +33 -0
  649. package/dist/src/serve/loopbackBinds.js.map +1 -0
  650. package/dist/src/serve/routes/workspaceFileRead.d.ts +90 -0
  651. package/dist/src/serve/routes/workspaceFileRead.js +458 -0
  652. package/dist/src/serve/routes/workspaceFileRead.js.map +1 -0
  653. package/dist/src/serve/routes/workspaceFileRead.test.d.ts +6 -0
  654. package/dist/src/serve/routes/workspaceFileRead.test.js +453 -0
  655. package/dist/src/serve/routes/workspaceFileRead.test.js.map +1 -0
  656. package/dist/src/serve/routes/workspaceFileWrite.d.ts +17 -0
  657. package/dist/src/serve/routes/workspaceFileWrite.js +224 -0
  658. package/dist/src/serve/routes/workspaceFileWrite.js.map +1 -0
  659. package/dist/src/serve/routes/workspaceFileWrite.test.d.ts +6 -0
  660. package/dist/src/serve/routes/workspaceFileWrite.test.js +223 -0
  661. package/dist/src/serve/routes/workspaceFileWrite.test.js.map +1 -0
  662. package/dist/src/serve/runQwenServe.d.ts +67 -0
  663. package/dist/src/serve/runQwenServe.js +616 -0
  664. package/dist/src/serve/runQwenServe.js.map +1 -0
  665. package/dist/src/serve/server.d.ts +125 -0
  666. package/dist/src/serve/server.js +2297 -0
  667. package/dist/src/serve/server.js.map +1 -0
  668. package/dist/src/serve/status.d.ts +6 -0
  669. package/dist/src/serve/status.js +13 -0
  670. package/dist/src/serve/status.js.map +1 -0
  671. package/dist/src/serve/types.d.ts +175 -0
  672. package/dist/src/serve/types.js +10 -0
  673. package/dist/src/serve/types.js.map +1 -0
  674. package/dist/src/serve/workspaceAgents.d.ts +47 -0
  675. package/dist/src/serve/workspaceAgents.js +1171 -0
  676. package/dist/src/serve/workspaceAgents.js.map +1 -0
  677. package/dist/src/serve/workspaceAgents.test.d.ts +6 -0
  678. package/dist/src/serve/workspaceAgents.test.js +823 -0
  679. package/dist/src/serve/workspaceAgents.test.js.map +1 -0
  680. package/dist/src/serve/workspaceMemory.d.ts +60 -0
  681. package/dist/src/serve/workspaceMemory.js +323 -0
  682. package/dist/src/serve/workspaceMemory.js.map +1 -0
  683. package/dist/src/serve/workspaceMemory.test.d.ts +6 -0
  684. package/dist/src/serve/workspaceMemory.test.js +418 -0
  685. package/dist/src/serve/workspaceMemory.test.js.map +1 -0
  686. package/dist/src/services/BuiltinCommandLoader.d.ts +24 -0
  687. package/dist/src/services/BuiltinCommandLoader.js +159 -0
  688. package/dist/src/services/BuiltinCommandLoader.js.map +1 -0
  689. package/dist/src/services/BuiltinCommandLoader.test.d.ts +6 -0
  690. package/dist/src/services/BuiltinCommandLoader.test.js +234 -0
  691. package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -0
  692. package/dist/src/services/BundledSkillLoader.d.ts +17 -0
  693. package/dist/src/services/BundledSkillLoader.js +97 -0
  694. package/dist/src/services/BundledSkillLoader.js.map +1 -0
  695. package/dist/src/services/BundledSkillLoader.test.d.ts +6 -0
  696. package/dist/src/services/BundledSkillLoader.test.js +301 -0
  697. package/dist/src/services/BundledSkillLoader.test.js.map +1 -0
  698. package/dist/src/services/CommandService.d.ts +69 -0
  699. package/dist/src/services/CommandService.js +128 -0
  700. package/dist/src/services/CommandService.js.map +1 -0
  701. package/dist/src/services/CommandService.test.d.ts +6 -0
  702. package/dist/src/services/CommandService.test.js +263 -0
  703. package/dist/src/services/CommandService.test.js.map +1 -0
  704. package/dist/src/services/FileCommandLoader-extension.test.d.ts +6 -0
  705. package/dist/src/services/FileCommandLoader-extension.test.js +279 -0
  706. package/dist/src/services/FileCommandLoader-extension.test.js.map +1 -0
  707. package/dist/src/services/FileCommandLoader-markdown.test.d.ts +6 -0
  708. package/dist/src/services/FileCommandLoader-markdown.test.js +111 -0
  709. package/dist/src/services/FileCommandLoader-markdown.test.js.map +1 -0
  710. package/dist/src/services/FileCommandLoader.d.ts +64 -0
  711. package/dist/src/services/FileCommandLoader.js +259 -0
  712. package/dist/src/services/FileCommandLoader.js.map +1 -0
  713. package/dist/src/services/McpPromptLoader.d.ts +35 -0
  714. package/dist/src/services/McpPromptLoader.js +261 -0
  715. package/dist/src/services/McpPromptLoader.js.map +1 -0
  716. package/dist/src/services/McpPromptLoader.test.d.ts +6 -0
  717. package/dist/src/services/McpPromptLoader.test.js +341 -0
  718. package/dist/src/services/McpPromptLoader.test.js.map +1 -0
  719. package/dist/src/services/SkillCommandLoader.d.ts +23 -0
  720. package/dist/src/services/SkillCommandLoader.js +110 -0
  721. package/dist/src/services/SkillCommandLoader.js.map +1 -0
  722. package/dist/src/services/SkillCommandLoader.test.d.ts +6 -0
  723. package/dist/src/services/SkillCommandLoader.test.js +307 -0
  724. package/dist/src/services/SkillCommandLoader.test.js.map +1 -0
  725. package/dist/src/services/command-factory.d.ts +25 -0
  726. package/dist/src/services/command-factory.js +122 -0
  727. package/dist/src/services/command-factory.js.map +1 -0
  728. package/dist/src/services/command-factory.test.d.ts +6 -0
  729. package/dist/src/services/command-factory.test.js +31 -0
  730. package/dist/src/services/command-factory.test.js.map +1 -0
  731. package/dist/src/services/command-migration-tool.d.ts +39 -0
  732. package/dist/src/services/command-migration-tool.js +135 -0
  733. package/dist/src/services/command-migration-tool.js.map +1 -0
  734. package/dist/src/services/command-migration-tool.test.d.ts +6 -0
  735. package/dist/src/services/command-migration-tool.test.js +175 -0
  736. package/dist/src/services/command-migration-tool.test.js.map +1 -0
  737. package/dist/src/services/commandMetadata.d.ts +21 -0
  738. package/dist/src/services/commandMetadata.js +106 -0
  739. package/dist/src/services/commandMetadata.js.map +1 -0
  740. package/dist/src/services/commandMetadata.test.d.ts +6 -0
  741. package/dist/src/services/commandMetadata.test.js +216 -0
  742. package/dist/src/services/commandMetadata.test.js.map +1 -0
  743. package/dist/src/services/commandUtils.d.ts +36 -0
  744. package/dist/src/services/commandUtils.js +57 -0
  745. package/dist/src/services/commandUtils.js.map +1 -0
  746. package/dist/src/services/commandUtils.test.d.ts +6 -0
  747. package/dist/src/services/commandUtils.test.js +159 -0
  748. package/dist/src/services/commandUtils.test.js.map +1 -0
  749. package/dist/src/services/insight/generators/DataProcessor.d.ts +23 -0
  750. package/dist/src/services/insight/generators/DataProcessor.js +1001 -0
  751. package/dist/src/services/insight/generators/DataProcessor.js.map +1 -0
  752. package/dist/src/services/insight/generators/DataProcessor.test.d.ts +6 -0
  753. package/dist/src/services/insight/generators/DataProcessor.test.js +1210 -0
  754. package/dist/src/services/insight/generators/DataProcessor.test.js.map +1 -0
  755. package/dist/src/services/insight/generators/StaticInsightGenerator.d.ts +16 -0
  756. package/dist/src/services/insight/generators/StaticInsightGenerator.js +63 -0
  757. package/dist/src/services/insight/generators/StaticInsightGenerator.js.map +1 -0
  758. package/dist/src/services/insight/generators/StaticInsightGenerator.test.d.ts +6 -0
  759. package/dist/src/services/insight/generators/StaticInsightGenerator.test.js +60 -0
  760. package/dist/src/services/insight/generators/StaticInsightGenerator.test.js.map +1 -0
  761. package/dist/src/services/insight/generators/TemplateRenderer.d.ts +9 -0
  762. package/dist/src/services/insight/generators/TemplateRenderer.js +49 -0
  763. package/dist/src/services/insight/generators/TemplateRenderer.js.map +1 -0
  764. package/dist/src/services/insight/types/QualitativeInsightTypes.d.ts +74 -0
  765. package/dist/src/services/insight/types/QualitativeInsightTypes.js +2 -0
  766. package/dist/src/services/insight/types/QualitativeInsightTypes.js.map +1 -0
  767. package/dist/src/services/insight/types/StaticInsightTypes.d.ts +59 -0
  768. package/dist/src/services/insight/types/StaticInsightTypes.js +7 -0
  769. package/dist/src/services/insight/types/StaticInsightTypes.js.map +1 -0
  770. package/dist/src/services/markdown-command-parser.d.ts +52 -0
  771. package/dist/src/services/markdown-command-parser.js +60 -0
  772. package/dist/src/services/markdown-command-parser.js.map +1 -0
  773. package/dist/src/services/markdown-command-parser.test.d.ts +6 -0
  774. package/dist/src/services/markdown-command-parser.test.js +146 -0
  775. package/dist/src/services/markdown-command-parser.test.js.map +1 -0
  776. package/dist/src/services/notificationService.d.ts +19 -0
  777. package/dist/src/services/notificationService.js +64 -0
  778. package/dist/src/services/notificationService.js.map +1 -0
  779. package/dist/src/services/notificationService.test.d.ts +6 -0
  780. package/dist/src/services/notificationService.test.js +114 -0
  781. package/dist/src/services/notificationService.test.js.map +1 -0
  782. package/dist/src/services/prompt-processors/argumentProcessor.d.ts +16 -0
  783. package/dist/src/services/prompt-processors/argumentProcessor.js +21 -0
  784. package/dist/src/services/prompt-processors/argumentProcessor.js.map +1 -0
  785. package/dist/src/services/prompt-processors/atFileProcessor.d.ts +12 -0
  786. package/dist/src/services/prompt-processors/atFileProcessor.js +63 -0
  787. package/dist/src/services/prompt-processors/atFileProcessor.js.map +1 -0
  788. package/dist/src/services/prompt-processors/atFileProcessor.test.d.ts +6 -0
  789. package/dist/src/services/prompt-processors/atFileProcessor.test.js +174 -0
  790. package/dist/src/services/prompt-processors/atFileProcessor.test.js.map +1 -0
  791. package/dist/src/services/prompt-processors/injectionParser.d.ts +29 -0
  792. package/dist/src/services/prompt-processors/injectionParser.js +60 -0
  793. package/dist/src/services/prompt-processors/injectionParser.js.map +1 -0
  794. package/dist/src/services/prompt-processors/injectionParser.test.d.ts +6 -0
  795. package/dist/src/services/prompt-processors/injectionParser.test.js +189 -0
  796. package/dist/src/services/prompt-processors/injectionParser.test.js.map +1 -0
  797. package/dist/src/services/prompt-processors/shellProcessor.d.ts +27 -0
  798. package/dist/src/services/prompt-processors/shellProcessor.js +146 -0
  799. package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -0
  800. package/dist/src/services/prompt-processors/types.d.ts +45 -0
  801. package/dist/src/services/prompt-processors/types.js +20 -0
  802. package/dist/src/services/prompt-processors/types.js.map +1 -0
  803. package/dist/src/services/test-commands/example.md +5 -0
  804. package/dist/src/services/tips/index.d.ts +10 -0
  805. package/dist/src/services/tips/index.js +21 -0
  806. package/dist/src/services/tips/index.js.map +1 -0
  807. package/dist/src/services/tips/tipHistory.d.ts +49 -0
  808. package/dist/src/services/tips/tipHistory.js +138 -0
  809. package/dist/src/services/tips/tipHistory.js.map +1 -0
  810. package/dist/src/services/tips/tipHistory.test.d.ts +6 -0
  811. package/dist/src/services/tips/tipHistory.test.js +102 -0
  812. package/dist/src/services/tips/tipHistory.test.js.map +1 -0
  813. package/dist/src/services/tips/tipRegistry.d.ts +32 -0
  814. package/dist/src/services/tips/tipRegistry.js +148 -0
  815. package/dist/src/services/tips/tipRegistry.js.map +1 -0
  816. package/dist/src/services/tips/tipRegistry.test.d.ts +6 -0
  817. package/dist/src/services/tips/tipRegistry.test.js +65 -0
  818. package/dist/src/services/tips/tipRegistry.test.js.map +1 -0
  819. package/dist/src/services/tips/tipScheduler.d.ts +21 -0
  820. package/dist/src/services/tips/tipScheduler.js +38 -0
  821. package/dist/src/services/tips/tipScheduler.js.map +1 -0
  822. package/dist/src/services/tips/tipScheduler.test.d.ts +6 -0
  823. package/dist/src/services/tips/tipScheduler.test.js +126 -0
  824. package/dist/src/services/tips/tipScheduler.test.js.map +1 -0
  825. package/dist/src/services/types.d.ts +22 -0
  826. package/dist/src/services/types.js +7 -0
  827. package/dist/src/services/types.js.map +1 -0
  828. package/dist/src/startup/worktreeStartup.d.ts +112 -0
  829. package/dist/src/startup/worktreeStartup.js +350 -0
  830. package/dist/src/startup/worktreeStartup.js.map +1 -0
  831. package/dist/src/startup/worktreeStartup.test.d.ts +6 -0
  832. package/dist/src/startup/worktreeStartup.test.js +332 -0
  833. package/dist/src/startup/worktreeStartup.test.js.map +1 -0
  834. package/dist/src/test-utils/customMatchers.d.ts +14 -0
  835. package/dist/src/test-utils/customMatchers.js +40 -0
  836. package/dist/src/test-utils/customMatchers.js.map +1 -0
  837. package/dist/src/test-utils/mockCommandContext.d.ts +18 -0
  838. package/dist/src/test-utils/mockCommandContext.js +107 -0
  839. package/dist/src/test-utils/mockCommandContext.js.map +1 -0
  840. package/dist/src/test-utils/mockCommandContext.test.d.ts +6 -0
  841. package/dist/src/test-utils/mockCommandContext.test.js +51 -0
  842. package/dist/src/test-utils/mockCommandContext.test.js.map +1 -0
  843. package/dist/src/test-utils/render.d.ts +14 -0
  844. package/dist/src/test-utils/render.js +15 -0
  845. package/dist/src/test-utils/render.js.map +1 -0
  846. package/dist/src/ui/App.d.ts +6 -0
  847. package/dist/src/ui/App.js +65 -0
  848. package/dist/src/ui/App.js.map +1 -0
  849. package/dist/src/ui/AppContainer.d.ts +24 -0
  850. package/dist/src/ui/AppContainer.js +2853 -0
  851. package/dist/src/ui/AppContainer.js.map +1 -0
  852. package/dist/src/ui/AppContainer.test.d.ts +6 -0
  853. package/dist/src/ui/AppContainer.test.js +2368 -0
  854. package/dist/src/ui/AppContainer.test.js.map +1 -0
  855. package/dist/src/ui/CommandFormatMigrationNudge.d.ts +14 -0
  856. package/dist/src/ui/CommandFormatMigrationNudge.js +44 -0
  857. package/dist/src/ui/CommandFormatMigrationNudge.js.map +1 -0
  858. package/dist/src/ui/FeedbackDialog.d.ts +9 -0
  859. package/dist/src/ui/FeedbackDialog.js +44 -0
  860. package/dist/src/ui/FeedbackDialog.js.map +1 -0
  861. package/dist/src/ui/IdeIntegrationNudge.d.ts +16 -0
  862. package/dist/src/ui/IdeIntegrationNudge.js +53 -0
  863. package/dist/src/ui/IdeIntegrationNudge.js.map +1 -0
  864. package/dist/src/ui/auth/AuthDialog.d.ts +7 -0
  865. package/dist/src/ui/auth/AuthDialog.js +214 -0
  866. package/dist/src/ui/auth/AuthDialog.js.map +1 -0
  867. package/dist/src/ui/auth/AuthDialog.test.d.ts +6 -0
  868. package/dist/src/ui/auth/AuthDialog.test.js +1029 -0
  869. package/dist/src/ui/auth/AuthDialog.test.js.map +1 -0
  870. package/dist/src/ui/auth/AuthInProgress.d.ts +11 -0
  871. package/dist/src/ui/auth/AuthInProgress.js +24 -0
  872. package/dist/src/ui/auth/AuthInProgress.js.map +1 -0
  873. package/dist/src/ui/auth/ProviderSetupSteps.d.ts +11 -0
  874. package/dist/src/ui/auth/ProviderSetupSteps.js +320 -0
  875. package/dist/src/ui/auth/ProviderSetupSteps.js.map +1 -0
  876. package/dist/src/ui/auth/ProviderSetupSteps.test.d.ts +6 -0
  877. package/dist/src/ui/auth/ProviderSetupSteps.test.js +322 -0
  878. package/dist/src/ui/auth/ProviderSetupSteps.test.js.map +1 -0
  879. package/dist/src/ui/auth/useAuth.d.ts +76 -0
  880. package/dist/src/ui/auth/useAuth.js +192 -0
  881. package/dist/src/ui/auth/useAuth.js.map +1 -0
  882. package/dist/src/ui/auth/useAuth.test.d.ts +6 -0
  883. package/dist/src/ui/auth/useAuth.test.js +267 -0
  884. package/dist/src/ui/auth/useAuth.test.js.map +1 -0
  885. package/dist/src/ui/auth/useProviderSetupFlow.d.ts +54 -0
  886. package/dist/src/ui/auth/useProviderSetupFlow.js +380 -0
  887. package/dist/src/ui/auth/useProviderSetupFlow.js.map +1 -0
  888. package/dist/src/ui/colors.d.ts +7 -0
  889. package/dist/src/ui/colors.js +60 -0
  890. package/dist/src/ui/colors.js.map +1 -0
  891. package/dist/src/ui/commands/aboutCommand.d.ts +7 -0
  892. package/dist/src/ui/commands/aboutCommand.js +69 -0
  893. package/dist/src/ui/commands/aboutCommand.js.map +1 -0
  894. package/dist/src/ui/commands/agentsCommand.d.ts +7 -0
  895. package/dist/src/ui/commands/agentsCommand.js +42 -0
  896. package/dist/src/ui/commands/agentsCommand.js.map +1 -0
  897. package/dist/src/ui/commands/approvalModeCommand.d.ts +7 -0
  898. package/dist/src/ui/commands/approvalModeCommand.js +89 -0
  899. package/dist/src/ui/commands/approvalModeCommand.js.map +1 -0
  900. package/dist/src/ui/commands/approvalModeCommand.test.d.ts +6 -0
  901. package/dist/src/ui/commands/approvalModeCommand.test.js +112 -0
  902. package/dist/src/ui/commands/approvalModeCommand.test.js.map +1 -0
  903. package/dist/src/ui/commands/arenaCommand.agentComplete.test.d.ts +6 -0
  904. package/dist/src/ui/commands/arenaCommand.agentComplete.test.js +118 -0
  905. package/dist/src/ui/commands/arenaCommand.agentComplete.test.js.map +1 -0
  906. package/dist/src/ui/commands/arenaCommand.d.ts +7 -0
  907. package/dist/src/ui/commands/arenaCommand.js +519 -0
  908. package/dist/src/ui/commands/arenaCommand.js.map +1 -0
  909. package/dist/src/ui/commands/arenaCommand.test.d.ts +6 -0
  910. package/dist/src/ui/commands/arenaCommand.test.js +352 -0
  911. package/dist/src/ui/commands/arenaCommand.test.js.map +1 -0
  912. package/dist/src/ui/commands/authCommand.d.ts +7 -0
  913. package/dist/src/ui/commands/authCommand.js +31 -0
  914. package/dist/src/ui/commands/authCommand.js.map +1 -0
  915. package/dist/src/ui/commands/branchCommand.d.ts +7 -0
  916. package/dist/src/ui/commands/branchCommand.js +49 -0
  917. package/dist/src/ui/commands/branchCommand.js.map +1 -0
  918. package/dist/src/ui/commands/branchCommand.test.d.ts +6 -0
  919. package/dist/src/ui/commands/branchCommand.test.js +57 -0
  920. package/dist/src/ui/commands/branchCommand.test.js.map +1 -0
  921. package/dist/src/ui/commands/btwCommand.d.ts +7 -0
  922. package/dist/src/ui/commands/btwCommand.js +164 -0
  923. package/dist/src/ui/commands/btwCommand.js.map +1 -0
  924. package/dist/src/ui/commands/btwCommand.test.d.ts +6 -0
  925. package/dist/src/ui/commands/btwCommand.test.js +338 -0
  926. package/dist/src/ui/commands/btwCommand.test.js.map +1 -0
  927. package/dist/src/ui/commands/bugCommand.d.ts +7 -0
  928. package/dist/src/ui/commands/bugCommand.js +54 -0
  929. package/dist/src/ui/commands/bugCommand.js.map +1 -0
  930. package/dist/src/ui/commands/clearCommand.d.ts +7 -0
  931. package/dist/src/ui/commands/clearCommand.js +122 -0
  932. package/dist/src/ui/commands/clearCommand.js.map +1 -0
  933. package/dist/src/ui/commands/compressCommand.d.ts +7 -0
  934. package/dist/src/ui/commands/compressCommand.js +178 -0
  935. package/dist/src/ui/commands/compressCommand.js.map +1 -0
  936. package/dist/src/ui/commands/contextCommand.d.ts +14 -0
  937. package/dist/src/ui/commands/contextCommand.js +443 -0
  938. package/dist/src/ui/commands/contextCommand.js.map +1 -0
  939. package/dist/src/ui/commands/contextCommand.test.d.ts +6 -0
  940. package/dist/src/ui/commands/contextCommand.test.js +184 -0
  941. package/dist/src/ui/commands/contextCommand.test.js.map +1 -0
  942. package/dist/src/ui/commands/copyCommand.d.ts +7 -0
  943. package/dist/src/ui/commands/copyCommand.js +374 -0
  944. package/dist/src/ui/commands/copyCommand.js.map +1 -0
  945. package/dist/src/ui/commands/deleteCommand.d.ts +7 -0
  946. package/dist/src/ui/commands/deleteCommand.js +19 -0
  947. package/dist/src/ui/commands/deleteCommand.js.map +1 -0
  948. package/dist/src/ui/commands/deleteCommand.test.d.ts +6 -0
  949. package/dist/src/ui/commands/deleteCommand.test.js +27 -0
  950. package/dist/src/ui/commands/deleteCommand.test.js.map +1 -0
  951. package/dist/src/ui/commands/diffCommand.d.ts +42 -0
  952. package/dist/src/ui/commands/diffCommand.js +206 -0
  953. package/dist/src/ui/commands/diffCommand.js.map +1 -0
  954. package/dist/src/ui/commands/diffCommand.test.d.ts +6 -0
  955. package/dist/src/ui/commands/diffCommand.test.js +482 -0
  956. package/dist/src/ui/commands/diffCommand.test.js.map +1 -0
  957. package/dist/src/ui/commands/directoryCommand.d.ts +13 -0
  958. package/dist/src/ui/commands/directoryCommand.js +252 -0
  959. package/dist/src/ui/commands/directoryCommand.js.map +1 -0
  960. package/dist/src/ui/commands/docsCommand.d.ts +7 -0
  961. package/dist/src/ui/commands/docsCommand.js +49 -0
  962. package/dist/src/ui/commands/docsCommand.js.map +1 -0
  963. package/dist/src/ui/commands/doctorCommand.d.ts +7 -0
  964. package/dist/src/ui/commands/doctorCommand.js +530 -0
  965. package/dist/src/ui/commands/doctorCommand.js.map +1 -0
  966. package/dist/src/ui/commands/doctorCommand.test.d.ts +6 -0
  967. package/dist/src/ui/commands/doctorCommand.test.js +804 -0
  968. package/dist/src/ui/commands/doctorCommand.test.js.map +1 -0
  969. package/dist/src/ui/commands/dreamCommand.d.ts +7 -0
  970. package/dist/src/ui/commands/dreamCommand.js +42 -0
  971. package/dist/src/ui/commands/dreamCommand.js.map +1 -0
  972. package/dist/src/ui/commands/dreamCommand.test.d.ts +6 -0
  973. package/dist/src/ui/commands/dreamCommand.test.js +39 -0
  974. package/dist/src/ui/commands/dreamCommand.test.js.map +1 -0
  975. package/dist/src/ui/commands/editorCommand.d.ts +7 -0
  976. package/dist/src/ui/commands/editorCommand.js +20 -0
  977. package/dist/src/ui/commands/editorCommand.js.map +1 -0
  978. package/dist/src/ui/commands/exportCommand.d.ts +10 -0
  979. package/dist/src/ui/commands/exportCommand.js +373 -0
  980. package/dist/src/ui/commands/exportCommand.js.map +1 -0
  981. package/dist/src/ui/commands/exportCommand.test.d.ts +6 -0
  982. package/dist/src/ui/commands/exportCommand.test.js +905 -0
  983. package/dist/src/ui/commands/exportCommand.test.js.map +1 -0
  984. package/dist/src/ui/commands/extensionsCommand.d.ts +10 -0
  985. package/dist/src/ui/commands/extensionsCommand.js +185 -0
  986. package/dist/src/ui/commands/extensionsCommand.js.map +1 -0
  987. package/dist/src/ui/commands/forgetCommand.d.ts +7 -0
  988. package/dist/src/ui/commands/forgetCommand.js +45 -0
  989. package/dist/src/ui/commands/forgetCommand.js.map +1 -0
  990. package/dist/src/ui/commands/forkCommand.d.ts +7 -0
  991. package/dist/src/ui/commands/forkCommand.js +163 -0
  992. package/dist/src/ui/commands/forkCommand.js.map +1 -0
  993. package/dist/src/ui/commands/forkCommand.test.d.ts +6 -0
  994. package/dist/src/ui/commands/forkCommand.test.js +229 -0
  995. package/dist/src/ui/commands/forkCommand.test.js.map +1 -0
  996. package/dist/src/ui/commands/goalCommand.d.ts +7 -0
  997. package/dist/src/ui/commands/goalCommand.js +181 -0
  998. package/dist/src/ui/commands/goalCommand.js.map +1 -0
  999. package/dist/src/ui/commands/goalCommand.test.d.ts +6 -0
  1000. package/dist/src/ui/commands/goalCommand.test.js +328 -0
  1001. package/dist/src/ui/commands/goalCommand.test.js.map +1 -0
  1002. package/dist/src/ui/commands/helpCommand.d.ts +7 -0
  1003. package/dist/src/ui/commands/helpCommand.js +21 -0
  1004. package/dist/src/ui/commands/helpCommand.js.map +1 -0
  1005. package/dist/src/ui/commands/hooksCommand.d.ts +7 -0
  1006. package/dist/src/ui/commands/hooksCommand.js +153 -0
  1007. package/dist/src/ui/commands/hooksCommand.js.map +1 -0
  1008. package/dist/src/ui/commands/hooksCommand.test.d.ts +6 -0
  1009. package/dist/src/ui/commands/hooksCommand.test.js +189 -0
  1010. package/dist/src/ui/commands/hooksCommand.test.js.map +1 -0
  1011. package/dist/src/ui/commands/ideCommand.d.ts +7 -0
  1012. package/dist/src/ui/commands/ideCommand.js +256 -0
  1013. package/dist/src/ui/commands/ideCommand.js.map +1 -0
  1014. package/dist/src/ui/commands/initCommand.d.ts +7 -0
  1015. package/dist/src/ui/commands/initCommand.js +119 -0
  1016. package/dist/src/ui/commands/initCommand.js.map +1 -0
  1017. package/dist/src/ui/commands/insightCommand.d.ts +7 -0
  1018. package/dist/src/ui/commands/insightCommand.js +195 -0
  1019. package/dist/src/ui/commands/insightCommand.js.map +1 -0
  1020. package/dist/src/ui/commands/insightCommand.test.d.ts +6 -0
  1021. package/dist/src/ui/commands/insightCommand.test.js +173 -0
  1022. package/dist/src/ui/commands/insightCommand.test.js.map +1 -0
  1023. package/dist/src/ui/commands/languageCommand.d.ts +7 -0
  1024. package/dist/src/ui/commands/languageCommand.js +291 -0
  1025. package/dist/src/ui/commands/languageCommand.js.map +1 -0
  1026. package/dist/src/ui/commands/languageCommand.test.d.ts +6 -0
  1027. package/dist/src/ui/commands/languageCommand.test.js +664 -0
  1028. package/dist/src/ui/commands/languageCommand.test.js.map +1 -0
  1029. package/dist/src/ui/commands/lspCommand.d.ts +7 -0
  1030. package/dist/src/ui/commands/lspCommand.js +62 -0
  1031. package/dist/src/ui/commands/lspCommand.js.map +1 -0
  1032. package/dist/src/ui/commands/lspCommand.test.d.ts +6 -0
  1033. package/dist/src/ui/commands/lspCommand.test.js +175 -0
  1034. package/dist/src/ui/commands/lspCommand.test.js.map +1 -0
  1035. package/dist/src/ui/commands/mcpCommand.d.ts +7 -0
  1036. package/dist/src/ui/commands/mcpCommand.js +21 -0
  1037. package/dist/src/ui/commands/mcpCommand.js.map +1 -0
  1038. package/dist/src/ui/commands/memoryCommand.d.ts +7 -0
  1039. package/dist/src/ui/commands/memoryCommand.js +21 -0
  1040. package/dist/src/ui/commands/memoryCommand.js.map +1 -0
  1041. package/dist/src/ui/commands/modelCommand.d.ts +7 -0
  1042. package/dist/src/ui/commands/modelCommand.js +226 -0
  1043. package/dist/src/ui/commands/modelCommand.js.map +1 -0
  1044. package/dist/src/ui/commands/modelCommand.test.d.ts +6 -0
  1045. package/dist/src/ui/commands/modelCommand.test.js +503 -0
  1046. package/dist/src/ui/commands/modelCommand.test.js.map +1 -0
  1047. package/dist/src/ui/commands/permissionsCommand.d.ts +7 -0
  1048. package/dist/src/ui/commands/permissionsCommand.js +20 -0
  1049. package/dist/src/ui/commands/permissionsCommand.js.map +1 -0
  1050. package/dist/src/ui/commands/permissionsCommand.test.d.ts +6 -0
  1051. package/dist/src/ui/commands/permissionsCommand.test.js +30 -0
  1052. package/dist/src/ui/commands/permissionsCommand.test.js.map +1 -0
  1053. package/dist/src/ui/commands/planCommand.d.ts +7 -0
  1054. package/dist/src/ui/commands/planCommand.js +88 -0
  1055. package/dist/src/ui/commands/planCommand.js.map +1 -0
  1056. package/dist/src/ui/commands/planCommand.test.d.ts +6 -0
  1057. package/dist/src/ui/commands/planCommand.test.js +113 -0
  1058. package/dist/src/ui/commands/planCommand.test.js.map +1 -0
  1059. package/dist/src/ui/commands/quitCommand.d.ts +7 -0
  1060. package/dist/src/ui/commands/quitCommand.js +38 -0
  1061. package/dist/src/ui/commands/quitCommand.js.map +1 -0
  1062. package/dist/src/ui/commands/recapCommand.d.ts +7 -0
  1063. package/dist/src/ui/commands/recapCommand.js +56 -0
  1064. package/dist/src/ui/commands/recapCommand.js.map +1 -0
  1065. package/dist/src/ui/commands/rememberCommand.d.ts +7 -0
  1066. package/dist/src/ui/commands/rememberCommand.js +54 -0
  1067. package/dist/src/ui/commands/rememberCommand.js.map +1 -0
  1068. package/dist/src/ui/commands/renameCommand.d.ts +7 -0
  1069. package/dist/src/ui/commands/renameCommand.js +208 -0
  1070. package/dist/src/ui/commands/renameCommand.js.map +1 -0
  1071. package/dist/src/ui/commands/renameCommand.test.d.ts +6 -0
  1072. package/dist/src/ui/commands/renameCommand.test.js +414 -0
  1073. package/dist/src/ui/commands/renameCommand.test.js.map +1 -0
  1074. package/dist/src/ui/commands/restoreCommand.d.ts +8 -0
  1075. package/dist/src/ui/commands/restoreCommand.js +159 -0
  1076. package/dist/src/ui/commands/restoreCommand.js.map +1 -0
  1077. package/dist/src/ui/commands/resumeCommand.d.ts +7 -0
  1078. package/dist/src/ui/commands/resumeCommand.js +65 -0
  1079. package/dist/src/ui/commands/resumeCommand.js.map +1 -0
  1080. package/dist/src/ui/commands/resumeCommand.test.d.ts +6 -0
  1081. package/dist/src/ui/commands/resumeCommand.test.js +135 -0
  1082. package/dist/src/ui/commands/resumeCommand.test.js.map +1 -0
  1083. package/dist/src/ui/commands/rewindCommand.d.ts +7 -0
  1084. package/dist/src/ui/commands/rewindCommand.js +20 -0
  1085. package/dist/src/ui/commands/rewindCommand.js.map +1 -0
  1086. package/dist/src/ui/commands/settingsCommand.d.ts +7 -0
  1087. package/dist/src/ui/commands/settingsCommand.js +20 -0
  1088. package/dist/src/ui/commands/settingsCommand.js.map +1 -0
  1089. package/dist/src/ui/commands/setupGithubCommand.d.ts +9 -0
  1090. package/dist/src/ui/commands/setupGithubCommand.js +165 -0
  1091. package/dist/src/ui/commands/setupGithubCommand.js.map +1 -0
  1092. package/dist/src/ui/commands/setupGithubCommand.test.d.ts +6 -0
  1093. package/dist/src/ui/commands/setupGithubCommand.test.js +164 -0
  1094. package/dist/src/ui/commands/setupGithubCommand.test.js.map +1 -0
  1095. package/dist/src/ui/commands/skillsCommand.d.ts +7 -0
  1096. package/dist/src/ui/commands/skillsCommand.js +63 -0
  1097. package/dist/src/ui/commands/skillsCommand.js.map +1 -0
  1098. package/dist/src/ui/commands/skillsCommand.test.d.ts +6 -0
  1099. package/dist/src/ui/commands/skillsCommand.test.js +136 -0
  1100. package/dist/src/ui/commands/skillsCommand.test.js.map +1 -0
  1101. package/dist/src/ui/commands/statsCommand.d.ts +7 -0
  1102. package/dist/src/ui/commands/statsCommand.js +130 -0
  1103. package/dist/src/ui/commands/statsCommand.js.map +1 -0
  1104. package/dist/src/ui/commands/statuslineCommand.d.ts +7 -0
  1105. package/dist/src/ui/commands/statuslineCommand.js +33 -0
  1106. package/dist/src/ui/commands/statuslineCommand.js.map +1 -0
  1107. package/dist/src/ui/commands/statuslineCommand.test.d.ts +6 -0
  1108. package/dist/src/ui/commands/statuslineCommand.test.js +54 -0
  1109. package/dist/src/ui/commands/statuslineCommand.test.js.map +1 -0
  1110. package/dist/src/ui/commands/summaryCommand.d.ts +7 -0
  1111. package/dist/src/ui/commands/summaryCommand.js +261 -0
  1112. package/dist/src/ui/commands/summaryCommand.js.map +1 -0
  1113. package/dist/src/ui/commands/tasksCommand.d.ts +7 -0
  1114. package/dist/src/ui/commands/tasksCommand.js +222 -0
  1115. package/dist/src/ui/commands/tasksCommand.js.map +1 -0
  1116. package/dist/src/ui/commands/tasksCommand.test.d.ts +6 -0
  1117. package/dist/src/ui/commands/tasksCommand.test.js +365 -0
  1118. package/dist/src/ui/commands/tasksCommand.test.js.map +1 -0
  1119. package/dist/src/ui/commands/terminalSetupCommand.d.ts +13 -0
  1120. package/dist/src/ui/commands/terminalSetupCommand.js +48 -0
  1121. package/dist/src/ui/commands/terminalSetupCommand.js.map +1 -0
  1122. package/dist/src/ui/commands/themeCommand.d.ts +7 -0
  1123. package/dist/src/ui/commands/themeCommand.js +20 -0
  1124. package/dist/src/ui/commands/themeCommand.js.map +1 -0
  1125. package/dist/src/ui/commands/toolsCommand.d.ts +7 -0
  1126. package/dist/src/ui/commands/toolsCommand.js +45 -0
  1127. package/dist/src/ui/commands/toolsCommand.js.map +1 -0
  1128. package/dist/src/ui/commands/trustCommand.d.ts +7 -0
  1129. package/dist/src/ui/commands/trustCommand.js +20 -0
  1130. package/dist/src/ui/commands/trustCommand.js.map +1 -0
  1131. package/dist/src/ui/commands/trustCommand.test.d.ts +6 -0
  1132. package/dist/src/ui/commands/trustCommand.test.js +30 -0
  1133. package/dist/src/ui/commands/trustCommand.test.js.map +1 -0
  1134. package/dist/src/ui/commands/types.d.ts +298 -0
  1135. package/dist/src/ui/commands/types.js +13 -0
  1136. package/dist/src/ui/commands/types.js.map +1 -0
  1137. package/dist/src/ui/commands/vimCommand.d.ts +7 -0
  1138. package/dist/src/ui/commands/vimCommand.js +27 -0
  1139. package/dist/src/ui/commands/vimCommand.js.map +1 -0
  1140. package/dist/src/ui/components/AboutBox.d.ts +12 -0
  1141. package/dist/src/ui/components/AboutBox.js +10 -0
  1142. package/dist/src/ui/components/AboutBox.js.map +1 -0
  1143. package/dist/src/ui/components/AnsiOutput.d.ts +20 -0
  1144. package/dist/src/ui/components/AnsiOutput.js +27 -0
  1145. package/dist/src/ui/components/AnsiOutput.js.map +1 -0
  1146. package/dist/src/ui/components/AnsiOutput.test.d.ts +6 -0
  1147. package/dist/src/ui/components/AnsiOutput.test.js +134 -0
  1148. package/dist/src/ui/components/AnsiOutput.test.js.map +1 -0
  1149. package/dist/src/ui/components/ApiKeyInput.d.ts +22 -0
  1150. package/dist/src/ui/components/ApiKeyInput.js +35 -0
  1151. package/dist/src/ui/components/ApiKeyInput.js.map +1 -0
  1152. package/dist/src/ui/components/AppHeader.d.ts +10 -0
  1153. package/dist/src/ui/components/AppHeader.js +49 -0
  1154. package/dist/src/ui/components/AppHeader.js.map +1 -0
  1155. package/dist/src/ui/components/AppHeader.test.d.ts +6 -0
  1156. package/dist/src/ui/components/AppHeader.test.js +109 -0
  1157. package/dist/src/ui/components/AppHeader.test.js.map +1 -0
  1158. package/dist/src/ui/components/ApprovalModeDialog.d.ts +21 -0
  1159. package/dist/src/ui/components/ApprovalModeDialog.js +109 -0
  1160. package/dist/src/ui/components/ApprovalModeDialog.js.map +1 -0
  1161. package/dist/src/ui/components/ApprovalModeDialog.test.d.ts +6 -0
  1162. package/dist/src/ui/components/ApprovalModeDialog.test.js +63 -0
  1163. package/dist/src/ui/components/ApprovalModeDialog.test.js.map +1 -0
  1164. package/dist/src/ui/components/AsciiArt.d.ts +1 -0
  1165. package/dist/src/ui/components/AsciiArt.js +54 -0
  1166. package/dist/src/ui/components/AsciiArt.js.map +1 -0
  1167. package/dist/src/ui/components/AutoAcceptIndicator.d.ts +12 -0
  1168. package/dist/src/ui/components/AutoAcceptIndicator.js +37 -0
  1169. package/dist/src/ui/components/AutoAcceptIndicator.js.map +1 -0
  1170. package/dist/src/ui/components/BaseTextInput.d.ts +74 -0
  1171. package/dist/src/ui/components/BaseTextInput.js +144 -0
  1172. package/dist/src/ui/components/BaseTextInput.js.map +1 -0
  1173. package/dist/src/ui/components/BaseTextInput.test.d.ts +6 -0
  1174. package/dist/src/ui/components/BaseTextInput.test.js +78 -0
  1175. package/dist/src/ui/components/BaseTextInput.test.js.map +1 -0
  1176. package/dist/src/ui/components/Composer.d.ts +6 -0
  1177. package/dist/src/ui/components/Composer.js +92 -0
  1178. package/dist/src/ui/components/Composer.js.map +1 -0
  1179. package/dist/src/ui/components/Composer.test.d.ts +6 -0
  1180. package/dist/src/ui/components/Composer.test.js +344 -0
  1181. package/dist/src/ui/components/Composer.test.js.map +1 -0
  1182. package/dist/src/ui/components/ConsentPrompt.d.ts +14 -0
  1183. package/dist/src/ui/components/ConsentPrompt.js +35 -0
  1184. package/dist/src/ui/components/ConsentPrompt.js.map +1 -0
  1185. package/dist/src/ui/components/ConsentPrompt.test.d.ts +6 -0
  1186. package/dist/src/ui/components/ConsentPrompt.test.js +110 -0
  1187. package/dist/src/ui/components/ConsentPrompt.test.js.map +1 -0
  1188. package/dist/src/ui/components/ContextSummaryDisplay.d.ts +20 -0
  1189. package/dist/src/ui/components/ContextSummaryDisplay.js +90 -0
  1190. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -0
  1191. package/dist/src/ui/components/ContextUsageDisplay.d.ts +10 -0
  1192. package/dist/src/ui/components/ContextUsageDisplay.js +33 -0
  1193. package/dist/src/ui/components/ContextUsageDisplay.js.map +1 -0
  1194. package/dist/src/ui/components/DebugModeNotification.d.ts +9 -0
  1195. package/dist/src/ui/components/DebugModeNotification.js +23 -0
  1196. package/dist/src/ui/components/DebugModeNotification.js.map +1 -0
  1197. package/dist/src/ui/components/DebugProfiler.d.ts +6 -0
  1198. package/dist/src/ui/components/DebugProfiler.js +27 -0
  1199. package/dist/src/ui/components/DebugProfiler.js.map +1 -0
  1200. package/dist/src/ui/components/DialogManager.d.ts +12 -0
  1201. package/dist/src/ui/components/DialogManager.js +247 -0
  1202. package/dist/src/ui/components/DialogManager.js.map +1 -0
  1203. package/dist/src/ui/components/DiffDialog.d.ts +15 -0
  1204. package/dist/src/ui/components/DiffDialog.js +412 -0
  1205. package/dist/src/ui/components/DiffDialog.js.map +1 -0
  1206. package/dist/src/ui/components/EditorSettingsDialog.d.ts +16 -0
  1207. package/dist/src/ui/components/EditorSettingsDialog.js +76 -0
  1208. package/dist/src/ui/components/EditorSettingsDialog.js.map +1 -0
  1209. package/dist/src/ui/components/ExitWarning.d.ts +7 -0
  1210. package/dist/src/ui/components/ExitWarning.js +9 -0
  1211. package/dist/src/ui/components/ExitWarning.js.map +1 -0
  1212. package/dist/src/ui/components/ExternalAuthProgress.d.ts +14 -0
  1213. package/dist/src/ui/components/ExternalAuthProgress.js +14 -0
  1214. package/dist/src/ui/components/ExternalAuthProgress.js.map +1 -0
  1215. package/dist/src/ui/components/ExternalAuthProgress.test.d.ts +6 -0
  1216. package/dist/src/ui/components/ExternalAuthProgress.test.js +20 -0
  1217. package/dist/src/ui/components/ExternalAuthProgress.test.js.map +1 -0
  1218. package/dist/src/ui/components/FolderTrustDialog.d.ts +17 -0
  1219. package/dist/src/ui/components/FolderTrustDialog.js +58 -0
  1220. package/dist/src/ui/components/FolderTrustDialog.js.map +1 -0
  1221. package/dist/src/ui/components/FolderTrustDialog.test.d.ts +6 -0
  1222. package/dist/src/ui/components/FolderTrustDialog.test.js +88 -0
  1223. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -0
  1224. package/dist/src/ui/components/Footer.d.ts +7 -0
  1225. package/dist/src/ui/components/Footer.js +104 -0
  1226. package/dist/src/ui/components/Footer.js.map +1 -0
  1227. package/dist/src/ui/components/GeminiRespondingSpinner.d.ts +22 -0
  1228. package/dist/src/ui/components/GeminiRespondingSpinner.js +47 -0
  1229. package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -0
  1230. package/dist/src/ui/components/GeminiRespondingSpinner.test.d.ts +6 -0
  1231. package/dist/src/ui/components/GeminiRespondingSpinner.test.js +29 -0
  1232. package/dist/src/ui/components/GeminiRespondingSpinner.test.js.map +1 -0
  1233. package/dist/src/ui/components/GoalPill.d.ts +25 -0
  1234. package/dist/src/ui/components/GoalPill.js +77 -0
  1235. package/dist/src/ui/components/GoalPill.js.map +1 -0
  1236. package/dist/src/ui/components/GoalPill.test.d.ts +6 -0
  1237. package/dist/src/ui/components/GoalPill.test.js +56 -0
  1238. package/dist/src/ui/components/GoalPill.test.js.map +1 -0
  1239. package/dist/src/ui/components/Header.d.ts +62 -0
  1240. package/dist/src/ui/components/Header.js +155 -0
  1241. package/dist/src/ui/components/Header.js.map +1 -0
  1242. package/dist/src/ui/components/Header.test.d.ts +6 -0
  1243. package/dist/src/ui/components/Header.test.js +142 -0
  1244. package/dist/src/ui/components/Header.test.js.map +1 -0
  1245. package/dist/src/ui/components/Help.d.ts +18 -0
  1246. package/dist/src/ui/components/Help.js +236 -0
  1247. package/dist/src/ui/components/Help.js.map +1 -0
  1248. package/dist/src/ui/components/Help.test.d.ts +6 -0
  1249. package/dist/src/ui/components/Help.test.js +243 -0
  1250. package/dist/src/ui/components/Help.test.js.map +1 -0
  1251. package/dist/src/ui/components/HistoryItemDisplay.d.ts +39 -0
  1252. package/dist/src/ui/components/HistoryItemDisplay.js +51 -0
  1253. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -0
  1254. package/dist/src/ui/components/HistoryItemDisplay.test.d.ts +6 -0
  1255. package/dist/src/ui/components/HistoryItemDisplay.test.js +197 -0
  1256. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -0
  1257. package/dist/src/ui/components/IdeTrustChangeDialog.d.ts +11 -0
  1258. package/dist/src/ui/components/IdeTrustChangeDialog.js +34 -0
  1259. package/dist/src/ui/components/IdeTrustChangeDialog.js.map +1 -0
  1260. package/dist/src/ui/components/IdeTrustChangeDialog.test.d.ts +6 -0
  1261. package/dist/src/ui/components/IdeTrustChangeDialog.test.js +53 -0
  1262. package/dist/src/ui/components/IdeTrustChangeDialog.test.js.map +1 -0
  1263. package/dist/src/ui/components/InputPrompt.d.ts +63 -0
  1264. package/dist/src/ui/components/InputPrompt.js +1220 -0
  1265. package/dist/src/ui/components/InputPrompt.js.map +1 -0
  1266. package/dist/src/ui/components/KeyboardShortcuts.d.ts +7 -0
  1267. package/dist/src/ui/components/KeyboardShortcuts.js +78 -0
  1268. package/dist/src/ui/components/KeyboardShortcuts.js.map +1 -0
  1269. package/dist/src/ui/components/LoadingIndicator.d.ts +31 -0
  1270. package/dist/src/ui/components/LoadingIndicator.js +46 -0
  1271. package/dist/src/ui/components/LoadingIndicator.js.map +1 -0
  1272. package/dist/src/ui/components/LoadingIndicator.test.d.ts +6 -0
  1273. package/dist/src/ui/components/LoadingIndicator.test.js +246 -0
  1274. package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -0
  1275. package/dist/src/ui/components/LoopDetectionConfirmation.d.ts +13 -0
  1276. package/dist/src/ui/components/LoopDetectionConfirmation.js +37 -0
  1277. package/dist/src/ui/components/LoopDetectionConfirmation.js.map +1 -0
  1278. package/dist/src/ui/components/LoopDetectionConfirmation.test.d.ts +6 -0
  1279. package/dist/src/ui/components/LoopDetectionConfirmation.test.js +28 -0
  1280. package/dist/src/ui/components/LoopDetectionConfirmation.test.js.map +1 -0
  1281. package/dist/src/ui/components/MainContent.d.ts +6 -0
  1282. package/dist/src/ui/components/MainContent.js +437 -0
  1283. package/dist/src/ui/components/MainContent.js.map +1 -0
  1284. package/dist/src/ui/components/MainContent.test.d.ts +6 -0
  1285. package/dist/src/ui/components/MainContent.test.js +621 -0
  1286. package/dist/src/ui/components/MainContent.test.js.map +1 -0
  1287. package/dist/src/ui/components/MemoryDialog.d.ts +10 -0
  1288. package/dist/src/ui/components/MemoryDialog.js +288 -0
  1289. package/dist/src/ui/components/MemoryDialog.js.map +1 -0
  1290. package/dist/src/ui/components/MemoryDialog.test.d.ts +6 -0
  1291. package/dist/src/ui/components/MemoryDialog.test.js +165 -0
  1292. package/dist/src/ui/components/MemoryDialog.test.js.map +1 -0
  1293. package/dist/src/ui/components/MemoryUsageDisplay.d.ts +7 -0
  1294. package/dist/src/ui/components/MemoryUsageDisplay.js +24 -0
  1295. package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -0
  1296. package/dist/src/ui/components/ModelDialog.d.ts +12 -0
  1297. package/dist/src/ui/components/ModelDialog.js +390 -0
  1298. package/dist/src/ui/components/ModelDialog.js.map +1 -0
  1299. package/dist/src/ui/components/ModelDialog.test.d.ts +6 -0
  1300. package/dist/src/ui/components/ModelDialog.test.js +489 -0
  1301. package/dist/src/ui/components/ModelDialog.test.js.map +1 -0
  1302. package/dist/src/ui/components/ModelStatsDisplay.d.ts +11 -0
  1303. package/dist/src/ui/components/ModelStatsDisplay.js +61 -0
  1304. package/dist/src/ui/components/ModelStatsDisplay.js.map +1 -0
  1305. package/dist/src/ui/components/Notifications.d.ts +6 -0
  1306. package/dist/src/ui/components/Notifications.js +20 -0
  1307. package/dist/src/ui/components/Notifications.js.map +1 -0
  1308. package/dist/src/ui/components/PermissionsDialog.d.ts +11 -0
  1309. package/dist/src/ui/components/PermissionsDialog.js +547 -0
  1310. package/dist/src/ui/components/PermissionsDialog.js.map +1 -0
  1311. package/dist/src/ui/components/PlanSummaryDisplay.d.ts +14 -0
  1312. package/dist/src/ui/components/PlanSummaryDisplay.js +10 -0
  1313. package/dist/src/ui/components/PlanSummaryDisplay.js.map +1 -0
  1314. package/dist/src/ui/components/PluginChoicePrompt.d.ts +18 -0
  1315. package/dist/src/ui/components/PluginChoicePrompt.js +96 -0
  1316. package/dist/src/ui/components/PluginChoicePrompt.js.map +1 -0
  1317. package/dist/src/ui/components/PluginChoicePrompt.test.d.ts +6 -0
  1318. package/dist/src/ui/components/PluginChoicePrompt.test.js +136 -0
  1319. package/dist/src/ui/components/PluginChoicePrompt.test.js.map +1 -0
  1320. package/dist/src/ui/components/PrepareLabel.d.ts +15 -0
  1321. package/dist/src/ui/components/PrepareLabel.js +72 -0
  1322. package/dist/src/ui/components/PrepareLabel.js.map +1 -0
  1323. package/dist/src/ui/components/PrepareLabel.test.d.ts +6 -0
  1324. package/dist/src/ui/components/PrepareLabel.test.js +71 -0
  1325. package/dist/src/ui/components/PrepareLabel.test.js.map +1 -0
  1326. package/dist/src/ui/components/ProviderUpdatePrompt.d.ts +12 -0
  1327. package/dist/src/ui/components/ProviderUpdatePrompt.js +49 -0
  1328. package/dist/src/ui/components/ProviderUpdatePrompt.js.map +1 -0
  1329. package/dist/src/ui/components/QueuedMessageDisplay.d.ts +9 -0
  1330. package/dist/src/ui/components/QueuedMessageDisplay.js +35 -0
  1331. package/dist/src/ui/components/QueuedMessageDisplay.js.map +1 -0
  1332. package/dist/src/ui/components/QueuedMessageDisplay.test.d.ts +6 -0
  1333. package/dist/src/ui/components/QueuedMessageDisplay.test.js +76 -0
  1334. package/dist/src/ui/components/QueuedMessageDisplay.test.js.map +1 -0
  1335. package/dist/src/ui/components/QuittingDisplay.d.ts +6 -0
  1336. package/dist/src/ui/components/QuittingDisplay.js +21 -0
  1337. package/dist/src/ui/components/QuittingDisplay.js.map +1 -0
  1338. package/dist/src/ui/components/QwenOAuthProgress.d.ts +16 -0
  1339. package/dist/src/ui/components/QwenOAuthProgress.js +65 -0
  1340. package/dist/src/ui/components/QwenOAuthProgress.js.map +1 -0
  1341. package/dist/src/ui/components/QwenOAuthProgress.test.d.ts +6 -0
  1342. package/dist/src/ui/components/QwenOAuthProgress.test.js +287 -0
  1343. package/dist/src/ui/components/QwenOAuthProgress.test.js.map +1 -0
  1344. package/dist/src/ui/components/RewindSelector.d.ts +22 -0
  1345. package/dist/src/ui/components/RewindSelector.js +264 -0
  1346. package/dist/src/ui/components/RewindSelector.js.map +1 -0
  1347. package/dist/src/ui/components/RewindSelector.test.d.ts +6 -0
  1348. package/dist/src/ui/components/RewindSelector.test.js +146 -0
  1349. package/dist/src/ui/components/RewindSelector.test.js.map +1 -0
  1350. package/dist/src/ui/components/SessionPicker.d.ts +55 -0
  1351. package/dist/src/ui/components/SessionPicker.js +142 -0
  1352. package/dist/src/ui/components/SessionPicker.js.map +1 -0
  1353. package/dist/src/ui/components/SessionPreview.d.ts +20 -0
  1354. package/dist/src/ui/components/SessionPreview.js +97 -0
  1355. package/dist/src/ui/components/SessionPreview.js.map +1 -0
  1356. package/dist/src/ui/components/SessionPreview.test.d.ts +1 -0
  1357. package/dist/src/ui/components/SessionPreview.test.js +124 -0
  1358. package/dist/src/ui/components/SessionPreview.test.js.map +1 -0
  1359. package/dist/src/ui/components/SessionSummaryDisplay.d.ts +12 -0
  1360. package/dist/src/ui/components/SessionSummaryDisplay.js +17 -0
  1361. package/dist/src/ui/components/SessionSummaryDisplay.js.map +1 -0
  1362. package/dist/src/ui/components/SettingInputPrompt.d.ts +15 -0
  1363. package/dist/src/ui/components/SettingInputPrompt.js +63 -0
  1364. package/dist/src/ui/components/SettingInputPrompt.js.map +1 -0
  1365. package/dist/src/ui/components/SettingInputPrompt.test.d.ts +6 -0
  1366. package/dist/src/ui/components/SettingInputPrompt.test.js +60 -0
  1367. package/dist/src/ui/components/SettingInputPrompt.test.js.map +1 -0
  1368. package/dist/src/ui/components/SettingsCorruptedDialog.d.ts +14 -0
  1369. package/dist/src/ui/components/SettingsCorruptedDialog.js +44 -0
  1370. package/dist/src/ui/components/SettingsCorruptedDialog.js.map +1 -0
  1371. package/dist/src/ui/components/SettingsCorruptedDialog.test.d.ts +6 -0
  1372. package/dist/src/ui/components/SettingsCorruptedDialog.test.js +162 -0
  1373. package/dist/src/ui/components/SettingsCorruptedDialog.test.js.map +1 -0
  1374. package/dist/src/ui/components/SettingsDialog.d.ts +18 -0
  1375. package/dist/src/ui/components/SettingsDialog.js +658 -0
  1376. package/dist/src/ui/components/SettingsDialog.js.map +1 -0
  1377. package/dist/src/ui/components/SettingsDialog.test.d.ts +6 -0
  1378. package/dist/src/ui/components/SettingsDialog.test.js +1127 -0
  1379. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -0
  1380. package/dist/src/ui/components/ShellConfirmationDialog.d.ts +17 -0
  1381. package/dist/src/ui/components/ShellConfirmationDialog.js +75 -0
  1382. package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -0
  1383. package/dist/src/ui/components/ShellConfirmationDialog.test.d.ts +6 -0
  1384. package/dist/src/ui/components/ShellConfirmationDialog.test.js +167 -0
  1385. package/dist/src/ui/components/ShellConfirmationDialog.test.js.map +1 -0
  1386. package/dist/src/ui/components/ShellInputPrompt.d.ts +11 -0
  1387. package/dist/src/ui/components/ShellInputPrompt.js +42 -0
  1388. package/dist/src/ui/components/ShellInputPrompt.js.map +1 -0
  1389. package/dist/src/ui/components/ShellModeIndicator.d.ts +7 -0
  1390. package/dist/src/ui/components/ShellModeIndicator.js +5 -0
  1391. package/dist/src/ui/components/ShellModeIndicator.js.map +1 -0
  1392. package/dist/src/ui/components/ShowMoreLines.d.ts +10 -0
  1393. package/dist/src/ui/components/ShowMoreLines.js +24 -0
  1394. package/dist/src/ui/components/ShowMoreLines.js.map +1 -0
  1395. package/dist/src/ui/components/StandaloneSessionPicker.d.ts +11 -0
  1396. package/dist/src/ui/components/StandaloneSessionPicker.js +105 -0
  1397. package/dist/src/ui/components/StandaloneSessionPicker.js.map +1 -0
  1398. package/dist/src/ui/components/StandaloneSessionPicker.test.d.ts +6 -0
  1399. package/dist/src/ui/components/StandaloneSessionPicker.test.js +667 -0
  1400. package/dist/src/ui/components/StandaloneSessionPicker.test.js.map +1 -0
  1401. package/dist/src/ui/components/StatsActivityTab.d.ts +14 -0
  1402. package/dist/src/ui/components/StatsActivityTab.js +85 -0
  1403. package/dist/src/ui/components/StatsActivityTab.js.map +1 -0
  1404. package/dist/src/ui/components/StatsDialog.d.ts +12 -0
  1405. package/dist/src/ui/components/StatsDialog.js +104 -0
  1406. package/dist/src/ui/components/StatsDialog.js.map +1 -0
  1407. package/dist/src/ui/components/StatsDisplay.d.ts +13 -0
  1408. package/dist/src/ui/components/StatsDisplay.js +52 -0
  1409. package/dist/src/ui/components/StatsDisplay.js.map +1 -0
  1410. package/dist/src/ui/components/StatsEfficiencyTab.d.ts +11 -0
  1411. package/dist/src/ui/components/StatsEfficiencyTab.js +99 -0
  1412. package/dist/src/ui/components/StatsEfficiencyTab.js.map +1 -0
  1413. package/dist/src/ui/components/StatsHeatmapView.d.ts +12 -0
  1414. package/dist/src/ui/components/StatsHeatmapView.js +40 -0
  1415. package/dist/src/ui/components/StatsHeatmapView.js.map +1 -0
  1416. package/dist/src/ui/components/StatsSessionTab.d.ts +7 -0
  1417. package/dist/src/ui/components/StatsSessionTab.js +40 -0
  1418. package/dist/src/ui/components/StatsSessionTab.js.map +1 -0
  1419. package/dist/src/ui/components/StatusLineDialog.d.ts +22 -0
  1420. package/dist/src/ui/components/StatusLineDialog.js +140 -0
  1421. package/dist/src/ui/components/StatusLineDialog.js.map +1 -0
  1422. package/dist/src/ui/components/StatusLineDialog.test.d.ts +6 -0
  1423. package/dist/src/ui/components/StatusLineDialog.test.js +180 -0
  1424. package/dist/src/ui/components/StatusLineDialog.test.js.map +1 -0
  1425. package/dist/src/ui/components/StickyTodoList.d.ts +14 -0
  1426. package/dist/src/ui/components/StickyTodoList.js +45 -0
  1427. package/dist/src/ui/components/StickyTodoList.js.map +1 -0
  1428. package/dist/src/ui/components/StickyTodoList.test.d.ts +6 -0
  1429. package/dist/src/ui/components/StickyTodoList.test.js +128 -0
  1430. package/dist/src/ui/components/StickyTodoList.test.js.map +1 -0
  1431. package/dist/src/ui/components/SuggestionsDisplay.d.ts +47 -0
  1432. package/dist/src/ui/components/SuggestionsDisplay.js +43 -0
  1433. package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -0
  1434. package/dist/src/ui/components/SuggestionsDisplay.test.d.ts +6 -0
  1435. package/dist/src/ui/components/SuggestionsDisplay.test.js +39 -0
  1436. package/dist/src/ui/components/SuggestionsDisplay.test.js.map +1 -0
  1437. package/dist/src/ui/components/ThemeDialog.d.ts +20 -0
  1438. package/dist/src/ui/components/ThemeDialog.js +137 -0
  1439. package/dist/src/ui/components/ThemeDialog.js.map +1 -0
  1440. package/dist/src/ui/components/ThemeDialog.test.d.ts +6 -0
  1441. package/dist/src/ui/components/ThemeDialog.test.js +75 -0
  1442. package/dist/src/ui/components/ThemeDialog.test.js.map +1 -0
  1443. package/dist/src/ui/components/ThinkingDots.d.ts +11 -0
  1444. package/dist/src/ui/components/ThinkingDots.js +47 -0
  1445. package/dist/src/ui/components/ThinkingDots.js.map +1 -0
  1446. package/dist/src/ui/components/ThinkingIndicator.d.ts +7 -0
  1447. package/dist/src/ui/components/ThinkingIndicator.js +13 -0
  1448. package/dist/src/ui/components/ThinkingIndicator.js.map +1 -0
  1449. package/dist/src/ui/components/Tips.d.ts +6 -0
  1450. package/dist/src/ui/components/Tips.js +37 -0
  1451. package/dist/src/ui/components/Tips.js.map +1 -0
  1452. package/dist/src/ui/components/Tips.test.d.ts +6 -0
  1453. package/dist/src/ui/components/Tips.test.js +145 -0
  1454. package/dist/src/ui/components/Tips.test.js.map +1 -0
  1455. package/dist/src/ui/components/TodoDisplay.d.ts +16 -0
  1456. package/dist/src/ui/components/TodoDisplay.js +27 -0
  1457. package/dist/src/ui/components/TodoDisplay.js.map +1 -0
  1458. package/dist/src/ui/components/TodoDisplay.test.d.ts +6 -0
  1459. package/dist/src/ui/components/TodoDisplay.test.js +77 -0
  1460. package/dist/src/ui/components/TodoDisplay.test.js.map +1 -0
  1461. package/dist/src/ui/components/ToolStatsDisplay.d.ts +11 -0
  1462. package/dist/src/ui/components/ToolStatsDisplay.js +42 -0
  1463. package/dist/src/ui/components/ToolStatsDisplay.js.map +1 -0
  1464. package/dist/src/ui/components/TrustDialog.d.ts +13 -0
  1465. package/dist/src/ui/components/TrustDialog.js +48 -0
  1466. package/dist/src/ui/components/TrustDialog.js.map +1 -0
  1467. package/dist/src/ui/components/TrustDialog.test.d.ts +6 -0
  1468. package/dist/src/ui/components/TrustDialog.test.js +154 -0
  1469. package/dist/src/ui/components/TrustDialog.test.js.map +1 -0
  1470. package/dist/src/ui/components/UpdateNotification.d.ts +10 -0
  1471. package/dist/src/ui/components/UpdateNotification.js +10 -0
  1472. package/dist/src/ui/components/UpdateNotification.js.map +1 -0
  1473. package/dist/src/ui/components/WelcomeBackDialog.d.ts +13 -0
  1474. package/dist/src/ui/components/WelcomeBackDialog.js +43 -0
  1475. package/dist/src/ui/components/WelcomeBackDialog.js.map +1 -0
  1476. package/dist/src/ui/components/WorktreeExitDialog.d.ts +26 -0
  1477. package/dist/src/ui/components/WorktreeExitDialog.js +134 -0
  1478. package/dist/src/ui/components/WorktreeExitDialog.js.map +1 -0
  1479. package/dist/src/ui/components/WorktreeExitDialog.test.d.ts +6 -0
  1480. package/dist/src/ui/components/WorktreeExitDialog.test.js +41 -0
  1481. package/dist/src/ui/components/WorktreeExitDialog.test.js.map +1 -0
  1482. package/dist/src/ui/components/agent-view/AgentChatContent.d.ts +27 -0
  1483. package/dist/src/ui/components/agent-view/AgentChatContent.js +150 -0
  1484. package/dist/src/ui/components/agent-view/AgentChatContent.js.map +1 -0
  1485. package/dist/src/ui/components/agent-view/AgentChatView.d.ts +10 -0
  1486. package/dist/src/ui/components/agent-view/AgentChatView.js +24 -0
  1487. package/dist/src/ui/components/agent-view/AgentChatView.js.map +1 -0
  1488. package/dist/src/ui/components/agent-view/AgentComposer.d.ts +10 -0
  1489. package/dist/src/ui/components/agent-view/AgentComposer.js +183 -0
  1490. package/dist/src/ui/components/agent-view/AgentComposer.js.map +1 -0
  1491. package/dist/src/ui/components/agent-view/AgentFooter.d.ts +20 -0
  1492. package/dist/src/ui/components/agent-view/AgentFooter.js +15 -0
  1493. package/dist/src/ui/components/agent-view/AgentFooter.js.map +1 -0
  1494. package/dist/src/ui/components/agent-view/AgentHeader.d.ts +19 -0
  1495. package/dist/src/ui/components/agent-view/AgentHeader.js +13 -0
  1496. package/dist/src/ui/components/agent-view/AgentHeader.js.map +1 -0
  1497. package/dist/src/ui/components/agent-view/AgentTabBar.d.ts +6 -0
  1498. package/dist/src/ui/components/agent-view/AgentTabBar.js +110 -0
  1499. package/dist/src/ui/components/agent-view/AgentTabBar.js.map +1 -0
  1500. package/dist/src/ui/components/agent-view/AgentTabBar.test.d.ts +6 -0
  1501. package/dist/src/ui/components/agent-view/AgentTabBar.test.js +90 -0
  1502. package/dist/src/ui/components/agent-view/AgentTabBar.test.js.map +1 -0
  1503. package/dist/src/ui/components/agent-view/agentHistoryAdapter.d.ts +31 -0
  1504. package/dist/src/ui/components/agent-view/agentHistoryAdapter.js +148 -0
  1505. package/dist/src/ui/components/agent-view/agentHistoryAdapter.js.map +1 -0
  1506. package/dist/src/ui/components/agent-view/agentHistoryAdapter.test.d.ts +6 -0
  1507. package/dist/src/ui/components/agent-view/agentHistoryAdapter.test.js +318 -0
  1508. package/dist/src/ui/components/agent-view/agentHistoryAdapter.test.js.map +1 -0
  1509. package/dist/src/ui/components/agent-view/index.d.ts +11 -0
  1510. package/dist/src/ui/components/agent-view/index.js +12 -0
  1511. package/dist/src/ui/components/agent-view/index.js.map +1 -0
  1512. package/dist/src/ui/components/approvalModeVisuals.d.ts +11 -0
  1513. package/dist/src/ui/components/approvalModeVisuals.js +37 -0
  1514. package/dist/src/ui/components/approvalModeVisuals.js.map +1 -0
  1515. package/dist/src/ui/components/approvalModeVisuals.test.d.ts +6 -0
  1516. package/dist/src/ui/components/approvalModeVisuals.test.js +32 -0
  1517. package/dist/src/ui/components/approvalModeVisuals.test.js.map +1 -0
  1518. package/dist/src/ui/components/arena/ArenaCards.d.ts +21 -0
  1519. package/dist/src/ui/components/arena/ArenaCards.js +99 -0
  1520. package/dist/src/ui/components/arena/ArenaCards.js.map +1 -0
  1521. package/dist/src/ui/components/arena/ArenaCards.test.d.ts +6 -0
  1522. package/dist/src/ui/components/arena/ArenaCards.test.js +128 -0
  1523. package/dist/src/ui/components/arena/ArenaCards.test.js.map +1 -0
  1524. package/dist/src/ui/components/arena/ArenaSelectDialog.d.ts +16 -0
  1525. package/dist/src/ui/components/arena/ArenaSelectDialog.js +213 -0
  1526. package/dist/src/ui/components/arena/ArenaSelectDialog.js.map +1 -0
  1527. package/dist/src/ui/components/arena/ArenaSelectDialog.test.d.ts +6 -0
  1528. package/dist/src/ui/components/arena/ArenaSelectDialog.test.js +149 -0
  1529. package/dist/src/ui/components/arena/ArenaSelectDialog.test.js.map +1 -0
  1530. package/dist/src/ui/components/arena/ArenaStartDialog.d.ts +12 -0
  1531. package/dist/src/ui/components/arena/ArenaStartDialog.js +49 -0
  1532. package/dist/src/ui/components/arena/ArenaStartDialog.js.map +1 -0
  1533. package/dist/src/ui/components/arena/ArenaStatusDialog.d.ts +14 -0
  1534. package/dist/src/ui/components/arena/ArenaStatusDialog.js +111 -0
  1535. package/dist/src/ui/components/arena/ArenaStatusDialog.js.map +1 -0
  1536. package/dist/src/ui/components/arena/ArenaStopDialog.d.ts +15 -0
  1537. package/dist/src/ui/components/arena/ArenaStopDialog.js +113 -0
  1538. package/dist/src/ui/components/arena/ArenaStopDialog.js.map +1 -0
  1539. package/dist/src/ui/components/background-view/BackgroundTasksDialog.d.ts +17 -0
  1540. package/dist/src/ui/components/background-view/BackgroundTasksDialog.js +614 -0
  1541. package/dist/src/ui/components/background-view/BackgroundTasksDialog.js.map +1 -0
  1542. package/dist/src/ui/components/background-view/BackgroundTasksDialog.test.d.ts +6 -0
  1543. package/dist/src/ui/components/background-view/BackgroundTasksDialog.test.js +606 -0
  1544. package/dist/src/ui/components/background-view/BackgroundTasksDialog.test.js.map +1 -0
  1545. package/dist/src/ui/components/background-view/BackgroundTasksPill.d.ts +14 -0
  1546. package/dist/src/ui/components/background-view/BackgroundTasksPill.js +94 -0
  1547. package/dist/src/ui/components/background-view/BackgroundTasksPill.js.map +1 -0
  1548. package/dist/src/ui/components/background-view/BackgroundTasksPill.test.d.ts +6 -0
  1549. package/dist/src/ui/components/background-view/BackgroundTasksPill.test.js +158 -0
  1550. package/dist/src/ui/components/background-view/BackgroundTasksPill.test.js.map +1 -0
  1551. package/dist/src/ui/components/background-view/LiveAgentPanel.d.ts +43 -0
  1552. package/dist/src/ui/components/background-view/LiveAgentPanel.js +361 -0
  1553. package/dist/src/ui/components/background-view/LiveAgentPanel.js.map +1 -0
  1554. package/dist/src/ui/components/background-view/LiveAgentPanel.test.d.ts +6 -0
  1555. package/dist/src/ui/components/background-view/LiveAgentPanel.test.js +595 -0
  1556. package/dist/src/ui/components/background-view/LiveAgentPanel.test.js.map +1 -0
  1557. package/dist/src/ui/components/extensions/ExtensionsManagerDialog.d.ts +12 -0
  1558. package/dist/src/ui/components/extensions/ExtensionsManagerDialog.js +337 -0
  1559. package/dist/src/ui/components/extensions/ExtensionsManagerDialog.js.map +1 -0
  1560. package/dist/src/ui/components/extensions/ExtensionsManagerDialog.test.d.ts +6 -0
  1561. package/dist/src/ui/components/extensions/ExtensionsManagerDialog.test.js +90 -0
  1562. package/dist/src/ui/components/extensions/ExtensionsManagerDialog.test.js.map +1 -0
  1563. package/dist/src/ui/components/extensions/index.d.ts +8 -0
  1564. package/dist/src/ui/components/extensions/index.js +8 -0
  1565. package/dist/src/ui/components/extensions/index.js.map +1 -0
  1566. package/dist/src/ui/components/extensions/steps/ActionSelectionStep.d.ts +15 -0
  1567. package/dist/src/ui/components/extensions/steps/ActionSelectionStep.js +75 -0
  1568. package/dist/src/ui/components/extensions/steps/ActionSelectionStep.js.map +1 -0
  1569. package/dist/src/ui/components/extensions/steps/ActionSelectionStep.test.d.ts +6 -0
  1570. package/dist/src/ui/components/extensions/steps/ActionSelectionStep.test.js +56 -0
  1571. package/dist/src/ui/components/extensions/steps/ActionSelectionStep.test.js.map +1 -0
  1572. package/dist/src/ui/components/extensions/steps/ExtensionDetailStep.d.ts +11 -0
  1573. package/dist/src/ui/components/extensions/steps/ExtensionDetailStep.js +23 -0
  1574. package/dist/src/ui/components/extensions/steps/ExtensionDetailStep.js.map +1 -0
  1575. package/dist/src/ui/components/extensions/steps/ExtensionListStep.d.ts +13 -0
  1576. package/dist/src/ui/components/extensions/steps/ExtensionListStep.js +105 -0
  1577. package/dist/src/ui/components/extensions/steps/ExtensionListStep.js.map +1 -0
  1578. package/dist/src/ui/components/extensions/steps/ExtensionListStep.test.d.ts +6 -0
  1579. package/dist/src/ui/components/extensions/steps/ExtensionListStep.test.js +74 -0
  1580. package/dist/src/ui/components/extensions/steps/ExtensionListStep.test.js.map +1 -0
  1581. package/dist/src/ui/components/extensions/steps/ScopeSelectStep.d.ts +13 -0
  1582. package/dist/src/ui/components/extensions/steps/ScopeSelectStep.js +40 -0
  1583. package/dist/src/ui/components/extensions/steps/ScopeSelectStep.js.map +1 -0
  1584. package/dist/src/ui/components/extensions/steps/UninstallConfirmStep.d.ts +13 -0
  1585. package/dist/src/ui/components/extensions/steps/UninstallConfirmStep.js +38 -0
  1586. package/dist/src/ui/components/extensions/steps/UninstallConfirmStep.js.map +1 -0
  1587. package/dist/src/ui/components/extensions/steps/index.d.ts +10 -0
  1588. package/dist/src/ui/components/extensions/steps/index.js +11 -0
  1589. package/dist/src/ui/components/extensions/steps/index.js.map +1 -0
  1590. package/dist/src/ui/components/extensions/types.d.ts +73 -0
  1591. package/dist/src/ui/components/extensions/types.js +18 -0
  1592. package/dist/src/ui/components/extensions/types.js.map +1 -0
  1593. package/dist/src/ui/components/hooks/HandlerListBody.d.ts +12 -0
  1594. package/dist/src/ui/components/hooks/HandlerListBody.js +54 -0
  1595. package/dist/src/ui/components/hooks/HandlerListBody.js.map +1 -0
  1596. package/dist/src/ui/components/hooks/HandlerListBody.test.d.ts +6 -0
  1597. package/dist/src/ui/components/hooks/HandlerListBody.test.js +175 -0
  1598. package/dist/src/ui/components/hooks/HandlerListBody.test.js.map +1 -0
  1599. package/dist/src/ui/components/hooks/HookConfigDetailStep.d.ts +12 -0
  1600. package/dist/src/ui/components/hooks/HookConfigDetailStep.js +48 -0
  1601. package/dist/src/ui/components/hooks/HookConfigDetailStep.js.map +1 -0
  1602. package/dist/src/ui/components/hooks/HookConfigDetailStep.test.d.ts +6 -0
  1603. package/dist/src/ui/components/hooks/HookConfigDetailStep.test.js +236 -0
  1604. package/dist/src/ui/components/hooks/HookConfigDetailStep.test.js.map +1 -0
  1605. package/dist/src/ui/components/hooks/HookDetailStep.d.ts +12 -0
  1606. package/dist/src/ui/components/hooks/HookDetailStep.js +11 -0
  1607. package/dist/src/ui/components/hooks/HookDetailStep.js.map +1 -0
  1608. package/dist/src/ui/components/hooks/HookDetailStep.test.d.ts +6 -0
  1609. package/dist/src/ui/components/hooks/HookDetailStep.test.js +241 -0
  1610. package/dist/src/ui/components/hooks/HookDetailStep.test.js.map +1 -0
  1611. package/dist/src/ui/components/hooks/HookEventHandlerListStep.d.ts +12 -0
  1612. package/dist/src/ui/components/hooks/HookEventHandlerListStep.js +18 -0
  1613. package/dist/src/ui/components/hooks/HookEventHandlerListStep.js.map +1 -0
  1614. package/dist/src/ui/components/hooks/HookEventHeader.d.ts +13 -0
  1615. package/dist/src/ui/components/hooks/HookEventHeader.js +23 -0
  1616. package/dist/src/ui/components/hooks/HookEventHeader.js.map +1 -0
  1617. package/dist/src/ui/components/hooks/HookEventMatcherListStep.d.ts +12 -0
  1618. package/dist/src/ui/components/hooks/HookEventMatcherListStep.js +28 -0
  1619. package/dist/src/ui/components/hooks/HookEventMatcherListStep.js.map +1 -0
  1620. package/dist/src/ui/components/hooks/HookMatcherDetailStep.d.ts +13 -0
  1621. package/dist/src/ui/components/hooks/HookMatcherDetailStep.js +16 -0
  1622. package/dist/src/ui/components/hooks/HookMatcherDetailStep.js.map +1 -0
  1623. package/dist/src/ui/components/hooks/HookMatcherDetailStep.test.d.ts +6 -0
  1624. package/dist/src/ui/components/hooks/HookMatcherDetailStep.test.js +154 -0
  1625. package/dist/src/ui/components/hooks/HookMatcherDetailStep.test.js.map +1 -0
  1626. package/dist/src/ui/components/hooks/HooksDisabledStep.d.ts +10 -0
  1627. package/dist/src/ui/components/hooks/HooksDisabledStep.js +23 -0
  1628. package/dist/src/ui/components/hooks/HooksDisabledStep.js.map +1 -0
  1629. package/dist/src/ui/components/hooks/HooksDisabledStep.test.d.ts +6 -0
  1630. package/dist/src/ui/components/hooks/HooksDisabledStep.test.js +86 -0
  1631. package/dist/src/ui/components/hooks/HooksDisabledStep.test.js.map +1 -0
  1632. package/dist/src/ui/components/hooks/HooksListStep.d.ts +12 -0
  1633. package/dist/src/ui/components/hooks/HooksListStep.js +32 -0
  1634. package/dist/src/ui/components/hooks/HooksListStep.js.map +1 -0
  1635. package/dist/src/ui/components/hooks/HooksListStep.test.d.ts +6 -0
  1636. package/dist/src/ui/components/hooks/HooksListStep.test.js +144 -0
  1637. package/dist/src/ui/components/hooks/HooksListStep.test.js.map +1 -0
  1638. package/dist/src/ui/components/hooks/HooksManagementDialog.d.ts +7 -0
  1639. package/dist/src/ui/components/hooks/HooksManagementDialog.js +418 -0
  1640. package/dist/src/ui/components/hooks/HooksManagementDialog.js.map +1 -0
  1641. package/dist/src/ui/components/hooks/HooksManagementDialog.test.d.ts +6 -0
  1642. package/dist/src/ui/components/hooks/HooksManagementDialog.test.js +305 -0
  1643. package/dist/src/ui/components/hooks/HooksManagementDialog.test.js.map +1 -0
  1644. package/dist/src/ui/components/hooks/constants.d.ts +26 -0
  1645. package/dist/src/ui/components/hooks/constants.js +227 -0
  1646. package/dist/src/ui/components/hooks/constants.js.map +1 -0
  1647. package/dist/src/ui/components/hooks/constants.test.d.ts +6 -0
  1648. package/dist/src/ui/components/hooks/constants.test.js +317 -0
  1649. package/dist/src/ui/components/hooks/constants.test.js.map +1 -0
  1650. package/dist/src/ui/components/hooks/index.d.ts +12 -0
  1651. package/dist/src/ui/components/hooks/index.js +13 -0
  1652. package/dist/src/ui/components/hooks/index.js.map +1 -0
  1653. package/dist/src/ui/components/hooks/matcherGrouping.d.ts +9 -0
  1654. package/dist/src/ui/components/hooks/matcherGrouping.js +35 -0
  1655. package/dist/src/ui/components/hooks/matcherGrouping.js.map +1 -0
  1656. package/dist/src/ui/components/hooks/matcherGrouping.test.d.ts +6 -0
  1657. package/dist/src/ui/components/hooks/matcherGrouping.test.js +183 -0
  1658. package/dist/src/ui/components/hooks/matcherGrouping.test.js.map +1 -0
  1659. package/dist/src/ui/components/hooks/sourceLabels.d.ts +13 -0
  1660. package/dist/src/ui/components/hooks/sourceLabels.js +35 -0
  1661. package/dist/src/ui/components/hooks/sourceLabels.js.map +1 -0
  1662. package/dist/src/ui/components/hooks/sourceLabels.test.d.ts +6 -0
  1663. package/dist/src/ui/components/hooks/sourceLabels.test.js +81 -0
  1664. package/dist/src/ui/components/hooks/sourceLabels.test.js.map +1 -0
  1665. package/dist/src/ui/components/hooks/types.d.ts +42 -0
  1666. package/dist/src/ui/components/hooks/types.js +13 -0
  1667. package/dist/src/ui/components/hooks/types.js.map +1 -0
  1668. package/dist/src/ui/components/mcp/MCPHealthPill.d.ts +24 -0
  1669. package/dist/src/ui/components/mcp/MCPHealthPill.js +33 -0
  1670. package/dist/src/ui/components/mcp/MCPHealthPill.js.map +1 -0
  1671. package/dist/src/ui/components/mcp/MCPHealthPill.test.d.ts +6 -0
  1672. package/dist/src/ui/components/mcp/MCPHealthPill.test.js +42 -0
  1673. package/dist/src/ui/components/mcp/MCPHealthPill.test.js.map +1 -0
  1674. package/dist/src/ui/components/mcp/MCPManagementDialog.d.ts +7 -0
  1675. package/dist/src/ui/components/mcp/MCPManagementDialog.js +472 -0
  1676. package/dist/src/ui/components/mcp/MCPManagementDialog.js.map +1 -0
  1677. package/dist/src/ui/components/mcp/constants.d.ts +29 -0
  1678. package/dist/src/ui/components/mcp/constants.js +34 -0
  1679. package/dist/src/ui/components/mcp/constants.js.map +1 -0
  1680. package/dist/src/ui/components/mcp/index.d.ts +12 -0
  1681. package/dist/src/ui/components/mcp/index.js +15 -0
  1682. package/dist/src/ui/components/mcp/index.js.map +1 -0
  1683. package/dist/src/ui/components/mcp/steps/AuthenticateStep.d.ts +7 -0
  1684. package/dist/src/ui/components/mcp/steps/AuthenticateStep.js +187 -0
  1685. package/dist/src/ui/components/mcp/steps/AuthenticateStep.js.map +1 -0
  1686. package/dist/src/ui/components/mcp/steps/DisableScopeSelectStep.d.ts +7 -0
  1687. package/dist/src/ui/components/mcp/steps/DisableScopeSelectStep.js +44 -0
  1688. package/dist/src/ui/components/mcp/steps/DisableScopeSelectStep.js.map +1 -0
  1689. package/dist/src/ui/components/mcp/steps/ServerDetailStep.d.ts +7 -0
  1690. package/dist/src/ui/components/mcp/steps/ServerDetailStep.js +108 -0
  1691. package/dist/src/ui/components/mcp/steps/ServerDetailStep.js.map +1 -0
  1692. package/dist/src/ui/components/mcp/steps/ServerListStep.d.ts +7 -0
  1693. package/dist/src/ui/components/mcp/steps/ServerListStep.js +74 -0
  1694. package/dist/src/ui/components/mcp/steps/ServerListStep.js.map +1 -0
  1695. package/dist/src/ui/components/mcp/steps/ServerListStep.test.d.ts +6 -0
  1696. package/dist/src/ui/components/mcp/steps/ServerListStep.test.js +60 -0
  1697. package/dist/src/ui/components/mcp/steps/ServerListStep.test.js.map +1 -0
  1698. package/dist/src/ui/components/mcp/steps/ToolDetailStep.d.ts +7 -0
  1699. package/dist/src/ui/components/mcp/steps/ToolDetailStep.js +49 -0
  1700. package/dist/src/ui/components/mcp/steps/ToolDetailStep.js.map +1 -0
  1701. package/dist/src/ui/components/mcp/steps/ToolListStep.d.ts +7 -0
  1702. package/dist/src/ui/components/mcp/steps/ToolListStep.js +80 -0
  1703. package/dist/src/ui/components/mcp/steps/ToolListStep.js.map +1 -0
  1704. package/dist/src/ui/components/mcp/steps/ToolListStep.test.d.ts +6 -0
  1705. package/dist/src/ui/components/mcp/steps/ToolListStep.test.js +55 -0
  1706. package/dist/src/ui/components/mcp/steps/ToolListStep.test.js.map +1 -0
  1707. package/dist/src/ui/components/mcp/types.d.ts +177 -0
  1708. package/dist/src/ui/components/mcp/types.js +17 -0
  1709. package/dist/src/ui/components/mcp/types.js.map +1 -0
  1710. package/dist/src/ui/components/mcp/utils.d.ts +40 -0
  1711. package/dist/src/ui/components/mcp/utils.js +126 -0
  1712. package/dist/src/ui/components/mcp/utils.js.map +1 -0
  1713. package/dist/src/ui/components/mcp/utils.test.d.ts +6 -0
  1714. package/dist/src/ui/components/mcp/utils.test.js +130 -0
  1715. package/dist/src/ui/components/mcp/utils.test.js.map +1 -0
  1716. package/dist/src/ui/components/messages/AskUserQuestionDialog.d.ts +14 -0
  1717. package/dist/src/ui/components/messages/AskUserQuestionDialog.js +291 -0
  1718. package/dist/src/ui/components/messages/AskUserQuestionDialog.js.map +1 -0
  1719. package/dist/src/ui/components/messages/AskUserQuestionDialog.test.d.ts +6 -0
  1720. package/dist/src/ui/components/messages/AskUserQuestionDialog.test.js +281 -0
  1721. package/dist/src/ui/components/messages/AskUserQuestionDialog.test.js.map +1 -0
  1722. package/dist/src/ui/components/messages/BtwMessage.d.ts +14 -0
  1723. package/dist/src/ui/components/messages/BtwMessage.js +30 -0
  1724. package/dist/src/ui/components/messages/BtwMessage.js.map +1 -0
  1725. package/dist/src/ui/components/messages/BtwMessage.test.d.ts +6 -0
  1726. package/dist/src/ui/components/messages/BtwMessage.test.js +60 -0
  1727. package/dist/src/ui/components/messages/BtwMessage.test.js.map +1 -0
  1728. package/dist/src/ui/components/messages/CompactToolGroupDisplay.d.ts +20 -0
  1729. package/dist/src/ui/components/messages/CompactToolGroupDisplay.js +80 -0
  1730. package/dist/src/ui/components/messages/CompactToolGroupDisplay.js.map +1 -0
  1731. package/dist/src/ui/components/messages/CompactToolGroupDisplay.test.d.ts +6 -0
  1732. package/dist/src/ui/components/messages/CompactToolGroupDisplay.test.js +139 -0
  1733. package/dist/src/ui/components/messages/CompactToolGroupDisplay.test.js.map +1 -0
  1734. package/dist/src/ui/components/messages/CompressionMessage.d.ts +10 -0
  1735. package/dist/src/ui/components/messages/CompressionMessage.js +50 -0
  1736. package/dist/src/ui/components/messages/CompressionMessage.js.map +1 -0
  1737. package/dist/src/ui/components/messages/CompressionMessage.test.d.ts +6 -0
  1738. package/dist/src/ui/components/messages/CompressionMessage.test.js +160 -0
  1739. package/dist/src/ui/components/messages/CompressionMessage.test.js.map +1 -0
  1740. package/dist/src/ui/components/messages/ConversationMessages.d.ts +46 -0
  1741. package/dist/src/ui/components/messages/ConversationMessages.js +32 -0
  1742. package/dist/src/ui/components/messages/ConversationMessages.js.map +1 -0
  1743. package/dist/src/ui/components/messages/DiffRenderer.d.ts +19 -0
  1744. package/dist/src/ui/components/messages/DiffRenderer.js +219 -0
  1745. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -0
  1746. package/dist/src/ui/components/messages/DiffRenderer.test.d.ts +6 -0
  1747. package/dist/src/ui/components/messages/DiffRenderer.test.js +296 -0
  1748. package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -0
  1749. package/dist/src/ui/components/messages/DiffStatsDisplay.d.ts +18 -0
  1750. package/dist/src/ui/components/messages/DiffStatsDisplay.js +50 -0
  1751. package/dist/src/ui/components/messages/DiffStatsDisplay.js.map +1 -0
  1752. package/dist/src/ui/components/messages/DiffStatsDisplay.test.d.ts +6 -0
  1753. package/dist/src/ui/components/messages/DiffStatsDisplay.test.js +165 -0
  1754. package/dist/src/ui/components/messages/DiffStatsDisplay.test.js.map +1 -0
  1755. package/dist/src/ui/components/messages/GoalStatusMessage.d.ts +16 -0
  1756. package/dist/src/ui/components/messages/GoalStatusMessage.js +76 -0
  1757. package/dist/src/ui/components/messages/GoalStatusMessage.js.map +1 -0
  1758. package/dist/src/ui/components/messages/GoalStatusMessage.test.d.ts +6 -0
  1759. package/dist/src/ui/components/messages/GoalStatusMessage.test.js +32 -0
  1760. package/dist/src/ui/components/messages/GoalStatusMessage.test.js.map +1 -0
  1761. package/dist/src/ui/components/messages/InlineParallelAgentsDisplay.d.ts +33 -0
  1762. package/dist/src/ui/components/messages/InlineParallelAgentsDisplay.js +196 -0
  1763. package/dist/src/ui/components/messages/InlineParallelAgentsDisplay.js.map +1 -0
  1764. package/dist/src/ui/components/messages/InlineParallelAgentsDisplay.test.d.ts +6 -0
  1765. package/dist/src/ui/components/messages/InlineParallelAgentsDisplay.test.js +219 -0
  1766. package/dist/src/ui/components/messages/InlineParallelAgentsDisplay.test.js.map +1 -0
  1767. package/dist/src/ui/components/messages/InsightProgressMessage.d.ts +12 -0
  1768. package/dist/src/ui/components/messages/InsightProgressMessage.js +20 -0
  1769. package/dist/src/ui/components/messages/InsightProgressMessage.js.map +1 -0
  1770. package/dist/src/ui/components/messages/MemorySavedMessage.d.ts +18 -0
  1771. package/dist/src/ui/components/messages/MemorySavedMessage.js +15 -0
  1772. package/dist/src/ui/components/messages/MemorySavedMessage.js.map +1 -0
  1773. package/dist/src/ui/components/messages/StatusMessages.d.ts +33 -0
  1774. package/dist/src/ui/components/messages/StatusMessages.js +28 -0
  1775. package/dist/src/ui/components/messages/StatusMessages.js.map +1 -0
  1776. package/dist/src/ui/components/messages/StatusMessages.test.d.ts +6 -0
  1777. package/dist/src/ui/components/messages/StatusMessages.test.js +21 -0
  1778. package/dist/src/ui/components/messages/StatusMessages.test.js.map +1 -0
  1779. package/dist/src/ui/components/messages/SummaryMessage.d.ts +11 -0
  1780. package/dist/src/ui/components/messages/SummaryMessage.js +38 -0
  1781. package/dist/src/ui/components/messages/SummaryMessage.js.map +1 -0
  1782. package/dist/src/ui/components/messages/ToolConfirmationMessage.d.ts +16 -0
  1783. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +352 -0
  1784. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -0
  1785. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.d.ts +6 -0
  1786. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +312 -0
  1787. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -0
  1788. package/dist/src/ui/components/messages/ToolGroupMessage.d.ts +58 -0
  1789. package/dist/src/ui/components/messages/ToolGroupMessage.js +278 -0
  1790. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -0
  1791. package/dist/src/ui/components/messages/ToolGroupMessage.test.d.ts +6 -0
  1792. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +619 -0
  1793. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -0
  1794. package/dist/src/ui/components/messages/ToolMessage.d.ts +39 -0
  1795. package/dist/src/ui/components/messages/ToolMessage.js +400 -0
  1796. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -0
  1797. package/dist/src/ui/components/messages/ToolMessage.test.d.ts +6 -0
  1798. package/dist/src/ui/components/messages/ToolMessage.test.js +575 -0
  1799. package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -0
  1800. package/dist/src/ui/components/shared/BaseSelectionList.d.ts +40 -0
  1801. package/dist/src/ui/components/shared/BaseSelectionList.js +75 -0
  1802. package/dist/src/ui/components/shared/BaseSelectionList.js.map +1 -0
  1803. package/dist/src/ui/components/shared/BaseSelectionList.test.d.ts +6 -0
  1804. package/dist/src/ui/components/shared/BaseSelectionList.test.js +376 -0
  1805. package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +1 -0
  1806. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.d.ts +37 -0
  1807. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js +13 -0
  1808. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js.map +1 -0
  1809. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.d.ts +6 -0
  1810. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js +79 -0
  1811. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js.map +1 -0
  1812. package/dist/src/ui/components/shared/EnumSelector.d.ts +18 -0
  1813. package/dist/src/ui/components/shared/EnumSelector.js +44 -0
  1814. package/dist/src/ui/components/shared/EnumSelector.js.map +1 -0
  1815. package/dist/src/ui/components/shared/EnumSelector.test.d.ts +6 -0
  1816. package/dist/src/ui/components/shared/EnumSelector.test.js +70 -0
  1817. package/dist/src/ui/components/shared/EnumSelector.test.js.map +1 -0
  1818. package/dist/src/ui/components/shared/MaxSizedBox.d.ts +61 -0
  1819. package/dist/src/ui/components/shared/MaxSizedBox.js +453 -0
  1820. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -0
  1821. package/dist/src/ui/components/shared/MaxSizedBox.test.d.ts +6 -0
  1822. package/dist/src/ui/components/shared/MaxSizedBox.test.js +154 -0
  1823. package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +1 -0
  1824. package/dist/src/ui/components/shared/MultiSelect.d.ts +30 -0
  1825. package/dist/src/ui/components/shared/MultiSelect.js +94 -0
  1826. package/dist/src/ui/components/shared/MultiSelect.js.map +1 -0
  1827. package/dist/src/ui/components/shared/RadioButtonSelect.d.ts +45 -0
  1828. package/dist/src/ui/components/shared/RadioButtonSelect.js +21 -0
  1829. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -0
  1830. package/dist/src/ui/components/shared/RadioButtonSelect.test.d.ts +6 -0
  1831. package/dist/src/ui/components/shared/RadioButtonSelect.test.js +134 -0
  1832. package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +1 -0
  1833. package/dist/src/ui/components/shared/ScopeSelector.d.ts +19 -0
  1834. package/dist/src/ui/components/shared/ScopeSelector.js +16 -0
  1835. package/dist/src/ui/components/shared/ScopeSelector.js.map +1 -0
  1836. package/dist/src/ui/components/shared/ScrollableList.d.ts +19 -0
  1837. package/dist/src/ui/components/shared/ScrollableList.js +97 -0
  1838. package/dist/src/ui/components/shared/ScrollableList.js.map +1 -0
  1839. package/dist/src/ui/components/shared/ScrollableList.test.d.ts +6 -0
  1840. package/dist/src/ui/components/shared/ScrollableList.test.js +158 -0
  1841. package/dist/src/ui/components/shared/ScrollableList.test.js.map +1 -0
  1842. package/dist/src/ui/components/shared/StaticRender.d.ts +25 -0
  1843. package/dist/src/ui/components/shared/StaticRender.js +25 -0
  1844. package/dist/src/ui/components/shared/StaticRender.js.map +1 -0
  1845. package/dist/src/ui/components/shared/TextInput.d.ts +25 -0
  1846. package/dist/src/ui/components/shared/TextInput.js +163 -0
  1847. package/dist/src/ui/components/shared/TextInput.js.map +1 -0
  1848. package/dist/src/ui/components/shared/TextInput.test.d.ts +6 -0
  1849. package/dist/src/ui/components/shared/TextInput.test.js +91 -0
  1850. package/dist/src/ui/components/shared/TextInput.test.js.map +1 -0
  1851. package/dist/src/ui/components/shared/ToolElapsedTime.d.ts +30 -0
  1852. package/dist/src/ui/components/shared/ToolElapsedTime.js +43 -0
  1853. package/dist/src/ui/components/shared/ToolElapsedTime.js.map +1 -0
  1854. package/dist/src/ui/components/shared/ToolElapsedTime.test.d.ts +6 -0
  1855. package/dist/src/ui/components/shared/ToolElapsedTime.test.js +63 -0
  1856. package/dist/src/ui/components/shared/ToolElapsedTime.test.js.map +1 -0
  1857. package/dist/src/ui/components/shared/ToolStatusIndicator.d.ts +14 -0
  1858. package/dist/src/ui/components/shared/ToolStatusIndicator.js +13 -0
  1859. package/dist/src/ui/components/shared/ToolStatusIndicator.js.map +1 -0
  1860. package/dist/src/ui/components/shared/VirtualizedList.d.ts +49 -0
  1861. package/dist/src/ui/components/shared/VirtualizedList.js +529 -0
  1862. package/dist/src/ui/components/shared/VirtualizedList.js.map +1 -0
  1863. package/dist/src/ui/components/shared/VirtualizedList.test.d.ts +6 -0
  1864. package/dist/src/ui/components/shared/VirtualizedList.test.js +371 -0
  1865. package/dist/src/ui/components/shared/VirtualizedList.test.js.map +1 -0
  1866. package/dist/src/ui/components/shared/text-buffer-external-editor.test.d.ts +6 -0
  1867. package/dist/src/ui/components/shared/text-buffer-external-editor.test.js +657 -0
  1868. package/dist/src/ui/components/shared/text-buffer-external-editor.test.js.map +1 -0
  1869. package/dist/src/ui/components/shared/text-buffer.d.ts +503 -0
  1870. package/dist/src/ui/components/shared/text-buffer.js +2181 -0
  1871. package/dist/src/ui/components/shared/text-buffer.js.map +1 -0
  1872. package/dist/src/ui/components/shared/vim-buffer-actions.d.ts +74 -0
  1873. package/dist/src/ui/components/shared/vim-buffer-actions.js +612 -0
  1874. package/dist/src/ui/components/shared/vim-buffer-actions.js.map +1 -0
  1875. package/dist/src/ui/components/skills/SkillsManagerDialog.d.ts +44 -0
  1876. package/dist/src/ui/components/skills/SkillsManagerDialog.js +423 -0
  1877. package/dist/src/ui/components/skills/SkillsManagerDialog.js.map +1 -0
  1878. package/dist/src/ui/components/stats-helpers.d.ts +30 -0
  1879. package/dist/src/ui/components/stats-helpers.js +79 -0
  1880. package/dist/src/ui/components/stats-helpers.js.map +1 -0
  1881. package/dist/src/ui/components/subagents/constants.d.ts +23 -0
  1882. package/dist/src/ui/components/subagents/constants.js +67 -0
  1883. package/dist/src/ui/components/subagents/constants.js.map +1 -0
  1884. package/dist/src/ui/components/subagents/create/AgentCreationWizard.d.ts +15 -0
  1885. package/dist/src/ui/components/subagents/create/AgentCreationWizard.js +173 -0
  1886. package/dist/src/ui/components/subagents/create/AgentCreationWizard.js.map +1 -0
  1887. package/dist/src/ui/components/subagents/create/ColorSelector.d.ts +15 -0
  1888. package/dist/src/ui/components/subagents/create/ColorSelector.js +43 -0
  1889. package/dist/src/ui/components/subagents/create/ColorSelector.js.map +1 -0
  1890. package/dist/src/ui/components/subagents/create/CreationSummary.d.ts +10 -0
  1891. package/dist/src/ui/components/subagents/create/CreationSummary.js +176 -0
  1892. package/dist/src/ui/components/subagents/create/CreationSummary.js.map +1 -0
  1893. package/dist/src/ui/components/subagents/create/DescriptionInput.d.ts +10 -0
  1894. package/dist/src/ui/components/subagents/create/DescriptionInput.js +107 -0
  1895. package/dist/src/ui/components/subagents/create/DescriptionInput.js.map +1 -0
  1896. package/dist/src/ui/components/subagents/create/GenerationMethodSelector.d.ts +10 -0
  1897. package/dist/src/ui/components/subagents/create/GenerationMethodSelector.js +39 -0
  1898. package/dist/src/ui/components/subagents/create/GenerationMethodSelector.js.map +1 -0
  1899. package/dist/src/ui/components/subagents/create/LocationSelector.d.ts +10 -0
  1900. package/dist/src/ui/components/subagents/create/LocationSelector.js +39 -0
  1901. package/dist/src/ui/components/subagents/create/LocationSelector.js.map +1 -0
  1902. package/dist/src/ui/components/subagents/create/TextEntryStep.d.ts +26 -0
  1903. package/dist/src/ui/components/subagents/create/TextEntryStep.js +28 -0
  1904. package/dist/src/ui/components/subagents/create/TextEntryStep.js.map +1 -0
  1905. package/dist/src/ui/components/subagents/create/ToolSelector.d.ts +16 -0
  1906. package/dist/src/ui/components/subagents/create/ToolSelector.js +145 -0
  1907. package/dist/src/ui/components/subagents/create/ToolSelector.js.map +1 -0
  1908. package/dist/src/ui/components/subagents/index.d.ts +7 -0
  1909. package/dist/src/ui/components/subagents/index.js +13 -0
  1910. package/dist/src/ui/components/subagents/index.js.map +1 -0
  1911. package/dist/src/ui/components/subagents/manage/ActionSelectionStep.d.ts +13 -0
  1912. package/dist/src/ui/components/subagents/manage/ActionSelectionStep.js +73 -0
  1913. package/dist/src/ui/components/subagents/manage/ActionSelectionStep.js.map +1 -0
  1914. package/dist/src/ui/components/subagents/manage/AgentDeleteStep.d.ts +13 -0
  1915. package/dist/src/ui/components/subagents/manage/AgentDeleteStep.js +38 -0
  1916. package/dist/src/ui/components/subagents/manage/AgentDeleteStep.js.map +1 -0
  1917. package/dist/src/ui/components/subagents/manage/AgentEditStep.d.ts +15 -0
  1918. package/dist/src/ui/components/subagents/manage/AgentEditStep.js +76 -0
  1919. package/dist/src/ui/components/subagents/manage/AgentEditStep.js.map +1 -0
  1920. package/dist/src/ui/components/subagents/manage/AgentSelectionStep.d.ts +12 -0
  1921. package/dist/src/ui/components/subagents/manage/AgentSelectionStep.js +342 -0
  1922. package/dist/src/ui/components/subagents/manage/AgentSelectionStep.js.map +1 -0
  1923. package/dist/src/ui/components/subagents/manage/AgentSelectionStep.test.d.ts +6 -0
  1924. package/dist/src/ui/components/subagents/manage/AgentSelectionStep.test.js +56 -0
  1925. package/dist/src/ui/components/subagents/manage/AgentSelectionStep.test.js.map +1 -0
  1926. package/dist/src/ui/components/subagents/manage/AgentViewerStep.d.ts +11 -0
  1927. package/dist/src/ui/components/subagents/manage/AgentViewerStep.js +20 -0
  1928. package/dist/src/ui/components/subagents/manage/AgentViewerStep.js.map +1 -0
  1929. package/dist/src/ui/components/subagents/manage/AgentsManagerDialog.d.ts +15 -0
  1930. package/dist/src/ui/components/subagents/manage/AgentsManagerDialog.js +214 -0
  1931. package/dist/src/ui/components/subagents/manage/AgentsManagerDialog.js.map +1 -0
  1932. package/dist/src/ui/components/subagents/reducers.d.ts +14 -0
  1933. package/dist/src/ui/components/subagents/reducers.js +162 -0
  1934. package/dist/src/ui/components/subagents/reducers.js.map +1 -0
  1935. package/dist/src/ui/components/subagents/types.d.ts +137 -0
  1936. package/dist/src/ui/components/subagents/types.js +15 -0
  1937. package/dist/src/ui/components/subagents/types.js.map +1 -0
  1938. package/dist/src/ui/components/subagents/utils.d.ts +15 -0
  1939. package/dist/src/ui/components/subagents/utils.js +79 -0
  1940. package/dist/src/ui/components/subagents/utils.js.map +1 -0
  1941. package/dist/src/ui/components/views/ContextUsage.d.ts +23 -0
  1942. package/dist/src/ui/components/views/ContextUsage.js +130 -0
  1943. package/dist/src/ui/components/views/ContextUsage.js.map +1 -0
  1944. package/dist/src/ui/components/views/ContextUsage.test.d.ts +6 -0
  1945. package/dist/src/ui/components/views/ContextUsage.test.js +76 -0
  1946. package/dist/src/ui/components/views/ContextUsage.test.js.map +1 -0
  1947. package/dist/src/ui/components/views/DoctorReport.d.ts +18 -0
  1948. package/dist/src/ui/components/views/DoctorReport.js +45 -0
  1949. package/dist/src/ui/components/views/DoctorReport.js.map +1 -0
  1950. package/dist/src/ui/components/views/ExtensionsList.d.ts +6 -0
  1951. package/dist/src/ui/components/views/ExtensionsList.js +49 -0
  1952. package/dist/src/ui/components/views/ExtensionsList.js.map +1 -0
  1953. package/dist/src/ui/components/views/ExtensionsList.test.d.ts +6 -0
  1954. package/dist/src/ui/components/views/ExtensionsList.test.js +88 -0
  1955. package/dist/src/ui/components/views/ExtensionsList.test.js.map +1 -0
  1956. package/dist/src/ui/components/views/McpStatus.d.ts +27 -0
  1957. package/dist/src/ui/components/views/McpStatus.js +90 -0
  1958. package/dist/src/ui/components/views/McpStatus.js.map +1 -0
  1959. package/dist/src/ui/components/views/McpStatus.test.d.ts +6 -0
  1960. package/dist/src/ui/components/views/McpStatus.test.js +117 -0
  1961. package/dist/src/ui/components/views/McpStatus.test.js.map +1 -0
  1962. package/dist/src/ui/components/views/SkillsList.d.ts +12 -0
  1963. package/dist/src/ui/components/views/SkillsList.js +7 -0
  1964. package/dist/src/ui/components/views/SkillsList.js.map +1 -0
  1965. package/dist/src/ui/components/views/ToolsList.d.ts +14 -0
  1966. package/dist/src/ui/components/views/ToolsList.js +8 -0
  1967. package/dist/src/ui/components/views/ToolsList.js.map +1 -0
  1968. package/dist/src/ui/components/views/ToolsList.test.d.ts +6 -0
  1969. package/dist/src/ui/components/views/ToolsList.test.js +45 -0
  1970. package/dist/src/ui/components/views/ToolsList.test.js.map +1 -0
  1971. package/dist/src/ui/constants.d.ts +18 -0
  1972. package/dist/src/ui/constants.js +23 -0
  1973. package/dist/src/ui/constants.js.map +1 -0
  1974. package/dist/src/ui/contexts/AgentViewContext.d.ts +49 -0
  1975. package/dist/src/ui/contexts/AgentViewContext.js +187 -0
  1976. package/dist/src/ui/contexts/AgentViewContext.js.map +1 -0
  1977. package/dist/src/ui/contexts/AppContext.d.ts +11 -0
  1978. package/dist/src/ui/contexts/AppContext.js +15 -0
  1979. package/dist/src/ui/contexts/AppContext.js.map +1 -0
  1980. package/dist/src/ui/contexts/BackgroundTaskViewContext.d.ts +60 -0
  1981. package/dist/src/ui/contexts/BackgroundTaskViewContext.js +238 -0
  1982. package/dist/src/ui/contexts/BackgroundTaskViewContext.js.map +1 -0
  1983. package/dist/src/ui/contexts/CompactModeContext.d.ts +13 -0
  1984. package/dist/src/ui/contexts/CompactModeContext.js +13 -0
  1985. package/dist/src/ui/contexts/CompactModeContext.js.map +1 -0
  1986. package/dist/src/ui/contexts/ConfigContext.d.ts +9 -0
  1987. package/dist/src/ui/contexts/ConfigContext.js +16 -0
  1988. package/dist/src/ui/contexts/ConfigContext.js.map +1 -0
  1989. package/dist/src/ui/contexts/KeypressContext.d.ts +40 -0
  1990. package/dist/src/ui/contexts/KeypressContext.js +959 -0
  1991. package/dist/src/ui/contexts/KeypressContext.js.map +1 -0
  1992. package/dist/src/ui/contexts/KeypressContext.test.d.ts +6 -0
  1993. package/dist/src/ui/contexts/KeypressContext.test.js +1360 -0
  1994. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -0
  1995. package/dist/src/ui/contexts/OverflowContext.d.ts +19 -0
  1996. package/dist/src/ui/contexts/OverflowContext.js +38 -0
  1997. package/dist/src/ui/contexts/OverflowContext.js.map +1 -0
  1998. package/dist/src/ui/contexts/RenderModeContext.d.ts +14 -0
  1999. package/dist/src/ui/contexts/RenderModeContext.js +15 -0
  2000. package/dist/src/ui/contexts/RenderModeContext.js.map +1 -0
  2001. package/dist/src/ui/contexts/SessionContext.d.ts +47 -0
  2002. package/dist/src/ui/contexts/SessionContext.js +180 -0
  2003. package/dist/src/ui/contexts/SessionContext.js.map +1 -0
  2004. package/dist/src/ui/contexts/SettingsContext.d.ts +9 -0
  2005. package/dist/src/ui/contexts/SettingsContext.js +15 -0
  2006. package/dist/src/ui/contexts/SettingsContext.js.map +1 -0
  2007. package/dist/src/ui/contexts/ShellFocusContext.d.ts +7 -0
  2008. package/dist/src/ui/contexts/ShellFocusContext.js +9 -0
  2009. package/dist/src/ui/contexts/ShellFocusContext.js.map +1 -0
  2010. package/dist/src/ui/contexts/StreamingContext.d.ts +9 -0
  2011. package/dist/src/ui/contexts/StreamingContext.js +15 -0
  2012. package/dist/src/ui/contexts/StreamingContext.js.map +1 -0
  2013. package/dist/src/ui/contexts/TerminalOutputContext.d.ts +12 -0
  2014. package/dist/src/ui/contexts/TerminalOutputContext.js +11 -0
  2015. package/dist/src/ui/contexts/TerminalOutputContext.js.map +1 -0
  2016. package/dist/src/ui/contexts/UIActionsContext.d.ts +91 -0
  2017. package/dist/src/ui/contexts/UIActionsContext.js +22 -0
  2018. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -0
  2019. package/dist/src/ui/contexts/UIStateContext.d.ts +158 -0
  2020. package/dist/src/ui/contexts/UIStateContext.js +20 -0
  2021. package/dist/src/ui/contexts/UIStateContext.js.map +1 -0
  2022. package/dist/src/ui/contexts/VimModeContext.d.ts +31 -0
  2023. package/dist/src/ui/contexts/VimModeContext.js +60 -0
  2024. package/dist/src/ui/contexts/VimModeContext.js.map +1 -0
  2025. package/dist/src/ui/contexts/VimModeContext.test.d.ts +11 -0
  2026. package/dist/src/ui/contexts/VimModeContext.test.js +99 -0
  2027. package/dist/src/ui/contexts/VimModeContext.test.js.map +1 -0
  2028. package/dist/src/ui/daemon/DaemonTuiAdapter.d.ts +101 -0
  2029. package/dist/src/ui/daemon/DaemonTuiAdapter.js +695 -0
  2030. package/dist/src/ui/daemon/DaemonTuiAdapter.js.map +1 -0
  2031. package/dist/src/ui/daemon/DaemonTuiAdapter.test.d.ts +6 -0
  2032. package/dist/src/ui/daemon/DaemonTuiAdapter.test.js +784 -0
  2033. package/dist/src/ui/daemon/DaemonTuiAdapter.test.js.map +1 -0
  2034. package/dist/src/ui/editors/editorSettingsManager.d.ts +19 -0
  2035. package/dist/src/ui/editors/editorSettingsManager.js +48 -0
  2036. package/dist/src/ui/editors/editorSettingsManager.js.map +1 -0
  2037. package/dist/src/ui/hooks/atCommandProcessor.d.ts +33 -0
  2038. package/dist/src/ui/hooks/atCommandProcessor.js +344 -0
  2039. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -0
  2040. package/dist/src/ui/hooks/atCommandProcessor.test.d.ts +6 -0
  2041. package/dist/src/ui/hooks/atCommandProcessor.test.js +871 -0
  2042. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -0
  2043. package/dist/src/ui/hooks/keyToAnsi.d.ts +15 -0
  2044. package/dist/src/ui/hooks/keyToAnsi.js +67 -0
  2045. package/dist/src/ui/hooks/keyToAnsi.js.map +1 -0
  2046. package/dist/src/ui/hooks/shellCommandProcessor.d.ts +18 -0
  2047. package/dist/src/ui/hooks/shellCommandProcessor.js +287 -0
  2048. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -0
  2049. package/dist/src/ui/hooks/shellCommandProcessor.test.d.ts +6 -0
  2050. package/dist/src/ui/hooks/shellCommandProcessor.test.js +509 -0
  2051. package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -0
  2052. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +71 -0
  2053. package/dist/src/ui/hooks/slashCommandProcessor.js +837 -0
  2054. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -0
  2055. package/dist/src/ui/hooks/useAgentStreamingState.d.ts +29 -0
  2056. package/dist/src/ui/hooks/useAgentStreamingState.js +109 -0
  2057. package/dist/src/ui/hooks/useAgentStreamingState.js.map +1 -0
  2058. package/dist/src/ui/hooks/useAgentsManagerDialog.d.ts +11 -0
  2059. package/dist/src/ui/hooks/useAgentsManagerDialog.js +21 -0
  2060. package/dist/src/ui/hooks/useAgentsManagerDialog.js.map +1 -0
  2061. package/dist/src/ui/hooks/useAnimatedScrollbar.d.ts +37 -0
  2062. package/dist/src/ui/hooks/useAnimatedScrollbar.js +44 -0
  2063. package/dist/src/ui/hooks/useAnimatedScrollbar.js.map +1 -0
  2064. package/dist/src/ui/hooks/useAnimatedScrollbar.test.d.ts +6 -0
  2065. package/dist/src/ui/hooks/useAnimatedScrollbar.test.js +74 -0
  2066. package/dist/src/ui/hooks/useAnimatedScrollbar.test.js.map +1 -0
  2067. package/dist/src/ui/hooks/useAnimationFrame.d.ts +25 -0
  2068. package/dist/src/ui/hooks/useAnimationFrame.js +86 -0
  2069. package/dist/src/ui/hooks/useAnimationFrame.js.map +1 -0
  2070. package/dist/src/ui/hooks/useApprovalModeCommand.d.ts +14 -0
  2071. package/dist/src/ui/hooks/useApprovalModeCommand.js +33 -0
  2072. package/dist/src/ui/hooks/useApprovalModeCommand.js.map +1 -0
  2073. package/dist/src/ui/hooks/useArenaCommand.d.ts +13 -0
  2074. package/dist/src/ui/hooks/useArenaCommand.js +21 -0
  2075. package/dist/src/ui/hooks/useArenaCommand.js.map +1 -0
  2076. package/dist/src/ui/hooks/useArenaInProcess.d.ts +14 -0
  2077. package/dist/src/ui/hooks/useArenaInProcess.js +136 -0
  2078. package/dist/src/ui/hooks/useArenaInProcess.js.map +1 -0
  2079. package/dist/src/ui/hooks/useAtCompletion.d.ts +23 -0
  2080. package/dist/src/ui/hooks/useAtCompletion.js +184 -0
  2081. package/dist/src/ui/hooks/useAtCompletion.js.map +1 -0
  2082. package/dist/src/ui/hooks/useAttentionNotifications.d.ts +22 -0
  2083. package/dist/src/ui/hooks/useAttentionNotifications.js +89 -0
  2084. package/dist/src/ui/hooks/useAttentionNotifications.js.map +1 -0
  2085. package/dist/src/ui/hooks/useAttentionNotifications.test.d.ts +6 -0
  2086. package/dist/src/ui/hooks/useAttentionNotifications.test.js +222 -0
  2087. package/dist/src/ui/hooks/useAttentionNotifications.test.js.map +1 -0
  2088. package/dist/src/ui/hooks/useAutoAcceptIndicator.d.ts +32 -0
  2089. package/dist/src/ui/hooks/useAutoAcceptIndicator.js +124 -0
  2090. package/dist/src/ui/hooks/useAutoAcceptIndicator.js.map +1 -0
  2091. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.d.ts +6 -0
  2092. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js +379 -0
  2093. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +1 -0
  2094. package/dist/src/ui/hooks/useAwaySummary.d.ts +35 -0
  2095. package/dist/src/ui/hooks/useAwaySummary.js +141 -0
  2096. package/dist/src/ui/hooks/useAwaySummary.js.map +1 -0
  2097. package/dist/src/ui/hooks/useAwaySummary.test.d.ts +6 -0
  2098. package/dist/src/ui/hooks/useAwaySummary.test.js +103 -0
  2099. package/dist/src/ui/hooks/useAwaySummary.test.js.map +1 -0
  2100. package/dist/src/ui/hooks/useBackgroundTaskView.d.ts +69 -0
  2101. package/dist/src/ui/hooks/useBackgroundTaskView.js +217 -0
  2102. package/dist/src/ui/hooks/useBackgroundTaskView.js.map +1 -0
  2103. package/dist/src/ui/hooks/useBackgroundTaskView.test.d.ts +6 -0
  2104. package/dist/src/ui/hooks/useBackgroundTaskView.test.js +455 -0
  2105. package/dist/src/ui/hooks/useBackgroundTaskView.test.js.map +1 -0
  2106. package/dist/src/ui/hooks/useBatchedScroll.d.ts +14 -0
  2107. package/dist/src/ui/hooks/useBatchedScroll.js +25 -0
  2108. package/dist/src/ui/hooks/useBatchedScroll.js.map +1 -0
  2109. package/dist/src/ui/hooks/useBatchedScroll.test.d.ts +6 -0
  2110. package/dist/src/ui/hooks/useBatchedScroll.test.js +42 -0
  2111. package/dist/src/ui/hooks/useBatchedScroll.test.js.map +1 -0
  2112. package/dist/src/ui/hooks/useBracketedPaste.d.ts +12 -0
  2113. package/dist/src/ui/hooks/useBracketedPaste.js +32 -0
  2114. package/dist/src/ui/hooks/useBracketedPaste.js.map +1 -0
  2115. package/dist/src/ui/hooks/useBranchCommand.d.ts +33 -0
  2116. package/dist/src/ui/hooks/useBranchCommand.js +230 -0
  2117. package/dist/src/ui/hooks/useBranchCommand.js.map +1 -0
  2118. package/dist/src/ui/hooks/useBranchCommand.test.d.ts +6 -0
  2119. package/dist/src/ui/hooks/useBranchCommand.test.js +386 -0
  2120. package/dist/src/ui/hooks/useBranchCommand.test.js.map +1 -0
  2121. package/dist/src/ui/hooks/useCommandCompletion.d.ts +37 -0
  2122. package/dist/src/ui/hooks/useCommandCompletion.js +227 -0
  2123. package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -0
  2124. package/dist/src/ui/hooks/useCommandMigration.d.ts +16 -0
  2125. package/dist/src/ui/hooks/useCommandMigration.js +40 -0
  2126. package/dist/src/ui/hooks/useCommandMigration.js.map +1 -0
  2127. package/dist/src/ui/hooks/useCompletion.d.ts +24 -0
  2128. package/dist/src/ui/hooks/useCompletion.js +88 -0
  2129. package/dist/src/ui/hooks/useCompletion.js.map +1 -0
  2130. package/dist/src/ui/hooks/useConfigInitMessage.d.ts +6 -0
  2131. package/dist/src/ui/hooks/useConfigInitMessage.js +45 -0
  2132. package/dist/src/ui/hooks/useConfigInitMessage.js.map +1 -0
  2133. package/dist/src/ui/hooks/useConfigInitMessage.test.d.ts +6 -0
  2134. package/dist/src/ui/hooks/useConfigInitMessage.test.js +80 -0
  2135. package/dist/src/ui/hooks/useConfigInitMessage.test.js.map +1 -0
  2136. package/dist/src/ui/hooks/useContextualTips.d.ts +19 -0
  2137. package/dist/src/ui/hooks/useContextualTips.js +65 -0
  2138. package/dist/src/ui/hooks/useContextualTips.js.map +1 -0
  2139. package/dist/src/ui/hooks/useDeleteCommand.d.ts +19 -0
  2140. package/dist/src/ui/hooks/useDeleteCommand.js +167 -0
  2141. package/dist/src/ui/hooks/useDeleteCommand.js.map +1 -0
  2142. package/dist/src/ui/hooks/useDeleteCommand.test.d.ts +6 -0
  2143. package/dist/src/ui/hooks/useDeleteCommand.test.js +391 -0
  2144. package/dist/src/ui/hooks/useDeleteCommand.test.js.map +1 -0
  2145. package/dist/src/ui/hooks/useDialogClose.d.ts +48 -0
  2146. package/dist/src/ui/hooks/useDialogClose.js +102 -0
  2147. package/dist/src/ui/hooks/useDialogClose.js.map +1 -0
  2148. package/dist/src/ui/hooks/useDiffData.d.ts +32 -0
  2149. package/dist/src/ui/hooks/useDiffData.js +72 -0
  2150. package/dist/src/ui/hooks/useDiffData.js.map +1 -0
  2151. package/dist/src/ui/hooks/useDoublePress.d.ts +18 -0
  2152. package/dist/src/ui/hooks/useDoublePress.js +47 -0
  2153. package/dist/src/ui/hooks/useDoublePress.js.map +1 -0
  2154. package/dist/src/ui/hooks/useEditorSettings.d.ts +16 -0
  2155. package/dist/src/ui/hooks/useEditorSettings.js +43 -0
  2156. package/dist/src/ui/hooks/useEditorSettings.js.map +1 -0
  2157. package/dist/src/ui/hooks/useEditorSettings.test.d.ts +6 -0
  2158. package/dist/src/ui/hooks/useEditorSettings.test.js +164 -0
  2159. package/dist/src/ui/hooks/useEditorSettings.test.js.map +1 -0
  2160. package/dist/src/ui/hooks/useExportCompletion.d.ts +70 -0
  2161. package/dist/src/ui/hooks/useExportCompletion.js +208 -0
  2162. package/dist/src/ui/hooks/useExportCompletion.js.map +1 -0
  2163. package/dist/src/ui/hooks/useExportCompletion.test.d.ts +6 -0
  2164. package/dist/src/ui/hooks/useExportCompletion.test.js +190 -0
  2165. package/dist/src/ui/hooks/useExportCompletion.test.js.map +1 -0
  2166. package/dist/src/ui/hooks/useExtensionUpdates.d.ts +71 -0
  2167. package/dist/src/ui/hooks/useExtensionUpdates.js +229 -0
  2168. package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -0
  2169. package/dist/src/ui/hooks/useExtensionUpdates.test.d.ts +6 -0
  2170. package/dist/src/ui/hooks/useExtensionUpdates.test.js +455 -0
  2171. package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -0
  2172. package/dist/src/ui/hooks/useExtensionsManagerDialog.d.ts +12 -0
  2173. package/dist/src/ui/hooks/useExtensionsManagerDialog.js +21 -0
  2174. package/dist/src/ui/hooks/useExtensionsManagerDialog.js.map +1 -0
  2175. package/dist/src/ui/hooks/useFeedbackDialog.d.ts +18 -0
  2176. package/dist/src/ui/hooks/useFeedbackDialog.js +130 -0
  2177. package/dist/src/ui/hooks/useFeedbackDialog.js.map +1 -0
  2178. package/dist/src/ui/hooks/useFocus.d.ts +10 -0
  2179. package/dist/src/ui/hooks/useFocus.js +51 -0
  2180. package/dist/src/ui/hooks/useFocus.js.map +1 -0
  2181. package/dist/src/ui/hooks/useFolderTrust.d.ts +13 -0
  2182. package/dist/src/ui/hooks/useFolderTrust.js +60 -0
  2183. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -0
  2184. package/dist/src/ui/hooks/useFollowupSuggestions.d.ts +53 -0
  2185. package/dist/src/ui/hooks/useFollowupSuggestions.js +89 -0
  2186. package/dist/src/ui/hooks/useFollowupSuggestions.js.map +1 -0
  2187. package/dist/src/ui/hooks/useGeminiStream.d.ts +76 -0
  2188. package/dist/src/ui/hooks/useGeminiStream.js +1899 -0
  2189. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -0
  2190. package/dist/src/ui/hooks/useGitBranchName.d.ts +6 -0
  2191. package/dist/src/ui/hooks/useGitBranchName.js +61 -0
  2192. package/dist/src/ui/hooks/useGitBranchName.js.map +1 -0
  2193. package/dist/src/ui/hooks/useGitBranchName.test.d.ts +6 -0
  2194. package/dist/src/ui/hooks/useGitBranchName.test.js +192 -0
  2195. package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -0
  2196. package/dist/src/ui/hooks/useHistoryManager.d.ts +24 -0
  2197. package/dist/src/ui/hooks/useHistoryManager.js +183 -0
  2198. package/dist/src/ui/hooks/useHistoryManager.js.map +1 -0
  2199. package/dist/src/ui/hooks/useHistoryManager.test.d.ts +6 -0
  2200. package/dist/src/ui/hooks/useHistoryManager.test.js +495 -0
  2201. package/dist/src/ui/hooks/useHistoryManager.test.js.map +1 -0
  2202. package/dist/src/ui/hooks/useHooksDialog.d.ts +11 -0
  2203. package/dist/src/ui/hooks/useHooksDialog.js +21 -0
  2204. package/dist/src/ui/hooks/useHooksDialog.js.map +1 -0
  2205. package/dist/src/ui/hooks/useIdeTrustListener.d.ts +16 -0
  2206. package/dist/src/ui/hooks/useIdeTrustListener.js +65 -0
  2207. package/dist/src/ui/hooks/useIdeTrustListener.js.map +1 -0
  2208. package/dist/src/ui/hooks/useIdeTrustListener.test.d.ts +6 -0
  2209. package/dist/src/ui/hooks/useIdeTrustListener.test.js +183 -0
  2210. package/dist/src/ui/hooks/useIdeTrustListener.test.js.map +1 -0
  2211. package/dist/src/ui/hooks/useInitializationAuthError.d.ts +22 -0
  2212. package/dist/src/ui/hooks/useInitializationAuthError.js +40 -0
  2213. package/dist/src/ui/hooks/useInitializationAuthError.js.map +1 -0
  2214. package/dist/src/ui/hooks/useInputHistory.d.ts +20 -0
  2215. package/dist/src/ui/hooks/useInputHistory.js +85 -0
  2216. package/dist/src/ui/hooks/useInputHistory.js.map +1 -0
  2217. package/dist/src/ui/hooks/useInputHistory.test.d.ts +6 -0
  2218. package/dist/src/ui/hooks/useInputHistory.test.js +207 -0
  2219. package/dist/src/ui/hooks/useInputHistory.test.js.map +1 -0
  2220. package/dist/src/ui/hooks/useInputHistoryStore.d.ts +19 -0
  2221. package/dist/src/ui/hooks/useInputHistoryStore.js +83 -0
  2222. package/dist/src/ui/hooks/useInputHistoryStore.js.map +1 -0
  2223. package/dist/src/ui/hooks/useInputHistoryStore.test.d.ts +6 -0
  2224. package/dist/src/ui/hooks/useInputHistoryStore.test.js +231 -0
  2225. package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +1 -0
  2226. package/dist/src/ui/hooks/useKeypress.d.ts +17 -0
  2227. package/dist/src/ui/hooks/useKeypress.js +27 -0
  2228. package/dist/src/ui/hooks/useKeypress.js.map +1 -0
  2229. package/dist/src/ui/hooks/useKittyKeyboardProtocol.d.ts +15 -0
  2230. package/dist/src/ui/hooks/useKittyKeyboardProtocol.js +20 -0
  2231. package/dist/src/ui/hooks/useKittyKeyboardProtocol.js.map +1 -0
  2232. package/dist/src/ui/hooks/useLaunchEditor.d.ts +5 -0
  2233. package/dist/src/ui/hooks/useLaunchEditor.js +75 -0
  2234. package/dist/src/ui/hooks/useLaunchEditor.js.map +1 -0
  2235. package/dist/src/ui/hooks/useLoadingIndicator.d.ts +11 -0
  2236. package/dist/src/ui/hooks/useLoadingIndicator.js +50 -0
  2237. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -0
  2238. package/dist/src/ui/hooks/useLoadingIndicator.test.d.ts +6 -0
  2239. package/dist/src/ui/hooks/useLoadingIndicator.test.js +172 -0
  2240. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -0
  2241. package/dist/src/ui/hooks/useLogger.d.ts +11 -0
  2242. package/dist/src/ui/hooks/useLogger.js +32 -0
  2243. package/dist/src/ui/hooks/useLogger.js.map +1 -0
  2244. package/dist/src/ui/hooks/useMCPHealth.d.ts +16 -0
  2245. package/dist/src/ui/hooks/useMCPHealth.js +56 -0
  2246. package/dist/src/ui/hooks/useMCPHealth.js.map +1 -0
  2247. package/dist/src/ui/hooks/useMcpDialog.d.ts +11 -0
  2248. package/dist/src/ui/hooks/useMcpDialog.js +21 -0
  2249. package/dist/src/ui/hooks/useMcpDialog.js.map +1 -0
  2250. package/dist/src/ui/hooks/useMemoryDialog.d.ts +11 -0
  2251. package/dist/src/ui/hooks/useMemoryDialog.js +21 -0
  2252. package/dist/src/ui/hooks/useMemoryDialog.js.map +1 -0
  2253. package/dist/src/ui/hooks/useMemoryMonitor.d.ts +17 -0
  2254. package/dist/src/ui/hooks/useMemoryMonitor.js +83 -0
  2255. package/dist/src/ui/hooks/useMemoryMonitor.js.map +1 -0
  2256. package/dist/src/ui/hooks/useMemoryMonitor.test.d.ts +6 -0
  2257. package/dist/src/ui/hooks/useMemoryMonitor.test.js +153 -0
  2258. package/dist/src/ui/hooks/useMemoryMonitor.test.js.map +1 -0
  2259. package/dist/src/ui/hooks/useMessageQueue.d.ts +18 -0
  2260. package/dist/src/ui/hooks/useMessageQueue.js +67 -0
  2261. package/dist/src/ui/hooks/useMessageQueue.js.map +1 -0
  2262. package/dist/src/ui/hooks/useMessageQueue.test.d.ts +6 -0
  2263. package/dist/src/ui/hooks/useMessageQueue.test.js +219 -0
  2264. package/dist/src/ui/hooks/useMessageQueue.test.js.map +1 -0
  2265. package/dist/src/ui/hooks/useModelCommand.d.ts +15 -0
  2266. package/dist/src/ui/hooks/useModelCommand.js +25 -0
  2267. package/dist/src/ui/hooks/useModelCommand.js.map +1 -0
  2268. package/dist/src/ui/hooks/useModelCommand.test.d.ts +6 -0
  2269. package/dist/src/ui/hooks/useModelCommand.test.js +35 -0
  2270. package/dist/src/ui/hooks/useModelCommand.test.js.map +1 -0
  2271. package/dist/src/ui/hooks/useMouseEvents.d.ts +44 -0
  2272. package/dist/src/ui/hooks/useMouseEvents.js +85 -0
  2273. package/dist/src/ui/hooks/useMouseEvents.js.map +1 -0
  2274. package/dist/src/ui/hooks/usePhraseCycler.d.ts +14 -0
  2275. package/dist/src/ui/hooks/usePhraseCycler.js +70 -0
  2276. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -0
  2277. package/dist/src/ui/hooks/usePreferredEditor.d.ts +7 -0
  2278. package/dist/src/ui/hooks/usePreferredEditor.js +25 -0
  2279. package/dist/src/ui/hooks/usePreferredEditor.js.map +1 -0
  2280. package/dist/src/ui/hooks/useProviderUpdates.d.ts +33 -0
  2281. package/dist/src/ui/hooks/useProviderUpdates.js +215 -0
  2282. package/dist/src/ui/hooks/useProviderUpdates.js.map +1 -0
  2283. package/dist/src/ui/hooks/useProviderUpdates.test.d.ts +6 -0
  2284. package/dist/src/ui/hooks/useProviderUpdates.test.js +293 -0
  2285. package/dist/src/ui/hooks/useProviderUpdates.test.js.map +1 -0
  2286. package/dist/src/ui/hooks/useQwenAuth.d.ts +20 -0
  2287. package/dist/src/ui/hooks/useQwenAuth.js +74 -0
  2288. package/dist/src/ui/hooks/useQwenAuth.js.map +1 -0
  2289. package/dist/src/ui/hooks/useQwenAuth.test.d.ts +6 -0
  2290. package/dist/src/ui/hooks/useQwenAuth.test.js +266 -0
  2291. package/dist/src/ui/hooks/useQwenAuth.test.js.map +1 -0
  2292. package/dist/src/ui/hooks/useReactToolScheduler.d.ts +33 -0
  2293. package/dist/src/ui/hooks/useReactToolScheduler.js +236 -0
  2294. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -0
  2295. package/dist/src/ui/hooks/useRefreshMemoryCommand.d.ts +6 -0
  2296. package/dist/src/ui/hooks/useRefreshMemoryCommand.js +7 -0
  2297. package/dist/src/ui/hooks/useRefreshMemoryCommand.js.map +1 -0
  2298. package/dist/src/ui/hooks/useResumeCommand.d.ts +31 -0
  2299. package/dist/src/ui/hooks/useResumeCommand.js +114 -0
  2300. package/dist/src/ui/hooks/useResumeCommand.js.map +1 -0
  2301. package/dist/src/ui/hooks/useResumeCommand.test.d.ts +6 -0
  2302. package/dist/src/ui/hooks/useResumeCommand.test.js +349 -0
  2303. package/dist/src/ui/hooks/useResumeCommand.test.js.map +1 -0
  2304. package/dist/src/ui/hooks/useReverseSearchCompletion.d.ts +19 -0
  2305. package/dist/src/ui/hooks/useReverseSearchCompletion.js +103 -0
  2306. package/dist/src/ui/hooks/useReverseSearchCompletion.js.map +1 -0
  2307. package/dist/src/ui/hooks/useReverseSearchCompletion.test.d.ts +6 -0
  2308. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +163 -0
  2309. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +1 -0
  2310. package/dist/src/ui/hooks/useSelectionList.d.ts +41 -0
  2311. package/dist/src/ui/hooks/useSelectionList.js +276 -0
  2312. package/dist/src/ui/hooks/useSelectionList.js.map +1 -0
  2313. package/dist/src/ui/hooks/useSelectionList.test.d.ts +6 -0
  2314. package/dist/src/ui/hooks/useSelectionList.test.js +782 -0
  2315. package/dist/src/ui/hooks/useSelectionList.test.js.map +1 -0
  2316. package/dist/src/ui/hooks/useSessionPicker.d.ts +95 -0
  2317. package/dist/src/ui/hooks/useSessionPicker.js +383 -0
  2318. package/dist/src/ui/hooks/useSessionPicker.js.map +1 -0
  2319. package/dist/src/ui/hooks/useSessionPicker.test.d.ts +6 -0
  2320. package/dist/src/ui/hooks/useSessionPicker.test.js +94 -0
  2321. package/dist/src/ui/hooks/useSessionPicker.test.js.map +1 -0
  2322. package/dist/src/ui/hooks/useSessionSearchInput.d.ts +69 -0
  2323. package/dist/src/ui/hooks/useSessionSearchInput.js +124 -0
  2324. package/dist/src/ui/hooks/useSessionSearchInput.js.map +1 -0
  2325. package/dist/src/ui/hooks/useSessionSearchInput.test.d.ts +6 -0
  2326. package/dist/src/ui/hooks/useSessionSearchInput.test.js +342 -0
  2327. package/dist/src/ui/hooks/useSessionSearchInput.test.js.map +1 -0
  2328. package/dist/src/ui/hooks/useSettingsCommand.d.ts +10 -0
  2329. package/dist/src/ui/hooks/useSettingsCommand.js +21 -0
  2330. package/dist/src/ui/hooks/useSettingsCommand.js.map +1 -0
  2331. package/dist/src/ui/hooks/useShellHistory.d.ts +14 -0
  2332. package/dist/src/ui/hooks/useShellHistory.js +112 -0
  2333. package/dist/src/ui/hooks/useShellHistory.js.map +1 -0
  2334. package/dist/src/ui/hooks/useShellHistory.test.d.ts +6 -0
  2335. package/dist/src/ui/hooks/useShellHistory.test.js +193 -0
  2336. package/dist/src/ui/hooks/useShellHistory.test.js.map +1 -0
  2337. package/dist/src/ui/hooks/useShowMemoryCommand.d.ts +9 -0
  2338. package/dist/src/ui/hooks/useShowMemoryCommand.js +55 -0
  2339. package/dist/src/ui/hooks/useShowMemoryCommand.js.map +1 -0
  2340. package/dist/src/ui/hooks/useSkillsManagerDialog.d.ts +11 -0
  2341. package/dist/src/ui/hooks/useSkillsManagerDialog.js +21 -0
  2342. package/dist/src/ui/hooks/useSkillsManagerDialog.js.map +1 -0
  2343. package/dist/src/ui/hooks/useSlashCompletion.d.ts +27 -0
  2344. package/dist/src/ui/hooks/useSlashCompletion.integration.test.d.ts +6 -0
  2345. package/dist/src/ui/hooks/useSlashCompletion.integration.test.js +84 -0
  2346. package/dist/src/ui/hooks/useSlashCompletion.integration.test.js.map +1 -0
  2347. package/dist/src/ui/hooks/useSlashCompletion.js +490 -0
  2348. package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -0
  2349. package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +9 -0
  2350. package/dist/src/ui/hooks/useSlashCompletion.test.js +805 -0
  2351. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -0
  2352. package/dist/src/ui/hooks/useStateAndRef.d.ts +7 -0
  2353. package/dist/src/ui/hooks/useStateAndRef.js +26 -0
  2354. package/dist/src/ui/hooks/useStateAndRef.js.map +1 -0
  2355. package/dist/src/ui/hooks/useStatsDialog.d.ts +11 -0
  2356. package/dist/src/ui/hooks/useStatsDialog.js +13 -0
  2357. package/dist/src/ui/hooks/useStatsDialog.js.map +1 -0
  2358. package/dist/src/ui/hooks/useStatusLine.d.ts +84 -0
  2359. package/dist/src/ui/hooks/useStatusLine.js +528 -0
  2360. package/dist/src/ui/hooks/useStatusLine.js.map +1 -0
  2361. package/dist/src/ui/hooks/useStatusLine.test.d.ts +6 -0
  2362. package/dist/src/ui/hooks/useStatusLine.test.js +1039 -0
  2363. package/dist/src/ui/hooks/useStatusLine.test.js.map +1 -0
  2364. package/dist/src/ui/hooks/useSubagentCreateDialog.d.ts +10 -0
  2365. package/dist/src/ui/hooks/useSubagentCreateDialog.js +21 -0
  2366. package/dist/src/ui/hooks/useSubagentCreateDialog.js.map +1 -0
  2367. package/dist/src/ui/hooks/useTerminalNotification.d.ts +32 -0
  2368. package/dist/src/ui/hooks/useTerminalNotification.js +45 -0
  2369. package/dist/src/ui/hooks/useTerminalNotification.js.map +1 -0
  2370. package/dist/src/ui/hooks/useTerminalNotification.test.d.ts +6 -0
  2371. package/dist/src/ui/hooks/useTerminalNotification.test.js +69 -0
  2372. package/dist/src/ui/hooks/useTerminalNotification.test.js.map +1 -0
  2373. package/dist/src/ui/hooks/useTerminalProgress.d.ts +12 -0
  2374. package/dist/src/ui/hooks/useTerminalProgress.js +76 -0
  2375. package/dist/src/ui/hooks/useTerminalProgress.js.map +1 -0
  2376. package/dist/src/ui/hooks/useTerminalSize.d.ts +13 -0
  2377. package/dist/src/ui/hooks/useTerminalSize.js +30 -0
  2378. package/dist/src/ui/hooks/useTerminalSize.js.map +1 -0
  2379. package/dist/src/ui/hooks/useThemeCommand.d.ts +15 -0
  2380. package/dist/src/ui/hooks/useThemeCommand.js +85 -0
  2381. package/dist/src/ui/hooks/useThemeCommand.js.map +1 -0
  2382. package/dist/src/ui/hooks/useThemeCommand.test.d.ts +6 -0
  2383. package/dist/src/ui/hooks/useThemeCommand.test.js +42 -0
  2384. package/dist/src/ui/hooks/useThemeCommand.test.js.map +1 -0
  2385. package/dist/src/ui/hooks/useTimer.d.ts +12 -0
  2386. package/dist/src/ui/hooks/useTimer.js +58 -0
  2387. package/dist/src/ui/hooks/useTimer.js.map +1 -0
  2388. package/dist/src/ui/hooks/useTimer.test.d.ts +6 -0
  2389. package/dist/src/ui/hooks/useTimer.test.js +90 -0
  2390. package/dist/src/ui/hooks/useTimer.test.js.map +1 -0
  2391. package/dist/src/ui/hooks/useTomlMigration.d.ts +1 -0
  2392. package/dist/src/ui/hooks/useTomlMigration.js +2 -0
  2393. package/dist/src/ui/hooks/useTomlMigration.js.map +1 -0
  2394. package/dist/src/ui/hooks/useToolScheduler.test.d.ts +6 -0
  2395. package/dist/src/ui/hooks/useToolScheduler.test.js +624 -0
  2396. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -0
  2397. package/dist/src/ui/hooks/useTrustModify.d.ts +17 -0
  2398. package/dist/src/ui/hooks/useTrustModify.js +78 -0
  2399. package/dist/src/ui/hooks/useTrustModify.js.map +1 -0
  2400. package/dist/src/ui/hooks/useTrustModify.test.d.ts +6 -0
  2401. package/dist/src/ui/hooks/useTrustModify.test.js +182 -0
  2402. package/dist/src/ui/hooks/useTrustModify.test.js.map +1 -0
  2403. package/dist/src/ui/hooks/useTurnDiffs.d.ts +34 -0
  2404. package/dist/src/ui/hooks/useTurnDiffs.js +130 -0
  2405. package/dist/src/ui/hooks/useTurnDiffs.js.map +1 -0
  2406. package/dist/src/ui/hooks/useTurnDiffs.test.d.ts +6 -0
  2407. package/dist/src/ui/hooks/useTurnDiffs.test.js +164 -0
  2408. package/dist/src/ui/hooks/useTurnDiffs.test.js.map +1 -0
  2409. package/dist/src/ui/hooks/useWelcomeBack.d.ts +23 -0
  2410. package/dist/src/ui/hooks/useWelcomeBack.js +99 -0
  2411. package/dist/src/ui/hooks/useWelcomeBack.js.map +1 -0
  2412. package/dist/src/ui/hooks/useWelcomeBack.test.d.ts +6 -0
  2413. package/dist/src/ui/hooks/useWelcomeBack.test.js +94 -0
  2414. package/dist/src/ui/hooks/useWelcomeBack.test.js.map +1 -0
  2415. package/dist/src/ui/hooks/useWorktreeSession.d.ts +26 -0
  2416. package/dist/src/ui/hooks/useWorktreeSession.js +92 -0
  2417. package/dist/src/ui/hooks/useWorktreeSession.js.map +1 -0
  2418. package/dist/src/ui/hooks/useWorktreeSession.test.d.ts +6 -0
  2419. package/dist/src/ui/hooks/useWorktreeSession.test.js +84 -0
  2420. package/dist/src/ui/hooks/useWorktreeSession.test.js.map +1 -0
  2421. package/dist/src/ui/hooks/vim.d.ts +13 -0
  2422. package/dist/src/ui/hooks/vim.js +1637 -0
  2423. package/dist/src/ui/hooks/vim.js.map +1 -0
  2424. package/dist/src/ui/hooks/vim.test.d.ts +6 -0
  2425. package/dist/src/ui/hooks/vim.test.js +1975 -0
  2426. package/dist/src/ui/hooks/vim.test.js.map +1 -0
  2427. package/dist/src/ui/keyMatchers.d.ts +27 -0
  2428. package/dist/src/ui/keyMatchers.js +71 -0
  2429. package/dist/src/ui/keyMatchers.js.map +1 -0
  2430. package/dist/src/ui/keyMatchers.test.d.ts +6 -0
  2431. package/dist/src/ui/keyMatchers.test.js +421 -0
  2432. package/dist/src/ui/keyMatchers.test.js.map +1 -0
  2433. package/dist/src/ui/layouts/DefaultAppLayout.d.ts +7 -0
  2434. package/dist/src/ui/layouts/DefaultAppLayout.js +49 -0
  2435. package/dist/src/ui/layouts/DefaultAppLayout.js.map +1 -0
  2436. package/dist/src/ui/layouts/DefaultAppLayout.test.d.ts +6 -0
  2437. package/dist/src/ui/layouts/DefaultAppLayout.test.js +185 -0
  2438. package/dist/src/ui/layouts/DefaultAppLayout.test.js.map +1 -0
  2439. package/dist/src/ui/layouts/ScreenReaderAppLayout.d.ts +7 -0
  2440. package/dist/src/ui/layouts/ScreenReaderAppLayout.js +27 -0
  2441. package/dist/src/ui/layouts/ScreenReaderAppLayout.js.map +1 -0
  2442. package/dist/src/ui/layouts/ScreenReaderAppLayout.test.d.ts +6 -0
  2443. package/dist/src/ui/layouts/ScreenReaderAppLayout.test.js +135 -0
  2444. package/dist/src/ui/layouts/ScreenReaderAppLayout.test.js.map +1 -0
  2445. package/dist/src/ui/models/availableModels.d.ts +30 -0
  2446. package/dist/src/ui/models/availableModels.js +103 -0
  2447. package/dist/src/ui/models/availableModels.js.map +1 -0
  2448. package/dist/src/ui/models/availableModels.test.d.ts +6 -0
  2449. package/dist/src/ui/models/availableModels.test.js +142 -0
  2450. package/dist/src/ui/models/availableModels.test.js.map +1 -0
  2451. package/dist/src/ui/noninteractive/nonInteractiveUi.d.ts +12 -0
  2452. package/dist/src/ui/noninteractive/nonInteractiveUi.js +33 -0
  2453. package/dist/src/ui/noninteractive/nonInteractiveUi.js.map +1 -0
  2454. package/dist/src/ui/semantic-colors.d.ts +7 -0
  2455. package/dist/src/ui/semantic-colors.js +24 -0
  2456. package/dist/src/ui/semantic-colors.js.map +1 -0
  2457. package/dist/src/ui/state/extensions.d.ts +43 -0
  2458. package/dist/src/ui/state/extensions.js +63 -0
  2459. package/dist/src/ui/state/extensions.js.map +1 -0
  2460. package/dist/src/ui/statusLinePresets.d.ts +79 -0
  2461. package/dist/src/ui/statusLinePresets.js +310 -0
  2462. package/dist/src/ui/statusLinePresets.js.map +1 -0
  2463. package/dist/src/ui/statusLinePresets.test.d.ts +6 -0
  2464. package/dist/src/ui/statusLinePresets.test.js +221 -0
  2465. package/dist/src/ui/statusLinePresets.test.js.map +1 -0
  2466. package/dist/src/ui/textConstants.d.ts +9 -0
  2467. package/dist/src/ui/textConstants.js +10 -0
  2468. package/dist/src/ui/textConstants.js.map +1 -0
  2469. package/dist/src/ui/themes/ansi-light.d.ts +7 -0
  2470. package/dist/src/ui/themes/ansi-light.js +144 -0
  2471. package/dist/src/ui/themes/ansi-light.js.map +1 -0
  2472. package/dist/src/ui/themes/ansi.d.ts +7 -0
  2473. package/dist/src/ui/themes/ansi.js +154 -0
  2474. package/dist/src/ui/themes/ansi.js.map +1 -0
  2475. package/dist/src/ui/themes/atom-one-dark.d.ts +7 -0
  2476. package/dist/src/ui/themes/atom-one-dark.js +140 -0
  2477. package/dist/src/ui/themes/atom-one-dark.js.map +1 -0
  2478. package/dist/src/ui/themes/ayu-light.d.ts +7 -0
  2479. package/dist/src/ui/themes/ayu-light.js +132 -0
  2480. package/dist/src/ui/themes/ayu-light.js.map +1 -0
  2481. package/dist/src/ui/themes/ayu.d.ts +7 -0
  2482. package/dist/src/ui/themes/ayu.js +106 -0
  2483. package/dist/src/ui/themes/ayu.js.map +1 -0
  2484. package/dist/src/ui/themes/color-utils.d.ts +21 -0
  2485. package/dist/src/ui/themes/color-utils.js +223 -0
  2486. package/dist/src/ui/themes/color-utils.js.map +1 -0
  2487. package/dist/src/ui/themes/color-utils.test.d.ts +6 -0
  2488. package/dist/src/ui/themes/color-utils.test.js +197 -0
  2489. package/dist/src/ui/themes/color-utils.test.js.map +1 -0
  2490. package/dist/src/ui/themes/default-light.d.ts +7 -0
  2491. package/dist/src/ui/themes/default-light.js +100 -0
  2492. package/dist/src/ui/themes/default-light.js.map +1 -0
  2493. package/dist/src/ui/themes/default.d.ts +7 -0
  2494. package/dist/src/ui/themes/default.js +143 -0
  2495. package/dist/src/ui/themes/default.js.map +1 -0
  2496. package/dist/src/ui/themes/detect-terminal-theme.d.ts +75 -0
  2497. package/dist/src/ui/themes/detect-terminal-theme.js +228 -0
  2498. package/dist/src/ui/themes/detect-terminal-theme.js.map +1 -0
  2499. package/dist/src/ui/themes/detect-terminal-theme.test.d.ts +6 -0
  2500. package/dist/src/ui/themes/detect-terminal-theme.test.js +269 -0
  2501. package/dist/src/ui/themes/detect-terminal-theme.test.js.map +1 -0
  2502. package/dist/src/ui/themes/dracula.d.ts +7 -0
  2503. package/dist/src/ui/themes/dracula.js +117 -0
  2504. package/dist/src/ui/themes/dracula.js.map +1 -0
  2505. package/dist/src/ui/themes/github-dark.d.ts +7 -0
  2506. package/dist/src/ui/themes/github-dark.js +140 -0
  2507. package/dist/src/ui/themes/github-dark.js.map +1 -0
  2508. package/dist/src/ui/themes/github-light.d.ts +7 -0
  2509. package/dist/src/ui/themes/github-light.js +142 -0
  2510. package/dist/src/ui/themes/github-light.js.map +1 -0
  2511. package/dist/src/ui/themes/googlecode.d.ts +7 -0
  2512. package/dist/src/ui/themes/googlecode.js +139 -0
  2513. package/dist/src/ui/themes/googlecode.js.map +1 -0
  2514. package/dist/src/ui/themes/no-color.d.ts +7 -0
  2515. package/dist/src/ui/themes/no-color.js +120 -0
  2516. package/dist/src/ui/themes/no-color.js.map +1 -0
  2517. package/dist/src/ui/themes/qwen-dark.d.ts +7 -0
  2518. package/dist/src/ui/themes/qwen-dark.js +107 -0
  2519. package/dist/src/ui/themes/qwen-dark.js.map +1 -0
  2520. package/dist/src/ui/themes/qwen-light.d.ts +7 -0
  2521. package/dist/src/ui/themes/qwen-light.js +133 -0
  2522. package/dist/src/ui/themes/qwen-light.js.map +1 -0
  2523. package/dist/src/ui/themes/semantic-tokens.d.ts +40 -0
  2524. package/dist/src/ui/themes/semantic-tokens.js +103 -0
  2525. package/dist/src/ui/themes/semantic-tokens.js.map +1 -0
  2526. package/dist/src/ui/themes/shades-of-purple.d.ts +11 -0
  2527. package/dist/src/ui/themes/shades-of-purple.js +306 -0
  2528. package/dist/src/ui/themes/shades-of-purple.js.map +1 -0
  2529. package/dist/src/ui/themes/theme-manager.d.ts +91 -0
  2530. package/dist/src/ui/themes/theme-manager.js +311 -0
  2531. package/dist/src/ui/themes/theme-manager.js.map +1 -0
  2532. package/dist/src/ui/themes/theme-manager.test.d.ts +6 -0
  2533. package/dist/src/ui/themes/theme-manager.test.js +188 -0
  2534. package/dist/src/ui/themes/theme-manager.test.js.map +1 -0
  2535. package/dist/src/ui/themes/theme.d.ts +137 -0
  2536. package/dist/src/ui/themes/theme.js +393 -0
  2537. package/dist/src/ui/themes/theme.js.map +1 -0
  2538. package/dist/src/ui/themes/xcode.d.ts +7 -0
  2539. package/dist/src/ui/themes/xcode.js +147 -0
  2540. package/dist/src/ui/themes/xcode.js.map +1 -0
  2541. package/dist/src/ui/types.d.ts +620 -0
  2542. package/dist/src/ui/types.js +77 -0
  2543. package/dist/src/ui/types.js.map +1 -0
  2544. package/dist/src/ui/utils/CodeColorizer.d.ts +18 -0
  2545. package/dist/src/ui/utils/CodeColorizer.js +155 -0
  2546. package/dist/src/ui/utils/CodeColorizer.js.map +1 -0
  2547. package/dist/src/ui/utils/InlineMarkdownRenderer.d.ts +18 -0
  2548. package/dist/src/ui/utils/InlineMarkdownRenderer.js +173 -0
  2549. package/dist/src/ui/utils/InlineMarkdownRenderer.js.map +1 -0
  2550. package/dist/src/ui/utils/InlineMarkdownRenderer.test.d.ts +6 -0
  2551. package/dist/src/ui/utils/InlineMarkdownRenderer.test.js +303 -0
  2552. package/dist/src/ui/utils/InlineMarkdownRenderer.test.js.map +1 -0
  2553. package/dist/src/ui/utils/MarkdownDisplay.d.ts +25 -0
  2554. package/dist/src/ui/utils/MarkdownDisplay.js +420 -0
  2555. package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -0
  2556. package/dist/src/ui/utils/MarkdownDisplay.test.d.ts +6 -0
  2557. package/dist/src/ui/utils/MarkdownDisplay.test.js +702 -0
  2558. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -0
  2559. package/dist/src/ui/utils/MermaidDiagram.d.ts +15 -0
  2560. package/dist/src/ui/utils/MermaidDiagram.js +88 -0
  2561. package/dist/src/ui/utils/MermaidDiagram.js.map +1 -0
  2562. package/dist/src/ui/utils/MermaidDiagram.test.d.ts +6 -0
  2563. package/dist/src/ui/utils/MermaidDiagram.test.js +90 -0
  2564. package/dist/src/ui/utils/MermaidDiagram.test.js.map +1 -0
  2565. package/dist/src/ui/utils/TableRenderer.d.ts +30 -0
  2566. package/dist/src/ui/utils/TableRenderer.js +563 -0
  2567. package/dist/src/ui/utils/TableRenderer.js.map +1 -0
  2568. package/dist/src/ui/utils/TableRenderer.test.d.ts +6 -0
  2569. package/dist/src/ui/utils/TableRenderer.test.js +568 -0
  2570. package/dist/src/ui/utils/TableRenderer.test.js.map +1 -0
  2571. package/dist/src/ui/utils/approvalModeDisplay.d.ts +8 -0
  2572. package/dist/src/ui/utils/approvalModeDisplay.js +34 -0
  2573. package/dist/src/ui/utils/approvalModeDisplay.js.map +1 -0
  2574. package/dist/src/ui/utils/approvalModeDisplay.test.d.ts +6 -0
  2575. package/dist/src/ui/utils/approvalModeDisplay.test.js +35 -0
  2576. package/dist/src/ui/utils/approvalModeDisplay.test.js.map +1 -0
  2577. package/dist/src/ui/utils/asciiCharts.d.ts +44 -0
  2578. package/dist/src/ui/utils/asciiCharts.js +307 -0
  2579. package/dist/src/ui/utils/asciiCharts.js.map +1 -0
  2580. package/dist/src/ui/utils/asciiCharts.test.d.ts +6 -0
  2581. package/dist/src/ui/utils/asciiCharts.test.js +208 -0
  2582. package/dist/src/ui/utils/asciiCharts.test.js.map +1 -0
  2583. package/dist/src/ui/utils/backgroundWorkUtils.d.ts +8 -0
  2584. package/dist/src/ui/utils/backgroundWorkUtils.js +16 -0
  2585. package/dist/src/ui/utils/backgroundWorkUtils.js.map +1 -0
  2586. package/dist/src/ui/utils/backgroundWorkUtils.test.d.ts +6 -0
  2587. package/dist/src/ui/utils/backgroundWorkUtils.test.js +85 -0
  2588. package/dist/src/ui/utils/backgroundWorkUtils.test.js.map +1 -0
  2589. package/dist/src/ui/utils/clipboardUtils.d.ts +28 -0
  2590. package/dist/src/ui/utils/clipboardUtils.js +522 -0
  2591. package/dist/src/ui/utils/clipboardUtils.js.map +1 -0
  2592. package/dist/src/ui/utils/clipboardUtils.test.d.ts +6 -0
  2593. package/dist/src/ui/utils/clipboardUtils.test.js +465 -0
  2594. package/dist/src/ui/utils/clipboardUtils.test.js.map +1 -0
  2595. package/dist/src/ui/utils/commandUtils.d.ts +112 -0
  2596. package/dist/src/ui/utils/commandUtils.js +285 -0
  2597. package/dist/src/ui/utils/commandUtils.js.map +1 -0
  2598. package/dist/src/ui/utils/commandUtils.test.d.ts +6 -0
  2599. package/dist/src/ui/utils/commandUtils.test.js +560 -0
  2600. package/dist/src/ui/utils/commandUtils.test.js.map +1 -0
  2601. package/dist/src/ui/utils/computeStats.d.ts +10 -0
  2602. package/dist/src/ui/utils/computeStats.js +57 -0
  2603. package/dist/src/ui/utils/computeStats.js.map +1 -0
  2604. package/dist/src/ui/utils/customBanner.d.ts +35 -0
  2605. package/dist/src/ui/utils/customBanner.js +361 -0
  2606. package/dist/src/ui/utils/customBanner.js.map +1 -0
  2607. package/dist/src/ui/utils/customBanner.test.d.ts +6 -0
  2608. package/dist/src/ui/utils/customBanner.test.js +439 -0
  2609. package/dist/src/ui/utils/customBanner.test.js.map +1 -0
  2610. package/dist/src/ui/utils/displayUtils.d.ts +25 -0
  2611. package/dist/src/ui/utils/displayUtils.js +46 -0
  2612. package/dist/src/ui/utils/displayUtils.js.map +1 -0
  2613. package/dist/src/ui/utils/displayUtils.test.d.ts +6 -0
  2614. package/dist/src/ui/utils/displayUtils.test.js +61 -0
  2615. package/dist/src/ui/utils/displayUtils.test.js.map +1 -0
  2616. package/dist/src/ui/utils/export/collect.d.ts +16 -0
  2617. package/dist/src/ui/utils/export/collect.js +509 -0
  2618. package/dist/src/ui/utils/export/collect.js.map +1 -0
  2619. package/dist/src/ui/utils/export/collect.test.d.ts +6 -0
  2620. package/dist/src/ui/utils/export/collect.test.js +80 -0
  2621. package/dist/src/ui/utils/export/collect.test.js.map +1 -0
  2622. package/dist/src/ui/utils/export/formatters/html.d.ts +23 -0
  2623. package/dist/src/ui/utils/export/formatters/html.js +65 -0
  2624. package/dist/src/ui/utils/export/formatters/html.js.map +1 -0
  2625. package/dist/src/ui/utils/export/formatters/json.d.ts +11 -0
  2626. package/dist/src/ui/utils/export/formatters/json.js +13 -0
  2627. package/dist/src/ui/utils/export/formatters/json.js.map +1 -0
  2628. package/dist/src/ui/utils/export/formatters/jsonl.d.ts +11 -0
  2629. package/dist/src/ui/utils/export/formatters/jsonl.js +69 -0
  2630. package/dist/src/ui/utils/export/formatters/jsonl.js.map +1 -0
  2631. package/dist/src/ui/utils/export/formatters/markdown.d.ts +10 -0
  2632. package/dist/src/ui/utils/export/formatters/markdown.js +254 -0
  2633. package/dist/src/ui/utils/export/formatters/markdown.js.map +1 -0
  2634. package/dist/src/ui/utils/export/index.d.ts +13 -0
  2635. package/dist/src/ui/utils/export/index.js +13 -0
  2636. package/dist/src/ui/utils/export/index.js.map +1 -0
  2637. package/dist/src/ui/utils/export/normalize.d.ts +12 -0
  2638. package/dist/src/ui/utils/export/normalize.js +279 -0
  2639. package/dist/src/ui/utils/export/normalize.js.map +1 -0
  2640. package/dist/src/ui/utils/export/normalize.test.d.ts +6 -0
  2641. package/dist/src/ui/utils/export/normalize.test.js +62 -0
  2642. package/dist/src/ui/utils/export/normalize.test.js.map +1 -0
  2643. package/dist/src/ui/utils/export/types.d.ts +93 -0
  2644. package/dist/src/ui/utils/export/types.js +7 -0
  2645. package/dist/src/ui/utils/export/types.js.map +1 -0
  2646. package/dist/src/ui/utils/export/utils.d.ts +9 -0
  2647. package/dist/src/ui/utils/export/utils.js +13 -0
  2648. package/dist/src/ui/utils/export/utils.js.map +1 -0
  2649. package/dist/src/ui/utils/formatters.d.ts +28 -0
  2650. package/dist/src/ui/utils/formatters.js +100 -0
  2651. package/dist/src/ui/utils/formatters.js.map +1 -0
  2652. package/dist/src/ui/utils/formatters.test.d.ts +6 -0
  2653. package/dist/src/ui/utils/formatters.test.js +141 -0
  2654. package/dist/src/ui/utils/formatters.test.js.map +1 -0
  2655. package/dist/src/ui/utils/gradientUtils.d.ts +6 -0
  2656. package/dist/src/ui/utils/gradientUtils.js +11 -0
  2657. package/dist/src/ui/utils/gradientUtils.js.map +1 -0
  2658. package/dist/src/ui/utils/highlight.d.ts +12 -0
  2659. package/dist/src/ui/utils/highlight.js +90 -0
  2660. package/dist/src/ui/utils/highlight.js.map +1 -0
  2661. package/dist/src/ui/utils/highlight.test.d.ts +6 -0
  2662. package/dist/src/ui/utils/highlight.test.js +173 -0
  2663. package/dist/src/ui/utils/highlight.test.js.map +1 -0
  2664. package/dist/src/ui/utils/historyMapping.d.ts +44 -0
  2665. package/dist/src/ui/utils/historyMapping.js +110 -0
  2666. package/dist/src/ui/utils/historyMapping.js.map +1 -0
  2667. package/dist/src/ui/utils/historyMapping.test.d.ts +6 -0
  2668. package/dist/src/ui/utils/historyMapping.test.js +376 -0
  2669. package/dist/src/ui/utils/historyMapping.test.js.map +1 -0
  2670. package/dist/src/ui/utils/historyUtils.d.ts +34 -0
  2671. package/dist/src/ui/utils/historyUtils.js +117 -0
  2672. package/dist/src/ui/utils/historyUtils.js.map +1 -0
  2673. package/dist/src/ui/utils/historyUtils.test.d.ts +6 -0
  2674. package/dist/src/ui/utils/historyUtils.test.js +107 -0
  2675. package/dist/src/ui/utils/historyUtils.test.js.map +1 -0
  2676. package/dist/src/ui/utils/isNarrowWidth.d.ts +6 -0
  2677. package/dist/src/ui/utils/isNarrowWidth.js +9 -0
  2678. package/dist/src/ui/utils/isNarrowWidth.js.map +1 -0
  2679. package/dist/src/ui/utils/kittyProtocolDetector.d.ts +19 -0
  2680. package/dist/src/ui/utils/kittyProtocolDetector.js +115 -0
  2681. package/dist/src/ui/utils/kittyProtocolDetector.js.map +1 -0
  2682. package/dist/src/ui/utils/latexRenderer.d.ts +6 -0
  2683. package/dist/src/ui/utils/latexRenderer.js +187 -0
  2684. package/dist/src/ui/utils/latexRenderer.js.map +1 -0
  2685. package/dist/src/ui/utils/latexRenderer.test.d.ts +6 -0
  2686. package/dist/src/ui/utils/latexRenderer.test.js +27 -0
  2687. package/dist/src/ui/utils/latexRenderer.test.js.map +1 -0
  2688. package/dist/src/ui/utils/layoutUtils.d.ts +32 -0
  2689. package/dist/src/ui/utils/layoutUtils.js +46 -0
  2690. package/dist/src/ui/utils/layoutUtils.js.map +1 -0
  2691. package/dist/src/ui/utils/layoutUtils.test.d.ts +6 -0
  2692. package/dist/src/ui/utils/layoutUtils.test.js +30 -0
  2693. package/dist/src/ui/utils/layoutUtils.test.js.map +1 -0
  2694. package/dist/src/ui/utils/lowlightLoader.d.ts +43 -0
  2695. package/dist/src/ui/utils/lowlightLoader.js +88 -0
  2696. package/dist/src/ui/utils/lowlightLoader.js.map +1 -0
  2697. package/dist/src/ui/utils/lowlightLoader.test.d.ts +6 -0
  2698. package/dist/src/ui/utils/lowlightLoader.test.js +120 -0
  2699. package/dist/src/ui/utils/lowlightLoader.test.js.map +1 -0
  2700. package/dist/src/ui/utils/markdownUtilities.d.ts +6 -0
  2701. package/dist/src/ui/utils/markdownUtilities.js +110 -0
  2702. package/dist/src/ui/utils/markdownUtilities.js.map +1 -0
  2703. package/dist/src/ui/utils/markdownUtilities.test.d.ts +6 -0
  2704. package/dist/src/ui/utils/markdownUtilities.test.js +42 -0
  2705. package/dist/src/ui/utils/markdownUtilities.test.js.map +1 -0
  2706. package/dist/src/ui/utils/mergeCompactToolGroups.d.ts +62 -0
  2707. package/dist/src/ui/utils/mergeCompactToolGroups.js +212 -0
  2708. package/dist/src/ui/utils/mergeCompactToolGroups.js.map +1 -0
  2709. package/dist/src/ui/utils/mergeCompactToolGroups.test.d.ts +6 -0
  2710. package/dist/src/ui/utils/mergeCompactToolGroups.test.js +473 -0
  2711. package/dist/src/ui/utils/mergeCompactToolGroups.test.js.map +1 -0
  2712. package/dist/src/ui/utils/mermaidImageRenderer.d.ts +54 -0
  2713. package/dist/src/ui/utils/mermaidImageRenderer.js +955 -0
  2714. package/dist/src/ui/utils/mermaidImageRenderer.js.map +1 -0
  2715. package/dist/src/ui/utils/mermaidImageRenderer.test.d.ts +6 -0
  2716. package/dist/src/ui/utils/mermaidImageRenderer.test.js +528 -0
  2717. package/dist/src/ui/utils/mermaidImageRenderer.test.js.map +1 -0
  2718. package/dist/src/ui/utils/mermaidVisualRenderer.d.ts +12 -0
  2719. package/dist/src/ui/utils/mermaidVisualRenderer.js +1097 -0
  2720. package/dist/src/ui/utils/mermaidVisualRenderer.js.map +1 -0
  2721. package/dist/src/ui/utils/mermaidVisualRenderer.test.d.ts +6 -0
  2722. package/dist/src/ui/utils/mermaidVisualRenderer.test.js +69 -0
  2723. package/dist/src/ui/utils/mermaidVisualRenderer.test.js.map +1 -0
  2724. package/dist/src/ui/utils/modelsBySource.d.ts +47 -0
  2725. package/dist/src/ui/utils/modelsBySource.js +89 -0
  2726. package/dist/src/ui/utils/modelsBySource.js.map +1 -0
  2727. package/dist/src/ui/utils/modelsBySource.test.d.ts +6 -0
  2728. package/dist/src/ui/utils/modelsBySource.test.js +111 -0
  2729. package/dist/src/ui/utils/modelsBySource.test.js.map +1 -0
  2730. package/dist/src/ui/utils/mouse.d.ts +39 -0
  2731. package/dist/src/ui/utils/mouse.js +169 -0
  2732. package/dist/src/ui/utils/mouse.js.map +1 -0
  2733. package/dist/src/ui/utils/mouse.test.d.ts +6 -0
  2734. package/dist/src/ui/utils/mouse.test.js +117 -0
  2735. package/dist/src/ui/utils/mouse.test.js.map +1 -0
  2736. package/dist/src/ui/utils/osc8.d.ts +124 -0
  2737. package/dist/src/ui/utils/osc8.js +463 -0
  2738. package/dist/src/ui/utils/osc8.js.map +1 -0
  2739. package/dist/src/ui/utils/osc8.test.d.ts +6 -0
  2740. package/dist/src/ui/utils/osc8.test.js +494 -0
  2741. package/dist/src/ui/utils/osc8.test.js.map +1 -0
  2742. package/dist/src/ui/utils/platformConstants.d.ts +75 -0
  2743. package/dist/src/ui/utils/platformConstants.js +78 -0
  2744. package/dist/src/ui/utils/platformConstants.js.map +1 -0
  2745. package/dist/src/ui/utils/restoreGoal.d.ts +47 -0
  2746. package/dist/src/ui/utils/restoreGoal.js +124 -0
  2747. package/dist/src/ui/utils/restoreGoal.js.map +1 -0
  2748. package/dist/src/ui/utils/restoreGoal.test.d.ts +6 -0
  2749. package/dist/src/ui/utils/restoreGoal.test.js +220 -0
  2750. package/dist/src/ui/utils/restoreGoal.test.js.map +1 -0
  2751. package/dist/src/ui/utils/resumeHistoryUtils.d.ts +22 -0
  2752. package/dist/src/ui/utils/resumeHistoryUtils.js +410 -0
  2753. package/dist/src/ui/utils/resumeHistoryUtils.js.map +1 -0
  2754. package/dist/src/ui/utils/resumeHistoryUtils.test.d.ts +6 -0
  2755. package/dist/src/ui/utils/resumeHistoryUtils.test.js +378 -0
  2756. package/dist/src/ui/utils/resumeHistoryUtils.test.js.map +1 -0
  2757. package/dist/src/ui/utils/sessionPickerUtils.d.ts +35 -0
  2758. package/dist/src/ui/utils/sessionPickerUtils.js +69 -0
  2759. package/dist/src/ui/utils/sessionPickerUtils.js.map +1 -0
  2760. package/dist/src/ui/utils/sessionPickerUtils.test.d.ts +6 -0
  2761. package/dist/src/ui/utils/sessionPickerUtils.test.js +79 -0
  2762. package/dist/src/ui/utils/sessionPickerUtils.test.js.map +1 -0
  2763. package/dist/src/ui/utils/statsDataService.d.ts +49 -0
  2764. package/dist/src/ui/utils/statsDataService.js +221 -0
  2765. package/dist/src/ui/utils/statsDataService.js.map +1 -0
  2766. package/dist/src/ui/utils/statsDataService.test.d.ts +6 -0
  2767. package/dist/src/ui/utils/statsDataService.test.js +406 -0
  2768. package/dist/src/ui/utils/statsDataService.test.js.map +1 -0
  2769. package/dist/src/ui/utils/synchronizedOutput.d.ts +16 -0
  2770. package/dist/src/ui/utils/synchronizedOutput.js +88 -0
  2771. package/dist/src/ui/utils/synchronizedOutput.js.map +1 -0
  2772. package/dist/src/ui/utils/synchronizedOutput.test.d.ts +6 -0
  2773. package/dist/src/ui/utils/synchronizedOutput.test.js +154 -0
  2774. package/dist/src/ui/utils/synchronizedOutput.test.js.map +1 -0
  2775. package/dist/src/ui/utils/terminalRedrawOptimizer.d.ts +21 -0
  2776. package/dist/src/ui/utils/terminalRedrawOptimizer.js +108 -0
  2777. package/dist/src/ui/utils/terminalRedrawOptimizer.js.map +1 -0
  2778. package/dist/src/ui/utils/terminalRedrawOptimizer.test.d.ts +6 -0
  2779. package/dist/src/ui/utils/terminalRedrawOptimizer.test.js +85 -0
  2780. package/dist/src/ui/utils/terminalRedrawOptimizer.test.js.map +1 -0
  2781. package/dist/src/ui/utils/terminalSetup.d.ts +30 -0
  2782. package/dist/src/ui/utils/terminalSetup.js +310 -0
  2783. package/dist/src/ui/utils/terminalSetup.js.map +1 -0
  2784. package/dist/src/ui/utils/textUtils.d.ts +86 -0
  2785. package/dist/src/ui/utils/textUtils.js +360 -0
  2786. package/dist/src/ui/utils/textUtils.js.map +1 -0
  2787. package/dist/src/ui/utils/textUtils.test.d.ts +6 -0
  2788. package/dist/src/ui/utils/textUtils.test.js +269 -0
  2789. package/dist/src/ui/utils/textUtils.test.js.map +1 -0
  2790. package/dist/src/ui/utils/todoSnapshot.d.ts +13 -0
  2791. package/dist/src/ui/utils/todoSnapshot.js +133 -0
  2792. package/dist/src/ui/utils/todoSnapshot.js.map +1 -0
  2793. package/dist/src/ui/utils/todoSnapshot.test.d.ts +6 -0
  2794. package/dist/src/ui/utils/todoSnapshot.test.js +281 -0
  2795. package/dist/src/ui/utils/todoSnapshot.test.js.map +1 -0
  2796. package/dist/src/ui/utils/updateCheck.d.ts +12 -0
  2797. package/dist/src/ui/utils/updateCheck.js +80 -0
  2798. package/dist/src/ui/utils/updateCheck.js.map +1 -0
  2799. package/dist/src/ui/utils/updateCheck.test.d.ts +6 -0
  2800. package/dist/src/ui/utils/updateCheck.test.js +145 -0
  2801. package/dist/src/ui/utils/updateCheck.test.js.map +1 -0
  2802. package/dist/src/utils/acpModelUtils.d.ts +39 -0
  2803. package/dist/src/utils/acpModelUtils.js +61 -0
  2804. package/dist/src/utils/acpModelUtils.js.map +1 -0
  2805. package/dist/src/utils/acpModelUtils.test.d.ts +6 -0
  2806. package/dist/src/utils/acpModelUtils.test.js +31 -0
  2807. package/dist/src/utils/acpModelUtils.test.js.map +1 -0
  2808. package/dist/src/utils/apiPreconnect.d.ts +22 -0
  2809. package/dist/src/utils/apiPreconnect.js +188 -0
  2810. package/dist/src/utils/apiPreconnect.js.map +1 -0
  2811. package/dist/src/utils/apiPreconnect.test.d.ts +6 -0
  2812. package/dist/src/utils/apiPreconnect.test.js +252 -0
  2813. package/dist/src/utils/apiPreconnect.test.js.map +1 -0
  2814. package/dist/src/utils/checks.d.ts +19 -0
  2815. package/dist/src/utils/checks.js +24 -0
  2816. package/dist/src/utils/checks.js.map +1 -0
  2817. package/dist/src/utils/cleanup.d.ts +23 -0
  2818. package/dist/src/utils/cleanup.js +96 -0
  2819. package/dist/src/utils/cleanup.js.map +1 -0
  2820. package/dist/src/utils/commands.d.ts +20 -0
  2821. package/dist/src/utils/commands.js +53 -0
  2822. package/dist/src/utils/commands.js.map +1 -0
  2823. package/dist/src/utils/commands.test.d.ts +6 -0
  2824. package/dist/src/utils/commands.test.js +115 -0
  2825. package/dist/src/utils/commands.test.js.map +1 -0
  2826. package/dist/src/utils/commentJson.d.ts +25 -0
  2827. package/dist/src/utils/commentJson.js +113 -0
  2828. package/dist/src/utils/commentJson.js.map +1 -0
  2829. package/dist/src/utils/commentJson.test.d.ts +6 -0
  2830. package/dist/src/utils/commentJson.test.js +385 -0
  2831. package/dist/src/utils/commentJson.test.js.map +1 -0
  2832. package/dist/src/utils/costCalculator.d.ts +14 -0
  2833. package/dist/src/utils/costCalculator.js +19 -0
  2834. package/dist/src/utils/costCalculator.js.map +1 -0
  2835. package/dist/src/utils/costCalculator.test.d.ts +6 -0
  2836. package/dist/src/utils/costCalculator.test.js +177 -0
  2837. package/dist/src/utils/costCalculator.test.js.map +1 -0
  2838. package/dist/src/utils/cpuProfiler.d.ts +63 -0
  2839. package/dist/src/utils/cpuProfiler.js +341 -0
  2840. package/dist/src/utils/cpuProfiler.js.map +1 -0
  2841. package/dist/src/utils/cpuProfiler.test.d.ts +6 -0
  2842. package/dist/src/utils/cpuProfiler.test.js +293 -0
  2843. package/dist/src/utils/cpuProfiler.test.js.map +1 -0
  2844. package/dist/src/utils/deepMerge.d.ts +9 -0
  2845. package/dist/src/utils/deepMerge.js +58 -0
  2846. package/dist/src/utils/deepMerge.js.map +1 -0
  2847. package/dist/src/utils/deepMerge.test.d.ts +6 -0
  2848. package/dist/src/utils/deepMerge.test.js +143 -0
  2849. package/dist/src/utils/deepMerge.test.js.map +1 -0
  2850. package/dist/src/utils/dialogScopeUtils.d.ts +28 -0
  2851. package/dist/src/utils/dialogScopeUtils.js +51 -0
  2852. package/dist/src/utils/dialogScopeUtils.js.map +1 -0
  2853. package/dist/src/utils/doctorChecks.d.ts +11 -0
  2854. package/dist/src/utils/doctorChecks.js +351 -0
  2855. package/dist/src/utils/doctorChecks.js.map +1 -0
  2856. package/dist/src/utils/doctorChecks.test.d.ts +6 -0
  2857. package/dist/src/utils/doctorChecks.test.js +280 -0
  2858. package/dist/src/utils/doctorChecks.test.js.map +1 -0
  2859. package/dist/src/utils/earlyInputCapture.d.ts +33 -0
  2860. package/dist/src/utils/earlyInputCapture.js +311 -0
  2861. package/dist/src/utils/earlyInputCapture.js.map +1 -0
  2862. package/dist/src/utils/earlyInputCapture.test.d.ts +6 -0
  2863. package/dist/src/utils/earlyInputCapture.test.js +274 -0
  2864. package/dist/src/utils/earlyInputCapture.test.js.map +1 -0
  2865. package/dist/src/utils/envVarResolver.d.ts +39 -0
  2866. package/dist/src/utils/envVarResolver.js +100 -0
  2867. package/dist/src/utils/envVarResolver.js.map +1 -0
  2868. package/dist/src/utils/envVarResolver.test.d.ts +6 -0
  2869. package/dist/src/utils/envVarResolver.test.js +221 -0
  2870. package/dist/src/utils/envVarResolver.test.js.map +1 -0
  2871. package/dist/src/utils/errors.d.ts +76 -0
  2872. package/dist/src/utils/errors.js +237 -0
  2873. package/dist/src/utils/errors.js.map +1 -0
  2874. package/dist/src/utils/errors.test.d.ts +6 -0
  2875. package/dist/src/utils/errors.test.js +536 -0
  2876. package/dist/src/utils/errors.test.js.map +1 -0
  2877. package/dist/src/utils/events.d.ts +13 -0
  2878. package/dist/src/utils/events.js +15 -0
  2879. package/dist/src/utils/events.js.map +1 -0
  2880. package/dist/src/utils/gitUtils.d.ts +30 -0
  2881. package/dist/src/utils/gitUtils.js +108 -0
  2882. package/dist/src/utils/gitUtils.js.map +1 -0
  2883. package/dist/src/utils/gitUtils.test.d.ts +6 -0
  2884. package/dist/src/utils/gitUtils.test.js +172 -0
  2885. package/dist/src/utils/gitUtils.test.js.map +1 -0
  2886. package/dist/src/utils/handleAutoUpdate.d.ts +16 -0
  2887. package/dist/src/utils/handleAutoUpdate.js +144 -0
  2888. package/dist/src/utils/handleAutoUpdate.js.map +1 -0
  2889. package/dist/src/utils/headlessSafetyWarnings.d.ts +21 -0
  2890. package/dist/src/utils/headlessSafetyWarnings.js +45 -0
  2891. package/dist/src/utils/headlessSafetyWarnings.js.map +1 -0
  2892. package/dist/src/utils/headlessSafetyWarnings.test.d.ts +6 -0
  2893. package/dist/src/utils/headlessSafetyWarnings.test.js +66 -0
  2894. package/dist/src/utils/headlessSafetyWarnings.test.js.map +1 -0
  2895. package/dist/src/utils/housekeeping/cleanup.d.ts +15 -0
  2896. package/dist/src/utils/housekeeping/cleanup.js +69 -0
  2897. package/dist/src/utils/housekeeping/cleanup.js.map +1 -0
  2898. package/dist/src/utils/housekeeping/cleanup.test.d.ts +6 -0
  2899. package/dist/src/utils/housekeeping/cleanup.test.js +166 -0
  2900. package/dist/src/utils/housekeeping/cleanup.test.js.map +1 -0
  2901. package/dist/src/utils/housekeeping/lastInteractionAt.d.ts +9 -0
  2902. package/dist/src/utils/housekeeping/lastInteractionAt.js +22 -0
  2903. package/dist/src/utils/housekeeping/lastInteractionAt.js.map +1 -0
  2904. package/dist/src/utils/housekeeping/scheduler.d.ts +17 -0
  2905. package/dist/src/utils/housekeeping/scheduler.js +130 -0
  2906. package/dist/src/utils/housekeeping/scheduler.js.map +1 -0
  2907. package/dist/src/utils/housekeeping/scheduler.test.d.ts +6 -0
  2908. package/dist/src/utils/housekeeping/scheduler.test.js +190 -0
  2909. package/dist/src/utils/housekeeping/scheduler.test.js.map +1 -0
  2910. package/dist/src/utils/housekeeping/throttledOnce.d.ts +13 -0
  2911. package/dist/src/utils/housekeeping/throttledOnce.js +110 -0
  2912. package/dist/src/utils/housekeeping/throttledOnce.js.map +1 -0
  2913. package/dist/src/utils/housekeeping/throttledOnce.test.d.ts +6 -0
  2914. package/dist/src/utils/housekeeping/throttledOnce.test.js +94 -0
  2915. package/dist/src/utils/housekeeping/throttledOnce.test.js.map +1 -0
  2916. package/dist/src/utils/installationInfo.d.ts +26 -0
  2917. package/dist/src/utils/installationInfo.js +266 -0
  2918. package/dist/src/utils/installationInfo.js.map +1 -0
  2919. package/dist/src/utils/installationInfo.test.d.ts +6 -0
  2920. package/dist/src/utils/installationInfo.test.js +466 -0
  2921. package/dist/src/utils/installationInfo.test.js.map +1 -0
  2922. package/dist/src/utils/languageUtils.d.ts +40 -0
  2923. package/dist/src/utils/languageUtils.js +163 -0
  2924. package/dist/src/utils/languageUtils.js.map +1 -0
  2925. package/dist/src/utils/languageUtils.test.d.ts +6 -0
  2926. package/dist/src/utils/languageUtils.test.js +341 -0
  2927. package/dist/src/utils/languageUtils.test.js.map +1 -0
  2928. package/dist/src/utils/math.d.ts +13 -0
  2929. package/dist/src/utils/math.js +14 -0
  2930. package/dist/src/utils/math.js.map +1 -0
  2931. package/dist/src/utils/memoryDiagnostics.d.ts +65 -0
  2932. package/dist/src/utils/memoryDiagnostics.js +365 -0
  2933. package/dist/src/utils/memoryDiagnostics.js.map +1 -0
  2934. package/dist/src/utils/memoryDiagnostics.test.d.ts +6 -0
  2935. package/dist/src/utils/memoryDiagnostics.test.js +641 -0
  2936. package/dist/src/utils/memoryDiagnostics.test.js.map +1 -0
  2937. package/dist/src/utils/modelConfigUtils.d.ts +55 -0
  2938. package/dist/src/utils/modelConfigUtils.js +186 -0
  2939. package/dist/src/utils/modelConfigUtils.js.map +1 -0
  2940. package/dist/src/utils/modelConfigUtils.test.d.ts +6 -0
  2941. package/dist/src/utils/modelConfigUtils.test.js +1247 -0
  2942. package/dist/src/utils/modelConfigUtils.test.js.map +1 -0
  2943. package/dist/src/utils/nonInteractiveHelpers.d.ts +101 -0
  2944. package/dist/src/utils/nonInteractiveHelpers.js +479 -0
  2945. package/dist/src/utils/nonInteractiveHelpers.js.map +1 -0
  2946. package/dist/src/utils/nonInteractiveHelpers.test.d.ts +6 -0
  2947. package/dist/src/utils/nonInteractiveHelpers.test.js +1038 -0
  2948. package/dist/src/utils/nonInteractiveHelpers.test.js.map +1 -0
  2949. package/dist/src/utils/osc.d.ts +91 -0
  2950. package/dist/src/utils/osc.js +162 -0
  2951. package/dist/src/utils/osc.js.map +1 -0
  2952. package/dist/src/utils/osc.test.d.ts +6 -0
  2953. package/dist/src/utils/osc.test.js +217 -0
  2954. package/dist/src/utils/osc.test.js.map +1 -0
  2955. package/dist/src/utils/package.d.ts +12 -0
  2956. package/dist/src/utils/package.js +24 -0
  2957. package/dist/src/utils/package.js.map +1 -0
  2958. package/dist/src/utils/processUtils.d.ts +13 -0
  2959. package/dist/src/utils/processUtils.js +18 -0
  2960. package/dist/src/utils/processUtils.js.map +1 -0
  2961. package/dist/src/utils/processUtils.test.d.ts +6 -0
  2962. package/dist/src/utils/processUtils.test.js +20 -0
  2963. package/dist/src/utils/processUtils.test.js.map +1 -0
  2964. package/dist/src/utils/readStdin.d.ts +6 -0
  2965. package/dist/src/utils/readStdin.js +60 -0
  2966. package/dist/src/utils/readStdin.js.map +1 -0
  2967. package/dist/src/utils/readStdin.test.d.ts +6 -0
  2968. package/dist/src/utils/readStdin.test.js +88 -0
  2969. package/dist/src/utils/readStdin.test.js.map +1 -0
  2970. package/dist/src/utils/relaunch.d.ts +9 -0
  2971. package/dist/src/utils/relaunch.js +68 -0
  2972. package/dist/src/utils/relaunch.js.map +1 -0
  2973. package/dist/src/utils/relaunch.test.d.ts +6 -0
  2974. package/dist/src/utils/relaunch.test.js +291 -0
  2975. package/dist/src/utils/relaunch.test.js.map +1 -0
  2976. package/dist/src/utils/resolvePath.d.ts +6 -0
  2977. package/dist/src/utils/resolvePath.js +21 -0
  2978. package/dist/src/utils/resolvePath.js.map +1 -0
  2979. package/dist/src/utils/runBudget.d.ts +116 -0
  2980. package/dist/src/utils/runBudget.js +235 -0
  2981. package/dist/src/utils/runBudget.js.map +1 -0
  2982. package/dist/src/utils/runBudget.test.d.ts +6 -0
  2983. package/dist/src/utils/runBudget.test.js +187 -0
  2984. package/dist/src/utils/runBudget.test.js.map +1 -0
  2985. package/dist/src/utils/sandbox-macos-permissive-closed.sb +33 -0
  2986. package/dist/src/utils/sandbox-macos-permissive-open.sb +28 -0
  2987. package/dist/src/utils/sandbox-macos-permissive-proxied.sb +38 -0
  2988. package/dist/src/utils/sandbox-macos-restrictive-closed.sb +94 -0
  2989. package/dist/src/utils/sandbox-macos-restrictive-open.sb +97 -0
  2990. package/dist/src/utils/sandbox-macos-restrictive-proxied.sb +99 -0
  2991. package/dist/src/utils/sandbox.d.ts +7 -0
  2992. package/dist/src/utils/sandbox.js +788 -0
  2993. package/dist/src/utils/sandbox.js.map +1 -0
  2994. package/dist/src/utils/sessionPaths.d.ts +19 -0
  2995. package/dist/src/utils/sessionPaths.js +141 -0
  2996. package/dist/src/utils/sessionPaths.js.map +1 -0
  2997. package/dist/src/utils/sessionPaths.test.d.ts +6 -0
  2998. package/dist/src/utils/sessionPaths.test.js +249 -0
  2999. package/dist/src/utils/sessionPaths.test.js.map +1 -0
  3000. package/dist/src/utils/settingsUtils.d.ts +167 -0
  3001. package/dist/src/utils/settingsUtils.js +532 -0
  3002. package/dist/src/utils/settingsUtils.js.map +1 -0
  3003. package/dist/src/utils/settingsUtils.test.d.ts +6 -0
  3004. package/dist/src/utils/settingsUtils.test.js +849 -0
  3005. package/dist/src/utils/settingsUtils.test.js.map +1 -0
  3006. package/dist/src/utils/spawnWrapper.d.ts +7 -0
  3007. package/dist/src/utils/spawnWrapper.js +8 -0
  3008. package/dist/src/utils/spawnWrapper.js.map +1 -0
  3009. package/dist/src/utils/standalone-update-verify.d.ts +12 -0
  3010. package/dist/src/utils/standalone-update-verify.js +43 -0
  3011. package/dist/src/utils/standalone-update-verify.js.map +1 -0
  3012. package/dist/src/utils/standalone-update-verify.test.d.ts +6 -0
  3013. package/dist/src/utils/standalone-update-verify.test.js +27 -0
  3014. package/dist/src/utils/standalone-update-verify.test.js.map +1 -0
  3015. package/dist/src/utils/standalone-update.d.ts +27 -0
  3016. package/dist/src/utils/standalone-update.js +714 -0
  3017. package/dist/src/utils/standalone-update.js.map +1 -0
  3018. package/dist/src/utils/standalone-update.test.d.ts +6 -0
  3019. package/dist/src/utils/standalone-update.test.js +301 -0
  3020. package/dist/src/utils/standalone-update.test.js.map +1 -0
  3021. package/dist/src/utils/startupProfiler.d.ts +90 -0
  3022. package/dist/src/utils/startupProfiler.js +267 -0
  3023. package/dist/src/utils/startupProfiler.js.map +1 -0
  3024. package/dist/src/utils/startupProfiler.test.d.ts +1 -0
  3025. package/dist/src/utils/startupProfiler.test.js +293 -0
  3026. package/dist/src/utils/startupProfiler.test.js.map +1 -0
  3027. package/dist/src/utils/startupWarnings.d.ts +6 -0
  3028. package/dist/src/utils/startupWarnings.js +40 -0
  3029. package/dist/src/utils/startupWarnings.js.map +1 -0
  3030. package/dist/src/utils/stdioHelpers.d.ts +31 -0
  3031. package/dist/src/utils/stdioHelpers.js +38 -0
  3032. package/dist/src/utils/stdioHelpers.js.map +1 -0
  3033. package/dist/src/utils/systemInfo.d.ts +78 -0
  3034. package/dist/src/utils/systemInfo.js +208 -0
  3035. package/dist/src/utils/systemInfo.js.map +1 -0
  3036. package/dist/src/utils/systemInfo.test.d.ts +6 -0
  3037. package/dist/src/utils/systemInfo.test.js +380 -0
  3038. package/dist/src/utils/systemInfo.test.js.map +1 -0
  3039. package/dist/src/utils/systemInfoFields.d.ts +18 -0
  3040. package/dist/src/utils/systemInfoFields.js +102 -0
  3041. package/dist/src/utils/systemInfoFields.js.map +1 -0
  3042. package/dist/src/utils/systemInfoFields.test.d.ts +6 -0
  3043. package/dist/src/utils/systemInfoFields.test.js +74 -0
  3044. package/dist/src/utils/systemInfoFields.test.js.map +1 -0
  3045. package/dist/src/utils/terminalSequence.d.ts +21 -0
  3046. package/dist/src/utils/terminalSequence.js +124 -0
  3047. package/dist/src/utils/terminalSequence.js.map +1 -0
  3048. package/dist/src/utils/terminalSequence.test.d.ts +6 -0
  3049. package/dist/src/utils/terminalSequence.test.js +132 -0
  3050. package/dist/src/utils/terminalSequence.test.js.map +1 -0
  3051. package/dist/src/utils/truncatedDiffPreview.d.ts +6 -0
  3052. package/dist/src/utils/truncatedDiffPreview.js +18 -0
  3053. package/dist/src/utils/truncatedDiffPreview.js.map +1 -0
  3054. package/dist/src/utils/updateEventEmitter.d.ts +11 -0
  3055. package/dist/src/utils/updateEventEmitter.js +12 -0
  3056. package/dist/src/utils/updateEventEmitter.js.map +1 -0
  3057. package/dist/src/utils/userPromptExpansionHook.d.ts +9 -0
  3058. package/dist/src/utils/userPromptExpansionHook.js +30 -0
  3059. package/dist/src/utils/userPromptExpansionHook.js.map +1 -0
  3060. package/dist/src/utils/userPromptExpansionHook.test.d.ts +6 -0
  3061. package/dist/src/utils/userPromptExpansionHook.test.js +69 -0
  3062. package/dist/src/utils/userPromptExpansionHook.test.js.map +1 -0
  3063. package/dist/src/utils/userStartupWarnings.d.ts +12 -0
  3064. package/dist/src/utils/userStartupWarnings.js +74 -0
  3065. package/dist/src/utils/userStartupWarnings.js.map +1 -0
  3066. package/dist/src/utils/userStartupWarnings.test.d.ts +6 -0
  3067. package/dist/src/utils/userStartupWarnings.test.js +88 -0
  3068. package/dist/src/utils/userStartupWarnings.test.js.map +1 -0
  3069. package/dist/src/utils/version.d.ts +6 -0
  3070. package/dist/src/utils/version.js +11 -0
  3071. package/dist/src/utils/version.js.map +1 -0
  3072. package/dist/src/utils/warningHandler.d.ts +29 -0
  3073. package/dist/src/utils/warningHandler.js +100 -0
  3074. package/dist/src/utils/warningHandler.js.map +1 -0
  3075. package/dist/src/utils/warningHandler.test.d.ts +6 -0
  3076. package/dist/src/utils/warningHandler.test.js +185 -0
  3077. package/dist/src/utils/warningHandler.test.js.map +1 -0
  3078. package/dist/src/utils/windowTitle.d.ts +12 -0
  3079. package/dist/src/utils/windowTitle.js +19 -0
  3080. package/dist/src/utils/windowTitle.js.map +1 -0
  3081. package/dist/src/utils/windowTitle.test.d.ts +6 -0
  3082. package/dist/src/utils/windowTitle.test.js +49 -0
  3083. package/dist/src/utils/windowTitle.test.js.map +1 -0
  3084. package/dist/src/utils/writeWithBackup.d.ts +49 -0
  3085. package/dist/src/utils/writeWithBackup.js +136 -0
  3086. package/dist/src/utils/writeWithBackup.js.map +1 -0
  3087. package/dist/src/utils/writeWithBackup.test.d.ts +6 -0
  3088. package/dist/src/utils/writeWithBackup.test.js +177 -0
  3089. package/dist/src/utils/writeWithBackup.test.js.map +1 -0
  3090. package/dist/src/validateNonInterActiveAuth.d.ts +8 -0
  3091. package/dist/src/validateNonInterActiveAuth.js +66 -0
  3092. package/dist/src/validateNonInterActiveAuth.js.map +1 -0
  3093. package/dist/tsconfig.tsbuildinfo +1 -0
  3094. package/package.json +121 -0
@@ -0,0 +1,3845 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Qwen
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import * as fs from 'node:fs/promises';
8
+ import * as os from 'node:os';
9
+ import * as path from 'node:path';
10
+ import { computeInitialTurnFromHistory, fireSessionPermissionDeniedForAutoMode, Session, } from './Session.js';
11
+ import { ApprovalMode, AuthType, SYSTEM_REMINDER_OPEN, SYSTEM_REMINDER_CLOSE, } from '@tulex-cli/tulex-cli-core';
12
+ import * as core from '@tulex-cli/tulex-cli-core';
13
+ import { SettingScope } from '../../config/settings.js';
14
+ import * as nonInteractiveCliCommands from '../../nonInteractiveCliCommands.js';
15
+ import { CommandKind } from '../../ui/commands/types.js';
16
+ const debugLoggerWarnSpy = vi.hoisted(() => vi.fn());
17
+ vi.mock('@tulex-cli/tulex-cli-core', async (importOriginal) => {
18
+ const actual = await importOriginal();
19
+ return {
20
+ ...actual,
21
+ createDebugLogger: () => ({
22
+ debug: vi.fn(),
23
+ info: vi.fn(),
24
+ warn: debugLoggerWarnSpy,
25
+ error: vi.fn(),
26
+ }),
27
+ };
28
+ });
29
+ vi.mock('../../nonInteractiveCliCommands.js', () => ({
30
+ ALLOWED_BUILTIN_COMMANDS_NON_INTERACTIVE: [
31
+ 'init',
32
+ 'summary',
33
+ 'compress',
34
+ 'bug',
35
+ ],
36
+ getAvailableCommands: vi.fn(),
37
+ handleSlashCommand: vi.fn(),
38
+ }));
39
+ function chatRecord(overrides) {
40
+ return {
41
+ uuid: 'record',
42
+ parentUuid: null,
43
+ sessionId: 'test-session-id',
44
+ timestamp: '2026-05-17T07:27:15.251Z',
45
+ type: 'user',
46
+ cwd: process.cwd(),
47
+ version: '0.15.11',
48
+ ...overrides,
49
+ };
50
+ }
51
+ describe('computeInitialTurnFromHistory', () => {
52
+ it('uses the largest numeric prompt id suffix for the current session', () => {
53
+ expect(computeInitialTurnFromHistory([
54
+ chatRecord({
55
+ uuid: 'user-1',
56
+ promptId: 'test-session-id########1',
57
+ message: { parts: [{ text: '1' }] },
58
+ }),
59
+ chatRecord({
60
+ uuid: 'system-1',
61
+ timestamp: '2026-05-17T07:27:23.470Z',
62
+ type: 'system',
63
+ subtype: 'ui_telemetry',
64
+ systemPayload: {
65
+ uiEvent: {
66
+ prompt_id: 'test-session-id########2',
67
+ },
68
+ },
69
+ }),
70
+ chatRecord({
71
+ uuid: 'system-notification',
72
+ timestamp: '2026-05-17T07:27:24.000Z',
73
+ type: 'system',
74
+ subtype: 'ui_telemetry',
75
+ systemPayload: {
76
+ uiEvent: {
77
+ prompt_id: 'test-session-id########notification123',
78
+ },
79
+ },
80
+ }),
81
+ chatRecord({
82
+ uuid: 'other-session',
83
+ sessionId: 'other-session-id',
84
+ timestamp: '2026-05-17T07:27:25.000Z',
85
+ promptId: 'other-session-id########99',
86
+ message: { parts: [{ text: 'other' }] },
87
+ }),
88
+ ], 'test-session-id')).toBe(2);
89
+ });
90
+ it('falls back to user message count when prompt ids are absent', () => {
91
+ expect(computeInitialTurnFromHistory([
92
+ chatRecord({
93
+ uuid: 'user-1',
94
+ message: { parts: [{ text: '1' }] },
95
+ }),
96
+ chatRecord({
97
+ uuid: 'assistant-1',
98
+ timestamp: '2026-05-17T07:27:18.861Z',
99
+ type: 'assistant',
100
+ message: { parts: [{ text: 'answer 1' }] },
101
+ }),
102
+ chatRecord({
103
+ uuid: 'user-2',
104
+ timestamp: '2026-05-17T07:27:20.446Z',
105
+ message: { parts: [{ text: '2' }] },
106
+ }),
107
+ chatRecord({
108
+ uuid: 'other-session',
109
+ sessionId: 'other-session-id',
110
+ timestamp: '2026-05-17T07:27:25.000Z',
111
+ message: { parts: [{ text: 'other' }] },
112
+ }),
113
+ ], 'test-session-id')).toBe(2);
114
+ });
115
+ });
116
+ // Helper to create empty async generator (avoids memory leak from inline generators)
117
+ function createEmptyStream() {
118
+ return (async function* () { })();
119
+ }
120
+ // Helper to create async generator with chunks (avoids memory leak)
121
+ function createStreamWithChunks(chunks) {
122
+ return (async function* () {
123
+ for (const chunk of chunks) {
124
+ yield chunk;
125
+ }
126
+ })();
127
+ }
128
+ function expectCompressBeforeSend(compressMock, sendMock, callIndex) {
129
+ expect(compressMock.mock.invocationCallOrder.length).toBeGreaterThan(callIndex);
130
+ expect(sendMock.mock.invocationCallOrder.length).toBeGreaterThan(callIndex);
131
+ expect(compressMock.mock.invocationCallOrder[callIndex]).toBeLessThan(sendMock.mock.invocationCallOrder[callIndex]);
132
+ }
133
+ describe('Session', () => {
134
+ let mockChat;
135
+ let mockConfig;
136
+ let mockClient;
137
+ let mockSettings;
138
+ let session;
139
+ let currentModel;
140
+ let currentAuthType;
141
+ let switchModelSpy;
142
+ let getAvailableCommandsSpy;
143
+ let mockChatRecordingService;
144
+ let mockGeminiClient;
145
+ let mockBackgroundTaskRegistry;
146
+ let mockMonitorRegistry;
147
+ let mockBackgroundShellRegistry;
148
+ let mockToolRegistry;
149
+ beforeEach(() => {
150
+ currentModel = 'qwen3-code-plus';
151
+ currentAuthType = AuthType.USE_OPENAI;
152
+ switchModelSpy = vi
153
+ .fn()
154
+ .mockImplementation(async (authType, modelId) => {
155
+ currentAuthType = authType;
156
+ currentModel = modelId;
157
+ });
158
+ mockChat = {
159
+ sendMessageStream: vi.fn(),
160
+ addHistory: vi.fn(),
161
+ getHistory: vi.fn().mockReturnValue([]),
162
+ getHistoryShallow: vi.fn().mockReturnValue([]),
163
+ getLastModelMessageText: vi.fn().mockReturnValue(''),
164
+ setHistory: vi.fn(),
165
+ truncateHistory: vi.fn(),
166
+ stripThoughtsFromHistory: vi.fn(),
167
+ };
168
+ mockGeminiClient = {
169
+ getChat: vi.fn().mockReturnValue(mockChat),
170
+ tryCompressChat: vi.fn().mockResolvedValue({
171
+ originalTokenCount: 0,
172
+ newTokenCount: 0,
173
+ compressionStatus: core.CompressionStatus.NOOP,
174
+ }),
175
+ };
176
+ mockBackgroundTaskRegistry = {
177
+ setNotificationCallback: vi.fn(),
178
+ };
179
+ mockMonitorRegistry = {
180
+ setNotificationCallback: vi.fn(),
181
+ };
182
+ mockBackgroundShellRegistry = {
183
+ setNotificationCallback: vi.fn(),
184
+ };
185
+ mockChatRecordingService = {
186
+ recordUserMessage: vi.fn(),
187
+ recordMidTurnUserMessage: vi.fn(),
188
+ recordUiTelemetryEvent: vi.fn(),
189
+ recordToolResult: vi.fn(),
190
+ recordSlashCommand: vi.fn(),
191
+ recordNotification: vi.fn(),
192
+ rewindRecording: vi.fn(),
193
+ };
194
+ mockToolRegistry = {
195
+ getTool: vi.fn(),
196
+ ensureTool: vi.fn().mockResolvedValue(true),
197
+ };
198
+ const fileService = { shouldGitIgnoreFile: vi.fn().mockReturnValue(false) };
199
+ mockConfig = {
200
+ setApprovalMode: vi.fn(),
201
+ // #buildInitialSystemReminders branches on ApprovalMode.PLAN on every
202
+ // session.prompt(), so the default must be defined. Individual tests
203
+ // that care override via `mockConfig.getApprovalMode = vi.fn()...`.
204
+ getApprovalMode: vi.fn().mockReturnValue(ApprovalMode.DEFAULT),
205
+ switchModel: switchModelSpy,
206
+ getModel: vi.fn().mockImplementation(() => currentModel),
207
+ getSessionId: vi.fn().mockReturnValue('test-session-id'),
208
+ getWorkingDir: vi.fn().mockReturnValue(process.cwd()),
209
+ getTelemetryLogPromptsEnabled: vi.fn().mockReturnValue(false),
210
+ getUsageStatisticsEnabled: vi.fn().mockReturnValue(false),
211
+ getContentGeneratorConfig: vi.fn().mockReturnValue(undefined),
212
+ getChatRecordingService: vi
213
+ .fn()
214
+ .mockReturnValue(mockChatRecordingService),
215
+ getToolRegistry: vi.fn().mockReturnValue(mockToolRegistry),
216
+ getFileService: vi.fn().mockReturnValue(fileService),
217
+ getFileFilteringRespectGitIgnore: vi.fn().mockReturnValue(true),
218
+ getEnableRecursiveFileSearch: vi.fn().mockReturnValue(false),
219
+ getTargetDir: vi.fn().mockReturnValue(process.cwd()),
220
+ getDebugMode: vi.fn().mockReturnValue(false),
221
+ getAuthType: vi.fn().mockImplementation(() => currentAuthType),
222
+ isCronEnabled: vi.fn().mockReturnValue(false),
223
+ getSessionTokenLimit: vi.fn().mockReturnValue(0),
224
+ getStopHookBlockingCap: vi.fn().mockReturnValue(8),
225
+ getGeminiClient: vi.fn().mockReturnValue(mockGeminiClient),
226
+ getBackgroundTaskRegistry: vi
227
+ .fn()
228
+ .mockReturnValue(mockBackgroundTaskRegistry),
229
+ getBackgroundShellRegistry: vi
230
+ .fn()
231
+ .mockReturnValue(mockBackgroundShellRegistry),
232
+ getMonitorRegistry: vi.fn().mockReturnValue(mockMonitorRegistry),
233
+ };
234
+ mockClient = {
235
+ sessionUpdate: vi.fn().mockResolvedValue(undefined),
236
+ requestPermission: vi.fn().mockResolvedValue({
237
+ outcome: { outcome: 'selected', optionId: 'proceed_once' },
238
+ }),
239
+ extNotification: vi.fn().mockResolvedValue(undefined),
240
+ };
241
+ mockSettings = {
242
+ merged: {},
243
+ isTrusted: false,
244
+ user: { settings: {} },
245
+ workspace: { settings: {} },
246
+ setValue: vi.fn(),
247
+ };
248
+ getAvailableCommandsSpy = vi.mocked(nonInteractiveCliCommands)
249
+ .getAvailableCommands;
250
+ getAvailableCommandsSpy.mockResolvedValue([]);
251
+ session = new Session('test-session-id', mockConfig, mockClient, mockSettings);
252
+ });
253
+ afterEach(() => {
254
+ // Reset global runtime base dir state to prevent state leakage between tests
255
+ core.Storage.setRuntimeBaseDir(null);
256
+ // Clear session reference to allow garbage collection
257
+ session = undefined;
258
+ mockChat = undefined;
259
+ mockConfig = undefined;
260
+ mockClient = undefined;
261
+ mockSettings = undefined;
262
+ mockGeminiClient = undefined;
263
+ mockToolRegistry = undefined;
264
+ vi.restoreAllMocks();
265
+ vi.clearAllTimers();
266
+ });
267
+ describe('setMode', () => {
268
+ it.each([
269
+ ['plan', ApprovalMode.PLAN],
270
+ ['default', ApprovalMode.DEFAULT],
271
+ ['auto-edit', ApprovalMode.AUTO_EDIT],
272
+ ['yolo', ApprovalMode.YOLO],
273
+ ])('maps %s mode', async (modeId, expected) => {
274
+ await session.setMode({
275
+ sessionId: 'test-session-id',
276
+ modeId,
277
+ });
278
+ expect(mockConfig.setApprovalMode).toHaveBeenCalledWith(expected);
279
+ });
280
+ });
281
+ describe('rewindToTurn', () => {
282
+ it('truncates model history before the requested user turn and records rewind', () => {
283
+ const history = [
284
+ { role: 'user', parts: [{ text: 'first' }] },
285
+ { role: 'model', parts: [{ text: 'first reply' }] },
286
+ { role: 'user', parts: [{ text: 'second' }] },
287
+ { role: 'model', parts: [{ text: 'second reply' }] },
288
+ ];
289
+ vi.mocked(mockChat.getHistory).mockReturnValue(history);
290
+ vi.mocked(mockChat.getHistoryShallow).mockReturnValue(history);
291
+ const result = session.rewindToTurn(1);
292
+ expect(result).toEqual({ targetTurnIndex: 1, apiTruncateIndex: 2 });
293
+ expect(mockChat.truncateHistory).toHaveBeenCalledWith(2);
294
+ expect(mockChat.stripThoughtsFromHistory).toHaveBeenCalled();
295
+ expect(mockChatRecordingService.rewindRecording).toHaveBeenCalledWith(1, {
296
+ truncatedCount: 2,
297
+ });
298
+ });
299
+ it('preserves startup context when rewinding to the first user turn', () => {
300
+ const history = [
301
+ {
302
+ role: 'user',
303
+ parts: [
304
+ {
305
+ text: `${SYSTEM_REMINDER_OPEN}\nstartup context\n${SYSTEM_REMINDER_CLOSE}`,
306
+ },
307
+ ],
308
+ },
309
+ { role: 'user', parts: [{ text: 'first' }] },
310
+ { role: 'model', parts: [{ text: 'first reply' }] },
311
+ ];
312
+ vi.mocked(mockChat.getHistory).mockReturnValue(history);
313
+ vi.mocked(mockChat.getHistoryShallow).mockReturnValue(history);
314
+ const result = session.rewindToTurn(0);
315
+ expect(result).toEqual({ targetTurnIndex: 0, apiTruncateIndex: 1 });
316
+ expect(mockChat.truncateHistory).toHaveBeenCalledWith(1);
317
+ });
318
+ it('does not count a mid-history MCP added-tool reminder as a user turn', () => {
319
+ // drainPendingAddedMcpToolsReminder injects a pure <system-reminder>
320
+ // user entry mid-history. Counting it as a real turn would land the
321
+ // rewind one entry early, dropping the reminder plus a turn's context.
322
+ const history = [
323
+ {
324
+ role: 'user',
325
+ parts: [
326
+ {
327
+ text: `${SYSTEM_REMINDER_OPEN}\nstartup context\n${SYSTEM_REMINDER_CLOSE}`,
328
+ },
329
+ ],
330
+ },
331
+ { role: 'user', parts: [{ text: 'first' }] },
332
+ { role: 'model', parts: [{ text: 'first reply' }] },
333
+ {
334
+ role: 'user',
335
+ parts: [
336
+ {
337
+ text: `${SYSTEM_REMINDER_OPEN}\nNew tools available: foo\n${SYSTEM_REMINDER_CLOSE}`,
338
+ },
339
+ ],
340
+ },
341
+ { role: 'user', parts: [{ text: 'second' }] },
342
+ { role: 'model', parts: [{ text: 'second reply' }] },
343
+ ];
344
+ vi.mocked(mockChat.getHistory).mockReturnValue(history);
345
+ vi.mocked(mockChat.getHistoryShallow).mockReturnValue(history);
346
+ const result = session.rewindToTurn(1);
347
+ // Keep startup + turn 1 + the MCP reminder (indices 0–3); truncate at
348
+ // the second prompt (index 4). Counting the reminder would return 3.
349
+ expect(result).toEqual({ targetTurnIndex: 1, apiTruncateIndex: 4 });
350
+ expect(mockChat.truncateHistory).toHaveBeenCalledWith(4);
351
+ });
352
+ it('rejects unreachable user turns', () => {
353
+ const history = [{ role: 'user', parts: [{ text: 'first' }] }];
354
+ vi.mocked(mockChat.getHistory).mockReturnValue(history);
355
+ vi.mocked(mockChat.getHistoryShallow).mockReturnValue(history);
356
+ expect(() => session.rewindToTurn(2)).toThrow('Cannot rewind to the requested turn');
357
+ expect(mockChat.truncateHistory).not.toHaveBeenCalled();
358
+ });
359
+ it('rejects rewinds while a cron prompt is mutating history', () => {
360
+ session.cronProcessing = true;
361
+ expect(() => session.rewindToTurn(0)).toThrow('Cannot rewind while a prompt is running');
362
+ expect(mockChat.truncateHistory).not.toHaveBeenCalled();
363
+ });
364
+ it('rejects invalid target turn indexes', () => {
365
+ expect(() => session.rewindToTurn(-1)).toThrow('targetTurnIndex must be a non-negative integer');
366
+ expect(mockChat.truncateHistory).not.toHaveBeenCalled();
367
+ });
368
+ it('rejects rewinds while a prompt is running', () => {
369
+ session.pendingPrompt =
370
+ new AbortController();
371
+ expect(() => session.rewindToTurn(0)).toThrow('Cannot rewind while a prompt is running');
372
+ expect(mockChat.truncateHistory).not.toHaveBeenCalled();
373
+ });
374
+ it('rejects rewinds while a cron abort is active', () => {
375
+ session.cronAbortController = new AbortController();
376
+ expect(() => session.rewindToTurn(0)).toThrow('Cannot rewind while a prompt is running');
377
+ expect(mockChat.truncateHistory).not.toHaveBeenCalled();
378
+ });
379
+ it('rejects rewinds while a notification prompt is processing', () => {
380
+ session.notificationProcessing = true;
381
+ expect(() => session.rewindToTurn(0)).toThrow('Cannot rewind while a prompt is running');
382
+ expect(mockChat.truncateHistory).not.toHaveBeenCalled();
383
+ });
384
+ it('rejects rewinds while a notification abort controller is active', () => {
385
+ session.notificationAbortController = new AbortController();
386
+ expect(() => session.rewindToTurn(0)).toThrow('Cannot rewind while a prompt is running');
387
+ expect(mockChat.truncateHistory).not.toHaveBeenCalled();
388
+ });
389
+ it('restores a captured history snapshot', () => {
390
+ const history = [
391
+ { role: 'user', parts: [{ text: 'first' }] },
392
+ { role: 'model', parts: [{ text: 'first reply' }] },
393
+ ];
394
+ vi.mocked(mockChat.getHistoryShallow).mockReturnValue(history);
395
+ const snapshot = session.captureHistorySnapshot();
396
+ session.restoreHistory(snapshot);
397
+ expect(snapshot).toEqual(history);
398
+ expect(mockChat.setHistory).toHaveBeenCalledWith(history);
399
+ expect(mockChat.getHistory).not.toHaveBeenCalled();
400
+ });
401
+ it('rejects history restore while a prompt is running', () => {
402
+ session.pendingPrompt =
403
+ new AbortController();
404
+ expect(() => session.restoreHistory([])).toThrow('Cannot restore history while a prompt is running');
405
+ expect(mockChat.setHistory).not.toHaveBeenCalled();
406
+ });
407
+ it('rejects history restore while a cron prompt is mutating history', () => {
408
+ session.cronProcessing = true;
409
+ expect(() => session.restoreHistory([])).toThrow('Cannot restore history while a prompt is running');
410
+ expect(mockChat.setHistory).not.toHaveBeenCalled();
411
+ });
412
+ it('rejects history restore while a cron abort is active', () => {
413
+ session.cronAbortController = new AbortController();
414
+ expect(() => session.restoreHistory([])).toThrow('Cannot restore history while a prompt is running');
415
+ expect(mockChat.setHistory).not.toHaveBeenCalled();
416
+ });
417
+ it('rejects history restore while a notification prompt is processing', () => {
418
+ session.notificationProcessing = true;
419
+ expect(() => session.restoreHistory([])).toThrow('Cannot restore history while a prompt is running');
420
+ expect(mockChat.setHistory).not.toHaveBeenCalled();
421
+ });
422
+ it('rejects history restore while a notification abort controller is active', () => {
423
+ session.notificationAbortController = new AbortController();
424
+ expect(() => session.restoreHistory([])).toThrow('Cannot restore history while a prompt is running');
425
+ expect(mockChat.setHistory).not.toHaveBeenCalled();
426
+ });
427
+ });
428
+ describe('setModel', () => {
429
+ it('sets model via config and returns current model', async () => {
430
+ const requested = `qwen3-coder-plus(${AuthType.USE_OPENAI})`;
431
+ await session.setModel({
432
+ sessionId: 'test-session-id',
433
+ modelId: ` ${requested} `,
434
+ });
435
+ expect(mockConfig.switchModel).toHaveBeenCalledWith(AuthType.USE_OPENAI, 'qwen3-coder-plus', undefined);
436
+ expect(mockSettings.setValue).toHaveBeenCalledWith(SettingScope.User, 'model.name', 'qwen3-coder-plus');
437
+ expect(mockSettings.setValue).toHaveBeenCalledWith(SettingScope.User, 'security.auth.selectedType', AuthType.USE_OPENAI);
438
+ });
439
+ it('rejects empty/whitespace model IDs', async () => {
440
+ await expect(session.setModel({
441
+ sessionId: 'test-session-id',
442
+ modelId: ' ',
443
+ })).rejects.toThrow('Invalid params');
444
+ expect(mockConfig.switchModel).not.toHaveBeenCalled();
445
+ expect(mockSettings.setValue).not.toHaveBeenCalled();
446
+ });
447
+ it('can switch the session model without persisting a new default', async () => {
448
+ await session.setModel({
449
+ sessionId: 'test-session-id',
450
+ modelId: `qwen3-coder-flash(${AuthType.USE_OPENAI})`,
451
+ }, { persistDefault: false });
452
+ expect(mockConfig.switchModel).toHaveBeenCalledWith(AuthType.USE_OPENAI, 'qwen3-coder-flash', undefined);
453
+ expect(mockSettings.setValue).not.toHaveBeenCalled();
454
+ });
455
+ it('propagates errors from config.switchModel', async () => {
456
+ const configError = new Error('Invalid model');
457
+ switchModelSpy.mockRejectedValueOnce(configError);
458
+ await expect(session.setModel({
459
+ sessionId: 'test-session-id',
460
+ modelId: `invalid-model(${AuthType.USE_OPENAI})`,
461
+ })).rejects.toThrow('Invalid model');
462
+ expect(mockSettings.setValue).not.toHaveBeenCalled();
463
+ });
464
+ });
465
+ describe('sendAvailableCommandsUpdate', () => {
466
+ it('sends available_commands_update from getAvailableCommands()', async () => {
467
+ getAvailableCommandsSpy.mockResolvedValueOnce([
468
+ {
469
+ name: 'init',
470
+ description: 'Initialize project context',
471
+ kind: 'built-in',
472
+ argumentHint: '[path]',
473
+ source: 'builtin-command',
474
+ sourceLabel: 'Built-in',
475
+ supportedModes: ['interactive', 'non_interactive', 'acp'],
476
+ modelInvocable: false,
477
+ subCommands: [
478
+ {
479
+ name: 'visible',
480
+ description: 'Visible subcommand',
481
+ kind: CommandKind.BUILT_IN,
482
+ },
483
+ {
484
+ name: 'hidden',
485
+ description: 'Hidden subcommand',
486
+ kind: CommandKind.BUILT_IN,
487
+ hidden: true,
488
+ },
489
+ ],
490
+ },
491
+ ]);
492
+ await session.sendAvailableCommandsUpdate();
493
+ expect(getAvailableCommandsSpy).toHaveBeenCalledWith(mockConfig, expect.any(AbortSignal), 'acp');
494
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
495
+ sessionId: 'test-session-id',
496
+ update: {
497
+ sessionUpdate: 'available_commands_update',
498
+ availableCommands: [
499
+ {
500
+ name: 'init',
501
+ description: 'Initialize project context',
502
+ input: { hint: '[path]' },
503
+ _meta: {
504
+ argumentHint: '[path]',
505
+ source: 'builtin-command',
506
+ sourceLabel: 'Built-in',
507
+ supportedModes: ['interactive', 'non_interactive', 'acp'],
508
+ subcommands: ['visible'],
509
+ modelInvocable: false,
510
+ },
511
+ },
512
+ ],
513
+ },
514
+ });
515
+ });
516
+ it('forwards command descriptions from getAvailableCommands()', async () => {
517
+ getAvailableCommandsSpy.mockResolvedValueOnce([
518
+ {
519
+ name: 'review',
520
+ description: '审查代码变更',
521
+ kind: CommandKind.SKILL,
522
+ source: 'skill-dir-command',
523
+ sourceLabel: '用户',
524
+ sourceDetail: 'user',
525
+ supportedModes: ['acp'],
526
+ },
527
+ ]);
528
+ await session.sendAvailableCommandsUpdate();
529
+ expect(getAvailableCommandsSpy).toHaveBeenCalledWith(mockConfig, expect.any(AbortSignal), 'acp');
530
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
531
+ sessionId: 'test-session-id',
532
+ update: {
533
+ sessionUpdate: 'available_commands_update',
534
+ availableCommands: [
535
+ {
536
+ name: 'review',
537
+ description: '审查代码变更',
538
+ input: { hint: '' },
539
+ _meta: {
540
+ argumentHint: undefined,
541
+ source: 'skill-dir-command',
542
+ sourceLabel: '用户',
543
+ supportedModes: ['acp'],
544
+ subcommands: [],
545
+ modelInvocable: false,
546
+ },
547
+ },
548
+ ],
549
+ },
550
+ });
551
+ });
552
+ it('sets input for built-in commands with subCommands', async () => {
553
+ getAvailableCommandsSpy.mockResolvedValueOnce([
554
+ {
555
+ name: 'export',
556
+ description: 'Export conversation history',
557
+ kind: 'built-in',
558
+ subCommands: [
559
+ { name: 'md', description: 'Export as markdown', kind: 'built-in' },
560
+ ],
561
+ },
562
+ ]);
563
+ await session.sendAvailableCommandsUpdate();
564
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
565
+ sessionId: 'test-session-id',
566
+ update: {
567
+ sessionUpdate: 'available_commands_update',
568
+ availableCommands: [
569
+ {
570
+ name: 'export',
571
+ description: 'Export conversation history',
572
+ input: { hint: '' },
573
+ _meta: {
574
+ argumentHint: undefined,
575
+ source: undefined,
576
+ sourceLabel: undefined,
577
+ supportedModes: ['interactive'],
578
+ subcommands: ['md'],
579
+ modelInvocable: false,
580
+ },
581
+ },
582
+ ],
583
+ },
584
+ });
585
+ });
586
+ it('honors explicit no-input override for built-in commands with subCommands', async () => {
587
+ getAvailableCommandsSpy.mockResolvedValueOnce([
588
+ {
589
+ name: 'doctor',
590
+ description: 'Run installation and environment diagnostics',
591
+ kind: 'built-in',
592
+ acceptsInput: false,
593
+ subCommands: [
594
+ {
595
+ name: 'memory',
596
+ description: 'Show current process memory diagnostics',
597
+ kind: 'built-in',
598
+ },
599
+ ],
600
+ },
601
+ ]);
602
+ await session.sendAvailableCommandsUpdate();
603
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith(expect.objectContaining({
604
+ sessionId: 'test-session-id',
605
+ update: expect.objectContaining({
606
+ sessionUpdate: 'available_commands_update',
607
+ availableCommands: expect.arrayContaining([
608
+ expect.objectContaining({
609
+ name: 'doctor',
610
+ description: 'Run installation and environment diagnostics',
611
+ input: null,
612
+ }),
613
+ ]),
614
+ }),
615
+ }));
616
+ });
617
+ it('honors explicit input override for built-in commands without input metadata', async () => {
618
+ getAvailableCommandsSpy.mockResolvedValueOnce([
619
+ {
620
+ name: 'diagnostics',
621
+ description: 'Run diagnostics',
622
+ kind: 'built-in',
623
+ acceptsInput: true,
624
+ },
625
+ ]);
626
+ await session.sendAvailableCommandsUpdate();
627
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith(expect.objectContaining({
628
+ sessionId: 'test-session-id',
629
+ update: expect.objectContaining({
630
+ sessionUpdate: 'available_commands_update',
631
+ availableCommands: expect.arrayContaining([
632
+ expect.objectContaining({
633
+ name: 'diagnostics',
634
+ description: 'Run diagnostics',
635
+ input: { hint: '' },
636
+ }),
637
+ ]),
638
+ }),
639
+ }));
640
+ });
641
+ it('attaches available skills to available_commands_update metadata', async () => {
642
+ getAvailableCommandsSpy.mockResolvedValueOnce([
643
+ {
644
+ name: 'init',
645
+ description: 'Initialize project context',
646
+ kind: 'built-in',
647
+ },
648
+ ]);
649
+ mockConfig.getSkillManager = vi.fn().mockReturnValue({
650
+ listSkills: vi.fn().mockResolvedValue([
651
+ {
652
+ name: 'code-review-expert',
653
+ description: 'Review code changes',
654
+ body: 'Review instructions',
655
+ filePath: '/skills/code-review-expert/SKILL.md',
656
+ level: 'user',
657
+ },
658
+ {
659
+ name: 'verification-pack',
660
+ description: 'Verify changes',
661
+ body: 'Verification instructions',
662
+ filePath: '/skills/verification-pack/SKILL.md',
663
+ level: 'project',
664
+ },
665
+ ]),
666
+ });
667
+ await session.sendAvailableCommandsUpdate();
668
+ expect(mockClient.sessionUpdate).toHaveBeenCalledTimes(1);
669
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
670
+ sessionId: 'test-session-id',
671
+ update: {
672
+ sessionUpdate: 'available_commands_update',
673
+ availableCommands: [
674
+ {
675
+ name: 'init',
676
+ description: 'Initialize project context',
677
+ input: null,
678
+ _meta: {
679
+ argumentHint: undefined,
680
+ source: undefined,
681
+ sourceLabel: undefined,
682
+ supportedModes: ['interactive'],
683
+ subcommands: [],
684
+ modelInvocable: false,
685
+ },
686
+ },
687
+ ],
688
+ _meta: {
689
+ availableSkills: ['code-review-expert', 'verification-pack'],
690
+ availableSkillDetails: [
691
+ {
692
+ name: 'code-review-expert',
693
+ description: 'Review code changes',
694
+ body: 'Review instructions',
695
+ filePath: '/skills/code-review-expert/SKILL.md',
696
+ level: 'user',
697
+ modelInvocable: true,
698
+ },
699
+ {
700
+ name: 'verification-pack',
701
+ description: 'Verify changes',
702
+ body: 'Verification instructions',
703
+ filePath: '/skills/verification-pack/SKILL.md',
704
+ level: 'project',
705
+ modelInvocable: true,
706
+ },
707
+ ],
708
+ },
709
+ },
710
+ });
711
+ });
712
+ it('derives skill details from skill slash commands', async () => {
713
+ getAvailableCommandsSpy.mockResolvedValueOnce([
714
+ {
715
+ name: 'batch',
716
+ description: 'Run a batch operation',
717
+ kind: 'skill',
718
+ argumentHint: '<operation> <file-pattern>',
719
+ skillDetail: {
720
+ name: 'batch',
721
+ description: 'Run a batch operation',
722
+ body: 'Batch instructions',
723
+ level: 'bundled',
724
+ },
725
+ },
726
+ ]);
727
+ mockConfig.getSkillManager = vi.fn().mockReturnValue(null);
728
+ await session.sendAvailableCommandsUpdate();
729
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
730
+ sessionId: 'test-session-id',
731
+ update: {
732
+ sessionUpdate: 'available_commands_update',
733
+ availableCommands: [
734
+ {
735
+ name: 'batch',
736
+ description: 'Run a batch operation',
737
+ input: { hint: '<operation> <file-pattern>' },
738
+ _meta: {
739
+ argumentHint: '<operation> <file-pattern>',
740
+ source: undefined,
741
+ sourceLabel: undefined,
742
+ supportedModes: ['interactive', 'non_interactive', 'acp'],
743
+ subcommands: [],
744
+ modelInvocable: false,
745
+ },
746
+ },
747
+ ],
748
+ _meta: {
749
+ availableSkills: ['batch'],
750
+ availableSkillDetails: [
751
+ {
752
+ name: 'batch',
753
+ description: 'Run a batch operation',
754
+ body: 'Batch instructions',
755
+ level: 'bundled',
756
+ modelInvocable: false,
757
+ },
758
+ ],
759
+ },
760
+ },
761
+ });
762
+ });
763
+ it('derives availableSkills from skillManager and skill slash commands combined', async () => {
764
+ // Both sources contribute: a skillManager skill AND a bundled skill
765
+ // slash-command. The unconditional derivation must list both and keep
766
+ // availableSkills consistent with availableSkillDetails (the `??=` fix).
767
+ getAvailableCommandsSpy.mockResolvedValueOnce([
768
+ {
769
+ name: 'batch',
770
+ description: 'Run a batch operation',
771
+ kind: 'skill',
772
+ skillDetail: {
773
+ name: 'batch',
774
+ description: 'Run a batch operation',
775
+ body: 'Batch instructions',
776
+ level: 'bundled',
777
+ },
778
+ },
779
+ ]);
780
+ mockConfig.getSkillManager = vi.fn().mockReturnValue({
781
+ listSkills: vi.fn().mockResolvedValue([
782
+ {
783
+ name: 'mgr-skill',
784
+ description: 'From the skill manager',
785
+ body: 'Manager instructions',
786
+ filePath: '/skills/mgr-skill/SKILL.md',
787
+ level: 'user',
788
+ },
789
+ ]),
790
+ });
791
+ await session.sendAvailableCommandsUpdate();
792
+ const meta = vi.mocked(mockClient.sessionUpdate).mock.calls.at(-1)[0].update._meta;
793
+ expect(meta.availableSkills).toEqual(expect.arrayContaining(['mgr-skill', 'batch']));
794
+ expect(meta.availableSkills).toHaveLength(2);
795
+ // Name list stays in lockstep with the details list.
796
+ expect([...meta.availableSkills].sort()).toEqual(meta.availableSkillDetails.map((detail) => detail.name).sort());
797
+ });
798
+ it('swallows errors and does not throw', async () => {
799
+ getAvailableCommandsSpy.mockRejectedValueOnce(new Error('Command discovery failed'));
800
+ await expect(session.sendAvailableCommandsUpdate()).resolves.toBeUndefined();
801
+ expect(mockClient.sessionUpdate).not.toHaveBeenCalled();
802
+ });
803
+ });
804
+ describe('prompt', () => {
805
+ it('drains background task notifications through ACP after the prompt is idle', async () => {
806
+ mockChat.sendMessageStream = vi
807
+ .fn()
808
+ .mockResolvedValueOnce(createEmptyStream())
809
+ .mockResolvedValueOnce(createStreamWithChunks([
810
+ {
811
+ type: core.StreamEventType.CHUNK,
812
+ value: {
813
+ candidates: [
814
+ {
815
+ content: {
816
+ parts: [{ text: 'I saw the background result.' }],
817
+ },
818
+ },
819
+ ],
820
+ },
821
+ },
822
+ ]));
823
+ await session.prompt({
824
+ sessionId: 'test-session-id',
825
+ prompt: [{ type: 'text', text: 'start background work' }],
826
+ });
827
+ const callback = mockBackgroundTaskRegistry.setNotificationCallback.mock
828
+ .calls[0][0];
829
+ callback('Background agent "worker" completed.', '<task-notification><status>completed</status></task-notification>', {
830
+ agentId: 'agent-1',
831
+ status: 'completed',
832
+ toolUseId: 'tool-1',
833
+ });
834
+ await vi.waitFor(() => {
835
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(2);
836
+ });
837
+ expect(mockChat.sendMessageStream).toHaveBeenNthCalledWith(2, 'qwen3-code-plus', {
838
+ message: [
839
+ {
840
+ text: '<task-notification><status>completed</status></task-notification>',
841
+ },
842
+ ],
843
+ config: { abortSignal: expect.any(AbortSignal) },
844
+ }, expect.stringMatching(/^test-session-id########notification\d+$/));
845
+ expect(mockChatRecordingService.recordNotification).toHaveBeenCalledWith([
846
+ {
847
+ text: '<task-notification><status>completed</status></task-notification>',
848
+ },
849
+ ], 'Background agent "worker" completed.');
850
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
851
+ sessionId: 'test-session-id',
852
+ update: {
853
+ sessionUpdate: 'agent_message_chunk',
854
+ content: {
855
+ type: 'text',
856
+ text: 'Background agent "worker" completed.',
857
+ },
858
+ _meta: {
859
+ source: 'background_notification',
860
+ qwenDiscreteMessage: true,
861
+ backgroundTask: {
862
+ taskId: 'agent-1',
863
+ status: 'completed',
864
+ kind: 'agent',
865
+ toolUseId: 'tool-1',
866
+ },
867
+ },
868
+ },
869
+ });
870
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
871
+ sessionId: 'test-session-id',
872
+ update: {
873
+ sessionUpdate: 'agent_message_chunk',
874
+ content: { type: 'text', text: 'I saw the background result.' },
875
+ _meta: {
876
+ source: 'background_notification_response',
877
+ qwenDiscreteMessage: true,
878
+ backgroundTask: {
879
+ taskId: 'agent-1',
880
+ status: 'completed',
881
+ kind: 'agent',
882
+ toolUseId: 'tool-1',
883
+ },
884
+ },
885
+ },
886
+ });
887
+ expect(mockClient.extNotification).toHaveBeenCalledWith('_qwencode/end_turn', {
888
+ sessionId: 'test-session-id',
889
+ reason: 'end_turn',
890
+ source: 'background_notification',
891
+ });
892
+ });
893
+ it('cancels an in-flight background notification prompt', async () => {
894
+ const notificationCompression = {
895
+ signal: undefined,
896
+ };
897
+ mockGeminiClient.tryCompressChat = vi
898
+ .fn()
899
+ .mockResolvedValueOnce({
900
+ originalTokenCount: 0,
901
+ newTokenCount: 0,
902
+ compressionStatus: core.CompressionStatus.NOOP,
903
+ })
904
+ .mockImplementationOnce(async (_promptId, _force, signal) => {
905
+ notificationCompression.signal = signal;
906
+ await new Promise((resolve) => {
907
+ signal.addEventListener('abort', () => resolve(), {
908
+ once: true,
909
+ });
910
+ });
911
+ return {
912
+ originalTokenCount: 0,
913
+ newTokenCount: 0,
914
+ compressionStatus: core.CompressionStatus.NOOP,
915
+ };
916
+ });
917
+ mockChat.sendMessageStream = vi
918
+ .fn()
919
+ .mockResolvedValueOnce(createEmptyStream())
920
+ .mockResolvedValueOnce(createEmptyStream());
921
+ await session.prompt({
922
+ sessionId: 'test-session-id',
923
+ prompt: [{ type: 'text', text: 'start background work' }],
924
+ });
925
+ const callback = mockBackgroundTaskRegistry.setNotificationCallback.mock
926
+ .calls[0][0];
927
+ callback('done', '<task-notification />', {
928
+ agentId: 'agent-1',
929
+ status: 'completed',
930
+ });
931
+ await vi.waitFor(() => {
932
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenCalledTimes(2);
933
+ });
934
+ await session.cancelPendingPrompt();
935
+ expect(notificationCompression.signal?.aborted).toBe(true);
936
+ await vi.waitFor(() => {
937
+ expect(mockClient.extNotification).toHaveBeenCalledWith('_qwencode/end_turn', {
938
+ sessionId: 'test-session-id',
939
+ reason: 'cancelled',
940
+ source: 'background_notification',
941
+ });
942
+ });
943
+ });
944
+ it('aborts an in-flight background notification before accepting a user prompt', async () => {
945
+ const noopCompression = {
946
+ originalTokenCount: 0,
947
+ newTokenCount: 0,
948
+ compressionStatus: core.CompressionStatus.NOOP,
949
+ };
950
+ let notificationSignal;
951
+ mockGeminiClient.tryCompressChat = vi
952
+ .fn()
953
+ .mockResolvedValueOnce(noopCompression)
954
+ .mockImplementationOnce(async (_promptId, _force, signal) => {
955
+ notificationSignal = signal;
956
+ await new Promise((resolve) => {
957
+ signal.addEventListener('abort', () => resolve(), {
958
+ once: true,
959
+ });
960
+ });
961
+ return noopCompression;
962
+ })
963
+ .mockResolvedValue(noopCompression);
964
+ mockChat.sendMessageStream = vi
965
+ .fn()
966
+ .mockResolvedValue(createEmptyStream());
967
+ await session.prompt({
968
+ sessionId: 'test-session-id',
969
+ prompt: [{ type: 'text', text: 'start background work' }],
970
+ });
971
+ const callback = mockBackgroundTaskRegistry.setNotificationCallback.mock
972
+ .calls[0][0];
973
+ callback('done', '<task-notification />', {
974
+ agentId: 'agent-1',
975
+ status: 'completed',
976
+ });
977
+ await vi.waitFor(() => {
978
+ expect(notificationSignal).toBeDefined();
979
+ });
980
+ await expect(session.prompt({
981
+ sessionId: 'test-session-id',
982
+ prompt: [{ type: 'text', text: 'interrupt notification' }],
983
+ })).resolves.toEqual({ stopReason: 'end_turn' });
984
+ expect(notificationSignal?.aborted).toBe(true);
985
+ });
986
+ it('drops oldest background notifications when the queue reaches its cap', () => {
987
+ session.pendingPrompt = new AbortController();
988
+ const callback = mockBackgroundTaskRegistry.setNotificationCallback.mock
989
+ .calls[0][0];
990
+ for (let index = 0; index < 25; index++) {
991
+ callback(`done ${index}`, `<task-notification>${index}</task-notification>`, {
992
+ agentId: `agent-${index}`,
993
+ status: 'completed',
994
+ });
995
+ }
996
+ const queued = session.notificationQueue;
997
+ expect(queued).toHaveLength(20);
998
+ expect(queued[0]?.taskId).toBe('agent-5');
999
+ expect(queued.at(-1)?.taskId).toBe('agent-24');
1000
+ });
1001
+ it('emits end_turn even when notification error display fails', async () => {
1002
+ mockChat.sendMessageStream = vi
1003
+ .fn()
1004
+ .mockResolvedValueOnce(createEmptyStream())
1005
+ .mockRejectedValueOnce(new Error('notification blew up'));
1006
+ mockClient.sessionUpdate = vi.fn().mockImplementation(async (params) => {
1007
+ const text = params.update?.content?.text;
1008
+ if (text?.includes('[notification error]')) {
1009
+ throw new Error('display failed');
1010
+ }
1011
+ });
1012
+ await session.prompt({
1013
+ sessionId: 'test-session-id',
1014
+ prompt: [{ type: 'text', text: 'start background work' }],
1015
+ });
1016
+ const callback = mockBackgroundTaskRegistry.setNotificationCallback.mock
1017
+ .calls[0][0];
1018
+ callback('done', '<task-notification />', {
1019
+ agentId: 'agent-1',
1020
+ status: 'completed',
1021
+ });
1022
+ await vi.waitFor(() => {
1023
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
1024
+ sessionId: 'test-session-id',
1025
+ update: expect.objectContaining({
1026
+ content: expect.objectContaining({
1027
+ text: expect.stringContaining('[notification error]'),
1028
+ }),
1029
+ }),
1030
+ });
1031
+ expect(mockClient.extNotification).toHaveBeenCalledWith('_qwencode/end_turn', {
1032
+ sessionId: 'test-session-id',
1033
+ reason: 'end_turn',
1034
+ source: 'background_notification',
1035
+ });
1036
+ });
1037
+ });
1038
+ it('flushes notification rewrite metadata even without usage metadata', async () => {
1039
+ const flushTurn = vi.fn().mockResolvedValue(undefined);
1040
+ const waitForPendingRewrites = vi.fn().mockResolvedValue(undefined);
1041
+ const interceptUpdate = vi.fn().mockResolvedValue(undefined);
1042
+ session.messageRewriter = {
1043
+ interceptUpdate,
1044
+ flushTurn,
1045
+ waitForPendingRewrites,
1046
+ };
1047
+ mockChat.sendMessageStream = vi
1048
+ .fn()
1049
+ .mockResolvedValueOnce(createEmptyStream())
1050
+ .mockResolvedValueOnce(createStreamWithChunks([
1051
+ {
1052
+ type: core.StreamEventType.CHUNK,
1053
+ value: {
1054
+ candidates: [
1055
+ {
1056
+ content: {
1057
+ parts: [{ text: 'notification response' }],
1058
+ },
1059
+ },
1060
+ ],
1061
+ },
1062
+ },
1063
+ ]));
1064
+ await session.prompt({
1065
+ sessionId: 'test-session-id',
1066
+ prompt: [{ type: 'text', text: 'start background work' }],
1067
+ });
1068
+ const callback = mockBackgroundTaskRegistry.setNotificationCallback.mock
1069
+ .calls[0][0];
1070
+ callback('done', '<task-notification />', {
1071
+ agentId: 'agent-1',
1072
+ status: 'completed',
1073
+ });
1074
+ await vi.waitFor(() => {
1075
+ expect(flushTurn).toHaveBeenCalled();
1076
+ });
1077
+ });
1078
+ it('does not enqueue running monitor notifications for model follow-up', async () => {
1079
+ mockChat.sendMessageStream = vi
1080
+ .fn()
1081
+ .mockResolvedValue(createEmptyStream());
1082
+ await session.prompt({
1083
+ sessionId: 'test-session-id',
1084
+ prompt: [{ type: 'text', text: 'start monitor' }],
1085
+ });
1086
+ const callback = mockMonitorRegistry.setNotificationCallback.mock
1087
+ .calls[0][0];
1088
+ callback('Monitor "dev server" event #1: ready', '<task-notification><status>running</status></task-notification>', {
1089
+ monitorId: 'monitor-1',
1090
+ status: 'running',
1091
+ toolUseId: 'tool-1',
1092
+ });
1093
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(1);
1094
+ expect(mockChatRecordingService.recordNotification).not.toHaveBeenCalled();
1095
+ expect(mockClient.sessionUpdate).not.toHaveBeenCalledWith({
1096
+ sessionId: 'test-session-id',
1097
+ update: expect.objectContaining({
1098
+ _meta: expect.objectContaining({
1099
+ backgroundTask: expect.objectContaining({
1100
+ taskId: 'monitor-1',
1101
+ status: 'running',
1102
+ }),
1103
+ }),
1104
+ }),
1105
+ });
1106
+ });
1107
+ it('drains background shell notifications through ACP after the prompt is idle', async () => {
1108
+ mockChat.sendMessageStream = vi
1109
+ .fn()
1110
+ .mockResolvedValueOnce(createEmptyStream())
1111
+ .mockResolvedValueOnce(createStreamWithChunks([
1112
+ {
1113
+ type: core.StreamEventType.CHUNK,
1114
+ value: {
1115
+ candidates: [
1116
+ {
1117
+ content: {
1118
+ parts: [{ text: 'The shell finished successfully.' }],
1119
+ },
1120
+ },
1121
+ ],
1122
+ },
1123
+ },
1124
+ ]));
1125
+ await session.prompt({
1126
+ sessionId: 'test-session-id',
1127
+ prompt: [{ type: 'text', text: 'start background shell' }],
1128
+ });
1129
+ const callback = mockBackgroundShellRegistry.setNotificationCallback.mock
1130
+ .calls[0][0];
1131
+ callback('Background shell "npm test" completed.', '<task-notification><kind>shell</kind></task-notification>', {
1132
+ shellId: 'shell-1',
1133
+ status: 'completed',
1134
+ });
1135
+ await vi.waitFor(() => {
1136
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(2);
1137
+ });
1138
+ expect(mockChat.sendMessageStream).toHaveBeenNthCalledWith(2, 'qwen3-code-plus', {
1139
+ message: [
1140
+ {
1141
+ text: '<task-notification><kind>shell</kind></task-notification>',
1142
+ },
1143
+ ],
1144
+ config: { abortSignal: expect.any(AbortSignal) },
1145
+ }, expect.stringMatching(/^test-session-id########notification\d+$/));
1146
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
1147
+ sessionId: 'test-session-id',
1148
+ update: {
1149
+ sessionUpdate: 'agent_message_chunk',
1150
+ content: {
1151
+ type: 'text',
1152
+ text: 'Background shell "npm test" completed.',
1153
+ },
1154
+ _meta: {
1155
+ source: 'background_notification',
1156
+ qwenDiscreteMessage: true,
1157
+ backgroundTask: {
1158
+ taskId: 'shell-1',
1159
+ status: 'completed',
1160
+ kind: 'shell',
1161
+ toolUseId: undefined,
1162
+ },
1163
+ },
1164
+ },
1165
+ });
1166
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
1167
+ sessionId: 'test-session-id',
1168
+ update: {
1169
+ sessionUpdate: 'agent_message_chunk',
1170
+ content: {
1171
+ type: 'text',
1172
+ text: 'The shell finished successfully.',
1173
+ },
1174
+ _meta: {
1175
+ source: 'background_notification_response',
1176
+ qwenDiscreteMessage: true,
1177
+ backgroundTask: {
1178
+ taskId: 'shell-1',
1179
+ status: 'completed',
1180
+ kind: 'shell',
1181
+ toolUseId: undefined,
1182
+ },
1183
+ },
1184
+ },
1185
+ });
1186
+ });
1187
+ it('continues ACP prompt ids after replaying resumed history', async () => {
1188
+ mockChat.sendMessageStream = vi
1189
+ .fn()
1190
+ .mockResolvedValue(createEmptyStream());
1191
+ await session.replayHistory([
1192
+ chatRecord({
1193
+ uuid: 'user-1',
1194
+ promptId: 'test-session-id########1',
1195
+ message: { parts: [{ text: '1' }] },
1196
+ }),
1197
+ chatRecord({
1198
+ uuid: 'assistant-1',
1199
+ timestamp: '2026-05-17T07:27:18.861Z',
1200
+ type: 'assistant',
1201
+ promptId: 'test-session-id########1',
1202
+ message: { parts: [{ text: 'answer 1' }] },
1203
+ }),
1204
+ chatRecord({
1205
+ uuid: 'user-2',
1206
+ timestamp: '2026-05-17T07:27:20.446Z',
1207
+ promptId: 'test-session-id########2',
1208
+ message: { parts: [{ text: '2' }] },
1209
+ }),
1210
+ ]);
1211
+ await expect(session.prompt({
1212
+ sessionId: 'test-session-id',
1213
+ prompt: [{ type: 'text', text: '3' }],
1214
+ })).resolves.toEqual({ stopReason: 'end_turn' });
1215
+ expect(mockChatRecordingService.recordUserMessage).toHaveBeenCalledWith('3');
1216
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenCalledWith('test-session-id########3', false, expect.any(AbortSignal));
1217
+ });
1218
+ describe('auto-compress', () => {
1219
+ it('runs automatic compression before sending an ACP prompt', async () => {
1220
+ mockChat.sendMessageStream = vi
1221
+ .fn()
1222
+ .mockResolvedValue(createEmptyStream());
1223
+ await session.prompt({
1224
+ sessionId: 'test-session-id',
1225
+ prompt: [{ type: 'text', text: 'hello' }],
1226
+ });
1227
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenCalledWith('test-session-id########1', false, expect.any(AbortSignal));
1228
+ const sendMessageStream = mockChat.sendMessageStream;
1229
+ expectCompressBeforeSend(mockGeminiClient.tryCompressChat, sendMessageStream, 0);
1230
+ });
1231
+ it('uses the current chat after automatic compression replaces it', async () => {
1232
+ const compressedChat = {
1233
+ sendMessageStream: vi.fn().mockResolvedValue(createEmptyStream()),
1234
+ addHistory: vi.fn(),
1235
+ getHistory: vi.fn().mockReturnValue([]),
1236
+ getHistoryShallow: vi.fn().mockReturnValue([]),
1237
+ getLastModelMessageText: vi.fn().mockReturnValue(''),
1238
+ };
1239
+ mockChat.sendMessageStream = vi
1240
+ .fn()
1241
+ .mockResolvedValue(createEmptyStream());
1242
+ mockGeminiClient.tryCompressChat.mockImplementation(async () => {
1243
+ mockGeminiClient.getChat.mockReturnValue(compressedChat);
1244
+ return {
1245
+ originalTokenCount: 1000,
1246
+ newTokenCount: 200,
1247
+ compressionStatus: core.CompressionStatus.COMPRESSED,
1248
+ };
1249
+ });
1250
+ await session.prompt({
1251
+ sessionId: 'test-session-id',
1252
+ prompt: [{ type: 'text', text: 'hello' }],
1253
+ });
1254
+ expect(mockChat.sendMessageStream).not.toHaveBeenCalled();
1255
+ expect(compressedChat.sendMessageStream).toHaveBeenCalledWith('qwen3-code-plus', {
1256
+ message: expect.any(Array),
1257
+ config: { abortSignal: expect.any(AbortSignal) },
1258
+ }, 'test-session-id########1');
1259
+ });
1260
+ it('emits an ACP-visible update when automatic compression succeeds', async () => {
1261
+ mockGeminiClient.tryCompressChat.mockResolvedValueOnce({
1262
+ originalTokenCount: 1200,
1263
+ newTokenCount: 450,
1264
+ compressionStatus: core.CompressionStatus.COMPRESSED,
1265
+ });
1266
+ mockChat.sendMessageStream = vi
1267
+ .fn()
1268
+ .mockResolvedValue(createEmptyStream());
1269
+ await session.prompt({
1270
+ sessionId: 'test-session-id',
1271
+ prompt: [{ type: 'text', text: 'hello' }],
1272
+ });
1273
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
1274
+ sessionId: 'test-session-id',
1275
+ update: {
1276
+ sessionUpdate: 'agent_message_chunk',
1277
+ content: {
1278
+ type: 'text',
1279
+ text: 'IMPORTANT: This conversation approached the input token limit for qwen3-code-plus. ' +
1280
+ 'A compressed context will be sent for future messages (compressed from: 1200 to 450 tokens).',
1281
+ },
1282
+ },
1283
+ });
1284
+ });
1285
+ it('labels the notice as screenshot-triggered when triggerReason is image_overflow', async () => {
1286
+ mockGeminiClient.tryCompressChat.mockResolvedValueOnce({
1287
+ originalTokenCount: 1200,
1288
+ newTokenCount: 450,
1289
+ compressionStatus: core.CompressionStatus.COMPRESSED,
1290
+ triggerReason: 'image_overflow',
1291
+ });
1292
+ mockChat.sendMessageStream = vi
1293
+ .fn()
1294
+ .mockResolvedValue(createEmptyStream());
1295
+ await session.prompt({
1296
+ sessionId: 'test-session-id',
1297
+ prompt: [{ type: 'text', text: 'hello' }],
1298
+ });
1299
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
1300
+ sessionId: 'test-session-id',
1301
+ update: {
1302
+ sessionUpdate: 'agent_message_chunk',
1303
+ content: {
1304
+ type: 'text',
1305
+ text: 'IMPORTANT: This conversation accumulated enough tool screenshots to trigger compaction for qwen3-code-plus. ' +
1306
+ 'A compressed context will be sent for future messages (compressed from: 1200 to 450 tokens).',
1307
+ },
1308
+ },
1309
+ });
1310
+ });
1311
+ it('continues sending when automatic compression fails', async () => {
1312
+ mockGeminiClient.tryCompressChat.mockRejectedValueOnce(new Error('compression rate limited'));
1313
+ mockChat.sendMessageStream = vi
1314
+ .fn()
1315
+ .mockResolvedValue(createEmptyStream());
1316
+ await session.prompt({
1317
+ sessionId: 'test-session-id',
1318
+ prompt: [{ type: 'text', text: 'hello' }],
1319
+ });
1320
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenCalledWith('test-session-id########1', false, expect.any(AbortSignal));
1321
+ expect(mockChat.sendMessageStream).toHaveBeenCalledWith('qwen3-code-plus', {
1322
+ message: expect.any(Array),
1323
+ config: { abortSignal: expect.any(AbortSignal) },
1324
+ }, 'test-session-id########1');
1325
+ });
1326
+ it('does not use global UI telemetry when compression fails before local token counts exist', async () => {
1327
+ mockConfig.getSessionTokenLimit = vi.fn().mockReturnValue(100);
1328
+ vi.spyOn(core.uiTelemetryService, 'getLastPromptTokenCount').mockReturnValue(101);
1329
+ mockGeminiClient.tryCompressChat.mockRejectedValueOnce(new Error('compression rate limited'));
1330
+ mockChat.sendMessageStream = vi
1331
+ .fn()
1332
+ .mockResolvedValue(createEmptyStream());
1333
+ await expect(session.prompt({
1334
+ sessionId: 'test-session-id',
1335
+ prompt: [{ type: 'text', text: 'hello' }],
1336
+ })).resolves.toEqual({ stopReason: 'end_turn' });
1337
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(1);
1338
+ expect(mockClient.sessionUpdate).not.toHaveBeenCalledWith(expect.objectContaining({
1339
+ update: expect.objectContaining({
1340
+ sessionUpdate: 'agent_message_chunk',
1341
+ content: expect.objectContaining({
1342
+ text: expect.stringContaining('Session token limit exceeded'),
1343
+ }),
1344
+ }),
1345
+ }));
1346
+ });
1347
+ it('returns cancelled when automatic compression is aborted', async () => {
1348
+ mockConfig.getSessionTokenLimit = vi.fn().mockReturnValue(100);
1349
+ mockGeminiClient.tryCompressChat.mockImplementation(async (_promptId, _force, signal) => new Promise((_, reject) => {
1350
+ signal.addEventListener('abort', () => {
1351
+ const abortError = new Error('aborted');
1352
+ abortError.name = 'AbortError';
1353
+ reject(abortError);
1354
+ });
1355
+ }));
1356
+ mockChat.sendMessageStream = vi
1357
+ .fn()
1358
+ .mockResolvedValue(createEmptyStream());
1359
+ const promptPromise = session.prompt({
1360
+ sessionId: 'test-session-id',
1361
+ prompt: [{ type: 'text', text: 'hello' }],
1362
+ });
1363
+ await vi.waitFor(() => {
1364
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenCalled();
1365
+ });
1366
+ await session.cancelPendingPrompt();
1367
+ await expect(promptPromise).resolves.toEqual({
1368
+ stopReason: 'cancelled',
1369
+ });
1370
+ expect(mockChat.sendMessageStream).not.toHaveBeenCalled();
1371
+ expect(mockChat.addHistory).toHaveBeenCalledWith({
1372
+ role: 'user',
1373
+ parts: expect.any(Array),
1374
+ });
1375
+ expect(mockClient.sessionUpdate).not.toHaveBeenCalledWith({
1376
+ sessionId: 'test-session-id',
1377
+ update: {
1378
+ sessionUpdate: 'agent_message_chunk',
1379
+ content: {
1380
+ type: 'text',
1381
+ text: 'Session token limit exceeded: 101 tokens > 100 limit. ' +
1382
+ 'Please start a new session or increase the sessionTokenLimit in your settings.json.',
1383
+ },
1384
+ },
1385
+ });
1386
+ });
1387
+ it('uses compression token info instead of global UI telemetry for the session limit', async () => {
1388
+ mockConfig.getSessionTokenLimit = vi.fn().mockReturnValue(100);
1389
+ vi.spyOn(core.uiTelemetryService, 'getLastPromptTokenCount').mockReturnValue(999);
1390
+ mockGeminiClient.tryCompressChat.mockResolvedValueOnce({
1391
+ originalTokenCount: 50,
1392
+ newTokenCount: 50,
1393
+ compressionStatus: core.CompressionStatus.NOOP,
1394
+ });
1395
+ mockChat.sendMessageStream = vi
1396
+ .fn()
1397
+ .mockResolvedValue(createEmptyStream());
1398
+ await session.prompt({
1399
+ sessionId: 'test-session-id',
1400
+ prompt: [{ type: 'text', text: 'hello' }],
1401
+ });
1402
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(1);
1403
+ });
1404
+ it('falls back to the previous prompt token count when compression returns zero token info', async () => {
1405
+ mockConfig.getSessionTokenLimit = vi.fn().mockReturnValue(100);
1406
+ mockGeminiClient.tryCompressChat.mockResolvedValue({
1407
+ originalTokenCount: 0,
1408
+ newTokenCount: 0,
1409
+ compressionStatus: core.CompressionStatus.NOOP,
1410
+ });
1411
+ mockChat.sendMessageStream = vi
1412
+ .fn()
1413
+ .mockResolvedValueOnce(createStreamWithChunks([
1414
+ {
1415
+ type: core.StreamEventType.CHUNK,
1416
+ value: {
1417
+ usageMetadata: {
1418
+ totalTokenCount: 101,
1419
+ promptTokenCount: 101,
1420
+ },
1421
+ },
1422
+ },
1423
+ ]))
1424
+ .mockResolvedValueOnce(createEmptyStream());
1425
+ await expect(session.prompt({
1426
+ sessionId: 'test-session-id',
1427
+ prompt: [{ type: 'text', text: 'first' }],
1428
+ })).resolves.toEqual({ stopReason: 'end_turn' });
1429
+ await expect(session.prompt({
1430
+ sessionId: 'test-session-id',
1431
+ prompt: [{ type: 'text', text: 'second' }],
1432
+ })).resolves.toEqual({ stopReason: 'max_tokens' });
1433
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(1);
1434
+ });
1435
+ it('falls back to the previous prompt token count when compressed token info is zero', async () => {
1436
+ mockConfig.getSessionTokenLimit = vi.fn().mockReturnValue(100);
1437
+ mockGeminiClient.tryCompressChat
1438
+ .mockResolvedValueOnce({
1439
+ originalTokenCount: 50,
1440
+ newTokenCount: 50,
1441
+ compressionStatus: core.CompressionStatus.NOOP,
1442
+ })
1443
+ .mockResolvedValueOnce({
1444
+ originalTokenCount: 1200,
1445
+ newTokenCount: 0,
1446
+ compressionStatus: core.CompressionStatus.COMPRESSED,
1447
+ });
1448
+ mockChat.sendMessageStream = vi
1449
+ .fn()
1450
+ .mockResolvedValueOnce(createStreamWithChunks([
1451
+ {
1452
+ type: core.StreamEventType.CHUNK,
1453
+ value: {
1454
+ usageMetadata: {
1455
+ totalTokenCount: 101,
1456
+ promptTokenCount: 101,
1457
+ },
1458
+ },
1459
+ },
1460
+ ]))
1461
+ .mockResolvedValueOnce(createEmptyStream());
1462
+ await expect(session.prompt({
1463
+ sessionId: 'test-session-id',
1464
+ prompt: [{ type: 'text', text: 'first' }],
1465
+ })).resolves.toEqual({ stopReason: 'end_turn' });
1466
+ await expect(session.prompt({
1467
+ sessionId: 'test-session-id',
1468
+ prompt: [{ type: 'text', text: 'second' }],
1469
+ })).resolves.toEqual({ stopReason: 'max_tokens' });
1470
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(1);
1471
+ });
1472
+ it('records prompt token count instead of total token count for later session-limit checks', async () => {
1473
+ mockConfig.getSessionTokenLimit = vi.fn().mockReturnValue(100);
1474
+ mockGeminiClient.tryCompressChat
1475
+ .mockResolvedValueOnce({
1476
+ originalTokenCount: 0,
1477
+ newTokenCount: 0,
1478
+ compressionStatus: core.CompressionStatus.NOOP,
1479
+ })
1480
+ .mockRejectedValueOnce(new Error('compression unavailable'));
1481
+ mockChat.sendMessageStream = vi
1482
+ .fn()
1483
+ .mockResolvedValueOnce(createStreamWithChunks([
1484
+ {
1485
+ type: core.StreamEventType.CHUNK,
1486
+ value: {
1487
+ usageMetadata: {
1488
+ totalTokenCount: 500,
1489
+ promptTokenCount: 50,
1490
+ },
1491
+ },
1492
+ },
1493
+ ]))
1494
+ .mockResolvedValueOnce(createEmptyStream());
1495
+ await expect(session.prompt({
1496
+ sessionId: 'test-session-id',
1497
+ prompt: [{ type: 'text', text: 'long response' }],
1498
+ })).resolves.toEqual({ stopReason: 'end_turn' });
1499
+ await expect(session.prompt({
1500
+ sessionId: 'test-session-id',
1501
+ prompt: [{ type: 'text', text: 'next prompt' }],
1502
+ })).resolves.toEqual({ stopReason: 'end_turn' });
1503
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(2);
1504
+ });
1505
+ it('resets the session-local token count when the active chat instance changes', async () => {
1506
+ const clearedChat = {
1507
+ sendMessageStream: vi.fn().mockResolvedValue(createEmptyStream()),
1508
+ addHistory: vi.fn(),
1509
+ getHistory: vi.fn().mockReturnValue([]),
1510
+ getHistoryShallow: vi.fn().mockReturnValue([]),
1511
+ getLastModelMessageText: vi.fn().mockReturnValue(''),
1512
+ };
1513
+ mockConfig.getSessionTokenLimit = vi.fn().mockReturnValue(100);
1514
+ mockGeminiClient.tryCompressChat
1515
+ .mockResolvedValueOnce({
1516
+ originalTokenCount: 50,
1517
+ newTokenCount: 50,
1518
+ compressionStatus: core.CompressionStatus.NOOP,
1519
+ })
1520
+ .mockRejectedValueOnce(new Error('compression unavailable'));
1521
+ mockChat.sendMessageStream = vi.fn().mockResolvedValueOnce(createStreamWithChunks([
1522
+ {
1523
+ type: core.StreamEventType.CHUNK,
1524
+ value: {
1525
+ usageMetadata: {
1526
+ totalTokenCount: 500,
1527
+ promptTokenCount: 101,
1528
+ },
1529
+ },
1530
+ },
1531
+ ]));
1532
+ await expect(session.prompt({
1533
+ sessionId: 'test-session-id',
1534
+ prompt: [{ type: 'text', text: 'before clear' }],
1535
+ })).resolves.toEqual({ stopReason: 'end_turn' });
1536
+ mockGeminiClient.getChat.mockReturnValue(clearedChat);
1537
+ await expect(session.prompt({
1538
+ sessionId: 'test-session-id',
1539
+ prompt: [{ type: 'text', text: 'after clear' }],
1540
+ })).resolves.toEqual({ stopReason: 'end_turn' });
1541
+ expect(clearedChat.sendMessageStream).toHaveBeenCalledTimes(1);
1542
+ });
1543
+ it('continues sending when the compression notification fails', async () => {
1544
+ mockGeminiClient.tryCompressChat.mockResolvedValueOnce({
1545
+ originalTokenCount: 1200,
1546
+ newTokenCount: 450,
1547
+ compressionStatus: core.CompressionStatus.COMPRESSED,
1548
+ });
1549
+ mockClient.sessionUpdate = vi
1550
+ .fn()
1551
+ .mockRejectedValueOnce(new Error('client disconnected'));
1552
+ mockChat.sendMessageStream = vi
1553
+ .fn()
1554
+ .mockResolvedValue(createEmptyStream());
1555
+ await session.prompt({
1556
+ sessionId: 'test-session-id',
1557
+ prompt: [{ type: 'text', text: 'hello' }],
1558
+ });
1559
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(1);
1560
+ });
1561
+ it('stops before sending when the compressed prompt exceeds the session token limit', async () => {
1562
+ mockConfig.getSessionTokenLimit = vi.fn().mockReturnValue(100);
1563
+ mockGeminiClient.tryCompressChat.mockResolvedValueOnce({
1564
+ originalTokenCount: 1200,
1565
+ newTokenCount: 101,
1566
+ compressionStatus: core.CompressionStatus.COMPRESSED,
1567
+ });
1568
+ mockChat.sendMessageStream = vi
1569
+ .fn()
1570
+ .mockResolvedValue(createEmptyStream());
1571
+ await expect(session.prompt({
1572
+ sessionId: 'test-session-id',
1573
+ prompt: [{ type: 'text', text: 'hello' }],
1574
+ })).resolves.toEqual({ stopReason: 'max_tokens' });
1575
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenCalled();
1576
+ expect(mockChat.sendMessageStream).not.toHaveBeenCalled();
1577
+ expect(mockChat.addHistory).not.toHaveBeenCalled();
1578
+ expect(mockClient.sessionUpdate).not.toHaveBeenCalledWith({
1579
+ sessionId: 'test-session-id',
1580
+ update: {
1581
+ sessionUpdate: 'agent_message_chunk',
1582
+ content: {
1583
+ type: 'text',
1584
+ text: 'IMPORTANT: This conversation approached the input token limit for qwen3-code-plus. ' +
1585
+ 'A compressed context will be sent for future messages (compressed from: 1200 to 101 tokens).',
1586
+ },
1587
+ },
1588
+ });
1589
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
1590
+ sessionId: 'test-session-id',
1591
+ update: {
1592
+ sessionUpdate: 'agent_message_chunk',
1593
+ content: {
1594
+ type: 'text',
1595
+ text: 'Session token limit exceeded: 101 tokens > 100 limit. ' +
1596
+ 'Please start a new session or increase the sessionTokenLimit in your settings.json.',
1597
+ },
1598
+ },
1599
+ });
1600
+ });
1601
+ it('stops without throwing when the token-limit diagnostic fails', async () => {
1602
+ mockConfig.getSessionTokenLimit = vi.fn().mockReturnValue(100);
1603
+ mockGeminiClient.tryCompressChat.mockResolvedValueOnce({
1604
+ originalTokenCount: 101,
1605
+ newTokenCount: 101,
1606
+ compressionStatus: core.CompressionStatus.NOOP,
1607
+ });
1608
+ mockClient.sessionUpdate = vi
1609
+ .fn()
1610
+ .mockRejectedValueOnce(new Error('client disconnected'));
1611
+ mockChat.sendMessageStream = vi
1612
+ .fn()
1613
+ .mockResolvedValue(createEmptyStream());
1614
+ await expect(session.prompt({
1615
+ sessionId: 'test-session-id',
1616
+ prompt: [{ type: 'text', text: 'hello' }],
1617
+ })).resolves.toEqual({ stopReason: 'max_tokens' });
1618
+ expect(mockChat.sendMessageStream).not.toHaveBeenCalled();
1619
+ expect(mockChat.addHistory).not.toHaveBeenCalled();
1620
+ });
1621
+ it('also runs automatic compression before tool response follow-up sends', async () => {
1622
+ const executeSpy = vi.fn().mockResolvedValue({
1623
+ llmContent: 'file contents',
1624
+ returnDisplay: 'file contents',
1625
+ });
1626
+ const tool = {
1627
+ name: 'read_file',
1628
+ kind: core.Kind.Read,
1629
+ build: vi.fn().mockReturnValue({
1630
+ params: { path: '/tmp/test.txt' },
1631
+ getDefaultPermission: vi.fn().mockResolvedValue('allow'),
1632
+ getDescription: vi.fn().mockReturnValue('Read file'),
1633
+ toolLocations: vi.fn().mockReturnValue([]),
1634
+ execute: executeSpy,
1635
+ }),
1636
+ };
1637
+ mockToolRegistry.getTool.mockReturnValue(tool);
1638
+ mockConfig.getApprovalMode = vi.fn().mockReturnValue(ApprovalMode.YOLO);
1639
+ mockChat.sendMessageStream = vi
1640
+ .fn()
1641
+ .mockResolvedValueOnce(createStreamWithChunks([
1642
+ {
1643
+ type: core.StreamEventType.CHUNK,
1644
+ value: {
1645
+ functionCalls: [
1646
+ {
1647
+ id: 'call-1',
1648
+ name: 'read_file',
1649
+ args: { path: '/tmp/test.txt' },
1650
+ },
1651
+ ],
1652
+ },
1653
+ },
1654
+ ]))
1655
+ .mockResolvedValueOnce(createEmptyStream());
1656
+ await session.prompt({
1657
+ sessionId: 'test-session-id',
1658
+ prompt: [{ type: 'text', text: 'read file' }],
1659
+ });
1660
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(2);
1661
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenCalledTimes(2);
1662
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenNthCalledWith(2, 'test-session-id########1', false, expect.any(AbortSignal));
1663
+ const sendMessageStream = mockChat.sendMessageStream;
1664
+ expectCompressBeforeSend(mockGeminiClient.tryCompressChat, sendMessageStream, 1);
1665
+ });
1666
+ it('injects drained mid-turn user messages with tool responses', async () => {
1667
+ const executeSpy = vi.fn().mockResolvedValue({
1668
+ llmContent: 'file contents',
1669
+ returnDisplay: 'file contents',
1670
+ });
1671
+ const tool = {
1672
+ name: 'read_file',
1673
+ kind: core.Kind.Read,
1674
+ build: vi.fn().mockReturnValue({
1675
+ params: { path: '/tmp/test.txt' },
1676
+ getDefaultPermission: vi.fn().mockResolvedValue('allow'),
1677
+ getDescription: vi.fn().mockReturnValue('Read file'),
1678
+ toolLocations: vi.fn().mockReturnValue([]),
1679
+ execute: executeSpy,
1680
+ }),
1681
+ };
1682
+ mockToolRegistry.getTool.mockReturnValue(tool);
1683
+ mockConfig.getApprovalMode = vi.fn().mockReturnValue(ApprovalMode.YOLO);
1684
+ mockClient.extMethod = vi.fn().mockResolvedValue({
1685
+ messages: ['please also check tests'],
1686
+ });
1687
+ mockChat.sendMessageStream = vi
1688
+ .fn()
1689
+ .mockResolvedValueOnce(createStreamWithChunks([
1690
+ {
1691
+ type: core.StreamEventType.CHUNK,
1692
+ value: {
1693
+ functionCalls: [
1694
+ {
1695
+ id: 'call-1',
1696
+ name: 'read_file',
1697
+ args: { path: '/tmp/test.txt' },
1698
+ },
1699
+ ],
1700
+ },
1701
+ },
1702
+ ]))
1703
+ .mockResolvedValueOnce(createEmptyStream());
1704
+ await session.prompt({
1705
+ sessionId: 'test-session-id',
1706
+ prompt: [{ type: 'text', text: 'read file' }],
1707
+ });
1708
+ expect(mockClient.extMethod).toHaveBeenCalledWith('craft/drainMidTurnQueue', { sessionId: 'test-session-id' });
1709
+ const secondCall = vi.mocked(mockChat.sendMessageStream).mock.calls[1];
1710
+ const midTurnPart = {
1711
+ text: '\n[User message received during tool execution]: please also check tests',
1712
+ };
1713
+ expect(secondCall?.[1].message).toEqual(expect.arrayContaining([midTurnPart]));
1714
+ expect(mockChatRecordingService.recordMidTurnUserMessage).toHaveBeenCalledWith([midTurnPart], 'please also check tests');
1715
+ });
1716
+ it('latches mid-turn drain off after a permanent (-32601) error', async () => {
1717
+ const tool = {
1718
+ name: 'read_file',
1719
+ kind: core.Kind.Read,
1720
+ build: vi.fn().mockReturnValue({
1721
+ params: { path: '/tmp/test.txt' },
1722
+ getDefaultPermission: vi.fn().mockResolvedValue('allow'),
1723
+ getDescription: vi.fn().mockReturnValue('Read file'),
1724
+ toolLocations: vi.fn().mockReturnValue([]),
1725
+ execute: vi
1726
+ .fn()
1727
+ .mockResolvedValue({ llmContent: 'ok', returnDisplay: 'ok' }),
1728
+ }),
1729
+ };
1730
+ mockToolRegistry.getTool.mockReturnValue(tool);
1731
+ mockConfig.getApprovalMode = vi.fn().mockReturnValue(ApprovalMode.YOLO);
1732
+ // The ACP SDK rejects with a raw JSON-RPC error object, not an Error.
1733
+ mockClient.extMethod = vi
1734
+ .fn()
1735
+ .mockRejectedValue({ code: -32601, message: 'Method not found' });
1736
+ const toolCallStream = () => createStreamWithChunks([
1737
+ {
1738
+ type: core.StreamEventType.CHUNK,
1739
+ value: {
1740
+ functionCalls: [
1741
+ {
1742
+ id: 'c',
1743
+ name: 'read_file',
1744
+ args: { path: '/tmp/test.txt' },
1745
+ },
1746
+ ],
1747
+ },
1748
+ },
1749
+ ]);
1750
+ mockChat.sendMessageStream = vi
1751
+ .fn()
1752
+ .mockResolvedValueOnce(toolCallStream())
1753
+ .mockResolvedValueOnce(createEmptyStream())
1754
+ .mockResolvedValueOnce(toolCallStream())
1755
+ .mockResolvedValueOnce(createEmptyStream());
1756
+ const prompt = {
1757
+ sessionId: 'test-session-id',
1758
+ prompt: [{ type: 'text', text: 'read file' }],
1759
+ };
1760
+ await session.prompt(prompt);
1761
+ await session.prompt(prompt);
1762
+ // After the permanent error the latch trips, so the drain extMethod is
1763
+ // attempted only on the first tool batch, not the second.
1764
+ const drainCalls = vi
1765
+ .mocked(mockClient.extMethod)
1766
+ .mock.calls.filter((call) => call[0] === 'craft/drainMidTurnQueue');
1767
+ expect(drainCalls).toHaveLength(1);
1768
+ });
1769
+ it('latches mid-turn drain off after repeated timeouts when the client never responds', async () => {
1770
+ const tool = {
1771
+ name: 'read_file',
1772
+ kind: core.Kind.Read,
1773
+ build: vi.fn().mockReturnValue({
1774
+ params: { path: '/tmp/test.txt' },
1775
+ getDefaultPermission: vi.fn().mockResolvedValue('allow'),
1776
+ getDescription: vi.fn().mockReturnValue('Read file'),
1777
+ toolLocations: vi.fn().mockReturnValue([]),
1778
+ execute: vi
1779
+ .fn()
1780
+ .mockResolvedValue({ llmContent: 'ok', returnDisplay: 'ok' }),
1781
+ }),
1782
+ };
1783
+ mockToolRegistry.getTool.mockReturnValue(tool);
1784
+ mockConfig.getApprovalMode = vi.fn().mockReturnValue(ApprovalMode.YOLO);
1785
+ // A non-conforming client that silently drops unknown methods: the
1786
+ // drain request never settles. The turn must not hang on it.
1787
+ mockClient.extMethod = vi.fn().mockReturnValue(new Promise(() => { }));
1788
+ const toolCallStream = () => createStreamWithChunks([
1789
+ {
1790
+ type: core.StreamEventType.CHUNK,
1791
+ value: {
1792
+ functionCalls: [
1793
+ {
1794
+ id: 'c',
1795
+ name: 'read_file',
1796
+ args: { path: '/tmp/test.txt' },
1797
+ },
1798
+ ],
1799
+ },
1800
+ },
1801
+ ]);
1802
+ // Four prompts, each with one tool batch. The first three time out
1803
+ // (consecutive-strike budget), the fourth must skip the drain.
1804
+ mockChat.sendMessageStream = vi
1805
+ .fn()
1806
+ .mockResolvedValueOnce(toolCallStream())
1807
+ .mockResolvedValueOnce(createEmptyStream())
1808
+ .mockResolvedValueOnce(toolCallStream())
1809
+ .mockResolvedValueOnce(createEmptyStream())
1810
+ .mockResolvedValueOnce(toolCallStream())
1811
+ .mockResolvedValueOnce(createEmptyStream())
1812
+ .mockResolvedValueOnce(toolCallStream())
1813
+ .mockResolvedValueOnce(createEmptyStream());
1814
+ const prompt = {
1815
+ sessionId: 'test-session-id',
1816
+ prompt: [{ type: 'text', text: 'read file' }],
1817
+ };
1818
+ await session.prompt(prompt);
1819
+ await session.prompt(prompt);
1820
+ await session.prompt(prompt);
1821
+ await session.prompt(prompt);
1822
+ // Three consecutive timeouts trip the latch, so the never-answered
1823
+ // extMethod is attempted on the first three tool batches only.
1824
+ const drainCalls = vi
1825
+ .mocked(mockClient.extMethod)
1826
+ .mock.calls.filter((call) => call[0] === 'craft/drainMidTurnQueue');
1827
+ expect(drainCalls).toHaveLength(3);
1828
+ }, 20_000);
1829
+ it('resets the timeout strike count when a drain succeeds', async () => {
1830
+ const tool = {
1831
+ name: 'read_file',
1832
+ kind: core.Kind.Read,
1833
+ build: vi.fn().mockReturnValue({
1834
+ params: { path: '/tmp/test.txt' },
1835
+ getDefaultPermission: vi.fn().mockResolvedValue('allow'),
1836
+ getDescription: vi.fn().mockReturnValue('Read file'),
1837
+ toolLocations: vi.fn().mockReturnValue([]),
1838
+ execute: vi
1839
+ .fn()
1840
+ .mockResolvedValue({ llmContent: 'ok', returnDisplay: 'ok' }),
1841
+ }),
1842
+ };
1843
+ mockToolRegistry.getTool.mockReturnValue(tool);
1844
+ mockConfig.getApprovalMode = vi.fn().mockReturnValue(ApprovalMode.YOLO);
1845
+ // Timeout, success, then timeouts: the success must reset the strike
1846
+ // count, so the latch needs three NEW consecutive timeouts to trip.
1847
+ mockClient.extMethod = vi
1848
+ .fn()
1849
+ .mockReturnValueOnce(new Promise(() => { }))
1850
+ .mockResolvedValueOnce({ messages: [] })
1851
+ .mockReturnValue(new Promise(() => { }));
1852
+ const toolCallStream = () => createStreamWithChunks([
1853
+ {
1854
+ type: core.StreamEventType.CHUNK,
1855
+ value: {
1856
+ functionCalls: [
1857
+ {
1858
+ id: 'c',
1859
+ name: 'read_file',
1860
+ args: { path: '/tmp/test.txt' },
1861
+ },
1862
+ ],
1863
+ },
1864
+ },
1865
+ ]);
1866
+ const streamMock = vi.fn();
1867
+ for (let i = 0; i < 5; i++) {
1868
+ streamMock
1869
+ .mockResolvedValueOnce(toolCallStream())
1870
+ .mockResolvedValueOnce(createEmptyStream());
1871
+ }
1872
+ mockChat.sendMessageStream = streamMock;
1873
+ const prompt = {
1874
+ sessionId: 'test-session-id',
1875
+ prompt: [{ type: 'text', text: 'read file' }],
1876
+ };
1877
+ for (let i = 0; i < 5; i++) {
1878
+ await session.prompt(prompt);
1879
+ }
1880
+ // Strikes: timeout(1), success(reset to 0), timeout(1), timeout(2),
1881
+ // timeout(3 -> latch). All five batches attempt the drain; without
1882
+ // the reset the latch would trip on the fourth batch and the fifth
1883
+ // attempt would be skipped.
1884
+ const drainCalls = vi
1885
+ .mocked(mockClient.extMethod)
1886
+ .mock.calls.filter((call) => call[0] === 'craft/drainMidTurnQueue');
1887
+ expect(drainCalls).toHaveLength(5);
1888
+ }, 30_000);
1889
+ it('keeps mid-turn drain enabled after a transient error', async () => {
1890
+ const tool = {
1891
+ name: 'read_file',
1892
+ kind: core.Kind.Read,
1893
+ build: vi.fn().mockReturnValue({
1894
+ params: { path: '/tmp/test.txt' },
1895
+ getDefaultPermission: vi.fn().mockResolvedValue('allow'),
1896
+ getDescription: vi.fn().mockReturnValue('Read file'),
1897
+ toolLocations: vi.fn().mockReturnValue([]),
1898
+ execute: vi
1899
+ .fn()
1900
+ .mockResolvedValue({ llmContent: 'ok', returnDisplay: 'ok' }),
1901
+ }),
1902
+ };
1903
+ mockToolRegistry.getTool.mockReturnValue(tool);
1904
+ mockConfig.getApprovalMode = vi.fn().mockReturnValue(ApprovalMode.YOLO);
1905
+ mockClient.extMethod = vi
1906
+ .fn()
1907
+ .mockRejectedValue({ code: -32000, message: 'temporary failure' });
1908
+ const toolCallStream = () => createStreamWithChunks([
1909
+ {
1910
+ type: core.StreamEventType.CHUNK,
1911
+ value: {
1912
+ functionCalls: [
1913
+ {
1914
+ id: 'c',
1915
+ name: 'read_file',
1916
+ args: { path: '/tmp/test.txt' },
1917
+ },
1918
+ ],
1919
+ },
1920
+ },
1921
+ ]);
1922
+ mockChat.sendMessageStream = vi
1923
+ .fn()
1924
+ .mockResolvedValueOnce(toolCallStream())
1925
+ .mockResolvedValueOnce(createEmptyStream())
1926
+ .mockResolvedValueOnce(toolCallStream())
1927
+ .mockResolvedValueOnce(createEmptyStream());
1928
+ const prompt = {
1929
+ sessionId: 'test-session-id',
1930
+ prompt: [{ type: 'text', text: 'read file' }],
1931
+ };
1932
+ await session.prompt(prompt);
1933
+ await session.prompt(prompt);
1934
+ // A transient error must NOT latch: the drain is retried on the second
1935
+ // tool batch.
1936
+ const drainCalls = vi
1937
+ .mocked(mockClient.extMethod)
1938
+ .mock.calls.filter((call) => call[0] === 'craft/drainMidTurnQueue');
1939
+ expect(drainCalls).toHaveLength(2);
1940
+ });
1941
+ it('wraps tool execution with the sleep inhibitor (acquire before execute, release after)', async () => {
1942
+ const releaseSpy = vi.fn();
1943
+ const acquireSpy = vi
1944
+ .spyOn(core, 'acquireSleepInhibitor')
1945
+ .mockReturnValue({ release: releaseSpy });
1946
+ try {
1947
+ const executeSpy = vi.fn().mockResolvedValue({
1948
+ llmContent: 'file contents',
1949
+ returnDisplay: 'file contents',
1950
+ });
1951
+ const tool = {
1952
+ name: 'read_file',
1953
+ kind: core.Kind.Read,
1954
+ build: vi.fn().mockReturnValue({
1955
+ params: { path: '/tmp/test.txt' },
1956
+ getDefaultPermission: vi.fn().mockResolvedValue('allow'),
1957
+ getDescription: vi.fn().mockReturnValue('Read file'),
1958
+ toolLocations: vi.fn().mockReturnValue([]),
1959
+ execute: executeSpy,
1960
+ }),
1961
+ };
1962
+ mockToolRegistry.getTool.mockReturnValue(tool);
1963
+ mockConfig.getApprovalMode = vi
1964
+ .fn()
1965
+ .mockReturnValue(ApprovalMode.YOLO);
1966
+ mockChat.sendMessageStream = vi
1967
+ .fn()
1968
+ .mockResolvedValueOnce(createStreamWithChunks([
1969
+ {
1970
+ type: core.StreamEventType.CHUNK,
1971
+ value: {
1972
+ functionCalls: [
1973
+ {
1974
+ id: 'call-1',
1975
+ name: 'read_file',
1976
+ args: { path: '/tmp/test.txt' },
1977
+ },
1978
+ ],
1979
+ },
1980
+ },
1981
+ ]))
1982
+ .mockResolvedValueOnce(createEmptyStream());
1983
+ await session.prompt({
1984
+ sessionId: 'test-session-id',
1985
+ prompt: [{ type: 'text', text: 'read file' }],
1986
+ });
1987
+ expect(executeSpy).toHaveBeenCalledTimes(1);
1988
+ expect(acquireSpy).toHaveBeenCalledWith(expect.anything(), expect.stringContaining('read_file'));
1989
+ expect(releaseSpy).toHaveBeenCalledTimes(1);
1990
+ // Ordering: acquire → execute → release.
1991
+ expect(acquireSpy.mock.invocationCallOrder[0]).toBeLessThan(executeSpy.mock.invocationCallOrder[0]);
1992
+ expect(executeSpy.mock.invocationCallOrder[0]).toBeLessThan(releaseSpy.mock.invocationCallOrder[0]);
1993
+ }
1994
+ finally {
1995
+ acquireSpy.mockRestore();
1996
+ }
1997
+ });
1998
+ it('stops tool response follow-up before sending when the session token limit is exceeded', async () => {
1999
+ const executeSpy = vi.fn().mockResolvedValue({
2000
+ llmContent: 'file contents',
2001
+ returnDisplay: 'file contents',
2002
+ });
2003
+ const tool = {
2004
+ name: 'read_file',
2005
+ kind: core.Kind.Read,
2006
+ build: vi.fn().mockReturnValue({
2007
+ params: { path: '/tmp/test.txt' },
2008
+ getDefaultPermission: vi.fn().mockResolvedValue('allow'),
2009
+ getDescription: vi.fn().mockReturnValue('Read file'),
2010
+ toolLocations: vi.fn().mockReturnValue([]),
2011
+ execute: executeSpy,
2012
+ }),
2013
+ };
2014
+ mockToolRegistry.getTool.mockReturnValue(tool);
2015
+ mockConfig.getApprovalMode = vi.fn().mockReturnValue(ApprovalMode.YOLO);
2016
+ mockConfig.getSessionTokenLimit = vi.fn().mockReturnValue(100);
2017
+ mockGeminiClient.tryCompressChat
2018
+ .mockResolvedValueOnce({
2019
+ originalTokenCount: 50,
2020
+ newTokenCount: 50,
2021
+ compressionStatus: core.CompressionStatus.NOOP,
2022
+ })
2023
+ .mockResolvedValueOnce({
2024
+ originalTokenCount: 101,
2025
+ newTokenCount: 101,
2026
+ compressionStatus: core.CompressionStatus.NOOP,
2027
+ });
2028
+ mockChat.sendMessageStream = vi
2029
+ .fn()
2030
+ .mockResolvedValueOnce(createStreamWithChunks([
2031
+ {
2032
+ type: core.StreamEventType.CHUNK,
2033
+ value: {
2034
+ functionCalls: [
2035
+ {
2036
+ id: 'call-1',
2037
+ name: 'read_file',
2038
+ args: { path: '/tmp/test.txt' },
2039
+ },
2040
+ ],
2041
+ },
2042
+ },
2043
+ ]))
2044
+ .mockResolvedValueOnce(createEmptyStream());
2045
+ await expect(session.prompt({
2046
+ sessionId: 'test-session-id',
2047
+ prompt: [{ type: 'text', text: 'read file' }],
2048
+ })).resolves.toEqual({ stopReason: 'max_tokens' });
2049
+ expect(executeSpy).toHaveBeenCalledTimes(1);
2050
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenCalledTimes(2);
2051
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenNthCalledWith(2, 'test-session-id########1', false, expect.any(AbortSignal));
2052
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(1);
2053
+ expect(mockChat.addHistory).toHaveBeenCalledWith({
2054
+ role: 'user',
2055
+ parts: [
2056
+ expect.objectContaining({
2057
+ functionResponse: expect.objectContaining({
2058
+ id: 'call-1',
2059
+ name: 'read_file',
2060
+ }),
2061
+ }),
2062
+ ],
2063
+ });
2064
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
2065
+ sessionId: 'test-session-id',
2066
+ update: {
2067
+ sessionUpdate: 'agent_message_chunk',
2068
+ content: {
2069
+ type: 'text',
2070
+ text: 'Session token limit exceeded: 101 tokens > 100 limit. ' +
2071
+ 'Please start a new session or increase the sessionTokenLimit in your settings.json.',
2072
+ },
2073
+ },
2074
+ });
2075
+ });
2076
+ it('runs automatic compression before Stop-hook continuation sends', async () => {
2077
+ const messageBus = {
2078
+ request: vi
2079
+ .fn()
2080
+ .mockResolvedValueOnce({
2081
+ success: true,
2082
+ output: {
2083
+ decision: 'block',
2084
+ reason: 'Continue after Stop hook',
2085
+ },
2086
+ })
2087
+ .mockResolvedValueOnce({
2088
+ success: true,
2089
+ output: {},
2090
+ }),
2091
+ };
2092
+ mockConfig.getMessageBus = vi.fn().mockReturnValue(messageBus);
2093
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
2094
+ mockConfig.hasHooksForEvent = vi
2095
+ .fn()
2096
+ .mockImplementation((eventName) => eventName === 'Stop');
2097
+ mockChat.getHistory = vi
2098
+ .fn()
2099
+ .mockReturnValue([
2100
+ { role: 'model', parts: [{ text: 'response text' }] },
2101
+ ]);
2102
+ mockChat.getLastModelMessageText = vi
2103
+ .fn()
2104
+ .mockReturnValue('response text');
2105
+ mockChat.sendMessageStream = vi
2106
+ .fn()
2107
+ .mockResolvedValueOnce(createEmptyStream())
2108
+ .mockResolvedValueOnce(createEmptyStream());
2109
+ await session.prompt({
2110
+ sessionId: 'test-session-id',
2111
+ prompt: [{ type: 'text', text: 'hello' }],
2112
+ });
2113
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(2);
2114
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenNthCalledWith(2, 'test-session-id########1_stop_hook_1', false, expect.any(AbortSignal));
2115
+ const sendMessageStream = mockChat.sendMessageStream;
2116
+ expectCompressBeforeSend(mockGeminiClient.tryCompressChat, sendMessageStream, 1);
2117
+ });
2118
+ it('skips automatic compression after the first Stop-hook continuation', async () => {
2119
+ const messageBus = {
2120
+ request: vi
2121
+ .fn()
2122
+ .mockResolvedValueOnce({
2123
+ success: true,
2124
+ output: {
2125
+ decision: 'block',
2126
+ reason: 'Continue after first Stop hook',
2127
+ },
2128
+ })
2129
+ .mockResolvedValueOnce({
2130
+ success: true,
2131
+ output: {
2132
+ decision: 'block',
2133
+ reason: 'Continue after second Stop hook',
2134
+ },
2135
+ })
2136
+ .mockResolvedValueOnce({
2137
+ success: true,
2138
+ output: {},
2139
+ }),
2140
+ };
2141
+ mockConfig.getMessageBus = vi.fn().mockReturnValue(messageBus);
2142
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
2143
+ mockConfig.hasHooksForEvent = vi
2144
+ .fn()
2145
+ .mockImplementation((eventName) => eventName === 'Stop');
2146
+ mockChat.getHistory = vi
2147
+ .fn()
2148
+ .mockReturnValue([
2149
+ { role: 'model', parts: [{ text: 'response text' }] },
2150
+ ]);
2151
+ mockChat.getLastModelMessageText = vi
2152
+ .fn()
2153
+ .mockReturnValue('response text');
2154
+ mockChat.sendMessageStream = vi
2155
+ .fn()
2156
+ .mockResolvedValueOnce(createEmptyStream())
2157
+ .mockResolvedValueOnce(createEmptyStream())
2158
+ .mockResolvedValueOnce(createEmptyStream());
2159
+ await session.prompt({
2160
+ sessionId: 'test-session-id',
2161
+ prompt: [{ type: 'text', text: 'hello' }],
2162
+ });
2163
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(3);
2164
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenCalledTimes(2);
2165
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenNthCalledWith(2, 'test-session-id########1_stop_hook_1', false, expect.any(AbortSignal));
2166
+ expect(mockGeminiClient.tryCompressChat).not.toHaveBeenCalledWith('test-session-id########1_stop_hook_2', false, expect.any(AbortSignal));
2167
+ const sendMessageStream = mockChat.sendMessageStream;
2168
+ expect(sendMessageStream.mock.calls[2]?.[2]).toBe('test-session-id########1_stop_hook_2');
2169
+ });
2170
+ it('stops Stop-hook continuation before sending when the session token limit is exceeded', async () => {
2171
+ const messageBus = {
2172
+ request: vi
2173
+ .fn()
2174
+ .mockResolvedValueOnce({
2175
+ success: true,
2176
+ output: {
2177
+ decision: 'block',
2178
+ reason: 'Continue after Stop hook',
2179
+ },
2180
+ })
2181
+ .mockResolvedValueOnce({
2182
+ success: true,
2183
+ output: {},
2184
+ }),
2185
+ };
2186
+ mockConfig.getMessageBus = vi.fn().mockReturnValue(messageBus);
2187
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
2188
+ mockConfig.hasHooksForEvent = vi
2189
+ .fn()
2190
+ .mockImplementation((eventName) => eventName === 'Stop');
2191
+ mockConfig.getSessionTokenLimit = vi.fn().mockReturnValue(100);
2192
+ mockGeminiClient.tryCompressChat
2193
+ .mockResolvedValueOnce({
2194
+ originalTokenCount: 50,
2195
+ newTokenCount: 50,
2196
+ compressionStatus: core.CompressionStatus.NOOP,
2197
+ })
2198
+ .mockResolvedValueOnce({
2199
+ originalTokenCount: 101,
2200
+ newTokenCount: 101,
2201
+ compressionStatus: core.CompressionStatus.NOOP,
2202
+ });
2203
+ mockChat.getHistory = vi
2204
+ .fn()
2205
+ .mockReturnValue([
2206
+ { role: 'model', parts: [{ text: 'response text' }] },
2207
+ ]);
2208
+ mockChat.getLastModelMessageText = vi
2209
+ .fn()
2210
+ .mockReturnValue('response text');
2211
+ mockChat.sendMessageStream = vi
2212
+ .fn()
2213
+ .mockResolvedValue(createEmptyStream());
2214
+ await expect(session.prompt({
2215
+ sessionId: 'test-session-id',
2216
+ prompt: [{ type: 'text', text: 'hello' }],
2217
+ })).resolves.toEqual({ stopReason: 'max_tokens' });
2218
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenCalledTimes(2);
2219
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenNthCalledWith(2, 'test-session-id########1_stop_hook_1', false, expect.any(AbortSignal));
2220
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(1);
2221
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
2222
+ sessionId: 'test-session-id',
2223
+ update: {
2224
+ sessionUpdate: 'agent_message_chunk',
2225
+ content: {
2226
+ type: 'text',
2227
+ text: 'Session token limit exceeded: 101 tokens > 100 limit. ' +
2228
+ 'Please start a new session or increase the sessionTokenLimit in your settings.json.',
2229
+ },
2230
+ },
2231
+ });
2232
+ });
2233
+ it('runs automatic compression before cron-fired ACP prompt sends', async () => {
2234
+ const scheduler = {
2235
+ size: 1,
2236
+ start: vi.fn((callback) => {
2237
+ callback({ prompt: 'scheduled prompt' });
2238
+ }),
2239
+ stop: vi.fn(),
2240
+ getExitSummary: vi.fn().mockReturnValue(undefined),
2241
+ };
2242
+ mockConfig.isCronEnabled = vi.fn().mockReturnValue(true);
2243
+ mockConfig.getCronScheduler = vi.fn().mockReturnValue(scheduler);
2244
+ mockChat.sendMessageStream = vi
2245
+ .fn()
2246
+ .mockResolvedValueOnce(createEmptyStream())
2247
+ .mockResolvedValueOnce(createEmptyStream());
2248
+ await session.prompt({
2249
+ sessionId: 'test-session-id',
2250
+ prompt: [{ type: 'text', text: 'hello' }],
2251
+ });
2252
+ await vi.waitFor(() => {
2253
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(2);
2254
+ });
2255
+ expect(scheduler.start).toHaveBeenCalledTimes(1);
2256
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenNthCalledWith(1, 'test-session-id########1', false, expect.any(AbortSignal));
2257
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenNthCalledWith(2, expect.stringMatching(/^test-session-id########cron\d+$/), false, expect.any(AbortSignal));
2258
+ const sendMessageStream = mockChat.sendMessageStream;
2259
+ expectCompressBeforeSend(mockGeminiClient.tryCompressChat, sendMessageStream, 1);
2260
+ });
2261
+ it('stops cron-fired ACP prompt before sending when the session token limit is exceeded', async () => {
2262
+ let cronCallback;
2263
+ const scheduler = {
2264
+ size: 1,
2265
+ start: vi.fn((callback) => {
2266
+ cronCallback = callback;
2267
+ callback({ prompt: 'scheduled prompt' });
2268
+ }),
2269
+ stop: vi.fn(),
2270
+ getExitSummary: vi.fn().mockReturnValue(undefined),
2271
+ };
2272
+ mockConfig.isCronEnabled = vi.fn().mockReturnValue(true);
2273
+ mockConfig.getCronScheduler = vi.fn().mockReturnValue(scheduler);
2274
+ mockConfig.getSessionTokenLimit = vi.fn().mockReturnValue(100);
2275
+ mockGeminiClient.tryCompressChat
2276
+ .mockResolvedValueOnce({
2277
+ originalTokenCount: 50,
2278
+ newTokenCount: 50,
2279
+ compressionStatus: core.CompressionStatus.NOOP,
2280
+ })
2281
+ .mockResolvedValueOnce({
2282
+ originalTokenCount: 101,
2283
+ newTokenCount: 101,
2284
+ compressionStatus: core.CompressionStatus.NOOP,
2285
+ });
2286
+ mockChat.sendMessageStream = vi
2287
+ .fn()
2288
+ .mockResolvedValue(createEmptyStream());
2289
+ await session.prompt({
2290
+ sessionId: 'test-session-id',
2291
+ prompt: [{ type: 'text', text: 'hello' }],
2292
+ });
2293
+ await vi.waitFor(() => {
2294
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenCalledTimes(2);
2295
+ });
2296
+ expect(scheduler.start).toHaveBeenCalledTimes(1);
2297
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenNthCalledWith(2, expect.stringMatching(/^test-session-id########cron\d+$/), false, expect.any(AbortSignal));
2298
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(1);
2299
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
2300
+ sessionId: 'test-session-id',
2301
+ update: {
2302
+ sessionUpdate: 'agent_message_chunk',
2303
+ content: {
2304
+ type: 'text',
2305
+ text: 'Session token limit exceeded: 101 tokens > 100 limit. ' +
2306
+ 'Please start a new session or increase the sessionTokenLimit in your settings.json.',
2307
+ },
2308
+ },
2309
+ });
2310
+ expect(scheduler.stop).toHaveBeenCalledTimes(1);
2311
+ await vi.waitFor(() => {
2312
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
2313
+ sessionId: 'test-session-id',
2314
+ update: {
2315
+ sessionUpdate: 'agent_message_chunk',
2316
+ content: {
2317
+ type: 'text',
2318
+ text: 'Cron jobs disabled for the rest of this session due to token limit. Restart the session to re-enable.',
2319
+ },
2320
+ },
2321
+ });
2322
+ });
2323
+ const sessionUpdateMock = mockClient.sessionUpdate;
2324
+ const tokenLimitDiagnosticCount = () => sessionUpdateMock.mock.calls.filter((call) => {
2325
+ const notification = call[0];
2326
+ return (notification.update?.sessionUpdate === 'agent_message_chunk' &&
2327
+ notification.update.content?.type === 'text' &&
2328
+ notification.update.content.text?.includes('Session token limit exceeded'));
2329
+ }).length;
2330
+ const diagnosticCountBefore = tokenLimitDiagnosticCount();
2331
+ cronCallback?.({ prompt: 'scheduled prompt again' });
2332
+ await Promise.resolve();
2333
+ expect(mockGeminiClient.tryCompressChat).toHaveBeenCalledTimes(2);
2334
+ expect(tokenLimitDiagnosticCount()).toBe(diagnosticCountBefore);
2335
+ });
2336
+ it('does not auto-compress slash commands handled without a model send', async () => {
2337
+ vi.mocked(nonInteractiveCliCommands.handleSlashCommand).mockResolvedValueOnce({
2338
+ type: 'message',
2339
+ messageType: 'info',
2340
+ content: 'Already compressed.',
2341
+ });
2342
+ mockChat.sendMessageStream = vi.fn();
2343
+ await session.prompt({
2344
+ sessionId: 'test-session-id',
2345
+ prompt: [{ type: 'text', text: '/compress' }],
2346
+ });
2347
+ expect(mockGeminiClient.tryCompressChat).not.toHaveBeenCalled();
2348
+ expect(mockChat.sendMessageStream).not.toHaveBeenCalled();
2349
+ });
2350
+ });
2351
+ it('passes resolved paths to read_many_files tool', async () => {
2352
+ const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'qwen-acp-session-'));
2353
+ const fileName = 'README.md';
2354
+ const filePath = path.join(tempDir, fileName);
2355
+ const readManyFilesSpy = vi
2356
+ .spyOn(core, 'readManyFiles')
2357
+ .mockResolvedValue({
2358
+ contentParts: 'file content',
2359
+ files: [],
2360
+ });
2361
+ try {
2362
+ await fs.writeFile(filePath, '# Test\n', 'utf8');
2363
+ mockConfig.getTargetDir = vi.fn().mockReturnValue(tempDir);
2364
+ mockChat.sendMessageStream = vi
2365
+ .fn()
2366
+ .mockResolvedValue(createEmptyStream());
2367
+ const promptRequest = {
2368
+ sessionId: 'test-session-id',
2369
+ prompt: [
2370
+ { type: 'text', text: 'Check this file' },
2371
+ {
2372
+ type: 'resource_link',
2373
+ name: fileName,
2374
+ uri: `file://${fileName}`,
2375
+ },
2376
+ ],
2377
+ };
2378
+ await session.prompt(promptRequest);
2379
+ expect(readManyFilesSpy).toHaveBeenCalledWith(mockConfig, {
2380
+ paths: [fileName],
2381
+ signal: expect.any(AbortSignal),
2382
+ });
2383
+ }
2384
+ finally {
2385
+ readManyFilesSpy.mockRestore();
2386
+ await fs.rm(tempDir, { recursive: true, force: true });
2387
+ }
2388
+ });
2389
+ it('runs prompt inside runtime output dir context', async () => {
2390
+ const runtimeDir = path.resolve('runtime', 'from-settings');
2391
+ core.Storage.setRuntimeBaseDir(runtimeDir);
2392
+ session = new Session('test-session-id', mockConfig, mockClient, mockSettings);
2393
+ const runWithRuntimeBaseDirSpy = vi.spyOn(core.Storage, 'runWithRuntimeBaseDir');
2394
+ try {
2395
+ mockChat.sendMessageStream = vi
2396
+ .fn()
2397
+ .mockResolvedValue(createEmptyStream());
2398
+ const promptRequest = {
2399
+ sessionId: 'test-session-id',
2400
+ prompt: [{ type: 'text', text: 'hello' }],
2401
+ };
2402
+ await session.prompt(promptRequest);
2403
+ expect(runWithRuntimeBaseDirSpy).toHaveBeenCalledWith(runtimeDir, process.cwd(), expect.any(Function));
2404
+ }
2405
+ finally {
2406
+ runWithRuntimeBaseDirSpy.mockRestore();
2407
+ }
2408
+ });
2409
+ it('hides allow-always options when confirmation already forbids them', async () => {
2410
+ const executeSpy = vi.fn().mockResolvedValue({
2411
+ llmContent: 'ok',
2412
+ returnDisplay: 'ok',
2413
+ });
2414
+ const onConfirmSpy = vi.fn().mockResolvedValue(undefined);
2415
+ const invocation = {
2416
+ params: { path: '/tmp/file.txt' },
2417
+ getDefaultPermission: vi.fn().mockResolvedValue('ask'),
2418
+ getConfirmationDetails: vi.fn().mockResolvedValue({
2419
+ type: 'info',
2420
+ title: 'Need permission',
2421
+ prompt: 'Allow?',
2422
+ hideAlwaysAllow: true,
2423
+ onConfirm: onConfirmSpy,
2424
+ }),
2425
+ getDescription: vi.fn().mockReturnValue('Inspect file'),
2426
+ toolLocations: vi.fn().mockReturnValue([]),
2427
+ execute: executeSpy,
2428
+ };
2429
+ const tool = {
2430
+ name: 'read_file',
2431
+ kind: core.Kind.Read,
2432
+ build: vi.fn().mockReturnValue(invocation),
2433
+ };
2434
+ mockToolRegistry.getTool.mockReturnValue(tool);
2435
+ mockConfig.getApprovalMode = vi
2436
+ .fn()
2437
+ .mockReturnValue(ApprovalMode.DEFAULT);
2438
+ mockConfig.getPermissionManager = vi.fn().mockReturnValue(null);
2439
+ mockChat.sendMessageStream = vi.fn().mockResolvedValue(createStreamWithChunks([
2440
+ {
2441
+ type: core.StreamEventType.CHUNK,
2442
+ value: {
2443
+ functionCalls: [
2444
+ {
2445
+ id: 'call-1',
2446
+ name: 'read_file',
2447
+ args: { path: '/tmp/file.txt' },
2448
+ },
2449
+ ],
2450
+ },
2451
+ },
2452
+ ]));
2453
+ await session.prompt({
2454
+ sessionId: 'test-session-id',
2455
+ prompt: [{ type: 'text', text: 'run tool' }],
2456
+ });
2457
+ expect(mockClient.requestPermission).toHaveBeenCalledWith(expect.objectContaining({
2458
+ options: [
2459
+ expect.objectContaining({ kind: 'allow_once' }),
2460
+ expect.objectContaining({ kind: 'reject_once' }),
2461
+ ],
2462
+ }));
2463
+ const options = mockClient.requestPermission
2464
+ .mock.calls[0][0].options;
2465
+ expect(options.some((option) => option.kind === 'allow_always')).toBe(false);
2466
+ });
2467
+ it('emits terminalSequence returned by permission notification hooks over ACP', async () => {
2468
+ const notificationHookSpy = vi
2469
+ .spyOn(core, 'fireNotificationHook')
2470
+ .mockResolvedValue({ terminalSequence: '\x07' });
2471
+ const executeSpy = vi.fn().mockResolvedValue({
2472
+ llmContent: 'ok',
2473
+ returnDisplay: 'ok',
2474
+ });
2475
+ const onConfirmSpy = vi.fn().mockResolvedValue(undefined);
2476
+ const invocation = {
2477
+ params: { path: '/tmp/file.txt' },
2478
+ getDefaultPermission: vi.fn().mockResolvedValue('ask'),
2479
+ getConfirmationDetails: vi.fn().mockResolvedValue({
2480
+ type: 'info',
2481
+ title: 'Need permission',
2482
+ prompt: 'Allow?',
2483
+ onConfirm: onConfirmSpy,
2484
+ }),
2485
+ getDescription: vi.fn().mockReturnValue('Inspect file'),
2486
+ toolLocations: vi.fn().mockReturnValue([]),
2487
+ execute: executeSpy,
2488
+ };
2489
+ const tool = {
2490
+ name: 'read_file',
2491
+ kind: core.Kind.Read,
2492
+ build: vi.fn().mockReturnValue(invocation),
2493
+ };
2494
+ mockToolRegistry.getTool.mockReturnValue(tool);
2495
+ mockConfig.getApprovalMode = vi
2496
+ .fn()
2497
+ .mockReturnValue(ApprovalMode.DEFAULT);
2498
+ mockConfig.getPermissionManager = vi.fn().mockReturnValue(null);
2499
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
2500
+ mockConfig.getMessageBus = vi.fn().mockReturnValue({});
2501
+ mockChat.sendMessageStream = vi.fn().mockResolvedValue(createStreamWithChunks([
2502
+ {
2503
+ type: core.StreamEventType.CHUNK,
2504
+ value: {
2505
+ functionCalls: [
2506
+ {
2507
+ id: 'call-terminal-sequence',
2508
+ name: 'read_file',
2509
+ args: { path: '/tmp/file.txt' },
2510
+ },
2511
+ ],
2512
+ },
2513
+ },
2514
+ ]));
2515
+ try {
2516
+ await session.prompt({
2517
+ sessionId: 'test-session-id',
2518
+ prompt: [{ type: 'text', text: 'run tool' }],
2519
+ });
2520
+ await new Promise((resolve) => setImmediate(resolve));
2521
+ }
2522
+ finally {
2523
+ notificationHookSpy.mockRestore();
2524
+ }
2525
+ expect(mockClient.extNotification).toHaveBeenCalledWith('qwen/notify/session/terminal-sequence', {
2526
+ v: 1,
2527
+ sessionId: 'test-session-id',
2528
+ terminalSequence: '\x07',
2529
+ });
2530
+ });
2531
+ it('allows info confirmation tools in plan mode', async () => {
2532
+ const executeSpy = vi.fn().mockResolvedValue({
2533
+ llmContent: 'ok',
2534
+ returnDisplay: 'ok',
2535
+ });
2536
+ const onConfirmSpy = vi.fn().mockResolvedValue(undefined);
2537
+ const invocation = {
2538
+ params: {
2539
+ url: 'https://example.com/docs',
2540
+ prompt: 'Summarize the docs',
2541
+ },
2542
+ getDefaultPermission: vi.fn().mockResolvedValue('ask'),
2543
+ getConfirmationDetails: vi.fn().mockResolvedValue({
2544
+ type: 'info',
2545
+ title: 'Confirm Web Fetch',
2546
+ prompt: 'Allow fetching docs?',
2547
+ urls: ['https://example.com/docs'],
2548
+ onConfirm: onConfirmSpy,
2549
+ }),
2550
+ getDescription: vi.fn().mockReturnValue('Fetch docs'),
2551
+ toolLocations: vi.fn().mockReturnValue([]),
2552
+ execute: executeSpy,
2553
+ };
2554
+ const tool = {
2555
+ name: 'web_fetch',
2556
+ kind: core.Kind.Fetch,
2557
+ build: vi.fn().mockReturnValue(invocation),
2558
+ };
2559
+ mockToolRegistry.getTool.mockReturnValue(tool);
2560
+ mockConfig.getApprovalMode = vi.fn().mockReturnValue(ApprovalMode.PLAN);
2561
+ mockConfig.getPermissionManager = vi.fn().mockReturnValue(null);
2562
+ mockChat.sendMessageStream = vi.fn().mockResolvedValue(createStreamWithChunks([
2563
+ {
2564
+ type: core.StreamEventType.CHUNK,
2565
+ value: {
2566
+ functionCalls: [
2567
+ {
2568
+ id: 'call-info-plan',
2569
+ name: 'web_fetch',
2570
+ args: {
2571
+ url: 'https://example.com/docs',
2572
+ prompt: 'Summarize the docs',
2573
+ },
2574
+ },
2575
+ ],
2576
+ },
2577
+ },
2578
+ ]));
2579
+ await session.prompt({
2580
+ sessionId: 'test-session-id',
2581
+ prompt: [{ type: 'text', text: 'research the docs first' }],
2582
+ });
2583
+ expect(mockClient.requestPermission).toHaveBeenCalled();
2584
+ expect(onConfirmSpy).toHaveBeenCalledWith(core.ToolConfirmationOutcome.ProceedOnce, { answers: undefined });
2585
+ expect(executeSpy).toHaveBeenCalled();
2586
+ });
2587
+ it('returns permission error for disabled tools (L1 isToolEnabled check)', async () => {
2588
+ const executeSpy = vi.fn();
2589
+ const invocation = {
2590
+ params: { path: '/tmp/file.txt' },
2591
+ getDefaultPermission: vi.fn().mockResolvedValue('ask'),
2592
+ getConfirmationDetails: vi.fn().mockResolvedValue({
2593
+ type: 'info',
2594
+ title: 'Need permission',
2595
+ prompt: 'Allow?',
2596
+ onConfirm: vi.fn(),
2597
+ }),
2598
+ getDescription: vi.fn().mockReturnValue('Write file'),
2599
+ toolLocations: vi.fn().mockReturnValue([]),
2600
+ execute: executeSpy,
2601
+ };
2602
+ const tool = {
2603
+ name: 'write_file',
2604
+ kind: core.Kind.Edit,
2605
+ build: vi.fn().mockReturnValue(invocation),
2606
+ };
2607
+ mockToolRegistry.getTool.mockReturnValue(tool);
2608
+ mockConfig.getApprovalMode = vi
2609
+ .fn()
2610
+ .mockReturnValue(ApprovalMode.DEFAULT);
2611
+ // Mock a PermissionManager that denies the tool
2612
+ mockConfig.getPermissionManager = vi.fn().mockReturnValue({
2613
+ isToolEnabled: vi.fn().mockResolvedValue(false),
2614
+ });
2615
+ mockChat.sendMessageStream = vi.fn().mockResolvedValue(createStreamWithChunks([
2616
+ {
2617
+ type: core.StreamEventType.CHUNK,
2618
+ value: {
2619
+ functionCalls: [
2620
+ {
2621
+ id: 'call-denied',
2622
+ name: 'write_file',
2623
+ args: { path: '/tmp/file.txt' },
2624
+ },
2625
+ ],
2626
+ },
2627
+ },
2628
+ ]));
2629
+ await session.prompt({
2630
+ sessionId: 'test-session-id',
2631
+ prompt: [{ type: 'text', text: 'write something' }],
2632
+ });
2633
+ // Tool should NOT have been executed
2634
+ expect(executeSpy).not.toHaveBeenCalled();
2635
+ // No permission dialog should have been opened
2636
+ expect(mockClient.requestPermission).not.toHaveBeenCalled();
2637
+ });
2638
+ it('respects permission-request hook allow decisions without opening ACP permission dialog', async () => {
2639
+ const hookSpy = vi
2640
+ .spyOn(core, 'firePermissionRequestHook')
2641
+ .mockResolvedValue({
2642
+ hasDecision: true,
2643
+ shouldAllow: true,
2644
+ updatedInput: { path: '/tmp/updated.txt' },
2645
+ denyMessage: undefined,
2646
+ });
2647
+ const executeSpy = vi.fn().mockResolvedValue({
2648
+ llmContent: 'ok',
2649
+ returnDisplay: 'ok',
2650
+ });
2651
+ const onConfirmSpy = vi.fn().mockResolvedValue(undefined);
2652
+ const invocation = {
2653
+ params: { path: '/tmp/original.txt' },
2654
+ getDefaultPermission: vi.fn().mockResolvedValue('ask'),
2655
+ getConfirmationDetails: vi.fn().mockResolvedValue({
2656
+ type: 'info',
2657
+ title: 'Need permission',
2658
+ prompt: 'Allow?',
2659
+ onConfirm: onConfirmSpy,
2660
+ }),
2661
+ getDescription: vi.fn().mockReturnValue('Inspect file'),
2662
+ toolLocations: vi.fn().mockReturnValue([]),
2663
+ execute: executeSpy,
2664
+ };
2665
+ const tool = {
2666
+ name: 'read_file',
2667
+ kind: core.Kind.Read,
2668
+ build: vi.fn().mockReturnValue(invocation),
2669
+ };
2670
+ mockToolRegistry.getTool.mockReturnValue(tool);
2671
+ mockConfig.getApprovalMode = vi
2672
+ .fn()
2673
+ .mockReturnValue(ApprovalMode.DEFAULT);
2674
+ mockConfig.getPermissionManager = vi.fn().mockReturnValue(null);
2675
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
2676
+ mockConfig.getMessageBus = vi.fn().mockReturnValue({});
2677
+ mockChat.sendMessageStream = vi.fn().mockResolvedValue(createStreamWithChunks([
2678
+ {
2679
+ type: core.StreamEventType.CHUNK,
2680
+ value: {
2681
+ functionCalls: [
2682
+ {
2683
+ id: 'call-2',
2684
+ name: 'read_file',
2685
+ args: { path: '/tmp/original.txt' },
2686
+ },
2687
+ ],
2688
+ },
2689
+ },
2690
+ ]));
2691
+ try {
2692
+ await session.prompt({
2693
+ sessionId: 'test-session-id',
2694
+ prompt: [{ type: 'text', text: 'run tool' }],
2695
+ });
2696
+ }
2697
+ finally {
2698
+ hookSpy.mockRestore();
2699
+ }
2700
+ expect(mockClient.requestPermission).not.toHaveBeenCalled();
2701
+ expect(onConfirmSpy).toHaveBeenCalledWith(core.ToolConfirmationOutcome.ProceedOnce);
2702
+ expect(invocation.params).toEqual({ path: '/tmp/updated.txt' });
2703
+ expect(executeSpy).toHaveBeenCalled();
2704
+ });
2705
+ it('routes ACP protected L4 allow writes through AUTO review', async () => {
2706
+ const cwd = '/repo';
2707
+ let denialState = {
2708
+ consecutiveBlock: 0,
2709
+ consecutiveUnavailable: 0,
2710
+ totalBlock: 0,
2711
+ totalUnavailable: 0,
2712
+ };
2713
+ const baseLlmClient = {
2714
+ generateJson: vi.fn().mockResolvedValue({ shouldBlock: false }),
2715
+ };
2716
+ const getHistoryTail = vi.fn().mockReturnValue([]);
2717
+ const permissionManager = {
2718
+ isToolEnabled: vi.fn().mockResolvedValue(true),
2719
+ hasRelevantRules: vi.fn().mockReturnValue(true),
2720
+ evaluate: vi.fn().mockResolvedValue('allow'),
2721
+ hasMatchingAskRule: vi.fn().mockReturnValue(false),
2722
+ findMatchingDenyRule: vi.fn(),
2723
+ };
2724
+ const executeSpy = vi.fn().mockResolvedValue({
2725
+ llmContent: 'ok',
2726
+ returnDisplay: 'ok',
2727
+ });
2728
+ const invocation = {
2729
+ params: { file_path: '/repo/.qwen/settings.json', content: '{}' },
2730
+ getDefaultPermission: vi.fn().mockResolvedValue('ask'),
2731
+ getConfirmationDetails: vi.fn().mockResolvedValue({
2732
+ type: 'edit',
2733
+ title: 'Confirm file write',
2734
+ fileName: '/repo/.qwen/settings.json',
2735
+ fileDiff: 'diff',
2736
+ onConfirm: vi.fn(),
2737
+ }),
2738
+ getDescription: vi.fn().mockReturnValue('Write file'),
2739
+ toolLocations: vi.fn().mockReturnValue([]),
2740
+ execute: executeSpy,
2741
+ };
2742
+ const tool = {
2743
+ name: core.ToolNames.WRITE_FILE,
2744
+ kind: core.Kind.Edit,
2745
+ build: vi.fn().mockReturnValue(invocation),
2746
+ };
2747
+ mockToolRegistry.getTool.mockReturnValue(tool);
2748
+ mockConfig.getApprovalMode = vi.fn().mockReturnValue(ApprovalMode.AUTO);
2749
+ mockConfig.getTargetDir = vi.fn().mockReturnValue(cwd);
2750
+ mockConfig.getCwd = vi.fn().mockReturnValue(cwd);
2751
+ mockConfig.getPermissionManager = vi
2752
+ .fn()
2753
+ .mockReturnValue(permissionManager);
2754
+ mockConfig.getAutoModeDenialState = vi
2755
+ .fn()
2756
+ .mockImplementation(() => denialState);
2757
+ mockConfig.setAutoModeDenialState = vi
2758
+ .fn()
2759
+ .mockImplementation((next) => {
2760
+ denialState = next;
2761
+ });
2762
+ mockConfig.getBaseLlmClient = vi.fn().mockReturnValue(baseLlmClient);
2763
+ mockConfig.getGeminiClient = vi
2764
+ .fn()
2765
+ .mockReturnValue({ ...mockGeminiClient, getHistoryTail });
2766
+ mockConfig.getAutoModeSettings = vi.fn().mockReturnValue({});
2767
+ mockConfig.getModel = vi.fn().mockReturnValue('test-model');
2768
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(true);
2769
+ mockConfig.getMessageBus = vi.fn().mockReturnValue(undefined);
2770
+ mockChat.sendMessageStream = vi.fn().mockResolvedValue(createStreamWithChunks([
2771
+ {
2772
+ type: core.StreamEventType.CHUNK,
2773
+ value: {
2774
+ functionCalls: [
2775
+ {
2776
+ id: 'call-protected-write',
2777
+ name: core.ToolNames.WRITE_FILE,
2778
+ args: {
2779
+ file_path: '/repo/.qwen/settings.json',
2780
+ content: '{}',
2781
+ },
2782
+ },
2783
+ ],
2784
+ },
2785
+ },
2786
+ ]));
2787
+ await session.prompt({
2788
+ sessionId: 'test-session-id',
2789
+ prompt: [{ type: 'text', text: 'run shell command' }],
2790
+ });
2791
+ expect(permissionManager.evaluate).toHaveBeenCalled();
2792
+ expect(getHistoryTail).toHaveBeenCalled();
2793
+ expect(mockClient.requestPermission).not.toHaveBeenCalled();
2794
+ expect(executeSpy).toHaveBeenCalled();
2795
+ });
2796
+ it('routes ACP Bash(*) protected writes through AUTO review', async () => {
2797
+ const cwd = '/repo';
2798
+ const command = "echo '{}' > .qwen/settings.json";
2799
+ let denialState = {
2800
+ consecutiveBlock: 0,
2801
+ consecutiveUnavailable: 0,
2802
+ totalBlock: 0,
2803
+ totalUnavailable: 0,
2804
+ };
2805
+ const baseLlmClient = {
2806
+ generateJson: vi.fn().mockResolvedValue({ shouldBlock: false }),
2807
+ };
2808
+ const getHistoryTail = vi.fn().mockReturnValue([]);
2809
+ const permissionManager = new core.PermissionManager({
2810
+ getPermissionsAllow: () => ['Bash(*)'],
2811
+ getPermissionsAsk: () => [],
2812
+ getPermissionsDeny: () => [],
2813
+ getCoreTools: () => undefined,
2814
+ getApprovalMode: () => ApprovalMode.DEFAULT,
2815
+ getProjectRoot: () => cwd,
2816
+ getCwd: () => cwd,
2817
+ });
2818
+ permissionManager.initialize();
2819
+ const executeSpy = vi.fn().mockResolvedValue({
2820
+ llmContent: 'ok',
2821
+ returnDisplay: 'ok',
2822
+ });
2823
+ const invocation = {
2824
+ params: { command },
2825
+ getDefaultPermission: vi.fn().mockResolvedValue('ask'),
2826
+ getConfirmationDetails: vi.fn().mockResolvedValue({
2827
+ type: 'exec',
2828
+ title: 'Confirm shell command',
2829
+ command,
2830
+ rootCommand: 'echo',
2831
+ onConfirm: vi.fn(),
2832
+ }),
2833
+ getDescription: vi.fn().mockReturnValue('Run shell command'),
2834
+ toolLocations: vi.fn().mockReturnValue([]),
2835
+ execute: executeSpy,
2836
+ };
2837
+ const tool = {
2838
+ name: core.ToolNames.SHELL,
2839
+ kind: core.Kind.Execute,
2840
+ build: vi.fn().mockReturnValue(invocation),
2841
+ };
2842
+ mockToolRegistry.getTool.mockReturnValue(tool);
2843
+ mockConfig.getApprovalMode = vi.fn().mockReturnValue(ApprovalMode.AUTO);
2844
+ mockConfig.getTargetDir = vi.fn().mockReturnValue(cwd);
2845
+ mockConfig.getCwd = vi.fn().mockReturnValue(cwd);
2846
+ mockConfig.getPermissionManager = vi
2847
+ .fn()
2848
+ .mockReturnValue(permissionManager);
2849
+ mockConfig.getAutoModeDenialState = vi
2850
+ .fn()
2851
+ .mockImplementation(() => denialState);
2852
+ mockConfig.setAutoModeDenialState = vi
2853
+ .fn()
2854
+ .mockImplementation((next) => {
2855
+ denialState = next;
2856
+ });
2857
+ mockConfig.getBaseLlmClient = vi.fn().mockReturnValue(baseLlmClient);
2858
+ mockConfig.getGeminiClient = vi
2859
+ .fn()
2860
+ .mockReturnValue({ ...mockGeminiClient, getHistoryTail });
2861
+ mockConfig.getAutoModeSettings = vi.fn().mockReturnValue({});
2862
+ mockConfig.getModel = vi.fn().mockReturnValue('test-model');
2863
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(true);
2864
+ mockConfig.getMessageBus = vi.fn().mockReturnValue(undefined);
2865
+ mockChat.sendMessageStream = vi.fn().mockResolvedValue(createStreamWithChunks([
2866
+ {
2867
+ type: core.StreamEventType.CHUNK,
2868
+ value: {
2869
+ functionCalls: [
2870
+ {
2871
+ id: 'call-protected-shell-write',
2872
+ name: core.ToolNames.SHELL,
2873
+ args: { command },
2874
+ },
2875
+ ],
2876
+ },
2877
+ },
2878
+ ]));
2879
+ await session.prompt({
2880
+ sessionId: 'test-session-id',
2881
+ prompt: [{ type: 'text', text: 'run shell command' }],
2882
+ });
2883
+ expect(baseLlmClient.generateJson).toHaveBeenCalled();
2884
+ expect(getHistoryTail).toHaveBeenCalled();
2885
+ expect(mockClient.requestPermission).not.toHaveBeenCalled();
2886
+ expect(executeSpy).toHaveBeenCalled();
2887
+ });
2888
+ it('blocks ACP Bash(*) protected writes when AUTO classifier denies', async () => {
2889
+ const cwd = '/repo';
2890
+ const command = "echo '{}' > .qwen/settings.json";
2891
+ let denialState = {
2892
+ consecutiveBlock: 0,
2893
+ consecutiveUnavailable: 0,
2894
+ totalBlock: 0,
2895
+ totalUnavailable: 0,
2896
+ };
2897
+ const baseLlmClient = {
2898
+ generateJson: vi
2899
+ .fn()
2900
+ .mockResolvedValueOnce({ shouldBlock: true })
2901
+ .mockResolvedValueOnce({
2902
+ thinking: 'protected self-modification write',
2903
+ shouldBlock: true,
2904
+ reason: 'protected write',
2905
+ }),
2906
+ };
2907
+ const getHistoryTail = vi.fn().mockReturnValue([]);
2908
+ const permissionManager = new core.PermissionManager({
2909
+ getPermissionsAllow: () => ['Bash(*)'],
2910
+ getPermissionsAsk: () => [],
2911
+ getPermissionsDeny: () => [],
2912
+ getCoreTools: () => undefined,
2913
+ getApprovalMode: () => ApprovalMode.DEFAULT,
2914
+ getProjectRoot: () => cwd,
2915
+ getCwd: () => cwd,
2916
+ });
2917
+ permissionManager.initialize();
2918
+ const executeSpy = vi.fn().mockResolvedValue({
2919
+ llmContent: 'ok',
2920
+ returnDisplay: 'ok',
2921
+ });
2922
+ const invocation = {
2923
+ params: { command },
2924
+ getDefaultPermission: vi.fn().mockResolvedValue('ask'),
2925
+ getConfirmationDetails: vi.fn().mockResolvedValue({
2926
+ type: 'exec',
2927
+ title: 'Confirm shell command',
2928
+ command,
2929
+ rootCommand: 'echo',
2930
+ onConfirm: vi.fn(),
2931
+ }),
2932
+ getDescription: vi.fn().mockReturnValue('Run shell command'),
2933
+ toolLocations: vi.fn().mockReturnValue([]),
2934
+ execute: executeSpy,
2935
+ };
2936
+ const tool = {
2937
+ name: core.ToolNames.SHELL,
2938
+ kind: core.Kind.Execute,
2939
+ build: vi.fn().mockReturnValue(invocation),
2940
+ };
2941
+ mockToolRegistry.getTool.mockReturnValue(tool);
2942
+ mockConfig.getApprovalMode = vi.fn().mockReturnValue(ApprovalMode.AUTO);
2943
+ mockConfig.getTargetDir = vi.fn().mockReturnValue(cwd);
2944
+ mockConfig.getCwd = vi.fn().mockReturnValue(cwd);
2945
+ mockConfig.getPermissionManager = vi
2946
+ .fn()
2947
+ .mockReturnValue(permissionManager);
2948
+ mockConfig.getAutoModeDenialState = vi
2949
+ .fn()
2950
+ .mockImplementation(() => denialState);
2951
+ mockConfig.setAutoModeDenialState = vi
2952
+ .fn()
2953
+ .mockImplementation((next) => {
2954
+ denialState = next;
2955
+ });
2956
+ mockConfig.getBaseLlmClient = vi.fn().mockReturnValue(baseLlmClient);
2957
+ mockConfig.getGeminiClient = vi
2958
+ .fn()
2959
+ .mockReturnValue({ ...mockGeminiClient, getHistoryTail });
2960
+ mockConfig.getAutoModeSettings = vi.fn().mockReturnValue({});
2961
+ mockConfig.getModel = vi.fn().mockReturnValue('test-model');
2962
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(true);
2963
+ mockConfig.getMessageBus = vi.fn().mockReturnValue(undefined);
2964
+ mockChat.sendMessageStream = vi.fn().mockResolvedValue(createStreamWithChunks([
2965
+ {
2966
+ type: core.StreamEventType.CHUNK,
2967
+ value: {
2968
+ functionCalls: [
2969
+ {
2970
+ id: 'call-protected-shell-write',
2971
+ name: core.ToolNames.SHELL,
2972
+ args: { command },
2973
+ },
2974
+ ],
2975
+ },
2976
+ },
2977
+ ]));
2978
+ await session.prompt({
2979
+ sessionId: 'test-session-id',
2980
+ prompt: [{ type: 'text', text: 'run shell command' }],
2981
+ });
2982
+ expect(baseLlmClient.generateJson).toHaveBeenCalled();
2983
+ expect(getHistoryTail).toHaveBeenCalled();
2984
+ expect(mockClient.requestPermission).not.toHaveBeenCalled();
2985
+ expect(executeSpy).not.toHaveBeenCalled();
2986
+ expect(mockChatRecordingService.recordToolResult).toHaveBeenCalledWith(expect.arrayContaining([
2987
+ expect.objectContaining({
2988
+ functionResponse: expect.objectContaining({
2989
+ name: core.ToolNames.SHELL,
2990
+ response: expect.objectContaining({
2991
+ error: expect.stringContaining('protected write'),
2992
+ }),
2993
+ }),
2994
+ }),
2995
+ ]), expect.objectContaining({ callId: 'call-protected-shell-write' }));
2996
+ });
2997
+ it('resets AUTO denial counters when the user approves a denialTracking fallback prompt', async () => {
2998
+ const executeSpy = vi.fn().mockResolvedValue({
2999
+ llmContent: 'ok',
3000
+ returnDisplay: 'ok',
3001
+ });
3002
+ const onConfirmSpy = vi.fn().mockResolvedValue(undefined);
3003
+ const setAutoModeDenialState = vi.fn();
3004
+ const invocation = {
3005
+ params: { command: 'python -c "print(1)"' },
3006
+ getDefaultPermission: vi.fn().mockResolvedValue('ask'),
3007
+ getConfirmationDetails: vi.fn().mockResolvedValue({
3008
+ type: 'exec',
3009
+ title: 'Need permission',
3010
+ command: 'python',
3011
+ rootCommand: 'python',
3012
+ onConfirm: onConfirmSpy,
3013
+ }),
3014
+ getDescription: vi.fn().mockReturnValue('Run command'),
3015
+ toolLocations: vi.fn().mockReturnValue([]),
3016
+ execute: executeSpy,
3017
+ };
3018
+ const tool = {
3019
+ name: core.ToolNames.SHELL,
3020
+ kind: core.Kind.Execute,
3021
+ build: vi.fn().mockReturnValue(invocation),
3022
+ };
3023
+ mockToolRegistry.getTool.mockReturnValue(tool);
3024
+ mockConfig.getApprovalMode = vi.fn().mockReturnValue(ApprovalMode.AUTO);
3025
+ mockConfig.getCwd = vi.fn().mockReturnValue('/repo');
3026
+ mockConfig.getPermissionManager = vi.fn().mockReturnValue(null);
3027
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(true);
3028
+ mockConfig.getMessageBus = vi.fn().mockReturnValue(undefined);
3029
+ mockConfig.getAutoModeDenialState = vi.fn().mockReturnValue({
3030
+ consecutiveBlock: 0,
3031
+ consecutiveUnavailable: 0,
3032
+ totalBlock: 20,
3033
+ totalUnavailable: 0,
3034
+ });
3035
+ mockConfig.setAutoModeDenialState = setAutoModeDenialState;
3036
+ mockGeminiClient.getHistoryTail = vi.fn().mockReturnValue([]);
3037
+ mockChat.sendMessageStream = vi.fn().mockResolvedValue(createStreamWithChunks([
3038
+ {
3039
+ type: core.StreamEventType.CHUNK,
3040
+ value: {
3041
+ functionCalls: [
3042
+ {
3043
+ id: 'call-auto-fallback-hook-approved',
3044
+ name: core.ToolNames.SHELL,
3045
+ args: { command: 'python -c "print(1)"' },
3046
+ },
3047
+ ],
3048
+ },
3049
+ },
3050
+ ]));
3051
+ debugLoggerWarnSpy.mockClear();
3052
+ await session.prompt({
3053
+ sessionId: 'test-session-id',
3054
+ prompt: [{ type: 'text', text: 'run tool' }],
3055
+ });
3056
+ await vi.waitFor(() => {
3057
+ expect(mockClient.requestPermission).toHaveBeenCalled();
3058
+ expect(onConfirmSpy).toHaveBeenCalledWith(core.ToolConfirmationOutcome.ProceedOnce, { answers: undefined });
3059
+ expect(setAutoModeDenialState).toHaveBeenCalledWith({
3060
+ consecutiveBlock: 0,
3061
+ consecutiveUnavailable: 0,
3062
+ totalBlock: 0,
3063
+ totalUnavailable: 0,
3064
+ });
3065
+ expect(executeSpy).toHaveBeenCalled();
3066
+ });
3067
+ expect(debugLoggerWarnSpy).toHaveBeenCalledWith(expect.stringContaining('Auto mode denial counters reset after fallback approval'));
3068
+ });
3069
+ describe('hooks', () => {
3070
+ describe('PermissionDenied hook', () => {
3071
+ it('fires PermissionDenied hooks for AUTO classifier blocks', async () => {
3072
+ const hookSystem = {
3073
+ firePermissionDeniedEvent: vi.fn().mockResolvedValue(undefined),
3074
+ };
3075
+ mockConfig.getHookSystem = vi.fn().mockReturnValue(hookSystem);
3076
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
3077
+ const signal = new AbortController().signal;
3078
+ await fireSessionPermissionDeniedForAutoMode(mockConfig, {
3079
+ via: 'classifier',
3080
+ shouldBlock: true,
3081
+ reason: 'dangerous shell command',
3082
+ unavailable: false,
3083
+ stage: 'fast',
3084
+ durationMs: 20,
3085
+ }, {
3086
+ kind: 'blocked',
3087
+ errorMessage: 'blocked',
3088
+ reason: 'classifier_blocked',
3089
+ }, core.ToolNames.SHELL, { command: 'rm -rf /tmp/example' }, 'auto-denied-acp', signal);
3090
+ expect(hookSystem.firePermissionDeniedEvent).toHaveBeenCalledWith(core.ToolNames.SHELL, { command: 'rm -rf /tmp/example' }, 'auto-denied-acp', 'classifier_blocked', signal);
3091
+ });
3092
+ it('forwards classifier_unavailable reasons to PermissionDenied hooks', async () => {
3093
+ const hookSystem = {
3094
+ firePermissionDeniedEvent: vi.fn().mockResolvedValue(undefined),
3095
+ };
3096
+ mockConfig.getHookSystem = vi.fn().mockReturnValue(hookSystem);
3097
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
3098
+ await fireSessionPermissionDeniedForAutoMode(mockConfig, {
3099
+ via: 'classifier',
3100
+ shouldBlock: true,
3101
+ reason: 'classifier timeout',
3102
+ unavailable: true,
3103
+ stage: 'fast',
3104
+ durationMs: 3000,
3105
+ }, {
3106
+ kind: 'blocked',
3107
+ errorMessage: 'blocked',
3108
+ reason: 'classifier_unavailable',
3109
+ }, core.ToolNames.SHELL, { command: 'rm -rf /tmp/example' }, 'auto-denied-acp', new AbortController().signal);
3110
+ expect(hookSystem.firePermissionDeniedEvent).toHaveBeenCalledWith(core.ToolNames.SHELL, { command: 'rm -rf /tmp/example' }, 'auto-denied-acp', 'classifier_unavailable', expect.any(AbortSignal));
3111
+ });
3112
+ it('continues AUTO block handling when PermissionDenied hook fails', async () => {
3113
+ const hookSystem = {
3114
+ firePermissionDeniedEvent: vi
3115
+ .fn()
3116
+ .mockRejectedValueOnce(new Error('hook failed')),
3117
+ };
3118
+ mockConfig.getHookSystem = vi.fn().mockReturnValue(hookSystem);
3119
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
3120
+ await fireSessionPermissionDeniedForAutoMode(mockConfig, {
3121
+ via: 'classifier',
3122
+ shouldBlock: true,
3123
+ reason: 'dangerous shell command',
3124
+ unavailable: false,
3125
+ stage: 'fast',
3126
+ durationMs: 20,
3127
+ }, {
3128
+ kind: 'blocked',
3129
+ errorMessage: 'blocked',
3130
+ reason: 'classifier_blocked',
3131
+ }, core.ToolNames.SHELL, { command: 'rm -rf /tmp/example' }, 'auto-denied-acp', new AbortController().signal);
3132
+ expect(hookSystem.firePermissionDeniedEvent).toHaveBeenCalled();
3133
+ });
3134
+ it('skips PermissionDenied hooks when hooks are disabled', async () => {
3135
+ const hookSystem = {
3136
+ firePermissionDeniedEvent: vi.fn().mockResolvedValue(undefined),
3137
+ };
3138
+ mockConfig.getHookSystem = vi.fn().mockReturnValue(hookSystem);
3139
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(true);
3140
+ await fireSessionPermissionDeniedForAutoMode(mockConfig, {
3141
+ via: 'classifier',
3142
+ shouldBlock: true,
3143
+ reason: 'dangerous shell command',
3144
+ unavailable: false,
3145
+ stage: 'fast',
3146
+ durationMs: 20,
3147
+ }, {
3148
+ kind: 'blocked',
3149
+ errorMessage: 'blocked',
3150
+ reason: 'classifier_blocked',
3151
+ }, core.ToolNames.SHELL, { command: 'rm -rf /tmp/example' }, 'auto-denied-acp', new AbortController().signal);
3152
+ expect(hookSystem.firePermissionDeniedEvent).not.toHaveBeenCalled();
3153
+ });
3154
+ it('skips PermissionDenied hooks when AUTO outcome is not blocked', async () => {
3155
+ const hookSystem = {
3156
+ firePermissionDeniedEvent: vi.fn().mockResolvedValue(undefined),
3157
+ };
3158
+ mockConfig.getHookSystem = vi.fn().mockReturnValue(hookSystem);
3159
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
3160
+ await fireSessionPermissionDeniedForAutoMode(mockConfig, {
3161
+ via: 'classifier',
3162
+ shouldBlock: true,
3163
+ reason: 'dangerous shell command',
3164
+ unavailable: false,
3165
+ stage: 'fast',
3166
+ durationMs: 20,
3167
+ }, { kind: 'fallback', reason: 'safety_check' }, core.ToolNames.SHELL, { command: 'rm -rf /tmp/example' }, 'auto-denied-acp', new AbortController().signal);
3168
+ expect(hookSystem.firePermissionDeniedEvent).not.toHaveBeenCalled();
3169
+ });
3170
+ });
3171
+ describe('UserPromptSubmit hook', () => {
3172
+ it('fires UserPromptSubmit hook before sending prompt', async () => {
3173
+ const messageBus = {
3174
+ request: vi.fn().mockResolvedValue({
3175
+ success: true,
3176
+ output: {},
3177
+ }),
3178
+ };
3179
+ mockConfig.getMessageBus = vi.fn().mockReturnValue(messageBus);
3180
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
3181
+ mockConfig.hasHooksForEvent = vi.fn().mockReturnValue(true);
3182
+ mockChat.sendMessageStream = vi.fn().mockResolvedValue(createStreamWithChunks([
3183
+ {
3184
+ type: core.StreamEventType.CHUNK,
3185
+ value: {
3186
+ candidates: [{ content: { parts: [{ text: 'response' }] } }],
3187
+ },
3188
+ },
3189
+ ]));
3190
+ await session.prompt({
3191
+ sessionId: 'test-session-id',
3192
+ prompt: [{ type: 'text', text: 'hello' }],
3193
+ });
3194
+ expect(messageBus.request).toHaveBeenCalledWith(expect.objectContaining({
3195
+ eventName: 'UserPromptSubmit',
3196
+ input: { prompt: 'hello' },
3197
+ }), expect.anything());
3198
+ });
3199
+ it('blocks prompt when UserPromptSubmit hook returns blocking decision', async () => {
3200
+ const messageBus = {
3201
+ request: vi.fn().mockResolvedValue({
3202
+ success: true,
3203
+ output: { decision: 'block', reason: 'Blocked by hook' },
3204
+ }),
3205
+ };
3206
+ mockConfig.getMessageBus = vi.fn().mockReturnValue(messageBus);
3207
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
3208
+ mockConfig.hasHooksForEvent = vi.fn().mockReturnValue(true);
3209
+ mockChat.sendMessageStream = vi.fn();
3210
+ const result = await session.prompt({
3211
+ sessionId: 'test-session-id',
3212
+ prompt: [{ type: 'text', text: 'blocked prompt' }],
3213
+ });
3214
+ expect(mockChat.sendMessageStream).not.toHaveBeenCalled();
3215
+ expect(result.stopReason).toBe('end_turn');
3216
+ });
3217
+ });
3218
+ describe('Stop hook', () => {
3219
+ it('fires Stop hook after model response completes', async () => {
3220
+ const messageBus = {
3221
+ request: vi.fn().mockResolvedValue({
3222
+ success: true,
3223
+ output: {},
3224
+ }),
3225
+ };
3226
+ mockConfig.getMessageBus = vi.fn().mockReturnValue(messageBus);
3227
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
3228
+ mockConfig.hasHooksForEvent = vi
3229
+ .fn()
3230
+ .mockImplementation((eventName) => eventName === 'Stop');
3231
+ mockChat.getHistory = vi
3232
+ .fn()
3233
+ .mockReturnValue([
3234
+ { role: 'model', parts: [{ text: 'response text' }] },
3235
+ ]);
3236
+ mockChat.getLastModelMessageText = vi
3237
+ .fn()
3238
+ .mockReturnValue('response text');
3239
+ mockChat.sendMessageStream = vi.fn().mockResolvedValue(createStreamWithChunks([
3240
+ {
3241
+ type: core.StreamEventType.CHUNK,
3242
+ value: {
3243
+ candidates: [{ content: { parts: [{ text: 'response' }] } }],
3244
+ },
3245
+ },
3246
+ ]));
3247
+ await session.prompt({
3248
+ sessionId: 'test-session-id',
3249
+ prompt: [{ type: 'text', text: 'hello' }],
3250
+ });
3251
+ expect(messageBus.request).toHaveBeenCalledWith(expect.objectContaining({
3252
+ eventName: 'Stop',
3253
+ input: expect.objectContaining({
3254
+ stop_hook_active: true,
3255
+ last_assistant_message: 'response text',
3256
+ }),
3257
+ }), expect.anything());
3258
+ });
3259
+ it('ends Stop hook continuation when the blocking cap is reached', async () => {
3260
+ const messageBus = {
3261
+ request: vi.fn().mockImplementation(async (request) => ({
3262
+ success: true,
3263
+ output: request.eventName === 'Stop'
3264
+ ? {
3265
+ decision: 'block',
3266
+ reason: 'Continue after Stop hook',
3267
+ }
3268
+ : {},
3269
+ })),
3270
+ };
3271
+ mockConfig.getMessageBus = vi.fn().mockReturnValue(messageBus);
3272
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
3273
+ mockConfig.hasHooksForEvent = vi
3274
+ .fn()
3275
+ .mockImplementation((eventName) => eventName === 'Stop');
3276
+ mockConfig.getStopHookBlockingCap = vi.fn().mockReturnValue(2);
3277
+ mockChat.getHistory = vi
3278
+ .fn()
3279
+ .mockReturnValue([
3280
+ { role: 'model', parts: [{ text: 'response text' }] },
3281
+ ]);
3282
+ mockChat.getLastModelMessageText = vi
3283
+ .fn()
3284
+ .mockReturnValue('response text');
3285
+ mockChat.sendMessageStream = vi
3286
+ .fn()
3287
+ .mockResolvedValue(createEmptyStream());
3288
+ const result = await session.prompt({
3289
+ sessionId: 'test-session-id',
3290
+ prompt: [{ type: 'text', text: 'hello' }],
3291
+ });
3292
+ expect(result).toEqual({ stopReason: 'end_turn' });
3293
+ expect(messageBus.request).toHaveBeenCalledTimes(2);
3294
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(2);
3295
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
3296
+ sessionId: 'test-session-id',
3297
+ update: {
3298
+ sessionUpdate: 'agent_message_chunk',
3299
+ content: {
3300
+ type: 'text',
3301
+ text: 'Stop hook blocked continuation 2 consecutive times; overriding and ending the turn.',
3302
+ },
3303
+ },
3304
+ });
3305
+ });
3306
+ it('emits the cap warning without retrying when the blocking cap is one', async () => {
3307
+ const messageBus = {
3308
+ request: vi.fn().mockResolvedValue({
3309
+ success: true,
3310
+ output: {
3311
+ decision: 'block',
3312
+ reason: 'Continue after Stop hook',
3313
+ },
3314
+ }),
3315
+ };
3316
+ mockConfig.getMessageBus = vi.fn().mockReturnValue(messageBus);
3317
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
3318
+ mockConfig.hasHooksForEvent = vi
3319
+ .fn()
3320
+ .mockImplementation((eventName) => eventName === 'Stop');
3321
+ mockConfig.getStopHookBlockingCap = vi.fn().mockReturnValue(1);
3322
+ mockChat.getHistory = vi
3323
+ .fn()
3324
+ .mockReturnValue([
3325
+ { role: 'model', parts: [{ text: 'response text' }] },
3326
+ ]);
3327
+ mockChat.getLastModelMessageText = vi
3328
+ .fn()
3329
+ .mockReturnValue('response text');
3330
+ mockChat.sendMessageStream = vi
3331
+ .fn()
3332
+ .mockResolvedValue(createEmptyStream());
3333
+ const result = await session.prompt({
3334
+ sessionId: 'test-session-id',
3335
+ prompt: [{ type: 'text', text: 'hello' }],
3336
+ });
3337
+ expect(result).toEqual({ stopReason: 'end_turn' });
3338
+ expect(messageBus.request).toHaveBeenCalledTimes(1);
3339
+ expect(mockChat.sendMessageStream).toHaveBeenCalledTimes(1);
3340
+ expect(mockClient.sessionUpdate).toHaveBeenCalledWith({
3341
+ sessionId: 'test-session-id',
3342
+ update: {
3343
+ sessionUpdate: 'agent_message_chunk',
3344
+ content: {
3345
+ type: 'text',
3346
+ text: 'Stop hook blocked continuation 1 consecutive time; overriding and ending the turn.',
3347
+ },
3348
+ },
3349
+ });
3350
+ });
3351
+ });
3352
+ describe('PreToolUse hook', () => {
3353
+ it('fires PreToolUse hook before tool execution', async () => {
3354
+ const messageBus = {
3355
+ request: vi.fn().mockResolvedValue({
3356
+ success: true,
3357
+ output: {},
3358
+ }),
3359
+ };
3360
+ mockConfig.getMessageBus = vi.fn().mockReturnValue(messageBus);
3361
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
3362
+ mockConfig.getApprovalMode = vi
3363
+ .fn()
3364
+ .mockReturnValue(ApprovalMode.YOLO);
3365
+ const executeSpy = vi.fn().mockResolvedValue({
3366
+ llmContent: 'result',
3367
+ returnDisplay: 'done',
3368
+ });
3369
+ const tool = {
3370
+ name: 'read_file',
3371
+ kind: core.Kind.Read,
3372
+ build: vi.fn().mockReturnValue({
3373
+ params: { path: '/tmp/test.txt' },
3374
+ getDefaultPermission: vi.fn().mockResolvedValue('allow'),
3375
+ execute: executeSpy,
3376
+ }),
3377
+ };
3378
+ mockToolRegistry.getTool.mockReturnValue(tool);
3379
+ mockChat.sendMessageStream = vi.fn().mockResolvedValue(createStreamWithChunks([
3380
+ {
3381
+ type: core.StreamEventType.CHUNK,
3382
+ value: {
3383
+ functionCalls: [
3384
+ {
3385
+ id: 'call-1',
3386
+ name: 'read_file',
3387
+ args: { path: '/tmp/test.txt' },
3388
+ },
3389
+ ],
3390
+ },
3391
+ },
3392
+ ]));
3393
+ await session.prompt({
3394
+ sessionId: 'test-session-id',
3395
+ prompt: [{ type: 'text', text: 'read the file' }],
3396
+ });
3397
+ expect(messageBus.request).toHaveBeenCalledWith(expect.objectContaining({
3398
+ eventName: 'PreToolUse',
3399
+ input: expect.objectContaining({
3400
+ tool_name: 'read_file',
3401
+ tool_input: { path: '/tmp/test.txt' },
3402
+ }),
3403
+ }), expect.anything());
3404
+ });
3405
+ it('blocks tool execution when PreToolUse hook returns blocking decision', async () => {
3406
+ const messageBus = {
3407
+ request: vi.fn().mockResolvedValue({
3408
+ success: true,
3409
+ output: { decision: 'deny', reason: 'Tool blocked by hook' },
3410
+ }),
3411
+ };
3412
+ mockConfig.getMessageBus = vi.fn().mockReturnValue(messageBus);
3413
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
3414
+ mockConfig.getApprovalMode = vi
3415
+ .fn()
3416
+ .mockReturnValue(ApprovalMode.YOLO);
3417
+ const executeSpy = vi.fn();
3418
+ const tool = {
3419
+ name: 'read_file',
3420
+ kind: core.Kind.Read,
3421
+ build: vi.fn().mockReturnValue({
3422
+ params: { path: '/tmp/test.txt' },
3423
+ getDefaultPermission: vi.fn().mockResolvedValue('allow'),
3424
+ execute: executeSpy,
3425
+ }),
3426
+ };
3427
+ mockToolRegistry.getTool.mockReturnValue(tool);
3428
+ mockChat.sendMessageStream = vi.fn().mockResolvedValue(createStreamWithChunks([
3429
+ {
3430
+ type: core.StreamEventType.CHUNK,
3431
+ value: {
3432
+ functionCalls: [
3433
+ {
3434
+ id: 'call-1',
3435
+ name: 'read_file',
3436
+ args: { path: '/tmp/test.txt' },
3437
+ },
3438
+ ],
3439
+ },
3440
+ },
3441
+ ]));
3442
+ await session.prompt({
3443
+ sessionId: 'test-session-id',
3444
+ prompt: [{ type: 'text', text: 'read the file' }],
3445
+ });
3446
+ expect(executeSpy).not.toHaveBeenCalled();
3447
+ });
3448
+ });
3449
+ describe('PostToolUse hook', () => {
3450
+ it('fires PostToolUse hook after successful tool execution', async () => {
3451
+ const messageBus = {
3452
+ request: vi.fn().mockResolvedValue({
3453
+ success: true,
3454
+ output: {},
3455
+ }),
3456
+ };
3457
+ mockConfig.getMessageBus = vi.fn().mockReturnValue(messageBus);
3458
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
3459
+ mockConfig.getApprovalMode = vi
3460
+ .fn()
3461
+ .mockReturnValue(ApprovalMode.YOLO);
3462
+ const executeSpy = vi.fn().mockResolvedValue({
3463
+ llmContent: 'file contents',
3464
+ returnDisplay: 'success',
3465
+ });
3466
+ const tool = {
3467
+ name: 'read_file',
3468
+ kind: core.Kind.Read,
3469
+ build: vi.fn().mockReturnValue({
3470
+ params: { path: '/tmp/test.txt' },
3471
+ getDefaultPermission: vi.fn().mockResolvedValue('allow'),
3472
+ execute: executeSpy,
3473
+ }),
3474
+ };
3475
+ mockToolRegistry.getTool.mockReturnValue(tool);
3476
+ mockChat.sendMessageStream = vi.fn().mockResolvedValue(createStreamWithChunks([
3477
+ {
3478
+ type: core.StreamEventType.CHUNK,
3479
+ value: {
3480
+ functionCalls: [
3481
+ {
3482
+ id: 'call-1',
3483
+ name: 'read_file',
3484
+ args: { path: '/tmp/test.txt' },
3485
+ },
3486
+ ],
3487
+ },
3488
+ },
3489
+ ]));
3490
+ await session.prompt({
3491
+ sessionId: 'test-session-id',
3492
+ prompt: [{ type: 'text', text: 'read the file' }],
3493
+ });
3494
+ expect(messageBus.request).toHaveBeenCalledWith(expect.objectContaining({
3495
+ eventName: 'PostToolUse',
3496
+ input: expect.objectContaining({
3497
+ tool_name: 'read_file',
3498
+ tool_response: expect.objectContaining({
3499
+ llmContent: 'file contents',
3500
+ returnDisplay: 'success',
3501
+ }),
3502
+ }),
3503
+ }), expect.anything());
3504
+ });
3505
+ it('stops execution when PostToolUse hook returns shouldStop', async () => {
3506
+ const messageBus = {
3507
+ request: vi.fn().mockResolvedValue({
3508
+ success: true,
3509
+ output: { shouldStop: true, reason: 'Stopping per hook request' },
3510
+ }),
3511
+ };
3512
+ mockConfig.getMessageBus = vi.fn().mockReturnValue(messageBus);
3513
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
3514
+ mockConfig.getApprovalMode = vi
3515
+ .fn()
3516
+ .mockReturnValue(ApprovalMode.YOLO);
3517
+ const executeSpy = vi.fn().mockResolvedValue({
3518
+ llmContent: 'file contents',
3519
+ returnDisplay: 'success',
3520
+ });
3521
+ const tool = {
3522
+ name: 'read_file',
3523
+ kind: core.Kind.Read,
3524
+ build: vi.fn().mockReturnValue({
3525
+ params: { path: '/tmp/test.txt' },
3526
+ getDefaultPermission: vi.fn().mockResolvedValue('allow'),
3527
+ execute: executeSpy,
3528
+ }),
3529
+ };
3530
+ mockToolRegistry.getTool.mockReturnValue(tool);
3531
+ // Only one call expected since shouldStop prevents continuation
3532
+ mockChat.sendMessageStream = vi.fn().mockResolvedValue(createStreamWithChunks([
3533
+ {
3534
+ type: core.StreamEventType.CHUNK,
3535
+ value: {
3536
+ functionCalls: [
3537
+ {
3538
+ id: 'call-1',
3539
+ name: 'read_file',
3540
+ args: { path: '/tmp/test.txt' },
3541
+ },
3542
+ ],
3543
+ },
3544
+ },
3545
+ ]));
3546
+ await session.prompt({
3547
+ sessionId: 'test-session-id',
3548
+ prompt: [{ type: 'text', text: 'read the file' }],
3549
+ });
3550
+ // Tool should have been executed
3551
+ expect(executeSpy).toHaveBeenCalled();
3552
+ // PostToolUse hook should have been called
3553
+ expect(messageBus.request).toHaveBeenCalledWith(expect.objectContaining({
3554
+ eventName: 'PostToolUse',
3555
+ }), expect.anything());
3556
+ });
3557
+ });
3558
+ describe('PostToolUseFailure hook', () => {
3559
+ it('fires PostToolUseFailure hook when tool execution fails', async () => {
3560
+ const messageBus = {
3561
+ request: vi.fn().mockResolvedValue({
3562
+ success: true,
3563
+ output: {},
3564
+ }),
3565
+ };
3566
+ mockConfig.getMessageBus = vi.fn().mockReturnValue(messageBus);
3567
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
3568
+ mockConfig.getApprovalMode = vi
3569
+ .fn()
3570
+ .mockReturnValue(ApprovalMode.YOLO);
3571
+ const executeSpy = vi
3572
+ .fn()
3573
+ .mockRejectedValue(new Error('Tool failed'));
3574
+ const tool = {
3575
+ name: 'read_file',
3576
+ kind: core.Kind.Read,
3577
+ build: vi.fn().mockReturnValue({
3578
+ params: { path: '/tmp/test.txt' },
3579
+ getDefaultPermission: vi.fn().mockResolvedValue('allow'),
3580
+ execute: executeSpy,
3581
+ }),
3582
+ };
3583
+ mockToolRegistry.getTool.mockReturnValue(tool);
3584
+ mockChat.sendMessageStream = vi.fn().mockResolvedValue(createStreamWithChunks([
3585
+ {
3586
+ type: core.StreamEventType.CHUNK,
3587
+ value: {
3588
+ functionCalls: [
3589
+ {
3590
+ id: 'call-1',
3591
+ name: 'read_file',
3592
+ args: { path: '/tmp/test.txt' },
3593
+ },
3594
+ ],
3595
+ },
3596
+ },
3597
+ ]));
3598
+ await session.prompt({
3599
+ sessionId: 'test-session-id',
3600
+ prompt: [{ type: 'text', text: 'read the file' }],
3601
+ });
3602
+ expect(messageBus.request).toHaveBeenCalledWith(expect.objectContaining({
3603
+ eventName: 'PostToolUseFailure',
3604
+ input: expect.objectContaining({
3605
+ tool_name: 'read_file',
3606
+ error: 'Tool failed',
3607
+ }),
3608
+ }), expect.anything());
3609
+ });
3610
+ });
3611
+ describe('StopFailure hook', () => {
3612
+ it('fires StopFailure hook when API error occurs during sendMessageStream', async () => {
3613
+ const mockFireStopFailureEvent = vi.fn().mockResolvedValue({
3614
+ success: true,
3615
+ });
3616
+ mockConfig.getHookSystem = vi.fn().mockReturnValue({
3617
+ fireStopFailureEvent: mockFireStopFailureEvent,
3618
+ });
3619
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(false);
3620
+ mockConfig.hasHooksForEvent = vi.fn().mockReturnValue(true);
3621
+ // Simulate API error (rate limit)
3622
+ const apiError = new Error('Rate limit exceeded');
3623
+ apiError.status = 429;
3624
+ mockChat.sendMessageStream = vi.fn().mockImplementation(async () => {
3625
+ throw apiError;
3626
+ });
3627
+ await expect(session.prompt({
3628
+ sessionId: 'test-session-id',
3629
+ prompt: [{ type: 'text', text: 'hello' }],
3630
+ })).rejects.toThrow();
3631
+ // StopFailure hook should be called with rate_limit error type
3632
+ expect(mockFireStopFailureEvent).toHaveBeenCalledWith('rate_limit', 'Rate limit exceeded');
3633
+ });
3634
+ it('does not fire StopFailure hook when hooks are disabled', async () => {
3635
+ const mockFireStopFailureEvent = vi.fn();
3636
+ mockConfig.getHookSystem = vi.fn().mockReturnValue({
3637
+ fireStopFailureEvent: mockFireStopFailureEvent,
3638
+ });
3639
+ mockConfig.getDisableAllHooks = vi.fn().mockReturnValue(true);
3640
+ const apiError = new Error('Rate limit exceeded');
3641
+ apiError.status = 429;
3642
+ mockChat.sendMessageStream = vi.fn().mockImplementation(async () => {
3643
+ throw apiError;
3644
+ });
3645
+ await expect(session.prompt({
3646
+ sessionId: 'test-session-id',
3647
+ prompt: [{ type: 'text', text: 'hello' }],
3648
+ })).rejects.toThrow();
3649
+ expect(mockFireStopFailureEvent).not.toHaveBeenCalled();
3650
+ });
3651
+ });
3652
+ });
3653
+ describe('tool call concurrency', () => {
3654
+ it('runs multiple Agent tool calls concurrently (issue #2516)', async () => {
3655
+ const makeDeferred = () => {
3656
+ let resolve;
3657
+ const promise = new Promise((r) => {
3658
+ resolve = r;
3659
+ });
3660
+ return { promise, resolve };
3661
+ };
3662
+ const called = {
3663
+ 'call-a': makeDeferred(),
3664
+ 'call-b': makeDeferred(),
3665
+ };
3666
+ const result = {
3667
+ 'call-a': makeDeferred(),
3668
+ 'call-b': makeDeferred(),
3669
+ };
3670
+ const agentTool = {
3671
+ name: core.ToolNames.AGENT,
3672
+ kind: core.Kind.Think,
3673
+ build: vi.fn().mockImplementation((args) => {
3674
+ const id = args['_test_id'];
3675
+ return {
3676
+ params: args,
3677
+ eventEmitter: undefined,
3678
+ getDefaultPermission: vi.fn().mockResolvedValue('allow'),
3679
+ getDescription: vi.fn().mockReturnValue(`agent ${id}`),
3680
+ toolLocations: vi.fn().mockReturnValue([]),
3681
+ execute: vi.fn().mockImplementation(() => {
3682
+ called[id].resolve();
3683
+ return result[id].promise;
3684
+ }),
3685
+ };
3686
+ }),
3687
+ };
3688
+ mockToolRegistry.getTool.mockImplementation((name) => name === core.ToolNames.AGENT ? agentTool : undefined);
3689
+ mockConfig.getApprovalMode = vi
3690
+ .fn()
3691
+ .mockReturnValue(ApprovalMode.DEFAULT);
3692
+ mockConfig.getPermissionManager = vi.fn().mockReturnValue(null);
3693
+ // Model returns two Agent calls, then an empty stream once results
3694
+ // are fed back (to terminate the prompt loop).
3695
+ const sendMessageStream = vi
3696
+ .fn()
3697
+ .mockResolvedValueOnce(createStreamWithChunks([
3698
+ {
3699
+ type: core.StreamEventType.CHUNK,
3700
+ value: {
3701
+ functionCalls: [
3702
+ {
3703
+ id: 'call-a',
3704
+ name: core.ToolNames.AGENT,
3705
+ args: { _test_id: 'call-a', subagent_type: 'explore' },
3706
+ },
3707
+ {
3708
+ id: 'call-b',
3709
+ name: core.ToolNames.AGENT,
3710
+ args: { _test_id: 'call-b', subagent_type: 'explore' },
3711
+ },
3712
+ ],
3713
+ },
3714
+ },
3715
+ ]))
3716
+ .mockResolvedValueOnce(createEmptyStream());
3717
+ mockChat.sendMessageStream = sendMessageStream;
3718
+ const promptPromise = session.prompt({
3719
+ sessionId: 'test-session-id',
3720
+ prompt: [{ type: 'text', text: 'spawn two agents' }],
3721
+ });
3722
+ // Wait until both `execute()` bodies have been entered. Sequential
3723
+ // behaviour deadlocks here → vitest times out the test → failure.
3724
+ await Promise.all([called['call-a'].promise, called['call-b'].promise]);
3725
+ // Resolve out of order to also verify that final part ordering
3726
+ // follows the original functionCalls order, not resolution order.
3727
+ result['call-b'].resolve({ llmContent: 'B-done', returnDisplay: 'B' });
3728
+ result['call-a'].resolve({ llmContent: 'A-done', returnDisplay: 'A' });
3729
+ await promptPromise;
3730
+ // The second sendMessageStream invocation carries the tool responses
3731
+ // that will be fed back to the model — assert their order matches
3732
+ // the original function-call order (A before B).
3733
+ expect(sendMessageStream).toHaveBeenCalledTimes(2);
3734
+ const followUp = sendMessageStream.mock.calls[1][1];
3735
+ const ids = followUp.message
3736
+ .filter((p) => p.functionResponse)
3737
+ .map((p) => p.functionResponse?.id);
3738
+ expect(ids).toEqual(['call-a', 'call-b']);
3739
+ });
3740
+ });
3741
+ describe('system reminders', () => {
3742
+ // Captures the `message` parts fed into chat.sendMessageStream on the
3743
+ // first turn so individual tests can assert what the model saw.
3744
+ const captureFirstTurnMessage = () => {
3745
+ const capture = { parts: [] };
3746
+ mockChat.sendMessageStream = vi
3747
+ .fn()
3748
+ .mockImplementation(async (_model, req) => {
3749
+ capture.parts = req.message ?? [];
3750
+ return createEmptyStream();
3751
+ });
3752
+ return capture;
3753
+ };
3754
+ it('prepends plan-mode reminder when approval mode is PLAN (#1151)', async () => {
3755
+ mockConfig.getApprovalMode = vi.fn().mockReturnValue(ApprovalMode.PLAN);
3756
+ const capture = captureFirstTurnMessage();
3757
+ await session.prompt({
3758
+ sessionId: 'test-session-id',
3759
+ prompt: [{ type: 'text', text: 'research this' }],
3760
+ });
3761
+ const reminderPart = capture.parts.find((p) => p.text && p.text.includes('Plan mode is active'));
3762
+ expect(reminderPart).toBeTruthy();
3763
+ expect(reminderPart.text).toContain('exit_plan_mode');
3764
+ // Reminder comes before the user text, matching client.ts ordering.
3765
+ const reminderIdx = capture.parts.indexOf(reminderPart);
3766
+ const userIdx = capture.parts.findIndex((p) => p.text === 'research this');
3767
+ expect(reminderIdx).toBeLessThan(userIdx);
3768
+ });
3769
+ it('does not prepend plan-mode reminder in default approval mode', async () => {
3770
+ mockConfig.getApprovalMode = vi
3771
+ .fn()
3772
+ .mockReturnValue(ApprovalMode.DEFAULT);
3773
+ const capture = captureFirstTurnMessage();
3774
+ await session.prompt({
3775
+ sessionId: 'test-session-id',
3776
+ prompt: [{ type: 'text', text: 'hi' }],
3777
+ });
3778
+ const hasPlanReminder = capture.parts.some((p) => p.text && p.text.includes('Plan mode is active'));
3779
+ expect(hasPlanReminder).toBe(false);
3780
+ });
3781
+ });
3782
+ });
3783
+ describe('dispose', () => {
3784
+ it('clears notification and cron queues, marks disposed, and unregisters callbacks', () => {
3785
+ const internals = session;
3786
+ internals.notificationQueue.push({ taskId: 'stale' });
3787
+ internals.cronQueue.push('stale-cron-prompt');
3788
+ internals.notificationProcessing = true;
3789
+ expect(internals.disposed).toBe(false);
3790
+ session.dispose();
3791
+ expect(internals.disposed).toBe(true);
3792
+ expect(internals.notificationQueue).toHaveLength(0);
3793
+ expect(internals.cronQueue).toHaveLength(0);
3794
+ expect(internals.notificationProcessing).toBe(false);
3795
+ expect(mockBackgroundTaskRegistry.setNotificationCallback).toHaveBeenLastCalledWith(undefined);
3796
+ expect(mockMonitorRegistry.setNotificationCallback).toHaveBeenLastCalledWith(undefined);
3797
+ expect(mockBackgroundShellRegistry.setNotificationCallback).toHaveBeenLastCalledWith(undefined);
3798
+ });
3799
+ it('aborts an active notificationAbortController and nulls the reference', () => {
3800
+ const internals = session;
3801
+ const ac = new AbortController();
3802
+ internals.notificationAbortController = ac;
3803
+ session.dispose();
3804
+ expect(ac.signal.aborted).toBe(true);
3805
+ expect(internals.notificationAbortController).toBeNull();
3806
+ });
3807
+ it('aborts cronAbortController and resets cron state on dispose', () => {
3808
+ const internals = session;
3809
+ const ac = new AbortController();
3810
+ internals.cronAbortController = ac;
3811
+ internals.cronProcessing = true;
3812
+ internals.cronCompletion = Promise.resolve();
3813
+ session.dispose();
3814
+ expect(ac.signal.aborted).toBe(true);
3815
+ expect(internals.cronAbortController).toBeNull();
3816
+ expect(internals.cronProcessing).toBe(false);
3817
+ expect(internals.cronCompletion).toBeNull();
3818
+ });
3819
+ it('is idempotent — repeated dispose() calls do not throw or re-register', () => {
3820
+ const internals = session;
3821
+ session.dispose();
3822
+ const callsAfterFirst = mockBackgroundTaskRegistry.setNotificationCallback.mock.calls.length;
3823
+ expect(() => session.dispose()).not.toThrow();
3824
+ expect(internals.disposed).toBe(true);
3825
+ expect(internals.notificationQueue).toHaveLength(0);
3826
+ expect(internals.cronQueue).toHaveLength(0);
3827
+ // The second dispose still unregisters (passes undefined again), which
3828
+ // is harmless. We only care that no surprise re-registration occurs.
3829
+ const last = mockBackgroundTaskRegistry.setNotificationCallback.mock.calls.at(-1);
3830
+ expect(last?.[0]).toBeUndefined();
3831
+ expect(mockBackgroundTaskRegistry.setNotificationCallback.mock.calls.length).toBeGreaterThanOrEqual(callsAfterFirst);
3832
+ });
3833
+ it('guards #drainNotificationQueue from processing after dispose', () => {
3834
+ const internals = session;
3835
+ // Simulate a queued notification, then dispose before drain runs
3836
+ internals.notificationQueue.push({ taskId: 'late-arrival' });
3837
+ session.dispose();
3838
+ // After dispose, the queue is cleared and processing is stopped
3839
+ expect(internals.notificationQueue).toHaveLength(0);
3840
+ expect(internals.notificationProcessing).toBe(false);
3841
+ expect(internals.disposed).toBe(true);
3842
+ });
3843
+ });
3844
+ });
3845
+ //# sourceMappingURL=Session.test.js.map