@xopcai/xopc 0.0.95 → 0.0.97

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 (442) 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-B_YUvNi6.js} +2 -2
  19. package/dist/gateway/static/root/assets/{apps-page-Mi9mMIZ1.js → apps-page-BmwG5aur.js} +1 -1
  20. package/dist/gateway/static/root/assets/{channels-settings-BrdyC101.js → channels-settings-BiwkeKPb.js} +1 -1
  21. package/dist/gateway/static/root/assets/{channels-status-swr-D55Bu0nn.js → channels-status-swr-ChyN473C.js} +1 -1
  22. package/dist/gateway/static/root/assets/{cron-api-CPpx2l-E.js → cron-api-CvSifIfJ.js} +1 -1
  23. package/dist/gateway/static/root/assets/{cron-page-Bx2jB0YN.js → cron-page-BDqTDFy6.js} +1 -1
  24. package/dist/gateway/static/root/assets/{dist-D_AiG_Kg.js → dist-DxsUrjpy.js} +1 -1
  25. package/dist/gateway/static/root/assets/{extension-debug-page-6ieHsxRE.js → extension-debug-page-DV_Av5Jq.js} +1 -1
  26. package/dist/gateway/static/root/assets/{extension-page-B8nywHRO.js → extension-page-CwZwRhWw.js} +1 -1
  27. package/dist/gateway/static/root/assets/{extension-settings-page-DrskdEIV.js → extension-settings-page-Bb7TR1Se.js} +1 -1
  28. package/dist/gateway/static/root/assets/{fetch-B0aeeY0q.js → fetch-BLLOP2CM.js} +1 -1
  29. package/dist/gateway/static/root/assets/{field-primitives--9ooY8Xl.js → field-primitives-CyqVu1QR.js} +1 -1
  30. package/dist/gateway/static/root/assets/{heartbeat-config-api-DUZ_W1w-.js → heartbeat-config-api-Cd4M1eHt.js} +1 -1
  31. package/dist/gateway/static/root/assets/{index-Dj9FuxCm.js → index-0tS9lV85.js} +74 -74
  32. package/dist/gateway/static/root/assets/index-BJDmBCSl.css +1 -0
  33. package/dist/gateway/static/root/assets/{logs-page-CaXqhpKf.js → logs-page-BsAOSowN.js} +1 -1
  34. package/dist/gateway/static/root/assets/{note-detail-page-B91pLkEI.css → note-detail-page-D4ZIVQbk.css} +1 -1
  35. package/dist/gateway/static/root/assets/{note-detail-page-DYzym2B0.js → note-detail-page-Dlxoy6Ap.js} +54 -53
  36. package/dist/gateway/static/root/assets/{note-time-B-vSi2dR.js → note-time-B-r8yTpQ.js} +1 -1
  37. package/dist/gateway/static/root/assets/{notes-page-BkhWdGiT.js → notes-page-CHFcyqYW.js} +1 -1
  38. package/dist/gateway/static/root/assets/{sessions-page-53YFokoe.js → sessions-page-Ctu0kgt7.js} +1 -1
  39. package/dist/gateway/static/root/assets/{settings-advanced-gate-BaZmaklx.js → settings-advanced-gate-Dh0TyOOg.js} +1 -1
  40. package/dist/gateway/static/root/assets/{settings-form-section-DIJPKpTR.js → settings-form-section-DXMCEW1d.js} +1 -1
  41. package/dist/gateway/static/root/assets/{settings-page-Dvb230FF.js → settings-page-CIkZ7233.js} +1 -1
  42. package/dist/gateway/static/root/assets/{share-preview-page-CRyjTAG6.js → share-preview-page-7RV65xhJ.js} +1 -1
  43. package/dist/gateway/static/root/assets/{skills-page-C5ZJbfAe.js → skills-page-D_Az1SlU.js} +1 -1
  44. package/dist/gateway/static/root/assets/{theme-store-Cg_SuBw0.js → theme-store-e2q2yjs4.js} +1 -1
  45. package/dist/gateway/static/root/assets/url-DpFBIyN9.js +3 -0
  46. package/dist/gateway/static/root/assets/{utils-lMYoWhqo.js → utils-OA_b1q0Q.js} +1 -1
  47. package/dist/gateway/static/root/assets/{voice-api-key-field-Dda2pcUU.js → voice-api-key-field-SJml1hAt.js} +1 -1
  48. package/dist/gateway/static/root/assets/{workflow-page.utils-KIladUrU.js → workflow-page.utils-D90VVCzC.js} +1 -1
  49. package/dist/gateway/static/root/assets/{workflows-page-BTis4Z7Y.js → workflows-page-y7Btji0J.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 +12 -8
  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 +2 -0
  58. package/dist/src/agent/bootstrap/bootstrap-cache.js +10 -1
  59. package/dist/src/agent/bootstrap/bootstrap-cache.js.map +1 -1
  60. package/dist/src/agent/bootstrap/bootstrap-files.d.ts +2 -1
  61. package/dist/src/agent/bootstrap/bootstrap-files.js +34 -12
  62. package/dist/src/agent/bootstrap/bootstrap-files.js.map +1 -1
  63. package/dist/src/agent/bootstrap/load-bootstrap-files.d.ts +1 -2
  64. package/dist/src/agent/bootstrap/load-bootstrap-files.js +6 -12
  65. package/dist/src/agent/bootstrap/load-bootstrap-files.js.map +1 -1
  66. package/dist/src/agent/bootstrap/types.d.ts +5 -5
  67. package/dist/src/agent/context/workspace-seed.js +6 -6
  68. package/dist/src/agent/context/workspace-seed.js.map +1 -1
  69. package/dist/src/agent/context/workspace-state.d.ts +20 -0
  70. package/dist/src/agent/context/workspace-state.js +57 -0
  71. package/dist/src/agent/context/workspace-state.js.map +1 -0
  72. package/dist/src/agent/context/workspace-templates/AGENTS.md +0 -4
  73. package/dist/src/agent/embedded/index.d.ts +2 -2
  74. package/dist/src/agent/embedded/index.js +3 -3
  75. package/dist/src/agent/embedded/run-turn.js +0 -3
  76. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  77. package/dist/src/agent/embedded/session-manager-init.d.ts +0 -17
  78. package/dist/src/agent/embedded/session-manager-init.js +1 -36
  79. package/dist/src/agent/embedded/session-manager-init.js.map +1 -1
  80. package/dist/src/agent/embedded/session-runner.d.ts +3 -12
  81. package/dist/src/agent/embedded/session-runner.js +12 -26
  82. package/dist/src/agent/embedded/session-runner.js.map +1 -1
  83. package/dist/src/agent/embedded/session-tool-result-guard.js +2 -4
  84. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  85. package/dist/src/agent/embedded/sqlite-hydrating-session-manager.d.ts +10 -0
  86. package/dist/src/agent/embedded/sqlite-hydrating-session-manager.js +34 -0
  87. package/dist/src/agent/embedded/sqlite-hydrating-session-manager.js.map +1 -0
  88. package/dist/src/agent/goals/goal-run-store.js +4 -4
  89. package/dist/src/agent/goals/persistent-goal-service.js +8 -15
  90. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
  91. package/dist/src/agent/goals/post-turn.js +2 -2
  92. package/dist/src/agent/image/load-image-media.js +2 -2
  93. package/dist/src/agent/ipc/bus.js +1 -1
  94. package/dist/src/agent/ipc/inbox.js +2 -2
  95. package/dist/src/agent/ipc/socket.js +1 -1
  96. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  97. package/dist/src/agent/mcp/bundle-mcp-runtime.js +2 -2
  98. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  99. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  100. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  101. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  102. package/dist/src/agent/memory/dreaming/events.js +1 -1
  103. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  104. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  105. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  106. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  107. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  108. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  109. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  110. package/dist/src/agent/models/manager.js +1 -1
  111. package/dist/src/agent/prompt/memory/index.d.ts +1 -0
  112. package/dist/src/agent/prompt/memory/index.js +34 -80
  113. package/dist/src/agent/prompt/memory/index.js.map +1 -1
  114. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  115. package/dist/src/agent/prompt/system-prompt.js +0 -1
  116. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  117. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  118. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  119. package/dist/src/agent/sandbox/path-policy.js +2 -2
  120. package/dist/src/agent/service/build-direct-message-content.js +1 -1
  121. package/dist/src/agent/service/process-direct-one-shot.js +8 -17
  122. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  123. package/dist/src/agent/service/process-direct-streaming.js +14 -23
  124. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  125. package/dist/src/agent/service.js +7 -11
  126. package/dist/src/agent/service.js.map +1 -1
  127. package/dist/src/agent/session/session-inspector.js +1 -1
  128. package/dist/src/agent/skills/config.js +1 -1
  129. package/dist/src/agent/skills/hub-hash.js +2 -2
  130. package/dist/src/agent/skills/hub-lock.js +1 -1
  131. package/dist/src/agent/skills/hub-pull.js +3 -3
  132. package/dist/src/agent/skills/index.js +1 -1
  133. package/dist/src/agent/skills/managed-store.js +1 -1
  134. package/dist/src/agent/skills/scanner.js +1 -1
  135. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  136. package/dist/src/agent/skills/skill-manager.js +1 -1
  137. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  138. package/dist/src/agent/tools/factory.js +1 -1
  139. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  140. package/dist/src/agent/tools/index.d.ts +0 -1
  141. package/dist/src/agent/tools/index.js +1 -2
  142. package/dist/src/agent/tools/send-media.js +1 -1
  143. package/dist/src/agent/tools/session-search-tool.d.ts +0 -1
  144. package/dist/src/agent/tools/session-search-tool.js +11 -6
  145. package/dist/src/agent/tools/session-search-tool.js.map +1 -1
  146. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  147. package/dist/src/agent/tools/tool-paths.js +1 -3
  148. package/dist/src/agent/tools/tool-paths.js.map +1 -1
  149. package/dist/src/agent/tools/workflow-tool.js +1 -1
  150. package/dist/src/agent/tools/write.js +1 -1
  151. package/dist/src/agent/workflow/catalog.js +1 -1
  152. package/dist/src/auth/credentials.js +3 -3
  153. package/dist/src/auth/profiles/store.js +1 -1
  154. package/dist/src/auth/sync-provider-auth.js +1 -1
  155. package/dist/src/browser/cache-dir-policy.js +1 -1
  156. package/dist/src/browser/cdp-local-launcher.js +2 -2
  157. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  158. package/dist/src/browser/providers/cloakbrowser.js +4 -4
  159. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  160. package/dist/src/browser/stealth.js +1 -1
  161. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  162. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  163. package/dist/src/channels/outbound/persist-store.js +1 -1
  164. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  165. package/dist/src/channels/pairing/pairing-store.js +2 -2
  166. package/dist/src/chat-commands/agent-edit.js +3 -4
  167. package/dist/src/chat-commands/agent-edit.js.map +1 -1
  168. package/dist/src/chat-commands/builtins/config.js +2 -2
  169. package/dist/src/chat-commands/context.js +1 -1
  170. package/dist/src/cli/commands/config.js +1 -1
  171. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  172. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  173. package/dist/src/cli/commands/doctor/checks/session-integrity.js +32 -95
  174. package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -1
  175. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  176. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  177. package/dist/src/cli/commands/extension-dev.js +1 -1
  178. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  179. package/dist/src/cli/commands/extension-pack.js +1 -1
  180. package/dist/src/cli/commands/gateway/logs.js +1 -1
  181. package/dist/src/cli/commands/image.js +1 -1
  182. package/dist/src/cli/commands/init.js +5 -7
  183. package/dist/src/cli/commands/init.js.map +1 -1
  184. package/dist/src/cli/commands/onboard.js +0 -8
  185. package/dist/src/cli/commands/onboard.js.map +1 -1
  186. package/dist/src/cli/templates.d.ts +3 -10
  187. package/dist/src/cli/templates.js +4 -32
  188. package/dist/src/cli/templates.js.map +1 -1
  189. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  190. package/dist/src/commands/agents.config.js +1 -1
  191. package/dist/src/config/agent-profile.js +1 -1
  192. package/dist/src/config/gateway-bind.js +1 -1
  193. package/dist/src/config/index.js +7 -8
  194. package/dist/src/config/index.js.map +1 -1
  195. package/dist/src/config/loader.js +2 -2
  196. package/dist/src/config/models-json.js +2 -2
  197. package/dist/src/config/paths-state.d.ts +3 -0
  198. package/dist/src/config/paths-state.js +7 -3
  199. package/dist/src/config/paths-state.js.map +1 -1
  200. package/dist/src/config/paths.d.ts +5 -36
  201. package/dist/src/config/paths.js +7 -52
  202. package/dist/src/config/paths.js.map +1 -1
  203. package/dist/src/config/profile.js +2 -2
  204. package/dist/src/config/schema.d.ts +15 -0
  205. package/dist/src/config/schema.js +11 -0
  206. package/dist/src/config/schema.js.map +1 -1
  207. package/dist/src/config/workspace-path.js +1 -1
  208. package/dist/src/cron/execution-types.d.ts +42 -0
  209. package/dist/src/cron/executor.js +2 -2
  210. package/dist/src/cron/persistence.js +1 -1
  211. package/dist/src/cron/run-log-store.d.ts +4 -8
  212. package/dist/src/cron/run-log-store.js +26 -78
  213. package/dist/src/cron/run-log-store.js.map +1 -1
  214. package/dist/src/cron/service.d.ts +3 -3
  215. package/dist/src/cron/service.js +2 -2
  216. package/dist/src/cron/service.js.map +1 -1
  217. package/dist/src/cron/types.d.ts +1 -42
  218. package/dist/src/daemon/constants.js +1 -1
  219. package/dist/src/daemon/install-plan.js +2 -2
  220. package/dist/src/daemon/launchd.js +2 -2
  221. package/dist/src/daemon/schtasks.js +2 -2
  222. package/dist/src/daemon/systemd.js +2 -2
  223. package/dist/src/extensions/bundle-mcp.js +1 -1
  224. package/dist/src/extensions/discover-extensions.js +1 -1
  225. package/dist/src/extensions/health.js +1 -1
  226. package/dist/src/extensions/loader.js +1 -1
  227. package/dist/src/extensions/lockfile.js +2 -2
  228. package/dist/src/extensions/update.js +1 -1
  229. package/dist/src/gateway/agents-admin.js +4 -4
  230. package/dist/src/gateway/agents-admin.js.map +1 -1
  231. package/dist/src/gateway/file-path-classifier.d.ts +0 -1
  232. package/dist/src/gateway/file-path-classifier.js +2 -8
  233. package/dist/src/gateway/file-path-classifier.js.map +1 -1
  234. package/dist/src/gateway/heartbeat/service.js +1 -1
  235. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  236. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  237. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  238. package/dist/src/gateway/hono/oauth.js +1 -1
  239. package/dist/src/gateway/hono/routes/agents.js +1 -1
  240. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  241. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  242. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  243. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  244. package/dist/src/gateway/hono/routes/models.js +1 -1
  245. package/dist/src/gateway/hono/routes/shares.js +1 -1
  246. package/dist/src/gateway/hono/routes/workspace.js +2 -2
  247. package/dist/src/gateway/lock.js +3 -3
  248. package/dist/src/gateway/ports.js +1 -1
  249. package/dist/src/gateway/service/agent-runner.js +2 -2
  250. package/dist/src/gateway/service/marketplace-service.js +2 -2
  251. package/dist/src/gateway/service.js +5 -1
  252. package/dist/src/gateway/service.js.map +1 -1
  253. package/dist/src/gateway/session-reset-service.d.ts +1 -1
  254. package/dist/src/gateway/session-reset-service.js +1 -1
  255. package/dist/src/gateway/session-reset-service.js.map +1 -1
  256. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  257. package/dist/src/heartbeat/index.js +1 -1
  258. package/dist/src/infra/brew.js +1 -1
  259. package/dist/src/infra/node-sqlite.d.ts +1 -0
  260. package/dist/src/infra/node-sqlite.js +17 -0
  261. package/dist/src/infra/node-sqlite.js.map +1 -0
  262. package/dist/src/infra/package-json.js +1 -1
  263. package/dist/src/infra/package-update-steps.js +1 -1
  264. package/dist/src/infra/path-env.js +2 -2
  265. package/dist/src/infra/restart.js +2 -2
  266. package/dist/src/infra/sqlite-errors.d.ts +1 -0
  267. package/dist/src/infra/sqlite-errors.js +77 -0
  268. package/dist/src/infra/sqlite-errors.js.map +1 -0
  269. package/dist/src/infra/stable-node-path.js +1 -1
  270. package/dist/src/infra/unhandled-rejections.d.ts +1 -0
  271. package/dist/src/infra/unhandled-rejections.js +25 -0
  272. package/dist/src/infra/unhandled-rejections.js.map +1 -0
  273. package/dist/src/infra/update-check.js +1 -1
  274. package/dist/src/infra/update-global.js +1 -1
  275. package/dist/src/infra/update-lock.js +3 -3
  276. package/dist/src/infra/update-runner.js +1 -1
  277. package/dist/src/infra/update-startup.js +2 -2
  278. package/dist/src/infra/warning-filter.d.ts +7 -0
  279. package/dist/src/infra/warning-filter.js +59 -0
  280. package/dist/src/infra/warning-filter.js.map +1 -0
  281. package/dist/src/infra/write-file-atomic.js +2 -2
  282. package/dist/src/notes/store.d.ts +3 -9
  283. package/dist/src/notes/store.js +22 -196
  284. package/dist/src/notes/store.js.map +1 -1
  285. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  286. package/dist/src/providers/index.js +2 -2
  287. package/dist/src/providers/model-registry.js +1 -1
  288. package/dist/src/session/config-store.d.ts +6 -75
  289. package/dist/src/session/config-store.js +38 -144
  290. package/dist/src/session/config-store.js.map +1 -1
  291. package/dist/src/session/config-types.d.ts +15 -0
  292. package/dist/src/session/config-types.js +1 -0
  293. package/dist/src/session/index.d.ts +1 -3
  294. package/dist/src/session/index.js +3 -5
  295. package/dist/src/session/init-session-turn.d.ts +0 -6
  296. package/dist/src/session/init-session-turn.js +18 -18
  297. package/dist/src/session/init-session-turn.js.map +1 -1
  298. package/dist/src/session/lifecycle-timestamps.d.ts +5 -2
  299. package/dist/src/session/lifecycle-timestamps.js.map +1 -1
  300. package/dist/src/session/{parity/load-jsonl-entries.js → load-jsonl-entries.js} +1 -1
  301. package/dist/src/session/load-jsonl-entries.js.map +1 -0
  302. package/dist/src/session/manager.d.ts +5 -3
  303. package/dist/src/session/manager.js +1 -5
  304. package/dist/src/session/manager.js.map +1 -1
  305. package/dist/src/session/resolve-session.d.ts +3 -6
  306. package/dist/src/session/resolve-session.js +26 -31
  307. package/dist/src/session/resolve-session.js.map +1 -1
  308. package/dist/src/session/session-context-for-llm.js +5 -1
  309. package/dist/src/session/session-context-for-llm.js.map +1 -1
  310. package/dist/src/session/session-id.js +12 -0
  311. package/dist/src/session/session-id.js.map +1 -0
  312. package/dist/src/session/session-title.js +2 -2
  313. package/dist/src/session/session-workspace.d.ts +1 -1
  314. package/dist/src/session/session-workspace.js.map +1 -1
  315. package/dist/src/session/store.d.ts +14 -63
  316. package/dist/src/session/store.js +172 -847
  317. package/dist/src/session/store.js.map +1 -1
  318. package/dist/src/session/stored-rows-to-file-entries.d.ts +11 -0
  319. package/dist/src/session/stored-rows-to-file-entries.js +95 -0
  320. package/dist/src/session/stored-rows-to-file-entries.js.map +1 -0
  321. package/dist/src/session/transcript-events.d.ts +1 -2
  322. package/dist/src/session/transcript-events.js +5 -12
  323. package/dist/src/session/transcript-events.js.map +1 -1
  324. package/dist/src/session/transcript-format.d.ts +1 -1
  325. package/dist/src/session/transcript-format.js.map +1 -1
  326. package/dist/src/session/transcript-stats.d.ts +1 -0
  327. package/dist/src/session/transcript-stats.js +10 -0
  328. package/dist/src/session/transcript-stats.js.map +1 -0
  329. package/dist/src/share/share-auto.js +2 -2
  330. package/dist/src/share/share-store.js +3 -3
  331. package/dist/src/share/share-thumbnail.js +2 -2
  332. package/dist/src/share/share-zip.js +1 -1
  333. package/dist/src/share/site-share-store.js +3 -3
  334. package/dist/src/share/site-static-serve.js +1 -1
  335. package/dist/src/storage/sqlite/config-repository.d.ts +6 -0
  336. package/dist/src/storage/sqlite/config-repository.js +56 -0
  337. package/dist/src/storage/sqlite/config-repository.js.map +1 -0
  338. package/dist/src/storage/sqlite/connection.d.ts +38 -0
  339. package/dist/src/storage/sqlite/connection.js +258 -0
  340. package/dist/src/storage/sqlite/connection.js.map +1 -0
  341. package/dist/src/storage/sqlite/cron-run-repository.d.ts +5 -0
  342. package/dist/src/storage/sqlite/cron-run-repository.js +97 -0
  343. package/dist/src/storage/sqlite/cron-run-repository.js.map +1 -0
  344. package/dist/src/storage/sqlite/fts.d.ts +2 -0
  345. package/dist/src/storage/sqlite/fts.js +11 -0
  346. package/dist/src/storage/sqlite/fts.js.map +1 -0
  347. package/dist/src/storage/sqlite/index.d.ts +12 -0
  348. package/dist/src/storage/sqlite/index.js +13 -0
  349. package/dist/src/storage/sqlite/memory-index-repository.d.ts +18 -0
  350. package/dist/src/storage/sqlite/memory-index-repository.js +132 -0
  351. package/dist/src/storage/sqlite/memory-index-repository.js.map +1 -0
  352. package/dist/src/storage/sqlite/notes-repository.d.ts +11 -0
  353. package/dist/src/storage/sqlite/notes-repository.js +191 -0
  354. package/dist/src/storage/sqlite/notes-repository.js.map +1 -0
  355. package/dist/src/storage/sqlite/paths.d.ts +1 -0
  356. package/dist/src/storage/sqlite/paths.js +7 -0
  357. package/dist/src/storage/sqlite/paths.js.map +1 -0
  358. package/dist/src/storage/sqlite/row-mappers.d.ts +82 -0
  359. package/dist/src/storage/sqlite/row-mappers.js +164 -0
  360. package/dist/src/storage/sqlite/row-mappers.js.map +1 -0
  361. package/dist/src/storage/sqlite/schema.d.ts +5 -0
  362. package/dist/src/storage/sqlite/schema.js +43 -0
  363. package/dist/src/storage/sqlite/schema.js.map +1 -0
  364. package/dist/src/storage/sqlite/schema.sql +195 -0
  365. package/dist/src/storage/sqlite/session-metadata.d.ts +8 -0
  366. package/dist/src/storage/sqlite/session-metadata.js +83 -0
  367. package/dist/src/storage/sqlite/session-metadata.js.map +1 -0
  368. package/dist/src/storage/sqlite/session-repository.d.ts +29 -0
  369. package/dist/src/storage/sqlite/session-repository.js +268 -0
  370. package/dist/src/storage/sqlite/session-repository.js.map +1 -0
  371. package/dist/src/storage/sqlite/transaction.d.ts +11 -0
  372. package/dist/src/storage/sqlite/transaction.js +115 -0
  373. package/dist/src/storage/sqlite/transaction.js.map +1 -0
  374. package/dist/src/storage/sqlite/transcript-repository.d.ts +34 -0
  375. package/dist/src/storage/sqlite/transcript-repository.js +241 -0
  376. package/dist/src/storage/sqlite/transcript-repository.js.map +1 -0
  377. package/dist/src/tui/clipboard-image.js +3 -3
  378. package/dist/src/tui/theme-manager.js +1 -1
  379. package/dist/src/tui/tui-keybindings-file.js +1 -1
  380. package/dist/src/tui/tui-scoped-models.js +2 -2
  381. package/dist/src/tui/tui-settings.js +1 -1
  382. package/dist/src/tui/tui.js +3 -3
  383. package/dist/src/tunnel/frpc-binary.js +3 -3
  384. package/dist/src/tunnel/frpc-config.js +1 -1
  385. package/dist/src/tunnel/frpc-extract.js +1 -1
  386. package/dist/src/tunnel/tunnel-state.js +1 -1
  387. package/dist/src/utils/logger/audit.js +1 -1
  388. package/dist/src/utils/logger/log-store.js +1 -1
  389. package/dist/src/utils/logger/rotation.js +1 -1
  390. package/dist/src/voice/tts/audio.js +1 -1
  391. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  392. package/dist/src/workflows/service/workflow-session-bridge.js +41 -64
  393. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  394. package/dist/src/workflows/store/event-store.js +1 -1
  395. package/dist/src/workflows/store/run-store.js +1 -1
  396. package/package.json +2 -2
  397. package/dist/gateway/static/root/assets/index-Bj_l8QDp.css +0 -1
  398. package/dist/gateway/static/root/assets/url-BHHmdJYc.js +0 -3
  399. package/dist/src/agent/context/workspace-templates/BOOTSTRAP.md +0 -61
  400. package/dist/src/agent/embedded/session-manager-cache.d.ts +0 -19
  401. package/dist/src/agent/embedded/session-manager-cache.js +0 -48
  402. package/dist/src/agent/embedded/session-manager-cache.js.map +0 -1
  403. package/dist/src/session/parity/artifacts.d.ts +0 -16
  404. package/dist/src/session/parity/artifacts.js +0 -80
  405. package/dist/src/session/parity/artifacts.js.map +0 -1
  406. package/dist/src/session/parity/jsonl-transcript-io.d.ts +0 -54
  407. package/dist/src/session/parity/jsonl-transcript-io.js +0 -236
  408. package/dist/src/session/parity/jsonl-transcript-io.js.map +0 -1
  409. package/dist/src/session/parity/load-jsonl-entries.js.map +0 -1
  410. package/dist/src/session/parity/session-id.js +0 -18
  411. package/dist/src/session/parity/session-id.js.map +0 -1
  412. package/dist/src/session/parity/sessions-json-cache.d.ts +0 -14
  413. package/dist/src/session/parity/sessions-json-cache.js +0 -98
  414. package/dist/src/session/parity/sessions-json-cache.js.map +0 -1
  415. package/dist/src/session/parity/sessions-json-file-read.d.ts +0 -6
  416. package/dist/src/session/parity/sessions-json-file-read.js +0 -19
  417. package/dist/src/session/parity/sessions-json-file-read.js.map +0 -1
  418. package/dist/src/session/parity/sessions-json-file.d.ts +0 -11
  419. package/dist/src/session/parity/sessions-json-file.js +0 -52
  420. package/dist/src/session/parity/sessions-json-file.js.map +0 -1
  421. package/dist/src/session/parity/sessions-json-patch.d.ts +0 -14
  422. package/dist/src/session/parity/sessions-json-patch.js +0 -40
  423. package/dist/src/session/parity/sessions-json-patch.js.map +0 -1
  424. package/dist/src/session/parity/transcript-file-lock.d.ts +0 -22
  425. package/dist/src/session/parity/transcript-file-lock.js +0 -142
  426. package/dist/src/session/parity/transcript-file-lock.js.map +0 -1
  427. package/dist/src/session/parity/transcript-pagination.d.ts +0 -29
  428. package/dist/src/session/parity/transcript-pagination.js +0 -132
  429. package/dist/src/session/parity/transcript-pagination.js.map +0 -1
  430. package/dist/src/session/parity/transcript-paths.d.ts +0 -13
  431. package/dist/src/session/parity/transcript-paths.js +0 -64
  432. package/dist/src/session/parity/transcript-paths.js.map +0 -1
  433. package/dist/src/session/parity/xopc-session-disk-entry.d.ts +0 -22
  434. package/dist/src/session/search-index-cache.d.ts +0 -6
  435. package/dist/src/session/search-index-cache.js +0 -44
  436. package/dist/src/session/search-index-cache.js.map +0 -1
  437. package/dist/src/session/search-index.d.ts +0 -20
  438. package/dist/src/session/search-index.js +0 -124
  439. package/dist/src/session/search-index.js.map +0 -1
  440. /package/dist/src/{session/parity/xopc-session-disk-entry.js → cron/execution-types.js} +0 -0
  441. /package/dist/src/session/{parity/load-jsonl-entries.d.ts → load-jsonl-entries.d.ts} +0 -0
  442. /package/dist/src/session/{parity/session-id.d.ts → session-id.d.ts} +0 -0
@@ -0,0 +1,241 @@
1
+ import { getSqliteDatabase, runSqliteWriteTransaction } from "./transaction.js";
2
+ import { buildSessionContextForLlm } from "../../session/session-context-for-llm.js";
3
+ import { classifyStoredRow, estimateTokensFromMessages, extractFtsContent, transcriptEntryRowToStoredRow } from "./row-mappers.js";
4
+ import { getCurrentTranscriptId, readCurrentTranscriptId } from "./session-repository.js";
5
+ import { randomUUID } from "node:crypto";
6
+ //#region src/storage/sqlite/transcript-repository.ts
7
+ const MAX_CHECKPOINTS_PER_TRANSCRIPT = 15;
8
+ function nextSeq(db, transcriptId) {
9
+ return (db.prepare(`SELECT COALESCE(MAX(seq), 0) AS max_seq FROM transcript_entries WHERE transcript_id = ?`).get(transcriptId).max_seq ?? 0) + 1;
10
+ }
11
+ function insertEntry(db, params) {
12
+ const { entryKind, role } = classifyStoredRow(params.row);
13
+ const entryId = params.entryId ?? randomUUID();
14
+ const seq = nextSeq(db, params.transcriptId);
15
+ const createdAt = params.createdAt ?? Date.now();
16
+ const payloadJson = JSON.stringify(params.row);
17
+ db.prepare(`INSERT INTO transcript_entries (entry_id, transcript_id, seq, entry_kind, role, payload_json, created_at)
18
+ VALUES (?, ?, ?, ?, ?, ?, ?)`).run(entryId, params.transcriptId, seq, entryKind, role, payloadJson, createdAt);
19
+ const content = extractFtsContent(params.row);
20
+ if (content.trim()) db.prepare(`INSERT INTO transcript_fts (content, session_key, transcript_id, entry_id)
21
+ VALUES (?, ?, ?, ?)`).run(content, params.sessionKey, params.transcriptId, entryId);
22
+ return {
23
+ entry_id: entryId,
24
+ transcript_id: params.transcriptId,
25
+ seq,
26
+ entry_kind: entryKind,
27
+ role,
28
+ payload_json: payloadJson,
29
+ created_at: createdAt
30
+ };
31
+ }
32
+ function appendTranscriptEntry(sessionKey, row, opts) {
33
+ return runSqliteWriteTransaction((db) => {
34
+ const transcriptId = opts?.transcriptId ?? readCurrentTranscriptId(db, sessionKey);
35
+ if (!transcriptId) throw new Error(`Session not found: ${sessionKey}`);
36
+ const inserted = insertEntry(db, {
37
+ transcriptId,
38
+ sessionKey,
39
+ row
40
+ });
41
+ if (classifyStoredRow(row).entryKind === "message") {
42
+ const tokenDelta = opts?.tokenDelta ?? 0;
43
+ const now = Date.now();
44
+ db.prepare(`UPDATE sessions SET
45
+ message_count = message_count + 1,
46
+ estimated_tokens = estimated_tokens + ?,
47
+ updated_at = ?,
48
+ last_accessed_at = ?,
49
+ last_interaction_at = ?
50
+ WHERE session_key = ?`).run(tokenDelta, now, now, now, sessionKey);
51
+ }
52
+ return inserted;
53
+ });
54
+ }
55
+ function loadTranscriptRowsForSession(sessionKey) {
56
+ const transcriptId = getCurrentTranscriptId(sessionKey);
57
+ if (!transcriptId) return [];
58
+ return loadTranscriptRows(transcriptId);
59
+ }
60
+ function loadTranscriptRows(transcriptId) {
61
+ return getSqliteDatabase().prepare(`SELECT entry_id, transcript_id, seq, entry_kind, role, payload_json, created_at
62
+ FROM transcript_entries
63
+ WHERE transcript_id = ?
64
+ ORDER BY seq ASC`).all(transcriptId).map(transcriptEntryRowToStoredRow);
65
+ }
66
+ function loadLlmMessagesForSession(sessionKey) {
67
+ return buildSessionContextForLlm(loadTranscriptRowsForSession(sessionKey));
68
+ }
69
+ function replaceTranscriptRows(sessionKey, rows, opts) {
70
+ runSqliteWriteTransaction((db) => {
71
+ const transcriptId = readCurrentTranscriptId(db, sessionKey);
72
+ if (!transcriptId) throw new Error(`Session not found: ${sessionKey}`);
73
+ db.prepare(`DELETE FROM transcript_fts WHERE transcript_id = ?`).run(transcriptId);
74
+ db.prepare(`DELETE FROM transcript_entries WHERE transcript_id = ?`).run(transcriptId);
75
+ const toWrite = [...rows];
76
+ if (opts?.appendCompaction) toWrite.push({
77
+ type: "compaction",
78
+ ...opts.appendCompaction
79
+ });
80
+ for (const row of toWrite) insertEntry(db, {
81
+ transcriptId,
82
+ sessionKey,
83
+ row
84
+ });
85
+ const llm = buildSessionContextForLlm(toWrite);
86
+ const now = Date.now();
87
+ db.prepare(`UPDATE sessions SET
88
+ message_count = ?,
89
+ estimated_tokens = ?,
90
+ updated_at = ?,
91
+ last_accessed_at = ?,
92
+ last_interaction_at = ?
93
+ WHERE session_key = ?`).run(llm.length, estimateTokensFromMessages(llm), now, now, now, sessionKey);
94
+ });
95
+ }
96
+ function loadCheckpointRows(sessionKey, checkpointId) {
97
+ const db = getSqliteDatabase();
98
+ if (!db.prepare(`SELECT checkpoint_id FROM compaction_checkpoints
99
+ WHERE session_key = ? AND checkpoint_id = ?`).get(sessionKey, checkpointId)) return [];
100
+ return db.prepare(`SELECT payload_json FROM checkpoint_entries
101
+ WHERE checkpoint_id = ?
102
+ ORDER BY seq ASC`).all(checkpointId).map((entry) => JSON.parse(entry.payload_json));
103
+ }
104
+ function paginateTranscriptMessages(sessionKey, options = {}) {
105
+ const transcriptId = getCurrentTranscriptId(sessionKey);
106
+ if (!transcriptId) return {
107
+ rows: [],
108
+ messages: [],
109
+ total: 0,
110
+ startSeq: 0,
111
+ endSeq: 0
112
+ };
113
+ const db = getSqliteDatabase();
114
+ const kinds = options.includeContext ? ["message", "context"] : ["message"];
115
+ const kindPlaceholders = kinds.map(() => "?").join(", ");
116
+ const total = db.prepare(`SELECT COUNT(*) AS total FROM transcript_entries
117
+ WHERE transcript_id = ? AND entry_kind IN (${kindPlaceholders})`).get(transcriptId, ...kinds).total;
118
+ const limit = Math.min(200, Math.max(1, Math.trunc(options.limit ?? 50)));
119
+ const offset = Math.max(0, Math.trunc(options.offset ?? 0));
120
+ let rows;
121
+ if (options.beforeEndIndex !== void 0 && Number.isFinite(options.beforeEndIndex)) {
122
+ const endExclusive = Math.min(total, Math.max(0, Math.trunc(options.beforeEndIndex)));
123
+ const startInclusive = Math.max(0, endExclusive - limit);
124
+ rows = db.prepare(`SELECT entry_id, transcript_id, seq, entry_kind, role, payload_json, created_at
125
+ FROM (
126
+ SELECT entry_id, transcript_id, seq, entry_kind, role, payload_json, created_at,
127
+ ROW_NUMBER() OVER (ORDER BY seq ASC) - 1 AS idx
128
+ FROM transcript_entries
129
+ WHERE transcript_id = ? AND entry_kind IN (${kindPlaceholders})
130
+ )
131
+ WHERE idx >= ? AND idx < ?
132
+ ORDER BY seq ASC`).all(transcriptId, ...kinds, startInclusive, endExclusive);
133
+ } else if (options.beforeSeq !== void 0 && Number.isFinite(options.beforeSeq)) {
134
+ rows = db.prepare(`SELECT entry_id, transcript_id, seq, entry_kind, role, payload_json, created_at
135
+ FROM transcript_entries
136
+ WHERE transcript_id = ? AND entry_kind IN (${kindPlaceholders}) AND seq < ?
137
+ ORDER BY seq DESC
138
+ LIMIT ?`).all(transcriptId, ...kinds, options.beforeSeq, limit);
139
+ rows.reverse();
140
+ } else {
141
+ rows = db.prepare(`SELECT entry_id, transcript_id, seq, entry_kind, role, payload_json, created_at
142
+ FROM transcript_entries
143
+ WHERE transcript_id = ? AND entry_kind IN (${kindPlaceholders})
144
+ ORDER BY seq DESC
145
+ LIMIT ? OFFSET ?`).all(transcriptId, ...kinds, limit, offset);
146
+ rows.reverse();
147
+ }
148
+ const storedRows = rows.map(transcriptEntryRowToStoredRow);
149
+ return {
150
+ rows: storedRows,
151
+ messages: buildSessionContextForLlm(storedRows),
152
+ total,
153
+ startSeq: rows[0]?.seq ?? 0,
154
+ endSeq: rows[rows.length - 1]?.seq ?? 0
155
+ };
156
+ }
157
+ function captureCompactionCheckpoint(sessionKey) {
158
+ return runSqliteWriteTransaction((db) => {
159
+ const transcriptId = readCurrentTranscriptId(db, sessionKey);
160
+ if (!transcriptId) return null;
161
+ const entries = db.prepare(`SELECT entry_id, transcript_id, seq, entry_kind, role, payload_json, created_at
162
+ FROM transcript_entries WHERE transcript_id = ? ORDER BY seq ASC`).all(transcriptId);
163
+ if (entries.length === 0) return null;
164
+ const checkpointId = randomUUID();
165
+ const now = Date.now();
166
+ const messageCount = entries.filter((e) => e.entry_kind === "message").length;
167
+ const sizeBytes = entries.reduce((sum, e) => sum + e.payload_json.length, 0);
168
+ db.prepare(`INSERT INTO compaction_checkpoints
169
+ (checkpoint_id, transcript_id, session_key, created_at, message_count, size_bytes)
170
+ VALUES (?, ?, ?, ?, ?, ?)`).run(checkpointId, transcriptId, sessionKey, now, messageCount, sizeBytes);
171
+ const insertCheckpointEntry = db.prepare(`INSERT INTO checkpoint_entries (checkpoint_id, seq, entry_kind, role, payload_json)
172
+ VALUES (?, ?, ?, ?, ?)`);
173
+ for (const entry of entries) insertCheckpointEntry.run(checkpointId, entry.seq, entry.entry_kind, entry.role, entry.payload_json);
174
+ pruneCompactionCheckpoints(db, transcriptId);
175
+ return checkpointId;
176
+ });
177
+ }
178
+ function pruneCompactionCheckpoints(db, transcriptId) {
179
+ const rows = db.prepare(`SELECT checkpoint_id FROM compaction_checkpoints
180
+ WHERE transcript_id = ?
181
+ ORDER BY created_at ASC`).all(transcriptId);
182
+ if (rows.length <= MAX_CHECKPOINTS_PER_TRANSCRIPT) return;
183
+ const toDelete = rows.slice(0, rows.length - MAX_CHECKPOINTS_PER_TRANSCRIPT);
184
+ const del = db.prepare(`DELETE FROM compaction_checkpoints WHERE checkpoint_id = ?`);
185
+ for (const row of toDelete) del.run(row.checkpoint_id);
186
+ }
187
+ function listCompactionCheckpoints(sessionKey) {
188
+ return getSqliteDatabase().prepare(`SELECT checkpoint_id, created_at, message_count, size_bytes
189
+ FROM compaction_checkpoints
190
+ WHERE session_key = ?
191
+ ORDER BY created_at DESC`).all(sessionKey).map((row) => ({
192
+ id: row.checkpoint_id,
193
+ sizeBytes: row.size_bytes,
194
+ modifiedAt: new Date(row.created_at).toISOString()
195
+ }));
196
+ }
197
+ function getCompactionCheckpointDetail(sessionKey, checkpointId) {
198
+ const row = getSqliteDatabase().prepare(`SELECT checkpoint_id, created_at, message_count, size_bytes
199
+ FROM compaction_checkpoints
200
+ WHERE session_key = ? AND checkpoint_id = ?`).get(sessionKey, checkpointId);
201
+ if (!row) return null;
202
+ return {
203
+ id: row.checkpoint_id,
204
+ sizeBytes: row.size_bytes,
205
+ modifiedAt: new Date(row.created_at).toISOString(),
206
+ messageCount: row.message_count
207
+ };
208
+ }
209
+ function restoreCompactionCheckpoint(sessionKey, checkpointId) {
210
+ runSqliteWriteTransaction((db) => {
211
+ const transcriptId = readCurrentTranscriptId(db, sessionKey);
212
+ if (!transcriptId) throw new Error(`Session not found: ${sessionKey}`);
213
+ if (!db.prepare(`SELECT checkpoint_id FROM compaction_checkpoints
214
+ WHERE session_key = ? AND checkpoint_id = ?`).get(sessionKey, checkpointId)) throw new Error(`Checkpoint not found: ${checkpointId}`);
215
+ const entries = db.prepare(`SELECT seq, entry_kind, role, payload_json
216
+ FROM checkpoint_entries
217
+ WHERE checkpoint_id = ?
218
+ ORDER BY seq ASC`).all(checkpointId);
219
+ db.prepare(`DELETE FROM transcript_fts WHERE transcript_id = ?`).run(transcriptId);
220
+ db.prepare(`DELETE FROM transcript_entries WHERE transcript_id = ?`).run(transcriptId);
221
+ for (const entry of entries) insertEntry(db, {
222
+ transcriptId,
223
+ sessionKey,
224
+ row: JSON.parse(entry.payload_json),
225
+ createdAt: Date.now()
226
+ });
227
+ const llm = buildSessionContextForLlm(entries.map((e) => JSON.parse(e.payload_json)));
228
+ const now = Date.now();
229
+ db.prepare(`UPDATE sessions SET
230
+ message_count = ?,
231
+ estimated_tokens = ?,
232
+ updated_at = ?,
233
+ last_accessed_at = ?,
234
+ last_interaction_at = ?
235
+ WHERE session_key = ?`).run(llm.length, estimateTokensFromMessages(llm), now, now, now, sessionKey);
236
+ });
237
+ }
238
+ //#endregion
239
+ export { appendTranscriptEntry, captureCompactionCheckpoint, getCompactionCheckpointDetail, listCompactionCheckpoints, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreCompactionCheckpoint };
240
+
241
+ //# sourceMappingURL=transcript-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-repository.js","names":[],"sources":["../../../../src/storage/sqlite/transcript-repository.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type { DatabaseSync } from 'node:sqlite';\n\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\n\nimport type { CompactionCheckpointDetail, CompactionCheckpointSummary } from '../../session/types.js';\nimport type { TranscriptCompactionRecord } from '../../session/transcript-format.js';\nimport {\n buildSessionContextForLlm,\n type TranscriptStoredRow,\n} from '../../session/session-context-for-llm.js';\nimport {\n classifyStoredRow,\n estimateTokensFromMessages,\n extractFtsContent,\n transcriptEntryRowToStoredRow,\n type TranscriptEntryRow,\n} from './row-mappers.js';\nimport { getCurrentTranscriptId, readCurrentTranscriptId } from './session-repository.js';\nimport { getSqliteDatabase, runSqliteWriteTransaction } from './transaction.js';\n\nconst MAX_CHECKPOINTS_PER_TRANSCRIPT = 15;\n\nfunction nextSeq(db: DatabaseSync, transcriptId: string): number {\n const row = db\n .prepare(`SELECT COALESCE(MAX(seq), 0) AS max_seq FROM transcript_entries WHERE transcript_id = ?`)\n .get(transcriptId) as { max_seq: number };\n return (row.max_seq ?? 0) + 1;\n}\n\nfunction insertEntry(\n db: DatabaseSync,\n params: {\n transcriptId: string;\n sessionKey: string;\n row: TranscriptStoredRow;\n entryId?: string;\n createdAt?: number;\n },\n): TranscriptEntryRow {\n const { entryKind, role } = classifyStoredRow(params.row);\n const entryId = params.entryId ?? randomUUID();\n const seq = nextSeq(db, params.transcriptId);\n const createdAt = params.createdAt ?? Date.now();\n const payloadJson = JSON.stringify(params.row);\n\n db.prepare(\n `INSERT INTO transcript_entries (entry_id, transcript_id, seq, entry_kind, role, payload_json, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n ).run(entryId, params.transcriptId, seq, entryKind, role, payloadJson, createdAt);\n\n const content = extractFtsContent(params.row);\n if (content.trim()) {\n db.prepare(\n `INSERT INTO transcript_fts (content, session_key, transcript_id, entry_id)\n VALUES (?, ?, ?, ?)`,\n ).run(content, params.sessionKey, params.transcriptId, entryId);\n }\n\n return {\n entry_id: entryId,\n transcript_id: params.transcriptId,\n seq,\n entry_kind: entryKind,\n role,\n payload_json: payloadJson,\n created_at: createdAt,\n };\n}\n\nexport function appendTranscriptEntry(\n sessionKey: string,\n row: TranscriptStoredRow,\n opts?: { transcriptId?: string; tokenDelta?: number },\n): TranscriptEntryRow {\n return runSqliteWriteTransaction((db) => {\n const transcriptId = opts?.transcriptId ?? readCurrentTranscriptId(db, sessionKey);\n if (!transcriptId) {\n throw new Error(`Session not found: ${sessionKey}`);\n }\n const inserted = insertEntry(db, { transcriptId, sessionKey, row });\n if (classifyStoredRow(row).entryKind === 'message') {\n const tokenDelta = opts?.tokenDelta ?? 0;\n const now = Date.now();\n db.prepare(\n `UPDATE sessions SET\n message_count = message_count + 1,\n estimated_tokens = estimated_tokens + ?,\n updated_at = ?,\n last_accessed_at = ?,\n last_interaction_at = ?\n WHERE session_key = ?`,\n ).run(tokenDelta, now, now, now, sessionKey);\n }\n return inserted;\n });\n}\n\nexport function loadTranscriptRowsForSession(sessionKey: string): TranscriptStoredRow[] {\n const transcriptId = getCurrentTranscriptId(sessionKey);\n if (!transcriptId) {\n return [];\n }\n return loadTranscriptRows(transcriptId);\n}\n\nexport function loadTranscriptRows(transcriptId: string): TranscriptStoredRow[] {\n const db = getSqliteDatabase();\n const rows = db\n .prepare(\n `SELECT entry_id, transcript_id, seq, entry_kind, role, payload_json, created_at\n FROM transcript_entries\n WHERE transcript_id = ?\n ORDER BY seq ASC`,\n )\n .all(transcriptId) as TranscriptEntryRow[];\n return rows.map(transcriptEntryRowToStoredRow);\n}\n\nexport function loadLlmMessagesForSession(sessionKey: string): AgentMessage[] {\n const rows = loadTranscriptRowsForSession(sessionKey);\n return buildSessionContextForLlm(rows);\n}\n\nexport function replaceTranscriptRows(\n sessionKey: string,\n rows: TranscriptStoredRow[],\n opts?: { appendCompaction?: TranscriptCompactionRecord },\n): void {\n runSqliteWriteTransaction((db) => {\n const transcriptId = readCurrentTranscriptId(db, sessionKey);\n if (!transcriptId) {\n throw new Error(`Session not found: ${sessionKey}`);\n }\n\n db.prepare(`DELETE FROM transcript_fts WHERE transcript_id = ?`).run(transcriptId);\n db.prepare(`DELETE FROM transcript_entries WHERE transcript_id = ?`).run(transcriptId);\n\n const toWrite = [...rows];\n if (opts?.appendCompaction) {\n toWrite.push({\n type: 'compaction',\n ...opts.appendCompaction,\n } as unknown as TranscriptStoredRow);\n }\n\n for (const row of toWrite) {\n insertEntry(db, { transcriptId, sessionKey, row });\n }\n\n const llm = buildSessionContextForLlm(toWrite);\n const now = Date.now();\n db.prepare(\n `UPDATE sessions SET\n message_count = ?,\n estimated_tokens = ?,\n updated_at = ?,\n last_accessed_at = ?,\n last_interaction_at = ?\n WHERE session_key = ?`,\n ).run(llm.length, estimateTokensFromMessages(llm), now, now, now, sessionKey);\n });\n}\n\nexport function loadCheckpointRows(sessionKey: string, checkpointId: string): TranscriptStoredRow[] {\n const db = getSqliteDatabase();\n const checkpoint = db\n .prepare(\n `SELECT checkpoint_id FROM compaction_checkpoints\n WHERE session_key = ? AND checkpoint_id = ?`,\n )\n .get(sessionKey, checkpointId) as { checkpoint_id: string } | undefined;\n if (!checkpoint) {\n return [];\n }\n const entries = db\n .prepare(\n `SELECT payload_json FROM checkpoint_entries\n WHERE checkpoint_id = ?\n ORDER BY seq ASC`,\n )\n .all(checkpointId) as Array<{ payload_json: string }>;\n return entries.map((entry) => JSON.parse(entry.payload_json) as TranscriptStoredRow);\n}\n\nexport function paginateTranscriptMessages(\n sessionKey: string,\n options: {\n offset?: number;\n limit?: number;\n beforeSeq?: number;\n /** 0-based exclusive end index (legacy cursor from gateway UI). */\n beforeEndIndex?: number;\n includeContext?: boolean;\n } = {},\n): {\n rows: TranscriptStoredRow[];\n messages: AgentMessage[];\n total: number;\n startSeq: number;\n endSeq: number;\n} {\n const transcriptId = getCurrentTranscriptId(sessionKey);\n if (!transcriptId) {\n return { rows: [], messages: [], total: 0, startSeq: 0, endSeq: 0 };\n }\n\n const db = getSqliteDatabase();\n const kinds = options.includeContext ? ['message', 'context'] : ['message'];\n const kindPlaceholders = kinds.map(() => '?').join(', ');\n\n const countRow = db\n .prepare(\n `SELECT COUNT(*) AS total FROM transcript_entries\n WHERE transcript_id = ? AND entry_kind IN (${kindPlaceholders})`,\n )\n .get(transcriptId, ...kinds) as { total: number };\n const total = countRow.total;\n\n const limit = Math.min(200, Math.max(1, Math.trunc(options.limit ?? 50)));\n const offset = Math.max(0, Math.trunc(options.offset ?? 0));\n\n let rows: TranscriptEntryRow[];\n if (options.beforeEndIndex !== undefined && Number.isFinite(options.beforeEndIndex)) {\n const endExclusive = Math.min(total, Math.max(0, Math.trunc(options.beforeEndIndex)));\n const startInclusive = Math.max(0, endExclusive - limit);\n rows = db\n .prepare(\n `SELECT entry_id, transcript_id, seq, entry_kind, role, payload_json, created_at\n FROM (\n SELECT entry_id, transcript_id, seq, entry_kind, role, payload_json, created_at,\n ROW_NUMBER() OVER (ORDER BY seq ASC) - 1 AS idx\n FROM transcript_entries\n WHERE transcript_id = ? AND entry_kind IN (${kindPlaceholders})\n )\n WHERE idx >= ? AND idx < ?\n ORDER BY seq ASC`,\n )\n .all(transcriptId, ...kinds, startInclusive, endExclusive) as TranscriptEntryRow[];\n } else if (options.beforeSeq !== undefined && Number.isFinite(options.beforeSeq)) {\n rows = db\n .prepare(\n `SELECT entry_id, transcript_id, seq, entry_kind, role, payload_json, created_at\n FROM transcript_entries\n WHERE transcript_id = ? AND entry_kind IN (${kindPlaceholders}) AND seq < ?\n ORDER BY seq DESC\n LIMIT ?`,\n )\n .all(transcriptId, ...kinds, options.beforeSeq, limit) as TranscriptEntryRow[];\n rows.reverse();\n } else {\n rows = db\n .prepare(\n `SELECT entry_id, transcript_id, seq, entry_kind, role, payload_json, created_at\n FROM transcript_entries\n WHERE transcript_id = ? AND entry_kind IN (${kindPlaceholders})\n ORDER BY seq DESC\n LIMIT ? OFFSET ?`,\n )\n .all(transcriptId, ...kinds, limit, offset) as TranscriptEntryRow[];\n rows.reverse();\n }\n\n const storedRows = rows.map(transcriptEntryRowToStoredRow);\n const messages = buildSessionContextForLlm(storedRows);\n const startSeq = rows[0]?.seq ?? 0;\n const endSeq = rows[rows.length - 1]?.seq ?? 0;\n return { rows: storedRows, messages, total, startSeq, endSeq };\n}\n\nexport function captureCompactionCheckpoint(sessionKey: string): string | null {\n return runSqliteWriteTransaction((db) => {\n const transcriptId = readCurrentTranscriptId(db, sessionKey);\n if (!transcriptId) {\n return null;\n }\n\n const entries = db\n .prepare(\n `SELECT entry_id, transcript_id, seq, entry_kind, role, payload_json, created_at\n FROM transcript_entries WHERE transcript_id = ? ORDER BY seq ASC`,\n )\n .all(transcriptId) as TranscriptEntryRow[];\n if (entries.length === 0) {\n return null;\n }\n\n const checkpointId = randomUUID();\n const now = Date.now();\n const messageCount = entries.filter((e) => e.entry_kind === 'message').length;\n const sizeBytes = entries.reduce((sum, e) => sum + e.payload_json.length, 0);\n\n db.prepare(\n `INSERT INTO compaction_checkpoints\n (checkpoint_id, transcript_id, session_key, created_at, message_count, size_bytes)\n VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(checkpointId, transcriptId, sessionKey, now, messageCount, sizeBytes);\n\n const insertCheckpointEntry = db.prepare(\n `INSERT INTO checkpoint_entries (checkpoint_id, seq, entry_kind, role, payload_json)\n VALUES (?, ?, ?, ?, ?)`,\n );\n for (const entry of entries) {\n insertCheckpointEntry.run(\n checkpointId,\n entry.seq,\n entry.entry_kind,\n entry.role,\n entry.payload_json,\n );\n }\n\n pruneCompactionCheckpoints(db, transcriptId);\n return checkpointId;\n });\n}\n\nfunction pruneCompactionCheckpoints(db: DatabaseSync, transcriptId: string): void {\n const rows = db\n .prepare(\n `SELECT checkpoint_id FROM compaction_checkpoints\n WHERE transcript_id = ?\n ORDER BY created_at ASC`,\n )\n .all(transcriptId) as Array<{ checkpoint_id: string }>;\n if (rows.length <= MAX_CHECKPOINTS_PER_TRANSCRIPT) {\n return;\n }\n const toDelete = rows.slice(0, rows.length - MAX_CHECKPOINTS_PER_TRANSCRIPT);\n const del = db.prepare(`DELETE FROM compaction_checkpoints WHERE checkpoint_id = ?`);\n for (const row of toDelete) {\n del.run(row.checkpoint_id);\n }\n}\n\nexport function listCompactionCheckpoints(sessionKey: string): CompactionCheckpointSummary[] {\n const db = getSqliteDatabase();\n const rows = db\n .prepare(\n `SELECT checkpoint_id, created_at, message_count, size_bytes\n FROM compaction_checkpoints\n WHERE session_key = ?\n ORDER BY created_at DESC`,\n )\n .all(sessionKey) as Array<{\n checkpoint_id: string;\n created_at: number;\n message_count: number;\n size_bytes: number;\n }>;\n\n return rows.map((row) => ({\n id: row.checkpoint_id,\n sizeBytes: row.size_bytes,\n modifiedAt: new Date(row.created_at).toISOString(),\n }));\n}\n\nexport function getCompactionCheckpointDetail(\n sessionKey: string,\n checkpointId: string,\n): CompactionCheckpointDetail | null {\n const db = getSqliteDatabase();\n const row = db\n .prepare(\n `SELECT checkpoint_id, created_at, message_count, size_bytes\n FROM compaction_checkpoints\n WHERE session_key = ? AND checkpoint_id = ?`,\n )\n .get(sessionKey, checkpointId) as\n | {\n checkpoint_id: string;\n created_at: number;\n message_count: number;\n size_bytes: number;\n }\n | undefined;\n if (!row) {\n return null;\n }\n return {\n id: row.checkpoint_id,\n sizeBytes: row.size_bytes,\n modifiedAt: new Date(row.created_at).toISOString(),\n messageCount: row.message_count,\n };\n}\n\nexport function restoreCompactionCheckpoint(sessionKey: string, checkpointId: string): void {\n runSqliteWriteTransaction((db) => {\n const transcriptId = readCurrentTranscriptId(db, sessionKey);\n if (!transcriptId) {\n throw new Error(`Session not found: ${sessionKey}`);\n }\n\n const checkpoint = db\n .prepare(\n `SELECT checkpoint_id FROM compaction_checkpoints\n WHERE session_key = ? AND checkpoint_id = ?`,\n )\n .get(sessionKey, checkpointId) as { checkpoint_id: string } | undefined;\n if (!checkpoint) {\n throw new Error(`Checkpoint not found: ${checkpointId}`);\n }\n\n const entries = db\n .prepare(\n `SELECT seq, entry_kind, role, payload_json\n FROM checkpoint_entries\n WHERE checkpoint_id = ?\n ORDER BY seq ASC`,\n )\n .all(checkpointId) as Array<{\n seq: number;\n entry_kind: string;\n role: string | null;\n payload_json: string;\n }>;\n\n db.prepare(`DELETE FROM transcript_fts WHERE transcript_id = ?`).run(transcriptId);\n db.prepare(`DELETE FROM transcript_entries WHERE transcript_id = ?`).run(transcriptId);\n\n for (const entry of entries) {\n const payload = JSON.parse(entry.payload_json) as TranscriptStoredRow;\n insertEntry(db, {\n transcriptId,\n sessionKey,\n row: payload,\n createdAt: Date.now(),\n });\n }\n\n const llm = buildSessionContextForLlm(entries.map((e) => JSON.parse(e.payload_json) as TranscriptStoredRow));\n const now = Date.now();\n db.prepare(\n `UPDATE sessions SET\n message_count = ?,\n estimated_tokens = ?,\n updated_at = ?,\n last_accessed_at = ?,\n last_interaction_at = ?\n WHERE session_key = ?`,\n ).run(llm.length, estimateTokensFromMessages(llm), now, now, now, sessionKey);\n });\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { tmpdir } from "node:os";
2
- import { join } from "node:path";
3
- import { readFileSync, unlinkSync, writeFileSync } from "node:fs";
4
1
  import { randomUUID } from "node:crypto";
2
+ import { readFileSync, unlinkSync, writeFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { tmpdir } from "node:os";
5
5
  import { spawnSync } from "node:child_process";
6
6
  //#region src/tui/clipboard-image.ts
7
7
  const SUPPORTED_IMAGE_MIME_TYPES = [
@@ -2,8 +2,8 @@ import { resolveStateDir } from "../config/paths-state.js";
2
2
  import { init_paths } from "../config/paths.js";
3
3
  import { palette } from "./theme/dark.js";
4
4
  import { palette as palette$1 } from "./theme/light.js";
5
- import { join } from "node:path";
6
5
  import { existsSync, readFileSync, readdirSync } from "node:fs";
6
+ import { join } from "node:path";
7
7
  import chalk from "chalk";
8
8
  //#region src/tui/theme-manager.ts
9
9
  init_paths();
@@ -1,8 +1,8 @@
1
1
  import { resolveStateDir } from "../config/paths-state.js";
2
2
  import { init_paths } from "../config/paths.js";
3
3
  import { XOPC_TUI_KEYBINDINGS } from "./xopc-tui-keybindings.js";
4
- import { join } from "node:path";
5
4
  import { existsSync, readFileSync } from "node:fs";
5
+ import { join } from "node:path";
6
6
  import { KeybindingsManager } from "@earendil-works/pi-tui";
7
7
  //#region src/tui/tui-keybindings-file.ts
8
8
  init_paths();
@@ -1,6 +1,6 @@
1
- import { homedir } from "node:os";
2
- import { join } from "node:path";
3
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
4
  //#region src/tui/tui-scoped-models.ts
5
5
  const STORE_PATH = join(homedir(), ".xopc", "tui-scoped-models.json");
6
6
  function normalizeWorkspaceKey(cwd) {
@@ -1,7 +1,7 @@
1
1
  import { resolveStateDir } from "../config/paths-state.js";
2
2
  import { init_paths } from "../config/paths.js";
3
- import { join } from "node:path";
4
3
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
4
+ import { join } from "node:path";
5
5
  //#region src/tui/tui-settings.ts
6
6
  init_paths();
7
7
  const DEFAULT_TUI_SETTINGS = {
@@ -1,7 +1,7 @@
1
1
  import { version } from "../../package.js";
2
+ import { loadConfig } from "../config/loader.js";
2
3
  import { parseAgentSessionKey } from "../routing/session-key-utils.js";
3
4
  import { init_agent_session_key } from "../routing/agent-session-key.js";
4
- import { loadConfig } from "../config/loader.js";
5
5
  import "../config/index.js";
6
6
  import { resolveTuiSessionKey, resolveTuiStartupSessionKey } from "../routing/resolve-tui-session-key.js";
7
7
  import { saveClipboardImageToTempFile } from "./clipboard-image.js";
@@ -31,9 +31,9 @@ import { TuiBottomBar } from "./components/tui-bottom-bar.js";
31
31
  import { TuiHeader } from "./components/tui-header.js";
32
32
  import { loadExtensionsForTuiLocalMode } from "./extension-host/load-extensions.js";
33
33
  import { createTuiExtensionRuntime } from "./extension-host/runtime.js";
34
- import { tmpdir } from "node:os";
35
- import { join } from "node:path";
36
34
  import { mkdtempSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
35
+ import { join } from "node:path";
36
+ import { tmpdir } from "node:os";
37
37
  import { spawnSync } from "node:child_process";
38
38
  import { Container, Loader, ProcessTerminal, TUI, setKeybindings } from "@earendil-works/pi-tui";
39
39
  //#region src/tui/tui.ts
@@ -2,10 +2,10 @@ import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { init_paths, resolveBinDir } from "../config/paths.js";
4
4
  import { extractFrpcFromReleaseArchive, frpcReleaseArchiveExtension, nodePlatformForFrpTarget } from "./frpc-extract.js";
5
- import { tmpdir } from "node:os";
6
- import { join } from "node:path";
7
- import { chmodSync, createWriteStream, existsSync, mkdirSync, rmSync } from "node:fs";
8
5
  import { randomBytes } from "node:crypto";
6
+ import { chmodSync, createWriteStream, existsSync, mkdirSync, rmSync } from "node:fs";
7
+ import { join } from "node:path";
8
+ import { tmpdir } from "node:os";
9
9
  import { Readable } from "node:stream";
10
10
  import { pipeline } from "node:stream/promises";
11
11
  //#region src/tunnel/frpc-binary.ts
@@ -1,7 +1,7 @@
1
1
  import { resolveStateDir } from "../config/paths-state.js";
2
2
  import { init_paths } from "../config/paths.js";
3
- import { join } from "node:path";
4
3
  import { mkdirSync, writeFileSync } from "node:fs";
4
+ import { join } from "node:path";
5
5
  //#region src/tunnel/frpc-config.ts
6
6
  init_paths();
7
7
  function resolveFrpcConfigPath(tunnelId) {
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
- import { dirname, join } from "node:path";
4
3
  import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
4
+ import { dirname, join } from "node:path";
5
5
  import { spawn } from "node:child_process";
6
6
  import AdmZip from "adm-zip";
7
7
  import { gunzipSync } from "node:zlib";
@@ -1,7 +1,7 @@
1
1
  import { resolveStateDir } from "../config/paths-state.js";
2
2
  import { init_paths } from "../config/paths.js";
3
- import { join } from "node:path";
4
3
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
4
+ import { join } from "node:path";
5
5
  //#region src/tunnel/tunnel-state.ts
6
6
  init_paths();
7
7
  const TUNNEL_STATE_FILE = "tunnel.json";
@@ -1,8 +1,8 @@
1
1
  import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
2
2
  import { getLogDir, init_config } from "./config.js";
3
+ import { appendFile } from "fs/promises";
3
4
  import path from "path";
4
5
  import { existsSync, mkdirSync } from "fs";
5
- import { appendFile } from "fs/promises";
6
6
  //#region src/utils/logger/audit.ts
7
7
  /**
8
8
  * Audit Log
@@ -1,8 +1,8 @@
1
1
  import { init_pino_record, logEntrySearchText, pinoRecordToLogEntry } from "./pino-record.js";
2
+ import { readFile } from "fs/promises";
2
3
  import { basename, join } from "path";
3
4
  import { createReadStream, existsSync, mkdirSync, readdirSync, statSync } from "fs";
4
5
  import { Readable } from "stream";
5
- import { readFile } from "fs/promises";
6
6
  import { gunzip } from "zlib";
7
7
  import { promisify } from "util";
8
8
  import { createInterface } from "readline";
@@ -1,8 +1,8 @@
1
1
  import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
2
2
  import { config, getLogDir, init_config } from "./config.js";
3
+ import { writeFile } from "fs/promises";
3
4
  import { join } from "path";
4
5
  import { readFileSync, readdirSync, statSync, unlinkSync } from "fs";
5
- import { writeFile } from "fs/promises";
6
6
  import { gzip } from "zlib";
7
7
  import { promisify } from "util";
8
8
  //#region src/utils/logger/rotation.ts
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { join } from "path";
4
3
  import { unlink, writeFile } from "fs/promises";
4
+ import { join } from "path";
5
5
  import { spawn } from "child_process";
6
6
  import { tmpdir } from "os";
7
7
  //#region src/voice/tts/audio.ts
@@ -1,9 +1,9 @@
1
1
  import { createLogger } from "../../../utils/logger/index.js";
2
2
  import { init_logger } from "../../../utils/logger.js";
3
3
  import { registerSpeechProvider } from "../speech-registry.js";
4
- import { tmpdir } from "node:os";
5
- import path from "node:path";
6
4
  import { mkdtempSync, readFileSync, rmSync } from "node:fs";
5
+ import path from "node:path";
6
+ import { tmpdir } from "node:os";
7
7
  //#region src/voice/tts/providers/edge-speech.ts
8
8
  /**
9
9
  * Edge TTS provider — wraps the `node-edge-tts` package. Requires no API key
@@ -1,9 +1,8 @@
1
- import { appendPiTranscriptContextEntry, appendPiTranscriptMessage } from "../../session/parity/jsonl-transcript-io.js";
1
+ import "../../session/types.js";
2
2
  import { renderWorkflowText } from "../../agent/workflow/snapshot.js";
3
3
  import { isTerminalWorkflowRunStatus } from "../domain/run.js";
4
4
  import "../domain/index.js";
5
5
  import { runViewToSnapshot } from "./run-view-to-snapshot.js";
6
- import "../../session/types.js";
7
6
  import { buildWorkflowRunSessionKey } from "./workflow-session-key.js";
8
7
  import { randomUUID } from "node:crypto";
9
8
  //#region src/workflows/service/workflow-session-bridge.ts
@@ -31,19 +30,13 @@ var WorkflowSessionBridge = class {
31
30
  ...params.parentSessionKey ? { parentSessionKey: params.parentSessionKey } : {}
32
31
  }
33
32
  });
34
- const { absPath } = await store.resolveTranscriptPath(sessionKey);
35
- await appendPiTranscriptMessage({
36
- absPath,
37
- cwd: process.cwd(),
38
- sessionKey,
39
- message: {
40
- role: "user",
41
- content: [{
42
- type: "text",
43
- text: goalText
44
- }],
45
- timestamp: Date.now()
46
- }
33
+ await store.appendTranscriptMessage(sessionKey, {
34
+ role: "user",
35
+ content: [{
36
+ type: "text",
37
+ text: goalText
38
+ }],
39
+ timestamp: Date.now()
47
40
  });
48
41
  if (params.parentSessionKey?.trim()) await this.writeParentRunLink({
49
42
  parentSessionKey: params.parentSessionKey.trim(),
@@ -78,7 +71,6 @@ var WorkflowSessionBridge = class {
78
71
  }
79
72
  async persistTerminalTranscript(sessionKey, view) {
80
73
  const store = this.gateway.sessionIndexInstance.getStore();
81
- const { absPath } = await store.resolveTranscriptPath(sessionKey);
82
74
  const snapshot = runViewToSnapshot(view);
83
75
  const toolCallId = randomUUID();
84
76
  const envelope = {
@@ -89,60 +81,45 @@ var WorkflowSessionBridge = class {
89
81
  details: snapshot
90
82
  };
91
83
  const isError = view.run.status === "failed" || view.run.status === "timeout";
92
- await appendPiTranscriptMessage({
93
- absPath,
94
- cwd: process.cwd(),
95
- sessionKey,
96
- message: {
97
- role: "assistant",
98
- content: [{
99
- type: "toolCall",
100
- id: toolCallId,
101
- name: "workflow",
102
- arguments: { name: view.run.definitionId }
103
- }],
104
- timestamp: Date.now()
105
- }
84
+ await store.appendTranscriptMessage(sessionKey, {
85
+ role: "assistant",
86
+ content: [{
87
+ type: "toolCall",
88
+ id: toolCallId,
89
+ name: "workflow",
90
+ arguments: { name: view.run.definitionId }
91
+ }],
92
+ timestamp: Date.now()
106
93
  });
107
- await appendPiTranscriptMessage({
108
- absPath,
109
- cwd: process.cwd(),
110
- sessionKey,
111
- message: {
112
- role: "toolResult",
113
- toolCallId,
114
- content: [{
115
- type: "text",
116
- text: JSON.stringify(envelope)
117
- }],
118
- details: snapshot,
119
- isError,
120
- timestamp: Date.now()
121
- }
94
+ await store.appendTranscriptMessage(sessionKey, {
95
+ role: "toolResult",
96
+ toolCallId,
97
+ content: [{
98
+ type: "text",
99
+ text: JSON.stringify(envelope)
100
+ }],
101
+ details: snapshot,
102
+ isError,
103
+ timestamp: Date.now()
122
104
  });
123
105
  await store.updateMetadata(sessionKey, { status: "active" });
124
106
  }
125
107
  async writeParentRunLink(params) {
126
- const { absPath } = await this.gateway.sessionIndexInstance.getStore().resolveTranscriptPath(params.parentSessionKey);
108
+ const store = this.gateway.sessionIndexInstance.getStore();
127
109
  const text = formatParentRunLinkText(params);
128
- await appendPiTranscriptContextEntry({
129
- absPath,
130
- cwd: process.cwd(),
131
- sessionKey: params.parentSessionKey,
132
- entry: {
133
- kind: "context",
134
- id: `workflow-run-link:${params.runId}`,
135
- text,
136
- data: {
137
- kind: WORKFLOW_RUN_LINK_CONTEXT_KIND,
138
- runId: params.runId,
139
- workflowSessionKey: params.workflowSessionKey,
140
- definitionId: params.definitionId,
141
- goal: params.goal,
142
- status: params.status
143
- },
144
- createdAt: (/* @__PURE__ */ new Date()).toISOString()
145
- }
110
+ await store.appendTranscriptContextEntry(params.parentSessionKey, {
111
+ kind: "context",
112
+ id: `workflow-run-link:${params.runId}`,
113
+ text,
114
+ data: {
115
+ kind: WORKFLOW_RUN_LINK_CONTEXT_KIND,
116
+ runId: params.runId,
117
+ workflowSessionKey: params.workflowSessionKey,
118
+ definitionId: params.definitionId,
119
+ goal: params.goal,
120
+ status: params.status
121
+ },
122
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
146
123
  });
147
124
  }
148
125
  };