@xopcai/xopc 0.0.95 → 0.0.96

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 (428) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  3. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  4. package/dist/extensions/telegram/src/plugin.js +1 -1
  5. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  6. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  7. package/dist/extensions/telegram/xopc.extension.json +1 -1
  8. package/dist/extensions/weixin/src/api/api.js +2 -2
  9. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  10. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  11. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  12. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  13. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  14. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  15. package/dist/extensions/weixin/src/plugin.js +1 -1
  16. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  17. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  18. package/dist/gateway/static/root/assets/{agents-CKe2LMnz.js → agents-DmIuSaOE.js} +2 -2
  19. package/dist/gateway/static/root/assets/{apps-page-Mi9mMIZ1.js → apps-page-DFcHBxLw.js} +1 -1
  20. package/dist/gateway/static/root/assets/{channels-settings-BrdyC101.js → channels-settings-DDUf55C5.js} +1 -1
  21. package/dist/gateway/static/root/assets/{channels-status-swr-D55Bu0nn.js → channels-status-swr-BxF-_nzD.js} +1 -1
  22. package/dist/gateway/static/root/assets/{cron-api-CPpx2l-E.js → cron-api-DylQtnb_.js} +1 -1
  23. package/dist/gateway/static/root/assets/{cron-page-Bx2jB0YN.js → cron-page-BO0d9Pf-.js} +1 -1
  24. package/dist/gateway/static/root/assets/{dist-D_AiG_Kg.js → dist-BskF0qDS.js} +1 -1
  25. package/dist/gateway/static/root/assets/{extension-debug-page-6ieHsxRE.js → extension-debug-page-BcZdTdjJ.js} +1 -1
  26. package/dist/gateway/static/root/assets/{extension-page-B8nywHRO.js → extension-page-D2iuDa1D.js} +1 -1
  27. package/dist/gateway/static/root/assets/{extension-settings-page-DrskdEIV.js → extension-settings-page-BKpQCgLc.js} +1 -1
  28. package/dist/gateway/static/root/assets/{fetch-B0aeeY0q.js → fetch-CtNDpjij.js} +1 -1
  29. package/dist/gateway/static/root/assets/{field-primitives--9ooY8Xl.js → field-primitives-2PekrGZF.js} +1 -1
  30. package/dist/gateway/static/root/assets/{heartbeat-config-api-DUZ_W1w-.js → heartbeat-config-api-D3D7SW8A.js} +1 -1
  31. package/dist/gateway/static/root/assets/index-BvEhL9RQ.css +1 -0
  32. package/dist/gateway/static/root/assets/{index-Dj9FuxCm.js → index-Db9fd_X4.js} +74 -74
  33. package/dist/gateway/static/root/assets/{logs-page-CaXqhpKf.js → logs-page-B3I1a26m.js} +1 -1
  34. package/dist/gateway/static/root/assets/{note-detail-page-DYzym2B0.js → note-detail-page-BOizhtJ8.js} +54 -53
  35. package/dist/gateway/static/root/assets/{note-detail-page-B91pLkEI.css → note-detail-page-D4ZIVQbk.css} +1 -1
  36. package/dist/gateway/static/root/assets/{note-time-B-vSi2dR.js → note-time-CjUGtqKr.js} +1 -1
  37. package/dist/gateway/static/root/assets/{notes-page-BkhWdGiT.js → notes-page-BB8-I0Of.js} +1 -1
  38. package/dist/gateway/static/root/assets/{sessions-page-53YFokoe.js → sessions-page-BcH-1K9i.js} +1 -1
  39. package/dist/gateway/static/root/assets/{settings-advanced-gate-BaZmaklx.js → settings-advanced-gate-Czn8nnjN.js} +1 -1
  40. package/dist/gateway/static/root/assets/{settings-form-section-DIJPKpTR.js → settings-form-section-ZZWDwgVe.js} +1 -1
  41. package/dist/gateway/static/root/assets/{settings-page-Dvb230FF.js → settings-page-BX8c_zrN.js} +1 -1
  42. package/dist/gateway/static/root/assets/{share-preview-page-CRyjTAG6.js → share-preview-page-Ch3_6Qah.js} +1 -1
  43. package/dist/gateway/static/root/assets/{skills-page-C5ZJbfAe.js → skills-page-WO0bbJ54.js} +1 -1
  44. package/dist/gateway/static/root/assets/{theme-store-Cg_SuBw0.js → theme-store-XxRFRZDX.js} +1 -1
  45. package/dist/gateway/static/root/assets/url-6zpynn1R.js +3 -0
  46. package/dist/gateway/static/root/assets/{utils-lMYoWhqo.js → utils-uTYKh54l.js} +1 -1
  47. package/dist/gateway/static/root/assets/{voice-api-key-field-Dda2pcUU.js → voice-api-key-field-BIAYHRs-.js} +1 -1
  48. package/dist/gateway/static/root/assets/{workflow-page.utils-KIladUrU.js → workflow-page.utils-BbWhqD36.js} +1 -1
  49. package/dist/gateway/static/root/assets/{workflows-page-BTis4Z7Y.js → workflows-page-D4RIF7E1.js} +1 -1
  50. package/dist/gateway/static/root/index.html +5 -5
  51. package/dist/package.js +1 -1
  52. package/dist/src/agent/agent-manager.js +15 -9
  53. package/dist/src/agent/agent-manager.js.map +1 -1
  54. package/dist/src/agent/agent-scope.d.ts +0 -1
  55. package/dist/src/agent/agent-scope.js +2 -5
  56. package/dist/src/agent/agent-scope.js.map +1 -1
  57. package/dist/src/agent/bootstrap/bootstrap-cache.d.ts +3 -0
  58. package/dist/src/agent/bootstrap/bootstrap-cache.js +13 -3
  59. package/dist/src/agent/bootstrap/bootstrap-cache.js.map +1 -1
  60. package/dist/src/agent/bootstrap/bootstrap-files.d.ts +6 -0
  61. package/dist/src/agent/bootstrap/bootstrap-files.js +35 -12
  62. package/dist/src/agent/bootstrap/bootstrap-files.js.map +1 -1
  63. package/dist/src/agent/bootstrap/load-bootstrap-files.d.ts +5 -2
  64. package/dist/src/agent/bootstrap/load-bootstrap-files.js +12 -3
  65. package/dist/src/agent/bootstrap/load-bootstrap-files.js.map +1 -1
  66. package/dist/src/agent/context/workspace-seed.js +8 -4
  67. package/dist/src/agent/context/workspace-seed.js.map +1 -1
  68. package/dist/src/agent/context/workspace-state.d.ts +52 -0
  69. package/dist/src/agent/context/workspace-state.js +101 -0
  70. package/dist/src/agent/context/workspace-state.js.map +1 -0
  71. package/dist/src/agent/embedded/index.d.ts +2 -2
  72. package/dist/src/agent/embedded/index.js +3 -3
  73. package/dist/src/agent/embedded/run-turn.js +0 -3
  74. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  75. package/dist/src/agent/embedded/session-manager-init.d.ts +0 -17
  76. package/dist/src/agent/embedded/session-manager-init.js +1 -36
  77. package/dist/src/agent/embedded/session-manager-init.js.map +1 -1
  78. package/dist/src/agent/embedded/session-runner.d.ts +3 -12
  79. package/dist/src/agent/embedded/session-runner.js +12 -26
  80. package/dist/src/agent/embedded/session-runner.js.map +1 -1
  81. package/dist/src/agent/embedded/session-tool-result-guard.js +2 -4
  82. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  83. package/dist/src/agent/embedded/sqlite-hydrating-session-manager.d.ts +10 -0
  84. package/dist/src/agent/embedded/sqlite-hydrating-session-manager.js +34 -0
  85. package/dist/src/agent/embedded/sqlite-hydrating-session-manager.js.map +1 -0
  86. package/dist/src/agent/goals/goal-run-store.js +4 -4
  87. package/dist/src/agent/goals/persistent-goal-service.js +8 -15
  88. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
  89. package/dist/src/agent/goals/post-turn.js +2 -2
  90. package/dist/src/agent/image/load-image-media.js +2 -2
  91. package/dist/src/agent/ipc/bus.js +1 -1
  92. package/dist/src/agent/ipc/inbox.js +2 -2
  93. package/dist/src/agent/ipc/socket.js +1 -1
  94. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  95. package/dist/src/agent/mcp/bundle-mcp-runtime.js +2 -2
  96. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  97. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  98. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  99. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  100. package/dist/src/agent/memory/dreaming/events.js +1 -1
  101. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  102. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  103. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  104. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  105. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  106. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  107. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  108. package/dist/src/agent/models/manager.js +1 -1
  109. package/dist/src/agent/prompt/memory/index.d.ts +1 -0
  110. package/dist/src/agent/prompt/memory/index.js +34 -80
  111. package/dist/src/agent/prompt/memory/index.js.map +1 -1
  112. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  113. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  114. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  115. package/dist/src/agent/sandbox/path-policy.js +2 -2
  116. package/dist/src/agent/service/build-direct-message-content.js +1 -1
  117. package/dist/src/agent/service/process-direct-one-shot.js +8 -17
  118. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  119. package/dist/src/agent/service/process-direct-streaming.js +14 -23
  120. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  121. package/dist/src/agent/service.js +7 -11
  122. package/dist/src/agent/service.js.map +1 -1
  123. package/dist/src/agent/session/session-inspector.js +1 -1
  124. package/dist/src/agent/skills/config.js +1 -1
  125. package/dist/src/agent/skills/hub-hash.js +2 -2
  126. package/dist/src/agent/skills/hub-lock.js +1 -1
  127. package/dist/src/agent/skills/hub-pull.js +3 -3
  128. package/dist/src/agent/skills/index.js +1 -1
  129. package/dist/src/agent/skills/managed-store.js +1 -1
  130. package/dist/src/agent/skills/scanner.js +1 -1
  131. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  132. package/dist/src/agent/skills/skill-manager.js +1 -1
  133. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  134. package/dist/src/agent/tools/factory.js +1 -1
  135. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  136. package/dist/src/agent/tools/index.d.ts +0 -1
  137. package/dist/src/agent/tools/index.js +1 -2
  138. package/dist/src/agent/tools/send-media.js +1 -1
  139. package/dist/src/agent/tools/session-search-tool.d.ts +0 -1
  140. package/dist/src/agent/tools/session-search-tool.js +11 -6
  141. package/dist/src/agent/tools/session-search-tool.js.map +1 -1
  142. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  143. package/dist/src/agent/tools/workflow-tool.js +1 -1
  144. package/dist/src/agent/tools/write.js +1 -1
  145. package/dist/src/agent/workflow/catalog.js +1 -1
  146. package/dist/src/auth/credentials.js +3 -3
  147. package/dist/src/auth/profiles/store.js +1 -1
  148. package/dist/src/auth/sync-provider-auth.js +1 -1
  149. package/dist/src/browser/cache-dir-policy.js +1 -1
  150. package/dist/src/browser/cdp-local-launcher.js +2 -2
  151. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  152. package/dist/src/browser/providers/cloakbrowser.js +4 -4
  153. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  154. package/dist/src/browser/stealth.js +1 -1
  155. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  156. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  157. package/dist/src/channels/outbound/persist-store.js +1 -1
  158. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  159. package/dist/src/channels/pairing/pairing-store.js +2 -2
  160. package/dist/src/chat-commands/agent-edit.js +2 -2
  161. package/dist/src/chat-commands/builtins/config.js +2 -2
  162. package/dist/src/chat-commands/context.js +1 -1
  163. package/dist/src/cli/commands/config.js +1 -1
  164. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  165. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  166. package/dist/src/cli/commands/doctor/checks/session-integrity.js +32 -95
  167. package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -1
  168. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  169. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  170. package/dist/src/cli/commands/extension-dev.js +1 -1
  171. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  172. package/dist/src/cli/commands/extension-pack.js +1 -1
  173. package/dist/src/cli/commands/gateway/logs.js +1 -1
  174. package/dist/src/cli/commands/image.js +1 -1
  175. package/dist/src/cli/commands/init.js +5 -7
  176. package/dist/src/cli/commands/init.js.map +1 -1
  177. package/dist/src/cli/commands/onboard.js +1 -1
  178. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  179. package/dist/src/commands/agents.config.js +1 -1
  180. package/dist/src/config/agent-profile.js +1 -1
  181. package/dist/src/config/gateway-bind.js +1 -1
  182. package/dist/src/config/index.js +7 -8
  183. package/dist/src/config/index.js.map +1 -1
  184. package/dist/src/config/loader.js +2 -2
  185. package/dist/src/config/models-json.js +2 -2
  186. package/dist/src/config/paths-state.d.ts +3 -0
  187. package/dist/src/config/paths-state.js +7 -3
  188. package/dist/src/config/paths-state.js.map +1 -1
  189. package/dist/src/config/paths.d.ts +5 -35
  190. package/dist/src/config/paths.js +6 -50
  191. package/dist/src/config/paths.js.map +1 -1
  192. package/dist/src/config/profile.js +2 -2
  193. package/dist/src/config/schema.d.ts +15 -0
  194. package/dist/src/config/schema.js +11 -0
  195. package/dist/src/config/schema.js.map +1 -1
  196. package/dist/src/config/workspace-path.js +1 -1
  197. package/dist/src/cron/execution-types.d.ts +42 -0
  198. package/dist/src/cron/executor.js +2 -2
  199. package/dist/src/cron/persistence.js +1 -1
  200. package/dist/src/cron/run-log-store.d.ts +4 -8
  201. package/dist/src/cron/run-log-store.js +26 -78
  202. package/dist/src/cron/run-log-store.js.map +1 -1
  203. package/dist/src/cron/service.d.ts +3 -3
  204. package/dist/src/cron/service.js +2 -2
  205. package/dist/src/cron/service.js.map +1 -1
  206. package/dist/src/cron/types.d.ts +1 -42
  207. package/dist/src/daemon/constants.js +1 -1
  208. package/dist/src/daemon/install-plan.js +2 -2
  209. package/dist/src/daemon/launchd.js +2 -2
  210. package/dist/src/daemon/schtasks.js +2 -2
  211. package/dist/src/daemon/systemd.js +2 -2
  212. package/dist/src/extensions/bundle-mcp.js +1 -1
  213. package/dist/src/extensions/discover-extensions.js +1 -1
  214. package/dist/src/extensions/health.js +1 -1
  215. package/dist/src/extensions/loader.js +1 -1
  216. package/dist/src/extensions/lockfile.js +2 -2
  217. package/dist/src/extensions/update.js +1 -1
  218. package/dist/src/gateway/agents-admin.js +8 -3
  219. package/dist/src/gateway/agents-admin.js.map +1 -1
  220. package/dist/src/gateway/file-path-classifier.d.ts +0 -1
  221. package/dist/src/gateway/file-path-classifier.js +2 -8
  222. package/dist/src/gateway/file-path-classifier.js.map +1 -1
  223. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  224. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  225. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  226. package/dist/src/gateway/hono/oauth.js +1 -1
  227. package/dist/src/gateway/hono/routes/agents.js +1 -1
  228. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  229. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  230. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  231. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  232. package/dist/src/gateway/hono/routes/models.js +1 -1
  233. package/dist/src/gateway/hono/routes/shares.js +1 -1
  234. package/dist/src/gateway/hono/routes/workspace.js +2 -2
  235. package/dist/src/gateway/lock.js +3 -3
  236. package/dist/src/gateway/ports.js +1 -1
  237. package/dist/src/gateway/service/agent-runner.js +2 -2
  238. package/dist/src/gateway/service/marketplace-service.js +2 -2
  239. package/dist/src/gateway/service.js +5 -1
  240. package/dist/src/gateway/service.js.map +1 -1
  241. package/dist/src/gateway/session-reset-service.d.ts +1 -1
  242. package/dist/src/gateway/session-reset-service.js +1 -1
  243. package/dist/src/gateway/session-reset-service.js.map +1 -1
  244. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  245. package/dist/src/infra/brew.js +1 -1
  246. package/dist/src/infra/node-sqlite.d.ts +1 -0
  247. package/dist/src/infra/node-sqlite.js +17 -0
  248. package/dist/src/infra/node-sqlite.js.map +1 -0
  249. package/dist/src/infra/package-json.js +1 -1
  250. package/dist/src/infra/package-update-steps.js +1 -1
  251. package/dist/src/infra/path-env.js +2 -2
  252. package/dist/src/infra/restart.js +2 -2
  253. package/dist/src/infra/sqlite-errors.d.ts +1 -0
  254. package/dist/src/infra/sqlite-errors.js +77 -0
  255. package/dist/src/infra/sqlite-errors.js.map +1 -0
  256. package/dist/src/infra/stable-node-path.js +1 -1
  257. package/dist/src/infra/unhandled-rejections.d.ts +1 -0
  258. package/dist/src/infra/unhandled-rejections.js +25 -0
  259. package/dist/src/infra/unhandled-rejections.js.map +1 -0
  260. package/dist/src/infra/update-check.js +1 -1
  261. package/dist/src/infra/update-global.js +1 -1
  262. package/dist/src/infra/update-lock.js +3 -3
  263. package/dist/src/infra/update-runner.js +1 -1
  264. package/dist/src/infra/update-startup.js +2 -2
  265. package/dist/src/infra/warning-filter.d.ts +7 -0
  266. package/dist/src/infra/warning-filter.js +59 -0
  267. package/dist/src/infra/warning-filter.js.map +1 -0
  268. package/dist/src/infra/write-file-atomic.js +2 -2
  269. package/dist/src/notes/store.d.ts +3 -9
  270. package/dist/src/notes/store.js +22 -196
  271. package/dist/src/notes/store.js.map +1 -1
  272. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  273. package/dist/src/providers/index.js +2 -2
  274. package/dist/src/providers/model-registry.js +1 -1
  275. package/dist/src/session/config-store.d.ts +6 -75
  276. package/dist/src/session/config-store.js +38 -144
  277. package/dist/src/session/config-store.js.map +1 -1
  278. package/dist/src/session/config-types.d.ts +15 -0
  279. package/dist/src/session/config-types.js +1 -0
  280. package/dist/src/session/index.d.ts +1 -3
  281. package/dist/src/session/index.js +3 -5
  282. package/dist/src/session/init-session-turn.d.ts +0 -6
  283. package/dist/src/session/init-session-turn.js +18 -18
  284. package/dist/src/session/init-session-turn.js.map +1 -1
  285. package/dist/src/session/lifecycle-timestamps.d.ts +5 -2
  286. package/dist/src/session/lifecycle-timestamps.js.map +1 -1
  287. package/dist/src/session/{parity/load-jsonl-entries.js → load-jsonl-entries.js} +1 -1
  288. package/dist/src/session/load-jsonl-entries.js.map +1 -0
  289. package/dist/src/session/manager.d.ts +5 -3
  290. package/dist/src/session/manager.js +1 -5
  291. package/dist/src/session/manager.js.map +1 -1
  292. package/dist/src/session/resolve-session.d.ts +3 -6
  293. package/dist/src/session/resolve-session.js +26 -31
  294. package/dist/src/session/resolve-session.js.map +1 -1
  295. package/dist/src/session/session-context-for-llm.js +5 -1
  296. package/dist/src/session/session-context-for-llm.js.map +1 -1
  297. package/dist/src/session/session-id.js +12 -0
  298. package/dist/src/session/session-id.js.map +1 -0
  299. package/dist/src/session/session-title.js +2 -2
  300. package/dist/src/session/session-workspace.d.ts +1 -1
  301. package/dist/src/session/session-workspace.js.map +1 -1
  302. package/dist/src/session/store.d.ts +14 -63
  303. package/dist/src/session/store.js +172 -847
  304. package/dist/src/session/store.js.map +1 -1
  305. package/dist/src/session/stored-rows-to-file-entries.d.ts +11 -0
  306. package/dist/src/session/stored-rows-to-file-entries.js +95 -0
  307. package/dist/src/session/stored-rows-to-file-entries.js.map +1 -0
  308. package/dist/src/session/transcript-events.d.ts +1 -2
  309. package/dist/src/session/transcript-events.js +5 -12
  310. package/dist/src/session/transcript-events.js.map +1 -1
  311. package/dist/src/session/transcript-format.d.ts +1 -1
  312. package/dist/src/session/transcript-format.js.map +1 -1
  313. package/dist/src/session/transcript-stats.d.ts +1 -0
  314. package/dist/src/session/transcript-stats.js +10 -0
  315. package/dist/src/session/transcript-stats.js.map +1 -0
  316. package/dist/src/share/share-auto.js +2 -2
  317. package/dist/src/share/share-store.js +3 -3
  318. package/dist/src/share/share-thumbnail.js +2 -2
  319. package/dist/src/share/share-zip.js +1 -1
  320. package/dist/src/share/site-share-store.js +3 -3
  321. package/dist/src/share/site-static-serve.js +1 -1
  322. package/dist/src/storage/sqlite/config-repository.d.ts +6 -0
  323. package/dist/src/storage/sqlite/config-repository.js +56 -0
  324. package/dist/src/storage/sqlite/config-repository.js.map +1 -0
  325. package/dist/src/storage/sqlite/connection.d.ts +38 -0
  326. package/dist/src/storage/sqlite/connection.js +258 -0
  327. package/dist/src/storage/sqlite/connection.js.map +1 -0
  328. package/dist/src/storage/sqlite/cron-run-repository.d.ts +5 -0
  329. package/dist/src/storage/sqlite/cron-run-repository.js +97 -0
  330. package/dist/src/storage/sqlite/cron-run-repository.js.map +1 -0
  331. package/dist/src/storage/sqlite/fts.d.ts +2 -0
  332. package/dist/src/storage/sqlite/fts.js +11 -0
  333. package/dist/src/storage/sqlite/fts.js.map +1 -0
  334. package/dist/src/storage/sqlite/index.d.ts +12 -0
  335. package/dist/src/storage/sqlite/index.js +13 -0
  336. package/dist/src/storage/sqlite/memory-index-repository.d.ts +18 -0
  337. package/dist/src/storage/sqlite/memory-index-repository.js +132 -0
  338. package/dist/src/storage/sqlite/memory-index-repository.js.map +1 -0
  339. package/dist/src/storage/sqlite/notes-repository.d.ts +11 -0
  340. package/dist/src/storage/sqlite/notes-repository.js +191 -0
  341. package/dist/src/storage/sqlite/notes-repository.js.map +1 -0
  342. package/dist/src/storage/sqlite/paths.d.ts +1 -0
  343. package/dist/src/storage/sqlite/paths.js +7 -0
  344. package/dist/src/storage/sqlite/paths.js.map +1 -0
  345. package/dist/src/storage/sqlite/row-mappers.d.ts +82 -0
  346. package/dist/src/storage/sqlite/row-mappers.js +164 -0
  347. package/dist/src/storage/sqlite/row-mappers.js.map +1 -0
  348. package/dist/src/storage/sqlite/schema.d.ts +5 -0
  349. package/dist/src/storage/sqlite/schema.js +43 -0
  350. package/dist/src/storage/sqlite/schema.js.map +1 -0
  351. package/dist/src/storage/sqlite/schema.sql +195 -0
  352. package/dist/src/storage/sqlite/session-metadata.d.ts +8 -0
  353. package/dist/src/storage/sqlite/session-metadata.js +83 -0
  354. package/dist/src/storage/sqlite/session-metadata.js.map +1 -0
  355. package/dist/src/storage/sqlite/session-repository.d.ts +29 -0
  356. package/dist/src/storage/sqlite/session-repository.js +268 -0
  357. package/dist/src/storage/sqlite/session-repository.js.map +1 -0
  358. package/dist/src/storage/sqlite/transaction.d.ts +11 -0
  359. package/dist/src/storage/sqlite/transaction.js +115 -0
  360. package/dist/src/storage/sqlite/transaction.js.map +1 -0
  361. package/dist/src/storage/sqlite/transcript-repository.d.ts +34 -0
  362. package/dist/src/storage/sqlite/transcript-repository.js +241 -0
  363. package/dist/src/storage/sqlite/transcript-repository.js.map +1 -0
  364. package/dist/src/tui/clipboard-image.js +3 -3
  365. package/dist/src/tui/theme-manager.js +1 -1
  366. package/dist/src/tui/tui-keybindings-file.js +1 -1
  367. package/dist/src/tui/tui-scoped-models.js +2 -2
  368. package/dist/src/tui/tui-settings.js +1 -1
  369. package/dist/src/tui/tui.js +3 -3
  370. package/dist/src/tunnel/frpc-binary.js +3 -3
  371. package/dist/src/tunnel/frpc-config.js +1 -1
  372. package/dist/src/tunnel/frpc-extract.js +1 -1
  373. package/dist/src/tunnel/tunnel-state.js +1 -1
  374. package/dist/src/utils/logger/audit.js +1 -1
  375. package/dist/src/utils/logger/log-store.js +1 -1
  376. package/dist/src/utils/logger/rotation.js +1 -1
  377. package/dist/src/voice/tts/audio.js +1 -1
  378. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  379. package/dist/src/workflows/service/workflow-session-bridge.js +41 -64
  380. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  381. package/dist/src/workflows/store/event-store.js +1 -1
  382. package/dist/src/workflows/store/run-store.js +1 -1
  383. package/package.json +2 -2
  384. package/dist/gateway/static/root/assets/index-Bj_l8QDp.css +0 -1
  385. package/dist/gateway/static/root/assets/url-BHHmdJYc.js +0 -3
  386. package/dist/src/agent/embedded/session-manager-cache.d.ts +0 -19
  387. package/dist/src/agent/embedded/session-manager-cache.js +0 -48
  388. package/dist/src/agent/embedded/session-manager-cache.js.map +0 -1
  389. package/dist/src/session/parity/artifacts.d.ts +0 -16
  390. package/dist/src/session/parity/artifacts.js +0 -80
  391. package/dist/src/session/parity/artifacts.js.map +0 -1
  392. package/dist/src/session/parity/jsonl-transcript-io.d.ts +0 -54
  393. package/dist/src/session/parity/jsonl-transcript-io.js +0 -236
  394. package/dist/src/session/parity/jsonl-transcript-io.js.map +0 -1
  395. package/dist/src/session/parity/load-jsonl-entries.js.map +0 -1
  396. package/dist/src/session/parity/session-id.js +0 -18
  397. package/dist/src/session/parity/session-id.js.map +0 -1
  398. package/dist/src/session/parity/sessions-json-cache.d.ts +0 -14
  399. package/dist/src/session/parity/sessions-json-cache.js +0 -98
  400. package/dist/src/session/parity/sessions-json-cache.js.map +0 -1
  401. package/dist/src/session/parity/sessions-json-file-read.d.ts +0 -6
  402. package/dist/src/session/parity/sessions-json-file-read.js +0 -19
  403. package/dist/src/session/parity/sessions-json-file-read.js.map +0 -1
  404. package/dist/src/session/parity/sessions-json-file.d.ts +0 -11
  405. package/dist/src/session/parity/sessions-json-file.js +0 -52
  406. package/dist/src/session/parity/sessions-json-file.js.map +0 -1
  407. package/dist/src/session/parity/sessions-json-patch.d.ts +0 -14
  408. package/dist/src/session/parity/sessions-json-patch.js +0 -40
  409. package/dist/src/session/parity/sessions-json-patch.js.map +0 -1
  410. package/dist/src/session/parity/transcript-file-lock.d.ts +0 -22
  411. package/dist/src/session/parity/transcript-file-lock.js +0 -142
  412. package/dist/src/session/parity/transcript-file-lock.js.map +0 -1
  413. package/dist/src/session/parity/transcript-pagination.d.ts +0 -29
  414. package/dist/src/session/parity/transcript-pagination.js +0 -132
  415. package/dist/src/session/parity/transcript-pagination.js.map +0 -1
  416. package/dist/src/session/parity/transcript-paths.d.ts +0 -13
  417. package/dist/src/session/parity/transcript-paths.js +0 -64
  418. package/dist/src/session/parity/transcript-paths.js.map +0 -1
  419. package/dist/src/session/parity/xopc-session-disk-entry.d.ts +0 -22
  420. package/dist/src/session/search-index-cache.d.ts +0 -6
  421. package/dist/src/session/search-index-cache.js +0 -44
  422. package/dist/src/session/search-index-cache.js.map +0 -1
  423. package/dist/src/session/search-index.d.ts +0 -20
  424. package/dist/src/session/search-index.js +0 -124
  425. package/dist/src/session/search-index.js.map +0 -1
  426. /package/dist/src/{session/parity/xopc-session-disk-entry.js → cron/execution-types.js} +0 -0
  427. /package/dist/src/session/{parity/load-jsonl-entries.d.ts → load-jsonl-entries.d.ts} +0 -0
  428. /package/dist/src/session/{parity/session-id.d.ts → session-id.d.ts} +0 -0
@@ -1,19 +0,0 @@
1
- /**
2
- * Tracks which session JSONL files we have already confirmed exist on disk so
3
- * subsequent acquires can skip the open/close probe. The class is owned by the
4
- * session runner pool; {@link defaultSessionManagerCache} keeps the free-function
5
- * API working until every caller has been wired through dependency injection.
6
- */
7
- export declare class SessionManagerCache {
8
- private readonly seen;
9
- prewarm(sessionFile: string): Promise<void>;
10
- trackAccess(sessionFile: string): void;
11
- has(sessionFile: string): boolean;
12
- resetForTest(): void;
13
- }
14
- export declare const defaultSessionManagerCache: SessionManagerCache;
15
- export declare function prewarmSessionFile(sessionFile: string): Promise<void>;
16
- export declare function trackSessionManagerAccess(sessionFile: string): void;
17
- export declare function isSessionManagerCached(sessionFile: string): boolean;
18
- export declare function resetSessionManagerCacheForTest(): void;
19
- export declare function getSessionManagerCacheTtlMs(): number;
@@ -1,48 +0,0 @@
1
- import fs from "node:fs/promises";
2
- //#region src/agent/embedded/session-manager-cache.ts
3
- const DEFAULT_TTL_MS = 3e4;
4
- /**
5
- * Tracks which session JSONL files we have already confirmed exist on disk so
6
- * subsequent acquires can skip the open/close probe. The class is owned by the
7
- * session runner pool; {@link defaultSessionManagerCache} keeps the free-function
8
- * API working until every caller has been wired through dependency injection.
9
- */
10
- var SessionManagerCache = class {
11
- seen = /* @__PURE__ */ new Map();
12
- async prewarm(sessionFile) {
13
- if (this.seen.get(sessionFile) === true) return;
14
- try {
15
- await (await fs.open(sessionFile, "r")).close();
16
- this.seen.set(sessionFile, true);
17
- } catch {}
18
- }
19
- trackAccess(sessionFile) {
20
- this.seen.set(sessionFile, true);
21
- }
22
- has(sessionFile) {
23
- return this.seen.get(sessionFile) === true;
24
- }
25
- resetForTest() {
26
- this.seen.clear();
27
- }
28
- };
29
- const defaultSessionManagerCache = new SessionManagerCache();
30
- function prewarmSessionFile(sessionFile) {
31
- return defaultSessionManagerCache.prewarm(sessionFile);
32
- }
33
- function trackSessionManagerAccess(sessionFile) {
34
- defaultSessionManagerCache.trackAccess(sessionFile);
35
- }
36
- function isSessionManagerCached(sessionFile) {
37
- return defaultSessionManagerCache.has(sessionFile);
38
- }
39
- function resetSessionManagerCacheForTest() {
40
- defaultSessionManagerCache.resetForTest();
41
- }
42
- function getSessionManagerCacheTtlMs() {
43
- return DEFAULT_TTL_MS;
44
- }
45
- //#endregion
46
- export { SessionManagerCache, defaultSessionManagerCache, getSessionManagerCacheTtlMs, isSessionManagerCached, prewarmSessionFile, resetSessionManagerCacheForTest, trackSessionManagerAccess };
47
-
48
- //# sourceMappingURL=session-manager-cache.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-manager-cache.js","names":[],"sources":["../../../../src/agent/embedded/session-manager-cache.ts"],"sourcesContent":["import fs from 'node:fs/promises';\n\nconst DEFAULT_TTL_MS = 30_000;\n\n/**\n * Tracks which session JSONL files we have already confirmed exist on disk so\n * subsequent acquires can skip the open/close probe. The class is owned by the\n * session runner pool; {@link defaultSessionManagerCache} keeps the free-function\n * API working until every caller has been wired through dependency injection.\n */\nexport class SessionManagerCache {\n private readonly seen = new Map<string, boolean>();\n\n async prewarm(sessionFile: string): Promise<void> {\n if (this.seen.get(sessionFile) === true) {\n return;\n }\n try {\n const handle = await fs.open(sessionFile, 'r');\n await handle.close();\n this.seen.set(sessionFile, true);\n } catch {\n // File doesn't exist yet; SessionManager will create it\n }\n }\n\n trackAccess(sessionFile: string): void {\n this.seen.set(sessionFile, true);\n }\n\n has(sessionFile: string): boolean {\n return this.seen.get(sessionFile) === true;\n }\n\n resetForTest(): void {\n this.seen.clear();\n }\n}\n\nexport const defaultSessionManagerCache = new SessionManagerCache();\n\nexport function prewarmSessionFile(sessionFile: string): Promise<void> {\n return defaultSessionManagerCache.prewarm(sessionFile);\n}\n\nexport function trackSessionManagerAccess(sessionFile: string): void {\n defaultSessionManagerCache.trackAccess(sessionFile);\n}\n\nexport function isSessionManagerCached(sessionFile: string): boolean {\n return defaultSessionManagerCache.has(sessionFile);\n}\n\nexport function resetSessionManagerCacheForTest(): void {\n defaultSessionManagerCache.resetForTest();\n}\n\nexport function getSessionManagerCacheTtlMs(): number {\n return DEFAULT_TTL_MS;\n}\n"],"mappings":";;AAEA,MAAM,iBAAiB;;;;;;;AAQvB,IAAa,sBAAb,MAAiC;CAC/B,uBAAwB,IAAI,KAAsB;CAElD,MAAM,QAAQ,aAAoC;AAChD,MAAI,KAAK,KAAK,IAAI,YAAY,KAAK,KACjC;AAEF,MAAI;AAEF,UAAM,MADe,GAAG,KAAK,aAAa,IAAI,EACjC,OAAO;AACpB,QAAK,KAAK,IAAI,aAAa,KAAK;UAC1B;;CAKV,YAAY,aAA2B;AACrC,OAAK,KAAK,IAAI,aAAa,KAAK;;CAGlC,IAAI,aAA8B;AAChC,SAAO,KAAK,KAAK,IAAI,YAAY,KAAK;;CAGxC,eAAqB;AACnB,OAAK,KAAK,OAAO;;;AAIrB,MAAa,6BAA6B,IAAI,qBAAqB;AAEnE,SAAgB,mBAAmB,aAAoC;AACrE,QAAO,2BAA2B,QAAQ,YAAY;;AAGxD,SAAgB,0BAA0B,aAA2B;AACnE,4BAA2B,YAAY,YAAY;;AAGrD,SAAgB,uBAAuB,aAA8B;AACnE,QAAO,2BAA2B,IAAI,YAAY;;AAGpD,SAAgB,kCAAwC;AACtD,4BAA2B,cAAc;;AAG3C,SAAgB,8BAAsC;AACpD,QAAO"}
@@ -1,16 +0,0 @@
1
- /** OpenClaw-aligned transcript artifact naming (no legacy store backup patterns). */
2
- export type SessionArchiveReason = 'bak' | 'reset' | 'deleted';
3
- export declare function isSessionArchiveArtifactName(fileName: string): boolean;
4
- export declare function parseCompactionCheckpointTranscriptFileName(fileName: string): {
5
- sessionId: string;
6
- checkpointId: string;
7
- } | null;
8
- export declare function isCompactionCheckpointTranscriptFileName(fileName: string): boolean;
9
- export declare function isTrajectoryRuntimeArtifactName(fileName: string): boolean;
10
- export declare function isTrajectoryPointerArtifactName(fileName: string): boolean;
11
- export declare function isTrajectorySessionArtifactName(fileName: string): boolean;
12
- export declare function isPrimarySessionTranscriptFileName(fileName: string): boolean;
13
- export declare function isUsageCountedSessionTranscriptFileName(fileName: string): boolean;
14
- export declare function parseUsageCountedSessionIdFromFileName(fileName: string): string | null;
15
- export declare function formatSessionArchiveTimestamp(nowMs?: number): string;
16
- export declare function parseSessionArchiveTimestamp(fileName: string, reason: SessionArchiveReason): number | null;
@@ -1,80 +0,0 @@
1
- import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
2
- //#region src/session/parity/artifacts.ts
3
- function hasArchiveSuffix(fileName, reason) {
4
- const marker = `.${reason}.`;
5
- const index = fileName.lastIndexOf(marker);
6
- if (index < 0) return false;
7
- const raw = fileName.slice(index + marker.length);
8
- return ARCHIVE_TIMESTAMP_RE.test(raw);
9
- }
10
- function isSessionArchiveArtifactName(fileName) {
11
- return hasArchiveSuffix(fileName, "deleted") || hasArchiveSuffix(fileName, "reset") || hasArchiveSuffix(fileName, "bak");
12
- }
13
- function parseCompactionCheckpointTranscriptFileName(fileName) {
14
- const match = COMPACTION_CHECKPOINT_TRANSCRIPT_RE.exec(fileName);
15
- const sessionId = match?.[1];
16
- const checkpointId = match?.[2];
17
- return sessionId && checkpointId ? {
18
- sessionId,
19
- checkpointId
20
- } : null;
21
- }
22
- function isCompactionCheckpointTranscriptFileName(fileName) {
23
- return parseCompactionCheckpointTranscriptFileName(fileName) !== null;
24
- }
25
- function isTrajectoryRuntimeArtifactName(fileName) {
26
- return fileName.endsWith(".trajectory.jsonl");
27
- }
28
- function isTrajectoryPointerArtifactName(fileName) {
29
- return fileName.endsWith(".trajectory-path.json");
30
- }
31
- function isTrajectorySessionArtifactName(fileName) {
32
- return isTrajectoryRuntimeArtifactName(fileName) || isTrajectoryPointerArtifactName(fileName);
33
- }
34
- function isPrimarySessionTranscriptFileName(fileName) {
35
- if (fileName === "sessions.json") return false;
36
- if (!fileName.endsWith(".jsonl")) return false;
37
- if (isTrajectoryRuntimeArtifactName(fileName)) return false;
38
- if (isCompactionCheckpointTranscriptFileName(fileName)) return false;
39
- return !isSessionArchiveArtifactName(fileName);
40
- }
41
- function isUsageCountedSessionTranscriptFileName(fileName) {
42
- if (isPrimarySessionTranscriptFileName(fileName)) return true;
43
- return hasArchiveSuffix(fileName, "reset") || hasArchiveSuffix(fileName, "deleted");
44
- }
45
- function parseUsageCountedSessionIdFromFileName(fileName) {
46
- if (isPrimarySessionTranscriptFileName(fileName)) return fileName.slice(0, -6);
47
- for (const reason of ["reset", "deleted"]) {
48
- const marker = `.jsonl.${reason}.`;
49
- const index = fileName.lastIndexOf(marker);
50
- if (index > 0 && hasArchiveSuffix(fileName, reason)) return fileName.slice(0, index);
51
- }
52
- return null;
53
- }
54
- function formatSessionArchiveTimestamp(nowMs = Date.now()) {
55
- return new Date(nowMs).toISOString().replaceAll(":", "-");
56
- }
57
- function restoreSessionArchiveTimestamp(raw) {
58
- const [datePart, timePart] = raw.split("T");
59
- if (!datePart || !timePart) return raw;
60
- return `${datePart}T${timePart.replace(/-/g, ":")}`;
61
- }
62
- function parseSessionArchiveTimestamp(fileName, reason) {
63
- const marker = `.${reason}.`;
64
- const index = fileName.lastIndexOf(marker);
65
- if (index < 0) return null;
66
- const raw = fileName.slice(index + marker.length);
67
- if (!raw || !ARCHIVE_TIMESTAMP_RE.test(raw)) return null;
68
- const timestamp = Date.parse(restoreSessionArchiveTimestamp(raw));
69
- return Number.isFinite(timestamp) ? timestamp : null;
70
- }
71
- var ARCHIVE_TIMESTAMP_RE, COMPACTION_CHECKPOINT_TRANSCRIPT_RE;
72
- var init_artifacts = __esmMin((() => {
73
- ARCHIVE_TIMESTAMP_RE = /^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}(?:\.\d{3})?Z$/;
74
- COMPACTION_CHECKPOINT_TRANSCRIPT_RE = /^(.+)\.checkpoint\.([0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})\.jsonl$/i;
75
- }));
76
- //#endregion
77
- init_artifacts();
78
- export { formatSessionArchiveTimestamp, init_artifacts, isCompactionCheckpointTranscriptFileName, isPrimarySessionTranscriptFileName, isSessionArchiveArtifactName, isTrajectoryPointerArtifactName, isTrajectoryRuntimeArtifactName, isTrajectorySessionArtifactName, isUsageCountedSessionTranscriptFileName, parseCompactionCheckpointTranscriptFileName, parseSessionArchiveTimestamp, parseUsageCountedSessionIdFromFileName };
79
-
80
- //# sourceMappingURL=artifacts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"artifacts.js","names":[],"sources":["../../../../src/session/parity/artifacts.ts"],"sourcesContent":["/** OpenClaw-aligned transcript artifact naming (no legacy store backup patterns). */\n\nexport type SessionArchiveReason = 'bak' | 'reset' | 'deleted';\n\nconst ARCHIVE_TIMESTAMP_RE = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}-\\d{2}-\\d{2}(?:\\.\\d{3})?Z$/;\nconst COMPACTION_CHECKPOINT_TRANSCRIPT_RE =\n /^(.+)\\.checkpoint\\.([0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})\\.jsonl$/i;\n\nfunction hasArchiveSuffix(fileName: string, reason: SessionArchiveReason): boolean {\n const marker = `.${reason}.`;\n const index = fileName.lastIndexOf(marker);\n if (index < 0) {\n return false;\n }\n const raw = fileName.slice(index + marker.length);\n return ARCHIVE_TIMESTAMP_RE.test(raw);\n}\n\nexport function isSessionArchiveArtifactName(fileName: string): boolean {\n return (\n hasArchiveSuffix(fileName, 'deleted') ||\n hasArchiveSuffix(fileName, 'reset') ||\n hasArchiveSuffix(fileName, 'bak')\n );\n}\n\nexport function parseCompactionCheckpointTranscriptFileName(fileName: string): {\n sessionId: string;\n checkpointId: string;\n} | null {\n const match = COMPACTION_CHECKPOINT_TRANSCRIPT_RE.exec(fileName);\n const sessionId = match?.[1];\n const checkpointId = match?.[2];\n return sessionId && checkpointId ? { sessionId, checkpointId } : null;\n}\n\nexport function isCompactionCheckpointTranscriptFileName(fileName: string): boolean {\n return parseCompactionCheckpointTranscriptFileName(fileName) !== null;\n}\n\nexport function isTrajectoryRuntimeArtifactName(fileName: string): boolean {\n return fileName.endsWith('.trajectory.jsonl');\n}\n\nexport function isTrajectoryPointerArtifactName(fileName: string): boolean {\n return fileName.endsWith('.trajectory-path.json');\n}\n\nexport function isTrajectorySessionArtifactName(fileName: string): boolean {\n return isTrajectoryRuntimeArtifactName(fileName) || isTrajectoryPointerArtifactName(fileName);\n}\n\nexport function isPrimarySessionTranscriptFileName(fileName: string): boolean {\n if (fileName === 'sessions.json') {\n return false;\n }\n if (!fileName.endsWith('.jsonl')) {\n return false;\n }\n if (isTrajectoryRuntimeArtifactName(fileName)) {\n return false;\n }\n if (isCompactionCheckpointTranscriptFileName(fileName)) {\n return false;\n }\n return !isSessionArchiveArtifactName(fileName);\n}\n\nexport function isUsageCountedSessionTranscriptFileName(fileName: string): boolean {\n if (isPrimarySessionTranscriptFileName(fileName)) {\n return true;\n }\n return hasArchiveSuffix(fileName, 'reset') || hasArchiveSuffix(fileName, 'deleted');\n}\n\nexport function parseUsageCountedSessionIdFromFileName(fileName: string): string | null {\n if (isPrimarySessionTranscriptFileName(fileName)) {\n return fileName.slice(0, -'.jsonl'.length);\n }\n for (const reason of ['reset', 'deleted'] as const) {\n const marker = `.jsonl.${reason}.`;\n const index = fileName.lastIndexOf(marker);\n if (index > 0 && hasArchiveSuffix(fileName, reason)) {\n return fileName.slice(0, index);\n }\n }\n return null;\n}\n\nexport function formatSessionArchiveTimestamp(nowMs = Date.now()): string {\n return new Date(nowMs).toISOString().replaceAll(':', '-');\n}\n\nfunction restoreSessionArchiveTimestamp(raw: string): string {\n const [datePart, timePart] = raw.split('T');\n if (!datePart || !timePart) {\n return raw;\n }\n return `${datePart}T${timePart.replace(/-/g, ':')}`;\n}\n\nexport function parseSessionArchiveTimestamp(\n fileName: string,\n reason: SessionArchiveReason,\n): number | null {\n const marker = `.${reason}.`;\n const index = fileName.lastIndexOf(marker);\n if (index < 0) {\n return null;\n }\n const raw = fileName.slice(index + marker.length);\n if (!raw || !ARCHIVE_TIMESTAMP_RE.test(raw)) {\n return null;\n }\n const timestamp = Date.parse(restoreSessionArchiveTimestamp(raw));\n return Number.isFinite(timestamp) ? timestamp : null;\n}\n"],"mappings":";;AAQA,SAAS,iBAAiB,UAAkB,QAAuC;CACjF,MAAM,SAAS,IAAI,OAAO;CAC1B,MAAM,QAAQ,SAAS,YAAY,OAAO;AAC1C,KAAI,QAAQ,EACV,QAAO;CAET,MAAM,MAAM,SAAS,MAAM,QAAQ,OAAO,OAAO;AACjD,QAAO,qBAAqB,KAAK,IAAI;;AAGvC,SAAgB,6BAA6B,UAA2B;AACtE,QACE,iBAAiB,UAAU,UAAU,IACrC,iBAAiB,UAAU,QAAQ,IACnC,iBAAiB,UAAU,MAAM;;AAIrC,SAAgB,4CAA4C,UAGnD;CACP,MAAM,QAAQ,oCAAoC,KAAK,SAAS;CAChE,MAAM,YAAY,QAAQ;CAC1B,MAAM,eAAe,QAAQ;AAC7B,QAAO,aAAa,eAAe;EAAE;EAAW;EAAc,GAAG;;AAGnE,SAAgB,yCAAyC,UAA2B;AAClF,QAAO,4CAA4C,SAAS,KAAK;;AAGnE,SAAgB,gCAAgC,UAA2B;AACzE,QAAO,SAAS,SAAS,oBAAoB;;AAG/C,SAAgB,gCAAgC,UAA2B;AACzE,QAAO,SAAS,SAAS,wBAAwB;;AAGnD,SAAgB,gCAAgC,UAA2B;AACzE,QAAO,gCAAgC,SAAS,IAAI,gCAAgC,SAAS;;AAG/F,SAAgB,mCAAmC,UAA2B;AAC5E,KAAI,aAAa,gBACf,QAAO;AAET,KAAI,CAAC,SAAS,SAAS,SAAS,CAC9B,QAAO;AAET,KAAI,gCAAgC,SAAS,CAC3C,QAAO;AAET,KAAI,yCAAyC,SAAS,CACpD,QAAO;AAET,QAAO,CAAC,6BAA6B,SAAS;;AAGhD,SAAgB,wCAAwC,UAA2B;AACjF,KAAI,mCAAmC,SAAS,CAC9C,QAAO;AAET,QAAO,iBAAiB,UAAU,QAAQ,IAAI,iBAAiB,UAAU,UAAU;;AAGrF,SAAgB,uCAAuC,UAAiC;AACtF,KAAI,mCAAmC,SAAS,CAC9C,QAAO,SAAS,MAAM,GAAG,GAAiB;AAE5C,MAAK,MAAM,UAAU,CAAC,SAAS,UAAU,EAAW;EAClD,MAAM,SAAS,UAAU,OAAO;EAChC,MAAM,QAAQ,SAAS,YAAY,OAAO;AAC1C,MAAI,QAAQ,KAAK,iBAAiB,UAAU,OAAO,CACjD,QAAO,SAAS,MAAM,GAAG,MAAM;;AAGnC,QAAO;;AAGT,SAAgB,8BAA8B,QAAQ,KAAK,KAAK,EAAU;AACxE,QAAO,IAAI,KAAK,MAAM,CAAC,aAAa,CAAC,WAAW,KAAK,IAAI;;AAG3D,SAAS,+BAA+B,KAAqB;CAC3D,MAAM,CAAC,UAAU,YAAY,IAAI,MAAM,IAAI;AAC3C,KAAI,CAAC,YAAY,CAAC,SAChB,QAAO;AAET,QAAO,GAAG,SAAS,GAAG,SAAS,QAAQ,MAAM,IAAI;;AAGnD,SAAgB,6BACd,UACA,QACe;CACf,MAAM,SAAS,IAAI,OAAO;CAC1B,MAAM,QAAQ,SAAS,YAAY,OAAO;AAC1C,KAAI,QAAQ,EACV,QAAO;CAET,MAAM,MAAM,SAAS,MAAM,QAAQ,OAAO,OAAO;AACjD,KAAI,CAAC,OAAO,CAAC,qBAAqB,KAAK,IAAI,CACzC,QAAO;CAET,MAAM,YAAY,KAAK,MAAM,+BAA+B,IAAI,CAAC;AACjE,QAAO,OAAO,SAAS,UAAU,GAAG,YAAY;;;;AA/G5C,wBAAuB;AACvB,uCACJ"}
@@ -1,54 +0,0 @@
1
- import type { AgentMessage } from '@earendil-works/pi-agent-core';
2
- import { SessionManager } from '@earendil-works/pi-coding-agent';
3
- import type { TranscriptCompactionRecord } from '../transcript-format.js';
4
- import { type TranscriptStoredRow, type XopcTranscriptContextEntry } from '../session-context-for-llm.js';
5
- /** Custom JSONL entry for persisted-only context rows. */
6
- export declare const XOPC_CONTEXT_CUSTOM_TYPE = "xopc:transcript-row";
7
- /**
8
- * Persist the in-memory {@link SessionManager} graph with an atomic rewrite of the JSONL file.
9
- * Ensures durability even when pi would otherwise defer `_persist` until the first assistant message.
10
- */
11
- export declare function writeAtomicSessionManagerSnapshot(sessionManager: SessionManager, absPath: string): Promise<void>;
12
- /**
13
- * Serialize transcript rows to a pi-coding-agent JSONL file (linear chain).
14
- * Always rewrites the file; guarded by a cross-process transcript lock.
15
- */
16
- export declare function writeTranscriptJsonl(params: {
17
- absPath: string;
18
- sessionId: string;
19
- cwd: string;
20
- rows: TranscriptStoredRow[];
21
- appendCompaction?: TranscriptCompactionRecord;
22
- }): Promise<void>;
23
- /**
24
- * Persist merged transcript rows with append optimization (strict prefix → tail append).
25
- * Intended for hot paths that already merged prior rows with new LLM state.
26
- */
27
- export declare function persistMergedTranscriptRows(params: {
28
- absPath: string;
29
- sessionId: string;
30
- cwd: string;
31
- rows: TranscriptStoredRow[];
32
- appendCompaction?: TranscriptCompactionRecord;
33
- }): Promise<void>;
34
- /**
35
- * Load full transcript rows from a JSONL path (pi session file).
36
- */
37
- /**
38
- * Append one `xopc:transcript-row` context entry via pi SessionManager (OpenClaw-aligned append path).
39
- */
40
- /** Append one LLM message row via pi SessionManager (slash receipts, goals, etc.). */
41
- export declare function appendPiTranscriptMessage(params: {
42
- absPath: string;
43
- cwd: string;
44
- message: import('@earendil-works/pi-agent-core').AgentMessage;
45
- sessionKey?: string;
46
- }): Promise<void>;
47
- export declare function appendPiTranscriptContextEntry(params: {
48
- absPath: string;
49
- cwd: string;
50
- entry: XopcTranscriptContextEntry;
51
- sessionKey?: string;
52
- }): Promise<void>;
53
- export declare function readTranscriptRowsFromFile(absPath: string): Promise<TranscriptStoredRow[]>;
54
- export declare function rowsToLlmMessages(rows: TranscriptStoredRow[]): AgentMessage[];
@@ -1,236 +0,0 @@
1
- import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
2
- import { loadEntriesFromFile } from "./load-jsonl-entries.js";
3
- import { withTranscriptFileLock } from "./transcript-file-lock.js";
4
- import { emitSessionTranscriptUpdate } from "../transcript-events.js";
5
- import { buildSessionContextForLlm, isTranscriptContextEntry } from "../session-context-for-llm.js";
6
- import path from "node:path";
7
- import { existsSync } from "node:fs";
8
- import { randomUUID } from "node:crypto";
9
- import { CURRENT_SESSION_VERSION, SessionManager } from "@earendil-works/pi-coding-agent";
10
- //#region src/session/parity/jsonl-transcript-io.ts
11
- init_write_file_atomic();
12
- /** Custom JSONL entry for persisted-only context rows. */
13
- const XOPC_CONTEXT_CUSTOM_TYPE = "xopc:transcript-row";
14
- function generateShortId(byId) {
15
- for (let i = 0; i < 100; i++) {
16
- const id = randomUUID().slice(0, 8);
17
- if (!byId.has(id)) return id;
18
- }
19
- return randomUUID();
20
- }
21
- function contextRowToCustomEntry(row, parentId, byId) {
22
- return {
23
- type: "custom",
24
- customType: XOPC_CONTEXT_CUSTOM_TYPE,
25
- id: generateShortId(byId),
26
- parentId,
27
- timestamp: row.createdAt ?? (/* @__PURE__ */ new Date()).toISOString(),
28
- data: {
29
- kind: "context",
30
- id: row.id,
31
- text: row.text,
32
- data: row.data,
33
- createdAt: row.createdAt
34
- }
35
- };
36
- }
37
- function compactionRecordToEntry(rec, parentId, byId) {
38
- return {
39
- type: "compaction",
40
- id: generateShortId(byId),
41
- parentId,
42
- timestamp: rec.at,
43
- summary: rec.summary,
44
- firstKeptEntryId: String(rec.firstKeptIndex),
45
- tokensBefore: rec.tokensBefore,
46
- details: {
47
- tokensAfter: rec.tokensAfter,
48
- xopc: true
49
- },
50
- fromHook: true
51
- };
52
- }
53
- function agentMessageToEntry(msg, parentId, byId) {
54
- return {
55
- type: "message",
56
- id: generateShortId(byId),
57
- parentId,
58
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
59
- message: msg
60
- };
61
- }
62
- function transcriptRowsStrictPrefix(prev, merged) {
63
- if (merged.length < prev.length) return false;
64
- for (let i = 0; i < prev.length; i++) if (JSON.stringify(prev[i]) !== JSON.stringify(merged[i])) return false;
65
- return true;
66
- }
67
- async function writeTranscriptJsonlUnlocked(params) {
68
- const byId = /* @__PURE__ */ new Set();
69
- const lines = [];
70
- const header = {
71
- type: "session",
72
- version: CURRENT_SESSION_VERSION,
73
- id: params.sessionId,
74
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
75
- cwd: params.cwd
76
- };
77
- lines.push(JSON.stringify(header));
78
- let parentId = null;
79
- for (const row of params.rows) if (isTranscriptContextEntry(row)) {
80
- const e = contextRowToCustomEntry(row, parentId, byId);
81
- byId.add(e.id);
82
- lines.push(JSON.stringify(e));
83
- parentId = e.id;
84
- } else {
85
- const e = agentMessageToEntry(row, parentId, byId);
86
- byId.add(e.id);
87
- lines.push(JSON.stringify(e));
88
- parentId = e.id;
89
- }
90
- if (params.appendCompaction) {
91
- const e = compactionRecordToEntry(params.appendCompaction, parentId, byId);
92
- byId.add(e.id);
93
- lines.push(JSON.stringify(e));
94
- }
95
- const body = `${lines.join("\n")}\n`;
96
- await writeTextAtomic(params.absPath, body);
97
- }
98
- /**
99
- * Map the current session branch to the same {@link TranscriptStoredRow} projection as
100
- * {@link readTranscriptRowsFromFile} (messages + xopc context custom rows only).
101
- */
102
- function branchPathToTranscriptRows(branch) {
103
- const rows = [];
104
- for (const e of branch) {
105
- if (e.type === "message" && "message" in e && e.message) {
106
- rows.push(e.message);
107
- continue;
108
- }
109
- if (e.type === "custom") {
110
- const ctx = customEntryToContextRow(e);
111
- if (ctx) rows.push(ctx);
112
- }
113
- }
114
- return rows;
115
- }
116
- /**
117
- * Persist the in-memory {@link SessionManager} graph with an atomic rewrite of the JSONL file.
118
- * Ensures durability even when pi would otherwise defer `_persist` until the first assistant message.
119
- */
120
- async function writeAtomicSessionManagerSnapshot(sessionManager, absPath) {
121
- const header = sessionManager.getHeader();
122
- if (!header || header.type !== "session") throw new Error("SessionManager: missing session header for snapshot");
123
- const entries = sessionManager.getEntries();
124
- await writeTextAtomic(absPath, `${JSON.stringify(header)}\n${entries.map((e) => JSON.stringify(e)).join("\n")}\n`);
125
- }
126
- /**
127
- * Serialize transcript rows to a pi-coding-agent JSONL file (linear chain).
128
- * Always rewrites the file; guarded by a cross-process transcript lock.
129
- */
130
- async function writeTranscriptJsonl(params) {
131
- await withTranscriptFileLock(params.absPath, async () => {
132
- await writeTranscriptJsonlUnlocked(params);
133
- });
134
- }
135
- /**
136
- * Persist merged transcript rows with append optimization (strict prefix → tail append).
137
- * Intended for hot paths that already merged prior rows with new LLM state.
138
- */
139
- async function persistMergedTranscriptRows(params) {
140
- await withTranscriptFileLock(params.absPath, async () => {
141
- const prev = existsSync(params.absPath) ? await readTranscriptRowsFromFile(params.absPath) : [];
142
- if (params.appendCompaction || params.rows.length <= prev.length || !transcriptRowsStrictPrefix(prev, params.rows)) {
143
- await writeTranscriptJsonlUnlocked(params);
144
- return;
145
- }
146
- const sessionDir = path.dirname(params.absPath);
147
- const sm = SessionManager.open(params.absPath, sessionDir, params.cwd);
148
- const branchRows = branchPathToTranscriptRows(sm.getBranch());
149
- if (JSON.stringify(branchRows) !== JSON.stringify(prev)) {
150
- await writeTranscriptJsonlUnlocked(params);
151
- return;
152
- }
153
- const tail = params.rows.slice(prev.length);
154
- for (const row of tail) if (isTranscriptContextEntry(row)) sm.appendCustomEntry(XOPC_CONTEXT_CUSTOM_TYPE, {
155
- kind: "context",
156
- id: row.id,
157
- text: row.text,
158
- data: row.data,
159
- createdAt: row.createdAt
160
- });
161
- else sm.appendMessage(row);
162
- await writeAtomicSessionManagerSnapshot(sm, params.absPath);
163
- });
164
- }
165
- function customEntryToContextRow(entry) {
166
- if (entry.customType !== "xopc:transcript-row" || !entry.data || typeof entry.data !== "object") return null;
167
- const d = entry.data;
168
- if (d.kind !== "context") return null;
169
- return {
170
- kind: "context",
171
- id: typeof d.id === "string" ? d.id : void 0,
172
- text: typeof d.text === "string" ? d.text : void 0,
173
- data: d.data && typeof d.data === "object" && !Array.isArray(d.data) ? d.data : void 0,
174
- createdAt: typeof d.createdAt === "string" ? d.createdAt : entry.timestamp
175
- };
176
- }
177
- /**
178
- * Load full transcript rows from a JSONL path (pi session file).
179
- */
180
- /**
181
- * Append one `xopc:transcript-row` context entry via pi SessionManager (OpenClaw-aligned append path).
182
- */
183
- /** Append one LLM message row via pi SessionManager (slash receipts, goals, etc.). */
184
- async function appendPiTranscriptMessage(params) {
185
- await withTranscriptFileLock(params.absPath, async () => {
186
- const sessionDir = path.dirname(params.absPath);
187
- const sm = SessionManager.open(params.absPath, sessionDir, params.cwd);
188
- sm.appendMessage(params.message);
189
- await writeAtomicSessionManagerSnapshot(sm, params.absPath);
190
- emitSessionTranscriptUpdate({
191
- sessionFile: params.absPath,
192
- sessionKey: params.sessionKey
193
- });
194
- });
195
- }
196
- async function appendPiTranscriptContextEntry(params) {
197
- await withTranscriptFileLock(params.absPath, async () => {
198
- const sessionDir = path.dirname(params.absPath);
199
- const sm = SessionManager.open(params.absPath, sessionDir, params.cwd);
200
- sm.appendCustomEntry(XOPC_CONTEXT_CUSTOM_TYPE, {
201
- kind: "context",
202
- id: params.entry.id,
203
- text: params.entry.text,
204
- data: params.entry.data,
205
- createdAt: params.entry.createdAt ?? (/* @__PURE__ */ new Date()).toISOString()
206
- });
207
- await writeAtomicSessionManagerSnapshot(sm, params.absPath);
208
- emitSessionTranscriptUpdate({
209
- sessionFile: params.absPath,
210
- sessionKey: params.sessionKey
211
- });
212
- });
213
- }
214
- async function readTranscriptRowsFromFile(absPath) {
215
- const entries = loadEntriesFromFile(absPath);
216
- const rows = [];
217
- for (const e of entries) {
218
- if (e.type === "session") continue;
219
- if (e.type === "message" && "message" in e && e.message) {
220
- rows.push(e.message);
221
- continue;
222
- }
223
- if (e.type === "custom") {
224
- const ctx = customEntryToContextRow(e);
225
- if (ctx) rows.push(ctx);
226
- }
227
- }
228
- return rows;
229
- }
230
- function rowsToLlmMessages(rows) {
231
- return buildSessionContextForLlm(rows);
232
- }
233
- //#endregion
234
- export { XOPC_CONTEXT_CUSTOM_TYPE, appendPiTranscriptContextEntry, appendPiTranscriptMessage, persistMergedTranscriptRows, readTranscriptRowsFromFile, rowsToLlmMessages, writeAtomicSessionManagerSnapshot, writeTranscriptJsonl };
235
-
236
- //# sourceMappingURL=jsonl-transcript-io.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jsonl-transcript-io.js","names":[],"sources":["../../../../src/session/parity/jsonl-transcript-io.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\n\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport {\n CURRENT_SESSION_VERSION,\n type CompactionEntry,\n type CustomEntry,\n type SessionEntry,\n type SessionMessageEntry,\n SessionManager,\n} from '@earendil-works/pi-coding-agent';\n\nimport { loadEntriesFromFile } from './load-jsonl-entries.js';\nimport { withTranscriptFileLock } from './transcript-file-lock.js';\n\nimport { emitSessionTranscriptUpdate } from '../transcript-events.js';\nimport { writeTextAtomic } from '../../infra/write-file-atomic.js';\nimport type { TranscriptCompactionRecord } from '../transcript-format.js';\nimport {\n buildSessionContextForLlm,\n isTranscriptContextEntry,\n type TranscriptStoredRow,\n type XopcTranscriptContextEntry,\n} from '../session-context-for-llm.js';\n\n/** Custom JSONL entry for persisted-only context rows. */\nexport const XOPC_CONTEXT_CUSTOM_TYPE = 'xopc:transcript-row';\n\nfunction generateShortId(byId: Set<string>): string {\n for (let i = 0; i < 100; i++) {\n const id = randomUUID().slice(0, 8);\n if (!byId.has(id)) {\n return id;\n }\n }\n return randomUUID();\n}\n\nfunction contextRowToCustomEntry(\n row: XopcTranscriptContextEntry,\n parentId: string | null,\n byId: Set<string>,\n): CustomEntry {\n return {\n type: 'custom',\n customType: XOPC_CONTEXT_CUSTOM_TYPE,\n id: generateShortId(byId),\n parentId,\n timestamp: row.createdAt ?? new Date().toISOString(),\n data: {\n kind: 'context',\n id: row.id,\n text: row.text,\n data: row.data,\n createdAt: row.createdAt,\n },\n };\n}\n\nfunction compactionRecordToEntry(\n rec: TranscriptCompactionRecord,\n parentId: string | null,\n byId: Set<string>,\n): CompactionEntry {\n return {\n type: 'compaction',\n id: generateShortId(byId),\n parentId,\n timestamp: rec.at,\n summary: rec.summary,\n firstKeptEntryId: String(rec.firstKeptIndex),\n tokensBefore: rec.tokensBefore,\n details: { tokensAfter: rec.tokensAfter, xopc: true },\n fromHook: true,\n };\n}\n\nfunction agentMessageToEntry(\n msg: AgentMessage,\n parentId: string | null,\n byId: Set<string>,\n): SessionMessageEntry {\n return {\n type: 'message',\n id: generateShortId(byId),\n parentId,\n timestamp: new Date().toISOString(),\n message: msg,\n };\n}\n\nfunction transcriptRowsStrictPrefix(prev: TranscriptStoredRow[], merged: TranscriptStoredRow[]): boolean {\n if (merged.length < prev.length) {\n return false;\n }\n for (let i = 0; i < prev.length; i++) {\n if (JSON.stringify(prev[i]) !== JSON.stringify(merged[i])) {\n return false;\n }\n }\n return true;\n}\n\nasync function writeTranscriptJsonlUnlocked(params: {\n absPath: string;\n sessionId: string;\n cwd: string;\n rows: TranscriptStoredRow[];\n appendCompaction?: TranscriptCompactionRecord;\n}): Promise<void> {\n const byId = new Set<string>();\n const lines: string[] = [];\n const header = {\n type: 'session' as const,\n version: CURRENT_SESSION_VERSION,\n id: params.sessionId,\n timestamp: new Date().toISOString(),\n cwd: params.cwd,\n };\n lines.push(JSON.stringify(header));\n\n let parentId: string | null = null;\n for (const row of params.rows) {\n if (isTranscriptContextEntry(row)) {\n const e = contextRowToCustomEntry(row, parentId, byId);\n byId.add(e.id);\n lines.push(JSON.stringify(e));\n parentId = e.id;\n } else {\n const e = agentMessageToEntry(row, parentId, byId);\n byId.add(e.id);\n lines.push(JSON.stringify(e));\n parentId = e.id;\n }\n }\n\n if (params.appendCompaction) {\n const e = compactionRecordToEntry(params.appendCompaction, parentId, byId);\n byId.add(e.id);\n lines.push(JSON.stringify(e));\n }\n\n const body = `${lines.join('\\n')}\\n`;\n await writeTextAtomic(params.absPath, body);\n}\n\n/**\n * Map the current session branch to the same {@link TranscriptStoredRow} projection as\n * {@link readTranscriptRowsFromFile} (messages + xopc context custom rows only).\n */\nfunction branchPathToTranscriptRows(branch: SessionEntry[]): TranscriptStoredRow[] {\n const rows: TranscriptStoredRow[] = [];\n for (const e of branch) {\n if (e.type === 'message' && 'message' in e && e.message) {\n rows.push(e.message as AgentMessage);\n continue;\n }\n if (e.type === 'custom') {\n const ctx = customEntryToContextRow(e as CustomEntry);\n if (ctx) {\n rows.push(ctx);\n }\n }\n }\n return rows;\n}\n\n/**\n * Persist the in-memory {@link SessionManager} graph with an atomic rewrite of the JSONL file.\n * Ensures durability even when pi would otherwise defer `_persist` until the first assistant message.\n */\nexport async function writeAtomicSessionManagerSnapshot(\n sessionManager: SessionManager,\n absPath: string,\n): Promise<void> {\n const header = sessionManager.getHeader();\n if (!header || header.type !== 'session') {\n throw new Error('SessionManager: missing session header for snapshot');\n }\n const entries = sessionManager.getEntries();\n const body = `${JSON.stringify(header)}\\n${entries.map((e) => JSON.stringify(e)).join('\\n')}\\n`;\n await writeTextAtomic(absPath, body);\n}\n\n/**\n * Serialize transcript rows to a pi-coding-agent JSONL file (linear chain).\n * Always rewrites the file; guarded by a cross-process transcript lock.\n */\nexport async function writeTranscriptJsonl(params: {\n absPath: string;\n sessionId: string;\n cwd: string;\n rows: TranscriptStoredRow[];\n appendCompaction?: TranscriptCompactionRecord;\n}): Promise<void> {\n await withTranscriptFileLock(params.absPath, async () => {\n await writeTranscriptJsonlUnlocked(params);\n });\n}\n\n/**\n * Persist merged transcript rows with append optimization (strict prefix → tail append).\n * Intended for hot paths that already merged prior rows with new LLM state.\n */\nexport async function persistMergedTranscriptRows(params: {\n absPath: string;\n sessionId: string;\n cwd: string;\n rows: TranscriptStoredRow[];\n appendCompaction?: TranscriptCompactionRecord;\n}): Promise<void> {\n await withTranscriptFileLock(params.absPath, async () => {\n const prev = existsSync(params.absPath) ? await readTranscriptRowsFromFile(params.absPath) : [];\n if (\n params.appendCompaction ||\n params.rows.length <= prev.length ||\n !transcriptRowsStrictPrefix(prev, params.rows)\n ) {\n await writeTranscriptJsonlUnlocked(params);\n return;\n }\n const sessionDir = path.dirname(params.absPath);\n const sm = SessionManager.open(params.absPath, sessionDir, params.cwd);\n const branchRows = branchPathToTranscriptRows(sm.getBranch());\n if (JSON.stringify(branchRows) !== JSON.stringify(prev)) {\n await writeTranscriptJsonlUnlocked(params);\n return;\n }\n const tail = params.rows.slice(prev.length);\n for (const row of tail) {\n if (isTranscriptContextEntry(row)) {\n sm.appendCustomEntry(XOPC_CONTEXT_CUSTOM_TYPE, {\n kind: 'context',\n id: row.id,\n text: row.text,\n data: row.data,\n createdAt: row.createdAt,\n });\n } else {\n sm.appendMessage(row as Parameters<SessionManager['appendMessage']>[0]);\n }\n }\n await writeAtomicSessionManagerSnapshot(sm, params.absPath);\n });\n}\n\nfunction customEntryToContextRow(entry: CustomEntry): XopcTranscriptContextEntry | null {\n if (entry.customType !== XOPC_CONTEXT_CUSTOM_TYPE || !entry.data || typeof entry.data !== 'object') {\n return null;\n }\n const d = entry.data as Record<string, unknown>;\n if (d.kind !== 'context') {\n return null;\n }\n return {\n kind: 'context',\n id: typeof d.id === 'string' ? d.id : undefined,\n text: typeof d.text === 'string' ? d.text : undefined,\n data:\n d.data && typeof d.data === 'object' && !Array.isArray(d.data)\n ? (d.data as Record<string, unknown>)\n : undefined,\n createdAt: typeof d.createdAt === 'string' ? d.createdAt : entry.timestamp,\n };\n}\n\n/**\n * Load full transcript rows from a JSONL path (pi session file).\n */\n/**\n * Append one `xopc:transcript-row` context entry via pi SessionManager (OpenClaw-aligned append path).\n */\n/** Append one LLM message row via pi SessionManager (slash receipts, goals, etc.). */\nexport async function appendPiTranscriptMessage(params: {\n absPath: string;\n cwd: string;\n message: import('@earendil-works/pi-agent-core').AgentMessage;\n sessionKey?: string;\n}): Promise<void> {\n await withTranscriptFileLock(params.absPath, async () => {\n const sessionDir = path.dirname(params.absPath);\n const sm = SessionManager.open(params.absPath, sessionDir, params.cwd);\n sm.appendMessage(params.message as Parameters<SessionManager['appendMessage']>[0]);\n await writeAtomicSessionManagerSnapshot(sm, params.absPath);\n emitSessionTranscriptUpdate({\n sessionFile: params.absPath,\n sessionKey: params.sessionKey,\n });\n });\n}\n\nexport async function appendPiTranscriptContextEntry(params: {\n absPath: string;\n cwd: string;\n entry: XopcTranscriptContextEntry;\n sessionKey?: string;\n}): Promise<void> {\n await withTranscriptFileLock(params.absPath, async () => {\n const sessionDir = path.dirname(params.absPath);\n const sm = SessionManager.open(params.absPath, sessionDir, params.cwd);\n sm.appendCustomEntry(XOPC_CONTEXT_CUSTOM_TYPE, {\n kind: 'context',\n id: params.entry.id,\n text: params.entry.text,\n data: params.entry.data,\n createdAt: params.entry.createdAt ?? new Date().toISOString(),\n });\n await writeAtomicSessionManagerSnapshot(sm, params.absPath);\n emitSessionTranscriptUpdate({\n sessionFile: params.absPath,\n sessionKey: params.sessionKey,\n });\n });\n}\n\nexport async function readTranscriptRowsFromFile(absPath: string): Promise<TranscriptStoredRow[]> {\n const entries = loadEntriesFromFile(absPath);\n const rows: TranscriptStoredRow[] = [];\n for (const e of entries) {\n if (e.type === 'session') {\n continue;\n }\n if (e.type === 'message' && 'message' in e && e.message) {\n rows.push(e.message as AgentMessage);\n continue;\n }\n if (e.type === 'custom') {\n const ctx = customEntryToContextRow(e as CustomEntry);\n if (ctx) {\n rows.push(ctx);\n }\n }\n }\n return rows;\n}\n\nexport function rowsToLlmMessages(rows: TranscriptStoredRow[]): AgentMessage[] {\n return buildSessionContextForLlm(rows);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"load-jsonl-entries.js","names":[],"sources":["../../../../src/session/parity/load-jsonl-entries.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\n\nimport type { FileEntry } from '@earendil-works/pi-coding-agent';\n\n/** Same semantics as pi-coding-agent `loadEntriesFromFile` (package does not export it from the root). */\nexport function loadEntriesFromFile(filePath: string): FileEntry[] {\n if (!existsSync(filePath)) {\n return [];\n }\n const content = readFileSync(filePath, 'utf8');\n const entries: FileEntry[] = [];\n for (const line of content.trim().split('\\n')) {\n if (!line.trim()) {\n continue;\n }\n try {\n entries.push(JSON.parse(line) as FileEntry);\n } catch {\n // Skip malformed lines (matches upstream)\n }\n }\n if (entries.length === 0) {\n return entries;\n }\n const header = entries[0];\n if (header.type !== 'session' || typeof (header as { id?: unknown }).id !== 'string') {\n return [];\n }\n return entries;\n}\n"],"mappings":";;;AAKA,SAAgB,oBAAoB,UAA+B;AACjE,KAAI,CAAC,WAAW,SAAS,CACvB,QAAO,EAAE;CAEX,MAAM,UAAU,aAAa,UAAU,OAAO;CAC9C,MAAM,UAAuB,EAAE;AAC/B,MAAK,MAAM,QAAQ,QAAQ,MAAM,CAAC,MAAM,KAAK,EAAE;AAC7C,MAAI,CAAC,KAAK,MAAM,CACd;AAEF,MAAI;AACF,WAAQ,KAAK,KAAK,MAAM,KAAK,CAAc;UACrC;;AAIV,KAAI,QAAQ,WAAW,EACrB,QAAO;CAET,MAAM,SAAS,QAAQ;AACvB,KAAI,OAAO,SAAS,aAAa,OAAQ,OAA4B,OAAO,SAC1E,QAAO,EAAE;AAEX,QAAO"}
@@ -1,18 +0,0 @@
1
- import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
2
- import { init_artifacts, isCompactionCheckpointTranscriptFileName } from "./artifacts.js";
3
- //#region src/session/parity/session-id.ts
4
- function validateSessionId(sessionId) {
5
- const trimmed = sessionId.trim();
6
- if (!SAFE_SESSION_ID_RE.test(trimmed) || isCompactionCheckpointTranscriptFileName(`${trimmed}.jsonl`)) throw new Error(`Invalid session ID: ${sessionId}`);
7
- return trimmed;
8
- }
9
- var SAFE_SESSION_ID_RE;
10
- var init_session_id = __esmMin((() => {
11
- init_artifacts();
12
- SAFE_SESSION_ID_RE = /^[a-z0-9][a-z0-9._-]{0,127}$/i;
13
- }));
14
- //#endregion
15
- init_session_id();
16
- export { SAFE_SESSION_ID_RE, init_session_id, validateSessionId };
17
-
18
- //# sourceMappingURL=session-id.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-id.js","names":[],"sources":["../../../../src/session/parity/session-id.ts"],"sourcesContent":["import { isCompactionCheckpointTranscriptFileName } from './artifacts.js';\n\n/** Same pattern as OpenClaw `config/sessions/paths.ts`. */\nexport const SAFE_SESSION_ID_RE = /^[a-z0-9][a-z0-9._-]{0,127}$/i;\n\nexport function validateSessionId(sessionId: string): string {\n const trimmed = sessionId.trim();\n if (\n !SAFE_SESSION_ID_RE.test(trimmed) ||\n isCompactionCheckpointTranscriptFileName(`${trimmed}.jsonl`)\n ) {\n throw new Error(`Invalid session ID: ${sessionId}`);\n }\n return trimmed;\n}\n"],"mappings":";;;AAKA,SAAgB,kBAAkB,WAA2B;CAC3D,MAAM,UAAU,UAAU,MAAM;AAChC,KACE,CAAC,mBAAmB,KAAK,QAAQ,IACjC,yCAAyC,GAAG,QAAQ,QAAQ,CAE5D,OAAM,IAAI,MAAM,uBAAuB,YAAY;AAErD,QAAO;;;;iBAbiE;AAG7D,sBAAqB"}
@@ -1,14 +0,0 @@
1
- declare let writeStats: {
2
- performed: number;
3
- skippedUnchanged: number;
4
- };
5
- export declare function getSessionsJsonWriteStats(): Readonly<typeof writeStats>;
6
- export declare function resetSessionsJsonCacheForTest(): void;
7
- export declare function invalidateSessionsJsonCache(storePath: string): void;
8
- export declare function readSessionsJsonCached(storePath: string): Promise<{
9
- store: Record<string, unknown>;
10
- serialized: string;
11
- }>;
12
- export declare function commitSessionsJsonWrite(storePath: string, store: Record<string, unknown>, serialized: string): boolean;
13
- export declare function noteSessionsJsonWritten(storePath: string, serialized: string, store: Record<string, unknown>): void;
14
- export {};
@@ -1,98 +0,0 @@
1
- import { readSessionsJsonFileRaw } from "./sessions-json-file-read.js";
2
- import { existsSync } from "node:fs";
3
- import { stat } from "node:fs/promises";
4
- //#region src/session/parity/sessions-json-cache.ts
5
- const readCache = /* @__PURE__ */ new Map();
6
- const serializedWriteCache = /* @__PURE__ */ new Map();
7
- let writeStats = {
8
- performed: 0,
9
- skippedUnchanged: 0
10
- };
11
- function getSessionsJsonWriteStats() {
12
- return writeStats;
13
- }
14
- function resetSessionsJsonCacheForTest() {
15
- readCache.clear();
16
- serializedWriteCache.clear();
17
- writeStats = {
18
- performed: 0,
19
- skippedUnchanged: 0
20
- };
21
- }
22
- function invalidateSessionsJsonCache(storePath) {
23
- readCache.delete(storePath);
24
- serializedWriteCache.delete(storePath);
25
- }
26
- function serializeSessionsJson(store) {
27
- return `${JSON.stringify(store, null, 2)}\n`;
28
- }
29
- async function readSessionsJsonCached(storePath) {
30
- if (!existsSync(storePath)) return {
31
- store: {},
32
- serialized: "{}\n"
33
- };
34
- let mtimeMs = 0;
35
- let sizeBytes = 0;
36
- try {
37
- const st = await stat(storePath);
38
- mtimeMs = st.mtimeMs;
39
- sizeBytes = st.size;
40
- } catch {
41
- return {
42
- store: {},
43
- serialized: "{}\n"
44
- };
45
- }
46
- const cached = readCache.get(storePath);
47
- if (cached && cached.mtimeMs === mtimeMs && cached.sizeBytes === sizeBytes) return {
48
- store: structuredClone(cached.parsed),
49
- serialized: cached.serialized
50
- };
51
- const store = await readSessionsJsonFileRaw(storePath);
52
- const serialized = serializeSessionsJson(store);
53
- readCache.set(storePath, {
54
- mtimeMs,
55
- sizeBytes,
56
- parsed: structuredClone(store),
57
- serialized
58
- });
59
- serializedWriteCache.set(storePath, serialized);
60
- return {
61
- store: structuredClone(store),
62
- serialized
63
- };
64
- }
65
- function commitSessionsJsonWrite(storePath, store, serialized) {
66
- if (serializedWriteCache.get(storePath) === serialized) {
67
- writeStats.skippedUnchanged += 1;
68
- readCache.set(storePath, {
69
- mtimeMs: readCache.get(storePath)?.mtimeMs ?? Date.now(),
70
- sizeBytes: serialized.length,
71
- parsed: structuredClone(store),
72
- serialized
73
- });
74
- return false;
75
- }
76
- serializedWriteCache.set(storePath, serialized);
77
- writeStats.performed += 1;
78
- readCache.set(storePath, {
79
- mtimeMs: Date.now(),
80
- sizeBytes: serialized.length,
81
- parsed: structuredClone(store),
82
- serialized
83
- });
84
- return true;
85
- }
86
- function noteSessionsJsonWritten(storePath, serialized, store) {
87
- serializedWriteCache.set(storePath, serialized);
88
- readCache.set(storePath, {
89
- mtimeMs: Date.now(),
90
- sizeBytes: serialized.length,
91
- parsed: structuredClone(store),
92
- serialized
93
- });
94
- }
95
- //#endregion
96
- export { commitSessionsJsonWrite, getSessionsJsonWriteStats, invalidateSessionsJsonCache, noteSessionsJsonWritten, readSessionsJsonCached, resetSessionsJsonCacheForTest };
97
-
98
- //# sourceMappingURL=sessions-json-cache.js.map