@prestyj/cli 5.7.0 → 5.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (364) hide show
  1. package/README.md +2 -2
  2. package/assets/skills/evidence-led-ui/LICENSES.md +12 -0
  3. package/assets/skills/evidence-led-ui/SKILL.md +14 -6
  4. package/assets/skills/evidence-led-ui/references/anti-defaults.md +9 -1
  5. package/assets/skills/evidence-led-ui/references/craft-rulings.md +33 -0
  6. package/assets/skills/evidence-led-ui/references/production-contract.md +41 -21
  7. package/assets/skills/evidence-led-ui/references/provenance.md +7 -5
  8. package/assets/skills/evidence-led-ui/references/quality-rubric.md +10 -10
  9. package/dist/app-sidecar-sessions.d.ts +8 -0
  10. package/dist/app-sidecar-sessions.d.ts.map +1 -0
  11. package/dist/app-sidecar-sessions.js +31 -0
  12. package/dist/app-sidecar-sessions.js.map +1 -0
  13. package/dist/app-sidecar-sessions.test.d.ts +2 -0
  14. package/dist/app-sidecar-sessions.test.d.ts.map +1 -0
  15. package/dist/app-sidecar-sessions.test.js +83 -0
  16. package/dist/app-sidecar-sessions.test.js.map +1 -0
  17. package/dist/app-sidecar.js +488 -156
  18. package/dist/app-sidecar.js.map +1 -1
  19. package/dist/cli/auth.d.ts.map +1 -1
  20. package/dist/cli/auth.js +5 -2
  21. package/dist/cli/auth.js.map +1 -1
  22. package/dist/cli/shared.d.ts.map +1 -1
  23. package/dist/cli/shared.js +2 -0
  24. package/dist/cli/shared.js.map +1 -1
  25. package/dist/cli.d.ts.map +1 -1
  26. package/dist/cli.js +61 -29
  27. package/dist/cli.js.map +1 -1
  28. package/dist/config.d.ts +4 -0
  29. package/dist/config.d.ts.map +1 -1
  30. package/dist/config.js +10 -0
  31. package/dist/config.js.map +1 -1
  32. package/dist/config.test.js +7 -0
  33. package/dist/config.test.js.map +1 -1
  34. package/dist/core/agent-session-compaction.test.js +540 -10
  35. package/dist/core/agent-session-compaction.test.js.map +1 -1
  36. package/dist/core/agent-session-memory-tail.test.js +1 -1
  37. package/dist/core/agent-session-memory-tail.test.js.map +1 -1
  38. package/dist/core/agent-session-queue.test.js +1 -1
  39. package/dist/core/agent-session-queue.test.js.map +1 -1
  40. package/dist/core/agent-session-review-coverage.test.js +26 -0
  41. package/dist/core/agent-session-review-coverage.test.js.map +1 -1
  42. package/dist/core/agent-session-tool-result-policy.test.d.ts +2 -0
  43. package/dist/core/agent-session-tool-result-policy.test.d.ts.map +1 -0
  44. package/dist/core/agent-session-tool-result-policy.test.js +25 -0
  45. package/dist/core/agent-session-tool-result-policy.test.js.map +1 -0
  46. package/dist/core/agent-session.d.ts +44 -8
  47. package/dist/core/agent-session.d.ts.map +1 -1
  48. package/dist/core/agent-session.js +369 -99
  49. package/dist/core/agent-session.js.map +1 -1
  50. package/dist/core/agents.d.ts +1 -1
  51. package/dist/core/agents.d.ts.map +1 -1
  52. package/dist/core/agents.js +4 -1
  53. package/dist/core/agents.js.map +1 -1
  54. package/dist/core/auth-providers.d.ts.map +1 -1
  55. package/dist/core/auth-providers.js +15 -8
  56. package/dist/core/auth-providers.js.map +1 -1
  57. package/dist/core/auth-storage.d.ts +1 -1
  58. package/dist/core/auth-storage.d.ts.map +1 -1
  59. package/dist/core/auth-storage.js +1 -1
  60. package/dist/core/auth-storage.js.map +1 -1
  61. package/dist/core/compaction/active-context.d.ts +17 -0
  62. package/dist/core/compaction/active-context.d.ts.map +1 -0
  63. package/dist/core/compaction/active-context.js +20 -0
  64. package/dist/core/compaction/active-context.js.map +1 -0
  65. package/dist/core/compaction/active-context.test.d.ts +2 -0
  66. package/dist/core/compaction/active-context.test.d.ts.map +1 -0
  67. package/dist/core/compaction/active-context.test.js +36 -0
  68. package/dist/core/compaction/active-context.test.js.map +1 -0
  69. package/dist/core/compaction/compactor.d.ts +19 -18
  70. package/dist/core/compaction/compactor.d.ts.map +1 -1
  71. package/dist/core/compaction/compactor.js +84 -53
  72. package/dist/core/compaction/compactor.js.map +1 -1
  73. package/dist/core/compaction/compactor.test.js +135 -65
  74. package/dist/core/compaction/compactor.test.js.map +1 -1
  75. package/dist/core/compaction/token-estimator.d.ts +25 -1
  76. package/dist/core/compaction/token-estimator.d.ts.map +1 -1
  77. package/dist/core/compaction/token-estimator.js +86 -1
  78. package/dist/core/compaction/token-estimator.js.map +1 -1
  79. package/dist/core/compaction/token-estimator.test.js +147 -1
  80. package/dist/core/compaction/token-estimator.test.js.map +1 -1
  81. package/dist/core/compaction/tool-result-pruner.d.ts +37 -0
  82. package/dist/core/compaction/tool-result-pruner.d.ts.map +1 -0
  83. package/dist/core/compaction/tool-result-pruner.js +103 -0
  84. package/dist/core/compaction/tool-result-pruner.js.map +1 -0
  85. package/dist/core/compaction/tool-result-pruner.test.d.ts +2 -0
  86. package/dist/core/compaction/tool-result-pruner.test.d.ts.map +1 -0
  87. package/dist/core/compaction/tool-result-pruner.test.js +148 -0
  88. package/dist/core/compaction/tool-result-pruner.test.js.map +1 -0
  89. package/dist/core/event-bus.d.ts +5 -0
  90. package/dist/core/event-bus.d.ts.map +1 -1
  91. package/dist/core/event-bus.js +6 -0
  92. package/dist/core/event-bus.js.map +1 -1
  93. package/dist/core/goal-controller.test.js +3 -3
  94. package/dist/core/goal-controller.test.js.map +1 -1
  95. package/dist/core/ideal-review.d.ts +6 -0
  96. package/dist/core/ideal-review.d.ts.map +1 -1
  97. package/dist/core/ideal-review.js +14 -0
  98. package/dist/core/ideal-review.js.map +1 -1
  99. package/dist/core/ideal-review.test.js +10 -1
  100. package/dist/core/ideal-review.test.js.map +1 -1
  101. package/dist/core/index.d.ts +3 -3
  102. package/dist/core/index.d.ts.map +1 -1
  103. package/dist/core/index.js +3 -3
  104. package/dist/core/index.js.map +1 -1
  105. package/dist/core/input-normalization.test.d.ts +2 -0
  106. package/dist/core/input-normalization.test.d.ts.map +1 -0
  107. package/dist/core/input-normalization.test.js +75 -0
  108. package/dist/core/input-normalization.test.js.map +1 -0
  109. package/dist/core/loop-breaker.d.ts +38 -1
  110. package/dist/core/loop-breaker.d.ts.map +1 -1
  111. package/dist/core/loop-breaker.js +84 -2
  112. package/dist/core/loop-breaker.js.map +1 -1
  113. package/dist/core/loop-breaker.test.js +108 -1
  114. package/dist/core/loop-breaker.test.js.map +1 -1
  115. package/dist/core/message-images.d.ts +12 -0
  116. package/dist/core/message-images.d.ts.map +1 -0
  117. package/dist/core/message-images.js +52 -0
  118. package/dist/core/message-images.js.map +1 -0
  119. package/dist/core/message-images.test.d.ts +2 -0
  120. package/dist/core/message-images.test.d.ts.map +1 -0
  121. package/dist/core/message-images.test.js +62 -0
  122. package/dist/core/message-images.test.js.map +1 -0
  123. package/dist/core/project-discovery.d.ts +7 -10
  124. package/dist/core/project-discovery.d.ts.map +1 -1
  125. package/dist/core/project-discovery.js +125 -66
  126. package/dist/core/project-discovery.js.map +1 -1
  127. package/dist/core/project-discovery.test.js +177 -0
  128. package/dist/core/project-discovery.test.js.map +1 -1
  129. package/dist/core/resolve-start.test.js +1 -0
  130. package/dist/core/resolve-start.test.js.map +1 -1
  131. package/dist/core/session-compaction.d.ts +3 -0
  132. package/dist/core/session-compaction.d.ts.map +1 -1
  133. package/dist/core/session-compaction.js +14 -1
  134. package/dist/core/session-compaction.js.map +1 -1
  135. package/dist/core/session-compaction.test.js +5 -0
  136. package/dist/core/session-compaction.test.js.map +1 -1
  137. package/dist/core/session-manager.d.ts +35 -8
  138. package/dist/core/session-manager.d.ts.map +1 -1
  139. package/dist/core/session-manager.js +264 -125
  140. package/dist/core/session-manager.js.map +1 -1
  141. package/dist/core/session-manager.test.js +17 -0
  142. package/dist/core/session-manager.test.js.map +1 -1
  143. package/dist/core/session-preview.d.ts +11 -0
  144. package/dist/core/session-preview.d.ts.map +1 -0
  145. package/dist/core/session-preview.js +50 -0
  146. package/dist/core/session-preview.js.map +1 -0
  147. package/dist/core/session-storage.d.ts +57 -0
  148. package/dist/core/session-storage.d.ts.map +1 -0
  149. package/dist/core/session-storage.js +568 -0
  150. package/dist/core/session-storage.js.map +1 -0
  151. package/dist/core/session-storage.test.d.ts +2 -0
  152. package/dist/core/session-storage.test.d.ts.map +1 -0
  153. package/dist/core/session-storage.test.js +269 -0
  154. package/dist/core/session-storage.test.js.map +1 -0
  155. package/dist/core/settings-manager.d.ts +3 -0
  156. package/dist/core/settings-manager.d.ts.map +1 -1
  157. package/dist/core/settings-manager.js +10 -2
  158. package/dist/core/settings-manager.js.map +1 -1
  159. package/dist/core/sidecar-error-reporter.d.ts +12 -0
  160. package/dist/core/sidecar-error-reporter.d.ts.map +1 -0
  161. package/dist/core/sidecar-error-reporter.js +57 -0
  162. package/dist/core/sidecar-error-reporter.js.map +1 -0
  163. package/dist/core/sidecar-error-reporter.test.d.ts +2 -0
  164. package/dist/core/sidecar-error-reporter.test.d.ts.map +1 -0
  165. package/dist/core/sidecar-error-reporter.test.js +61 -0
  166. package/dist/core/sidecar-error-reporter.test.js.map +1 -0
  167. package/dist/core/skills.d.ts +1 -1
  168. package/dist/core/skills.d.ts.map +1 -1
  169. package/dist/core/skills.js +4 -1
  170. package/dist/core/skills.js.map +1 -1
  171. package/dist/core/subagent-manager.d.ts +9 -4
  172. package/dist/core/subagent-manager.d.ts.map +1 -1
  173. package/dist/core/subagent-manager.js +30 -2
  174. package/dist/core/subagent-manager.js.map +1 -1
  175. package/dist/core/subagent-manager.test.js +47 -3
  176. package/dist/core/subagent-manager.test.js.map +1 -1
  177. package/dist/core/verify-commands.d.ts.map +1 -1
  178. package/dist/core/verify-commands.js +1 -6
  179. package/dist/core/verify-commands.js.map +1 -1
  180. package/dist/core/verify-commands.test.js +1 -5
  181. package/dist/core/verify-commands.test.js.map +1 -1
  182. package/dist/core/workspace-guard.d.ts +38 -0
  183. package/dist/core/workspace-guard.d.ts.map +1 -0
  184. package/dist/core/workspace-guard.js +112 -0
  185. package/dist/core/workspace-guard.js.map +1 -0
  186. package/dist/core/workspace-guard.test.d.ts +2 -0
  187. package/dist/core/workspace-guard.test.d.ts.map +1 -0
  188. package/dist/core/workspace-guard.test.js +86 -0
  189. package/dist/core/workspace-guard.test.js.map +1 -0
  190. package/dist/index.d.ts +1 -1
  191. package/dist/index.d.ts.map +1 -1
  192. package/dist/index.js +1 -1
  193. package/dist/index.js.map +1 -1
  194. package/dist/modes/json-mode.d.ts.map +1 -1
  195. package/dist/modes/json-mode.js +9 -0
  196. package/dist/modes/json-mode.js.map +1 -1
  197. package/dist/modes/subagent-worker-mode.d.ts.map +1 -1
  198. package/dist/modes/subagent-worker-mode.js +11 -0
  199. package/dist/modes/subagent-worker-mode.js.map +1 -1
  200. package/dist/session.d.ts +4 -4
  201. package/dist/session.d.ts.map +1 -1
  202. package/dist/session.js +38 -101
  203. package/dist/session.js.map +1 -1
  204. package/dist/session.test.d.ts +2 -0
  205. package/dist/session.test.d.ts.map +1 -0
  206. package/dist/session.test.js +35 -0
  207. package/dist/session.test.js.map +1 -0
  208. package/dist/system-prompt.d.ts +12 -0
  209. package/dist/system-prompt.d.ts.map +1 -1
  210. package/dist/system-prompt.js +86 -19
  211. package/dist/system-prompt.js.map +1 -1
  212. package/dist/system-prompt.test.js +132 -8
  213. package/dist/system-prompt.test.js.map +1 -1
  214. package/dist/tools/bash.d.ts +12 -2
  215. package/dist/tools/bash.d.ts.map +1 -1
  216. package/dist/tools/bash.js +65 -24
  217. package/dist/tools/bash.js.map +1 -1
  218. package/dist/tools/bash.test.d.ts +2 -0
  219. package/dist/tools/bash.test.d.ts.map +1 -0
  220. package/dist/tools/bash.test.js +89 -0
  221. package/dist/tools/bash.test.js.map +1 -0
  222. package/dist/tools/edit.d.ts +2 -1
  223. package/dist/tools/edit.d.ts.map +1 -1
  224. package/dist/tools/edit.js +7 -1
  225. package/dist/tools/edit.js.map +1 -1
  226. package/dist/tools/edit.test.js +7 -0
  227. package/dist/tools/edit.test.js.map +1 -1
  228. package/dist/tools/exit-plan.d.ts.map +1 -1
  229. package/dist/tools/exit-plan.js +15 -4
  230. package/dist/tools/exit-plan.js.map +1 -1
  231. package/dist/tools/exit-plan.test.d.ts +2 -0
  232. package/dist/tools/exit-plan.test.d.ts.map +1 -0
  233. package/dist/tools/exit-plan.test.js +72 -0
  234. package/dist/tools/exit-plan.test.js.map +1 -0
  235. package/dist/tools/grep.d.ts.map +1 -1
  236. package/dist/tools/grep.js +8 -3
  237. package/dist/tools/grep.js.map +1 -1
  238. package/dist/tools/grep.test.js +6 -0
  239. package/dist/tools/grep.test.js.map +1 -1
  240. package/dist/tools/index.d.ts +8 -0
  241. package/dist/tools/index.d.ts.map +1 -1
  242. package/dist/tools/index.js +3 -2
  243. package/dist/tools/index.js.map +1 -1
  244. package/dist/tools/overflow.d.ts +12 -2
  245. package/dist/tools/overflow.d.ts.map +1 -1
  246. package/dist/tools/overflow.js +49 -4
  247. package/dist/tools/overflow.js.map +1 -1
  248. package/dist/tools/overflow.test.d.ts +2 -0
  249. package/dist/tools/overflow.test.d.ts.map +1 -0
  250. package/dist/tools/overflow.test.js +62 -0
  251. package/dist/tools/overflow.test.js.map +1 -0
  252. package/dist/tools/screenshot.js +1 -1
  253. package/dist/tools/screenshot.js.map +1 -1
  254. package/dist/tools/skill.d.ts.map +1 -1
  255. package/dist/tools/skill.js +4 -2
  256. package/dist/tools/skill.js.map +1 -1
  257. package/dist/tools/source-path.d.ts.map +1 -1
  258. package/dist/tools/source-path.js +9 -0
  259. package/dist/tools/source-path.js.map +1 -1
  260. package/dist/tools/subagent-shared.d.ts +9 -1
  261. package/dist/tools/subagent-shared.d.ts.map +1 -1
  262. package/dist/tools/subagent-shared.js +4 -1
  263. package/dist/tools/subagent-shared.js.map +1 -1
  264. package/dist/tools/subagent-shared.test.js +21 -1
  265. package/dist/tools/subagent-shared.test.js.map +1 -1
  266. package/dist/tools/subagent.d.ts +3 -8
  267. package/dist/tools/subagent.d.ts.map +1 -1
  268. package/dist/tools/subagent.js +10 -8
  269. package/dist/tools/subagent.js.map +1 -1
  270. package/dist/tools/subagent.test.js +17 -1
  271. package/dist/tools/subagent.test.js.map +1 -1
  272. package/dist/tools/web-search.d.ts.map +1 -1
  273. package/dist/tools/web-search.js +13 -2
  274. package/dist/tools/web-search.js.map +1 -1
  275. package/dist/tools/write.d.ts +2 -1
  276. package/dist/tools/write.d.ts.map +1 -1
  277. package/dist/tools/write.js +7 -1
  278. package/dist/tools/write.js.map +1 -1
  279. package/dist/tools/write.test.js +12 -0
  280. package/dist/tools/write.test.js.map +1 -1
  281. package/dist/ui/App.d.ts +0 -2
  282. package/dist/ui/App.d.ts.map +1 -1
  283. package/dist/ui/App.js +23 -87
  284. package/dist/ui/App.js.map +1 -1
  285. package/dist/ui/app-items.d.ts +10 -0
  286. package/dist/ui/app-items.d.ts.map +1 -1
  287. package/dist/ui/app-items.js +10 -0
  288. package/dist/ui/app-items.js.map +1 -1
  289. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
  290. package/dist/ui/components/ActivityIndicator.js +1 -0
  291. package/dist/ui/components/ActivityIndicator.js.map +1 -1
  292. package/dist/ui/components/Footer.test.js +1 -1
  293. package/dist/ui/components/ModelSelector.d.ts.map +1 -1
  294. package/dist/ui/components/ModelSelector.js +1 -0
  295. package/dist/ui/components/ModelSelector.js.map +1 -1
  296. package/dist/ui/components/SubAgentPanel.d.ts +2 -0
  297. package/dist/ui/components/SubAgentPanel.d.ts.map +1 -1
  298. package/dist/ui/components/SubAgentPanel.js +4 -2
  299. package/dist/ui/components/SubAgentPanel.js.map +1 -1
  300. package/dist/ui/hooks/useAgentLoop.d.ts +7 -6
  301. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  302. package/dist/ui/hooks/useAgentLoop.js +56 -11
  303. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  304. package/dist/ui/hooks/useAgentLoop.test.js +31 -0
  305. package/dist/ui/hooks/useAgentLoop.test.js.map +1 -1
  306. package/dist/ui/hooks/useContextCompaction.d.ts +5 -8
  307. package/dist/ui/hooks/useContextCompaction.d.ts.map +1 -1
  308. package/dist/ui/hooks/useContextCompaction.js +77 -16
  309. package/dist/ui/hooks/useContextCompaction.js.map +1 -1
  310. package/dist/ui/hooks/useContextCompaction.test.d.ts +2 -0
  311. package/dist/ui/hooks/useContextCompaction.test.d.ts.map +1 -0
  312. package/dist/ui/hooks/useContextCompaction.test.js +135 -0
  313. package/dist/ui/hooks/useContextCompaction.test.js.map +1 -0
  314. package/dist/ui/hooks/useSessionPersistence.d.ts.map +1 -1
  315. package/dist/ui/hooks/useSessionPersistence.js +3 -0
  316. package/dist/ui/hooks/useSessionPersistence.js.map +1 -1
  317. package/dist/ui/hooks/useTerminalTitle.d.ts +3 -3
  318. package/dist/ui/hooks/useTerminalTitle.d.ts.map +1 -1
  319. package/dist/ui/hooks/useTerminalTitle.js +5 -9
  320. package/dist/ui/hooks/useTerminalTitle.js.map +1 -1
  321. package/dist/ui/hooks/useTranscriptHistory.d.ts +8 -5
  322. package/dist/ui/hooks/useTranscriptHistory.d.ts.map +1 -1
  323. package/dist/ui/hooks/useTranscriptHistory.js +2 -30
  324. package/dist/ui/hooks/useTranscriptHistory.js.map +1 -1
  325. package/dist/ui/login.d.ts.map +1 -1
  326. package/dist/ui/login.js +7 -2
  327. package/dist/ui/login.js.map +1 -1
  328. package/dist/ui/render.d.ts +0 -2
  329. package/dist/ui/render.d.ts.map +1 -1
  330. package/dist/ui/render.js +0 -4
  331. package/dist/ui/render.js.map +1 -1
  332. package/dist/ui/render.test.js +10 -1
  333. package/dist/ui/render.test.js.map +1 -1
  334. package/dist/ui/terminal-history.js +6 -2
  335. package/dist/ui/terminal-history.js.map +1 -1
  336. package/dist/ui/terminal-history.test.js +2 -2
  337. package/dist/ui/terminal-history.test.js.map +1 -1
  338. package/dist/ui/tui-history-parity.test.js +8 -1
  339. package/dist/ui/tui-history-parity.test.js.map +1 -1
  340. package/dist/utils/git.d.ts +2 -0
  341. package/dist/utils/git.d.ts.map +1 -1
  342. package/dist/utils/git.js +12 -0
  343. package/dist/utils/git.js.map +1 -1
  344. package/dist/utils/git.test.d.ts +2 -0
  345. package/dist/utils/git.test.d.ts.map +1 -0
  346. package/dist/utils/git.test.js +36 -0
  347. package/dist/utils/git.test.js.map +1 -0
  348. package/dist/utils/http-body.d.ts +19 -0
  349. package/dist/utils/http-body.d.ts.map +1 -0
  350. package/dist/utils/http-body.js +58 -0
  351. package/dist/utils/http-body.js.map +1 -0
  352. package/dist/utils/http-body.test.d.ts +2 -0
  353. package/dist/utils/http-body.test.d.ts.map +1 -0
  354. package/dist/utils/http-body.test.js +68 -0
  355. package/dist/utils/http-body.test.js.map +1 -0
  356. package/dist/utils/text.d.ts +9 -0
  357. package/dist/utils/text.d.ts.map +1 -0
  358. package/dist/utils/text.js +11 -0
  359. package/dist/utils/text.js.map +1 -0
  360. package/package.json +5 -5
  361. package/dist/utils/session-title.d.ts +0 -19
  362. package/dist/utils/session-title.d.ts.map +0 -1
  363. package/dist/utils/session-title.js +0 -82
  364. package/dist/utils/session-title.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  export { EventBus, type BusEventMap } from "./event-bus.js";
2
- export { MODELS, getModel, getModelsForProvider, getDefaultModel, getContextWindow, usesOpenAICodexTransport, getMaxThinkingLevel, type ContextWindowOptions, type ModelInfo, } from "./model-registry.js";
2
+ export { MODELS, getModel, getModelsForProvider, getDefaultModel, getContextWindow, usesOpenAICodexTransport, getMaxThinkingLevel, getDefaultThinkingLevel, type ContextWindowOptions, type ModelInfo, } from "./model-registry.js";
3
3
  export { getNextThinkingLevel, getSupportedThinkingLevels, isThinkingLevelSupported, } from "./thinking-level.js";
4
- export { AuthStorage, NotLoggedInError } from "./auth-storage.js";
4
+ export { AuthStorage, NotLoggedInError, readStoredBaseUrlSync } from "./auth-storage.js";
5
5
  export { SettingsManager, DEFAULT_SETTINGS, type Settings } from "./settings-manager.js";
6
6
  export { SessionManager, type SessionEntry, type MessageEntry, type SessionInfo, type SessionHeader, type BranchInfo, } from "./session-manager.js";
7
7
  export { AgentSession, type AgentSessionOptions, type AgentSessionState } from "./agent-session.js";
@@ -11,5 +11,5 @@ export { ExtensionLoader } from "./extensions/loader.js";
11
11
  export type { Extension, ExtensionContext, ExtensionFactory } from "./extensions/types.js";
12
12
  export { shouldCompact, compact, COMPACTION_RESERVE_TOKENS, type CompactionResult, } from "./compaction/compactor.js";
13
13
  export { initLogger, log, attachToEventBus, closeLogger } from "./logger.js";
14
- export { estimateTokens, estimateMessageTokens, estimateConversationTokens, setEstimatorModel, } from "./compaction/token-estimator.js";
14
+ export { estimateTokens, estimateMessageTokens, estimateConversationTokens, setEstimatorModel, calibrateEstimator, calibrateEstimatorFromUsage, getCalibratedRatio, measureConversationChars, } from "./compaction/token-estimator.js";
15
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EACL,MAAM,EACN,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,KAAK,SAAS,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EACL,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,UAAU,GAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACpG,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC3F,OAAO,EACL,aAAa,EACb,OAAO,EACP,yBAAyB,EACzB,KAAK,gBAAgB,GACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,0BAA0B,EAC1B,iBAAiB,GAClB,MAAM,iCAAiC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EACL,MAAM,EACN,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,uBAAuB,EACvB,KAAK,oBAAoB,EACzB,KAAK,SAAS,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EACL,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,UAAU,GAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACpG,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC3F,OAAO,EACL,aAAa,EACb,OAAO,EACP,yBAAyB,EACzB,KAAK,gBAAgB,GACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,0BAA0B,EAC1B,iBAAiB,EACjB,kBAAkB,EAClB,2BAA2B,EAC3B,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,iCAAiC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  export { EventBus } from "./event-bus.js";
2
- export { MODELS, getModel, getModelsForProvider, getDefaultModel, getContextWindow, usesOpenAICodexTransport, getMaxThinkingLevel, } from "./model-registry.js";
2
+ export { MODELS, getModel, getModelsForProvider, getDefaultModel, getContextWindow, usesOpenAICodexTransport, getMaxThinkingLevel, getDefaultThinkingLevel, } from "./model-registry.js";
3
3
  export { getNextThinkingLevel, getSupportedThinkingLevels, isThinkingLevelSupported, } from "./thinking-level.js";
4
- export { AuthStorage, NotLoggedInError } from "./auth-storage.js";
4
+ export { AuthStorage, NotLoggedInError, readStoredBaseUrlSync } from "./auth-storage.js";
5
5
  export { SettingsManager, DEFAULT_SETTINGS } from "./settings-manager.js";
6
6
  export { SessionManager, } from "./session-manager.js";
7
7
  export { AgentSession } from "./agent-session.js";
@@ -10,5 +10,5 @@ export { discoverSkills, parseSkillFile, formatSkillsForPrompt } from "./skills.
10
10
  export { ExtensionLoader } from "./extensions/loader.js";
11
11
  export { shouldCompact, compact, COMPACTION_RESERVE_TOKENS, } from "./compaction/compactor.js";
12
12
  export { initLogger, log, attachToEventBus, closeLogger } from "./logger.js";
13
- export { estimateTokens, estimateMessageTokens, estimateConversationTokens, setEstimatorModel, } from "./compaction/token-estimator.js";
13
+ export { estimateTokens, estimateMessageTokens, estimateConversationTokens, setEstimatorModel, calibrateEstimator, calibrateEstimatorFromUsage, getCalibratedRatio, measureConversationChars, } from "./compaction/token-estimator.js";
14
14
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAoB,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EACL,MAAM,EACN,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,GAGpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAiB,MAAM,uBAAuB,CAAC;AACzF,OAAO,EACL,cAAc,GAMf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAoD,MAAM,oBAAoB,CAAC;AACpG,OAAO,EACL,oBAAoB,EACpB,qBAAqB,GAGtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB,EAAc,MAAM,aAAa,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EACL,aAAa,EACb,OAAO,EACP,yBAAyB,GAE1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,0BAA0B,EAC1B,iBAAiB,GAClB,MAAM,iCAAiC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAoB,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EACL,MAAM,EACN,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,uBAAuB,GAGxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAiB,MAAM,uBAAuB,CAAC;AACzF,OAAO,EACL,cAAc,GAMf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAoD,MAAM,oBAAoB,CAAC;AACpG,OAAO,EACL,oBAAoB,EACpB,qBAAqB,GAGtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB,EAAc,MAAM,aAAa,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EACL,aAAa,EACb,OAAO,EACP,yBAAyB,GAE1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,0BAA0B,EAC1B,iBAAiB,EACjB,kBAAkB,EAClB,2BAA2B,EAC3B,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=input-normalization.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-normalization.test.d.ts","sourceRoot":"","sources":["../../src/core/input-normalization.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,75 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { describe, expect, it } from "vitest";
5
+ import { parseSkillFile } from "./skills.js";
6
+ import { parseAgentFile } from "./agents.js";
7
+ import { loadCustomCommands } from "./custom-commands.js";
8
+ import { stripBom } from "../utils/text.js";
9
+ import { createSkillTool } from "../tools/skill.js";
10
+ const BOM = "\uFEFF";
11
+ describe("stripBom", () => {
12
+ it("removes a single leading BOM and nothing else", () => {
13
+ expect(stripBom(`${BOM}hello`)).toBe("hello");
14
+ expect(stripBom("hello")).toBe("hello");
15
+ expect(stripBom("")).toBe("");
16
+ // Only the leading BOM is stripped; interior ones are content.
17
+ expect(stripBom(`a${BOM}b`)).toBe(`a${BOM}b`);
18
+ });
19
+ });
20
+ describe("BOM-tolerant instruction parsing", () => {
21
+ const frontmatter = "---\nname: Fancy-Skill\ndescription: Does fancy things\n---\n\nBody text.";
22
+ it("parses SKILL.md frontmatter behind a BOM", () => {
23
+ const skill = parseSkillFile(`${BOM}${frontmatter}`, "test");
24
+ expect(skill.name).toBe("Fancy-Skill");
25
+ expect(skill.description).toBe("Does fancy things");
26
+ expect(skill.content).toBe("Body text.");
27
+ });
28
+ it("parses agent.md frontmatter behind a BOM", () => {
29
+ const raw = `${BOM}---\nname: scout\ndescription: Recon\ntools: read, grep\n---\n\nYou are a scout.`;
30
+ const agent = parseAgentFile(raw, "global");
31
+ expect(agent.name).toBe("scout");
32
+ expect(agent.description).toBe("Recon");
33
+ expect(agent.tools).toEqual(["read", "grep"]);
34
+ expect(agent.systemPrompt).toBe("You are a scout.");
35
+ });
36
+ it("parses a BOM'd .ezcoder/commands/*.md custom command", async () => {
37
+ const cwd = await fs.mkdtemp(path.join(os.tmpdir(), "bom-commands-"));
38
+ try {
39
+ const dir = path.join(cwd, ".ezcoder", "commands");
40
+ await fs.mkdir(dir, { recursive: true });
41
+ await fs.writeFile(path.join(dir, "deploy.md"), `${BOM}---\nname: deploy\ndescription: Ship it\n---\n\nDeploy the app.`);
42
+ const commands = await loadCustomCommands(cwd);
43
+ expect(commands).toHaveLength(1);
44
+ expect(commands[0].name).toBe("deploy");
45
+ expect(commands[0].description).toBe("Ship it");
46
+ expect(commands[0].prompt).toBe("Deploy the app.");
47
+ }
48
+ finally {
49
+ await fs.rm(cwd, { recursive: true, force: true });
50
+ }
51
+ });
52
+ });
53
+ describe("case-insensitive skill invocation", () => {
54
+ const skills = [
55
+ {
56
+ name: "Fancy-Skill",
57
+ description: "Does fancy things",
58
+ content: "Instructions.",
59
+ source: "test",
60
+ },
61
+ ];
62
+ it.each(["Fancy-Skill", "fancy-skill", "FANCY-SKILL"])("resolves %s", async (requested) => {
63
+ const tool = createSkillTool(skills);
64
+ const result = await tool.execute({ skill: requested }, { signal: new AbortController().signal, toolCallId: "skill-1" });
65
+ expect(String(result)).toContain('<skill_content name="Fancy-Skill">');
66
+ expect(String(result)).toContain("Instructions.");
67
+ });
68
+ it("still reports unknown skills with the available list", async () => {
69
+ const tool = createSkillTool(skills);
70
+ const result = await tool.execute({ skill: "nope" }, { signal: new AbortController().signal, toolCallId: "skill-2" });
71
+ expect(String(result)).toContain('Skill "nope" not found');
72
+ expect(String(result)).toContain("Fancy-Skill");
73
+ });
74
+ });
75
+ //# sourceMappingURL=input-normalization.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-normalization.test.js","sourceRoot":"","sources":["../../src/core/input-normalization.test.ts"],"names":[],"mappings":"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"}
@@ -19,12 +19,19 @@ export interface LoopBreakStats {
19
19
  repeatedNoProgressCalls: number;
20
20
  /** Whether streamed assistant text degenerated into repetition. */
21
21
  textRepetitionDetected: boolean;
22
+ /** Detected cyclic tool-call pattern (A/B/A/B…) with no new results. */
23
+ cyclicPattern?: CycleDetection;
22
24
  }
23
25
  export interface LoopBreakDecision {
24
26
  shouldBreak: boolean;
25
27
  reasons: string[];
26
28
  }
27
29
  export declare const LOOP_BREAK_PROMPT: string;
30
+ /**
31
+ * Second-stage break — injected when the agent is STILL looping after the
32
+ * first LOOP_BREAK_PROMPT nudge. No more retries: report and hand back.
33
+ */
34
+ export declare const LOOP_BREAK_FINAL_PROMPT: string;
28
35
  /** Stable signature for a tool call: name + canonicalized args. */
29
36
  export declare function toolCallSignature(name: string, args: unknown): string;
30
37
  /**
@@ -41,6 +48,36 @@ export declare class ToolCallProgressTracker {
41
48
  reset(): void;
42
49
  private resetRepetition;
43
50
  }
51
+ export interface CycleDetection {
52
+ /** Cycle length k (1–5): the repeating unit is the last k distinct calls. */
53
+ length: number;
54
+ /** How many full consecutive repetitions of the unit were observed. */
55
+ repeats: number;
56
+ }
57
+ /**
58
+ * Detects the agent alternating through a short cycle of tool calls
59
+ * (A/B/A/B… up to length 5) that produce no new results — the multi-call
60
+ * generalization of ToolCallProgressTracker's single-call repeat streak
61
+ * (Gemini CLI's cycle detector, hardened with an unchanged-result guard: a
62
+ * call whose result changed between visits is progress, not a loop).
63
+ *
64
+ * One instance per agent run; `reset()` after a loop-break injection so the
65
+ * second stage measures fresh evidence.
66
+ */
67
+ export declare class CycleDetector {
68
+ /** Bounded FIFO of recent call signatures (most recent last). */
69
+ private history;
70
+ /** Whether each historical call's result was unchanged from that
71
+ * signature's previous occurrence. Parallel to `history`. */
72
+ private unchanged;
73
+ /** Last observed result per signature. */
74
+ private lastResults;
75
+ record(name: string, args: unknown, result: string, _isError: boolean): CycleDetection | null;
76
+ reset(): void;
77
+ /** True when the last k*THRESHOLD calls repeat the same k-cycle and every
78
+ * one of them returned the same result as its previous occurrence. */
79
+ private matchesCycle;
80
+ }
44
81
  /**
45
82
  * Detects verbatim repetition at the tail of streamed text — the model
46
83
  * looping on a phrase/block. Scans candidate block lengths and checks how
@@ -49,5 +86,5 @@ export declare class ToolCallProgressTracker {
49
86
  */
50
87
  export declare function detectTextRepetition(text: string): boolean;
51
88
  export declare function evaluateLoopBreak(stats: LoopBreakStats): LoopBreakDecision;
52
- export declare function buildLoopBreakMessage(reasons: readonly string[]): Message;
89
+ export declare function buildLoopBreakMessage(reasons: readonly string[], final?: boolean): Message;
53
90
  //# sourceMappingURL=loop-breaker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loop-breaker.d.ts","sourceRoot":"","sources":["../../src/core/loop-breaker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,2EAA2E;IAC3E,uBAAuB,EAAE,MAAM,CAAC;IAChC,mEAAmE;IACnE,sBAAsB,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAKD,eAAO,MAAM,iBAAiB,QAOuC,CAAC;AAEtE,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAErE;AAwBD;;;;GAIG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,WAAW,CAAK;IAExB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM;IAsB7E,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,eAAe;CAMxB;AAMD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAiB1D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,iBAAiB,CAc1E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAMzE"}
1
+ {"version":3,"file":"loop-breaker.d.ts","sourceRoot":"","sources":["../../src/core/loop-breaker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,2EAA2E;IAC3E,uBAAuB,EAAE,MAAM,CAAC;IAChC,mEAAmE;IACnE,sBAAsB,EAAE,OAAO,CAAC;IAChC,wEAAwE;IACxE,aAAa,CAAC,EAAE,cAAc,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAKD,eAAO,MAAM,iBAAiB,QAOuC,CAAC;AAEtE;;;GAGG;AACH,eAAO,MAAM,uBAAuB,QAKb,CAAC;AAExB,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAErE;AAwBD;;;;GAIG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,WAAW,CAAK;IAExB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM;IAsB7E,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,eAAe;CAMxB;AAID,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;;;;;GASG;AACH,qBAAa,aAAa;IACxB,iEAAiE;IACjE,OAAO,CAAC,OAAO,CAAgB;IAC/B;kEAC8D;IAC9D,OAAO,CAAC,SAAS,CAAiB;IAClC,0CAA0C;IAC1C,OAAO,CAAC,WAAW,CAA6B;IAEhD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI;IAwB7F,KAAK,IAAI,IAAI;IAMb;2EACuE;IACvE,OAAO,CAAC,YAAY;CAgBrB;AAMD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAiB1D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,iBAAiB,CAmB1E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,UAAQ,GAAG,OAAO,CAMxF"}
@@ -7,6 +7,15 @@ export const LOOP_BREAK_PROMPT = "Stuck? You've repeated essentially the same ac
7
7
  "fundamentally different approach or, if you genuinely cannot make progress, stop and tell " +
8
8
  "the user what's blocking you and what you need. Do NOT repeat the previous attempt with minor " +
9
9
  "tweaks. Do not mention this note unless it changed your approach.";
10
+ /**
11
+ * Second-stage break — injected when the agent is STILL looping after the
12
+ * first LOOP_BREAK_PROMPT nudge. No more retries: report and hand back.
13
+ */
14
+ export const LOOP_BREAK_FINAL_PROMPT = "STOP. You are still repeating the same actions after being asked to break the pattern. " +
15
+ "Do NOT attempt the action again in any form. Instead, stop working now and reply with: " +
16
+ "(1) what is blocking you, stated plainly; (2) what you already tried and what each attempt " +
17
+ "returned; (3) the specific decision or information you need from the user to proceed. " +
18
+ "Then end your turn.";
10
19
  /** Stable signature for a tool call: name + canonicalized args. */
11
20
  export function toolCallSignature(name, args) {
12
21
  return `${name}\u0000${canonicalize(args)}`;
@@ -69,6 +78,76 @@ export class ToolCallProgressTracker {
69
78
  this.repeatCount = 0;
70
79
  }
71
80
  }
81
+ const CYCLE_MAX_LENGTH = 5;
82
+ const CYCLE_REPEAT_THRESHOLD = 5;
83
+ const CYCLE_HISTORY_LIMIT = CYCLE_MAX_LENGTH * CYCLE_REPEAT_THRESHOLD;
84
+ /**
85
+ * Detects the agent alternating through a short cycle of tool calls
86
+ * (A/B/A/B… up to length 5) that produce no new results — the multi-call
87
+ * generalization of ToolCallProgressTracker's single-call repeat streak
88
+ * (Gemini CLI's cycle detector, hardened with an unchanged-result guard: a
89
+ * call whose result changed between visits is progress, not a loop).
90
+ *
91
+ * One instance per agent run; `reset()` after a loop-break injection so the
92
+ * second stage measures fresh evidence.
93
+ */
94
+ export class CycleDetector {
95
+ /** Bounded FIFO of recent call signatures (most recent last). */
96
+ history = [];
97
+ /** Whether each historical call's result was unchanged from that
98
+ * signature's previous occurrence. Parallel to `history`. */
99
+ unchanged = [];
100
+ /** Last observed result per signature. */
101
+ lastResults = new Map();
102
+ record(name, args, result, _isError) {
103
+ if (isExpectedRepeat(name, args)) {
104
+ this.reset();
105
+ return null;
106
+ }
107
+ const signature = toolCallSignature(name, args);
108
+ const previous = this.lastResults.get(signature);
109
+ this.history.push(signature);
110
+ this.unchanged.push(previous !== undefined && previous === result);
111
+ this.lastResults.set(signature, result);
112
+ if (this.history.length > CYCLE_HISTORY_LIMIT) {
113
+ this.history.shift();
114
+ this.unchanged.shift();
115
+ }
116
+ for (let k = 1; k <= CYCLE_MAX_LENGTH; k++) {
117
+ if (this.matchesCycle(k)) {
118
+ return { length: k, repeats: CYCLE_REPEAT_THRESHOLD };
119
+ }
120
+ }
121
+ return null;
122
+ }
123
+ reset() {
124
+ this.history = [];
125
+ this.unchanged = [];
126
+ this.lastResults.clear();
127
+ }
128
+ /** True when the last k*THRESHOLD calls repeat the same k-cycle and every
129
+ * one of them returned the same result as its previous occurrence. */
130
+ matchesCycle(k) {
131
+ const span = k * CYCLE_REPEAT_THRESHOLD;
132
+ if (this.history.length < span)
133
+ return false;
134
+ const start = this.history.length - span;
135
+ const unit = this.history.slice(start, start + k);
136
+ // A degenerate "cycle" whose unit repeats an inner signature is really a
137
+ // shorter cycle — only report the minimal length.
138
+ if (new Set(unit).size !== k)
139
+ return false;
140
+ for (let i = 0; i < span; i++) {
141
+ if (this.history[start + i] !== unit[i % k])
142
+ return false;
143
+ // The first repetition legitimately introduces new signatures; every
144
+ // later visit must have produced an unchanged result to count as a loop.
145
+ if (i >= k && !this.unchanged[start + i])
146
+ return false;
147
+ }
148
+ return true;
149
+ }
150
+ }
72
151
  const TEXT_REPETITION_MIN_LENGTH = 40;
73
152
  const TEXT_REPETITION_MIN_REPEATS = 3;
74
153
  const TEXT_REPETITION_TAIL = 4096;
@@ -108,13 +187,16 @@ export function evaluateLoopBreak(stats) {
108
187
  if (stats.textRepetitionDetected) {
109
188
  reasons.push("repeated output detected");
110
189
  }
190
+ if (stats.cyclicPattern) {
191
+ reasons.push(`tool calls repeating in a cycle of ${stats.cyclicPattern.length} with no new results`);
192
+ }
111
193
  return { shouldBreak: reasons.length > 0, reasons };
112
194
  }
113
- export function buildLoopBreakMessage(reasons) {
195
+ export function buildLoopBreakMessage(reasons, final = false) {
114
196
  const reasonText = reasons.length > 0 ? ` Triggered because: ${reasons.join(", ")}.` : "";
115
197
  return {
116
198
  role: "user",
117
- content: `${LOOP_BREAK_PROMPT}${reasonText}`,
199
+ content: `${final ? LOOP_BREAK_FINAL_PROMPT : LOOP_BREAK_PROMPT}${reasonText}`,
118
200
  };
119
201
  }
120
202
  //# sourceMappingURL=loop-breaker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loop-breaker.js","sourceRoot":"","sources":["../../src/core/loop-breaker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loop-breaker.js","sourceRoot":"","sources":["../../src/core/loop-breaker.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { buildLoopBreakMessage, detectTextRepetition, evaluateLoopBreak, ToolCallProgressTracker, toolCallSignature, } from "./loop-breaker.js";
2
+ import { buildLoopBreakMessage, CycleDetector, detectTextRepetition, evaluateLoopBreak, LOOP_BREAK_FINAL_PROMPT, LOOP_BREAK_PROMPT, ToolCallProgressTracker, toolCallSignature, } from "./loop-breaker.js";
3
3
  describe("toolCallSignature", () => {
4
4
  it("is stable regardless of key order in args", () => {
5
5
  const a = toolCallSignature("edit", { file_path: "a.ts", old: "x", new: "y" });
@@ -62,7 +62,105 @@ describe("ToolCallProgressTracker", () => {
62
62
  }
63
63
  });
64
64
  });
65
+ describe("CycleDetector", () => {
66
+ /** Drive an A/B/… cycle where every signature always returns the same result. */
67
+ const runCycle = (detector, unit, rounds) => {
68
+ let last = null;
69
+ for (let round = 0; round < rounds; round++) {
70
+ for (const call of unit) {
71
+ last = detector.record(call.name, call.args, call.result, false);
72
+ }
73
+ }
74
+ return last;
75
+ };
76
+ it("detects an alternating A/B cycle (length 2) within 15 calls", () => {
77
+ const detector = new CycleDetector();
78
+ const unit = [
79
+ { name: "read", args: { file_path: "a.ts" }, result: "aaa" },
80
+ { name: "read", args: { file_path: "b.ts" }, result: "bbb" },
81
+ ];
82
+ // 5 full cycles = 10 calls — must be detected by then.
83
+ const detection = runCycle(detector, unit, 5);
84
+ expect(detection).toEqual({ length: 2, repeats: 5 });
85
+ });
86
+ it("detects a length-3 cycle", () => {
87
+ const detector = new CycleDetector();
88
+ const unit = [
89
+ { name: "read", args: { file_path: "a.ts" }, result: "aaa" },
90
+ { name: "grep", args: { pattern: "x" }, result: "none" },
91
+ { name: "ls", args: { path: "." }, result: "files" },
92
+ ];
93
+ expect(runCycle(detector, unit, 5)).toEqual({ length: 3, repeats: 5 });
94
+ });
95
+ it("detects a length-5 cycle", () => {
96
+ const detector = new CycleDetector();
97
+ const unit = [1, 2, 3, 4, 5].map((n) => ({
98
+ name: "read",
99
+ args: { file_path: `f${n}.ts` },
100
+ result: `content-${n}`,
101
+ }));
102
+ expect(runCycle(detector, unit, 5)).toEqual({ length: 5, repeats: 5 });
103
+ });
104
+ it("detects a single-call repeat as a length-1 cycle", () => {
105
+ const detector = new CycleDetector();
106
+ let detection = null;
107
+ for (let i = 0; i < 5; i++) {
108
+ detection = detector.record("bash", { command: "npm test" }, "1 failing", true);
109
+ }
110
+ expect(detection).toEqual({ length: 1, repeats: 5 });
111
+ });
112
+ it("does NOT detect when the pattern is broken by a different call", () => {
113
+ const detector = new CycleDetector();
114
+ const a = { name: "read", args: { file_path: "a.ts" }, result: "aaa" };
115
+ const b = { name: "read", args: { file_path: "b.ts" }, result: "bbb" };
116
+ let detection = null;
117
+ for (let round = 0; round < 5; round++) {
118
+ detection = detector.record(a.name, a.args, a.result, false);
119
+ expect(detection).toBeNull();
120
+ detection = detector.record(b.name, b.args, b.result, false);
121
+ if (round === 3) {
122
+ // A fresh, different call breaks the streak before 5 full cycles.
123
+ detection = detector.record("grep", { pattern: "unique" }, "hit", false);
124
+ }
125
+ }
126
+ expect(detection).toBeNull();
127
+ });
128
+ it("does NOT detect when one signature's result keeps changing (progress)", () => {
129
+ const detector = new CycleDetector();
130
+ for (let i = 0; i < 8; i++) {
131
+ expect(detector.record("read", { file_path: "a.ts" }, `version-${i}`, false)).toBeNull();
132
+ expect(detector.record("read", { file_path: "b.ts" }, "stable", false)).toBeNull();
133
+ }
134
+ });
135
+ it("ignores expected-repeat polling tools", () => {
136
+ const detector = new CycleDetector();
137
+ for (let i = 0; i < 12; i++) {
138
+ expect(detector.record("task_output", { id: "job-1" }, "running", false)).toBeNull();
139
+ }
140
+ });
141
+ it("reset() clears accumulated evidence", () => {
142
+ const detector = new CycleDetector();
143
+ const unit = [
144
+ { name: "read", args: { file_path: "a.ts" }, result: "aaa" },
145
+ { name: "read", args: { file_path: "b.ts" }, result: "bbb" },
146
+ ];
147
+ runCycle(detector, unit, 4);
148
+ detector.reset();
149
+ // One more full cycle after reset is NOT enough evidence again.
150
+ expect(runCycle(detector, unit, 1)).toBeNull();
151
+ });
152
+ });
65
153
  describe("evaluateLoopBreak", () => {
154
+ it("breaks on a detected cyclic pattern", () => {
155
+ const decision = evaluateLoopBreak({
156
+ consecutiveFailures: 0,
157
+ repeatedNoProgressCalls: 0,
158
+ textRepetitionDetected: false,
159
+ cyclicPattern: { length: 2, repeats: 5 },
160
+ });
161
+ expect(decision.shouldBreak).toBe(true);
162
+ expect(decision.reasons.join(" ")).toContain("cycle of 2");
163
+ });
66
164
  it("does not break on healthy progress", () => {
67
165
  const decision = evaluateLoopBreak({
68
166
  consecutiveFailures: 1,
@@ -127,5 +225,14 @@ describe("buildLoopBreakMessage", () => {
127
225
  expect(content).toContain("Triggered because");
128
226
  expect(content.toLowerCase()).toContain("do not mention this note");
129
227
  });
228
+ it("stage 2 uses the harsher final stop-and-report prompt", () => {
229
+ const first = buildLoopBreakMessage(["still looping"], false);
230
+ const final = buildLoopBreakMessage(["still looping"], true);
231
+ expect(first.content).toContain(LOOP_BREAK_PROMPT);
232
+ expect(final.content).toContain(LOOP_BREAK_FINAL_PROMPT);
233
+ expect(final.content).toContain("Do NOT attempt the action again");
234
+ expect(final.content).toContain("what is blocking you");
235
+ expect(final.content).not.toContain("Stuck?");
236
+ });
130
237
  });
131
238
  //# sourceMappingURL=loop-breaker.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loop-breaker.test.js","sourceRoot":"","sources":["../../src/core/loop-breaker.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loop-breaker.test.js","sourceRoot":"","sources":["../../src/core/loop-breaker.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,GAAG,iBAAiB,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,GAAG,iBAAiB,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAC/D,iBAAiB,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAClD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAC/D,iBAAiB,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CACjD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAChE,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,IAAI,GACR,6GAA6G,CAAC;QAChH,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,KAAK,GAAG,+CAA+C,CAAC;QAC9D,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,KAAK,GAAG,kDAAkD,CAAC;QACjE,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,OAAO,GAAG,IAAI,uBAAuB,EAAE,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,OAAO,GAAG,IAAI,uBAAuB,EAAE,CAAC;QAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,CACJ,OAAO,CAAC,MAAM,CACZ,MAAM,EACN,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,EACtE,QAAQ,CAAC,EAAE,EACX,KAAK,CACN,CACF,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,OAAO,GAAG,IAAI,uBAAuB,EAAE,CAAC;QAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,OAAO,GAAG,IAAI,uBAAuB,EAAE,CAAC;QAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,iFAAiF;IACjF,MAAM,QAAQ,GAAG,CACf,QAAuB,EACvB,IAA4D,EAC5D,MAAc,EACd,EAAE;QACF,IAAI,IAAI,GAAwC,IAAI,CAAC;QACrD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YAC5C,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gBACxB,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG;YACX,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YAC5D,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;SAC7D,CAAC;QACF,uDAAuD;QACvD,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG;YACX,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YAC5D,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;YACxD,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;SACrD,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE;YAC/B,MAAM,EAAE,WAAW,CAAC,EAAE;SACvB,CAAC,CAAC,CAAC;QACJ,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QACrC,IAAI,SAAS,GAAwC,IAAI,CAAC;QAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACvE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACvE,IAAI,SAAS,GAAwC,IAAI,CAAC;QAC1D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;YACvC,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC7D,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC7B,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC7D,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,kEAAkE;gBAClE,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QACD,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YACzF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACrF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACvF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG;YACX,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YAC5D,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;SAC7D,CAAC;QACF,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5B,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,gEAAgE;QAChE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,QAAQ,GAAG,iBAAiB,CAAC;YACjC,mBAAmB,EAAE,CAAC;YACtB,uBAAuB,EAAE,CAAC;YAC1B,sBAAsB,EAAE,KAAK;YAC7B,aAAa,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;SACzC,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,QAAQ,GAAG,iBAAiB,CAAC;YACjC,mBAAmB,EAAE,CAAC;YACtB,uBAAuB,EAAE,CAAC;YAC1B,sBAAsB,EAAE,KAAK;SAC9B,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,QAAQ,GAAG,iBAAiB,CAAC;YACjC,mBAAmB,EAAE,CAAC;YACtB,uBAAuB,EAAE,CAAC;YAC1B,sBAAsB,EAAE,KAAK;SAC9B,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,QAAQ,GAAG,iBAAiB,CAAC;YACjC,mBAAmB,EAAE,CAAC;YACtB,uBAAuB,EAAE,CAAC;YAC1B,sBAAsB,EAAE,KAAK;SAC9B,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,QAAQ,GAAG,iBAAiB,CAAC;YACjC,mBAAmB,EAAE,CAAC;YACtB,uBAAuB,EAAE,CAAC;YAC1B,sBAAsB,EAAE,KAAK;SAC9B,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,QAAQ,GAAG,iBAAiB,CAAC;YACjC,mBAAmB,EAAE,CAAC;YACtB,uBAAuB,EAAE,CAAC;YAC1B,sBAAsB,EAAE,IAAI;SAC7B,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,OAAO,GAAG,qBAAqB,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,OAAO,GAAG,qBAAqB,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAiB,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,KAAK,GAAG,qBAAqB,CAAC,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,qBAAqB,CAAC,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;QACnE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Message } from "@prestyj/ai";
2
+ /**
3
+ * Repair images restored from older sessions that predate attachment resizing.
4
+ *
5
+ * Anthropic accepts images up to 8000 px normally, but lowers the limit to
6
+ * 2000 px per side once the full request history contains more than 20 images.
7
+ * Mutating the in-memory blocks prevents an old oversized image from poisoning
8
+ * every later turn; malformed blocks are left alone so session loading remains
9
+ * best-effort.
10
+ */
11
+ export declare function normalizeMessageImages(messages: Message[]): Promise<number>;
12
+ //# sourceMappingURL=message-images.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-images.d.ts","sourceRoot":"","sources":["../../src/core/message-images.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,OAAO,EAAE,MAAM,aAAa,CAAC;AAuBzD;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBjF"}
@@ -0,0 +1,52 @@
1
+ import { shrinkToFit } from "../utils/image.js";
2
+ function imageBlocks(message) {
3
+ if (message.role === "system" || typeof message.content === "string")
4
+ return [];
5
+ const images = [];
6
+ if (message.role === "tool") {
7
+ for (const result of message.content) {
8
+ if (typeof result.content === "string")
9
+ continue;
10
+ for (const block of result.content) {
11
+ if (block.type === "image")
12
+ images.push(block);
13
+ }
14
+ }
15
+ return images;
16
+ }
17
+ for (const block of message.content) {
18
+ if (block.type === "image")
19
+ images.push(block);
20
+ }
21
+ return images;
22
+ }
23
+ /**
24
+ * Repair images restored from older sessions that predate attachment resizing.
25
+ *
26
+ * Anthropic accepts images up to 8000 px normally, but lowers the limit to
27
+ * 2000 px per side once the full request history contains more than 20 images.
28
+ * Mutating the in-memory blocks prevents an old oversized image from poisoning
29
+ * every later turn; malformed blocks are left alone so session loading remains
30
+ * best-effort.
31
+ */
32
+ export async function normalizeMessageImages(messages) {
33
+ let normalizedCount = 0;
34
+ for (const message of messages) {
35
+ for (const block of imageBlocks(message)) {
36
+ try {
37
+ const original = Buffer.from(block.data, "base64");
38
+ const resized = await shrinkToFit(original, block.mediaType);
39
+ if (resized.buffer !== original || resized.mediaType !== block.mediaType) {
40
+ block.data = resized.buffer.toString("base64");
41
+ block.mediaType = resized.mediaType;
42
+ normalizedCount++;
43
+ }
44
+ }
45
+ catch {
46
+ // A bad historical image should not make the entire session unloadable.
47
+ }
48
+ }
49
+ }
50
+ return normalizedCount;
51
+ }
52
+ //# sourceMappingURL=message-images.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-images.js","sourceRoot":"","sources":["../../src/core/message-images.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,SAAS,WAAW,CAAC,OAAgB;IACnC,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEhF,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5B,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;gBAAE,SAAS;YACjD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;oBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,QAAmB;IAC9D,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACnD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC7D,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;oBACzE,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAC/C,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;oBACpC,eAAe,EAAE,CAAC;gBACpB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wEAAwE;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=message-images.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-images.test.d.ts","sourceRoot":"","sources":["../../src/core/message-images.test.ts"],"names":[],"mappings":""}