@xopcai/xopc 0.0.6 → 0.0.11

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 (412) hide show
  1. package/dist/extensions/weixin/src/api/api.js +1 -1
  2. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  3. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  4. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  5. package/dist/gateway/static/root/assets/{agents-B6s2BvpH.js → agents-BdC4Y-HX.js} +2 -2
  6. package/dist/gateway/static/root/assets/agents-BdC4Y-HX.js.map +1 -0
  7. package/dist/gateway/static/root/assets/{apps-page-BtsZ5ZPx.js → apps-page-C-oaSHkm.js} +2 -2
  8. package/dist/gateway/static/root/assets/{apps-page-BtsZ5ZPx.js.map → apps-page-C-oaSHkm.js.map} +1 -1
  9. package/dist/gateway/static/root/assets/attachment-load-BDDlItdE.js +1 -0
  10. package/dist/gateway/static/root/assets/{channels-settings-BUfWBEVU.js → channels-settings-BqEUppPO.js} +2 -2
  11. package/dist/gateway/static/root/assets/{channels-settings-BUfWBEVU.js.map → channels-settings-BqEUppPO.js.map} +1 -1
  12. package/dist/gateway/static/root/assets/{chat-agents-api-BR30M2YQ.js → chat-agents-api-BhqjQ7iL.js} +2 -2
  13. package/dist/gateway/static/root/assets/{chat-agents-api-BR30M2YQ.js.map → chat-agents-api-BhqjQ7iL.js.map} +1 -1
  14. package/dist/gateway/static/root/assets/{cron-page-CMTx0Mjz.js → cron-page-Cli49RKR.js} +2 -2
  15. package/dist/gateway/static/root/assets/{cron-page-CMTx0Mjz.js.map → cron-page-Cli49RKR.js.map} +1 -1
  16. package/dist/gateway/static/root/assets/{cron-utils-BJma9IcD.js → cron-utils-Dkj-Ldpf.js} +2 -2
  17. package/dist/gateway/static/root/assets/{cron-utils-BJma9IcD.js.map → cron-utils-Dkj-Ldpf.js.map} +1 -1
  18. package/dist/gateway/static/root/assets/electron-env-BDtJw9AY.js +2 -0
  19. package/dist/gateway/static/root/assets/electron-env-BDtJw9AY.js.map +1 -0
  20. package/dist/gateway/static/root/assets/{extension-debug-page-BCVoNSo6.js → extension-debug-page-BMcZlaxF.js} +2 -2
  21. package/dist/gateway/static/root/assets/{extension-debug-page-BCVoNSo6.js.map → extension-debug-page-BMcZlaxF.js.map} +1 -1
  22. package/dist/gateway/static/root/assets/{extension-iframe-host-PWB-Pw2d.js → extension-iframe-host-D5HEF0KR.js} +2 -2
  23. package/dist/gateway/static/root/assets/{extension-iframe-host-PWB-Pw2d.js.map → extension-iframe-host-D5HEF0KR.js.map} +1 -1
  24. package/dist/gateway/static/root/assets/{extension-page-D2tTklsD.js → extension-page-CXdCSSPl.js} +2 -2
  25. package/dist/gateway/static/root/assets/{extension-page-D2tTklsD.js.map → extension-page-CXdCSSPl.js.map} +1 -1
  26. package/dist/gateway/static/root/assets/{extension-provider-BpHodVRj.js → extension-provider-DZCZgQE2.js} +2 -2
  27. package/dist/gateway/static/root/assets/{extension-provider-BpHodVRj.js.map → extension-provider-DZCZgQE2.js.map} +1 -1
  28. package/dist/gateway/static/root/assets/{extension-settings-page-BEu6Xw1Z.js → extension-settings-page-CX6STpx3.js} +2 -2
  29. package/dist/gateway/static/root/assets/{extension-settings-page-BEu6Xw1Z.js.map → extension-settings-page-CX6STpx3.js.map} +1 -1
  30. package/dist/gateway/static/root/assets/{gateway-config-swr-C7ZFPhNj.js → gateway-config-swr-Cph02QZn.js} +2 -2
  31. package/dist/gateway/static/root/assets/{gateway-config-swr-C7ZFPhNj.js.map → gateway-config-swr-Cph02QZn.js.map} +1 -1
  32. package/dist/gateway/static/root/assets/index-Bty3m0mS.css +2 -0
  33. package/dist/gateway/static/root/assets/index-iTUyfzNr.js +16 -0
  34. package/dist/gateway/static/root/assets/index-iTUyfzNr.js.map +1 -0
  35. package/dist/gateway/static/root/assets/{logs-page-BpsxYdcL.js → logs-page-B9O5l3I8.js} +2 -2
  36. package/dist/gateway/static/root/assets/{logs-page-BpsxYdcL.js.map → logs-page-B9O5l3I8.js.map} +1 -1
  37. package/dist/gateway/static/root/assets/{model-selector-BiiDq8Pk.js → model-selector-BLiY_O25.js} +2 -2
  38. package/dist/gateway/static/root/assets/{model-selector-BiiDq8Pk.js.map → model-selector-BLiY_O25.js.map} +1 -1
  39. package/dist/gateway/static/root/assets/navigation-DB9S-C6S.js +2 -0
  40. package/dist/gateway/static/root/assets/navigation-DB9S-C6S.js.map +1 -0
  41. package/dist/gateway/static/root/assets/page-header-store-BFpnFTed.js +2 -0
  42. package/dist/gateway/static/root/assets/{page-header-store-HcRZK5CZ.js.map → page-header-store-BFpnFTed.js.map} +1 -1
  43. package/dist/gateway/static/root/assets/{session-api-DxNaAkmX.js → session-api-DEhQXWJg.js} +2 -2
  44. package/dist/gateway/static/root/assets/{session-api-DxNaAkmX.js.map → session-api-DEhQXWJg.js.map} +1 -1
  45. package/dist/gateway/static/root/assets/{session-working-directory-control-CDH-Wk4E.js → session-working-directory-control-DKOtWs3-.js} +3 -3
  46. package/dist/gateway/static/root/assets/{session-working-directory-control-CDH-Wk4E.js.map → session-working-directory-control-DKOtWs3-.js.map} +1 -1
  47. package/dist/gateway/static/root/assets/{sessions-page-5PK75r1n.js → sessions-page-BYlWP1ep.js} +2 -2
  48. package/dist/gateway/static/root/assets/{sessions-page-5PK75r1n.js.map → sessions-page-BYlWP1ep.js.map} +1 -1
  49. package/dist/gateway/static/root/assets/settings-page-oCnIavdg.js +2 -0
  50. package/dist/gateway/static/root/assets/settings-page-oCnIavdg.js.map +1 -0
  51. package/dist/gateway/static/root/assets/{skill-api-CxbNlOD_.js → skill-api-DWrn8Az0.js} +2 -2
  52. package/dist/gateway/static/root/assets/{skill-api-CxbNlOD_.js.map → skill-api-DWrn8Az0.js.map} +1 -1
  53. package/dist/gateway/static/root/assets/{skills-page-Dd8ZzYJb.js → skills-page-C59WQpM1.js} +2 -2
  54. package/dist/gateway/static/root/assets/{skills-page-Dd8ZzYJb.js.map → skills-page-C59WQpM1.js.map} +1 -1
  55. package/dist/gateway/static/root/assets/{theme-store-CPTH77BE.js → theme-store-CywXkKml.js} +2 -2
  56. package/dist/gateway/static/root/assets/{theme-store-CPTH77BE.js.map → theme-store-CywXkKml.js.map} +1 -1
  57. package/dist/gateway/static/root/assets/url-D7yWllI8.js +2 -0
  58. package/dist/gateway/static/root/assets/url-D7yWllI8.js.map +1 -0
  59. package/dist/gateway/static/root/assets/{useTranslation-BEUWOMuh.js → useTranslation-CACj0DBJ.js} +2 -2
  60. package/dist/gateway/static/root/assets/{useTranslation-BEUWOMuh.js.map → useTranslation-CACj0DBJ.js.map} +1 -1
  61. package/dist/gateway/static/root/index.html +16 -16
  62. package/dist/package.js +1 -1
  63. package/dist/src/agent/agent-manager.d.ts +1 -0
  64. package/dist/src/agent/agent-manager.js +17 -9
  65. package/dist/src/agent/agent-manager.js.map +1 -1
  66. package/dist/src/agent/background-review/run-background-review.js +2 -0
  67. package/dist/src/agent/background-review/run-background-review.js.map +1 -1
  68. package/dist/src/agent/child-agent-factory.js +2 -0
  69. package/dist/src/agent/child-agent-factory.js.map +1 -1
  70. package/dist/src/agent/context/expand-at-file-mentions.d.ts +4 -0
  71. package/dist/src/agent/context/expand-at-file-mentions.js +69 -0
  72. package/dist/src/agent/context/expand-at-file-mentions.js.map +1 -0
  73. package/dist/src/agent/context/workspace-seed.js +1 -1
  74. package/dist/src/agent/image/index.d.ts +0 -1
  75. package/dist/src/agent/image/index.js +1 -2
  76. package/dist/src/agent/image/understanding/pi-ai-provider.js.map +1 -1
  77. package/dist/src/agent/ipc/inbox.js +1 -1
  78. package/dist/src/agent/ipc/socket.js +1 -1
  79. package/dist/src/agent/memory/compaction.d.ts +1 -1
  80. package/dist/src/agent/memory/compaction.js +38 -11
  81. package/dist/src/agent/memory/compaction.js.map +1 -1
  82. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  83. package/dist/src/agent/messaging/command-handler.d.ts +13 -0
  84. package/dist/src/agent/messaging/command-handler.js +14 -2
  85. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  86. package/dist/src/agent/orchestration/agent-orchestrator.js +6 -1
  87. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  88. package/dist/src/agent/service.d.ts +16 -1
  89. package/dist/src/agent/service.js +175 -17
  90. package/dist/src/agent/service.js.map +1 -1
  91. package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
  92. package/dist/src/agent/skills/hub-hash.js +1 -1
  93. package/dist/src/agent/skills/hub-pull.js +1 -1
  94. package/dist/src/agent/skills/scanner.js +1 -1
  95. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  96. package/dist/src/agent/skills/skill-manage-ops.js.map +1 -1
  97. package/dist/src/agent/tools/browser/tools.js +2 -2
  98. package/dist/src/agent/tools/browser/tools.js.map +1 -1
  99. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  100. package/dist/src/agent/tools/image-tool.js +2 -2
  101. package/dist/src/agent/tools/image-tool.js.map +1 -1
  102. package/dist/src/agent/tools/index.d.ts +1 -1
  103. package/dist/src/agent/tools/index.js +2 -2
  104. package/dist/src/agent/tools/read.d.ts +0 -2
  105. package/dist/src/agent/tools/read.js +1 -3
  106. package/dist/src/agent/tools/read.js.map +1 -1
  107. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  108. package/dist/src/agent/tools/write.js +1 -1
  109. package/dist/src/auth/credentials.js +2 -2
  110. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  111. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  112. package/dist/src/channels/index.d.ts +1 -1
  113. package/dist/src/channels/index.js +2 -2
  114. package/dist/src/channels/pipeline.d.ts +8 -1
  115. package/dist/src/channels/pipeline.js +49 -4
  116. package/dist/src/channels/pipeline.js.map +1 -1
  117. package/dist/src/channels/plugin-types.d.ts +14 -0
  118. package/dist/src/chat-commands/builtins/config.d.ts +4 -0
  119. package/dist/src/chat-commands/builtins/config.js +197 -0
  120. package/dist/src/chat-commands/builtins/config.js.map +1 -0
  121. package/dist/src/chat-commands/builtins/context.d.ts +4 -0
  122. package/dist/src/chat-commands/builtins/context.js +44 -0
  123. package/dist/src/chat-commands/builtins/context.js.map +1 -0
  124. package/dist/src/chat-commands/builtins/session.js +111 -0
  125. package/dist/src/chat-commands/builtins/session.js.map +1 -1
  126. package/dist/src/chat-commands/builtins/thinking.js +49 -21
  127. package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
  128. package/dist/src/chat-commands/config-paths.d.ts +10 -0
  129. package/dist/src/chat-commands/config-paths.js +45 -0
  130. package/dist/src/chat-commands/config-paths.js.map +1 -0
  131. package/dist/src/chat-commands/config-value.d.ts +12 -0
  132. package/dist/src/chat-commands/config-value.js +53 -0
  133. package/dist/src/chat-commands/config-value.js.map +1 -0
  134. package/dist/src/chat-commands/context.d.ts +24 -1
  135. package/dist/src/chat-commands/context.js +41 -0
  136. package/dist/src/chat-commands/context.js.map +1 -1
  137. package/dist/src/chat-commands/index.d.ts +2 -0
  138. package/dist/src/chat-commands/index.js +5 -1
  139. package/dist/src/chat-commands/index.js.map +1 -1
  140. package/dist/src/chat-commands/types.d.ts +33 -1
  141. package/dist/src/cli/commands/agent/interactive.js +1 -1
  142. package/dist/src/cli/commands/agent/interactive.js.map +1 -1
  143. package/dist/src/cli/commands/agent.js +21 -9
  144. package/dist/src/cli/commands/agent.js.map +1 -1
  145. package/dist/src/cli/commands/auth.js.map +1 -1
  146. package/dist/src/cli/commands/doctor/checks/channel-config.d.ts +2 -0
  147. package/dist/src/cli/commands/doctor/checks/channel-config.js +113 -0
  148. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -0
  149. package/dist/src/cli/commands/doctor/checks/channel-plugins.d.ts +2 -0
  150. package/dist/src/cli/commands/doctor/checks/channel-plugins.js +47 -0
  151. package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -0
  152. package/dist/src/cli/commands/doctor/checks/config-health.d.ts +2 -0
  153. package/dist/src/cli/commands/doctor/checks/config-health.js +82 -0
  154. package/dist/src/cli/commands/doctor/checks/config-health.js.map +1 -0
  155. package/dist/src/cli/commands/doctor/checks/cron-health.d.ts +2 -0
  156. package/dist/src/cli/commands/doctor/checks/cron-health.js +116 -0
  157. package/dist/src/cli/commands/doctor/checks/cron-health.js.map +1 -0
  158. package/dist/src/cli/commands/doctor/checks/gateway-health.d.ts +2 -0
  159. package/dist/src/cli/commands/doctor/checks/gateway-health.js +64 -0
  160. package/dist/src/cli/commands/doctor/checks/gateway-health.js.map +1 -0
  161. package/dist/src/cli/commands/doctor/checks/gateway-service.d.ts +2 -0
  162. package/dist/src/cli/commands/doctor/checks/gateway-service.js +64 -0
  163. package/dist/src/cli/commands/doctor/checks/gateway-service.js.map +1 -0
  164. package/dist/src/cli/commands/doctor/checks/node-version.d.ts +2 -0
  165. package/dist/src/cli/commands/doctor/checks/node-version.js +33 -0
  166. package/dist/src/cli/commands/doctor/checks/node-version.js.map +1 -0
  167. package/dist/src/cli/commands/doctor/checks/provider-auth.d.ts +2 -0
  168. package/dist/src/cli/commands/doctor/checks/provider-auth.js +91 -0
  169. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -0
  170. package/dist/src/cli/commands/doctor/checks/security-audit.d.ts +2 -0
  171. package/dist/src/cli/commands/doctor/checks/security-audit.js +85 -0
  172. package/dist/src/cli/commands/doctor/checks/security-audit.js.map +1 -0
  173. package/dist/src/cli/commands/doctor/checks/session-integrity.d.ts +2 -0
  174. package/dist/src/cli/commands/doctor/checks/session-integrity.js +118 -0
  175. package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -0
  176. package/dist/src/cli/commands/doctor/checks/state-integrity.d.ts +2 -0
  177. package/dist/src/cli/commands/doctor/checks/state-integrity.js +99 -0
  178. package/dist/src/cli/commands/doctor/checks/state-integrity.js.map +1 -0
  179. package/dist/src/cli/commands/doctor/checks/version-check.d.ts +2 -0
  180. package/dist/src/cli/commands/doctor/checks/version-check.js +71 -0
  181. package/dist/src/cli/commands/doctor/checks/version-check.js.map +1 -0
  182. package/dist/src/cli/commands/doctor/checks/workspace-status.d.ts +2 -0
  183. package/dist/src/cli/commands/doctor/checks/workspace-status.js +73 -0
  184. package/dist/src/cli/commands/doctor/checks/workspace-status.js.map +1 -0
  185. package/dist/src/cli/commands/doctor/flow.d.ts +9 -0
  186. package/dist/src/cli/commands/doctor/flow.js +51 -0
  187. package/dist/src/cli/commands/doctor/flow.js.map +1 -0
  188. package/dist/src/cli/commands/doctor/format.d.ts +6 -0
  189. package/dist/src/cli/commands/doctor/format.js +61 -0
  190. package/dist/src/cli/commands/doctor/format.js.map +1 -0
  191. package/dist/src/cli/commands/doctor/index.js +44 -0
  192. package/dist/src/cli/commands/doctor/index.js.map +1 -0
  193. package/dist/src/cli/commands/doctor/types.d.ts +20 -0
  194. package/dist/src/cli/commands/doctor/types.js +1 -0
  195. package/dist/src/cli/commands/extension.js +10 -0
  196. package/dist/src/cli/commands/extension.js.map +1 -1
  197. package/dist/src/cli/commands/init.js +1 -2
  198. package/dist/src/cli/commands/init.js.map +1 -1
  199. package/dist/src/cli/commands/session/utils.js.map +1 -1
  200. package/dist/src/cli/commands/update.d.ts +1 -0
  201. package/dist/src/cli/commands/update.js +171 -0
  202. package/dist/src/cli/commands/update.js.map +1 -0
  203. package/dist/src/cli/index.d.ts +2 -2
  204. package/dist/src/cli/index.js +4 -2
  205. package/dist/src/cli/index.js.map +1 -1
  206. package/dist/src/cli/utils/init-workspace.js +1 -1
  207. package/dist/src/config/index.d.ts +1 -0
  208. package/dist/src/config/index.js +4 -3
  209. package/dist/src/config/index.js.map +1 -1
  210. package/dist/src/config/loader.js +1 -1
  211. package/dist/src/config/models-json.d.ts +15 -15
  212. package/dist/src/config/paths.js.map +1 -1
  213. package/dist/src/config/profile.js +1 -1
  214. package/dist/src/config/runtime-overrides.d.ts +8 -0
  215. package/dist/src/config/runtime-overrides.js +40 -0
  216. package/dist/src/config/runtime-overrides.js.map +1 -0
  217. package/dist/src/config/schema.d.ts +34 -104
  218. package/dist/src/config/schema.js +18 -39
  219. package/dist/src/config/schema.js.map +1 -1
  220. package/dist/src/cron/persistence.js +1 -1
  221. package/dist/src/cron/run-log-store.js +1 -1
  222. package/dist/src/daemon/launchd.js +2 -2
  223. package/dist/src/daemon/launchd.js.map +1 -1
  224. package/dist/src/daemon/systemd.js +2 -2
  225. package/dist/src/daemon/systemd.js.map +1 -1
  226. package/dist/src/extensions/health.js +1 -1
  227. package/dist/src/extensions/loader.d.ts +1 -1
  228. package/dist/src/extensions/loader.js +5 -8
  229. package/dist/src/extensions/loader.js.map +1 -1
  230. package/dist/src/extensions/lockfile.js +1 -1
  231. package/dist/src/extensions/sdk/index.js +6 -1
  232. package/dist/src/extensions/sdk/index.js.map +1 -0
  233. package/dist/src/gateway/agents-admin.js +1 -1
  234. package/dist/src/gateway/agents-admin.js.map +1 -1
  235. package/dist/src/gateway/hono/lib/static-ui.js +1 -1
  236. package/dist/src/gateway/hono/oauth.js +1 -1
  237. package/dist/src/gateway/hono/routes/config.js +1 -1
  238. package/dist/src/gateway/hono/routes/doctor.d.ts +3 -0
  239. package/dist/src/gateway/hono/routes/doctor.js +35 -0
  240. package/dist/src/gateway/hono/routes/doctor.js.map +1 -0
  241. package/dist/src/gateway/hono/routes/index.js +4 -0
  242. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  243. package/dist/src/gateway/hono/routes/models.js +64 -11
  244. package/dist/src/gateway/hono/routes/models.js.map +1 -1
  245. package/dist/src/gateway/hono/routes/public-gateway.js +10 -0
  246. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  247. package/dist/src/gateway/hono/routes/update.d.ts +3 -0
  248. package/dist/src/gateway/hono/routes/update.js +141 -0
  249. package/dist/src/gateway/hono/routes/update.js.map +1 -0
  250. package/dist/src/gateway/hono/routes/workspace.js +82 -2
  251. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  252. package/dist/src/gateway/lock.js +1 -1
  253. package/dist/src/gateway/ports.js +98 -3
  254. package/dist/src/gateway/ports.js.map +1 -1
  255. package/dist/src/gateway/service.d.ts +1 -4
  256. package/dist/src/gateway/service.js +13 -20
  257. package/dist/src/gateway/service.js.map +1 -1
  258. package/dist/src/gateway/workspace-fs-file-list.d.ts +5 -0
  259. package/dist/src/gateway/workspace-fs-file-list.js +56 -0
  260. package/dist/src/gateway/workspace-fs-file-list.js.map +1 -0
  261. package/dist/src/gateway/workspace-heartbeat-path.js +1 -1
  262. package/dist/src/gateway/workspace-ripgrep.d.ts +5 -0
  263. package/dist/src/gateway/workspace-ripgrep.js +88 -4
  264. package/dist/src/gateway/workspace-ripgrep.js.map +1 -1
  265. package/dist/src/infra/update-channels.d.ts +14 -0
  266. package/dist/src/infra/update-channels.js +30 -0
  267. package/dist/src/infra/update-channels.js.map +1 -0
  268. package/dist/src/infra/update-check.d.ts +53 -0
  269. package/dist/src/infra/update-check.js +155 -0
  270. package/dist/src/infra/update-check.js.map +1 -0
  271. package/dist/src/infra/update-runner.d.ts +18 -0
  272. package/dist/src/infra/update-runner.js +112 -0
  273. package/dist/src/infra/update-runner.js.map +1 -0
  274. package/dist/src/infra/update-startup.d.ts +20 -0
  275. package/dist/src/infra/update-startup.js +246 -0
  276. package/dist/src/infra/update-startup.js.map +1 -0
  277. package/dist/src/providers/extension-stream-bridge.d.ts +3 -0
  278. package/dist/src/providers/extension-stream-bridge.js +239 -0
  279. package/dist/src/providers/extension-stream-bridge.js.map +1 -0
  280. package/dist/src/providers/index.d.ts +7 -2
  281. package/dist/src/providers/index.js +77 -14
  282. package/dist/src/providers/index.js.map +1 -1
  283. package/dist/src/providers/model-registry.js +1 -1
  284. package/dist/src/providers/plugin-registry.js +92 -87
  285. package/dist/src/providers/plugin-registry.js.map +1 -1
  286. package/dist/src/routing/bindings.js +1 -1
  287. package/dist/src/routing/index.d.ts +1 -1
  288. package/dist/src/routing/index.js +2 -2
  289. package/dist/src/routing/index.js.map +1 -1
  290. package/dist/src/routing/resolve-route.js +1 -1
  291. package/dist/src/routing/session-key.d.ts +0 -5
  292. package/dist/src/routing/session-key.js +1 -27
  293. package/dist/src/routing/session-key.js.map +1 -1
  294. package/dist/src/session/chat-export.d.ts +5 -0
  295. package/dist/src/session/chat-export.js +35 -0
  296. package/dist/src/session/chat-export.js.map +1 -0
  297. package/dist/src/session/config-store.js +1 -1
  298. package/dist/src/session/manager.d.ts +1 -1
  299. package/dist/src/session/manager.js +2 -2
  300. package/dist/src/session/manager.js.map +1 -1
  301. package/dist/src/session/store.d.ts +1 -1
  302. package/dist/src/session/store.js +3 -7
  303. package/dist/src/session/store.js.map +1 -1
  304. package/dist/src/session/types.d.ts +0 -10
  305. package/dist/src/session/types.js.map +1 -1
  306. package/dist/src/utils/logger/audit.js +1 -1
  307. package/dist/src/utils/logger/log-store.js +1 -1
  308. package/dist/src/utils/logger/rotation.js +1 -1
  309. package/dist/src/voice/tts/audio.js +1 -1
  310. package/package.json +2 -2
  311. package/dist/gateway/static/root/assets/agents-B6s2BvpH.js.map +0 -1
  312. package/dist/gateway/static/root/assets/attachment-load-6pRlDPZ8.js +0 -1
  313. package/dist/gateway/static/root/assets/index-DBZ5eXW5.js +0 -16
  314. package/dist/gateway/static/root/assets/index-DBZ5eXW5.js.map +0 -1
  315. package/dist/gateway/static/root/assets/index-KsVMH-Jo.css +0 -2
  316. package/dist/gateway/static/root/assets/navigation-BpLKd2Ca.js +0 -2
  317. package/dist/gateway/static/root/assets/navigation-BpLKd2Ca.js.map +0 -1
  318. package/dist/gateway/static/root/assets/page-header-store-HcRZK5CZ.js +0 -2
  319. package/dist/gateway/static/root/assets/preference-select-fields-B4AJBqUY.js +0 -2
  320. package/dist/gateway/static/root/assets/preference-select-fields-B4AJBqUY.js.map +0 -1
  321. package/dist/gateway/static/root/assets/settings-page-BvSj0JqX.js +0 -2
  322. package/dist/gateway/static/root/assets/settings-page-BvSj0JqX.js.map +0 -1
  323. package/dist/gateway/static/root/assets/url-QmwQTJ-j.js +0 -2
  324. package/dist/gateway/static/root/assets/url-QmwQTJ-j.js.map +0 -1
  325. package/dist/src/acp/commands.d.ts +0 -11
  326. package/dist/src/acp/commands.js +0 -17
  327. package/dist/src/acp/commands.js.map +0 -1
  328. package/dist/src/acp/control-plane/identity-reconcile.d.ts +0 -36
  329. package/dist/src/acp/control-plane/identity-reconcile.js +0 -124
  330. package/dist/src/acp/control-plane/identity-reconcile.js.map +0 -1
  331. package/dist/src/acp/control-plane/index.d.ts +0 -10
  332. package/dist/src/acp/control-plane/index.js +0 -6
  333. package/dist/src/acp/control-plane/manager.d.ts +0 -86
  334. package/dist/src/acp/control-plane/manager.js +0 -502
  335. package/dist/src/acp/control-plane/manager.js.map +0 -1
  336. package/dist/src/acp/control-plane/manager.types.d.ts +0 -125
  337. package/dist/src/acp/control-plane/manager.types.js +0 -14
  338. package/dist/src/acp/control-plane/manager.types.js.map +0 -1
  339. package/dist/src/acp/control-plane/manager.utils.d.ts +0 -29
  340. package/dist/src/acp/control-plane/manager.utils.js +0 -46
  341. package/dist/src/acp/control-plane/manager.utils.js.map +0 -1
  342. package/dist/src/acp/control-plane/runtime-cache-manager.d.ts +0 -49
  343. package/dist/src/acp/control-plane/runtime-cache-manager.js +0 -155
  344. package/dist/src/acp/control-plane/runtime-cache-manager.js.map +0 -1
  345. package/dist/src/acp/control-plane/runtime-cache.d.ts +0 -45
  346. package/dist/src/acp/control-plane/runtime-cache.js +0 -58
  347. package/dist/src/acp/control-plane/runtime-cache.js.map +0 -1
  348. package/dist/src/acp/control-plane/runtime-options.d.ts +0 -30
  349. package/dist/src/acp/control-plane/runtime-options.js +0 -92
  350. package/dist/src/acp/control-plane/runtime-options.js.map +0 -1
  351. package/dist/src/acp/control-plane/session-actor-queue.d.ts +0 -22
  352. package/dist/src/acp/control-plane/session-actor-queue.js +0 -70
  353. package/dist/src/acp/control-plane/session-actor-queue.js.map +0 -1
  354. package/dist/src/acp/control-plane/session-lifecycle-manager.d.ts +0 -59
  355. package/dist/src/acp/control-plane/session-lifecycle-manager.js +0 -209
  356. package/dist/src/acp/control-plane/session-lifecycle-manager.js.map +0 -1
  357. package/dist/src/acp/control-plane/session-store.d.ts +0 -39
  358. package/dist/src/acp/control-plane/session-store.js +0 -149
  359. package/dist/src/acp/control-plane/session-store.js.map +0 -1
  360. package/dist/src/acp/control-plane/turn-manager.d.ts +0 -40
  361. package/dist/src/acp/control-plane/turn-manager.js +0 -134
  362. package/dist/src/acp/control-plane/turn-manager.js.map +0 -1
  363. package/dist/src/acp/event-mapper.d.ts +0 -48
  364. package/dist/src/acp/event-mapper.js +0 -94
  365. package/dist/src/acp/event-mapper.js.map +0 -1
  366. package/dist/src/acp/index.d.ts +0 -10
  367. package/dist/src/acp/index.js +0 -5
  368. package/dist/src/acp/meta.d.ts +0 -15
  369. package/dist/src/acp/meta.js +0 -36
  370. package/dist/src/acp/meta.js.map +0 -1
  371. package/dist/src/acp/routing-integration.d.ts +0 -37
  372. package/dist/src/acp/routing-integration.js +0 -58
  373. package/dist/src/acp/routing-integration.js.map +0 -1
  374. package/dist/src/acp/runtime/backends/index.d.ts +0 -4
  375. package/dist/src/acp/runtime/backends/index.js +0 -2
  376. package/dist/src/acp/runtime/backends/local.d.ts +0 -136
  377. package/dist/src/acp/runtime/backends/local.js +0 -603
  378. package/dist/src/acp/runtime/backends/local.js.map +0 -1
  379. package/dist/src/acp/runtime/error-text.d.ts +0 -16
  380. package/dist/src/acp/runtime/error-text.js +0 -40
  381. package/dist/src/acp/runtime/error-text.js.map +0 -1
  382. package/dist/src/acp/runtime/errors.d.ts +0 -31
  383. package/dist/src/acp/runtime/errors.js +0 -47
  384. package/dist/src/acp/runtime/errors.js.map +0 -1
  385. package/dist/src/acp/runtime/index.d.ts +0 -7
  386. package/dist/src/acp/runtime/index.js +0 -4
  387. package/dist/src/acp/runtime/registry.d.ts +0 -35
  388. package/dist/src/acp/runtime/registry.js +0 -85
  389. package/dist/src/acp/runtime/registry.js.map +0 -1
  390. package/dist/src/acp/runtime/session-identity.d.ts +0 -35
  391. package/dist/src/acp/runtime/session-identity.js +0 -134
  392. package/dist/src/acp/runtime/session-identity.js.map +0 -1
  393. package/dist/src/acp/runtime/types.d.ts +0 -214
  394. package/dist/src/acp/secret-file.d.ts +0 -7
  395. package/dist/src/acp/secret-file.js +0 -19
  396. package/dist/src/acp/secret-file.js.map +0 -1
  397. package/dist/src/acp/server.d.ts +0 -48
  398. package/dist/src/acp/server.js +0 -300
  399. package/dist/src/acp/server.js.map +0 -1
  400. package/dist/src/acp/session.d.ts +0 -29
  401. package/dist/src/acp/session.js +0 -30
  402. package/dist/src/acp/session.js.map +0 -1
  403. package/dist/src/acp/types.d.ts +0 -39
  404. package/dist/src/acp/types.js +0 -13
  405. package/dist/src/acp/types.js.map +0 -1
  406. package/dist/src/agent/image/describe-images.d.ts +0 -18
  407. package/dist/src/agent/image/describe-images.js +0 -19
  408. package/dist/src/agent/image/describe-images.js.map +0 -1
  409. package/dist/src/cli/commands/acp.d.ts +0 -4
  410. package/dist/src/cli/commands/acp.js +0 -200
  411. package/dist/src/cli/commands/acp.js.map +0 -1
  412. /package/dist/src/{acp/runtime/types.js → cli/commands/doctor/index.d.ts} +0 -0
@@ -1,92 +1,7 @@
1
+ import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
1
2
  import { createLogger } from "../utils/logger/index.js";
2
3
  import { init_logger } from "../utils/logger.js";
3
4
  //#region src/providers/plugin-registry.ts
4
- init_logger();
5
- const log = createLogger("Provider:Registry");
6
- var ProviderPluginRegistry = class {
7
- providers = /* @__PURE__ */ new Map();
8
- /**
9
- * Register a new provider
10
- */
11
- register(provider) {
12
- if (this.providers.has(provider.id)) log.warn(`Provider "${provider.id}" already registered, overwriting`);
13
- if (!provider.id) throw new Error("Provider must have an id");
14
- if (!provider.name) throw new Error("Provider must have a name");
15
- if (!provider.createStream || typeof provider.createStream !== "function") throw new Error("Provider must implement createStream method");
16
- this.providers.set(provider.id, provider);
17
- log.info(`Registered provider: ${provider.name} (${provider.id})`);
18
- }
19
- /**
20
- * Get a provider by ID
21
- */
22
- get(id) {
23
- return this.providers.get(id);
24
- }
25
- /**
26
- * List all registered providers
27
- */
28
- listAll() {
29
- return Array.from(this.providers.values());
30
- }
31
- /**
32
- * Get models for a specific provider
33
- */
34
- getModels(providerId) {
35
- return this.providers.get(providerId)?.models || [];
36
- }
37
- /**
38
- * Check if a provider is registered
39
- */
40
- has(id) {
41
- return this.providers.has(id);
42
- }
43
- /**
44
- * Unregister a provider
45
- */
46
- unregister(id) {
47
- const deleted = this.providers.delete(id);
48
- if (deleted) log.info(`Unregistered provider: ${id}`);
49
- return deleted;
50
- }
51
- /**
52
- * Get all available model IDs across all providers
53
- */
54
- getAllModelIds() {
55
- const modelIds = [];
56
- for (const provider of this.providers.values()) for (const model of provider.models) modelIds.push(`${provider.id}:${model.id}`);
57
- return modelIds;
58
- }
59
- /**
60
- * Find a model across all providers
61
- */
62
- findModel(modelId) {
63
- if (modelId.includes(":")) {
64
- const [providerId, actualModelId] = modelId.split(":");
65
- const provider = this.providers.get(providerId);
66
- if (provider) {
67
- const model = provider.models.find((m) => m.id === actualModelId);
68
- if (model) return {
69
- provider,
70
- model
71
- };
72
- }
73
- }
74
- for (const provider of this.providers.values()) {
75
- const model = provider.models.find((m) => m.id === modelId);
76
- if (model) return {
77
- provider,
78
- model
79
- };
80
- }
81
- }
82
- /**
83
- * Get provider by model ID
84
- */
85
- getProviderForModel(modelId) {
86
- return this.findModel(modelId)?.provider;
87
- }
88
- };
89
- let globalRegistry = null;
90
5
  function getProviderRegistry() {
91
6
  if (!globalRegistry) globalRegistry = new ProviderPluginRegistry();
92
7
  return globalRegistry;
@@ -94,7 +9,97 @@ function getProviderRegistry() {
94
9
  function setProviderRegistry(registry) {
95
10
  globalRegistry = registry;
96
11
  }
12
+ var log, ProviderPluginRegistry, globalRegistry;
13
+ var init_plugin_registry = __esmMin((() => {
14
+ init_logger();
15
+ log = createLogger("Provider:Registry");
16
+ ProviderPluginRegistry = class {
17
+ providers = /* @__PURE__ */ new Map();
18
+ /**
19
+ * Register a new provider
20
+ */
21
+ register(provider) {
22
+ if (this.providers.has(provider.id)) log.warn(`Provider "${provider.id}" already registered, overwriting`);
23
+ if (!provider.id) throw new Error("Provider must have an id");
24
+ if (!provider.name) throw new Error("Provider must have a name");
25
+ if (!provider.createStream || typeof provider.createStream !== "function") throw new Error("Provider must implement createStream method");
26
+ this.providers.set(provider.id, provider);
27
+ log.info(`Registered provider: ${provider.name} (${provider.id})`);
28
+ }
29
+ /**
30
+ * Get a provider by ID
31
+ */
32
+ get(id) {
33
+ return this.providers.get(id);
34
+ }
35
+ /**
36
+ * List all registered providers
37
+ */
38
+ listAll() {
39
+ return Array.from(this.providers.values());
40
+ }
41
+ /**
42
+ * Get models for a specific provider
43
+ */
44
+ getModels(providerId) {
45
+ return this.providers.get(providerId)?.models || [];
46
+ }
47
+ /**
48
+ * Check if a provider is registered
49
+ */
50
+ has(id) {
51
+ return this.providers.has(id);
52
+ }
53
+ /**
54
+ * Unregister a provider
55
+ */
56
+ unregister(id) {
57
+ const deleted = this.providers.delete(id);
58
+ if (deleted) log.info(`Unregistered provider: ${id}`);
59
+ return deleted;
60
+ }
61
+ /**
62
+ * Get all available model IDs across all providers
63
+ */
64
+ getAllModelIds() {
65
+ const modelIds = [];
66
+ for (const provider of this.providers.values()) for (const model of provider.models) modelIds.push(`${provider.id}:${model.id}`);
67
+ return modelIds;
68
+ }
69
+ /**
70
+ * Find a model across all providers
71
+ */
72
+ findModel(modelId) {
73
+ if (modelId.includes(":")) {
74
+ const [providerId, actualModelId] = modelId.split(":");
75
+ const provider = this.providers.get(providerId);
76
+ if (provider) {
77
+ const model = provider.models.find((m) => m.id === actualModelId);
78
+ if (model) return {
79
+ provider,
80
+ model
81
+ };
82
+ }
83
+ }
84
+ for (const provider of this.providers.values()) {
85
+ const model = provider.models.find((m) => m.id === modelId);
86
+ if (model) return {
87
+ provider,
88
+ model
89
+ };
90
+ }
91
+ }
92
+ /**
93
+ * Get provider by model ID
94
+ */
95
+ getProviderForModel(modelId) {
96
+ return this.findModel(modelId)?.provider;
97
+ }
98
+ };
99
+ globalRegistry = null;
100
+ }));
97
101
  //#endregion
98
- export { ProviderPluginRegistry, getProviderRegistry, setProviderRegistry };
102
+ init_plugin_registry();
103
+ export { ProviderPluginRegistry, getProviderRegistry, init_plugin_registry, setProviderRegistry };
99
104
 
100
105
  //# sourceMappingURL=plugin-registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-registry.js","names":[],"sources":["../../../src/providers/plugin-registry.ts"],"sourcesContent":["/**\n * Provider Plugin Registry\n * \n * Registry for managing plugin-based LLM providers.\n */\n\nimport type { ProviderPlugin, ProviderRegistry, ProviderModelDefinition } from '../extensions/types/providers.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst log = createLogger('Provider:Registry');\n\n// ============================================================================\n// Provider Plugin Registry Implementation\n// ============================================================================\n\nexport class ProviderPluginRegistry implements ProviderRegistry {\n private providers = new Map<string, ProviderPlugin>();\n\n /**\n * Register a new provider\n */\n register(provider: ProviderPlugin): void {\n if (this.providers.has(provider.id)) {\n log.warn(`Provider \"${provider.id}\" already registered, overwriting`);\n }\n \n // Validate provider\n if (!provider.id) {\n throw new Error('Provider must have an id');\n }\n if (!provider.name) {\n throw new Error('Provider must have a name');\n }\n if (!provider.createStream || typeof provider.createStream !== 'function') {\n throw new Error('Provider must implement createStream method');\n }\n \n this.providers.set(provider.id, provider);\n log.info(`Registered provider: ${provider.name} (${provider.id})`);\n }\n\n /**\n * Get a provider by ID\n */\n get(id: string): ProviderPlugin | undefined {\n return this.providers.get(id);\n }\n\n /**\n * List all registered providers\n */\n listAll(): ProviderPlugin[] {\n return Array.from(this.providers.values());\n }\n\n /**\n * Get models for a specific provider\n */\n getModels(providerId: string): ProviderModelDefinition[] {\n const provider = this.providers.get(providerId);\n return provider?.models || [];\n }\n\n /**\n * Check if a provider is registered\n */\n has(id: string): boolean {\n return this.providers.has(id);\n }\n\n /**\n * Unregister a provider\n */\n unregister(id: string): boolean {\n const deleted = this.providers.delete(id);\n if (deleted) {\n log.info(`Unregistered provider: ${id}`);\n }\n return deleted;\n }\n\n /**\n * Get all available model IDs across all providers\n */\n getAllModelIds(): string[] {\n const modelIds: string[] = [];\n for (const provider of this.providers.values()) {\n for (const model of provider.models) {\n modelIds.push(`${provider.id}:${model.id}`);\n }\n }\n return modelIds;\n }\n\n /**\n * Find a model across all providers\n */\n findModel(modelId: string): { provider: ProviderPlugin; model: ProviderModelDefinition } | undefined {\n // Check if it's prefixed with provider:model\n if (modelId.includes(':')) {\n const [providerId, actualModelId] = modelId.split(':');\n const provider = this.providers.get(providerId);\n if (provider) {\n const model = provider.models.find(m => m.id === actualModelId);\n if (model) {\n return { provider, model };\n }\n }\n }\n \n // Search across all providers\n for (const provider of this.providers.values()) {\n const model = provider.models.find(m => m.id === modelId);\n if (model) {\n return { provider, model };\n }\n }\n \n return undefined;\n }\n\n /**\n * Get provider by model ID\n */\n getProviderForModel(modelId: string): ProviderPlugin | undefined {\n return this.findModel(modelId)?.provider;\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet globalRegistry: ProviderPluginRegistry | null = null;\n\nexport function getProviderRegistry(): ProviderPluginRegistry {\n if (!globalRegistry) {\n globalRegistry = new ProviderPluginRegistry();\n }\n return globalRegistry;\n}\n\nexport function setProviderRegistry(registry: ProviderPluginRegistry): void {\n globalRegistry = registry;\n}\n"],"mappings":";;;aAOkD;AAElD,MAAM,MAAM,aAAa,oBAAoB;AAM7C,IAAa,yBAAb,MAAgE;CAC9D,4BAAoB,IAAI,KAA6B;;;;CAKrD,SAAS,UAAgC;AACvC,MAAI,KAAK,UAAU,IAAI,SAAS,GAAG,CACjC,KAAI,KAAK,aAAa,SAAS,GAAG,mCAAmC;AAIvE,MAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,2BAA2B;AAE7C,MAAI,CAAC,SAAS,KACZ,OAAM,IAAI,MAAM,4BAA4B;AAE9C,MAAI,CAAC,SAAS,gBAAgB,OAAO,SAAS,iBAAiB,WAC7D,OAAM,IAAI,MAAM,8CAA8C;AAGhE,OAAK,UAAU,IAAI,SAAS,IAAI,SAAS;AACzC,MAAI,KAAK,wBAAwB,SAAS,KAAK,IAAI,SAAS,GAAG,GAAG;;;;;CAMpE,IAAI,IAAwC;AAC1C,SAAO,KAAK,UAAU,IAAI,GAAG;;;;;CAM/B,UAA4B;AAC1B,SAAO,MAAM,KAAK,KAAK,UAAU,QAAQ,CAAC;;;;;CAM5C,UAAU,YAA+C;AAEvD,SADiB,KAAK,UAAU,IAAI,WAAW,EAC9B,UAAU,EAAE;;;;;CAM/B,IAAI,IAAqB;AACvB,SAAO,KAAK,UAAU,IAAI,GAAG;;;;;CAM/B,WAAW,IAAqB;EAC9B,MAAM,UAAU,KAAK,UAAU,OAAO,GAAG;AACzC,MAAI,QACF,KAAI,KAAK,0BAA0B,KAAK;AAE1C,SAAO;;;;;CAMT,iBAA2B;EACzB,MAAM,WAAqB,EAAE;AAC7B,OAAK,MAAM,YAAY,KAAK,UAAU,QAAQ,CAC5C,MAAK,MAAM,SAAS,SAAS,OAC3B,UAAS,KAAK,GAAG,SAAS,GAAG,GAAG,MAAM,KAAK;AAG/C,SAAO;;;;;CAMT,UAAU,SAA2F;AAEnG,MAAI,QAAQ,SAAS,IAAI,EAAE;GACzB,MAAM,CAAC,YAAY,iBAAiB,QAAQ,MAAM,IAAI;GACtD,MAAM,WAAW,KAAK,UAAU,IAAI,WAAW;AAC/C,OAAI,UAAU;IACZ,MAAM,QAAQ,SAAS,OAAO,MAAK,MAAK,EAAE,OAAO,cAAc;AAC/D,QAAI,MACF,QAAO;KAAE;KAAU;KAAO;;;AAMhC,OAAK,MAAM,YAAY,KAAK,UAAU,QAAQ,EAAE;GAC9C,MAAM,QAAQ,SAAS,OAAO,MAAK,MAAK,EAAE,OAAO,QAAQ;AACzD,OAAI,MACF,QAAO;IAAE;IAAU;IAAO;;;;;;CAUhC,oBAAoB,SAA6C;AAC/D,SAAO,KAAK,UAAU,QAAQ,EAAE;;;AAQpC,IAAI,iBAAgD;AAEpD,SAAgB,sBAA8C;AAC5D,KAAI,CAAC,eACH,kBAAiB,IAAI,wBAAwB;AAE/C,QAAO;;AAGT,SAAgB,oBAAoB,UAAwC;AAC1E,kBAAiB"}
1
+ {"version":3,"file":"plugin-registry.js","names":[],"sources":["../../../src/providers/plugin-registry.ts"],"sourcesContent":["/**\n * Provider Plugin Registry\n * \n * Registry for managing plugin-based LLM providers.\n */\n\nimport type { ProviderPlugin, ProviderRegistry, ProviderModelDefinition } from '../extensions/types/providers.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst log = createLogger('Provider:Registry');\n\n// ============================================================================\n// Provider Plugin Registry Implementation\n// ============================================================================\n\nexport class ProviderPluginRegistry implements ProviderRegistry {\n private providers = new Map<string, ProviderPlugin>();\n\n /**\n * Register a new provider\n */\n register(provider: ProviderPlugin): void {\n if (this.providers.has(provider.id)) {\n log.warn(`Provider \"${provider.id}\" already registered, overwriting`);\n }\n \n // Validate provider\n if (!provider.id) {\n throw new Error('Provider must have an id');\n }\n if (!provider.name) {\n throw new Error('Provider must have a name');\n }\n if (!provider.createStream || typeof provider.createStream !== 'function') {\n throw new Error('Provider must implement createStream method');\n }\n \n this.providers.set(provider.id, provider);\n log.info(`Registered provider: ${provider.name} (${provider.id})`);\n }\n\n /**\n * Get a provider by ID\n */\n get(id: string): ProviderPlugin | undefined {\n return this.providers.get(id);\n }\n\n /**\n * List all registered providers\n */\n listAll(): ProviderPlugin[] {\n return Array.from(this.providers.values());\n }\n\n /**\n * Get models for a specific provider\n */\n getModels(providerId: string): ProviderModelDefinition[] {\n const provider = this.providers.get(providerId);\n return provider?.models || [];\n }\n\n /**\n * Check if a provider is registered\n */\n has(id: string): boolean {\n return this.providers.has(id);\n }\n\n /**\n * Unregister a provider\n */\n unregister(id: string): boolean {\n const deleted = this.providers.delete(id);\n if (deleted) {\n log.info(`Unregistered provider: ${id}`);\n }\n return deleted;\n }\n\n /**\n * Get all available model IDs across all providers\n */\n getAllModelIds(): string[] {\n const modelIds: string[] = [];\n for (const provider of this.providers.values()) {\n for (const model of provider.models) {\n modelIds.push(`${provider.id}:${model.id}`);\n }\n }\n return modelIds;\n }\n\n /**\n * Find a model across all providers\n */\n findModel(modelId: string): { provider: ProviderPlugin; model: ProviderModelDefinition } | undefined {\n // Check if it's prefixed with provider:model\n if (modelId.includes(':')) {\n const [providerId, actualModelId] = modelId.split(':');\n const provider = this.providers.get(providerId);\n if (provider) {\n const model = provider.models.find(m => m.id === actualModelId);\n if (model) {\n return { provider, model };\n }\n }\n }\n \n // Search across all providers\n for (const provider of this.providers.values()) {\n const model = provider.models.find(m => m.id === modelId);\n if (model) {\n return { provider, model };\n }\n }\n \n return undefined;\n }\n\n /**\n * Get provider by model ID\n */\n getProviderForModel(modelId: string): ProviderPlugin | undefined {\n return this.findModel(modelId)?.provider;\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet globalRegistry: ProviderPluginRegistry | null = null;\n\nexport function getProviderRegistry(): ProviderPluginRegistry {\n if (!globalRegistry) {\n globalRegistry = new ProviderPluginRegistry();\n }\n return globalRegistry;\n}\n\nexport function setProviderRegistry(registry: ProviderPluginRegistry): void {\n globalRegistry = registry;\n}\n"],"mappings":";;;;AAuIA,SAAgB,sBAA8C;AAC5D,KAAI,CAAC,eACH,kBAAiB,IAAI,wBAAwB;AAE/C,QAAO;;AAGT,SAAgB,oBAAoB,UAAwC;AAC1E,kBAAiB;;;;cAxI+B;AAE5C,OAAM,aAAa,oBAAoB;AAMhC,0BAAb,MAAgE;EAC9D,4BAAoB,IAAI,KAA6B;;;;EAKrD,SAAS,UAAgC;AACvC,OAAI,KAAK,UAAU,IAAI,SAAS,GAAG,CACjC,KAAI,KAAK,aAAa,SAAS,GAAG,mCAAmC;AAIvE,OAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,2BAA2B;AAE7C,OAAI,CAAC,SAAS,KACZ,OAAM,IAAI,MAAM,4BAA4B;AAE9C,OAAI,CAAC,SAAS,gBAAgB,OAAO,SAAS,iBAAiB,WAC7D,OAAM,IAAI,MAAM,8CAA8C;AAGhE,QAAK,UAAU,IAAI,SAAS,IAAI,SAAS;AACzC,OAAI,KAAK,wBAAwB,SAAS,KAAK,IAAI,SAAS,GAAG,GAAG;;;;;EAMpE,IAAI,IAAwC;AAC1C,UAAO,KAAK,UAAU,IAAI,GAAG;;;;;EAM/B,UAA4B;AAC1B,UAAO,MAAM,KAAK,KAAK,UAAU,QAAQ,CAAC;;;;;EAM5C,UAAU,YAA+C;AAEvD,UADiB,KAAK,UAAU,IAAI,WAAW,EAC9B,UAAU,EAAE;;;;;EAM/B,IAAI,IAAqB;AACvB,UAAO,KAAK,UAAU,IAAI,GAAG;;;;;EAM/B,WAAW,IAAqB;GAC9B,MAAM,UAAU,KAAK,UAAU,OAAO,GAAG;AACzC,OAAI,QACF,KAAI,KAAK,0BAA0B,KAAK;AAE1C,UAAO;;;;;EAMT,iBAA2B;GACzB,MAAM,WAAqB,EAAE;AAC7B,QAAK,MAAM,YAAY,KAAK,UAAU,QAAQ,CAC5C,MAAK,MAAM,SAAS,SAAS,OAC3B,UAAS,KAAK,GAAG,SAAS,GAAG,GAAG,MAAM,KAAK;AAG/C,UAAO;;;;;EAMT,UAAU,SAA2F;AAEnG,OAAI,QAAQ,SAAS,IAAI,EAAE;IACzB,MAAM,CAAC,YAAY,iBAAiB,QAAQ,MAAM,IAAI;IACtD,MAAM,WAAW,KAAK,UAAU,IAAI,WAAW;AAC/C,QAAI,UAAU;KACZ,MAAM,QAAQ,SAAS,OAAO,MAAK,MAAK,EAAE,OAAO,cAAc;AAC/D,SAAI,MACF,QAAO;MAAE;MAAU;MAAO;;;AAMhC,QAAK,MAAM,YAAY,KAAK,UAAU,QAAQ,EAAE;IAC9C,MAAM,QAAQ,SAAS,OAAO,MAAK,MAAK,EAAE,OAAO,QAAQ;AACzD,QAAI,MACF,QAAO;KAAE;KAAU;KAAO;;;;;;EAUhC,oBAAoB,SAA6C;AAC/D,UAAO,KAAK,UAAU,QAAQ,EAAE;;;AAQhC,kBAAgD"}
@@ -1,6 +1,6 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { init_session_key, sanitizeSegment } from "./session-key.js";
3
2
  import { init_account_id, normalizeAccountId } from "./account-id.js";
3
+ import { init_session_key, sanitizeSegment } from "./session-key.js";
4
4
  //#region src/routing/bindings.ts
5
5
  /**
6
6
  * Simple glob match (`*` only).
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Session key helpers, binding rules, and route resolution.
5
5
  */
6
- export { buildSessionKey, parseSessionKey, sanitizeSegment, isValidSegment, isSubagentSessionKey, isAcpSessionKey, isCronSessionKey, getSubagentDepth, buildSubagentSessionKey, getParentSessionKey, normalizeSessionKey, type BuildSessionKeyParams, type ParsedSessionKey, } from './session-key.js';
6
+ export { buildSessionKey, parseSessionKey, sanitizeSegment, isValidSegment, isSubagentSessionKey, isCronSessionKey, getSubagentDepth, buildSubagentSessionKey, getParentSessionKey, normalizeSessionKey, type BuildSessionKeyParams, type ParsedSessionKey, } from './session-key.js';
7
7
  export { normalizeAccountId, normalizeOptionalAccountId, isValidAccountId, sanitizeAccountId, DEFAULT_ACCOUNT_ID, } from './account-id.js';
8
8
  export { globMatch, matchesBinding, parseBindingRules, parseBindingRule, resolveRoute as resolveBindingRoute, type BindingMatch, type BindingRule, type RouteInput, type RouteResult, } from './bindings.js';
9
9
  export { applyIdentityLinks, getDefaultAgentId, agentExists, pickFirstExistingAgentId, buildRouteSessionKey, deriveLastRoutePolicy, resolveRoute, resolveRouteFromSessionKey, type IdentityLinks, type SessionConfig, type AgentConfig, type RoutingConfig, type ResolveRouteInput, type ResolveRouteResult, type RouteContext, } from './resolve-route.js';
@@ -1,5 +1,5 @@
1
- import { buildSessionKey, buildSubagentSessionKey, getParentSessionKey, getSubagentDepth, init_session_key, isAcpSessionKey, isCronSessionKey, isSubagentSessionKey, isValidSegment, normalizeSessionKey, parseSessionKey, sanitizeSegment } from "./session-key.js";
2
1
  import { DEFAULT_ACCOUNT_ID, init_account_id, isValidAccountId, normalizeAccountId, normalizeOptionalAccountId, sanitizeAccountId } from "./account-id.js";
2
+ import { buildSessionKey, buildSubagentSessionKey, getParentSessionKey, getSubagentDepth, init_session_key, isCronSessionKey, isSubagentSessionKey, isValidSegment, normalizeSessionKey, parseSessionKey, sanitizeSegment } from "./session-key.js";
3
3
  import { globMatch, init_bindings, matchesBinding, parseBindingRule, parseBindingRules, resolveRoute } from "./bindings.js";
4
4
  import { agentExists, applyIdentityLinks, buildRouteSessionKey, deriveLastRoutePolicy, getDefaultAgentId, init_resolve_route, pickFirstExistingAgentId, resolveRoute as resolveRoute$1, resolveRouteFromSessionKey } from "./resolve-route.js";
5
5
  //#region src/routing/index.ts
@@ -8,6 +8,6 @@ init_account_id();
8
8
  init_bindings();
9
9
  init_resolve_route();
10
10
  //#endregion
11
- export { DEFAULT_ACCOUNT_ID, agentExists, applyIdentityLinks, buildRouteSessionKey, buildSessionKey, buildSubagentSessionKey, deriveLastRoutePolicy, getDefaultAgentId, getParentSessionKey, getSubagentDepth, globMatch, isAcpSessionKey, isCronSessionKey, isSubagentSessionKey, isValidAccountId, isValidSegment, matchesBinding, normalizeAccountId, normalizeOptionalAccountId, normalizeSessionKey, parseBindingRule, parseBindingRules, parseSessionKey, pickFirstExistingAgentId, resolveRoute as resolveBindingRoute, resolveRoute$1 as resolveRoute, resolveRouteFromSessionKey, sanitizeAccountId, sanitizeSegment };
11
+ export { DEFAULT_ACCOUNT_ID, agentExists, applyIdentityLinks, buildRouteSessionKey, buildSessionKey, buildSubagentSessionKey, deriveLastRoutePolicy, getDefaultAgentId, getParentSessionKey, getSubagentDepth, globMatch, isCronSessionKey, isSubagentSessionKey, isValidAccountId, isValidSegment, matchesBinding, normalizeAccountId, normalizeOptionalAccountId, normalizeSessionKey, parseBindingRule, parseBindingRules, parseSessionKey, pickFirstExistingAgentId, resolveRoute as resolveBindingRoute, resolveRoute$1 as resolveRoute, resolveRouteFromSessionKey, sanitizeAccountId, sanitizeSegment };
12
12
 
13
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/routing/index.ts"],"sourcesContent":["/**\n * Session routing\n *\n * Session key helpers, binding rules, and route resolution.\n */\n\n// Session key utilities\nexport {\n buildSessionKey,\n parseSessionKey,\n sanitizeSegment,\n isValidSegment,\n isSubagentSessionKey,\n isAcpSessionKey,\n isCronSessionKey,\n getSubagentDepth,\n buildSubagentSessionKey,\n getParentSessionKey,\n normalizeSessionKey,\n type BuildSessionKeyParams,\n type ParsedSessionKey,\n} from './session-key.js';\n\n// Account id normalization\nexport {\n normalizeAccountId,\n normalizeOptionalAccountId,\n isValidAccountId,\n sanitizeAccountId,\n DEFAULT_ACCOUNT_ID,\n} from './account-id.js';\n\n// Binding rules\nexport {\n globMatch,\n matchesBinding,\n parseBindingRules,\n parseBindingRule,\n resolveRoute as resolveBindingRoute,\n type BindingMatch,\n type BindingRule,\n type RouteInput,\n type RouteResult,\n} from './bindings.js';\n\n// Route resolution\nexport {\n applyIdentityLinks,\n getDefaultAgentId,\n agentExists,\n pickFirstExistingAgentId,\n buildRouteSessionKey,\n deriveLastRoutePolicy,\n resolveRoute,\n resolveRouteFromSessionKey,\n type IdentityLinks,\n type SessionConfig,\n type AgentConfig,\n type RoutingConfig,\n type ResolveRouteInput,\n type ResolveRouteResult,\n type RouteContext,\n} from './resolve-route.js';\n"],"mappings":";;;;;kBAqB0B;iBASD;eAaF;oBAmBK"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/routing/index.ts"],"sourcesContent":["/**\n * Session routing\n *\n * Session key helpers, binding rules, and route resolution.\n */\n\n// Session key utilities\nexport {\n buildSessionKey,\n parseSessionKey,\n sanitizeSegment,\n isValidSegment,\n isSubagentSessionKey,\n isCronSessionKey,\n getSubagentDepth,\n buildSubagentSessionKey,\n getParentSessionKey,\n normalizeSessionKey,\n type BuildSessionKeyParams,\n type ParsedSessionKey,\n} from './session-key.js';\n\n// Account id normalization\nexport {\n normalizeAccountId,\n normalizeOptionalAccountId,\n isValidAccountId,\n sanitizeAccountId,\n DEFAULT_ACCOUNT_ID,\n} from './account-id.js';\n\n// Binding rules\nexport {\n globMatch,\n matchesBinding,\n parseBindingRules,\n parseBindingRule,\n resolveRoute as resolveBindingRoute,\n type BindingMatch,\n type BindingRule,\n type RouteInput,\n type RouteResult,\n} from './bindings.js';\n\n// Route resolution\nexport {\n applyIdentityLinks,\n getDefaultAgentId,\n agentExists,\n pickFirstExistingAgentId,\n buildRouteSessionKey,\n deriveLastRoutePolicy,\n resolveRoute,\n resolveRouteFromSessionKey,\n type IdentityLinks,\n type SessionConfig,\n type AgentConfig,\n type RoutingConfig,\n type ResolveRouteInput,\n type ResolveRouteResult,\n type RouteContext,\n} from './resolve-route.js';\n"],"mappings":";;;;;kBAoB0B;iBASD;eAaF;oBAmBK"}
@@ -1,7 +1,7 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { init_agent_scope, resolveDefaultAgentId } from "../agent/agent-scope.js";
3
- import { buildSessionKey, init_session_key, normalizeSessionKey, parseSessionKey } from "./session-key.js";
4
3
  import { init_account_id, normalizeAccountId } from "./account-id.js";
4
+ import { buildSessionKey, init_session_key, normalizeSessionKey, parseSessionKey } from "./session-key.js";
5
5
  import { init_bindings, parseBindingRules, resolveRoute as resolveRoute$1 } from "./bindings.js";
6
6
  //#region src/routing/resolve-route.ts
7
7
  /**
@@ -7,7 +7,6 @@
7
7
  * - main:telegram:acc_default:dm:123456
8
8
  * - main:discord:acc_work:channel:987654:thread:789
9
9
  * - subagent:main:abc123:telegram:acc_default:dm:123456
10
- * - main:acp:{uuid}
11
10
  */
12
11
  /**
13
12
  * Sanitize a segment to allowed chars a-z0-9_-
@@ -49,10 +48,6 @@ export declare function parseSessionKey(sessionKey: string | undefined | null):
49
48
  * Whether the key refers to a subagent session.
50
49
  */
51
50
  export declare function isSubagentSessionKey(sessionKey: string | undefined | null): boolean;
52
- /**
53
- * Whether the key is an ACP session.
54
- */
55
- export declare function isAcpSessionKey(sessionKey: string | undefined | null): boolean;
56
51
  /**
57
52
  * Whether the key is a cron-driven session.
58
53
  */
@@ -37,26 +37,6 @@ function parseSessionKey(sessionKey) {
37
37
  const raw = (sessionKey ?? "").trim();
38
38
  if (!raw) return null;
39
39
  const parts = raw.split(":").filter(Boolean);
40
- if (parts.length === 3 && parts[1]?.toLowerCase() === "acp") {
41
- const [agentId, source, acpId] = parts;
42
- return {
43
- agentId: agentId.toLowerCase(),
44
- source: source.toLowerCase(),
45
- accountId: "_",
46
- peerKind: "direct",
47
- peerId: acpId.toLowerCase()
48
- };
49
- }
50
- if (parts.length === 5 && parts[0]?.toLowerCase() === "subagent" && parts[3]?.toLowerCase() === "acp") {
51
- const [_subagent, parentId, parentSessionId, source, acpId] = parts;
52
- return {
53
- agentId: `subagent:${parentId.toLowerCase()}:${parentSessionId.toLowerCase()}`,
54
- source: source.toLowerCase(),
55
- accountId: "_",
56
- peerKind: "direct",
57
- peerId: acpId.toLowerCase()
58
- };
59
- }
60
40
  if (parts.length < 5) return null;
61
41
  const [agentId, source, accountId, peerKind, peerId, ...rest] = parts;
62
42
  if (!agentId || !source || !accountId || !peerKind || !peerId) return null;
@@ -88,12 +68,6 @@ function isSubagentSessionKey(sessionKey) {
88
68
  return parseSessionKey(sessionKey)?.agentId === "subagent";
89
69
  }
90
70
  /**
91
- * Whether the key is an ACP session.
92
- */
93
- function isAcpSessionKey(sessionKey) {
94
- return parseSessionKey(sessionKey)?.source === "acp";
95
- }
96
- /**
97
71
  * Whether the key is a cron-driven session.
98
72
  */
99
73
  function isCronSessionKey(sessionKey) {
@@ -155,6 +129,6 @@ var init_session_key = __esmMin((() => {
155
129
  }));
156
130
  //#endregion
157
131
  init_session_key();
158
- export { buildSessionKey, buildSubagentSessionKey, getParentSessionKey, getSubagentDepth, init_session_key, isAcpSessionKey, isCronSessionKey, isSubagentSessionKey, isValidSegment, normalizeSessionKey, parseSessionKey, sanitizeSegment };
132
+ export { buildSessionKey, buildSubagentSessionKey, getParentSessionKey, getSubagentDepth, init_session_key, isCronSessionKey, isSubagentSessionKey, isValidSegment, normalizeSessionKey, parseSessionKey, sanitizeSegment };
159
133
 
160
134
  //# sourceMappingURL=session-key.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-key.js","names":[],"sources":["../../../src/routing/session-key.ts"],"sourcesContent":["/**\n * Session key construction and parsing.\n *\n * Format: {agentId}:{source}:{accountId}:{peerKind}:{peerId}[:thread:{threadId}][:scope:{scopeId}]\n *\n * Examples:\n * - main:telegram:acc_default:dm:123456\n * - main:discord:acc_work:channel:987654:thread:789\n * - subagent:main:abc123:telegram:acc_default:dm:123456\n * - main:acp:{uuid}\n */\n\n// Precompiled regexes for segment validation\nconst VALID_SEGMENT_RE = /^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?$/i;\nconst INVALID_CHARS_RE = /[^a-z0-9_-]+/g;\nconst LEADING_DASH_RE = /^-+/;\nconst TRAILING_DASH_RE = /-+$/;\n\n/**\n * Sanitize a segment to allowed chars a-z0-9_-\n */\nexport function sanitizeSegment(value: string | undefined | null, options?: { allowLeadingDash?: boolean }): string {\n const trimmed = (value ?? '').trim();\n if (!trimmed) {\n return '';\n }\n \n // Strip disallowed characters\n let cleaned = trimmed\n .toLowerCase()\n .replace(INVALID_CHARS_RE, '-');\n \n // Trim leading/trailing dashes unless a leading dash is allowed (e.g. negative IDs)\n if (!options?.allowLeadingDash) {\n cleaned = cleaned\n .replace(LEADING_DASH_RE, '')\n .replace(TRAILING_DASH_RE, '');\n } else {\n // When leading dash is allowed, only strip trailing dashes\n cleaned = cleaned.replace(TRAILING_DASH_RE, '');\n }\n \n if (!cleaned) {\n return '';\n }\n \n return cleaned.slice(0, 64);\n}\n\n/**\n * Whether the segment matches the allowed pattern and length.\n */\nexport function isValidSegment(value: string | undefined | null): boolean {\n const trimmed = (value ?? '').trim();\n if (!trimmed) {\n return false;\n }\n \n if (trimmed.length > 64) {\n return false;\n }\n \n return VALID_SEGMENT_RE.test(trimmed);\n}\n\n/**\n * Fields used to build a session key.\n */\nexport interface BuildSessionKeyParams {\n agentId: string;\n source: string;\n accountId: string;\n peerKind: string;\n peerId: string;\n threadId?: string | null;\n scopeId?: string | null;\n}\n\nexport function buildSessionKey(params: BuildSessionKeyParams): string {\n const segments = [\n sanitizeSegment(params.agentId) || 'main',\n sanitizeSegment(params.source) || 'unknown',\n sanitizeSegment(params.accountId) || 'default',\n sanitizeSegment(params.peerKind) || 'unknown',\n // peerId may start with '-' (e.g. Telegram supergroup id -1001234567890)\n sanitizeSegment(params.peerId, { allowLeadingDash: true }) || 'unknown',\n ];\n \n if (params.threadId) {\n segments.push('thread', sanitizeSegment(params.threadId, { allowLeadingDash: true }) || 'unknown');\n }\n \n if (params.scopeId) {\n segments.push('scope', sanitizeSegment(params.scopeId, { allowLeadingDash: true }) || 'default');\n }\n \n return segments.join(':');\n}\n\n/**\n * Parsed session key components.\n */\nexport interface ParsedSessionKey {\n agentId: string;\n source: string;\n accountId: string;\n peerKind: string;\n peerId: string;\n threadId?: string;\n scopeId?: string;\n}\n\nexport function parseSessionKey(sessionKey: string | undefined | null): ParsedSessionKey | null {\n const raw = (sessionKey ?? '').trim();\n if (!raw) {\n return null;\n }\n \n const parts = raw.split(':').filter(Boolean);\n \n // Handle ACP session key format: {agentId}:acp:{uuid}\n if (parts.length === 3 && parts[1]?.toLowerCase() === 'acp') {\n const [agentId, source, acpId] = parts;\n return {\n agentId: agentId.toLowerCase(),\n source: source.toLowerCase(),\n accountId: '_',\n peerKind: 'direct',\n peerId: acpId.toLowerCase(),\n };\n }\n \n // Handle subagent ACP session key format: subagent:{parentId}:{parentSessionId}:acp:{uuid}\n if (parts.length === 5 && parts[0]?.toLowerCase() === 'subagent' && parts[3]?.toLowerCase() === 'acp') {\n const [_subagent, parentId, parentSessionId, source, acpId] = parts;\n return {\n agentId: `subagent:${parentId.toLowerCase()}:${parentSessionId.toLowerCase()}`,\n source: source.toLowerCase(),\n accountId: '_',\n peerKind: 'direct',\n peerId: acpId.toLowerCase(),\n };\n }\n \n if (parts.length < 5) {\n return null;\n }\n \n const [agentId, source, accountId, peerKind, peerId, ...rest] = parts;\n \n if (!agentId || !source || !accountId || !peerKind || !peerId) {\n return null;\n }\n \n const result: ParsedSessionKey = {\n agentId: agentId.toLowerCase(),\n source: source.toLowerCase(),\n accountId: accountId.toLowerCase(),\n peerKind: peerKind.toLowerCase(),\n peerId: peerId.toLowerCase(),\n };\n \n // Optional :thread: and :scope: suffix segments\n let i = 0;\n while (i < rest.length) {\n const marker = rest[i]?.toLowerCase();\n const value = rest[i + 1];\n \n if (marker === 'thread' && value) {\n result.threadId = value.toLowerCase();\n i += 2;\n } else if (marker === 'scope' && value) {\n result.scopeId = value.toLowerCase();\n i += 2;\n } else {\n i++;\n }\n }\n \n return result;\n}\n\n/**\n * Whether the key refers to a subagent session.\n */\nexport function isSubagentSessionKey(sessionKey: string | undefined | null): boolean {\n const parsed = parseSessionKey(sessionKey);\n return parsed?.agentId === 'subagent';\n}\n\n/**\n * Whether the key is an ACP session.\n */\nexport function isAcpSessionKey(sessionKey: string | undefined | null): boolean {\n const parsed = parseSessionKey(sessionKey);\n return parsed?.source === 'acp';\n}\n\n/**\n * Whether the key is a cron-driven session.\n */\nexport function isCronSessionKey(sessionKey: string | undefined | null): boolean {\n const parsed = parseSessionKey(sessionKey);\n return parsed?.source === 'cron';\n}\n\n/**\n * Nesting depth from repeated `subagent` prefixes in the colon-separated key.\n * e.g. `subagent:...` => 1, `subagent:subagent:...` => 2\n */\nexport function getSubagentDepth(sessionKey: string | undefined | null): number {\n const raw = (sessionKey ?? '').trim();\n if (!raw) {\n return 0;\n }\n \n const parts = raw.split(':');\n let depth = 0;\n \n for (const part of parts) {\n if (part.toLowerCase() === 'subagent') {\n depth++;\n } else {\n break;\n }\n }\n \n return depth;\n}\n\n/**\n * Parameters for building a subagent session key.\n */\nexport interface BuildSubagentSessionKeyParams extends BuildSessionKeyParams {\n parentSessionKey: string;\n}\n\nexport function buildSubagentSessionKey(params: BuildSubagentSessionKeyParams): string {\n const parentParsed = parseSessionKey(params.parentSessionKey);\n if (!parentParsed) {\n throw new Error(`Invalid parent session key: ${params.parentSessionKey}`);\n }\n \n return buildSessionKey({\n agentId: 'subagent',\n source: parentParsed.agentId,\n accountId: parentParsed.accountId,\n peerKind: parentParsed.peerKind,\n peerId: parentParsed.peerId,\n threadId: params.threadId,\n scopeId: params.scopeId,\n });\n}\n\n/**\n * Parent session key without a :thread: suffix, if any.\n */\nexport function getParentSessionKey(sessionKey: string | undefined | null): string | null {\n const parsed = parseSessionKey(sessionKey);\n if (!parsed) {\n return null;\n }\n \n if (!parsed.threadId) {\n return null;\n }\n \n return buildSessionKey({\n agentId: parsed.agentId,\n source: parsed.source,\n accountId: parsed.accountId,\n peerKind: parsed.peerKind,\n peerId: parsed.peerId,\n });\n}\n\n/**\n * Normalize a session key (trim + lowercase).\n */\nexport function normalizeSessionKey(sessionKey: string | undefined | null): string {\n return (sessionKey ?? '').trim().toLowerCase();\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"session-key.js","names":[],"sources":["../../../src/routing/session-key.ts"],"sourcesContent":["/**\n * Session key construction and parsing.\n *\n * Format: {agentId}:{source}:{accountId}:{peerKind}:{peerId}[:thread:{threadId}][:scope:{scopeId}]\n *\n * Examples:\n * - main:telegram:acc_default:dm:123456\n * - main:discord:acc_work:channel:987654:thread:789\n * - subagent:main:abc123:telegram:acc_default:dm:123456\n */\n\n// Precompiled regexes for segment validation\nconst VALID_SEGMENT_RE = /^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?$/i;\nconst INVALID_CHARS_RE = /[^a-z0-9_-]+/g;\nconst LEADING_DASH_RE = /^-+/;\nconst TRAILING_DASH_RE = /-+$/;\n\n/**\n * Sanitize a segment to allowed chars a-z0-9_-\n */\nexport function sanitizeSegment(value: string | undefined | null, options?: { allowLeadingDash?: boolean }): string {\n const trimmed = (value ?? '').trim();\n if (!trimmed) {\n return '';\n }\n \n // Strip disallowed characters\n let cleaned = trimmed\n .toLowerCase()\n .replace(INVALID_CHARS_RE, '-');\n \n // Trim leading/trailing dashes unless a leading dash is allowed (e.g. negative IDs)\n if (!options?.allowLeadingDash) {\n cleaned = cleaned\n .replace(LEADING_DASH_RE, '')\n .replace(TRAILING_DASH_RE, '');\n } else {\n // When leading dash is allowed, only strip trailing dashes\n cleaned = cleaned.replace(TRAILING_DASH_RE, '');\n }\n \n if (!cleaned) {\n return '';\n }\n \n return cleaned.slice(0, 64);\n}\n\n/**\n * Whether the segment matches the allowed pattern and length.\n */\nexport function isValidSegment(value: string | undefined | null): boolean {\n const trimmed = (value ?? '').trim();\n if (!trimmed) {\n return false;\n }\n \n if (trimmed.length > 64) {\n return false;\n }\n \n return VALID_SEGMENT_RE.test(trimmed);\n}\n\n/**\n * Fields used to build a session key.\n */\nexport interface BuildSessionKeyParams {\n agentId: string;\n source: string;\n accountId: string;\n peerKind: string;\n peerId: string;\n threadId?: string | null;\n scopeId?: string | null;\n}\n\nexport function buildSessionKey(params: BuildSessionKeyParams): string {\n const segments = [\n sanitizeSegment(params.agentId) || 'main',\n sanitizeSegment(params.source) || 'unknown',\n sanitizeSegment(params.accountId) || 'default',\n sanitizeSegment(params.peerKind) || 'unknown',\n // peerId may start with '-' (e.g. Telegram supergroup id -1001234567890)\n sanitizeSegment(params.peerId, { allowLeadingDash: true }) || 'unknown',\n ];\n \n if (params.threadId) {\n segments.push('thread', sanitizeSegment(params.threadId, { allowLeadingDash: true }) || 'unknown');\n }\n \n if (params.scopeId) {\n segments.push('scope', sanitizeSegment(params.scopeId, { allowLeadingDash: true }) || 'default');\n }\n \n return segments.join(':');\n}\n\n/**\n * Parsed session key components.\n */\nexport interface ParsedSessionKey {\n agentId: string;\n source: string;\n accountId: string;\n peerKind: string;\n peerId: string;\n threadId?: string;\n scopeId?: string;\n}\n\nexport function parseSessionKey(sessionKey: string | undefined | null): ParsedSessionKey | null {\n const raw = (sessionKey ?? '').trim();\n if (!raw) {\n return null;\n }\n \n const parts = raw.split(':').filter(Boolean);\n\n if (parts.length < 5) {\n return null;\n }\n \n const [agentId, source, accountId, peerKind, peerId, ...rest] = parts;\n \n if (!agentId || !source || !accountId || !peerKind || !peerId) {\n return null;\n }\n \n const result: ParsedSessionKey = {\n agentId: agentId.toLowerCase(),\n source: source.toLowerCase(),\n accountId: accountId.toLowerCase(),\n peerKind: peerKind.toLowerCase(),\n peerId: peerId.toLowerCase(),\n };\n \n // Optional :thread: and :scope: suffix segments\n let i = 0;\n while (i < rest.length) {\n const marker = rest[i]?.toLowerCase();\n const value = rest[i + 1];\n \n if (marker === 'thread' && value) {\n result.threadId = value.toLowerCase();\n i += 2;\n } else if (marker === 'scope' && value) {\n result.scopeId = value.toLowerCase();\n i += 2;\n } else {\n i++;\n }\n }\n \n return result;\n}\n\n/**\n * Whether the key refers to a subagent session.\n */\nexport function isSubagentSessionKey(sessionKey: string | undefined | null): boolean {\n const parsed = parseSessionKey(sessionKey);\n return parsed?.agentId === 'subagent';\n}\n\n/**\n * Whether the key is a cron-driven session.\n */\nexport function isCronSessionKey(sessionKey: string | undefined | null): boolean {\n const parsed = parseSessionKey(sessionKey);\n return parsed?.source === 'cron';\n}\n\n/**\n * Nesting depth from repeated `subagent` prefixes in the colon-separated key.\n * e.g. `subagent:...` => 1, `subagent:subagent:...` => 2\n */\nexport function getSubagentDepth(sessionKey: string | undefined | null): number {\n const raw = (sessionKey ?? '').trim();\n if (!raw) {\n return 0;\n }\n \n const parts = raw.split(':');\n let depth = 0;\n \n for (const part of parts) {\n if (part.toLowerCase() === 'subagent') {\n depth++;\n } else {\n break;\n }\n }\n \n return depth;\n}\n\n/**\n * Parameters for building a subagent session key.\n */\nexport interface BuildSubagentSessionKeyParams extends BuildSessionKeyParams {\n parentSessionKey: string;\n}\n\nexport function buildSubagentSessionKey(params: BuildSubagentSessionKeyParams): string {\n const parentParsed = parseSessionKey(params.parentSessionKey);\n if (!parentParsed) {\n throw new Error(`Invalid parent session key: ${params.parentSessionKey}`);\n }\n \n return buildSessionKey({\n agentId: 'subagent',\n source: parentParsed.agentId,\n accountId: parentParsed.accountId,\n peerKind: parentParsed.peerKind,\n peerId: parentParsed.peerId,\n threadId: params.threadId,\n scopeId: params.scopeId,\n });\n}\n\n/**\n * Parent session key without a :thread: suffix, if any.\n */\nexport function getParentSessionKey(sessionKey: string | undefined | null): string | null {\n const parsed = parseSessionKey(sessionKey);\n if (!parsed) {\n return null;\n }\n \n if (!parsed.threadId) {\n return null;\n }\n \n return buildSessionKey({\n agentId: parsed.agentId,\n source: parsed.source,\n accountId: parsed.accountId,\n peerKind: parsed.peerKind,\n peerId: parsed.peerId,\n });\n}\n\n/**\n * Normalize a session key (trim + lowercase).\n */\nexport function normalizeSessionKey(sessionKey: string | undefined | null): string {\n return (sessionKey ?? '').trim().toLowerCase();\n}\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Helpers for exporting chat session transcripts to workspace files (HTML wrapper).
3
+ */
4
+ export declare function escapeHtml(text: string): string;
5
+ export declare function wrapMarkdownExportAsHtml(title: string, markdownBody: string): string;
@@ -0,0 +1,35 @@
1
+ //#region src/session/chat-export.ts
2
+ /**
3
+ * Helpers for exporting chat session transcripts to workspace files (HTML wrapper).
4
+ */
5
+ function escapeHtml(text) {
6
+ return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
7
+ }
8
+ function wrapMarkdownExportAsHtml(title, markdownBody) {
9
+ const safeTitle = escapeHtml(title);
10
+ return `<!DOCTYPE html>
11
+ <html lang="en">
12
+ <head>
13
+ <meta charset="utf-8"/>
14
+ <meta name="viewport" content="width=device-width, initial-scale=1"/>
15
+ <title>${safeTitle}</title>
16
+ <style>
17
+ body { font-family: system-ui, sans-serif; max-width: 52rem; margin: 2rem auto; padding: 0 1rem; line-height: 1.5; }
18
+ pre { white-space: pre-wrap; word-break: break-word; background: #f4f4f5; padding: 1rem; border-radius: 8px; }
19
+ @media (prefers-color-scheme: dark) {
20
+ body { background: #18181b; color: #e4e4e7; }
21
+ pre { background: #27272a; }
22
+ }
23
+ </style>
24
+ </head>
25
+ <body>
26
+ <h1>${safeTitle}</h1>
27
+ <pre>${escapeHtml(markdownBody)}</pre>
28
+ </body>
29
+ </html>
30
+ `;
31
+ }
32
+ //#endregion
33
+ export { escapeHtml, wrapMarkdownExportAsHtml };
34
+
35
+ //# sourceMappingURL=chat-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-export.js","names":[],"sources":["../../../src/session/chat-export.ts"],"sourcesContent":["/**\n * Helpers for exporting chat session transcripts to workspace files (HTML wrapper).\n */\n\nexport function escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\nexport function wrapMarkdownExportAsHtml(title: string, markdownBody: string): string {\n const safeTitle = escapeHtml(title);\n const body = escapeHtml(markdownBody);\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\"/>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n <title>${safeTitle}</title>\n <style>\n body { font-family: system-ui, sans-serif; max-width: 52rem; margin: 2rem auto; padding: 0 1rem; line-height: 1.5; }\n pre { white-space: pre-wrap; word-break: break-word; background: #f4f4f5; padding: 1rem; border-radius: 8px; }\n @media (prefers-color-scheme: dark) {\n body { background: #18181b; color: #e4e4e7; }\n pre { background: #27272a; }\n }\n </style>\n</head>\n<body>\n <h1>${safeTitle}</h1>\n <pre>${body}</pre>\n</body>\n</html>\n`;\n\n}\n"],"mappings":";;;;AAIA,SAAgB,WAAW,MAAsB;AAC/C,QAAO,KACJ,QAAQ,MAAM,QAAQ,CACtB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,SAAS;;AAG5B,SAAgB,yBAAyB,OAAe,cAA8B;CACpF,MAAM,YAAY,WAAW,MAAM;AAEnC,QAAO;;;;;WAKE,UAAU;;;;;;;;;;;QAWb,UAAU;SAjBH,WAAW,aAAa,CAkBzB"}
@@ -1,8 +1,8 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
+ import { mkdir, readFile, writeFile } from "fs/promises";
3
4
  import { join } from "path";
4
5
  import { existsSync } from "fs";
5
- import { mkdir, readFile, writeFile } from "fs/promises";
6
6
  //#region src/session/config-store.ts
7
7
  /**
8
8
  * Session Config Store
@@ -95,7 +95,7 @@ export declare class SessionManager extends EventEmitter {
95
95
  stats?: ReturnType<any>;
96
96
  };
97
97
  /** Compact session messages */
98
- compact(key: string, messages: any[], contextWindow: number, instructions?: string): Promise<CompactionResult>;
98
+ compact(key: string, messages: any[], contextWindow: number, instructions?: string, force?: boolean): Promise<CompactionResult>;
99
99
  /** Compaction stats for a session */
100
100
  getCompactionStats(key: string): Promise<{
101
101
  compactionCount: number;
@@ -190,8 +190,8 @@ var SessionManager = class extends EventEmitter$1 {
190
190
  return this.store.prepareCompaction(key, messages, contextWindow);
191
191
  }
192
192
  /** Compact session messages */
193
- compact(key, messages, contextWindow, instructions) {
194
- return this.store.compact(key, messages, contextWindow, instructions);
193
+ compact(key, messages, contextWindow, instructions, force) {
194
+ return this.store.compact(key, messages, contextWindow, instructions, force);
195
195
  }
196
196
  /** Compaction stats for a session */
197
197
  async getCompactionStats(key) {
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","names":["EventEmitter"],"sources":["../../../src/session/manager.ts"],"sourcesContent":["// Session manager - high-level session management service\n\nimport EventEmitter from 'events';\nimport { createLogger } from '../utils/logger.js';\nimport { SessionStore } from './store.js';\nimport type {\n SessionMetadata,\n SessionDetail,\n SessionListQuery,\n PaginatedResult,\n GlobalSessionStats,\n ExportFormat,\n SessionStatus,\n} from './types.js';\nimport type { Message } from './types.js';\nimport type { CompactionConfig, CompactionResult } from '../agent/memory/compaction.js';\nimport type { WindowConfig } from '../agent/memory/window.js';\nimport type { Config } from '../config/schema.js';\n\nconst log = createLogger('SessionManager');\n\nexport interface SessionManagerConfig {\n config: Config;\n agentId?: string;\n sessionsDir?: string;\n windowConfig?: Partial<WindowConfig>;\n compactionConfig?: Partial<CompactionConfig>;\n}\n\nexport class SessionManager extends EventEmitter {\n private store: SessionStore;\n\n constructor(config: SessionManagerConfig) {\n super();\n this.store = new SessionStore(\n {\n config: config.config,\n agentId: config.agentId,\n sessionsDir: config.sessionsDir,\n },\n config.windowConfig,\n config.compactionConfig\n );\n }\n\n async initialize(): Promise<void> {\n await this.store.initialize();\n this.emit('ready');\n }\n\n /** Low-level store (e.g. cron resolving weixin delivery from session index). */\n getStore(): SessionStore {\n return this.store;\n }\n\n // ========== CRUD Operations ==========\n\n async listSessions(query?: SessionListQuery): Promise<PaginatedResult<SessionMetadata>> {\n return this.store.list(query);\n }\n\n /**\n * List all subagent sessions.\n * Subagent sessions have keys starting with 'subagent:'.\n */\n async listSubagents(query: SessionListQuery = {}): Promise<PaginatedResult<SessionMetadata>> {\n // Filter for subagent sessions only\n const subagentQuery: SessionListQuery = {\n ...query,\n search: query.search ? `subagent:${query.search}` : 'subagent:',\n };\n \n const result = await this.store.list(subagentQuery);\n \n // Additional filtering to ensure only subagent sessions\n const subagentSessions = result.items.filter((s) => s.key.startsWith('subagent:'));\n \n return {\n ...result,\n items: subagentSessions,\n total: subagentSessions.length,\n hasMore: false, // Simplified for now\n };\n }\n\n async getSession(key: string): Promise<SessionDetail | null> {\n const session = await this.store.get(key);\n if (session) {\n this.emit('sessionAccessed', { key });\n }\n return session;\n }\n\n async getSessionMetadata(key: string): Promise<SessionMetadata | null> {\n return this.store.getMetadata(key);\n }\n\n async deleteSession(key: string): Promise<boolean> {\n const result = await this.store.delete(key);\n if (result) {\n this.emit('sessionDeleted', { key });\n }\n return result;\n }\n\n async deleteSessions(keys: string[]): Promise<{ success: string[]; failed: string[] }> {\n const result = await this.store.deleteMany(keys);\n for (const key of result.success) {\n this.emit('sessionDeleted', { key });\n }\n return result;\n }\n\n // ========== Metadata Updates ==========\n\n async renameSession(key: string, name: string): Promise<void> {\n await this.store.updateMetadata(key, { name });\n this.emit('sessionUpdated', { key, name });\n }\n\n async tagSession(key: string, tags: string[]): Promise<void> {\n const existing = await this.store.getMetadata(key);\n if (!existing) {\n throw new Error(`Session not found: ${key}`);\n }\n\n // Merge tags, remove duplicates\n const mergedTags = [...new Set([...existing.tags, ...tags])];\n await this.store.updateMetadata(key, { tags: mergedTags });\n this.emit('sessionUpdated', { key, tags: mergedTags });\n }\n\n async untagSession(key: string, tags: string[]): Promise<void> {\n const existing = await this.store.getMetadata(key);\n if (!existing) {\n throw new Error(`Session not found: ${key}`);\n }\n\n const filteredTags = existing.tags.filter((t) => !tags.includes(t));\n await this.store.updateMetadata(key, { tags: filteredTags });\n this.emit('sessionUpdated', { key, tags: filteredTags });\n }\n\n async setSessionTags(key: string, tags: string[]): Promise<void> {\n await this.store.updateMetadata(key, { tags: [...new Set(tags)] });\n this.emit('sessionUpdated', { key, tags });\n }\n\n // ========== Status Management ==========\n\n async archiveSession(key: string): Promise<void> {\n await this.store.archive(key);\n this.emit('sessionArchived', { key });\n }\n\n async unarchiveSession(key: string): Promise<void> {\n await this.store.unarchive(key);\n this.emit('sessionRestored', { key });\n }\n\n async pinSession(key: string): Promise<void> {\n await this.store.pin(key);\n this.emit('sessionPinned', { key });\n }\n\n async unpinSession(key: string): Promise<void> {\n await this.store.unpin(key);\n this.emit('sessionUnpinned', { key });\n }\n\n async setSessionStatus(key: string, status: SessionStatus): Promise<void> {\n await this.store.setStatus(key, status);\n this.emit('sessionStatusChanged', { key, status });\n }\n\n // ========== Search ==========\n\n async searchSessions(query: string): Promise<SessionMetadata[]> {\n const result = await this.store.list({ search: query, limit: 100 });\n return result.items;\n }\n\n async searchInSession(key: string, keyword: string): Promise<Message[]> {\n return this.store.searchInSession(key, keyword);\n }\n\n // ========== Export/Import ==========\n\n async exportSession(key: string, format: ExportFormat): Promise<string> {\n return this.store.exportSession(key, format);\n }\n\n // ========== Statistics ==========\n\n async getStats(): Promise<GlobalSessionStats> {\n return this.store.getStats();\n }\n\n // ========== Maintenance ==========\n\n async archiveOldSessions(olderThanDays: number): Promise<number> {\n const count = await this.store.archiveOld(olderThanDays);\n log.info({ count, olderThanDays }, 'Archived old sessions');\n return count;\n }\n\n // ========== Event Helpers ==========\n\n onSessionCreated(callback: (metadata: SessionMetadata) => void): void {\n this.on('sessionCreated', callback);\n }\n\n onSessionUpdated(callback: (data: { key: string; name?: string; tags?: string[] }) => void): void {\n this.on('sessionUpdated', callback);\n }\n\n onSessionDeleted(callback: (data: { key: string }) => void): void {\n this.on('sessionDeleted', callback);\n }\n\n onSessionArchived(callback: (data: { key: string }) => void): void {\n this.on('sessionArchived', callback);\n }\n\n onSessionRestored(callback: (data: { key: string }) => void): void {\n this.on('sessionRestored', callback);\n }\n\n onSessionPinned(callback: (data: { key: string }) => void): void {\n this.on('sessionPinned', callback);\n }\n\n onSessionUnpinned(callback: (data: { key: string }) => void): void {\n this.on('sessionUnpinned', callback);\n }\n\n onSessionStatusChanged(callback: (data: { key: string; status: SessionStatus }) => void): void {\n this.on('sessionStatusChanged', callback);\n }\n\n onSessionAccessed(callback: (data: { key: string }) => void): void {\n this.on('sessionAccessed', callback);\n }\n\n // ========== Store delegation (messages, compaction) ==========\n\n /** Load messages for a session key */\n async loadMessages(key: string) {\n return this.store.loadMessages(key);\n }\n\n /** Save messages for a session key */\n async saveMessages(key: string, messages: any[]) {\n return this.store.saveMessages(key, messages);\n }\n\n /** Delete session data */\n async delete(key: string): Promise<void> {\n await this.store.delete(key);\n }\n\n /** Token/window stats for a message list */\n getWindowStats(messages: any[]) {\n return this.store.getWindowStats(messages);\n }\n\n /** Prepare compaction run */\n prepareCompaction(key: string, messages: any[], contextWindow: number) {\n return this.store.prepareCompaction(key, messages, contextWindow);\n }\n\n /** Compact session messages */\n compact(key: string, messages: any[], contextWindow: number, instructions?: string): Promise<CompactionResult> {\n return this.store.compact(key, messages, contextWindow, instructions);\n }\n\n /** Compaction stats for a session */\n async getCompactionStats(key: string) {\n return this.store.getCompactionStats(key);\n }\n\n /** Estimate token usage for messages */\n async estimateTokenUsage(key: string, messages: any[]): Promise<number> {\n return this.store.estimateTokens(messages);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"manager.js","names":["EventEmitter"],"sources":["../../../src/session/manager.ts"],"sourcesContent":["// Session manager - high-level session management service\n\nimport EventEmitter from 'events';\nimport { createLogger } from '../utils/logger.js';\nimport { SessionStore } from './store.js';\nimport type {\n SessionMetadata,\n SessionDetail,\n SessionListQuery,\n PaginatedResult,\n GlobalSessionStats,\n ExportFormat,\n SessionStatus,\n} from './types.js';\nimport type { Message } from './types.js';\nimport type { CompactionConfig, CompactionResult } from '../agent/memory/compaction.js';\nimport type { WindowConfig } from '../agent/memory/window.js';\nimport type { Config } from '../config/schema.js';\n\nconst log = createLogger('SessionManager');\n\nexport interface SessionManagerConfig {\n config: Config;\n agentId?: string;\n sessionsDir?: string;\n windowConfig?: Partial<WindowConfig>;\n compactionConfig?: Partial<CompactionConfig>;\n}\n\nexport class SessionManager extends EventEmitter {\n private store: SessionStore;\n\n constructor(config: SessionManagerConfig) {\n super();\n this.store = new SessionStore(\n {\n config: config.config,\n agentId: config.agentId,\n sessionsDir: config.sessionsDir,\n },\n config.windowConfig,\n config.compactionConfig\n );\n }\n\n async initialize(): Promise<void> {\n await this.store.initialize();\n this.emit('ready');\n }\n\n /** Low-level store (e.g. cron resolving weixin delivery from session index). */\n getStore(): SessionStore {\n return this.store;\n }\n\n // ========== CRUD Operations ==========\n\n async listSessions(query?: SessionListQuery): Promise<PaginatedResult<SessionMetadata>> {\n return this.store.list(query);\n }\n\n /**\n * List all subagent sessions.\n * Subagent sessions have keys starting with 'subagent:'.\n */\n async listSubagents(query: SessionListQuery = {}): Promise<PaginatedResult<SessionMetadata>> {\n // Filter for subagent sessions only\n const subagentQuery: SessionListQuery = {\n ...query,\n search: query.search ? `subagent:${query.search}` : 'subagent:',\n };\n \n const result = await this.store.list(subagentQuery);\n \n // Additional filtering to ensure only subagent sessions\n const subagentSessions = result.items.filter((s) => s.key.startsWith('subagent:'));\n \n return {\n ...result,\n items: subagentSessions,\n total: subagentSessions.length,\n hasMore: false, // Simplified for now\n };\n }\n\n async getSession(key: string): Promise<SessionDetail | null> {\n const session = await this.store.get(key);\n if (session) {\n this.emit('sessionAccessed', { key });\n }\n return session;\n }\n\n async getSessionMetadata(key: string): Promise<SessionMetadata | null> {\n return this.store.getMetadata(key);\n }\n\n async deleteSession(key: string): Promise<boolean> {\n const result = await this.store.delete(key);\n if (result) {\n this.emit('sessionDeleted', { key });\n }\n return result;\n }\n\n async deleteSessions(keys: string[]): Promise<{ success: string[]; failed: string[] }> {\n const result = await this.store.deleteMany(keys);\n for (const key of result.success) {\n this.emit('sessionDeleted', { key });\n }\n return result;\n }\n\n // ========== Metadata Updates ==========\n\n async renameSession(key: string, name: string): Promise<void> {\n await this.store.updateMetadata(key, { name });\n this.emit('sessionUpdated', { key, name });\n }\n\n async tagSession(key: string, tags: string[]): Promise<void> {\n const existing = await this.store.getMetadata(key);\n if (!existing) {\n throw new Error(`Session not found: ${key}`);\n }\n\n // Merge tags, remove duplicates\n const mergedTags = [...new Set([...existing.tags, ...tags])];\n await this.store.updateMetadata(key, { tags: mergedTags });\n this.emit('sessionUpdated', { key, tags: mergedTags });\n }\n\n async untagSession(key: string, tags: string[]): Promise<void> {\n const existing = await this.store.getMetadata(key);\n if (!existing) {\n throw new Error(`Session not found: ${key}`);\n }\n\n const filteredTags = existing.tags.filter((t) => !tags.includes(t));\n await this.store.updateMetadata(key, { tags: filteredTags });\n this.emit('sessionUpdated', { key, tags: filteredTags });\n }\n\n async setSessionTags(key: string, tags: string[]): Promise<void> {\n await this.store.updateMetadata(key, { tags: [...new Set(tags)] });\n this.emit('sessionUpdated', { key, tags });\n }\n\n // ========== Status Management ==========\n\n async archiveSession(key: string): Promise<void> {\n await this.store.archive(key);\n this.emit('sessionArchived', { key });\n }\n\n async unarchiveSession(key: string): Promise<void> {\n await this.store.unarchive(key);\n this.emit('sessionRestored', { key });\n }\n\n async pinSession(key: string): Promise<void> {\n await this.store.pin(key);\n this.emit('sessionPinned', { key });\n }\n\n async unpinSession(key: string): Promise<void> {\n await this.store.unpin(key);\n this.emit('sessionUnpinned', { key });\n }\n\n async setSessionStatus(key: string, status: SessionStatus): Promise<void> {\n await this.store.setStatus(key, status);\n this.emit('sessionStatusChanged', { key, status });\n }\n\n // ========== Search ==========\n\n async searchSessions(query: string): Promise<SessionMetadata[]> {\n const result = await this.store.list({ search: query, limit: 100 });\n return result.items;\n }\n\n async searchInSession(key: string, keyword: string): Promise<Message[]> {\n return this.store.searchInSession(key, keyword);\n }\n\n // ========== Export/Import ==========\n\n async exportSession(key: string, format: ExportFormat): Promise<string> {\n return this.store.exportSession(key, format);\n }\n\n // ========== Statistics ==========\n\n async getStats(): Promise<GlobalSessionStats> {\n return this.store.getStats();\n }\n\n // ========== Maintenance ==========\n\n async archiveOldSessions(olderThanDays: number): Promise<number> {\n const count = await this.store.archiveOld(olderThanDays);\n log.info({ count, olderThanDays }, 'Archived old sessions');\n return count;\n }\n\n // ========== Event Helpers ==========\n\n onSessionCreated(callback: (metadata: SessionMetadata) => void): void {\n this.on('sessionCreated', callback);\n }\n\n onSessionUpdated(callback: (data: { key: string; name?: string; tags?: string[] }) => void): void {\n this.on('sessionUpdated', callback);\n }\n\n onSessionDeleted(callback: (data: { key: string }) => void): void {\n this.on('sessionDeleted', callback);\n }\n\n onSessionArchived(callback: (data: { key: string }) => void): void {\n this.on('sessionArchived', callback);\n }\n\n onSessionRestored(callback: (data: { key: string }) => void): void {\n this.on('sessionRestored', callback);\n }\n\n onSessionPinned(callback: (data: { key: string }) => void): void {\n this.on('sessionPinned', callback);\n }\n\n onSessionUnpinned(callback: (data: { key: string }) => void): void {\n this.on('sessionUnpinned', callback);\n }\n\n onSessionStatusChanged(callback: (data: { key: string; status: SessionStatus }) => void): void {\n this.on('sessionStatusChanged', callback);\n }\n\n onSessionAccessed(callback: (data: { key: string }) => void): void {\n this.on('sessionAccessed', callback);\n }\n\n // ========== Store delegation (messages, compaction) ==========\n\n /** Load messages for a session key */\n async loadMessages(key: string) {\n return this.store.loadMessages(key);\n }\n\n /** Save messages for a session key */\n async saveMessages(key: string, messages: any[]) {\n return this.store.saveMessages(key, messages);\n }\n\n /** Delete session data */\n async delete(key: string): Promise<void> {\n await this.store.delete(key);\n }\n\n /** Token/window stats for a message list */\n getWindowStats(messages: any[]) {\n return this.store.getWindowStats(messages);\n }\n\n /** Prepare compaction run */\n prepareCompaction(key: string, messages: any[], contextWindow: number) {\n return this.store.prepareCompaction(key, messages, contextWindow);\n }\n\n /** Compact session messages */\n compact(\n key: string,\n messages: any[],\n contextWindow: number,\n instructions?: string,\n force?: boolean,\n ): Promise<CompactionResult> {\n return this.store.compact(key, messages, contextWindow, instructions, force);\n }\n\n /** Compaction stats for a session */\n async getCompactionStats(key: string) {\n return this.store.getCompactionStats(key);\n }\n\n /** Estimate token usage for messages */\n async estimateTokenUsage(key: string, messages: any[]): Promise<number> {\n return this.store.estimateTokens(messages);\n }\n}\n"],"mappings":"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"}
@@ -118,7 +118,7 @@ export declare class SessionStore {
118
118
  /**
119
119
  * Compact session with LLM summary
120
120
  */
121
- compact(key: string, messages: AgentMessage[], contextWindow: number, instructions?: string): Promise<CompactionResult>;
121
+ compact(key: string, messages: AgentMessage[], contextWindow: number, instructions?: string, force?: boolean): Promise<CompactionResult>;
122
122
  /**
123
123
  * Get compaction stats for a session
124
124
  */
@@ -9,9 +9,9 @@ import { SessionStatus } from "./types.js";
9
9
  import { SessionCompactor } from "../agent/memory/compaction.js";
10
10
  import { SlidingWindow } from "../agent/memory/window.js";
11
11
  import { cleanTrailingErrors, hasProblematicMessages } from "../agent/memory/message-sanitizer.js";
12
+ import { mkdir, readFile, readdir, stat, unlink, writeFile } from "fs/promises";
12
13
  import { basename, join } from "path";
13
14
  import { existsSync } from "fs";
14
- import { mkdir, readFile, readdir, stat, unlink, writeFile } from "fs/promises";
15
15
  //#region src/session/store.ts
16
16
  init_paths();
17
17
  init_agent_scope();
@@ -525,8 +525,8 @@ var SessionStore = class {
525
525
  /**
526
526
  * Compact session with LLM summary
527
527
  */
528
- async compact(key, messages, contextWindow, instructions) {
529
- const result = await this.compactor.compact(messages, instructions);
528
+ async compact(key, messages, contextWindow, instructions, force) {
529
+ const result = await this.compactor.compact(messages, instructions, force);
530
530
  if (result.compacted) await this.applyCompaction(key, messages, result);
531
531
  return result;
532
532
  }
@@ -657,10 +657,6 @@ var SessionStore = class {
657
657
  chatId: parts.slice(2).join(":")
658
658
  };
659
659
  }
660
- if (parts.length === 3 && parts[1] === "acp") return {
661
- channel: "acp",
662
- chatId: parts[2]
663
- };
664
660
  if (parts.length >= 2 && parts[0] === "heartbeat") return {
665
661
  channel: "heartbeat",
666
662
  chatId: parts.slice(1).join(":")