@xopcai/xopc 0.0.86 → 0.0.87

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 (380) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/adapters/cli-login.js +3 -3
  3. package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
  4. package/dist/extensions/telegram/src/delivery-chat-id.d.ts +1 -1
  5. package/dist/extensions/telegram/src/delivery-chat-id.js +1 -1
  6. package/dist/extensions/telegram/src/delivery-chat-id.js.map +1 -1
  7. package/dist/extensions/telegram/src/routing-integration.js +1 -0
  8. package/dist/extensions/telegram/src/routing-integration.js.map +1 -1
  9. package/dist/extensions/telegram/xopc.extension.json +1 -1
  10. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +2 -2
  11. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +1 -1
  12. package/dist/extensions/weixin/src/api/api.js +2 -2
  13. package/dist/extensions/weixin/src/api/api.js.map +1 -1
  14. package/dist/extensions/weixin/src/auth/accounts.js +12 -12
  15. package/dist/extensions/weixin/src/auth/accounts.js.map +1 -1
  16. package/dist/extensions/weixin/src/delivery-to.js +2 -2
  17. package/dist/extensions/weixin/src/delivery-to.js.map +1 -1
  18. package/dist/extensions/weixin/src/messaging/debug-mode.js +5 -5
  19. package/dist/extensions/weixin/src/messaging/debug-mode.js.map +1 -1
  20. package/dist/extensions/weixin/src/messaging/inbound.js +11 -11
  21. package/dist/extensions/weixin/src/messaging/inbound.js.map +1 -1
  22. package/dist/extensions/weixin/src/storage/sync-buf.js +4 -4
  23. package/dist/extensions/weixin/src/storage/sync-buf.js.map +1 -1
  24. package/dist/extensions/weixin/src/workflow-progress.d.ts +1 -1
  25. package/dist/extensions/weixin/src/workflow-progress.js.map +1 -1
  26. package/dist/gateway/static/root/assets/{agents-mS3_HpRI.js → agents-BEAbXpuP.js} +6 -6
  27. package/dist/gateway/static/root/assets/{apps-page-DrfytjOb.js → apps-page-Dg8R-Szf.js} +1 -1
  28. package/dist/gateway/static/root/assets/{channels-settings-BG6b9KrW.js → channels-settings-yohw9YSu.js} +1 -1
  29. package/dist/gateway/static/root/assets/{channels-status-swr-Bs5kMCMI.js → channels-status-swr-BSHqqCF1.js} +1 -1
  30. package/dist/gateway/static/root/assets/{cron-api-BuVcZ5zR.js → cron-api-0h_QT8U3.js} +1 -1
  31. package/dist/gateway/static/root/assets/{cron-page-BMrloeFH.js → cron-page-BkfKFfFk.js} +1 -1
  32. package/dist/gateway/static/root/assets/{dist-CKU1OOTf.js → dist-Cmjp2APP.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-debug-page-BdW_46sN.js → extension-debug-page-CFa9z_1N.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-page-DW47KI82.js → extension-page-BI8eaTPq.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-settings-page-B-W4x2xP.js → extension-settings-page-x4BB7q1X.js} +1 -1
  36. package/dist/gateway/static/root/assets/{fetch-B2MYHbWg.js → fetch-DRqwef_Q.js} +1 -1
  37. package/dist/gateway/static/root/assets/{field-primitives-DPG-oJmx.js → field-primitives-BiNHBo2Y.js} +1 -1
  38. package/dist/gateway/static/root/assets/{heartbeat-config-api-C8dNts9i.js → heartbeat-config-api-ZRb8qhuz.js} +1 -1
  39. package/dist/gateway/static/root/assets/{index-BmVYculr.js → index-Cu7bKuUi.js} +96 -94
  40. package/dist/gateway/static/root/assets/index-a5gWIdZQ.css +1 -0
  41. package/dist/gateway/static/root/assets/{logs-page-sTsVWz0X.js → logs-page-BFZ8GgCv.js} +1 -1
  42. package/dist/gateway/static/root/assets/{sessions-page-FaG_Vlkb.js → sessions-page-CD7AfB-2.js} +1 -1
  43. package/dist/gateway/static/root/assets/{settings-form-section-DuvRQW--.js → settings-form-section-DiqqVs6m.js} +1 -1
  44. package/dist/gateway/static/root/assets/{settings-page-Bet1OerL.js → settings-page-BBOjEQW3.js} +1 -1
  45. package/dist/gateway/static/root/assets/{share-preview-page-BtG2kLDh.js → share-preview-page-n1Gprylk.js} +1 -1
  46. package/dist/gateway/static/root/assets/{skills-page-DhUO235y.js → skills-page-CcN_gj--.js} +1 -1
  47. package/dist/gateway/static/root/assets/{theme-store-DryYl3qD.js → theme-store-CZOh1nT3.js} +1 -1
  48. package/dist/gateway/static/root/assets/url-Dd8Q7kZZ.js +3 -0
  49. package/dist/gateway/static/root/assets/{utils-BY7bU1DT.js → utils-CkWBfxs4.js} +1 -1
  50. package/dist/gateway/static/root/assets/{voice-api-key-field-CGEydndO.js → voice-api-key-field-O6awz9hi.js} +1 -1
  51. package/dist/gateway/static/root/index.html +5 -5
  52. package/dist/package.js +1 -1
  53. package/dist/src/agent/agent-scope.d.ts +4 -0
  54. package/dist/src/agent/agent-scope.js +53 -10
  55. package/dist/src/agent/agent-scope.js.map +1 -1
  56. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +2 -1
  57. package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +1 -1
  58. package/dist/src/agent/embedded/session-tool-result-guard.js +2 -1
  59. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  60. package/dist/src/agent/embedded/tool-result-truncation.js +2 -1
  61. package/dist/src/agent/embedded/tool-result-truncation.js.map +1 -1
  62. package/dist/src/agent/fallback/candidates.js +2 -2
  63. package/dist/src/agent/fallback/candidates.js.map +1 -1
  64. package/dist/src/agent/goals/persistent-goal-apis.d.ts +0 -2
  65. package/dist/src/agent/goals/persistent-goal-service.js +0 -1
  66. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
  67. package/dist/src/agent/image/generation/normalization.js +2 -12
  68. package/dist/src/agent/image/generation/normalization.js.map +1 -1
  69. package/dist/src/agent/image/generation/provider-registry.d.ts +4 -8
  70. package/dist/src/agent/image/generation/provider-registry.js.map +1 -1
  71. package/dist/src/agent/image/generation/runtime.d.ts +2 -2
  72. package/dist/src/agent/image/generation/runtime.js.map +1 -1
  73. package/dist/src/agent/image/generation/types.d.ts +0 -18
  74. package/dist/src/agent/image/image-helpers.js +6 -1
  75. package/dist/src/agent/image/image-helpers.js.map +1 -1
  76. package/dist/src/agent/image/index.d.ts +1 -1
  77. package/dist/src/agent/inbound/inbound-loop.d.ts +5 -0
  78. package/dist/src/agent/inbound/inbound-loop.js +41 -10
  79. package/dist/src/agent/inbound/inbound-loop.js.map +1 -1
  80. package/dist/src/agent/inbound/turn-dispatcher.d.ts +4 -0
  81. package/dist/src/agent/inbound/turn-dispatcher.js +6 -4
  82. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  83. package/dist/src/agent/mcp/bundle-mcp-materialize.js +2 -1
  84. package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +1 -1
  85. package/dist/src/agent/mcp/bundle-mcp-names.js +2 -1
  86. package/dist/src/agent/mcp/bundle-mcp-names.js.map +1 -1
  87. package/dist/src/agent/mcp/bundle-mcp-runtime.js +2 -1
  88. package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +1 -1
  89. package/dist/src/agent/mcp/mcp-transport-config.js +2 -1
  90. package/dist/src/agent/mcp/mcp-transport-config.js.map +1 -1
  91. package/dist/src/agent/mcp/mcp-transport.js +2 -1
  92. package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
  93. package/dist/src/agent/media-generation/runtime-shared.js +2 -9
  94. package/dist/src/agent/media-generation/runtime-shared.js.map +1 -1
  95. package/dist/src/agent/messaging/command-handler.d.ts +6 -0
  96. package/dist/src/agent/messaging/command-handler.js +5 -0
  97. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  98. package/dist/src/agent/prompt/safety.d.ts +0 -7
  99. package/dist/src/agent/prompt/safety.js +1 -20
  100. package/dist/src/agent/prompt/safety.js.map +1 -1
  101. package/dist/src/agent/service/build-direct-message-content.js +1 -1
  102. package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
  103. package/dist/src/agent/service/direct-turn-helpers.d.ts +3 -1
  104. package/dist/src/agent/service/direct-turn-helpers.js +6 -1
  105. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  106. package/dist/src/agent/service/process-direct-one-shot.d.ts +4 -0
  107. package/dist/src/agent/service/process-direct-one-shot.js +15 -2
  108. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  109. package/dist/src/agent/service/process-direct-streaming.d.ts +4 -0
  110. package/dist/src/agent/service/process-direct-streaming.js +34 -4
  111. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  112. package/dist/src/agent/service/webchat-tts.js +1 -1
  113. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  114. package/dist/src/agent/service.d.ts +8 -0
  115. package/dist/src/agent/service.js +21 -1
  116. package/dist/src/agent/service.js.map +1 -1
  117. package/dist/src/agent/tools/create-share-tool.js +27 -20
  118. package/dist/src/agent/tools/create-share-tool.js.map +1 -1
  119. package/dist/src/agent/tools/factory.js +1 -1
  120. package/dist/src/agent/tools/index.d.ts +0 -1
  121. package/dist/src/agent/tools/index.js +4 -5
  122. package/dist/src/agent/tools/shell.js +0 -13
  123. package/dist/src/agent/tools/shell.js.map +1 -1
  124. package/dist/src/agent/tools/workflow-tool.js +7 -1
  125. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  126. package/dist/src/agent/workflow/channel-capability.d.ts +3 -3
  127. package/dist/src/agent/workflow/lint.d.ts +38 -0
  128. package/dist/src/agent/workflow/lint.js +74 -0
  129. package/dist/src/agent/workflow/lint.js.map +1 -0
  130. package/dist/src/agent/workflow/parser.js +4 -1
  131. package/dist/src/agent/workflow/parser.js.map +1 -1
  132. package/dist/src/agent/workflow/runtime.d.ts +3 -0
  133. package/dist/src/agent/workflow/runtime.js +76 -3
  134. package/dist/src/agent/workflow/runtime.js.map +1 -1
  135. package/dist/src/agent/workflow/types.d.ts +3 -1
  136. package/dist/src/browser/index.js +4 -4
  137. package/dist/src/browser/manager.d.ts +1 -3
  138. package/dist/src/browser/manager.js +0 -6
  139. package/dist/src/browser/manager.js.map +1 -1
  140. package/dist/src/browser/providers/browser-ext-install.d.ts +4 -4
  141. package/dist/src/browser/providers/browser-ext-install.js +38 -85
  142. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  143. package/dist/src/browser/providers/cloakbrowser.d.ts +0 -5
  144. package/dist/src/browser/providers/cloakbrowser.js +2 -55
  145. package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
  146. package/dist/src/channels/attachments/voice-stt-webchat.js +10 -8
  147. package/dist/src/channels/attachments/voice-stt-webchat.js.map +1 -1
  148. package/dist/src/channels/pairing/allow-from-file.js +9 -9
  149. package/dist/src/channels/pairing/allow-from-file.js.map +1 -1
  150. package/dist/src/channels/pairing/pairing-store.js +6 -6
  151. package/dist/src/channels/pairing/pairing-store.js.map +1 -1
  152. package/dist/src/chat-commands/builtins/session.js +1 -1
  153. package/dist/src/chat-commands/builtins/session.js.map +1 -1
  154. package/dist/src/chat-commands/builtins/tts.js +2 -2
  155. package/dist/src/chat-commands/builtins/tts.js.map +1 -1
  156. package/dist/src/chat-commands/context.d.ts +3 -0
  157. package/dist/src/chat-commands/context.js +21 -3
  158. package/dist/src/chat-commands/context.js.map +1 -1
  159. package/dist/src/chat-commands/session-key.d.ts +4 -37
  160. package/dist/src/chat-commands/session-key.js +49 -85
  161. package/dist/src/chat-commands/session-key.js.map +1 -1
  162. package/dist/src/chat-commands/types.d.ts +2 -0
  163. package/dist/src/cli/commands/agent/interactive.js +2 -2
  164. package/dist/src/cli/commands/agent/interactive.js.map +1 -1
  165. package/dist/src/cli/commands/agent/sessions.js +2 -2
  166. package/dist/src/cli/commands/agent/sessions.js.map +1 -1
  167. package/dist/src/cli/commands/agent.js +4 -5
  168. package/dist/src/cli/commands/agent.js.map +1 -1
  169. package/dist/src/cli/commands/channels.js +1 -5
  170. package/dist/src/cli/commands/channels.js.map +1 -1
  171. package/dist/src/cli/commands/gateway/lifecycle-core.js +1 -1
  172. package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
  173. package/dist/src/cli/commands/gateway/logs.d.ts +9 -0
  174. package/dist/src/cli/commands/gateway/logs.js +50 -17
  175. package/dist/src/cli/commands/gateway/logs.js.map +1 -1
  176. package/dist/src/cli/commands/image.js +22 -21
  177. package/dist/src/cli/commands/image.js.map +1 -1
  178. package/dist/src/cli/commands/session/utils.js +2 -2
  179. package/dist/src/cli/commands/session/utils.js.map +1 -1
  180. package/dist/src/cli/commands/update.js +26 -46
  181. package/dist/src/cli/commands/update.js.map +1 -1
  182. package/dist/src/cli/utils/session.d.ts +0 -5
  183. package/dist/src/cli/utils/session.js +1 -6
  184. package/dist/src/cli/utils/session.js.map +1 -1
  185. package/dist/src/commands/agents.config.js +1 -1
  186. package/dist/src/commands/agents.config.js.map +1 -1
  187. package/dist/src/config/agent-profile.js +5 -27
  188. package/dist/src/config/agent-profile.js.map +1 -1
  189. package/dist/src/config/index.js +2 -2
  190. package/dist/src/config/model-input.js +2 -5
  191. package/dist/src/config/model-input.js.map +1 -1
  192. package/dist/src/config/schema.d.ts +201 -217
  193. package/dist/src/config/schema.js +54 -39
  194. package/dist/src/config/schema.js.map +1 -1
  195. package/dist/src/config/workspace-path-helpers.d.ts +1 -2
  196. package/dist/src/config/workspace-path-helpers.js.map +1 -1
  197. package/dist/src/daemon/install-plan.js +25 -1
  198. package/dist/src/daemon/install-plan.js.map +1 -1
  199. package/dist/src/daemon/launchd.d.ts +8 -0
  200. package/dist/src/daemon/launchd.js +5 -12
  201. package/dist/src/daemon/launchd.js.map +1 -1
  202. package/dist/src/daemon/schtasks.d.ts +25 -0
  203. package/dist/src/daemon/schtasks.js +166 -46
  204. package/dist/src/daemon/schtasks.js.map +1 -1
  205. package/dist/src/daemon/service.js +5 -4
  206. package/dist/src/daemon/service.js.map +1 -1
  207. package/dist/src/daemon/systemd.d.ts +6 -0
  208. package/dist/src/daemon/systemd.js +18 -3
  209. package/dist/src/daemon/systemd.js.map +1 -1
  210. package/dist/src/extensions/activation-context.js +0 -1
  211. package/dist/src/extensions/activation-context.js.map +1 -1
  212. package/dist/src/extensions/normalize-manifest.js +0 -1
  213. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  214. package/dist/src/extensions/types/manifest.d.ts +0 -2
  215. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  216. package/dist/src/gateway/agent-builtin-tools.js +1 -0
  217. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  218. package/dist/src/gateway/agents-admin.js +10 -2
  219. package/dist/src/gateway/agents-admin.js.map +1 -1
  220. package/dist/src/gateway/heartbeat/service.js +2 -2
  221. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  222. package/dist/src/gateway/hono/app.js +1 -1
  223. package/dist/src/gateway/hono/lib/agent-model.d.ts +18 -10
  224. package/dist/src/gateway/hono/lib/agent-model.js +24 -35
  225. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  226. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  227. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  228. package/dist/src/gateway/hono/lib/safe-voice-config.js +14 -53
  229. package/dist/src/gateway/hono/lib/safe-voice-config.js.map +1 -1
  230. package/dist/src/gateway/hono/routes/config-patch/agents.js +17 -5
  231. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  232. package/dist/src/gateway/hono/routes/config-patch/channels.js +0 -11
  233. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  234. package/dist/src/gateway/hono/routes/goals.js +1 -1
  235. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  236. package/dist/src/gateway/hono/routes/sessions.js +28 -7
  237. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  238. package/dist/src/gateway/hono/routes/shares.js +14 -12
  239. package/dist/src/gateway/hono/routes/shares.js.map +1 -1
  240. package/dist/src/gateway/hono/routes/tunnel.js +1 -1
  241. package/dist/src/gateway/hono/routes/update.js +4 -2
  242. package/dist/src/gateway/hono/routes/update.js.map +1 -1
  243. package/dist/src/gateway/hono/sse.js +16 -33
  244. package/dist/src/gateway/hono/sse.js.map +1 -1
  245. package/dist/src/gateway/lock.js +10 -10
  246. package/dist/src/gateway/lock.js.map +1 -1
  247. package/dist/src/gateway/ports.js +6 -6
  248. package/dist/src/gateway/ports.js.map +1 -1
  249. package/dist/src/gateway/resolve-webchat-session-key.d.ts +19 -0
  250. package/dist/src/gateway/resolve-webchat-session-key.js +46 -0
  251. package/dist/src/gateway/resolve-webchat-session-key.js.map +1 -0
  252. package/dist/src/gateway/service/run-gateway-agent.js +27 -11
  253. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  254. package/dist/src/gateway/service/sessions-api.d.ts +3 -0
  255. package/dist/src/gateway/service/sessions-api.js +8 -0
  256. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  257. package/dist/src/gateway/service.d.ts +0 -2
  258. package/dist/src/gateway/service.js +2 -7
  259. package/dist/src/gateway/service.js.map +1 -1
  260. package/dist/src/gateway/session-reset-service.d.ts +20 -0
  261. package/dist/src/gateway/session-reset-service.js +54 -0
  262. package/dist/src/gateway/session-reset-service.js.map +1 -0
  263. package/dist/src/gateway/startup-readiness.d.ts +1 -1
  264. package/dist/src/gateway/startup-readiness.js +1 -0
  265. package/dist/src/gateway/startup-readiness.js.map +1 -1
  266. package/dist/src/heartbeat/index.js +1 -1
  267. package/dist/src/infra/gateway-processes.js +2 -2
  268. package/dist/src/infra/gateway-processes.js.map +1 -1
  269. package/dist/src/infra/run-command.d.ts +16 -0
  270. package/dist/src/infra/run-command.js +67 -0
  271. package/dist/src/infra/run-command.js.map +1 -0
  272. package/dist/src/infra/update-global.d.ts +45 -0
  273. package/dist/src/infra/update-global.js +224 -0
  274. package/dist/src/infra/update-global.js.map +1 -0
  275. package/dist/src/mcp/channel-bridge.js +1 -1
  276. package/dist/src/mcp/channel-shared.js +2 -1
  277. package/dist/src/mcp/channel-shared.js.map +1 -1
  278. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  279. package/dist/src/providers/auth-runtime/auth-profile-store.js.map +1 -1
  280. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -12
  281. package/dist/src/providers/auth-runtime/resolve-auth.js.map +1 -1
  282. package/dist/src/providers/auth-runtime/types.d.ts +6 -12
  283. package/dist/src/routing/agent-session-key.d.ts +58 -0
  284. package/dist/src/routing/agent-session-key.js +164 -0
  285. package/dist/src/routing/agent-session-key.js.map +1 -0
  286. package/dist/src/routing/index.d.ts +1 -1
  287. package/dist/src/routing/index.js +4 -2
  288. package/dist/src/routing/index.js.map +1 -1
  289. package/dist/src/routing/resolve-route.d.ts +15 -0
  290. package/dist/src/routing/resolve-route.js +41 -20
  291. package/dist/src/routing/resolve-route.js.map +1 -1
  292. package/dist/src/routing/resolve-tui-session-key.d.ts +25 -0
  293. package/dist/src/routing/resolve-tui-session-key.js +54 -0
  294. package/dist/src/routing/resolve-tui-session-key.js.map +1 -0
  295. package/dist/src/routing/session-key-utils.d.ts +24 -0
  296. package/dist/src/routing/session-key-utils.js +92 -0
  297. package/dist/src/routing/session-key-utils.js.map +1 -0
  298. package/dist/src/routing/session-key.d.ts +19 -49
  299. package/dist/src/routing/session-key.js +143 -116
  300. package/dist/src/routing/session-key.js.map +1 -1
  301. package/dist/src/session/index.d.ts +6 -0
  302. package/dist/src/session/index.js +7 -1
  303. package/dist/src/session/init-session-turn.d.ts +30 -0
  304. package/dist/src/session/init-session-turn.js +102 -0
  305. package/dist/src/session/init-session-turn.js.map +1 -0
  306. package/dist/src/session/lifecycle-timestamps.d.ts +8 -0
  307. package/dist/src/session/lifecycle-timestamps.js +16 -0
  308. package/dist/src/session/lifecycle-timestamps.js.map +1 -0
  309. package/dist/src/session/manager.d.ts +7 -1
  310. package/dist/src/session/manager.js +8 -1
  311. package/dist/src/session/manager.js.map +1 -1
  312. package/dist/src/session/parity/transcript-paths.js +2 -2
  313. package/dist/src/session/parity/transcript-paths.js.map +1 -1
  314. package/dist/src/session/parity/xopc-session-disk-entry.d.ts +6 -0
  315. package/dist/src/session/reset-policy.d.ts +32 -0
  316. package/dist/src/session/reset-policy.js +65 -0
  317. package/dist/src/session/reset-policy.js.map +1 -0
  318. package/dist/src/session/reset-triggers.d.ts +20 -0
  319. package/dist/src/session/reset-triggers.js +63 -0
  320. package/dist/src/session/reset-triggers.js.map +1 -0
  321. package/dist/src/session/reset-type.d.ts +12 -0
  322. package/dist/src/session/reset-type.js +25 -0
  323. package/dist/src/session/reset-type.js.map +1 -0
  324. package/dist/src/session/resolve-session.d.ts +30 -0
  325. package/dist/src/session/resolve-session.js +93 -0
  326. package/dist/src/session/resolve-session.js.map +1 -0
  327. package/dist/src/session/session-title.js +3 -2
  328. package/dist/src/session/session-title.js.map +1 -1
  329. package/dist/src/session/store.d.ts +11 -4
  330. package/dist/src/session/store.js +57 -6
  331. package/dist/src/session/store.js.map +1 -1
  332. package/dist/src/session/transcript-events.js +2 -1
  333. package/dist/src/session/transcript-events.js.map +1 -1
  334. package/dist/src/share/share-url.d.ts +33 -0
  335. package/dist/src/share/share-url.js +56 -14
  336. package/dist/src/share/share-url.js.map +1 -1
  337. package/dist/src/tui/backends/embedded-backend.js +4 -9
  338. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  339. package/dist/src/tui/backends/gateway-sse-backend.js +1 -1
  340. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  341. package/dist/src/tui/components/chat-log.js +3 -3
  342. package/dist/src/tui/components/chat-log.js.map +1 -1
  343. package/dist/src/tui/theme.d.ts +0 -2
  344. package/dist/src/tui/theme.js +1 -3
  345. package/dist/src/tui/theme.js.map +1 -1
  346. package/dist/src/tui/tui-commands.d.ts +3 -0
  347. package/dist/src/tui/tui-commands.js +45 -10
  348. package/dist/src/tui/tui-commands.js.map +1 -1
  349. package/dist/src/tui/tui-keybindings-file.js +1 -21
  350. package/dist/src/tui/tui-keybindings-file.js.map +1 -1
  351. package/dist/src/tui/tui-session-actions.d.ts +28 -0
  352. package/dist/src/tui/tui-session-actions.js +88 -0
  353. package/dist/src/tui/tui-session-actions.js.map +1 -0
  354. package/dist/src/tui/tui.js +52 -47
  355. package/dist/src/tui/tui.js.map +1 -1
  356. package/dist/src/utils/string-coerce.d.ts +2 -0
  357. package/dist/src/utils/string-coerce.js +10 -1
  358. package/dist/src/utils/string-coerce.js.map +1 -1
  359. package/dist/src/voice/stt/config-slice.d.ts +2 -5
  360. package/dist/src/voice/stt/config-slice.js +5 -26
  361. package/dist/src/voice/stt/config-slice.js.map +1 -1
  362. package/dist/src/voice/stt/types.d.ts +1 -18
  363. package/dist/src/voice/stt/types.js +4 -2
  364. package/dist/src/voice/stt/types.js.map +1 -1
  365. package/dist/src/voice/tts/config-slice.d.ts +3 -7
  366. package/dist/src/voice/tts/config-slice.js +7 -38
  367. package/dist/src/voice/tts/config-slice.js.map +1 -1
  368. package/dist/src/voice/tts/merge-config.js +2 -48
  369. package/dist/src/voice/tts/merge-config.js.map +1 -1
  370. package/dist/src/voice/tts/providers/alibaba-speech.js +1 -1
  371. package/dist/src/voice/tts/providers/alibaba-speech.js.map +1 -1
  372. package/dist/src/voice/tts/types.d.ts +1 -29
  373. package/dist/src/voice/tts/types.js +19 -17
  374. package/dist/src/voice/tts/types.js.map +1 -1
  375. package/package.json +1 -4
  376. package/dist/gateway/static/root/assets/index-ew_2L2We.css +0 -1
  377. package/dist/gateway/static/root/assets/url-BwNL6Rgk.js +0 -3
  378. package/dist/src/agent/tools/browser-legacy-tools.d.ts +0 -17
  379. package/dist/src/agent/tools/browser-legacy-tools.js +0 -766
  380. package/dist/src/agent/tools/browser-legacy-tools.js.map +0 -1
@@ -0,0 +1,92 @@
1
+ import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
+ import { init_string_coerce, normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString } from "../utils/string-coerce.js";
3
+ //#region src/routing/session-key-utils.ts
4
+ /** Parse `agent:{agentId}:{rest}` session keys (OpenClaw canonical form). */
5
+ function parseAgentSessionKey(sessionKey) {
6
+ const raw = normalizeOptionalLowercaseString(sessionKey);
7
+ if (!raw) return null;
8
+ const parts = raw.split(":").filter(Boolean);
9
+ if (parts.length < 3) return null;
10
+ if (parts[0] !== "agent") return null;
11
+ const agentId = normalizeOptionalString(parts[1]);
12
+ const rest = parts.slice(2).join(":");
13
+ if (!agentId || !rest) return null;
14
+ return {
15
+ agentId: agentId.toLowerCase(),
16
+ rest
17
+ };
18
+ }
19
+ function isCronRunSessionKey(sessionKey) {
20
+ const parsed = parseAgentSessionKey(sessionKey);
21
+ if (!parsed) return false;
22
+ return /^cron:[^:]+:run:[^:]+$/.test(parsed.rest);
23
+ }
24
+ function isCronSessionKey(sessionKey) {
25
+ const parsed = parseAgentSessionKey(sessionKey);
26
+ if (!parsed) return false;
27
+ return normalizeOptionalLowercaseString(parsed.rest)?.startsWith("cron:") === true;
28
+ }
29
+ function isSubagentSessionKey(sessionKey) {
30
+ const raw = normalizeOptionalString(sessionKey);
31
+ if (!raw) return false;
32
+ if (normalizeOptionalLowercaseString(raw)?.startsWith("subagent:")) return true;
33
+ return normalizeOptionalLowercaseString(parseAgentSessionKey(raw)?.rest)?.startsWith("subagent:") === true;
34
+ }
35
+ function getSubagentDepth(sessionKey) {
36
+ const raw = normalizeOptionalLowercaseString(sessionKey);
37
+ if (!raw) return 0;
38
+ return raw.split(":subagent:").length - 1;
39
+ }
40
+ function isAcpSessionKey(sessionKey) {
41
+ const raw = normalizeOptionalString(sessionKey);
42
+ if (!raw) return false;
43
+ if (normalizeLowercaseStringOrEmpty(raw).startsWith("acp:")) return true;
44
+ return normalizeOptionalLowercaseString(parseAgentSessionKey(raw)?.rest)?.startsWith("acp:") === true;
45
+ }
46
+ function parseThreadSessionSuffix(sessionKey) {
47
+ const raw = normalizeOptionalString(sessionKey);
48
+ if (!raw) return {
49
+ baseSessionKey: void 0,
50
+ threadId: void 0
51
+ };
52
+ const threadIndex = normalizeLowercaseStringOrEmpty(raw).lastIndexOf(":thread:");
53
+ return {
54
+ baseSessionKey: threadIndex === -1 ? raw : raw.slice(0, threadIndex),
55
+ threadId: normalizeOptionalString(threadIndex === -1 ? void 0 : raw.slice(threadIndex + 8))
56
+ };
57
+ }
58
+ function parseRawSessionConversationRef(sessionKey) {
59
+ const raw = normalizeOptionalString(sessionKey);
60
+ if (!raw) return null;
61
+ const rawParts = raw.split(":").filter(Boolean);
62
+ const bodyStartIndex = rawParts.length >= 3 && normalizeOptionalLowercaseString(rawParts[0]) === "agent" ? 2 : 0;
63
+ const parts = rawParts.slice(bodyStartIndex);
64
+ if (parts.length < 3) return null;
65
+ const channel = normalizeOptionalLowercaseString(parts[0]);
66
+ const kind = normalizeOptionalLowercaseString(parts[1]);
67
+ if (!channel || kind !== "group" && kind !== "channel") return null;
68
+ const rawId = normalizeOptionalString(parts.slice(2).join(":"));
69
+ const prefix = normalizeOptionalString(rawParts.slice(0, bodyStartIndex + 2).join(":"));
70
+ if (!rawId || !prefix) return null;
71
+ return {
72
+ channel,
73
+ kind,
74
+ rawId,
75
+ prefix
76
+ };
77
+ }
78
+ function resolveThreadParentSessionKey(sessionKey) {
79
+ const { baseSessionKey, threadId } = parseThreadSessionSuffix(sessionKey);
80
+ if (!threadId) return null;
81
+ const parent = normalizeOptionalString(baseSessionKey);
82
+ if (!parent) return null;
83
+ return parent;
84
+ }
85
+ var init_session_key_utils = __esmMin((() => {
86
+ init_string_coerce();
87
+ }));
88
+ //#endregion
89
+ init_session_key_utils();
90
+ export { getSubagentDepth, init_session_key_utils, isAcpSessionKey, isCronRunSessionKey, isCronSessionKey, isSubagentSessionKey, parseAgentSessionKey, parseRawSessionConversationRef, parseThreadSessionSuffix, resolveThreadParentSessionKey };
91
+
92
+ //# sourceMappingURL=session-key-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-key-utils.js","names":[],"sources":["../../../src/routing/session-key-utils.ts"],"sourcesContent":["import {\n normalizeLowercaseStringOrEmpty,\n normalizeOptionalLowercaseString,\n normalizeOptionalString,\n} from '../utils/string-coerce.js';\n\nexport type ParsedAgentSessionKey = {\n agentId: string;\n rest: string;\n};\n\nexport type ParsedThreadSessionSuffix = {\n baseSessionKey: string | undefined;\n threadId: string | undefined;\n};\n\nexport type RawSessionConversationRef = {\n channel: string;\n kind: 'group' | 'channel';\n rawId: string;\n prefix: string;\n};\n\n/** Parse `agent:{agentId}:{rest}` session keys (OpenClaw canonical form). */\nexport function parseAgentSessionKey(\n sessionKey: string | undefined | null,\n): ParsedAgentSessionKey | null {\n const raw = normalizeOptionalLowercaseString(sessionKey);\n if (!raw) {\n return null;\n }\n const parts = raw.split(':').filter(Boolean);\n if (parts.length < 3) {\n return null;\n }\n if (parts[0] !== 'agent') {\n return null;\n }\n const agentId = normalizeOptionalString(parts[1]);\n const rest = parts.slice(2).join(':');\n if (!agentId || !rest) {\n return null;\n }\n return { agentId: agentId.toLowerCase(), rest };\n}\n\nexport function isCronRunSessionKey(sessionKey: string | undefined | null): boolean {\n const parsed = parseAgentSessionKey(sessionKey);\n if (!parsed) {\n return false;\n }\n return /^cron:[^:]+:run:[^:]+$/.test(parsed.rest);\n}\n\nexport function isCronSessionKey(sessionKey: string | undefined | null): boolean {\n const parsed = parseAgentSessionKey(sessionKey);\n if (!parsed) {\n return false;\n }\n return normalizeOptionalLowercaseString(parsed.rest)?.startsWith('cron:') === true;\n}\n\nexport function isSubagentSessionKey(sessionKey: string | undefined | null): boolean {\n const raw = normalizeOptionalString(sessionKey);\n if (!raw) {\n return false;\n }\n if (normalizeOptionalLowercaseString(raw)?.startsWith('subagent:')) {\n return true;\n }\n const parsed = parseAgentSessionKey(raw);\n return normalizeOptionalLowercaseString(parsed?.rest)?.startsWith('subagent:') === true;\n}\n\nexport function getSubagentDepth(sessionKey: string | undefined | null): number {\n const raw = normalizeOptionalLowercaseString(sessionKey);\n if (!raw) {\n return 0;\n }\n return raw.split(':subagent:').length - 1;\n}\n\nexport function isAcpSessionKey(sessionKey: string | undefined | null): boolean {\n const raw = normalizeOptionalString(sessionKey);\n if (!raw) {\n return false;\n }\n const normalized = normalizeLowercaseStringOrEmpty(raw);\n if (normalized.startsWith('acp:')) {\n return true;\n }\n const parsed = parseAgentSessionKey(raw);\n return normalizeOptionalLowercaseString(parsed?.rest)?.startsWith('acp:') === true;\n}\n\nexport function parseThreadSessionSuffix(\n sessionKey: string | undefined | null,\n): ParsedThreadSessionSuffix {\n const raw = normalizeOptionalString(sessionKey);\n if (!raw) {\n return { baseSessionKey: undefined, threadId: undefined };\n }\n\n const lowerRaw = normalizeLowercaseStringOrEmpty(raw);\n const threadMarker = ':thread:';\n const threadIndex = lowerRaw.lastIndexOf(threadMarker);\n const baseSessionKey = threadIndex === -1 ? raw : raw.slice(0, threadIndex);\n const threadIdRaw = threadIndex === -1 ? undefined : raw.slice(threadIndex + threadMarker.length);\n const threadId = normalizeOptionalString(threadIdRaw);\n\n return { baseSessionKey, threadId };\n}\n\nexport function parseRawSessionConversationRef(\n sessionKey: string | undefined | null,\n): RawSessionConversationRef | null {\n const raw = normalizeOptionalString(sessionKey);\n if (!raw) {\n return null;\n }\n\n const rawParts = raw.split(':').filter(Boolean);\n const bodyStartIndex =\n rawParts.length >= 3 && normalizeOptionalLowercaseString(rawParts[0]) === 'agent' ? 2 : 0;\n const parts = rawParts.slice(bodyStartIndex);\n if (parts.length < 3) {\n return null;\n }\n\n const channel = normalizeOptionalLowercaseString(parts[0]);\n const kind = normalizeOptionalLowercaseString(parts[1]);\n if (!channel || (kind !== 'group' && kind !== 'channel')) {\n return null;\n }\n\n const rawId = normalizeOptionalString(parts.slice(2).join(':'));\n const prefix = normalizeOptionalString(rawParts.slice(0, bodyStartIndex + 2).join(':'));\n if (!rawId || !prefix) {\n return null;\n }\n\n return { channel, kind, rawId, prefix };\n}\n\nexport function resolveThreadParentSessionKey(\n sessionKey: string | undefined | null,\n): string | null {\n const { baseSessionKey, threadId } = parseThreadSessionSuffix(sessionKey);\n if (!threadId) {\n return null;\n }\n const parent = normalizeOptionalString(baseSessionKey);\n if (!parent) {\n return null;\n }\n return parent;\n}\n"],"mappings":"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"}
@@ -1,74 +1,44 @@
1
1
  /**
2
- * Session key construction and parsing.
2
+ * Session key parsing helpers for `agent:{agentId}:{rest}` keys.
3
3
  *
4
- * Format: {agentId}:{source}:{accountId}:{peerKind}:{peerId}[:thread:{threadId}][:scope:{scopeId}]
5
- *
6
- * Examples:
7
- * - main:telegram:acc_default:dm:123456
8
- * - main:discord:acc_work:channel:987654:thread:789
9
- * - subagent:main:abc123:telegram:acc_default:dm:123456
10
- */
11
- /**
12
- * Sanitize a segment to allowed chars a-z0-9_-
4
+ * Re-exports the OpenClaw-aligned builder/parser surface from agent-session-key.ts.
13
5
  */
6
+ import { defaultMainSessionKey } from './agent-session-key.js';
7
+ export * from './agent-session-key.js';
8
+ export * from './session-key-utils.js';
14
9
  export declare function sanitizeSegment(value: string | undefined | null, options?: {
15
10
  allowLeadingDash?: boolean;
16
11
  }): string;
17
- /**
18
- * Whether the segment matches the allowed pattern and length.
19
- */
20
12
  export declare function isValidSegment(value: string | undefined | null): boolean;
21
- /**
22
- * Fields used to build a session key.
23
- */
24
- export interface BuildSessionKeyParams {
13
+ /** Structured view of an agent session key rest segment. */
14
+ export interface ParsedSessionKey {
25
15
  agentId: string;
26
16
  source: string;
27
17
  accountId: string;
28
18
  peerKind: string;
29
19
  peerId: string;
30
- threadId?: string | null;
31
- scopeId?: string | null;
20
+ threadId?: string;
21
+ scopeId?: string;
32
22
  }
33
- export declare function buildSessionKey(params: BuildSessionKeyParams): string;
34
- /**
35
- * Parsed session key components.
36
- */
37
- export interface ParsedSessionKey {
23
+ export interface BuildSessionKeyParams {
38
24
  agentId: string;
39
25
  source: string;
40
26
  accountId: string;
41
27
  peerKind: string;
42
28
  peerId: string;
43
- threadId?: string;
44
- scopeId?: string;
29
+ threadId?: string | null;
30
+ scopeId?: string | null;
31
+ mainKey?: string;
32
+ dmScope?: 'main' | 'per-peer' | 'per-channel-peer' | 'per-account-channel-peer';
33
+ identityLinks?: Record<string, string[]>;
45
34
  }
35
+ /** Build an OpenClaw-style agent session key from routing segments. */
36
+ export declare function buildSessionKey(params: BuildSessionKeyParams): string;
37
+ /** Parse `agent:{agentId}:{rest}` into routing segments. Returns null for invalid keys. */
46
38
  export declare function parseSessionKey(sessionKey: string | undefined | null): ParsedSessionKey | null;
47
- /**
48
- * Whether the key refers to a subagent session.
49
- */
50
- export declare function isSubagentSessionKey(sessionKey: string | undefined | null): boolean;
51
- /**
52
- * Whether the key is a cron-driven session.
53
- */
54
- export declare function isCronSessionKey(sessionKey: string | undefined | null): boolean;
55
- /**
56
- * Nesting depth from repeated `subagent` prefixes in the colon-separated key.
57
- * e.g. `subagent:...` => 1, `subagent:subagent:...` => 2
58
- */
59
- export declare function getSubagentDepth(sessionKey: string | undefined | null): number;
60
- /**
61
- * Parameters for building a subagent session key.
62
- */
63
39
  export interface BuildSubagentSessionKeyParams extends BuildSessionKeyParams {
64
40
  parentSessionKey: string;
65
41
  }
66
42
  export declare function buildSubagentSessionKey(params: BuildSubagentSessionKeyParams): string;
67
- /**
68
- * Parent session key without a :thread: suffix, if any.
69
- */
70
43
  export declare function getParentSessionKey(sessionKey: string | undefined | null): string | null;
71
- /**
72
- * Normalize a session key (trim + lowercase).
73
- */
74
- export declare function normalizeSessionKey(sessionKey: string | undefined | null): string;
44
+ export { defaultMainSessionKey };
@@ -1,8 +1,8 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
+ import { DEFAULT_ACCOUNT_ID, normalizeAccountId, normalizeOptionalAccountId } from "./account-id.js";
3
+ import { getSubagentDepth, init_session_key_utils, isAcpSessionKey, isCronRunSessionKey, isCronSessionKey, isSubagentSessionKey, parseAgentSessionKey, parseRawSessionConversationRef, parseThreadSessionSuffix, resolveThreadParentSessionKey } from "./session-key-utils.js";
4
+ import { DEFAULT_AGENT_ID, DEFAULT_MAIN_KEY, assertAgentSessionKey, buildAgentMainSessionKey, buildAgentPeerSessionKey, buildGroupHistoryKey, classifySessionKeyShape, defaultMainSessionKey, init_agent_session_key, isValidAgentId, normalizeAgentId, normalizeMainKey, normalizeSessionKey, resolveAgentIdFromSessionKey, resolveThreadSessionKeys, sanitizeAgentId, scopedHeartbeatWakeOptions, toAgentRequestSessionKey, toAgentStoreSessionKey } from "./agent-session-key.js";
2
5
  //#region src/routing/session-key.ts
3
- /**
4
- * Sanitize a segment to allowed chars a-z0-9_-
5
- */
6
6
  function sanitizeSegment(value, options) {
7
7
  const trimmed = (value ?? "").trim();
8
8
  if (!trimmed) return "";
@@ -12,148 +12,175 @@ function sanitizeSegment(value, options) {
12
12
  if (!cleaned) return "";
13
13
  return cleaned.slice(0, 64);
14
14
  }
15
- /**
16
- * Whether the segment matches the allowed pattern and length.
17
- */
18
15
  function isValidSegment(value) {
19
16
  const trimmed = (value ?? "").trim();
20
- if (!trimmed) return false;
21
- if (trimmed.length > 64) return false;
17
+ if (!trimmed || trimmed.length > 64) return false;
22
18
  return VALID_SEGMENT_RE.test(trimmed);
23
19
  }
20
+ /** Build an OpenClaw-style agent session key from routing segments. */
24
21
  function buildSessionKey(params) {
25
- const segments = [
26
- sanitizeSegment(params.agentId) || "main",
27
- sanitizeSegment(params.source) || "unknown",
28
- sanitizeSegment(params.accountId) || "default",
29
- sanitizeSegment(params.peerKind) || "unknown",
30
- sanitizeSegment(params.peerId, { allowLeadingDash: true }) || "unknown"
31
- ];
32
- if (params.threadId) segments.push("thread", sanitizeSegment(params.threadId, { allowLeadingDash: true }) || "unknown");
33
- if (params.scopeId) segments.push("scope", sanitizeSegment(params.scopeId, { allowLeadingDash: true }) || "default");
34
- return segments.join(":");
22
+ const peerKind = params.peerKind === "dm" ? "direct" : params.peerKind;
23
+ let key = buildAgentPeerSessionKey({
24
+ agentId: params.agentId,
25
+ mainKey: params.mainKey,
26
+ channel: params.source,
27
+ accountId: params.accountId,
28
+ peerKind,
29
+ peerId: params.peerId,
30
+ identityLinks: params.identityLinks,
31
+ dmScope: params.dmScope ?? (peerKind === "direct" ? "per-account-channel-peer" : void 0)
32
+ });
33
+ if (params.threadId) key = resolveThreadSessionKeys({
34
+ baseSessionKey: key,
35
+ threadId: params.threadId
36
+ }).sessionKey;
37
+ if (params.scopeId) key = `${key}:scope:${sanitizeSegment(params.scopeId, { allowLeadingDash: true }) || "default"}`;
38
+ return key;
35
39
  }
40
+ /** Parse `agent:{agentId}:{rest}` into routing segments. Returns null for invalid keys. */
36
41
  function parseSessionKey(sessionKey) {
37
42
  const raw = (sessionKey ?? "").trim();
38
43
  if (!raw) return null;
39
- const parts = raw.split(":").filter(Boolean);
40
- /**
41
- * Alternate encoding used in some installs / tests: `gateway:{agentId}:{source}:{accountId}:{peerKind}:{peerId}…`
42
- * (distinct from normal `{agentId}:{source}:…` where the first segment is the agent id.)
43
- */
44
- if (parts.length >= 6 && parts[0]?.toLowerCase() === "gateway") {
45
- const agentId = parts[1] ?? "";
46
- const source = parts[2] ?? "";
47
- const accountId = parts[3] ?? "";
48
- const peerKind = parts[4] ?? "";
49
- const peerId = parts[5] ?? "";
50
- const rest = parts.slice(6);
51
- const result = {
52
- agentId: agentId.toLowerCase(),
53
- source: source.toLowerCase(),
54
- accountId: accountId.toLowerCase(),
55
- peerKind: peerKind.toLowerCase(),
56
- peerId: peerId.toLowerCase()
44
+ const { baseSessionKey, threadId } = parseThreadSuffix(raw);
45
+ const agentParsed = parseAgentSessionKey(baseSessionKey);
46
+ if (!agentParsed) return null;
47
+ const scopeParts = parseScopeSuffix(agentParsed.rest);
48
+ const rest = scopeParts.rest;
49
+ const scopeId = scopeParts.scopeId;
50
+ const mainKey = normalizeMainKey(void 0);
51
+ if (rest === mainKey) return {
52
+ agentId: agentParsed.agentId,
53
+ source: "cli",
54
+ accountId: "default",
55
+ peerKind: "direct",
56
+ peerId: mainKey,
57
+ threadId,
58
+ scopeId
59
+ };
60
+ if (rest.startsWith("subagent:")) return parseSubagentRest(agentParsed.agentId, rest, threadId, scopeId);
61
+ if (rest.startsWith("cron:")) {
62
+ const parts = rest.split(":");
63
+ return {
64
+ agentId: agentParsed.agentId,
65
+ source: "cron",
66
+ accountId: "default",
67
+ peerKind: "direct",
68
+ peerId: parts.slice(1).join(":") || "cron",
69
+ threadId,
70
+ scopeId
57
71
  };
58
- let i = 0;
59
- while (i < rest.length) {
60
- const marker = rest[i]?.toLowerCase();
61
- const value = rest[i + 1];
62
- if (marker === "thread" && value) {
63
- result.threadId = value.toLowerCase();
64
- i += 2;
65
- } else if (marker === "scope" && value) {
66
- result.scopeId = value.toLowerCase();
67
- i += 2;
68
- } else i++;
69
- }
70
- return result;
71
72
  }
72
- if (parts.length < 5) return null;
73
- const [agentId, source, accountId, peerKind, peerId, ...rest] = parts;
74
- if (!agentId || !source || !accountId || !peerKind || !peerId) return null;
75
- const result = {
76
- agentId: agentId.toLowerCase(),
77
- source: source.toLowerCase(),
78
- accountId: accountId.toLowerCase(),
79
- peerKind: peerKind.toLowerCase(),
80
- peerId: peerId.toLowerCase()
73
+ const parts = rest.split(":").filter(Boolean);
74
+ if (parts.length >= 4 && parts[2] === "direct") return {
75
+ agentId: agentParsed.agentId,
76
+ source: parts[0],
77
+ accountId: parts[1],
78
+ peerKind: "direct",
79
+ peerId: parts.slice(3).join(":"),
80
+ threadId,
81
+ scopeId
82
+ };
83
+ if (parts.length >= 3 && parts[1] === "direct") return {
84
+ agentId: agentParsed.agentId,
85
+ source: parts[0],
86
+ accountId: "default",
87
+ peerKind: "direct",
88
+ peerId: parts.slice(2).join(":"),
89
+ threadId,
90
+ scopeId
91
+ };
92
+ if (parts.length >= 2 && parts[0] === "direct") return {
93
+ agentId: agentParsed.agentId,
94
+ source: "cli",
95
+ accountId: "default",
96
+ peerKind: "direct",
97
+ peerId: parts.slice(1).join(":"),
98
+ threadId,
99
+ scopeId
100
+ };
101
+ if (parts.length >= 3 && (parts[1] === "group" || parts[1] === "channel")) return {
102
+ agentId: agentParsed.agentId,
103
+ source: parts[0],
104
+ accountId: "default",
105
+ peerKind: parts[1],
106
+ peerId: parts.slice(2).join(":"),
107
+ threadId,
108
+ scopeId
109
+ };
110
+ return {
111
+ agentId: agentParsed.agentId,
112
+ source: "cli",
113
+ accountId: "default",
114
+ peerKind: "direct",
115
+ peerId: rest,
116
+ threadId,
117
+ scopeId
81
118
  };
82
- let i = 0;
83
- while (i < rest.length) {
84
- const marker = rest[i]?.toLowerCase();
85
- const value = rest[i + 1];
86
- if (marker === "thread" && value) {
87
- result.threadId = value.toLowerCase();
88
- i += 2;
89
- } else if (marker === "scope" && value) {
90
- result.scopeId = value.toLowerCase();
91
- i += 2;
92
- } else i++;
93
- }
94
- return result;
95
119
  }
96
- /**
97
- * Whether the key refers to a subagent session.
98
- */
99
- function isSubagentSessionKey(sessionKey) {
100
- return parseSessionKey(sessionKey)?.agentId === "subagent";
120
+ function parseThreadSuffix(raw) {
121
+ const idx = raw.toLowerCase().lastIndexOf(":thread:");
122
+ if (idx === -1) return { baseSessionKey: raw };
123
+ return {
124
+ baseSessionKey: raw.slice(0, idx),
125
+ threadId: raw.slice(idx + 8)
126
+ };
101
127
  }
102
- /**
103
- * Whether the key is a cron-driven session.
104
- */
105
- function isCronSessionKey(sessionKey) {
106
- return parseSessionKey(sessionKey)?.source === "cron";
128
+ function parseScopeSuffix(rest) {
129
+ const idx = rest.toLowerCase().lastIndexOf(":scope:");
130
+ if (idx === -1) return { rest };
131
+ return {
132
+ rest: rest.slice(0, idx),
133
+ scopeId: rest.slice(idx + 7)
134
+ };
107
135
  }
108
- /**
109
- * Nesting depth from repeated `subagent` prefixes in the colon-separated key.
110
- * e.g. `subagent:...` => 1, `subagent:subagent:...` => 2
111
- */
112
- function getSubagentDepth(sessionKey) {
113
- const raw = (sessionKey ?? "").trim();
114
- if (!raw) return 0;
115
- const parts = raw.split(":");
116
- let depth = 0;
117
- for (const part of parts) if (part.toLowerCase() === "subagent") depth++;
118
- else break;
119
- return depth;
136
+ function parseSubagentRest(parentAgentId, rest, threadId, scopeId) {
137
+ const body = rest.replace(/^subagent:/, "");
138
+ const parentKey = body ? `agent:${parentAgentId}:${body}` : "";
139
+ const parentParsed = parentKey ? parseSessionKey(parentKey) : null;
140
+ if (parentParsed) return {
141
+ ...parentParsed,
142
+ agentId: "subagent",
143
+ threadId: threadId ?? parentParsed.threadId,
144
+ scopeId: scopeId ?? parentParsed.scopeId
145
+ };
146
+ return {
147
+ agentId: "subagent",
148
+ source: parentAgentId,
149
+ accountId: "default",
150
+ peerKind: "direct",
151
+ peerId: body || "unknown",
152
+ threadId,
153
+ scopeId
154
+ };
120
155
  }
121
156
  function buildSubagentSessionKey(params) {
122
- const parentParsed = parseSessionKey(params.parentSessionKey);
157
+ const parentParsed = parseAgentSessionKey(params.parentSessionKey);
123
158
  if (!parentParsed) throw new Error(`Invalid parent session key: ${params.parentSessionKey}`);
124
- return buildSessionKey({
125
- agentId: "subagent",
126
- source: parentParsed.agentId,
127
- accountId: parentParsed.accountId,
128
- peerKind: parentParsed.peerKind,
129
- peerId: parentParsed.peerId,
130
- threadId: params.threadId,
131
- scopeId: params.scopeId
132
- });
159
+ const parentRest = parentParsed.rest;
160
+ let key = `agent:${normalizeAgentId(parentParsed.agentId)}:subagent:${parentRest}`;
161
+ if (params.threadId) key = resolveThreadSessionKeys({
162
+ baseSessionKey: key,
163
+ threadId: params.threadId
164
+ }).sessionKey;
165
+ return key;
133
166
  }
134
- /**
135
- * Parent session key without a :thread: suffix, if any.
136
- */
137
167
  function getParentSessionKey(sessionKey) {
138
168
  const parsed = parseSessionKey(sessionKey);
139
- if (!parsed) return null;
140
- if (!parsed.threadId) return null;
169
+ if (!parsed?.threadId) return null;
141
170
  return buildSessionKey({
142
171
  agentId: parsed.agentId,
143
172
  source: parsed.source,
144
173
  accountId: parsed.accountId,
145
174
  peerKind: parsed.peerKind,
146
- peerId: parsed.peerId
175
+ peerId: parsed.peerId,
176
+ scopeId: parsed.scopeId
147
177
  });
148
178
  }
149
- /**
150
- * Normalize a session key (trim + lowercase).
151
- */
152
- function normalizeSessionKey(sessionKey) {
153
- return (sessionKey ?? "").trim().toLowerCase();
154
- }
155
179
  var VALID_SEGMENT_RE, INVALID_CHARS_RE, LEADING_DASH_RE, TRAILING_DASH_RE;
156
180
  var init_session_key = __esmMin((() => {
181
+ init_agent_session_key();
182
+ init_agent_session_key();
183
+ init_session_key_utils();
157
184
  VALID_SEGMENT_RE = /^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?$/i;
158
185
  INVALID_CHARS_RE = /[^a-z0-9_-]+/g;
159
186
  LEADING_DASH_RE = /^-+/;
@@ -161,6 +188,6 @@ var init_session_key = __esmMin((() => {
161
188
  }));
162
189
  //#endregion
163
190
  init_session_key();
164
- export { buildSessionKey, buildSubagentSessionKey, getParentSessionKey, getSubagentDepth, init_session_key, isCronSessionKey, isSubagentSessionKey, isValidSegment, normalizeSessionKey, parseSessionKey, sanitizeSegment };
191
+ export { DEFAULT_ACCOUNT_ID, DEFAULT_AGENT_ID, DEFAULT_MAIN_KEY, assertAgentSessionKey, buildAgentMainSessionKey, buildAgentPeerSessionKey, buildGroupHistoryKey, buildSessionKey, buildSubagentSessionKey, classifySessionKeyShape, defaultMainSessionKey, getParentSessionKey, getSubagentDepth, init_session_key, isAcpSessionKey, isCronRunSessionKey, isCronSessionKey, isSubagentSessionKey, isValidAgentId, isValidSegment, normalizeAccountId, normalizeAgentId, normalizeMainKey, normalizeOptionalAccountId, normalizeSessionKey, parseAgentSessionKey, parseRawSessionConversationRef, parseSessionKey, parseThreadSessionSuffix, resolveAgentIdFromSessionKey, resolveThreadParentSessionKey, resolveThreadSessionKeys, sanitizeAgentId, sanitizeSegment, scopedHeartbeatWakeOptions, toAgentRequestSessionKey, toAgentStoreSessionKey };
165
192
 
166
193
  //# 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 */\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 /**\n * Alternate encoding used in some installs / tests: `gateway:{agentId}:{source}:{accountId}:{peerKind}:{peerId}…`\n * (distinct from normal `{agentId}:{source}:…` where the first segment is the agent id.)\n */\n if (parts.length >= 6 && parts[0]?.toLowerCase() === 'gateway') {\n const agentId = parts[1] ?? '';\n const source = parts[2] ?? '';\n const accountId = parts[3] ?? '';\n const peerKind = parts[4] ?? '';\n const peerId = parts[5] ?? '';\n const rest = parts.slice(6);\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 let i = 0;\n while (i < rest.length) {\n const marker = rest[i]?.toLowerCase();\n const value = rest[i + 1];\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 return result;\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 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 parsing helpers for `agent:{agentId}:{rest}` keys.\n *\n * Re-exports the OpenClaw-aligned builder/parser surface from agent-session-key.ts.\n */\n\nimport {\n buildAgentPeerSessionKey,\n defaultMainSessionKey,\n normalizeAgentId,\n normalizeMainKey,\n parseAgentSessionKey,\n resolveThreadSessionKeys,\n type PeerKind,\n} from './agent-session-key.js';\n\nexport * from './agent-session-key.js';\nexport * from './session-key-utils.js';\n\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\nexport function sanitizeSegment(\n value: string | undefined | null,\n options?: { allowLeadingDash?: boolean },\n): string {\n const trimmed = (value ?? '').trim();\n if (!trimmed) {\n return '';\n }\n\n let cleaned = trimmed.toLowerCase().replace(INVALID_CHARS_RE, '-');\n\n if (!options?.allowLeadingDash) {\n cleaned = cleaned.replace(LEADING_DASH_RE, '').replace(TRAILING_DASH_RE, '');\n } else {\n cleaned = cleaned.replace(TRAILING_DASH_RE, '');\n }\n\n if (!cleaned) {\n return '';\n }\n\n return cleaned.slice(0, 64);\n}\n\nexport function isValidSegment(value: string | undefined | null): boolean {\n const trimmed = (value ?? '').trim();\n if (!trimmed || trimmed.length > 64) {\n return false;\n }\n return VALID_SEGMENT_RE.test(trimmed);\n}\n\n/** Structured view of an agent session key rest segment. */\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 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 mainKey?: string;\n dmScope?: 'main' | 'per-peer' | 'per-channel-peer' | 'per-account-channel-peer';\n identityLinks?: Record<string, string[]>;\n}\n\n/** Build an OpenClaw-style agent session key from routing segments. */\nexport function buildSessionKey(params: BuildSessionKeyParams): string {\n const peerKind = (params.peerKind === 'dm' ? 'direct' : params.peerKind) as PeerKind;\n let key = buildAgentPeerSessionKey({\n agentId: params.agentId,\n mainKey: params.mainKey,\n channel: params.source,\n accountId: params.accountId,\n peerKind,\n peerId: params.peerId,\n identityLinks: params.identityLinks,\n dmScope:\n params.dmScope ??\n (peerKind === 'direct' ? 'per-account-channel-peer' : undefined),\n });\n\n if (params.threadId) {\n key = resolveThreadSessionKeys({ baseSessionKey: key, threadId: params.threadId }).sessionKey;\n }\n\n if (params.scopeId) {\n key = `${key}:scope:${sanitizeSegment(params.scopeId, { allowLeadingDash: true }) || 'default'}`;\n }\n\n return key;\n}\n\n/** Parse `agent:{agentId}:{rest}` into routing segments. Returns null for invalid keys. */\nexport function parseSessionKey(sessionKey: string | undefined | null): ParsedSessionKey | null {\n const raw = (sessionKey ?? '').trim();\n if (!raw) {\n return null;\n }\n\n const { baseSessionKey, threadId } = parseThreadSuffix(raw);\n const agentParsed = parseAgentSessionKey(baseSessionKey);\n if (!agentParsed) {\n return null;\n }\n\n const scopeParts = parseScopeSuffix(agentParsed.rest);\n const rest = scopeParts.rest;\n const scopeId = scopeParts.scopeId;\n\n const mainKey = normalizeMainKey(undefined);\n if (rest === mainKey) {\n return {\n agentId: agentParsed.agentId,\n source: 'cli',\n accountId: 'default',\n peerKind: 'direct',\n peerId: mainKey,\n threadId,\n scopeId,\n };\n }\n\n if (rest.startsWith('subagent:')) {\n return parseSubagentRest(agentParsed.agentId, rest, threadId, scopeId);\n }\n\n if (rest.startsWith('cron:')) {\n const parts = rest.split(':');\n return {\n agentId: agentParsed.agentId,\n source: 'cron',\n accountId: 'default',\n peerKind: 'direct',\n peerId: parts.slice(1).join(':') || 'cron',\n threadId,\n scopeId,\n };\n }\n\n const parts = rest.split(':').filter(Boolean);\n\n // channel:account:direct:peer\n if (parts.length >= 4 && parts[2] === 'direct') {\n return {\n agentId: agentParsed.agentId,\n source: parts[0]!,\n accountId: parts[1]!,\n peerKind: 'direct',\n peerId: parts.slice(3).join(':'),\n threadId,\n scopeId,\n };\n }\n\n // channel:direct:peer\n if (parts.length >= 3 && parts[1] === 'direct') {\n return {\n agentId: agentParsed.agentId,\n source: parts[0]!,\n accountId: 'default',\n peerKind: 'direct',\n peerId: parts.slice(2).join(':'),\n threadId,\n scopeId,\n };\n }\n\n // direct:peer\n if (parts.length >= 2 && parts[0] === 'direct') {\n return {\n agentId: agentParsed.agentId,\n source: 'cli',\n accountId: 'default',\n peerKind: 'direct',\n peerId: parts.slice(1).join(':'),\n threadId,\n scopeId,\n };\n }\n\n // channel:group|channel:peer\n if (parts.length >= 3 && (parts[1] === 'group' || parts[1] === 'channel')) {\n return {\n agentId: agentParsed.agentId,\n source: parts[0]!,\n accountId: 'default',\n peerKind: parts[1]!,\n peerId: parts.slice(2).join(':'),\n threadId,\n scopeId,\n };\n }\n\n // Custom rest (e.g. tui-uuid)\n return {\n agentId: agentParsed.agentId,\n source: 'cli',\n accountId: 'default',\n peerKind: 'direct',\n peerId: rest,\n threadId,\n scopeId,\n };\n}\n\nfunction parseThreadSuffix(raw: string): { baseSessionKey: string; threadId?: string } {\n const lower = raw.toLowerCase();\n const idx = lower.lastIndexOf(':thread:');\n if (idx === -1) {\n return { baseSessionKey: raw };\n }\n return {\n baseSessionKey: raw.slice(0, idx),\n threadId: raw.slice(idx + ':thread:'.length),\n };\n}\n\nfunction parseScopeSuffix(rest: string): { rest: string; scopeId?: string } {\n const lower = rest.toLowerCase();\n const idx = lower.lastIndexOf(':scope:');\n if (idx === -1) {\n return { rest };\n }\n return {\n rest: rest.slice(0, idx),\n scopeId: rest.slice(idx + ':scope:'.length),\n };\n}\n\nfunction parseSubagentRest(\n parentAgentId: string,\n rest: string,\n threadId?: string,\n scopeId?: string,\n): ParsedSessionKey {\n const body = rest.replace(/^subagent:/, '');\n const parentKey = body ? `agent:${parentAgentId}:${body}` : '';\n const parentParsed = parentKey ? parseSessionKey(parentKey) : null;\n if (parentParsed) {\n return {\n ...parentParsed,\n agentId: 'subagent',\n threadId: threadId ?? parentParsed.threadId,\n scopeId: scopeId ?? parentParsed.scopeId,\n };\n }\n return {\n agentId: 'subagent',\n source: parentAgentId,\n accountId: 'default',\n peerKind: 'direct',\n peerId: body || 'unknown',\n threadId,\n scopeId,\n };\n}\n\nexport interface BuildSubagentSessionKeyParams extends BuildSessionKeyParams {\n parentSessionKey: string;\n}\n\nexport function buildSubagentSessionKey(params: BuildSubagentSessionKeyParams): string {\n const parentParsed = parseAgentSessionKey(params.parentSessionKey);\n if (!parentParsed) {\n throw new Error(`Invalid parent session key: ${params.parentSessionKey}`);\n }\n const parentRest = parentParsed.rest;\n let key = `agent:${normalizeAgentId(parentParsed.agentId)}:subagent:${parentRest}`;\n if (params.threadId) {\n key = resolveThreadSessionKeys({ baseSessionKey: key, threadId: params.threadId }).sessionKey;\n }\n return key;\n}\n\nexport function getParentSessionKey(sessionKey: string | undefined | null): string | null {\n const parsed = parseSessionKey(sessionKey);\n if (!parsed?.threadId) {\n return null;\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 scopeId: parsed.scopeId,\n });\n}\n\nexport { defaultMainSessionKey };\n"],"mappings":"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"}
@@ -11,6 +11,12 @@ export { normalizeWorkingDirectoryInput, effectiveWorkspacePathForSession, } fro
11
11
  export { SessionStatus, type SessionMetadata, type SessionDetail, type SessionListQuery, type PaginatedResult, type SessionStats, type ExportFormat, type SessionExport, type SessionTranscriptSummary, type CompactionCheckpointSummary, type CompactionCheckpointDetail, } from './types.js';
12
12
  export { normalizeCompactionCheckpointId } from './compaction-checkpoints.js';
13
13
  export { shouldSkipWebchatInboundByAbortCutoff } from './abort-cutoff.js';
14
+ export { DEFAULT_RESET_AT_HOUR, DEFAULT_RESET_MODE, DEFAULT_IDLE_MINUTES, evaluateSessionFreshness, resolveDailyResetAtMs, resolveSessionResetPolicy, type SessionFreshness, type SessionResetConfig, type SessionResetMode, type SessionResetPolicy, type SessionResetType, } from './reset-policy.js';
15
+ export { isThreadSessionKey, resolveChannelResetConfig, resolveSessionResetType, } from './reset-type.js';
16
+ export { resolveSessionLifecycleTimestamps, type SessionLifecycleEntry } from './lifecycle-timestamps.js';
17
+ export { resolveSession, resolveSessionKeyForRequest, type SessionKeyResolution, type SessionResolution, } from './resolve-session.js';
18
+ export { initSessionTurn, type InitSessionTurnOptions, type InitSessionTurnResult, type SessionResetFn, } from './init-session-turn.js';
19
+ export { DEFAULT_RESET_TRIGGERS, RESET_OVERLAP_COMMANDS, bareResetAckMessage, matchResetTriggers, resolveResetTriggers, shouldSkipResetOverlapCommand, stripLeadingEnvelopeTimestamp, type ResetTriggerMatch, } from './reset-triggers.js';
14
20
  export type { CompactionConfig, CompactionResult } from '../agent/memory/compaction.js';
15
21
  export type { WindowConfig } from '../agent/memory/window.js';
16
22
  export { maybeAutoTitleSessionStore, generateSessionTitleFromMessages, sanitizeSessionTitle, fallbackTitleFromMessages, isWebchatSessionKey, shouldAutoTitleSessionKey, } from './session-title.js';
@@ -12,6 +12,12 @@ import { SessionConfigStore, resolveReasoningLevel, resolveThinkingLevel, resolv
12
12
  import { resolveEffectiveReasoningLevel, resolveEffectiveThinkingLevel } from "./thinking-resolve.js";
13
13
  import { effectiveWorkspacePathForSession, normalizeWorkingDirectoryInput } from "./session-workspace.js";
14
14
  import { shouldSkipWebchatInboundByAbortCutoff } from "./abort-cutoff.js";
15
+ import { DEFAULT_IDLE_MINUTES, DEFAULT_RESET_AT_HOUR, DEFAULT_RESET_MODE, evaluateSessionFreshness, resolveDailyResetAtMs, resolveSessionResetPolicy } from "./reset-policy.js";
16
+ import { isThreadSessionKey, resolveChannelResetConfig, resolveSessionResetType } from "./reset-type.js";
17
+ import { resolveSessionLifecycleTimestamps } from "./lifecycle-timestamps.js";
18
+ import { resolveSession, resolveSessionKeyForRequest } from "./resolve-session.js";
19
+ import { DEFAULT_RESET_TRIGGERS, RESET_OVERLAP_COMMANDS, bareResetAckMessage, matchResetTriggers, resolveResetTriggers, shouldSkipResetOverlapCommand, stripLeadingEnvelopeTimestamp } from "./reset-triggers.js";
20
+ import { initSessionTurn } from "./init-session-turn.js";
15
21
  import { flattenMessageContent, messagesToClientHistory } from "./client-history.js";
16
22
  import { CURRENT_SESSION_TRANSCRIPT_VERSION, XOPC_SESSION_TRANSCRIPT_TYPE } from "./transcript-format.js";
17
- export { CURRENT_SESSION_TRANSCRIPT_VERSION, SessionConfigStore, SessionIndex, SessionSearchIndex, SessionStatus, SessionStore, XOPC_SESSION_TRANSCRIPT_TYPE, applySessionPatchToMetadata, buildSessionContextForLlm, effectiveWorkspacePathForSession, emitSessionTranscriptUpdate, fallbackTitleFromMessages, flattenMessageContent, generateSessionTitleFromMessages, getOrLoadSessionSearchIndex, invalidateSessionSearchIndexCache, isTranscriptContextEntry, isWebchatSessionKey, maybeAutoTitleSessionStore, mergeLlmMessagesPreservingContextRows, messagesToClientHistory, normalizeCompactionCheckpointId, normalizeWorkingDirectoryInput, onSessionTranscriptUpdate, resolveEffectiveReasoningLevel, resolveEffectiveThinkingLevel, resolveReasoningLevel, resolveThinkingLevel, resolveVerboseLevel, sanitizeSessionTitle, shouldAutoTitleSessionKey, shouldSkipWebchatInboundByAbortCutoff, transcriptRowsFromJsonArray };
23
+ export { CURRENT_SESSION_TRANSCRIPT_VERSION, DEFAULT_IDLE_MINUTES, DEFAULT_RESET_AT_HOUR, DEFAULT_RESET_MODE, DEFAULT_RESET_TRIGGERS, RESET_OVERLAP_COMMANDS, SessionConfigStore, SessionIndex, SessionSearchIndex, SessionStatus, SessionStore, XOPC_SESSION_TRANSCRIPT_TYPE, applySessionPatchToMetadata, bareResetAckMessage, buildSessionContextForLlm, effectiveWorkspacePathForSession, emitSessionTranscriptUpdate, evaluateSessionFreshness, fallbackTitleFromMessages, flattenMessageContent, generateSessionTitleFromMessages, getOrLoadSessionSearchIndex, initSessionTurn, invalidateSessionSearchIndexCache, isThreadSessionKey, isTranscriptContextEntry, isWebchatSessionKey, matchResetTriggers, maybeAutoTitleSessionStore, mergeLlmMessagesPreservingContextRows, messagesToClientHistory, normalizeCompactionCheckpointId, normalizeWorkingDirectoryInput, onSessionTranscriptUpdate, resolveChannelResetConfig, resolveDailyResetAtMs, resolveEffectiveReasoningLevel, resolveEffectiveThinkingLevel, resolveReasoningLevel, resolveResetTriggers, resolveSession, resolveSessionKeyForRequest, resolveSessionLifecycleTimestamps, resolveSessionResetPolicy, resolveSessionResetType, resolveThinkingLevel, resolveVerboseLevel, sanitizeSessionTitle, shouldAutoTitleSessionKey, shouldSkipResetOverlapCommand, shouldSkipWebchatInboundByAbortCutoff, stripLeadingEnvelopeTimestamp, transcriptRowsFromJsonArray };
@@ -0,0 +1,30 @@
1
+ import { type Config } from '../config/schema.js';
2
+ export type SessionResetFn = (sessionKey: string) => Promise<{
3
+ sessionId: string;
4
+ previousSessionId: string;
5
+ } | null>;
6
+ export type InitSessionTurnResult = {
7
+ sessionKey: string;
8
+ sessionId?: string;
9
+ previousSessionId?: string;
10
+ isNewSession: boolean;
11
+ resetTriggered: boolean;
12
+ staleRollover: boolean;
13
+ bodyStripped: string;
14
+ bareReset: boolean;
15
+ ackMessage?: string;
16
+ };
17
+ export type InitSessionTurnOptions = {
18
+ cfg: Config;
19
+ sessionKey: string;
20
+ body?: string;
21
+ resetSession: SessionResetFn;
22
+ /** When true, skip idle/daily implicit rollover (provider-owned CLI sessions). */
23
+ skipImplicitExpiry?: boolean;
24
+ };
25
+ /**
26
+ * Turn-start session init: match `resetTriggers`, evaluate freshness, archive +
27
+ * assign new `sessionId` when stale or explicitly reset. OpenClaw `initSessionState`
28
+ * equivalent for xopc direct + channel paths.
29
+ */
30
+ export declare function initSessionTurn(opts: InitSessionTurnOptions): Promise<InitSessionTurnResult>;