@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
@@ -0,0 +1,62 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { normalizeMessageImages } from "./message-images.js";
3
+ async function oversizedPng() {
4
+ const sharpModule = await import("sharp");
5
+ return sharpModule
6
+ .default({
7
+ create: {
8
+ width: 2400,
9
+ height: 1200,
10
+ channels: 3,
11
+ background: { r: 20, g: 40, b: 60 },
12
+ },
13
+ })
14
+ .png()
15
+ .toBuffer();
16
+ }
17
+ describe("normalizeMessageImages", () => {
18
+ it("repairs oversized images restored in user and tool-result history", async () => {
19
+ const original = await oversizedPng();
20
+ const data = original.toString("base64");
21
+ const messages = [
22
+ {
23
+ role: "user",
24
+ content: [{ type: "image", mediaType: "image/png", data }],
25
+ },
26
+ {
27
+ role: "tool",
28
+ content: [
29
+ {
30
+ type: "tool_result",
31
+ toolCallId: "tool-1",
32
+ content: [{ type: "image", mediaType: "image/png", data }],
33
+ },
34
+ ],
35
+ },
36
+ ];
37
+ expect(await normalizeMessageImages(messages)).toBe(2);
38
+ const userMessage = messages[0];
39
+ const toolMessage = messages[1];
40
+ if (userMessage.role !== "user" || toolMessage.role !== "tool") {
41
+ throw new Error("Unexpected test message shape");
42
+ }
43
+ const userContent = userMessage.content;
44
+ if (typeof userContent === "string")
45
+ throw new Error("Expected user image content");
46
+ const userImage = userContent[0];
47
+ const toolResultContent = toolMessage.content[0].content;
48
+ if (userImage.type !== "image" || typeof toolResultContent === "string") {
49
+ throw new Error("Expected image blocks");
50
+ }
51
+ const toolImage = toolResultContent[0];
52
+ if (toolImage.type !== "image")
53
+ throw new Error("Expected tool-result image block");
54
+ const sharpModule = await import("sharp");
55
+ for (const image of [userImage, toolImage]) {
56
+ const metadata = await sharpModule.default(Buffer.from(image.data, "base64")).metadata();
57
+ expect(metadata.width).toBeLessThanOrEqual(2000);
58
+ expect(metadata.height).toBeLessThanOrEqual(2000);
59
+ }
60
+ });
61
+ });
62
+ //# sourceMappingURL=message-images.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-images.test.js","sourceRoot":"","sources":["../../src/core/message-images.test.ts"],"names":[],"mappings":"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"}
@@ -17,25 +17,22 @@ export declare function discoverProjects(): Promise<DiscoveredProject[]>;
17
17
  export interface RecentSession {
18
18
  /** Session id. */
19
19
  id: string;
20
- /** Absolute path to the session .jsonl (passed back to reopen it). */
20
+ /** Absolute resumable path to a plain or gzip EZ Coder session. */
21
21
  path: string;
22
- /** First user message, trimmed to a short preview (may be empty). */
22
+ /** Legacy saved label, falling back to the first real user prompt. */
23
23
  preview: string;
24
24
  /** Relative "3h ago" string from last activity. */
25
25
  lastActiveDisplay: string;
26
26
  messageCount: number;
27
27
  }
28
28
  /**
29
- * List the most recent ezcoder sessions for a project cwd, newest first, each
30
- * with a short preview built from its first user message. Used by the new-window
31
- * project picker to offer "resume a session" alongside "new session".
29
+ * List the most recent ezcoder conversations for a project cwd. Compaction
30
+ * checkpoints share a conversation id, so only the newest resumable checkpoint
31
+ * is shown. Legacy labels win; otherwise the first real user prompt is used.
32
32
  *
33
33
  * Fast path: instead of fully reading every session file in the project (what
34
- * SessionManager.list does to count messages), sort files by mtime and read
35
- * only the newest `limit`. Each chosen file is parsed in ONE pass for its
36
- * header id, message count, last activity, and first user preview. For projects
37
- * with many/large sessions this is the difference between scanning everything
38
- * and scanning ~5 files.
34
+ * SessionManager.list does to count messages), sort files by mtime and parse
35
+ * only enough recent files to return `limit` distinct conversations.
39
36
  */
40
37
  export declare function listRecentSessions(cwd: string, limit?: number, sessionsDir?: string): Promise<RecentSession[]>;
41
38
  //# sourceMappingURL=project-discovery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-discovery.d.ts","sourceRoot":"","sources":["../../src/core/project-discovery.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,aAAa,GAAG,OAAO,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gEAAgE;IAChE,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA6BrE;AAsUD,MAAM,WAAW,aAAa;IAC5B,kBAAkB;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,KAAK,SAAI,EACT,WAAW,SAA4B,GACtC,OAAO,CAAC,aAAa,EAAE,CAAC,CAa1B"}
1
+ {"version":3,"file":"project-discovery.d.ts","sourceRoot":"","sources":["../../src/core/project-discovery.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,aAAa,GAAG,OAAO,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gEAAgE;IAChE,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA6BrE;AAmYD,MAAM,WAAW,aAAa;IAC5B,kBAAkB;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,KAAK,SAAI,EACT,WAAW,SAA4B,GACtC,OAAO,CAAC,aAAa,EAAE,CAAC,CAkB1B"}
@@ -5,6 +5,8 @@ import os from "node:os";
5
5
  import path from "node:path";
6
6
  import { getAppPaths } from "../config.js";
7
7
  import { encodeCwd } from "./encode-cwd.js";
8
+ import { getUserSessionPrompt } from "./session-preview.js";
9
+ import { isSessionPath, openSessionReadStream, resolveSessionPath } from "./session-storage.js";
8
10
  /**
9
11
  * Scan ezcoder + Claude Code + Codex session stores and return one row per
10
12
  * project, sorted most-recent first. Duplicates (same cwd) are collapsed; the
@@ -69,10 +71,10 @@ async function discoverEzcoderProjects() {
69
71
  const results = [];
70
72
  for (const entry of entries) {
71
73
  const dir = path.join(sessionsDir, entry);
72
- const mtime = await maxJsonlMtime(dir);
74
+ const mtime = await maxGgcoderSessionMtime(dir);
73
75
  if (mtime === null)
74
76
  continue;
75
- const rawCwd = (await readFirstFromJsonlDir(dir, ezcoderCwdExtractor)) ?? fallbackUnderscoreDecode(entry);
77
+ const rawCwd = (await readFirstFromGgcoderDir(dir, ezcoderCwdExtractor)) ?? fallbackUnderscoreDecode(entry);
76
78
  if (!rawCwd)
77
79
  continue;
78
80
  // Normalize traversal segments (e.g. an agent launched with cwd
@@ -195,6 +197,14 @@ async function maxJsonlMtime(dir) {
195
197
  max = f.mtime;
196
198
  return max > 0 ? max : null;
197
199
  }
200
+ async function maxGgcoderSessionMtime(dir) {
201
+ if (!(await isDirectory(dir)))
202
+ return null;
203
+ const files = await collectGgcoderSessionFiles(dir, 2);
204
+ if (files.length === 0)
205
+ return null;
206
+ return Math.max(...files.map((file) => file.mtime));
207
+ }
198
208
  /**
199
209
  * Walk `dir` up to `maxDepth` levels deep collecting every .jsonl file. Used
200
210
  * for both Claude Code (top-level + `<uuid>/subagents/`) and Codex
@@ -229,6 +239,36 @@ async function collectJsonlFiles(dir, maxDepth) {
229
239
  }
230
240
  }
231
241
  }
242
+ async function collectGgcoderSessionFiles(dir, maxDepth) {
243
+ const byResolvedPath = new Map();
244
+ await walk(dir, 0);
245
+ return [...byResolvedPath.values()];
246
+ async function walk(current, depth) {
247
+ let entries;
248
+ try {
249
+ entries = await fs.readdir(current, { withFileTypes: true });
250
+ }
251
+ catch {
252
+ return;
253
+ }
254
+ for (const entry of entries) {
255
+ const fullPath = path.join(current, entry.name);
256
+ if (entry.isFile() && isSessionPath(entry.name)) {
257
+ try {
258
+ const resolvedPath = await resolveSessionPath(fullPath);
259
+ const stat = await fs.stat(resolvedPath);
260
+ byResolvedPath.set(resolvedPath, { path: resolvedPath, mtime: stat.mtimeMs });
261
+ }
262
+ catch {
263
+ // Ignore malformed redirects, incomplete archives, and raced files.
264
+ }
265
+ }
266
+ else if (entry.isDirectory() && depth < maxDepth && !entry.name.endsWith(".assets")) {
267
+ await walk(fullPath, depth + 1);
268
+ }
269
+ }
270
+ }
271
+ }
232
272
  const claudeCwdExtractor = (line) => {
233
273
  try {
234
274
  const parsed = JSON.parse(line);
@@ -278,9 +318,8 @@ const codexCwdExtractor = (line) => {
278
318
  return null;
279
319
  };
280
320
  /**
281
- * Walk all .jsonl files under `dir` newest-first, returning the first non-null
282
- * extractor result. Walks two levels deep (matches Claude Code's nested
283
- * layout).
321
+ * Walk all plain Claude/Codex JSONL files under `dir` newest-first, returning
322
+ * the first non-null extractor result.
284
323
  */
285
324
  async function readFirstFromJsonlDir(dir, extractor) {
286
325
  const files = await collectJsonlFiles(dir, 2);
@@ -294,6 +333,28 @@ async function readFirstFromJsonlDir(dir, extractor) {
294
333
  }
295
334
  return null;
296
335
  }
336
+ async function readFirstFromGgcoderDir(dir, extractor) {
337
+ const files = await collectGgcoderSessionFiles(dir, 2);
338
+ files.sort((a, b) => b.mtime - a.mtime);
339
+ for (const file of files) {
340
+ try {
341
+ const { stream } = await openSessionReadStream(file.path);
342
+ const rl = readline.createInterface({ input: stream, crlfDelay: Infinity });
343
+ let lines = 0;
344
+ for await (const line of rl) {
345
+ if (++lines > 200)
346
+ break;
347
+ const value = extractor(line);
348
+ if (value)
349
+ return value;
350
+ }
351
+ }
352
+ catch {
353
+ // A corrupt archive must not hide otherwise valid projects in this store.
354
+ }
355
+ }
356
+ return null;
357
+ }
297
358
  /**
298
359
  * Stream `file` line-by-line and return the first non-null extractor result.
299
360
  * Caps lines so a giant transcript can't stall discovery.
@@ -362,103 +423,101 @@ function formatRelativeTime(ms) {
362
423
  return `${Math.floor(diff / month)}mo ago`;
363
424
  }
364
425
  /**
365
- * List the most recent ezcoder sessions for a project cwd, newest first, each
366
- * with a short preview built from its first user message. Used by the new-window
367
- * project picker to offer "resume a session" alongside "new session".
426
+ * List the most recent ezcoder conversations for a project cwd. Compaction
427
+ * checkpoints share a conversation id, so only the newest resumable checkpoint
428
+ * is shown. Legacy labels win; otherwise the first real user prompt is used.
368
429
  *
369
430
  * Fast path: instead of fully reading every session file in the project (what
370
- * SessionManager.list does to count messages), sort files by mtime and read
371
- * only the newest `limit`. Each chosen file is parsed in ONE pass for its
372
- * header id, message count, last activity, and first user preview. For projects
373
- * with many/large sessions this is the difference between scanning everything
374
- * and scanning ~5 files.
431
+ * SessionManager.list does to count messages), sort files by mtime and parse
432
+ * only enough recent files to return `limit` distinct conversations.
375
433
  */
376
434
  export async function listRecentSessions(cwd, limit = 5, sessionsDir = getAppPaths().sessionsDir) {
377
435
  const dir = path.join(sessionsDir, encodeCwd(cwd));
378
- const files = await collectJsonlFiles(dir, 1);
436
+ const files = await collectGgcoderSessionFiles(dir, 1);
379
437
  if (files.length === 0)
380
438
  return [];
381
439
  files.sort((a, b) => b.mtime - a.mtime);
382
440
  const out = [];
441
+ const seenConversationIds = new Set();
383
442
  for (const f of files) {
384
443
  if (out.length >= limit)
385
444
  break;
386
445
  const parsed = await readSessionSummary(f.path);
387
- if (parsed && parsed.messageCount > 0)
388
- out.push(parsed);
446
+ if (!parsed || parsed.messageCount === 0)
447
+ continue;
448
+ if (seenConversationIds.has(parsed.conversationId))
449
+ continue;
450
+ seenConversationIds.add(parsed.conversationId);
451
+ const { conversationId: _conversationId, ...session } = parsed;
452
+ out.push(session);
389
453
  }
390
454
  return out;
391
455
  }
392
- /** Single-pass parse of one session file: header id + count + activity + preview. */
456
+ /** Single-pass parse of one session file: identity + count + activity + preview. */
393
457
  async function readSessionSummary(file) {
394
- return new Promise((resolve) => {
395
- const stream = createReadStream(file, { encoding: "utf-8" });
458
+ try {
459
+ const { path: resolvedPath, stream } = await openSessionReadStream(file);
396
460
  const rl = readline.createInterface({ input: stream, crlfDelay: Infinity });
397
461
  let id = "";
462
+ let conversationId = "";
398
463
  let messageCount = 0;
399
464
  let lastActivity = "";
465
+ let headerPreview = "";
400
466
  let preview = "";
467
+ let label = "";
401
468
  let valid = false;
402
- let done = false;
403
- const finish = () => {
404
- if (done)
405
- return;
406
- done = true;
407
- resolve(valid
408
- ? { id, path: file, preview, lastActiveDisplay: rel(lastActivity), messageCount }
409
- : null);
410
- rl.close();
411
- stream.destroy();
412
- };
413
- rl.on("line", (line) => {
414
- if (done || !line)
415
- return;
469
+ for await (const line of rl) {
470
+ if (!line)
471
+ continue;
416
472
  try {
417
- const p = JSON.parse(line);
473
+ const entry = JSON.parse(line);
418
474
  if (!valid) {
419
- if (p.type !== "session")
420
- return finish(); // not a session file
475
+ if (entry.type !== "session")
476
+ return null;
421
477
  valid = true;
422
- id = p.id ?? "";
423
- if (p.timestamp)
424
- lastActivity = p.timestamp;
425
- return;
478
+ id = entry.id ?? "";
479
+ conversationId = entry.conversationId ?? id;
480
+ if (typeof entry.preview === "string") {
481
+ headerPreview = entry.preview.replace(/\s+/g, " ").trim().slice(0, 80);
482
+ }
483
+ if (entry.timestamp)
484
+ lastActivity = entry.timestamp;
485
+ continue;
426
486
  }
427
- if (p.type === "message") {
428
- messageCount++;
429
- if (p.timestamp)
430
- lastActivity = p.timestamp;
431
- if (!preview && p.message?.role === "user") {
432
- const text = extractText(p.message.content);
487
+ if (entry.type === "label" && typeof entry.label === "string" && entry.label.trim()) {
488
+ label = entry.label.replace(/\s+/g, " ").trim().slice(0, 80);
489
+ }
490
+ else if (entry.type === "message") {
491
+ messageCount += 1;
492
+ if (entry.timestamp)
493
+ lastActivity = entry.timestamp;
494
+ if (!preview && entry.message?.role === "user") {
495
+ const text = getUserSessionPrompt(entry.message.content);
433
496
  if (text)
434
497
  preview = text.replace(/\s+/g, " ").trim().slice(0, 80);
435
498
  }
436
499
  }
437
500
  }
438
501
  catch {
439
- // skip malformed line
502
+ // Skip malformed lines; archive migration preserves them byte-for-byte.
440
503
  }
441
- });
442
- rl.on("close", finish);
443
- rl.on("error", finish);
444
- stream.on("error", finish);
445
- });
504
+ }
505
+ return valid
506
+ ? {
507
+ id,
508
+ conversationId: conversationId || id,
509
+ path: resolvedPath,
510
+ preview: label || headerPreview || preview,
511
+ lastActiveDisplay: rel(lastActivity),
512
+ messageCount,
513
+ }
514
+ : null;
515
+ }
516
+ catch {
517
+ return null;
518
+ }
446
519
  }
447
520
  function rel(timestamp) {
448
521
  return formatRelativeTime(Date.parse(timestamp) || 0);
449
522
  }
450
- function extractText(content) {
451
- if (typeof content === "string")
452
- return content;
453
- if (Array.isArray(content)) {
454
- for (const block of content) {
455
- if (block && typeof block === "object" && "text" in block) {
456
- const t = block.text;
457
- if (typeof t === "string")
458
- return t;
459
- }
460
- }
461
- }
462
- return "";
463
- }
464
523
  //# sourceMappingURL=project-discovery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-discovery.js","sourceRoot":"","sources":["../../src/core/project-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAa5C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACrC,uBAAuB,EAAE;QACzB,sBAAsB,EAAE;QACxB,qBAAqB,EAAE;KACxB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACtB,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;YACjB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC;YAC7D,iBAAiB,EAAE,EAAE,EAAE,mBAAmB;YAC1C,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;SACnD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrD,GAAG,CAAC;QACJ,iBAAiB,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC;KACtD,CAAC,CAAC,CAAC;IACJ,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;IACvD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,YAAY,GAAkC;IAClD,OAAO,EAAE,CAAC;IACV,aAAa,EAAE,CAAC;IAChB,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,SAAS,YAAY,CAAC,CAAkB,EAAE,CAAkB;IAC1D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAgB,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,uBAAuB;IACpC,MAAM,WAAW,GAAG,WAAW,EAAE,CAAC,WAAW,CAAC;IAC9C,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAwB,EAAE,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QAE7B,MAAM,MAAM,GACV,CAAC,MAAM,qBAAqB,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC,IAAI,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAC7F,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,gEAAgE;QAChE,6DAA6D;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;YAAE,SAAS;QAExC,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YACxB,IAAI,EAAE,GAAG;YACT,YAAY,EAAE,KAAK;YACnB,iBAAiB,EAAE,kBAAkB,CAAC,KAAK,CAAC;YAC5C,OAAO,EAAE,CAAC,SAAS,CAAC;SACrB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,SAAS,wBAAwB,CAAC,KAAa;IAC7C,OAAO,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,sBAAsB;IACnC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACnE,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAqC,EAAE;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAEhC,MAAM,GAAG,GACP,CAAC,MAAM,qBAAqB,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACtF,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAE3C,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YACxB,IAAI,EAAE,GAAG;YACT,YAAY,EAAE,KAAK;YACnB,iBAAiB,EAAE,kBAAkB,CAAC,KAAK,CAAC;YAC5C,OAAO,EAAE,CAAC,aAAa,CAAC;SACzB,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IACF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAA0B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AACnE,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,qBAAqB;IAClC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IAClE,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjD,oDAAoD;IACpD,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACtD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,yEAAyE;IACzE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAExC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QAC/D,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,OAAO,GAAwB,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;YAAE,SAAS;QACxC,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YACxB,IAAI,EAAE,GAAG;YACT,YAAY,EAAE,KAAK;YACnB,iBAAiB,EAAE,kBAAkB,CAAC,KAAK,CAAC;YAC5C,OAAO,EAAE,CAAC,OAAO,CAAC;SACnB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,CAAS;IAClC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,GAAW;IACtC,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,IAAI,CAAC,CAAC,KAAK,GAAG,GAAG;YAAE,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC;IACxD,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,iBAAiB,CAC9B,GAAW,EACX,QAAgB;IAEhB,MAAM,GAAG,GAAsC,EAAE,CAAC;IAClD,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACnB,OAAO,GAAG,CAAC;IAEX,KAAK,UAAU,IAAI,CAAC,OAAe,EAAE,KAAa;QAChD,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC;oBACH,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC9B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC7C,CAAC;gBAAC,MAAM,CAAC;oBACP,kBAAkB;gBACpB,CAAC;YACH,CAAC;iBAAM,IAAI,CAAC,CAAC,WAAW,EAAE,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;gBAC/C,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAID,MAAM,kBAAkB,GAAkB,CAAC,IAAI,EAAE,EAAE;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAsB,CAAC;QACrD,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,iFAAiF;AACjF,iFAAiF;AACjF,wEAAwE;AACxE,oEAAoE;AACpE,MAAM,mBAAmB,GAAkB,CAAC,IAAI,EAAE,EAAE;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAsC,CAAC;QACrE,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9F,OAAO,MAAM,CAAC,GAAG,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAC3C,MAAM,iBAAiB,GAAkB,CAAC,IAAI,EAAE,EAAE;IAChD,2EAA2E;IAC3E,0EAA0E;IAC1E,4DAA4D;IAC5D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAoC,CAAC;QACnE,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC;QAChC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,6DAA6D;IAC/D,CAAC;IACD,0EAA0E;IAC1E,6CAA6C;IAC7C,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;GAIG;AACH,KAAK,UAAU,qBAAqB,CAClC,GAAW,EACX,SAAwB;IAExB,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,MAAM,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,SAAwB;IACrE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7D,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5E,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,MAAM,SAAS,GAAG,GAAG,CAAC;QACtB,uEAAuE;QACvE,yEAAyE;QACzE,MAAM,MAAM,GAAG,CAAC,KAAoB,EAAE,EAAE;YACtC,IAAI,IAAI;gBAAE,OAAO;YACjB,IAAI,GAAG,IAAI,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC;QACF,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,IAAI;gBAAE,OAAO;YACjB,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,CAAC;gBACb,OAAO;YACT,CAAC;YACD,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,CAAC;gBAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACnC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,6EAA6E;IAC7E,yEAAyE;IACzE,mCAAmC;IACnC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,kBAAkB,CAAC,EAAU;IACpC,IAAI,EAAE,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAC7B,IAAI,IAAI,GAAG,MAAM;QAAE,OAAO,UAAU,CAAC;IACrC,MAAM,GAAG,GAAG,MAAM,CAAC;IACnB,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC;IACtB,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;IACtB,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC;IACrB,MAAM,KAAK,GAAG,EAAE,GAAG,GAAG,CAAC;IACvB,IAAI,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC;IACzD,IAAI,IAAI,GAAG,GAAG;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;IACzD,IAAI,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC;IACzD,IAAI,IAAI,GAAG,KAAK;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;IAC3D,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC;AAC7C,CAAC;AAgBD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAW,EACX,KAAK,GAAG,CAAC,EACT,WAAW,GAAG,WAAW,EAAE,CAAC,WAAW;IAEvC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAExC,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,GAAG,CAAC,MAAM,IAAI,KAAK;YAAE,MAAM;QAC/B,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,MAAM,IAAI,MAAM,CAAC,YAAY,GAAG,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,qFAAqF;AACrF,KAAK,UAAU,kBAAkB,CAAC,IAAY;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7D,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5E,IAAI,EAAE,GAAG,EAAE,CAAC;QACZ,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,MAAM,MAAM,GAAG,GAAS,EAAE;YACxB,IAAI,IAAI;gBAAE,OAAO;YACjB,IAAI,GAAG,IAAI,CAAC;YACZ,OAAO,CACL,KAAK;gBACH,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,CAAC,YAAY,CAAC,EAAE,YAAY,EAAE;gBACjF,CAAC,CAAC,IAAI,CACT,CAAC;YACF,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC;QACF,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO;YAC1B,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAKxB,CAAC;gBACF,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;wBAAE,OAAO,MAAM,EAAE,CAAC,CAAC,qBAAqB;oBAChE,KAAK,GAAG,IAAI,CAAC;oBACb,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;oBAChB,IAAI,CAAC,CAAC,SAAS;wBAAE,YAAY,GAAG,CAAC,CAAC,SAAS,CAAC;oBAC5C,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBACzB,YAAY,EAAE,CAAC;oBACf,IAAI,CAAC,CAAC,SAAS;wBAAE,YAAY,GAAG,CAAC,CAAC,SAAS,CAAC;oBAC5C,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;wBAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;wBAC5C,IAAI,IAAI;4BAAE,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACpE,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACvB,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACvB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,GAAG,CAAC,SAAiB;IAC5B,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,WAAW,CAAC,OAAgB;IACnC,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;gBAC1D,MAAM,CAAC,GAAI,KAA4B,CAAC,IAAI,CAAC;gBAC7C,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,OAAO,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
1
+ {"version":3,"file":"project-discovery.js","sourceRoot":"","sources":["../../src/core/project-discovery.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import path from "node:path";
4
4
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
5
  import { encodeCwd } from "./encode-cwd.js";
6
6
  import { discoverProjects, listRecentSessions } from "./project-discovery.js";
7
+ import { archiveColdSession, archiveSessionPath } from "./session-storage.js";
7
8
  // Holder the hoisted mock reads at call time (vi.mock is hoisted above imports,
8
9
  // so it can't close over a value assigned later without this indirection).
9
10
  const state = { sessionsDir: "" };
@@ -34,6 +35,27 @@ async function writeSession(dir, cwd) {
34
35
  });
35
36
  await fs.writeFile(path.join(dir, "session.jsonl"), `${header}\n${message}\n`, "utf-8");
36
37
  }
38
+ async function writeSessionRecords(cwd, fileName, options) {
39
+ const dir = path.join(state.sessionsDir, encodeCwd(cwd));
40
+ await fs.mkdir(dir, { recursive: true });
41
+ const file = path.join(dir, fileName);
42
+ const header = {
43
+ type: "session",
44
+ version: 2,
45
+ id: options.id,
46
+ conversationId: options.conversationId,
47
+ preview: options.preview,
48
+ timestamp: options.timestamp,
49
+ cwd,
50
+ provider: "anthropic",
51
+ model: "claude-sonnet-5",
52
+ leafId: null,
53
+ };
54
+ await fs.writeFile(file, [header, ...options.records].map((record) => JSON.stringify(record)).join("\n") + "\n", "utf-8");
55
+ const modified = new Date(options.timestamp);
56
+ await fs.utimes(file, modified, modified);
57
+ return file;
58
+ }
37
59
  describe("discoverProjects (ezcoder store)", () => {
38
60
  let tmp;
39
61
  beforeEach(async () => {
@@ -92,6 +114,161 @@ describe("discoverProjects (ezcoder store)", () => {
92
114
  expect(coder[0]?.path.startsWith(state.sessionsDir)).toBe(true);
93
115
  expect(chat[0]?.path.startsWith(chatSessionsDir)).toBe(true);
94
116
  });
117
+ it("skips compaction summaries and autopilot injections when choosing a preview", async () => {
118
+ const projectPath = path.join(tmp, "projects", "clean-preview");
119
+ await fs.mkdir(projectPath, { recursive: true });
120
+ const timestamp = new Date().toISOString();
121
+ await writeSessionRecords(projectPath, "internal-prompts.jsonl", {
122
+ id: "internal-prompts",
123
+ timestamp,
124
+ records: [
125
+ {
126
+ type: "message",
127
+ timestamp,
128
+ message: { role: "user", content: "[Previous conversation summary]\n### Goal" },
129
+ },
130
+ {
131
+ type: "message",
132
+ timestamp,
133
+ message: {
134
+ role: "user",
135
+ content: "[Autopilot] This turn was triggered by Nolan, EZ Coder's automated reviewer — fix it",
136
+ },
137
+ },
138
+ {
139
+ type: "message",
140
+ timestamp,
141
+ message: { role: "user", content: "Keep the original project title" },
142
+ },
143
+ ],
144
+ });
145
+ const sessions = await listRecentSessions(projectPath);
146
+ expect(sessions).toHaveLength(1);
147
+ expect(sessions[0]?.preview).toBe("Keep the original project title");
148
+ });
149
+ it("collapses compaction checkpoints and keeps a legacy saved label", async () => {
150
+ const projectPath = path.join(tmp, "projects", "checkpoint-title");
151
+ await fs.mkdir(projectPath, { recursive: true });
152
+ const older = new Date(Date.now() - 60_000).toISOString();
153
+ const newer = new Date().toISOString();
154
+ await writeSessionRecords(projectPath, "old.jsonl", {
155
+ id: "old-session",
156
+ conversationId: "conversation-root",
157
+ timestamp: older,
158
+ records: [
159
+ {
160
+ type: "message",
161
+ timestamp: older,
162
+ message: { role: "user", content: "A very long original request" },
163
+ },
164
+ { type: "label", timestamp: older, label: "Legacy session title" },
165
+ ],
166
+ });
167
+ const newestPath = await writeSessionRecords(projectPath, "new.jsonl", {
168
+ id: "new-checkpoint",
169
+ conversationId: "conversation-root",
170
+ timestamp: newer,
171
+ records: [
172
+ {
173
+ type: "message",
174
+ timestamp: newer,
175
+ message: { role: "user", content: "[Previous conversation summary]\n### Goal" },
176
+ },
177
+ { type: "label", timestamp: newer, label: "Legacy session title" },
178
+ ],
179
+ });
180
+ const sessions = await listRecentSessions(projectPath);
181
+ expect(sessions).toHaveLength(1);
182
+ expect(sessions[0]?.path).toBe(newestPath);
183
+ expect(sessions[0]?.preview).toBe("Legacy session title");
184
+ });
185
+ it("uses a checkpoint header preview when compacted messages contain only internal prompts", async () => {
186
+ const projectPath = path.join(tmp, "projects", "checkpoint-preview");
187
+ await fs.mkdir(projectPath, { recursive: true });
188
+ const older = new Date(Date.now() - 60_000).toISOString();
189
+ const newer = new Date().toISOString();
190
+ await writeSessionRecords(projectPath, "old.jsonl", {
191
+ id: "old-session",
192
+ conversationId: "conversation-root",
193
+ timestamp: older,
194
+ records: [
195
+ {
196
+ type: "message",
197
+ timestamp: older,
198
+ message: { role: "user", content: "Original user request" },
199
+ },
200
+ ],
201
+ });
202
+ const newestPath = await writeSessionRecords(projectPath, "new.jsonl", {
203
+ id: "new-checkpoint",
204
+ conversationId: "conversation-root",
205
+ preview: "Original user request",
206
+ timestamp: newer,
207
+ records: [
208
+ {
209
+ type: "message",
210
+ timestamp: newer,
211
+ message: { role: "user", content: "[Previous conversation summary]\n### Goal" },
212
+ },
213
+ ],
214
+ });
215
+ const sessions = await listRecentSessions(projectPath);
216
+ expect(sessions).toHaveLength(1);
217
+ expect(sessions[0]?.path).toBe(newestPath);
218
+ expect(sessions[0]?.preview).toBe("Original user request");
219
+ });
220
+ it("discovers and deduplicates an archived EZ Coder session", async () => {
221
+ const projectPath = path.join(tmp, "projects", "archived");
222
+ await fs.mkdir(projectPath, { recursive: true });
223
+ const timestamp = new Date().toISOString();
224
+ const plainPath = await writeSessionRecords(projectPath, "archived.jsonl", {
225
+ id: "archived-session",
226
+ timestamp,
227
+ records: [
228
+ {
229
+ type: "message",
230
+ id: "archived-message",
231
+ parentId: null,
232
+ timestamp,
233
+ message: { role: "user", content: "Archived request" },
234
+ },
235
+ ],
236
+ });
237
+ await archiveColdSession(plainPath);
238
+ const corruptArchive = path.join(path.dirname(plainPath), "newer-corrupt.jsonl.gz");
239
+ await fs.writeFile(corruptArchive, Buffer.from([0x1f, 0x8b, 0x00, 0x01]));
240
+ const future = new Date(Date.now() + 60_000);
241
+ await fs.utimes(corruptArchive, future, future);
242
+ const sessions = await listRecentSessions(projectPath);
243
+ expect(sessions).toHaveLength(1);
244
+ expect(sessions[0]?.path).toBe(archiveSessionPath(plainPath));
245
+ expect(sessions[0]?.preview).toBe("Archived request");
246
+ expect((await discoverProjects()).some((project) => project.path === projectPath)).toBe(true);
247
+ });
248
+ it("uses the first user prompt when a new session has no saved label", async () => {
249
+ const projectPath = path.join(tmp, "projects", "prompt-preview");
250
+ await fs.mkdir(projectPath, { recursive: true });
251
+ const timestamp = new Date().toISOString();
252
+ await writeSessionRecords(projectPath, "unlabelled.jsonl", {
253
+ id: "unlabelled-session",
254
+ timestamp,
255
+ records: [
256
+ {
257
+ type: "message",
258
+ timestamp,
259
+ message: { role: "user", content: "Replace title generation with project context" },
260
+ },
261
+ {
262
+ type: "message",
263
+ timestamp,
264
+ message: { role: "assistant", content: "Done." },
265
+ },
266
+ ],
267
+ });
268
+ const sessions = await listRecentSessions(projectPath);
269
+ expect(sessions).toHaveLength(1);
270
+ expect(sessions[0]?.preview).toBe("Replace title generation with project context");
271
+ });
95
272
  // The best-effort decode only round-trips for underscore-free absolute paths
96
273
  // (that's the whole point of the header fix). macOS's own os.tmpdir() contains
97
274
  // a literal underscore, so this test roots its project under posix /tmp to get