@roackb2/heddle 1.3.0 → 1.4.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 (388) hide show
  1. package/README.md +2 -2
  2. package/dist/src/cli/ask.js +2 -2
  3. package/dist/src/cli/ask.js.map +1 -1
  4. package/dist/src/cli/chat/adapters/slash-command-context.js +2 -2
  5. package/dist/src/cli/chat/adapters/slash-command-context.js.map +1 -1
  6. package/dist/src/cli/chat/hooks/controllers/run/tui-agent-turn-result.d.ts.map +1 -1
  7. package/dist/src/cli/chat/hooks/controllers/run/tui-agent-turn-result.js +4 -4
  8. package/dist/src/cli/chat/hooks/controllers/run/tui-agent-turn-result.js.map +1 -1
  9. package/dist/src/cli/chat/hooks/controllers/run/tui-compaction-status.d.ts +2 -3
  10. package/dist/src/cli/chat/hooks/controllers/run/tui-compaction-status.d.ts.map +1 -1
  11. package/dist/src/cli/chat/hooks/controllers/run/tui-compaction-status.js.map +1 -1
  12. package/dist/src/cli/chat/hooks/controllers/run/tui-direct-shell-result.d.ts.map +1 -1
  13. package/dist/src/cli/chat/hooks/controllers/run/tui-direct-shell-result.js +12 -8
  14. package/dist/src/cli/chat/hooks/controllers/run/tui-direct-shell-result.js.map +1 -1
  15. package/dist/src/cli/chat/hooks/controllers/run/tui-ordinary-turn.d.ts.map +1 -1
  16. package/dist/src/cli/chat/hooks/controllers/run/tui-ordinary-turn.js +16 -12
  17. package/dist/src/cli/chat/hooks/controllers/run/tui-ordinary-turn.js.map +1 -1
  18. package/dist/src/cli/chat/hooks/controllers/run/tui-tool-approval.d.ts +5 -4
  19. package/dist/src/cli/chat/hooks/controllers/run/tui-tool-approval.d.ts.map +1 -1
  20. package/dist/src/cli/chat/hooks/controllers/run/tui-tool-approval.js.map +1 -1
  21. package/dist/src/cli/chat/hooks/controllers/useAgentRunController.d.ts.map +1 -1
  22. package/dist/src/cli/chat/hooks/controllers/useAgentRunController.js +4 -5
  23. package/dist/src/cli/chat/hooks/controllers/useAgentRunController.js.map +1 -1
  24. package/dist/src/cli/chat/hooks/controllers/useChatAppController.d.ts.map +1 -1
  25. package/dist/src/cli/chat/hooks/controllers/useChatAppController.js +11 -7
  26. package/dist/src/cli/chat/hooks/controllers/useChatAppController.js.map +1 -1
  27. package/dist/src/cli/chat/hooks/useChatStatusSummary.d.ts +9 -3
  28. package/dist/src/cli/chat/hooks/useChatStatusSummary.d.ts.map +1 -1
  29. package/dist/src/cli/chat/hooks/useChatStatusSummary.js +2 -2
  30. package/dist/src/cli/chat/hooks/useChatStatusSummary.js.map +1 -1
  31. package/dist/src/cli/chat/state/compaction.d.ts +2 -1
  32. package/dist/src/cli/chat/state/compaction.d.ts.map +1 -1
  33. package/dist/src/cli/chat/state/compaction.js +1 -1
  34. package/dist/src/cli/chat/state/compaction.js.map +1 -1
  35. package/dist/src/cli/chat/submit.d.ts.map +1 -1
  36. package/dist/src/cli/chat/submit.js +13 -11
  37. package/dist/src/cli/chat/submit.js.map +1 -1
  38. package/dist/src/cli/chat/utils/format.d.ts +0 -4
  39. package/dist/src/cli/chat/utils/format.d.ts.map +1 -1
  40. package/dist/src/cli/chat/utils/format.js +0 -5
  41. package/dist/src/cli/chat/utils/format.js.map +1 -1
  42. package/dist/src/cli/chat/utils/runtime.d.ts +0 -2
  43. package/dist/src/cli/chat/utils/runtime.d.ts.map +1 -1
  44. package/dist/src/cli/chat/utils/runtime.js +0 -2
  45. package/dist/src/cli/chat/utils/runtime.js.map +1 -1
  46. package/dist/src/cli/main.js +1 -22
  47. package/dist/src/cli/main.js.map +1 -1
  48. package/dist/src/core/chat/engine/compaction/constants.d.ts +15 -0
  49. package/dist/src/core/chat/engine/compaction/constants.d.ts.map +1 -0
  50. package/dist/src/core/chat/engine/compaction/constants.js +15 -0
  51. package/dist/src/core/chat/engine/compaction/constants.js.map +1 -0
  52. package/dist/src/core/chat/engine/compaction/context-builder.d.ts +10 -0
  53. package/dist/src/core/chat/engine/compaction/context-builder.d.ts.map +1 -0
  54. package/dist/src/core/chat/engine/compaction/context-builder.js +47 -0
  55. package/dist/src/core/chat/engine/compaction/context-builder.js.map +1 -0
  56. package/dist/src/core/chat/engine/compaction/index.d.ts +3 -0
  57. package/dist/src/core/chat/engine/compaction/index.d.ts.map +1 -0
  58. package/dist/src/core/chat/engine/compaction/index.js +2 -0
  59. package/dist/src/core/chat/engine/compaction/index.js.map +1 -0
  60. package/dist/src/core/chat/engine/compaction/service.d.ts +21 -0
  61. package/dist/src/core/chat/engine/compaction/service.d.ts.map +1 -0
  62. package/dist/src/core/chat/engine/compaction/service.js +189 -0
  63. package/dist/src/core/chat/engine/compaction/service.js.map +1 -0
  64. package/dist/src/core/chat/engine/compaction/split-policy.d.ts +14 -0
  65. package/dist/src/core/chat/engine/compaction/split-policy.d.ts.map +1 -0
  66. package/dist/src/core/chat/engine/compaction/split-policy.js +52 -0
  67. package/dist/src/core/chat/engine/compaction/split-policy.js.map +1 -0
  68. package/dist/src/core/chat/engine/compaction/summarizer/context-builder.d.ts +9 -0
  69. package/dist/src/core/chat/engine/compaction/summarizer/context-builder.d.ts.map +1 -0
  70. package/dist/src/core/chat/engine/compaction/summarizer/context-builder.js +35 -0
  71. package/dist/src/core/chat/engine/compaction/summarizer/context-builder.js.map +1 -0
  72. package/dist/src/core/chat/engine/compaction/summarizer/index.d.ts +3 -0
  73. package/dist/src/core/chat/engine/compaction/summarizer/index.d.ts.map +1 -0
  74. package/dist/src/core/chat/engine/compaction/summarizer/index.js +2 -0
  75. package/dist/src/core/chat/engine/compaction/summarizer/index.js.map +1 -0
  76. package/dist/src/core/chat/engine/compaction/summarizer/prompt.d.ts +2 -0
  77. package/dist/src/core/chat/engine/compaction/summarizer/prompt.d.ts.map +1 -0
  78. package/dist/src/core/chat/engine/compaction/summarizer/prompt.js +31 -0
  79. package/dist/src/core/chat/engine/compaction/summarizer/prompt.js.map +1 -0
  80. package/dist/src/core/chat/engine/compaction/summarizer/service.d.ts +14 -0
  81. package/dist/src/core/chat/engine/compaction/summarizer/service.d.ts.map +1 -0
  82. package/dist/src/core/chat/engine/compaction/summarizer/service.js +70 -0
  83. package/dist/src/core/chat/engine/compaction/summarizer/service.js.map +1 -0
  84. package/dist/src/core/chat/engine/compaction/summarizer/types.d.ts +19 -0
  85. package/dist/src/core/chat/engine/compaction/summarizer/types.d.ts.map +1 -0
  86. package/dist/src/core/chat/engine/compaction/summarizer/types.js +2 -0
  87. package/dist/src/core/chat/engine/compaction/summarizer/types.js.map +1 -0
  88. package/dist/src/core/chat/engine/compaction/summary-message.d.ts +18 -0
  89. package/dist/src/core/chat/engine/compaction/summary-message.d.ts.map +1 -0
  90. package/dist/src/core/chat/engine/compaction/summary-message.js +46 -0
  91. package/dist/src/core/chat/engine/compaction/summary-message.js.map +1 -0
  92. package/dist/src/core/chat/engine/compaction/text.d.ts +9 -0
  93. package/dist/src/core/chat/engine/compaction/text.d.ts.map +1 -0
  94. package/dist/src/core/chat/engine/compaction/text.js +26 -0
  95. package/dist/src/core/chat/engine/compaction/text.js.map +1 -0
  96. package/dist/src/core/chat/engine/compaction/token-estimator.d.ts +14 -0
  97. package/dist/src/core/chat/engine/compaction/token-estimator.d.ts.map +1 -0
  98. package/dist/src/core/chat/engine/compaction/token-estimator.js +41 -0
  99. package/dist/src/core/chat/engine/compaction/token-estimator.js.map +1 -0
  100. package/dist/src/core/chat/engine/compaction/transcript-renderer.d.ts +10 -0
  101. package/dist/src/core/chat/engine/compaction/transcript-renderer.d.ts.map +1 -0
  102. package/dist/src/core/chat/engine/compaction/transcript-renderer.js +62 -0
  103. package/dist/src/core/chat/engine/compaction/transcript-renderer.js.map +1 -0
  104. package/dist/src/core/chat/engine/compaction/types.d.ts +66 -0
  105. package/dist/src/core/chat/engine/compaction/types.d.ts.map +1 -0
  106. package/dist/src/core/chat/engine/compaction/types.js +2 -0
  107. package/dist/src/core/chat/engine/compaction/types.js.map +1 -0
  108. package/dist/src/core/chat/engine/index.d.ts +2 -2
  109. package/dist/src/core/chat/engine/index.d.ts.map +1 -1
  110. package/dist/src/core/chat/engine/index.js +1 -1
  111. package/dist/src/core/chat/engine/index.js.map +1 -1
  112. package/dist/src/core/chat/engine/sessions/archives/file-chat-archive-repository.d.ts +27 -0
  113. package/dist/src/core/chat/engine/sessions/archives/file-chat-archive-repository.d.ts.map +1 -0
  114. package/dist/src/core/chat/engine/sessions/archives/file-chat-archive-repository.js +146 -0
  115. package/dist/src/core/chat/engine/sessions/archives/file-chat-archive-repository.js.map +1 -0
  116. package/dist/src/core/chat/engine/sessions/archives/index.d.ts +3 -0
  117. package/dist/src/core/chat/engine/sessions/archives/index.d.ts.map +1 -0
  118. package/dist/src/core/chat/engine/sessions/archives/index.js +2 -0
  119. package/dist/src/core/chat/engine/sessions/archives/index.js.map +1 -0
  120. package/dist/src/core/chat/engine/sessions/archives/types.d.ts +19 -0
  121. package/dist/src/core/chat/engine/sessions/archives/types.d.ts.map +1 -0
  122. package/dist/src/core/chat/engine/sessions/archives/types.js +2 -0
  123. package/dist/src/core/chat/engine/sessions/archives/types.js.map +1 -0
  124. package/dist/src/core/chat/engine/sessions/leases/index.d.ts +3 -0
  125. package/dist/src/core/chat/engine/sessions/leases/index.d.ts.map +1 -0
  126. package/dist/src/core/chat/engine/sessions/leases/index.js +2 -0
  127. package/dist/src/core/chat/engine/sessions/leases/index.js.map +1 -0
  128. package/dist/src/core/chat/engine/sessions/leases/leases.d.ts +25 -0
  129. package/dist/src/core/chat/engine/sessions/leases/leases.d.ts.map +1 -0
  130. package/dist/src/core/chat/engine/sessions/leases/leases.js +74 -0
  131. package/dist/src/core/chat/engine/sessions/leases/leases.js.map +1 -0
  132. package/dist/src/core/chat/engine/sessions/leases/types.d.ts +12 -0
  133. package/dist/src/core/chat/engine/sessions/leases/types.d.ts.map +1 -0
  134. package/dist/src/core/chat/engine/sessions/leases/types.js +2 -0
  135. package/dist/src/core/chat/engine/sessions/leases/types.js.map +1 -0
  136. package/dist/src/core/chat/engine/sessions/preferences/service.d.ts +2 -2
  137. package/dist/src/core/chat/engine/sessions/preferences/service.d.ts.map +1 -1
  138. package/dist/src/core/chat/engine/sessions/preferences/service.js +1 -1
  139. package/dist/src/core/chat/engine/sessions/preferences/service.js.map +1 -1
  140. package/dist/src/core/chat/engine/sessions/records/conversation-lines.d.ts +12 -0
  141. package/dist/src/core/chat/engine/sessions/records/conversation-lines.d.ts.map +1 -0
  142. package/dist/src/core/chat/engine/sessions/records/conversation-lines.js +28 -0
  143. package/dist/src/core/chat/engine/sessions/records/conversation-lines.js.map +1 -0
  144. package/dist/src/core/chat/engine/sessions/records/index.d.ts +5 -0
  145. package/dist/src/core/chat/engine/sessions/records/index.d.ts.map +1 -0
  146. package/dist/src/core/chat/engine/sessions/records/index.js +4 -0
  147. package/dist/src/core/chat/engine/sessions/records/index.js.map +1 -0
  148. package/dist/src/core/chat/engine/sessions/records/records.d.ts +21 -0
  149. package/dist/src/core/chat/engine/sessions/records/records.d.ts.map +1 -0
  150. package/dist/src/core/chat/engine/sessions/records/records.js +91 -0
  151. package/dist/src/core/chat/engine/sessions/records/records.js.map +1 -0
  152. package/dist/src/core/chat/engine/sessions/records/titles.d.ts +15 -0
  153. package/dist/src/core/chat/engine/sessions/records/titles.d.ts.map +1 -0
  154. package/dist/src/core/chat/engine/sessions/records/titles.js +19 -0
  155. package/dist/src/core/chat/engine/sessions/records/titles.js.map +1 -0
  156. package/dist/src/core/chat/engine/sessions/records/types.d.ts +35 -0
  157. package/dist/src/core/chat/engine/sessions/records/types.d.ts.map +1 -0
  158. package/dist/src/core/chat/engine/sessions/records/types.js +2 -0
  159. package/dist/src/core/chat/engine/sessions/records/types.js.map +1 -0
  160. package/dist/src/core/chat/engine/sessions/repository/chat-session-codec.d.ts +23 -0
  161. package/dist/src/core/chat/engine/sessions/repository/chat-session-codec.d.ts.map +1 -0
  162. package/dist/src/core/chat/engine/sessions/repository/chat-session-codec.js +61 -0
  163. package/dist/src/core/chat/engine/sessions/repository/chat-session-codec.js.map +1 -0
  164. package/dist/src/core/chat/engine/sessions/repository/chat-session-schemas.d.ts +369 -0
  165. package/dist/src/core/chat/engine/sessions/repository/chat-session-schemas.d.ts.map +1 -0
  166. package/dist/src/core/chat/engine/sessions/repository/chat-session-schemas.js +262 -0
  167. package/dist/src/core/chat/engine/sessions/repository/chat-session-schemas.js.map +1 -0
  168. package/dist/src/core/chat/engine/sessions/repository/file-chat-session-repository.d.ts +22 -34
  169. package/dist/src/core/chat/engine/sessions/repository/file-chat-session-repository.d.ts.map +1 -1
  170. package/dist/src/core/chat/engine/sessions/repository/file-chat-session-repository.js +168 -439
  171. package/dist/src/core/chat/engine/sessions/repository/file-chat-session-repository.js.map +1 -1
  172. package/dist/src/core/chat/engine/sessions/repository/index.d.ts +3 -0
  173. package/dist/src/core/chat/engine/sessions/repository/index.d.ts.map +1 -0
  174. package/dist/src/core/chat/engine/sessions/repository/index.js +2 -0
  175. package/dist/src/core/chat/engine/sessions/repository/index.js.map +1 -0
  176. package/dist/src/core/chat/engine/sessions/repository/types.d.ts +33 -0
  177. package/dist/src/core/chat/engine/sessions/repository/types.d.ts.map +1 -0
  178. package/dist/src/core/chat/engine/sessions/repository/types.js +2 -0
  179. package/dist/src/core/chat/engine/sessions/repository/types.js.map +1 -0
  180. package/dist/src/core/chat/engine/sessions/service.d.ts +3 -5
  181. package/dist/src/core/chat/engine/sessions/service.d.ts.map +1 -1
  182. package/dist/src/core/chat/engine/sessions/service.js +22 -26
  183. package/dist/src/core/chat/engine/sessions/service.js.map +1 -1
  184. package/dist/src/core/chat/engine/sessions/types.d.ts +6 -0
  185. package/dist/src/core/chat/engine/sessions/types.d.ts.map +1 -0
  186. package/dist/src/core/chat/engine/sessions/types.js +2 -0
  187. package/dist/src/core/chat/engine/sessions/types.js.map +1 -0
  188. package/dist/src/core/chat/engine/turns/context/index.d.ts +3 -0
  189. package/dist/src/core/chat/engine/turns/context/index.d.ts.map +1 -0
  190. package/dist/src/core/chat/engine/turns/context/index.js +2 -0
  191. package/dist/src/core/chat/engine/turns/context/index.js.map +1 -0
  192. package/dist/src/core/chat/engine/turns/context/turn-context-builder.d.ts +8 -0
  193. package/dist/src/core/chat/engine/turns/context/turn-context-builder.d.ts.map +1 -0
  194. package/dist/src/core/chat/engine/turns/context/turn-context-builder.js +36 -0
  195. package/dist/src/core/chat/engine/turns/context/turn-context-builder.js.map +1 -0
  196. package/dist/src/core/chat/engine/turns/context/types.d.ts +28 -0
  197. package/dist/src/core/chat/engine/turns/context/types.d.ts.map +1 -0
  198. package/dist/src/core/chat/engine/turns/context/types.js +2 -0
  199. package/dist/src/core/chat/engine/turns/context/types.js.map +1 -0
  200. package/dist/src/core/chat/engine/turns/failure/failure-message-formatter.d.ts +10 -0
  201. package/dist/src/core/chat/engine/turns/failure/failure-message-formatter.d.ts.map +1 -0
  202. package/dist/src/core/chat/engine/turns/failure/failure-message-formatter.js +29 -0
  203. package/dist/src/core/chat/engine/turns/failure/failure-message-formatter.js.map +1 -0
  204. package/dist/src/core/chat/engine/turns/failure/index.d.ts +3 -0
  205. package/dist/src/core/chat/engine/turns/failure/index.d.ts.map +1 -0
  206. package/dist/src/core/chat/engine/turns/failure/index.js +2 -0
  207. package/dist/src/core/chat/engine/turns/failure/index.js.map +1 -0
  208. package/dist/src/core/chat/engine/turns/failure/types.d.ts +5 -0
  209. package/dist/src/core/chat/engine/turns/failure/types.d.ts.map +1 -0
  210. package/dist/src/core/chat/engine/turns/failure/types.js +2 -0
  211. package/dist/src/core/chat/engine/turns/failure/types.js.map +1 -0
  212. package/dist/src/core/chat/engine/turns/host/host-normalizer.d.ts +9 -0
  213. package/dist/src/core/chat/engine/turns/host/host-normalizer.d.ts.map +1 -0
  214. package/dist/src/core/chat/engine/turns/host/host-normalizer.js +51 -0
  215. package/dist/src/core/chat/engine/turns/host/host-normalizer.js.map +1 -0
  216. package/dist/src/core/chat/engine/turns/host/index.d.ts +3 -0
  217. package/dist/src/core/chat/engine/turns/host/index.d.ts.map +1 -0
  218. package/dist/src/core/chat/engine/turns/host/index.js +2 -0
  219. package/dist/src/core/chat/engine/turns/host/index.js.map +1 -0
  220. package/dist/src/core/chat/engine/turns/host/types.d.ts +17 -0
  221. package/dist/src/core/chat/engine/turns/host/types.d.ts.map +1 -0
  222. package/dist/src/core/chat/engine/turns/host/types.js +2 -0
  223. package/dist/src/core/chat/engine/turns/host/types.js.map +1 -0
  224. package/dist/src/core/chat/engine/turns/memory/index.d.ts +3 -0
  225. package/dist/src/core/chat/engine/turns/memory/index.d.ts.map +1 -0
  226. package/dist/src/core/chat/engine/turns/memory/index.js +2 -0
  227. package/dist/src/core/chat/engine/turns/memory/index.js.map +1 -0
  228. package/dist/src/core/chat/engine/turns/memory/turn-memory-maintenance.d.ts +17 -0
  229. package/dist/src/core/chat/engine/turns/memory/turn-memory-maintenance.d.ts.map +1 -0
  230. package/dist/src/core/chat/engine/turns/memory/turn-memory-maintenance.js +126 -0
  231. package/dist/src/core/chat/engine/turns/memory/turn-memory-maintenance.js.map +1 -0
  232. package/dist/src/core/chat/engine/turns/memory/types.d.ts +29 -0
  233. package/dist/src/core/chat/engine/turns/memory/types.d.ts.map +1 -0
  234. package/dist/src/core/chat/engine/turns/memory/types.js +2 -0
  235. package/dist/src/core/chat/engine/turns/memory/types.js.map +1 -0
  236. package/dist/src/core/chat/engine/turns/persistence/index.d.ts +4 -0
  237. package/dist/src/core/chat/engine/turns/persistence/index.d.ts.map +1 -0
  238. package/dist/src/core/chat/engine/turns/persistence/index.js +3 -0
  239. package/dist/src/core/chat/engine/turns/persistence/index.js.map +1 -0
  240. package/dist/src/core/chat/engine/turns/persistence/turn-artifacts.d.ts +9 -0
  241. package/dist/src/core/chat/engine/turns/persistence/turn-artifacts.d.ts.map +1 -0
  242. package/dist/src/core/chat/engine/turns/persistence/turn-artifacts.js +60 -0
  243. package/dist/src/core/chat/engine/turns/persistence/turn-artifacts.js.map +1 -0
  244. package/dist/src/core/chat/engine/turns/persistence/turn-persistence-service.d.ts +10 -0
  245. package/dist/src/core/chat/engine/turns/persistence/turn-persistence-service.d.ts.map +1 -0
  246. package/dist/src/core/chat/engine/turns/persistence/turn-persistence-service.js +50 -0
  247. package/dist/src/core/chat/engine/turns/persistence/turn-persistence-service.js.map +1 -0
  248. package/dist/src/core/chat/engine/turns/persistence/types.d.ts +69 -0
  249. package/dist/src/core/chat/engine/turns/persistence/types.d.ts.map +1 -0
  250. package/dist/src/core/chat/engine/turns/persistence/types.js +2 -0
  251. package/dist/src/core/chat/engine/turns/persistence/types.js.map +1 -0
  252. package/dist/src/core/chat/engine/turns/preflight/index.d.ts +3 -0
  253. package/dist/src/core/chat/engine/turns/preflight/index.d.ts.map +1 -0
  254. package/dist/src/core/chat/engine/turns/preflight/index.js +2 -0
  255. package/dist/src/core/chat/engine/turns/preflight/index.js.map +1 -0
  256. package/dist/src/core/chat/engine/turns/preflight/turn-preflight-service.d.ts +14 -0
  257. package/dist/src/core/chat/engine/turns/preflight/turn-preflight-service.d.ts.map +1 -0
  258. package/dist/src/core/chat/engine/turns/preflight/turn-preflight-service.js +85 -0
  259. package/dist/src/core/chat/engine/turns/preflight/turn-preflight-service.js.map +1 -0
  260. package/dist/src/core/chat/engine/turns/preflight/types.d.ts +48 -0
  261. package/dist/src/core/chat/engine/turns/preflight/types.d.ts.map +1 -0
  262. package/dist/src/core/chat/engine/turns/preflight/types.js +2 -0
  263. package/dist/src/core/chat/engine/turns/preflight/types.js.map +1 -0
  264. package/dist/src/core/chat/engine/turns/runtime/index.d.ts +3 -0
  265. package/dist/src/core/chat/engine/turns/runtime/index.d.ts.map +1 -0
  266. package/dist/src/core/chat/engine/turns/runtime/index.js +2 -0
  267. package/dist/src/core/chat/engine/turns/runtime/index.js.map +1 -0
  268. package/dist/src/core/chat/engine/turns/runtime/runtime-resolver.d.ts +14 -0
  269. package/dist/src/core/chat/engine/turns/runtime/runtime-resolver.d.ts.map +1 -0
  270. package/dist/src/core/chat/engine/turns/runtime/runtime-resolver.js +69 -0
  271. package/dist/src/core/chat/engine/turns/runtime/runtime-resolver.js.map +1 -0
  272. package/dist/src/core/chat/engine/turns/runtime/types.d.ts +24 -0
  273. package/dist/src/core/chat/engine/turns/runtime/types.d.ts.map +1 -0
  274. package/dist/src/core/chat/engine/turns/runtime/types.js +2 -0
  275. package/dist/src/core/chat/engine/turns/runtime/types.js.map +1 -0
  276. package/dist/src/core/chat/engine/turns/service.d.ts +8 -2
  277. package/dist/src/core/chat/engine/turns/service.d.ts.map +1 -1
  278. package/dist/src/core/chat/engine/turns/service.js +139 -25
  279. package/dist/src/core/chat/engine/turns/service.js.map +1 -1
  280. package/dist/src/core/chat/engine/turns/trace/index.d.ts +3 -0
  281. package/dist/src/core/chat/engine/turns/trace/index.d.ts.map +1 -0
  282. package/dist/src/core/chat/engine/turns/trace/index.js +2 -0
  283. package/dist/src/core/chat/engine/turns/trace/index.js.map +1 -0
  284. package/dist/src/core/chat/engine/turns/trace/trace-writer.d.ts +8 -0
  285. package/dist/src/core/chat/engine/turns/trace/trace-writer.d.ts.map +1 -0
  286. package/dist/src/core/chat/engine/turns/trace/trace-writer.js +14 -0
  287. package/dist/src/core/chat/engine/turns/trace/trace-writer.js.map +1 -0
  288. package/dist/src/core/chat/engine/turns/trace/types.d.ts +6 -0
  289. package/dist/src/core/chat/engine/turns/trace/types.d.ts.map +1 -0
  290. package/dist/src/core/chat/engine/turns/trace/types.js +2 -0
  291. package/dist/src/core/chat/engine/turns/trace/types.js.map +1 -0
  292. package/dist/src/core/chat/engine/turns/types.d.ts +44 -0
  293. package/dist/src/core/chat/engine/turns/types.d.ts.map +1 -0
  294. package/dist/src/core/chat/engine/turns/types.js +2 -0
  295. package/dist/src/core/chat/engine/turns/types.js.map +1 -0
  296. package/dist/src/core/chat/engine/types.d.ts +10 -15
  297. package/dist/src/core/chat/engine/types.d.ts.map +1 -1
  298. package/dist/src/core/chat/types.d.ts +18 -14
  299. package/dist/src/core/chat/types.d.ts.map +1 -1
  300. package/dist/src/index.d.ts +2 -2
  301. package/dist/src/index.d.ts.map +1 -1
  302. package/dist/src/index.js +1 -1
  303. package/dist/src/index.js.map +1 -1
  304. package/dist/src/server/features/control-plane/controllers/chat-session-presenter.d.ts.map +1 -1
  305. package/dist/src/server/features/control-plane/controllers/chat-session-presenter.js +38 -12
  306. package/dist/src/server/features/control-plane/controllers/chat-session-presenter.js.map +1 -1
  307. package/dist/src/server/features/control-plane/controllers/chat-sessions-controller.d.ts +2 -2
  308. package/dist/src/server/features/control-plane/controllers/chat-sessions-controller.d.ts.map +1 -1
  309. package/dist/src/server/features/control-plane/controllers/chat-sessions-controller.js +19 -18
  310. package/dist/src/server/features/control-plane/controllers/chat-sessions-controller.js.map +1 -1
  311. package/dist/src/server/features/control-plane/types.d.ts +23 -11
  312. package/dist/src/server/features/control-plane/types.d.ts.map +1 -1
  313. package/dist/src/web/assets/{MonacoDiffViewer-D0Ed6GCN.js → MonacoDiffViewer-F3AOHIps.js} +1 -1
  314. package/dist/src/web/assets/{index-B_9nk8kS.js → index-D6aK1OFb.js} +2 -2
  315. package/dist/src/web/index.html +1 -1
  316. package/package.json +7 -7
  317. package/dist/src/cli/session.d.ts +0 -11
  318. package/dist/src/cli/session.d.ts.map +0 -1
  319. package/dist/src/cli/session.js +0 -30
  320. package/dist/src/cli/session.js.map +0 -1
  321. package/dist/src/core/chat/engine/history/compaction.d.ts +0 -56
  322. package/dist/src/core/chat/engine/history/compaction.d.ts.map +0 -1
  323. package/dist/src/core/chat/engine/history/compaction.js +0 -546
  324. package/dist/src/core/chat/engine/history/compaction.js.map +0 -1
  325. package/dist/src/core/chat/engine/sessions/archive.d.ts +0 -19
  326. package/dist/src/core/chat/engine/sessions/archive.d.ts.map +0 -1
  327. package/dist/src/core/chat/engine/sessions/archive.js +0 -129
  328. package/dist/src/core/chat/engine/sessions/archive.js.map +0 -1
  329. package/dist/src/core/chat/engine/sessions/conversation-lines.d.ts +0 -4
  330. package/dist/src/core/chat/engine/sessions/conversation-lines.d.ts.map +0 -1
  331. package/dist/src/core/chat/engine/sessions/conversation-lines.js +0 -26
  332. package/dist/src/core/chat/engine/sessions/conversation-lines.js.map +0 -1
  333. package/dist/src/core/chat/engine/sessions/lease.d.ts +0 -23
  334. package/dist/src/core/chat/engine/sessions/lease.d.ts.map +0 -1
  335. package/dist/src/core/chat/engine/sessions/lease.js +0 -72
  336. package/dist/src/core/chat/engine/sessions/lease.js.map +0 -1
  337. package/dist/src/core/chat/engine/sessions/session-record.d.ts +0 -16
  338. package/dist/src/core/chat/engine/sessions/session-record.d.ts.map +0 -1
  339. package/dist/src/core/chat/engine/sessions/session-record.js +0 -60
  340. package/dist/src/core/chat/engine/sessions/session-record.js.map +0 -1
  341. package/dist/src/core/chat/engine/sessions/title.d.ts +0 -15
  342. package/dist/src/core/chat/engine/sessions/title.d.ts.map +0 -1
  343. package/dist/src/core/chat/engine/sessions/title.js +0 -17
  344. package/dist/src/core/chat/engine/sessions/title.js.map +0 -1
  345. package/dist/src/core/chat/engine/turns/context.d.ts +0 -27
  346. package/dist/src/core/chat/engine/turns/context.d.ts.map +0 -1
  347. package/dist/src/core/chat/engine/turns/context.js +0 -42
  348. package/dist/src/core/chat/engine/turns/context.js.map +0 -1
  349. package/dist/src/core/chat/engine/turns/host-bridge.d.ts +0 -37
  350. package/dist/src/core/chat/engine/turns/host-bridge.d.ts.map +0 -1
  351. package/dist/src/core/chat/engine/turns/host-bridge.js +0 -20
  352. package/dist/src/core/chat/engine/turns/host-bridge.js.map +0 -1
  353. package/dist/src/core/chat/engine/turns/host.d.ts +0 -3
  354. package/dist/src/core/chat/engine/turns/host.d.ts.map +0 -1
  355. package/dist/src/core/chat/engine/turns/host.js +0 -42
  356. package/dist/src/core/chat/engine/turns/host.js.map +0 -1
  357. package/dist/src/core/chat/engine/turns/memory-maintenance.d.ts +0 -33
  358. package/dist/src/core/chat/engine/turns/memory-maintenance.d.ts.map +0 -1
  359. package/dist/src/core/chat/engine/turns/memory-maintenance.js +0 -121
  360. package/dist/src/core/chat/engine/turns/memory-maintenance.js.map +0 -1
  361. package/dist/src/core/chat/engine/turns/persistence.d.ts +0 -25
  362. package/dist/src/core/chat/engine/turns/persistence.d.ts.map +0 -1
  363. package/dist/src/core/chat/engine/turns/persistence.js +0 -46
  364. package/dist/src/core/chat/engine/turns/persistence.js.map +0 -1
  365. package/dist/src/core/chat/engine/turns/preflight.d.ts +0 -56
  366. package/dist/src/core/chat/engine/turns/preflight.d.ts.map +0 -1
  367. package/dist/src/core/chat/engine/turns/preflight.js +0 -97
  368. package/dist/src/core/chat/engine/turns/preflight.js.map +0 -1
  369. package/dist/src/core/chat/engine/turns/result.d.ts +0 -38
  370. package/dist/src/core/chat/engine/turns/result.d.ts.map +0 -1
  371. package/dist/src/core/chat/engine/turns/result.js +0 -62
  372. package/dist/src/core/chat/engine/turns/result.js.map +0 -1
  373. package/dist/src/core/chat/engine/turns/run-conversation-turn.d.ts +0 -47
  374. package/dist/src/core/chat/engine/turns/run-conversation-turn.d.ts.map +0 -1
  375. package/dist/src/core/chat/engine/turns/run-conversation-turn.js +0 -136
  376. package/dist/src/core/chat/engine/turns/run-conversation-turn.js.map +0 -1
  377. package/dist/src/core/chat/engine/turns/runtime.d.ts +0 -28
  378. package/dist/src/core/chat/engine/turns/runtime.d.ts.map +0 -1
  379. package/dist/src/core/chat/engine/turns/runtime.js +0 -62
  380. package/dist/src/core/chat/engine/turns/runtime.js.map +0 -1
  381. package/dist/src/core/chat/engine/turns/trace.d.ts +0 -3
  382. package/dist/src/core/chat/engine/turns/trace.d.ts.map +0 -1
  383. package/dist/src/core/chat/engine/turns/trace.js +0 -9
  384. package/dist/src/core/chat/engine/turns/trace.js.map +0 -1
  385. package/dist/src/core/chat/failure-messages.d.ts +0 -6
  386. package/dist/src/core/chat/failure-messages.d.ts.map +0 -1
  387. package/dist/src/core/chat/failure-messages.js +0 -24
  388. package/dist/src/core/chat/failure-messages.js.map +0 -1
@@ -1,476 +1,205 @@
1
1
  /**
2
2
  * File-backed chat session repository.
3
3
  *
4
- * Owns file paths, migration, serialization, deserialization, and orphan-file
5
- * cleanup for chat sessions. Session services should depend on this module
6
- * rather than embedding file I/O logic themselves.
4
+ * Owns file paths, serialization, deserialization, and orphan-file cleanup for
5
+ * chat sessions. Session services should depend on this class rather than
6
+ * embedding file I/O logic themselves.
7
7
  *
8
8
  * Current compromise:
9
- * some older host or test paths may still import repository functions directly.
9
+ * some older host or test paths still instantiate this repository directly.
10
10
  * The intended direction is host -> service -> repository -> files.
11
11
  */
12
12
  import { existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
13
13
  import { basename, dirname, join } from 'node:path';
14
- import { createChatSession, createInitialMessages } from '../session-record.js';
15
- export function createFileChatSessionRepository(args) {
16
- const { sessionStoragePath } = args;
17
- return {
18
- list(apiKeyPresent) {
19
- return loadChatSessions(sessionStoragePath, apiKeyPresent);
20
- },
21
- readCatalog() {
22
- return readChatSessionCatalog(sessionStoragePath);
23
- },
24
- read(sessionId, apiKeyPresent) {
25
- return readChatSession(sessionStoragePath, sessionId, apiKeyPresent);
26
- },
27
- migrateLegacy(apiKeyPresent) {
28
- return migrateLegacyChatSessions(sessionStoragePath, apiKeyPresent);
29
- },
30
- save(sessions) {
31
- saveChatSessions(sessionStoragePath, sessions);
32
- },
33
- deriveStoragePaths() {
34
- return deriveSessionStoragePaths(sessionStoragePath);
35
- },
36
- };
37
- }
38
- export function loadChatSessions(sessionsPath, apiKeyPresent) {
39
- const resolved = loadChatSessionsFromCurrentStorage(sessionsPath, apiKeyPresent);
40
- if (resolved.length > 0) {
41
- return resolved;
42
- }
43
- const migrated = migrateLegacyChatSessions(sessionsPath, apiKeyPresent);
44
- if (migrated.length > 0) {
45
- return migrated;
46
- }
47
- return [
48
- createChatSession({
49
- id: 'session-1',
50
- name: 'Session 1',
51
- apiKeyPresent,
52
- }),
53
- ];
54
- }
55
- export function readChatSessionCatalog(sessionsPath) {
56
- const paths = deriveSessionStoragePaths(sessionsPath);
57
- const catalog = readCatalog(paths.catalogPath);
58
- return catalog?.sessions.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt)) ?? [];
59
- }
60
- export function readChatSession(sessionsPath, sessionId, apiKeyPresent) {
61
- const paths = deriveSessionStoragePaths(sessionsPath);
62
- const catalog = readCatalog(paths.catalogPath);
63
- const entry = catalog?.sessions.find((candidate) => candidate.id === sessionId);
64
- if (!entry) {
65
- return undefined;
66
- }
67
- return readSessionFile(paths.sessionsDir, entry, apiKeyPresent)[0];
68
- }
69
- export function migrateLegacyChatSessions(sessionsPath, apiKeyPresent) {
70
- const legacySessions = loadLegacyChatSessions(sessionsPath, apiKeyPresent);
71
- if (legacySessions.length === 0) {
72
- return [];
73
- }
74
- saveChatSessions(sessionsPath, legacySessions);
75
- return legacySessions.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
76
- }
77
- export function saveChatSessions(sessionsPath, sessions) {
78
- mkdirSync(dirname(sessionsPath), { recursive: true });
79
- const paths = deriveSessionStoragePaths(sessionsPath);
80
- mkdirSync(paths.sessionsDir, { recursive: true });
81
- const sorted = dedupeSessionsById(sessions).sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
82
- const previousCatalog = readCatalog(paths.catalogPath);
83
- const previousSessionBodies = new Map();
84
- for (const entry of previousCatalog?.sessions ?? []) {
85
- const body = readSessionFileContents(paths.sessionsDir, entry.id);
86
- if (body !== undefined) {
87
- previousSessionBodies.set(entry.id, body);
14
+ import { ChatSessionRecords } from '../records/index.js';
15
+ import { ChatSessionCodec } from './chat-session-codec.js';
16
+ export class FileChatSessionRepository {
17
+ sessionStoragePath;
18
+ storagePaths;
19
+ constructor(args) {
20
+ this.sessionStoragePath = args.sessionStoragePath;
21
+ this.storagePaths = FileChatSessionRepository.deriveStoragePaths(args.sessionStoragePath);
22
+ }
23
+ list(apiKeyPresent) {
24
+ const resolved = this.loadFromCurrentStorage(apiKeyPresent);
25
+ if (resolved.length > 0) {
26
+ return resolved;
88
27
  }
28
+ return [
29
+ ChatSessionRecords.create({
30
+ id: 'session-1',
31
+ name: 'Session 1',
32
+ apiKeyPresent,
33
+ }),
34
+ ];
35
+ }
36
+ readCatalog() {
37
+ const catalog = FileChatSessionRepository.readCatalogFile(this.deriveStoragePaths().catalogPath);
38
+ return catalog?.sessions.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt)) ?? [];
39
+ }
40
+ read(sessionId, apiKeyPresent) {
41
+ const paths = this.deriveStoragePaths();
42
+ const catalog = FileChatSessionRepository.readCatalogFile(paths.catalogPath);
43
+ const entry = catalog?.sessions.find((candidate) => candidate.id === sessionId);
44
+ if (!entry) {
45
+ return undefined;
46
+ }
47
+ return FileChatSessionRepository.readSessionFile(paths.sessionsDir, entry, apiKeyPresent)[0];
89
48
  }
90
- for (const session of sorted) {
91
- writeSessionFileIfChanged(paths.sessionsDir, session, previousSessionBodies.get(session.id));
92
- }
93
- const catalog = {
94
- version: 1,
95
- sessions: sorted.map((session) => projectCatalogEntry(session)),
96
- };
97
- writeCatalogIfChanged(paths.catalogPath, catalog, previousCatalog);
98
- removeOrphanedSessionFiles(paths.sessionsDir, catalog.sessions.map((session) => session.id));
99
- }
100
- export function deriveSessionStoragePaths(storagePath) {
101
- const stateDir = dirname(storagePath);
102
- const fileName = basename(storagePath);
103
- const catalogSuffix = '.catalog.json';
104
- const legacySuffix = '.json';
105
- if (fileName.endsWith(catalogSuffix)) {
106
- const catalogStem = fileName.slice(0, -catalogSuffix.length);
107
- return {
108
- // Current layout: preserve the configured catalog path exactly.
109
- catalogPath: storagePath,
110
- // Legacy fallback: older callers may still look for a flat JSON file.
111
- legacyPath: join(stateDir, `${catalogStem}${legacySuffix}`),
112
- sessionsDir: join(stateDir, catalogStem),
49
+ save(sessions) {
50
+ mkdirSync(dirname(this.sessionStoragePath), { recursive: true });
51
+ const paths = this.deriveStoragePaths();
52
+ mkdirSync(paths.sessionsDir, { recursive: true });
53
+ const sorted = FileChatSessionRepository.dedupeSessionsById(sessions)
54
+ .sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
55
+ const previousCatalog = FileChatSessionRepository.readCatalogFile(paths.catalogPath);
56
+ const previousSessionBodies = new Map();
57
+ for (const entry of previousCatalog?.sessions ?? []) {
58
+ const body = FileChatSessionRepository.readSessionFileContents(paths.sessionsDir, entry.id);
59
+ if (body !== undefined) {
60
+ previousSessionBodies.set(entry.id, body);
61
+ }
62
+ }
63
+ for (const session of sorted) {
64
+ FileChatSessionRepository.writeSessionFileIfChanged(paths.sessionsDir, session, previousSessionBodies.get(session.id));
65
+ }
66
+ const catalog = {
67
+ version: 1,
68
+ sessions: sorted.map((session) => ChatSessionCodec.projectCatalogEntry(session)),
113
69
  };
114
- }
115
- if (fileName.endsWith(legacySuffix)) {
116
- const catalogStem = fileName.slice(0, -legacySuffix.length);
70
+ FileChatSessionRepository.writeCatalogIfChanged(paths.catalogPath, catalog, previousCatalog);
71
+ FileChatSessionRepository.removeOrphanedSessionFiles(paths.sessionsDir, catalog.sessions.map((session) => session.id));
72
+ }
73
+ deriveStoragePaths() {
74
+ return this.storagePaths;
75
+ }
76
+ static deriveStoragePaths(storagePath) {
77
+ const stateDir = dirname(storagePath);
78
+ const fileName = basename(storagePath);
79
+ const catalogSuffix = '.catalog.json';
80
+ if (fileName.endsWith(catalogSuffix)) {
81
+ const catalogStem = fileName.slice(0, -catalogSuffix.length);
82
+ return {
83
+ // Current layout: preserve the configured catalog path exactly.
84
+ catalogPath: storagePath,
85
+ sessionsDir: join(stateDir, catalogStem),
86
+ };
87
+ }
117
88
  return {
118
- // Current layout: upgrade legacy flat JSON paths to sibling catalog files.
119
- catalogPath: join(stateDir, `${catalogStem}${catalogSuffix}`),
120
- // Legacy fallback: keep reading and migrating from the original flat JSON path.
121
- legacyPath: storagePath,
122
- sessionsDir: join(stateDir, catalogStem),
89
+ // Non-standard inputs are explicit catalog paths. Preserve them without
90
+ // scanning sibling files or trying to upgrade older layouts.
91
+ catalogPath: storagePath,
92
+ sessionsDir: join(stateDir, fileName),
123
93
  };
124
94
  }
125
- return {
126
- // Non-JSON inputs are already explicit. Preserve them without inventing
127
- // extra fallback paths.
128
- catalogPath: storagePath,
129
- legacyPath: storagePath,
130
- sessionsDir: join(stateDir, fileName),
131
- };
132
- }
133
- function loadChatSessionsFromCurrentStorage(sessionsPath, apiKeyPresent) {
134
- const paths = deriveSessionStoragePaths(sessionsPath);
135
- return loadSessionsFromCatalog(paths, apiKeyPresent);
136
- }
137
- function loadSessionsFromCatalog(paths, apiKeyPresent) {
138
- if (!existsSync(paths.catalogPath)) {
139
- return [];
95
+ loadFromCurrentStorage(apiKeyPresent) {
96
+ return this.loadSessionsFromCatalog(this.deriveStoragePaths(), apiKeyPresent);
140
97
  }
141
- try {
142
- const raw = JSON.parse(readFileSync(paths.catalogPath, 'utf8'));
143
- const catalog = parseCatalog(raw);
144
- if (!catalog) {
98
+ loadSessionsFromCatalog(paths, apiKeyPresent) {
99
+ if (!existsSync(paths.catalogPath)) {
100
+ return [];
101
+ }
102
+ try {
103
+ const raw = JSON.parse(readFileSync(paths.catalogPath, 'utf8'));
104
+ const catalog = ChatSessionCodec.parseCatalog(raw);
105
+ if (!catalog) {
106
+ return [];
107
+ }
108
+ const sessions = catalog.sessions.flatMap((entry) => FileChatSessionRepository.readSessionFile(paths.sessionsDir, entry, apiKeyPresent));
109
+ return sessions.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
110
+ }
111
+ catch (error) {
112
+ process.stderr.write(`Failed to load chat session catalog from ${paths.catalogPath}: ${error instanceof Error ? error.message : String(error)}\n`);
145
113
  return [];
146
114
  }
147
- const sessions = catalog.sessions.flatMap((entry) => readSessionFile(paths.sessionsDir, entry, apiKeyPresent));
148
- return sessions.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
149
- }
150
- catch (error) {
151
- process.stderr.write(`Failed to load chat session catalog from ${paths.catalogPath}: ${error instanceof Error ? error.message : String(error)}\n`);
152
- return [];
153
115
  }
154
- }
155
- function loadLegacyChatSessions(sessionsPath, apiKeyPresent) {
156
- try {
157
- if (!existsSync(sessionsPath)) {
116
+ static readSessionFile(sessionsDir, entry, apiKeyPresent) {
117
+ const path = FileChatSessionRepository.sessionFilePath(sessionsDir, entry.id);
118
+ if (!existsSync(path)) {
158
119
  return [];
159
120
  }
160
- const raw = readFileSync(sessionsPath, 'utf8');
161
- const parsed = JSON.parse(raw);
162
- if (!Array.isArray(parsed)) {
163
- throw new Error('Expected session array');
121
+ try {
122
+ const parsed = JSON.parse(readFileSync(path, 'utf8'));
123
+ return ChatSessionCodec.parseSessionBody(parsed, { entry, apiKeyPresent });
164
124
  }
165
- return parsed
166
- .flatMap((value) => parseSavedSession(value, apiKeyPresent))
167
- .sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
168
- }
169
- catch (error) {
170
- process.stderr.write(`Failed to load chat sessions from ${sessionsPath}: ${error instanceof Error ? error.message : String(error)}\n`);
171
- return [];
172
- }
173
- }
174
- function parseCatalog(value) {
175
- if (!value || typeof value !== 'object' || Array.isArray(value)) {
176
- return undefined;
177
- }
178
- const candidate = value;
179
- if (candidate.version !== 1 || !Array.isArray(candidate.sessions)) {
180
- return undefined;
181
- }
182
- const sessions = candidate.sessions.flatMap(parseCatalogEntry);
183
- return { version: 1, sessions };
184
- }
185
- function parseCatalogEntry(value) {
186
- if (!value || typeof value !== 'object' || Array.isArray(value)) {
187
- return [];
188
- }
189
- const candidate = value;
190
- if (typeof candidate.id !== 'string' || typeof candidate.name !== 'string') {
191
- return [];
192
- }
193
- const createdAt = typeof candidate.createdAt === 'string' ? candidate.createdAt : new Date().toISOString();
194
- const updatedAt = typeof candidate.updatedAt === 'string' ? candidate.updatedAt : createdAt;
195
- return [{
196
- id: candidate.id,
197
- name: candidate.name,
198
- retention: parseRetention(candidate.retention),
199
- workspaceId: typeof candidate.workspaceId === 'string' ? candidate.workspaceId : undefined,
200
- createdAt,
201
- updatedAt,
202
- model: typeof candidate.model === 'string' ? candidate.model : undefined,
203
- reasoningEffort: candidate.reasoningEffort === 'low' || candidate.reasoningEffort === 'medium' || candidate.reasoningEffort === 'high' || candidate.reasoningEffort === 'ultrahigh' ?
204
- candidate.reasoningEffort
205
- : undefined,
206
- driftEnabled: typeof candidate.driftEnabled === 'boolean' ? candidate.driftEnabled : false,
207
- lastContinuePrompt: typeof candidate.lastContinuePrompt === 'string' ? candidate.lastContinuePrompt : undefined,
208
- context: isChatContextStats(candidate.context) ? candidate.context : undefined,
209
- archives: Array.isArray(candidate.archives) ? candidate.archives.flatMap(parseArchiveRecord) : undefined,
210
- lease: parseLease(candidate.lease),
211
- }];
212
- }
213
- function projectCatalogEntry(session) {
214
- return {
215
- id: session.id,
216
- name: session.name,
217
- retention: session.retention,
218
- workspaceId: session.workspaceId,
219
- createdAt: session.createdAt,
220
- updatedAt: session.updatedAt,
221
- model: session.model,
222
- reasoningEffort: session.reasoningEffort,
223
- driftEnabled: session.driftEnabled,
224
- lastContinuePrompt: session.lastContinuePrompt,
225
- context: session.context,
226
- archives: session.archives,
227
- lease: session.lease,
228
- };
229
- }
230
- function readSessionFile(sessionsDir, entry, apiKeyPresent) {
231
- const path = sessionFilePath(sessionsDir, entry.id);
232
- if (!existsSync(path)) {
233
- return [];
234
- }
235
- try {
236
- const parsed = JSON.parse(readFileSync(path, 'utf8'));
237
- const payload = readObjectRecord(parsed);
238
- if (!payload) {
125
+ catch (error) {
126
+ process.stderr.write(`Failed to load chat session file ${path}: ${error instanceof Error ? error.message : String(error)}\n`);
239
127
  return [];
240
128
  }
241
- return [{
242
- id: entry.id,
243
- name: entry.name,
244
- retention: entry.retention,
245
- workspaceId: entry.workspaceId,
246
- createdAt: entry.createdAt,
247
- updatedAt: entry.updatedAt,
248
- model: entry.model,
249
- reasoningEffort: entry.reasoningEffort,
250
- driftEnabled: entry.driftEnabled,
251
- lastContinuePrompt: entry.lastContinuePrompt,
252
- context: entry.context,
253
- archives: entry.archives,
254
- lease: entry.lease,
255
- history: Array.isArray(payload.history) ? payload.history : [],
256
- messages: Array.isArray(payload.messages) && payload.messages.length > 0 ?
257
- payload.messages.filter(isConversationLine)
258
- : createInitialMessages(apiKeyPresent),
259
- turns: Array.isArray(payload.turns) ? payload.turns.filter(isTurnSummary) : [],
260
- }];
261
- }
262
- catch (error) {
263
- process.stderr.write(`Failed to load chat session file ${path}: ${error instanceof Error ? error.message : String(error)}\n`);
264
- return [];
265
- }
266
- }
267
- function writeSessionFileIfChanged(sessionsDir, session, previousContent) {
268
- const path = sessionFilePath(sessionsDir, session.id);
269
- const nextContent = serializeSessionBody(session);
270
- if (previousContent === nextContent) {
271
- return;
272
129
  }
273
- writeFileSync(path, nextContent);
274
- }
275
- function writeCatalogIfChanged(catalogPath, catalog, previousCatalog) {
276
- const nextContent = `${JSON.stringify(catalog, null, 2)}\n`;
277
- const previousContent = previousCatalog ? `${JSON.stringify(previousCatalog, null, 2)}\n` : undefined;
278
- if (previousContent === nextContent) {
279
- return;
280
- }
281
- writeFileSync(catalogPath, nextContent);
282
- }
283
- function serializeSessionBody(session) {
284
- return `${JSON.stringify({
285
- id: session.id,
286
- retention: session.retention,
287
- workspaceId: session.workspaceId,
288
- history: session.history,
289
- messages: session.messages,
290
- turns: session.turns,
291
- archives: session.archives,
292
- lease: session.lease,
293
- }, null, 2)}\n`;
294
- }
295
- function readSessionFileContents(sessionsDir, sessionId) {
296
- const path = sessionFilePath(sessionsDir, sessionId);
297
- if (!existsSync(path)) {
298
- return undefined;
299
- }
300
- try {
301
- return readFileSync(path, 'utf8');
302
- }
303
- catch {
304
- return undefined;
305
- }
306
- }
307
- function readCatalog(catalogPath) {
308
- if (!existsSync(catalogPath)) {
309
- return undefined;
310
- }
311
- try {
312
- return parseCatalog(JSON.parse(readFileSync(catalogPath, 'utf8')));
313
- }
314
- catch {
315
- return undefined;
316
- }
317
- }
318
- function dedupeSessionsById(sessions) {
319
- const seen = new Set();
320
- const deduped = [];
321
- for (const session of sessions) {
322
- if (seen.has(session.id)) {
323
- continue;
130
+ static writeSessionFileIfChanged(sessionsDir, session, previousContent) {
131
+ const path = FileChatSessionRepository.sessionFilePath(sessionsDir, session.id);
132
+ const nextContent = ChatSessionCodec.serializeSessionBody(session);
133
+ if (previousContent === nextContent) {
134
+ return;
324
135
  }
325
- seen.add(session.id);
326
- deduped.push(session);
136
+ writeFileSync(path, nextContent);
327
137
  }
328
- return deduped;
329
- }
330
- function sessionFilePath(sessionsDir, sessionId) {
331
- return join(sessionsDir, `${sessionId}.json`);
332
- }
333
- function removeOrphanedSessionFiles(sessionsDir, activeSessionIds) {
334
- if (!existsSync(sessionsDir)) {
335
- return;
336
- }
337
- const allowed = new Set(activeSessionIds.map((id) => `${id}.json`));
338
- for (const name of safeReadDirFiles(sessionsDir)) {
339
- if (allowed.has(name) || !name.endsWith('.json')) {
340
- continue;
138
+ static writeCatalogIfChanged(catalogPath, catalog, previousCatalog) {
139
+ const nextContent = ChatSessionCodec.serializeCatalog(catalog);
140
+ const previousContent = previousCatalog ? ChatSessionCodec.serializeCatalog(previousCatalog) : undefined;
141
+ if (previousContent === nextContent) {
142
+ return;
341
143
  }
342
- unlinkSync(join(sessionsDir, name));
343
- }
344
- }
345
- function safeReadDirFiles(path) {
346
- try {
347
- return readdirSync(path);
348
- }
349
- catch {
350
- return [];
351
- }
352
- }
353
- function parseSavedSession(value, apiKeyPresent) {
354
- if (!value || typeof value !== 'object' || Array.isArray(value)) {
355
- return [];
356
- }
357
- const candidate = value;
358
- if (typeof candidate.id !== 'string' || typeof candidate.name !== 'string') {
359
- return [];
144
+ writeFileSync(catalogPath, nextContent);
360
145
  }
361
- const createdAt = typeof candidate.createdAt === 'string' ? candidate.createdAt : new Date().toISOString();
362
- const updatedAt = typeof candidate.updatedAt === 'string' ? candidate.updatedAt : createdAt;
363
- return [{
364
- id: candidate.id,
365
- name: candidate.name,
366
- retention: parseRetention(candidate.retention),
367
- workspaceId: typeof candidate.workspaceId === 'string' ? candidate.workspaceId : undefined,
368
- history: Array.isArray(candidate.history) ? candidate.history : [],
369
- messages: Array.isArray(candidate.messages) && candidate.messages.length > 0 ?
370
- candidate.messages.filter(isConversationLine)
371
- : createInitialMessages(apiKeyPresent),
372
- turns: Array.isArray(candidate.turns) ? candidate.turns.filter(isTurnSummary) : [],
373
- createdAt,
374
- updatedAt,
375
- model: typeof candidate.model === 'string' ? candidate.model : undefined,
376
- reasoningEffort: candidate.reasoningEffort === 'low' || candidate.reasoningEffort === 'medium' || candidate.reasoningEffort === 'high' || candidate.reasoningEffort === 'ultrahigh' ?
377
- candidate.reasoningEffort
378
- : undefined,
379
- driftEnabled: typeof candidate.driftEnabled === 'boolean' ? candidate.driftEnabled : false,
380
- lastContinuePrompt: typeof candidate.lastContinuePrompt === 'string' ? candidate.lastContinuePrompt : undefined,
381
- context: isChatContextStats(candidate.context) ? candidate.context : undefined,
382
- archives: Array.isArray(candidate.archives) ? candidate.archives.flatMap(parseArchiveRecord) : undefined,
383
- lease: parseLease(candidate.lease),
384
- }];
385
- }
386
- function parseRetention(value) {
387
- return value === 'reusable' || value === 'one_off' ? value : undefined;
388
- }
389
- function parseLease(value) {
390
- if (!value || typeof value !== 'object' || Array.isArray(value)) {
391
- return undefined;
392
- }
393
- const candidate = value;
394
- if ((candidate.ownerKind !== 'tui' && candidate.ownerKind !== 'daemon' && candidate.ownerKind !== 'ask') ||
395
- typeof candidate.ownerId !== 'string' ||
396
- typeof candidate.acquiredAt !== 'string' ||
397
- typeof candidate.lastSeenAt !== 'string') {
398
- return undefined;
146
+ static readSessionFileContents(sessionsDir, sessionId) {
147
+ const path = FileChatSessionRepository.sessionFilePath(sessionsDir, sessionId);
148
+ if (!existsSync(path)) {
149
+ return undefined;
150
+ }
151
+ try {
152
+ return readFileSync(path, 'utf8');
153
+ }
154
+ catch {
155
+ return undefined;
156
+ }
399
157
  }
400
- return {
401
- ownerKind: candidate.ownerKind,
402
- ownerId: candidate.ownerId,
403
- acquiredAt: candidate.acquiredAt,
404
- lastSeenAt: candidate.lastSeenAt,
405
- clientLabel: typeof candidate.clientLabel === 'string' ? candidate.clientLabel : undefined,
406
- };
407
- }
408
- function isConversationLine(value) {
409
- if (!value || typeof value !== 'object' || Array.isArray(value)) {
410
- return false;
158
+ static readCatalogFile(catalogPath) {
159
+ if (!existsSync(catalogPath)) {
160
+ return undefined;
161
+ }
162
+ try {
163
+ return ChatSessionCodec.parseCatalog(JSON.parse(readFileSync(catalogPath, 'utf8')));
164
+ }
165
+ catch {
166
+ return undefined;
167
+ }
411
168
  }
412
- const candidate = value;
413
- return (typeof candidate.id === 'string' &&
414
- (candidate.role === 'user' || candidate.role === 'assistant') &&
415
- typeof candidate.text === 'string');
416
- }
417
- function isTurnSummary(value) {
418
- if (!value || typeof value !== 'object' || Array.isArray(value)) {
419
- return false;
169
+ static dedupeSessionsById(sessions) {
170
+ const seen = new Set();
171
+ const deduped = [];
172
+ for (const session of sessions) {
173
+ if (seen.has(session.id)) {
174
+ continue;
175
+ }
176
+ seen.add(session.id);
177
+ deduped.push(session);
178
+ }
179
+ return deduped;
420
180
  }
421
- const candidate = value;
422
- return (typeof candidate.id === 'string' &&
423
- typeof candidate.prompt === 'string' &&
424
- typeof candidate.outcome === 'string' &&
425
- typeof candidate.summary === 'string' &&
426
- typeof candidate.steps === 'number' &&
427
- typeof candidate.traceFile === 'string' &&
428
- Array.isArray(candidate.events) &&
429
- candidate.events.every((event) => typeof event === 'string'));
430
- }
431
- function isChatContextStats(value) {
432
- if (!value || typeof value !== 'object' || Array.isArray(value)) {
433
- return false;
181
+ static sessionFilePath(sessionsDir, sessionId) {
182
+ return join(sessionsDir, `${sessionId}.json`);
434
183
  }
435
- const candidate = value;
436
- return (typeof candidate.estimatedHistoryTokens === 'number' &&
437
- (candidate.estimatedRequestTokens === undefined || typeof candidate.estimatedRequestTokens === 'number') &&
438
- (candidate.lastRunInputTokens === undefined || typeof candidate.lastRunInputTokens === 'number') &&
439
- (candidate.lastRunOutputTokens === undefined || typeof candidate.lastRunOutputTokens === 'number') &&
440
- (candidate.lastRunTotalTokens === undefined || typeof candidate.lastRunTotalTokens === 'number') &&
441
- (candidate.cachedInputTokens === undefined || typeof candidate.cachedInputTokens === 'number') &&
442
- (candidate.reasoningTokens === undefined || typeof candidate.reasoningTokens === 'number') &&
443
- (candidate.compactedMessages === undefined || typeof candidate.compactedMessages === 'number') &&
444
- (candidate.compactedAt === undefined || typeof candidate.compactedAt === 'string') &&
445
- (candidate.compactionStatus === undefined || candidate.compactionStatus === 'idle' || candidate.compactionStatus === 'running' || candidate.compactionStatus === 'failed') &&
446
- (candidate.compactionError === undefined || typeof candidate.compactionError === 'string') &&
447
- (candidate.archiveCount === undefined || typeof candidate.archiveCount === 'number') &&
448
- (candidate.currentSummaryPath === undefined || typeof candidate.currentSummaryPath === 'string') &&
449
- (candidate.lastArchivePath === undefined || typeof candidate.lastArchivePath === 'string'));
450
- }
451
- function parseArchiveRecord(value) {
452
- if (!value || typeof value !== 'object' || Array.isArray(value)) {
453
- return [];
184
+ static removeOrphanedSessionFiles(sessionsDir, activeSessionIds) {
185
+ if (!existsSync(sessionsDir)) {
186
+ return;
187
+ }
188
+ const allowed = new Set(activeSessionIds.map((id) => `${id}.json`));
189
+ for (const name of FileChatSessionRepository.safeReadDirFiles(sessionsDir)) {
190
+ if (allowed.has(name) || !name.endsWith('.json')) {
191
+ continue;
192
+ }
193
+ unlinkSync(join(sessionsDir, name));
194
+ }
454
195
  }
455
- const candidate = value;
456
- if (typeof candidate.id !== 'string'
457
- || typeof candidate.path !== 'string'
458
- || typeof candidate.summaryPath !== 'string'
459
- || typeof candidate.messageCount !== 'number'
460
- || typeof candidate.createdAt !== 'string') {
461
- return [];
196
+ static safeReadDirFiles(path) {
197
+ try {
198
+ return readdirSync(path);
199
+ }
200
+ catch {
201
+ return [];
202
+ }
462
203
  }
463
- return [{
464
- id: candidate.id,
465
- path: candidate.path,
466
- summaryPath: candidate.summaryPath,
467
- shortDescription: typeof candidate.shortDescription === 'string' ? candidate.shortDescription : undefined,
468
- messageCount: candidate.messageCount,
469
- createdAt: candidate.createdAt,
470
- summaryModel: typeof candidate.summaryModel === 'string' ? candidate.summaryModel : undefined,
471
- }];
472
- }
473
- function readObjectRecord(value) {
474
- return value && typeof value === 'object' && !Array.isArray(value) ? value : undefined;
475
204
  }
476
205
  //# sourceMappingURL=file-chat-session-repository.js.map