@xopcai/xopc 0.0.86 → 0.0.88

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 (658) 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/feishu/src/outbound/media-load.js +1 -1
  5. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  6. package/dist/extensions/telegram/src/delivery-chat-id.d.ts +1 -1
  7. package/dist/extensions/telegram/src/delivery-chat-id.js +1 -1
  8. package/dist/extensions/telegram/src/delivery-chat-id.js.map +1 -1
  9. package/dist/extensions/telegram/src/plugin.js +1 -1
  10. package/dist/extensions/telegram/src/routing-integration.js +3 -2
  11. package/dist/extensions/telegram/src/routing-integration.js.map +1 -1
  12. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  13. package/dist/extensions/telegram/xopc.extension.json +1 -1
  14. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +2 -2
  15. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +1 -1
  16. package/dist/extensions/weixin/src/api/api.js +3 -3
  17. package/dist/extensions/weixin/src/api/api.js.map +1 -1
  18. package/dist/extensions/weixin/src/auth/accounts.js +12 -12
  19. package/dist/extensions/weixin/src/auth/accounts.js.map +1 -1
  20. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  21. package/dist/extensions/weixin/src/delivery-to.js +2 -2
  22. package/dist/extensions/weixin/src/delivery-to.js.map +1 -1
  23. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  24. package/dist/extensions/weixin/src/messaging/debug-mode.js +5 -5
  25. package/dist/extensions/weixin/src/messaging/debug-mode.js.map +1 -1
  26. package/dist/extensions/weixin/src/messaging/inbound.js +11 -11
  27. package/dist/extensions/weixin/src/messaging/inbound.js.map +1 -1
  28. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  29. package/dist/extensions/weixin/src/plugin.js +1 -1
  30. package/dist/extensions/weixin/src/storage/sync-buf.js +4 -4
  31. package/dist/extensions/weixin/src/storage/sync-buf.js.map +1 -1
  32. package/dist/extensions/weixin/src/workflow-progress.d.ts +1 -1
  33. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  34. package/dist/extensions/weixin/src/workflow-progress.js.map +1 -1
  35. package/dist/gateway/static/root/assets/agents-CRxETUZx.js +222 -0
  36. package/dist/gateway/static/root/assets/{apps-page-DrfytjOb.js → apps-page-wKWf3l57.js} +1 -1
  37. package/dist/gateway/static/root/assets/channels-settings-DDbqVNkx.js +1 -0
  38. package/dist/gateway/static/root/assets/{channels-status-swr-Bs5kMCMI.js → channels-status-swr-DIsl75Y3.js} +1 -1
  39. package/dist/gateway/static/root/assets/copy-SxMW6Xpc.js +1 -0
  40. package/dist/gateway/static/root/assets/{cron-api-BuVcZ5zR.js → cron-api-N9hvuRrn.js} +1 -1
  41. package/dist/gateway/static/root/assets/{cron-page-BMrloeFH.js → cron-page-tlNGNxhP.js} +1 -1
  42. package/dist/gateway/static/root/assets/{dist-CKU1OOTf.js → dist-CJwfHYvT.js} +1 -1
  43. package/dist/gateway/static/root/assets/{extension-debug-page-BdW_46sN.js → extension-debug-page-BVJohZoZ.js} +1 -1
  44. package/dist/gateway/static/root/assets/{extension-page-DW47KI82.js → extension-page-BT2tmElC.js} +1 -1
  45. package/dist/gateway/static/root/assets/extension-settings-page-BSS47c2j.js +1 -0
  46. package/dist/gateway/static/root/assets/{fetch-B2MYHbWg.js → fetch-BaFNUtkE.js} +1 -1
  47. package/dist/gateway/static/root/assets/{field-primitives-DPG-oJmx.js → field-primitives-QwYEq6Hz.js} +1 -1
  48. package/dist/gateway/static/root/assets/{heartbeat-config-api-C8dNts9i.js → heartbeat-config-api-BVSidEDJ.js} +1 -1
  49. package/dist/gateway/static/root/assets/index-CqZzHNEg.css +1 -0
  50. package/dist/gateway/static/root/assets/{index-BmVYculr.js → index-qNrVJp-y.js} +97 -95
  51. package/dist/gateway/static/root/assets/{logs-page-sTsVWz0X.js → logs-page-DDonPVLn.js} +1 -1
  52. package/dist/gateway/static/root/assets/sessions-page-DKt-Wmib.js +1 -0
  53. package/dist/gateway/static/root/assets/{settings-form-section-DuvRQW--.js → settings-form-section-B8N3A3Zo.js} +1 -1
  54. package/dist/gateway/static/root/assets/settings-page-DcJjvvw4.js +3 -0
  55. package/dist/gateway/static/root/assets/{share-preview-page-BtG2kLDh.js → share-preview-page-Q7KqkO-u.js} +1 -1
  56. package/dist/gateway/static/root/assets/skills-page-DuJ4BTO3.js +2 -0
  57. package/dist/gateway/static/root/assets/{theme-store-DryYl3qD.js → theme-store-BbRc5ugR.js} +1 -1
  58. package/dist/gateway/static/root/assets/url-D6jvVYIA.js +7 -0
  59. package/dist/gateway/static/root/assets/{utils-BY7bU1DT.js → utils-CxDGduqK.js} +1 -1
  60. package/dist/gateway/static/root/assets/voice-api-key-field-CTyHz7L_.js +1 -0
  61. package/dist/gateway/static/root/assets/workflows-page-GacJ41Fv.js +27 -0
  62. package/dist/gateway/static/root/index.html +6 -5
  63. package/dist/package.js +1 -1
  64. package/dist/src/agent/agent-manager.js +7 -7
  65. package/dist/src/agent/agent-scope.d.ts +4 -0
  66. package/dist/src/agent/agent-scope.js +53 -10
  67. package/dist/src/agent/agent-scope.js.map +1 -1
  68. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +2 -1
  69. package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +1 -1
  70. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  71. package/dist/src/agent/child-agent-factory.d.ts +15 -0
  72. package/dist/src/agent/child-agent-factory.js +35 -2
  73. package/dist/src/agent/child-agent-factory.js.map +1 -1
  74. package/dist/src/agent/client-error-format.d.ts +20 -0
  75. package/dist/src/agent/client-error-format.js +97 -0
  76. package/dist/src/agent/client-error-format.js.map +1 -0
  77. package/dist/src/agent/context/workspace-seed.js +2 -2
  78. package/dist/src/agent/embedded/run-turn.js +23 -4
  79. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  80. package/dist/src/agent/embedded/session-tool-result-guard.js +2 -1
  81. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  82. package/dist/src/agent/embedded/tool-result-truncation.js +2 -1
  83. package/dist/src/agent/embedded/tool-result-truncation.js.map +1 -1
  84. package/dist/src/agent/fallback/candidates.js +2 -2
  85. package/dist/src/agent/fallback/candidates.js.map +1 -1
  86. package/dist/src/agent/goals/goal-locale.d.ts +1 -1
  87. package/dist/src/agent/goals/goal-run-store.js +4 -4
  88. package/dist/src/agent/goals/persistent-goal-apis.d.ts +0 -2
  89. package/dist/src/agent/goals/persistent-goal-service.js +1 -2
  90. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
  91. package/dist/src/agent/goals/post-turn.js +2 -2
  92. package/dist/src/agent/image/generation/normalization.js +2 -12
  93. package/dist/src/agent/image/generation/normalization.js.map +1 -1
  94. package/dist/src/agent/image/generation/provider-registry.d.ts +4 -8
  95. package/dist/src/agent/image/generation/provider-registry.js.map +1 -1
  96. package/dist/src/agent/image/generation/runtime.d.ts +2 -2
  97. package/dist/src/agent/image/generation/runtime.js.map +1 -1
  98. package/dist/src/agent/image/generation/types.d.ts +0 -18
  99. package/dist/src/agent/image/image-helpers.js +6 -1
  100. package/dist/src/agent/image/image-helpers.js.map +1 -1
  101. package/dist/src/agent/image/index.d.ts +1 -1
  102. package/dist/src/agent/image/load-image-media.js +2 -2
  103. package/dist/src/agent/inbound/inbound-loop.d.ts +5 -0
  104. package/dist/src/agent/inbound/inbound-loop.js +41 -10
  105. package/dist/src/agent/inbound/inbound-loop.js.map +1 -1
  106. package/dist/src/agent/inbound/turn-dispatcher.d.ts +4 -0
  107. package/dist/src/agent/inbound/turn-dispatcher.js +7 -5
  108. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  109. package/dist/src/agent/ipc/bus.js +1 -1
  110. package/dist/src/agent/ipc/inbox.js +2 -2
  111. package/dist/src/agent/ipc/socket.js +1 -1
  112. package/dist/src/agent/mcp/bundle-mcp-materialize.js +2 -1
  113. package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +1 -1
  114. package/dist/src/agent/mcp/bundle-mcp-names.js +2 -1
  115. package/dist/src/agent/mcp/bundle-mcp-names.js.map +1 -1
  116. package/dist/src/agent/mcp/bundle-mcp-runtime.js +2 -1
  117. package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +1 -1
  118. package/dist/src/agent/mcp/mcp-transport-config.js +2 -1
  119. package/dist/src/agent/mcp/mcp-transport-config.js.map +1 -1
  120. package/dist/src/agent/mcp/mcp-transport.js +2 -1
  121. package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
  122. package/dist/src/agent/media-generation/runtime-shared.js +2 -9
  123. package/dist/src/agent/media-generation/runtime-shared.js.map +1 -1
  124. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  125. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  126. package/dist/src/agent/memory/dreaming/events.js +1 -1
  127. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  128. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  129. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  130. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  131. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  132. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  133. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  134. package/dist/src/agent/messaging/command-handler.d.ts +6 -0
  135. package/dist/src/agent/messaging/command-handler.js +5 -0
  136. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  137. package/dist/src/agent/models/manager.js +1 -1
  138. package/dist/src/agent/orchestration/llm-turn-retry.d.ts +2 -0
  139. package/dist/src/agent/orchestration/llm-turn-retry.js +9 -1
  140. package/dist/src/agent/orchestration/llm-turn-retry.js.map +1 -1
  141. package/dist/src/agent/prompt/safety.d.ts +0 -7
  142. package/dist/src/agent/prompt/safety.js +1 -20
  143. package/dist/src/agent/prompt/safety.js.map +1 -1
  144. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  145. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  146. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  147. package/dist/src/agent/sandbox/path-policy.js +2 -2
  148. package/dist/src/agent/service/build-direct-message-content.js +2 -2
  149. package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
  150. package/dist/src/agent/service/direct-turn-helpers.d.ts +3 -1
  151. package/dist/src/agent/service/direct-turn-helpers.js +6 -1
  152. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  153. package/dist/src/agent/service/process-direct-one-shot.d.ts +4 -0
  154. package/dist/src/agent/service/process-direct-one-shot.js +15 -2
  155. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  156. package/dist/src/agent/service/process-direct-streaming.d.ts +4 -0
  157. package/dist/src/agent/service/process-direct-streaming.js +53 -7
  158. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  159. package/dist/src/agent/service/webchat-tts.d.ts +1 -2
  160. package/dist/src/agent/service/webchat-tts.js +2 -2
  161. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  162. package/dist/src/agent/service.d.ts +8 -0
  163. package/dist/src/agent/service.js +25 -5
  164. package/dist/src/agent/service.js.map +1 -1
  165. package/dist/src/agent/session/session-inspector.js +1 -1
  166. package/dist/src/agent/skills/config.js +1 -1
  167. package/dist/src/agent/skills/hub-hash.js +2 -2
  168. package/dist/src/agent/skills/hub-lock.js +1 -1
  169. package/dist/src/agent/skills/hub-pull.js +2 -2
  170. package/dist/src/agent/skills/index.js +1 -1
  171. package/dist/src/agent/skills/managed-store.js +1 -1
  172. package/dist/src/agent/skills/scanner.js +1 -1
  173. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  174. package/dist/src/agent/skills/skill-manager.js +1 -1
  175. package/dist/src/agent/tools/create-share-tool.js +27 -20
  176. package/dist/src/agent/tools/create-share-tool.js.map +1 -1
  177. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  178. package/dist/src/agent/tools/factory.js +2 -2
  179. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  180. package/dist/src/agent/tools/index.d.ts +0 -1
  181. package/dist/src/agent/tools/index.js +4 -5
  182. package/dist/src/agent/tools/send-media.js +1 -1
  183. package/dist/src/agent/tools/shell.js +0 -13
  184. package/dist/src/agent/tools/shell.js.map +1 -1
  185. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  186. package/dist/src/agent/tools/workflow-tool.js +70 -16
  187. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  188. package/dist/src/agent/tools/write.js +1 -1
  189. package/dist/src/agent/workflow/agent-progress.d.ts +5 -0
  190. package/dist/src/agent/workflow/agent-progress.js +65 -0
  191. package/dist/src/agent/workflow/agent-progress.js.map +1 -0
  192. package/dist/src/agent/workflow/builtins/audit-repo.d.ts +1 -1
  193. package/dist/src/agent/workflow/builtins/audit-repo.js +14 -0
  194. package/dist/src/agent/workflow/builtins/audit-repo.js.map +1 -1
  195. package/dist/src/agent/workflow/builtins/debug-incident.d.ts +1 -1
  196. package/dist/src/agent/workflow/builtins/debug-incident.js +14 -0
  197. package/dist/src/agent/workflow/builtins/debug-incident.js.map +1 -1
  198. package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +12 -0
  199. package/dist/src/agent/workflow/builtins/implementation-plan.js +175 -0
  200. package/dist/src/agent/workflow/builtins/implementation-plan.js.map +1 -0
  201. package/dist/src/agent/workflow/builtins/index.d.ts +3 -1
  202. package/dist/src/agent/workflow/builtins/index.js +11 -1
  203. package/dist/src/agent/workflow/builtins/index.js.map +1 -1
  204. package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +1 -1
  205. package/dist/src/agent/workflow/builtins/multi-perspective-review.js +14 -0
  206. package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +1 -1
  207. package/dist/src/agent/workflow/builtins/pr-review.d.ts +1 -1
  208. package/dist/src/agent/workflow/builtins/pr-review.js +14 -0
  209. package/dist/src/agent/workflow/builtins/pr-review.js.map +1 -1
  210. package/dist/src/agent/workflow/builtins/release-check.d.ts +11 -0
  211. package/dist/src/agent/workflow/builtins/release-check.js +165 -0
  212. package/dist/src/agent/workflow/builtins/release-check.js.map +1 -0
  213. package/dist/src/agent/workflow/builtins/research.d.ts +1 -1
  214. package/dist/src/agent/workflow/builtins/research.js +14 -0
  215. package/dist/src/agent/workflow/builtins/research.js.map +1 -1
  216. package/dist/src/agent/workflow/catalog.js +1 -1
  217. package/dist/src/agent/workflow/channel-capability.d.ts +3 -3
  218. package/dist/src/agent/workflow/index.d.ts +2 -1
  219. package/dist/src/agent/workflow/index.js +3 -2
  220. package/dist/src/agent/workflow/lint.d.ts +38 -0
  221. package/dist/src/agent/workflow/lint.js +74 -0
  222. package/dist/src/agent/workflow/lint.js.map +1 -0
  223. package/dist/src/agent/workflow/meta-locale.d.ts +12 -0
  224. package/dist/src/agent/workflow/meta-locale.js +62 -0
  225. package/dist/src/agent/workflow/meta-locale.js.map +1 -0
  226. package/dist/src/agent/workflow/parser.js +7 -1
  227. package/dist/src/agent/workflow/parser.js.map +1 -1
  228. package/dist/src/agent/workflow/runtime.d.ts +4 -1
  229. package/dist/src/agent/workflow/runtime.js +88 -8
  230. package/dist/src/agent/workflow/runtime.js.map +1 -1
  231. package/dist/src/agent/workflow/snapshot.js +2 -12
  232. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  233. package/dist/src/agent/workflow/step-labels.d.ts +8 -0
  234. package/dist/src/agent/workflow/step-labels.js +48 -0
  235. package/dist/src/agent/workflow/step-labels.js.map +1 -0
  236. package/dist/src/agent/workflow/subagent-runner.js +46 -1
  237. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  238. package/dist/src/agent/workflow/types.d.ts +76 -1
  239. package/dist/src/auth/credentials.d.ts +5 -0
  240. package/dist/src/auth/credentials.js +12 -3
  241. package/dist/src/auth/credentials.js.map +1 -1
  242. package/dist/src/auth/profiles/store.js +1 -1
  243. package/dist/src/auth/sync-provider-auth.js +1 -1
  244. package/dist/src/browser/cache-dir-policy.js +1 -1
  245. package/dist/src/browser/cdp-local-launcher.js +2 -2
  246. package/dist/src/browser/index.js +4 -4
  247. package/dist/src/browser/manager.d.ts +1 -3
  248. package/dist/src/browser/manager.js +0 -6
  249. package/dist/src/browser/manager.js.map +1 -1
  250. package/dist/src/browser/providers/browser-ext-install.d.ts +4 -4
  251. package/dist/src/browser/providers/browser-ext-install.js +41 -88
  252. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  253. package/dist/src/browser/providers/cloakbrowser.d.ts +0 -5
  254. package/dist/src/browser/providers/cloakbrowser.js +6 -59
  255. package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
  256. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  257. package/dist/src/browser/stealth.js +1 -1
  258. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  259. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  260. package/dist/src/channels/attachments/voice-stt-webchat.js +10 -8
  261. package/dist/src/channels/attachments/voice-stt-webchat.js.map +1 -1
  262. package/dist/src/channels/outbound/persist-store.js +1 -1
  263. package/dist/src/channels/pairing/allow-from-file.js +9 -9
  264. package/dist/src/channels/pairing/allow-from-file.js.map +1 -1
  265. package/dist/src/channels/pairing/pairing-store.js +7 -7
  266. package/dist/src/channels/pairing/pairing-store.js.map +1 -1
  267. package/dist/src/chat-commands/builtins/config.js +2 -2
  268. package/dist/src/chat-commands/builtins/session.js +1 -1
  269. package/dist/src/chat-commands/builtins/session.js.map +1 -1
  270. package/dist/src/chat-commands/builtins/tts.js +2 -2
  271. package/dist/src/chat-commands/builtins/tts.js.map +1 -1
  272. package/dist/src/chat-commands/context.d.ts +3 -0
  273. package/dist/src/chat-commands/context.js +22 -4
  274. package/dist/src/chat-commands/context.js.map +1 -1
  275. package/dist/src/chat-commands/session-key.d.ts +4 -37
  276. package/dist/src/chat-commands/session-key.js +49 -85
  277. package/dist/src/chat-commands/session-key.js.map +1 -1
  278. package/dist/src/chat-commands/types.d.ts +2 -0
  279. package/dist/src/cli/commands/agent/interactive.js +2 -2
  280. package/dist/src/cli/commands/agent/interactive.js.map +1 -1
  281. package/dist/src/cli/commands/agent/sessions.js +2 -2
  282. package/dist/src/cli/commands/agent/sessions.js.map +1 -1
  283. package/dist/src/cli/commands/agent.js +4 -5
  284. package/dist/src/cli/commands/agent.js.map +1 -1
  285. package/dist/src/cli/commands/channels.js +1 -5
  286. package/dist/src/cli/commands/channels.js.map +1 -1
  287. package/dist/src/cli/commands/config.js +1 -1
  288. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  289. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  290. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  291. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  292. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  293. package/dist/src/cli/commands/extension-dev.js +1 -1
  294. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  295. package/dist/src/cli/commands/extension-pack.js +1 -1
  296. package/dist/src/cli/commands/gateway/lifecycle-core.js +1 -1
  297. package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
  298. package/dist/src/cli/commands/gateway/logs.d.ts +9 -0
  299. package/dist/src/cli/commands/gateway/logs.js +50 -17
  300. package/dist/src/cli/commands/gateway/logs.js.map +1 -1
  301. package/dist/src/cli/commands/image.js +23 -22
  302. package/dist/src/cli/commands/image.js.map +1 -1
  303. package/dist/src/cli/commands/init.js +4 -4
  304. package/dist/src/cli/commands/onboard.js +1 -1
  305. package/dist/src/cli/commands/session/utils.js +2 -2
  306. package/dist/src/cli/commands/session/utils.js.map +1 -1
  307. package/dist/src/cli/commands/update.js +26 -46
  308. package/dist/src/cli/commands/update.js.map +1 -1
  309. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  310. package/dist/src/cli/utils/session.d.ts +0 -5
  311. package/dist/src/cli/utils/session.js +1 -6
  312. package/dist/src/cli/utils/session.js.map +1 -1
  313. package/dist/src/commands/agents.config.js +1 -1
  314. package/dist/src/commands/agents.config.js.map +1 -1
  315. package/dist/src/config/agent-profile.js +6 -28
  316. package/dist/src/config/agent-profile.js.map +1 -1
  317. package/dist/src/config/agent-typed-models.d.ts +18 -0
  318. package/dist/src/config/agent-typed-models.js +53 -0
  319. package/dist/src/config/agent-typed-models.js.map +1 -0
  320. package/dist/src/config/gateway-bind.js +1 -1
  321. package/dist/src/config/index.js +6 -6
  322. package/dist/src/config/loader.js +2 -2
  323. package/dist/src/config/model-input.js +2 -5
  324. package/dist/src/config/model-input.js.map +1 -1
  325. package/dist/src/config/models-json.js +2 -2
  326. package/dist/src/config/paths-state.js +1 -1
  327. package/dist/src/config/profile.js +2 -2
  328. package/dist/src/config/schema.d.ts +253 -217
  329. package/dist/src/config/schema.js +91 -40
  330. package/dist/src/config/schema.js.map +1 -1
  331. package/dist/src/config/voice.d.ts +3 -28
  332. package/dist/src/config/voice.js +27 -261
  333. package/dist/src/config/voice.js.map +1 -1
  334. package/dist/src/config/workspace-path-helpers.d.ts +1 -2
  335. package/dist/src/config/workspace-path-helpers.js.map +1 -1
  336. package/dist/src/config/workspace-path.js +1 -1
  337. package/dist/src/cron/executor.js +2 -2
  338. package/dist/src/cron/persistence.js +1 -1
  339. package/dist/src/cron/run-log-store.js +1 -1
  340. package/dist/src/daemon/constants.js +1 -1
  341. package/dist/src/daemon/install-plan.js +27 -3
  342. package/dist/src/daemon/install-plan.js.map +1 -1
  343. package/dist/src/daemon/launchd.d.ts +8 -0
  344. package/dist/src/daemon/launchd.js +7 -14
  345. package/dist/src/daemon/launchd.js.map +1 -1
  346. package/dist/src/daemon/schtasks.d.ts +25 -0
  347. package/dist/src/daemon/schtasks.js +168 -48
  348. package/dist/src/daemon/schtasks.js.map +1 -1
  349. package/dist/src/daemon/service.js +5 -4
  350. package/dist/src/daemon/service.js.map +1 -1
  351. package/dist/src/daemon/systemd.d.ts +6 -0
  352. package/dist/src/daemon/systemd.js +20 -5
  353. package/dist/src/daemon/systemd.js.map +1 -1
  354. package/dist/src/extensions/activation-context.js +0 -1
  355. package/dist/src/extensions/activation-context.js.map +1 -1
  356. package/dist/src/extensions/bundle-mcp.js +1 -1
  357. package/dist/src/extensions/discover-extensions.js +1 -1
  358. package/dist/src/extensions/health.js +1 -1
  359. package/dist/src/extensions/loader.js +1 -1
  360. package/dist/src/extensions/lockfile.js +2 -2
  361. package/dist/src/extensions/normalize-manifest.js +0 -1
  362. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  363. package/dist/src/extensions/types/manifest.d.ts +0 -2
  364. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  365. package/dist/src/gateway/agent-builtin-tools.js +1 -0
  366. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  367. package/dist/src/gateway/agents-admin.d.ts +9 -0
  368. package/dist/src/gateway/agents-admin.js +28 -4
  369. package/dist/src/gateway/agents-admin.js.map +1 -1
  370. package/dist/src/gateway/config-tools-web.js +3 -2
  371. package/dist/src/gateway/config-tools-web.js.map +1 -1
  372. package/dist/src/gateway/file-path-classifier.js +2 -2
  373. package/dist/src/gateway/heartbeat/service.js +2 -2
  374. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  375. package/dist/src/gateway/hono/app.js +1 -1
  376. package/dist/src/gateway/hono/lib/agent-model.d.ts +25 -10
  377. package/dist/src/gateway/hono/lib/agent-model.js +60 -36
  378. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  379. package/dist/src/gateway/hono/lib/config-payload.js +29 -6
  380. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  381. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  382. package/dist/src/gateway/hono/lib/mask-secret-length.d.ts +6 -0
  383. package/dist/src/gateway/hono/lib/mask-secret-length.js +16 -0
  384. package/dist/src/gateway/hono/lib/mask-secret-length.js.map +1 -0
  385. package/dist/src/gateway/hono/lib/safe-providers-config.d.ts +1 -1
  386. package/dist/src/gateway/hono/lib/safe-providers-config.js +2 -1
  387. package/dist/src/gateway/hono/lib/safe-providers-config.js.map +1 -1
  388. package/dist/src/gateway/hono/lib/safe-voice-config.js +16 -54
  389. package/dist/src/gateway/hono/lib/safe-voice-config.js.map +1 -1
  390. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  391. package/dist/src/gateway/hono/oauth.js +1 -1
  392. package/dist/src/gateway/hono/routes/agents.js +2 -2
  393. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  394. package/dist/src/gateway/hono/routes/config-patch/agents.js +25 -7
  395. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  396. package/dist/src/gateway/hono/routes/config-patch/channels.js +0 -11
  397. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  398. package/dist/src/gateway/hono/routes/config-patch/gateway.js +3 -2
  399. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -1
  400. package/dist/src/gateway/hono/routes/config-patch/misc.js +8 -3
  401. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
  402. package/dist/src/gateway/hono/routes/config.js +59 -0
  403. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  404. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  405. package/dist/src/gateway/hono/routes/goals.js +1 -1
  406. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  407. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  408. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  409. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  410. package/dist/src/gateway/hono/routes/models.js +75 -12
  411. package/dist/src/gateway/hono/routes/models.js.map +1 -1
  412. package/dist/src/gateway/hono/routes/sessions.js +28 -7
  413. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  414. package/dist/src/gateway/hono/routes/shares.js +15 -13
  415. package/dist/src/gateway/hono/routes/shares.js.map +1 -1
  416. package/dist/src/gateway/hono/routes/tunnel.js +1 -1
  417. package/dist/src/gateway/hono/routes/update.js +4 -2
  418. package/dist/src/gateway/hono/routes/update.js.map +1 -1
  419. package/dist/src/gateway/hono/routes/voice.js +75 -0
  420. package/dist/src/gateway/hono/routes/voice.js.map +1 -1
  421. package/dist/src/gateway/hono/routes/workflows.d.ts +3 -0
  422. package/dist/src/gateway/hono/routes/workflows.js +347 -0
  423. package/dist/src/gateway/hono/routes/workflows.js.map +1 -0
  424. package/dist/src/gateway/hono/routes/workspace.js +4 -4
  425. package/dist/src/gateway/hono/sse.js +16 -33
  426. package/dist/src/gateway/hono/sse.js.map +1 -1
  427. package/dist/src/gateway/lock.js +11 -11
  428. package/dist/src/gateway/lock.js.map +1 -1
  429. package/dist/src/gateway/ports.js +6 -6
  430. package/dist/src/gateway/ports.js.map +1 -1
  431. package/dist/src/gateway/resolve-webchat-session-key.d.ts +19 -0
  432. package/dist/src/gateway/resolve-webchat-session-key.js +46 -0
  433. package/dist/src/gateway/resolve-webchat-session-key.js.map +1 -0
  434. package/dist/src/gateway/service/agent-runner.js +2 -2
  435. package/dist/src/gateway/service/marketplace-service.js +2 -2
  436. package/dist/src/gateway/service/run-gateway-agent.js +9 -11
  437. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  438. package/dist/src/gateway/service/sessions-api.d.ts +3 -0
  439. package/dist/src/gateway/service/sessions-api.js +8 -0
  440. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  441. package/dist/src/gateway/service.d.ts +3 -2
  442. package/dist/src/gateway/service.js +9 -8
  443. package/dist/src/gateway/service.js.map +1 -1
  444. package/dist/src/gateway/session-reset-service.d.ts +20 -0
  445. package/dist/src/gateway/session-reset-service.js +54 -0
  446. package/dist/src/gateway/session-reset-service.js.map +1 -0
  447. package/dist/src/gateway/startup-readiness.d.ts +1 -1
  448. package/dist/src/gateway/startup-readiness.js +1 -0
  449. package/dist/src/gateway/startup-readiness.js.map +1 -1
  450. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  451. package/dist/src/heartbeat/index.js +1 -1
  452. package/dist/src/infra/gateway-processes.js +2 -2
  453. package/dist/src/infra/gateway-processes.js.map +1 -1
  454. package/dist/src/infra/restart.js +2 -2
  455. package/dist/src/infra/run-command.d.ts +16 -0
  456. package/dist/src/infra/run-command.js +67 -0
  457. package/dist/src/infra/run-command.js.map +1 -0
  458. package/dist/src/infra/update-check.js +1 -1
  459. package/dist/src/infra/update-global.d.ts +45 -0
  460. package/dist/src/infra/update-global.js +224 -0
  461. package/dist/src/infra/update-global.js.map +1 -0
  462. package/dist/src/infra/update-lock.js +3 -3
  463. package/dist/src/infra/update-runner.js +1 -1
  464. package/dist/src/infra/update-startup.js +2 -2
  465. package/dist/src/infra/write-file-atomic.js +2 -2
  466. package/dist/src/mcp/channel-shared.js +2 -1
  467. package/dist/src/mcp/channel-shared.js.map +1 -1
  468. package/dist/src/providers/auth-runtime/auth-profile-store.js +2 -2
  469. package/dist/src/providers/auth-runtime/auth-profile-store.js.map +1 -1
  470. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -12
  471. package/dist/src/providers/auth-runtime/resolve-auth.js.map +1 -1
  472. package/dist/src/providers/auth-runtime/types.d.ts +6 -12
  473. package/dist/src/providers/index.js +2 -2
  474. package/dist/src/providers/model-registry.js +1 -1
  475. package/dist/src/routing/agent-session-key.d.ts +58 -0
  476. package/dist/src/routing/agent-session-key.js +164 -0
  477. package/dist/src/routing/agent-session-key.js.map +1 -0
  478. package/dist/src/routing/index.d.ts +1 -1
  479. package/dist/src/routing/index.js +4 -2
  480. package/dist/src/routing/index.js.map +1 -1
  481. package/dist/src/routing/resolve-route.d.ts +15 -0
  482. package/dist/src/routing/resolve-route.js +41 -20
  483. package/dist/src/routing/resolve-route.js.map +1 -1
  484. package/dist/src/routing/resolve-tui-session-key.d.ts +25 -0
  485. package/dist/src/routing/resolve-tui-session-key.js +54 -0
  486. package/dist/src/routing/resolve-tui-session-key.js.map +1 -0
  487. package/dist/src/routing/session-key-utils.d.ts +24 -0
  488. package/dist/src/routing/session-key-utils.js +92 -0
  489. package/dist/src/routing/session-key-utils.js.map +1 -0
  490. package/dist/src/routing/session-key.d.ts +19 -49
  491. package/dist/src/routing/session-key.js +143 -116
  492. package/dist/src/routing/session-key.js.map +1 -1
  493. package/dist/src/session/config-store.js +2 -2
  494. package/dist/src/session/index.d.ts +6 -0
  495. package/dist/src/session/index.js +7 -1
  496. package/dist/src/session/init-session-turn.d.ts +30 -0
  497. package/dist/src/session/init-session-turn.js +102 -0
  498. package/dist/src/session/init-session-turn.js.map +1 -0
  499. package/dist/src/session/lifecycle-timestamps.d.ts +8 -0
  500. package/dist/src/session/lifecycle-timestamps.js +16 -0
  501. package/dist/src/session/lifecycle-timestamps.js.map +1 -0
  502. package/dist/src/session/manager.d.ts +7 -1
  503. package/dist/src/session/manager.js +8 -1
  504. package/dist/src/session/manager.js.map +1 -1
  505. package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
  506. package/dist/src/session/parity/sessions-json-file.js +1 -1
  507. package/dist/src/session/parity/transcript-file-lock.js +2 -2
  508. package/dist/src/session/parity/transcript-paths.js +2 -2
  509. package/dist/src/session/parity/transcript-paths.js.map +1 -1
  510. package/dist/src/session/parity/xopc-session-disk-entry.d.ts +6 -0
  511. package/dist/src/session/reset-policy.d.ts +32 -0
  512. package/dist/src/session/reset-policy.js +65 -0
  513. package/dist/src/session/reset-policy.js.map +1 -0
  514. package/dist/src/session/reset-triggers.d.ts +20 -0
  515. package/dist/src/session/reset-triggers.js +63 -0
  516. package/dist/src/session/reset-triggers.js.map +1 -0
  517. package/dist/src/session/reset-type.d.ts +12 -0
  518. package/dist/src/session/reset-type.js +25 -0
  519. package/dist/src/session/reset-type.js.map +1 -0
  520. package/dist/src/session/resolve-session.d.ts +30 -0
  521. package/dist/src/session/resolve-session.js +93 -0
  522. package/dist/src/session/resolve-session.js.map +1 -0
  523. package/dist/src/session/search-index-cache.js +1 -1
  524. package/dist/src/session/search-index.js +1 -1
  525. package/dist/src/session/session-title.js +3 -2
  526. package/dist/src/session/session-title.js.map +1 -1
  527. package/dist/src/session/store.d.ts +11 -4
  528. package/dist/src/session/store.js +62 -11
  529. package/dist/src/session/store.js.map +1 -1
  530. package/dist/src/session/transcript-events.js +2 -1
  531. package/dist/src/session/transcript-events.js.map +1 -1
  532. package/dist/src/share/share-auto.js +2 -2
  533. package/dist/src/share/share-store.js +3 -3
  534. package/dist/src/share/share-thumbnail.js +2 -2
  535. package/dist/src/share/share-url.d.ts +33 -0
  536. package/dist/src/share/share-url.js +56 -14
  537. package/dist/src/share/share-url.js.map +1 -1
  538. package/dist/src/share/share-zip.js +1 -1
  539. package/dist/src/share/site-share-store.js +3 -3
  540. package/dist/src/share/site-static-serve.js +1 -1
  541. package/dist/src/tui/backends/embedded-backend.js +4 -9
  542. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  543. package/dist/src/tui/backends/gateway-sse-backend.js +1 -1
  544. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  545. package/dist/src/tui/clipboard-image.js +3 -3
  546. package/dist/src/tui/components/chat-log.js +3 -3
  547. package/dist/src/tui/components/chat-log.js.map +1 -1
  548. package/dist/src/tui/theme-manager.js +1 -1
  549. package/dist/src/tui/theme.d.ts +0 -2
  550. package/dist/src/tui/theme.js +1 -3
  551. package/dist/src/tui/theme.js.map +1 -1
  552. package/dist/src/tui/tui-agent-events.js +2 -1
  553. package/dist/src/tui/tui-agent-events.js.map +1 -1
  554. package/dist/src/tui/tui-commands.d.ts +3 -0
  555. package/dist/src/tui/tui-commands.js +45 -10
  556. package/dist/src/tui/tui-commands.js.map +1 -1
  557. package/dist/src/tui/tui-keybindings-file.js +2 -22
  558. package/dist/src/tui/tui-keybindings-file.js.map +1 -1
  559. package/dist/src/tui/tui-scoped-models.js +2 -2
  560. package/dist/src/tui/tui-session-actions.d.ts +28 -0
  561. package/dist/src/tui/tui-session-actions.js +88 -0
  562. package/dist/src/tui/tui-session-actions.js.map +1 -0
  563. package/dist/src/tui/tui-settings.js +1 -1
  564. package/dist/src/tui/tui.js +54 -49
  565. package/dist/src/tui/tui.js.map +1 -1
  566. package/dist/src/tunnel/frpc-binary.js +3 -3
  567. package/dist/src/tunnel/frpc-config.js +1 -1
  568. package/dist/src/tunnel/frpc-extract.js +1 -1
  569. package/dist/src/tunnel/tunnel-state.js +1 -1
  570. package/dist/src/utils/logger/audit.js +1 -1
  571. package/dist/src/utils/logger/log-store.js +1 -1
  572. package/dist/src/utils/logger/rotation.js +1 -1
  573. package/dist/src/utils/string-coerce.d.ts +2 -0
  574. package/dist/src/utils/string-coerce.js +10 -1
  575. package/dist/src/utils/string-coerce.js.map +1 -1
  576. package/dist/src/voice/metadata/builtin.d.ts +2 -0
  577. package/dist/src/voice/metadata/builtin.js +420 -0
  578. package/dist/src/voice/metadata/builtin.js.map +1 -0
  579. package/dist/src/voice/metadata/index.d.ts +4 -0
  580. package/dist/src/voice/metadata/index.js +3 -0
  581. package/dist/src/voice/metadata/registry.d.ts +5 -0
  582. package/dist/src/voice/metadata/registry.js +34 -0
  583. package/dist/src/voice/metadata/registry.js.map +1 -0
  584. package/dist/src/voice/metadata/types.d.ts +41 -0
  585. package/dist/src/voice/metadata/types.js +1 -0
  586. package/dist/src/voice/stt/config-slice.d.ts +2 -5
  587. package/dist/src/voice/stt/config-slice.js +5 -26
  588. package/dist/src/voice/stt/config-slice.js.map +1 -1
  589. package/dist/src/voice/stt/list-providers.d.ts +3 -3
  590. package/dist/src/voice/stt/list-providers.js +41 -6
  591. package/dist/src/voice/stt/list-providers.js.map +1 -1
  592. package/dist/src/voice/stt/types.d.ts +1 -18
  593. package/dist/src/voice/stt/types.js +4 -2
  594. package/dist/src/voice/stt/types.js.map +1 -1
  595. package/dist/src/voice/tts/audio.js +1 -1
  596. package/dist/src/voice/tts/config-slice.d.ts +3 -7
  597. package/dist/src/voice/tts/config-slice.js +7 -38
  598. package/dist/src/voice/tts/config-slice.js.map +1 -1
  599. package/dist/src/voice/tts/list-providers.d.ts +3 -3
  600. package/dist/src/voice/tts/list-providers.js +41 -6
  601. package/dist/src/voice/tts/list-providers.js.map +1 -1
  602. package/dist/src/voice/tts/merge-config.js +2 -48
  603. package/dist/src/voice/tts/merge-config.js.map +1 -1
  604. package/dist/src/voice/tts/providers/alibaba-speech.js +1 -1
  605. package/dist/src/voice/tts/providers/alibaba-speech.js.map +1 -1
  606. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  607. package/dist/src/voice/tts/types.d.ts +1 -29
  608. package/dist/src/voice/tts/types.js +19 -17
  609. package/dist/src/voice/tts/types.js.map +1 -1
  610. package/dist/src/workflows/domain/command.d.ts +18 -0
  611. package/dist/src/workflows/domain/command.js +1 -0
  612. package/dist/src/workflows/domain/definition.d.ts +62 -0
  613. package/dist/src/workflows/domain/definition.js +1 -0
  614. package/dist/src/workflows/domain/event.d.ts +67 -0
  615. package/dist/src/workflows/domain/event.js +1 -0
  616. package/dist/src/workflows/domain/index.d.ts +5 -0
  617. package/dist/src/workflows/domain/index.js +2 -0
  618. package/dist/src/workflows/domain/result.d.ts +65 -0
  619. package/dist/src/workflows/domain/result.js +1 -0
  620. package/dist/src/workflows/domain/run.d.ts +120 -0
  621. package/dist/src/workflows/domain/run.js +14 -0
  622. package/dist/src/workflows/domain/run.js.map +1 -0
  623. package/dist/src/workflows/engine/index.d.ts +2 -0
  624. package/dist/src/workflows/engine/index.js +3 -0
  625. package/dist/src/workflows/engine/projector.d.ts +3 -0
  626. package/dist/src/workflows/engine/projector.js +205 -0
  627. package/dist/src/workflows/engine/projector.js.map +1 -0
  628. package/dist/src/workflows/engine/workflow-engine.d.ts +31 -0
  629. package/dist/src/workflows/engine/workflow-engine.js +188 -0
  630. package/dist/src/workflows/engine/workflow-engine.js.map +1 -0
  631. package/dist/src/workflows/index.d.ts +6 -0
  632. package/dist/src/workflows/index.js +11 -0
  633. package/dist/src/workflows/runtime/index.d.ts +1 -0
  634. package/dist/src/workflows/runtime/index.js +4 -0
  635. package/dist/src/workflows/runtime/script-runtime.d.ts +3 -0
  636. package/dist/src/workflows/runtime/script-runtime.js +3 -0
  637. package/dist/src/workflows/store/event-store.d.ts +17 -0
  638. package/dist/src/workflows/store/event-store.js +83 -0
  639. package/dist/src/workflows/store/event-store.js.map +1 -0
  640. package/dist/src/workflows/store/paths.d.ts +7 -0
  641. package/dist/src/workflows/store/paths.js +26 -0
  642. package/dist/src/workflows/store/paths.js.map +1 -0
  643. package/dist/src/workflows/store/run-store.d.ts +13 -0
  644. package/dist/src/workflows/store/run-store.js +68 -0
  645. package/dist/src/workflows/store/run-store.js.map +1 -0
  646. package/package.json +5 -8
  647. package/dist/gateway/static/root/assets/agents-mS3_HpRI.js +0 -222
  648. package/dist/gateway/static/root/assets/channels-settings-BG6b9KrW.js +0 -1
  649. package/dist/gateway/static/root/assets/extension-settings-page-B-W4x2xP.js +0 -1
  650. package/dist/gateway/static/root/assets/index-ew_2L2We.css +0 -1
  651. package/dist/gateway/static/root/assets/sessions-page-FaG_Vlkb.js +0 -1
  652. package/dist/gateway/static/root/assets/settings-page-Bet1OerL.js +0 -3
  653. package/dist/gateway/static/root/assets/skills-page-DhUO235y.js +0 -2
  654. package/dist/gateway/static/root/assets/url-BwNL6Rgk.js +0 -3
  655. package/dist/gateway/static/root/assets/voice-api-key-field-CGEydndO.js +0 -1
  656. package/dist/src/agent/tools/browser-legacy-tools.d.ts +0 -17
  657. package/dist/src/agent/tools/browser-legacy-tools.js +0 -766
  658. package/dist/src/agent/tools/browser-legacy-tools.js.map +0 -1
@@ -0,0 +1,58 @@
1
+ /**
2
+ * OpenClaw-aligned agent session keys: `agent:{agentId}:{rest}`
3
+ */
4
+ export { getSubagentDepth, isAcpSessionKey, isCronSessionKey, isSubagentSessionKey, parseAgentSessionKey, parseThreadSessionSuffix, type ParsedAgentSessionKey, } from './session-key-utils.js';
5
+ export { DEFAULT_ACCOUNT_ID, normalizeAccountId, normalizeOptionalAccountId, } from './account-id.js';
6
+ export declare const DEFAULT_AGENT_ID = "main";
7
+ export declare const DEFAULT_MAIN_KEY = "main";
8
+ export type SessionKeyShape = 'missing' | 'agent' | 'legacy_or_alias' | 'malformed_agent';
9
+ export type PeerKind = 'direct' | 'group' | 'channel' | 'dm';
10
+ export declare function normalizeMainKey(value: string | undefined | null): string;
11
+ export declare function toAgentRequestSessionKey(storeKey: string | undefined | null): string | undefined;
12
+ export declare function toAgentStoreSessionKey(params: {
13
+ agentId: string;
14
+ requestKey: string | undefined | null;
15
+ mainKey?: string | undefined;
16
+ }): string;
17
+ export declare function resolveAgentIdFromSessionKey(sessionKey: string | undefined | null): string;
18
+ export declare function classifySessionKeyShape(sessionKey: string | undefined | null): SessionKeyShape;
19
+ export declare function normalizeAgentId(value: string | undefined | null): string;
20
+ export declare function isValidAgentId(value: string | undefined | null): boolean;
21
+ export declare function sanitizeAgentId(value: string | undefined | null): string;
22
+ export declare function buildAgentMainSessionKey(params: {
23
+ agentId: string;
24
+ mainKey?: string | undefined;
25
+ }): string;
26
+ export declare function buildAgentPeerSessionKey(params: {
27
+ agentId: string;
28
+ mainKey?: string | undefined;
29
+ channel: string;
30
+ accountId?: string | null;
31
+ peerKind?: PeerKind | null;
32
+ peerId?: string | null;
33
+ identityLinks?: Record<string, string[]>;
34
+ dmScope?: 'main' | 'per-peer' | 'per-channel-peer' | 'per-account-channel-peer';
35
+ }): string;
36
+ export declare function buildGroupHistoryKey(params: {
37
+ channel: string;
38
+ accountId?: string | null;
39
+ peerKind: 'group' | 'channel';
40
+ peerId: string;
41
+ }): string;
42
+ export declare function resolveThreadSessionKeys(params: {
43
+ baseSessionKey: string;
44
+ threadId?: string | null;
45
+ parentSessionKey?: string;
46
+ useSuffix?: boolean;
47
+ normalizeThreadId?: (threadId: string) => string;
48
+ }): {
49
+ sessionKey: string;
50
+ parentSessionKey?: string;
51
+ };
52
+ export declare function scopedHeartbeatWakeOptions<T extends object>(sessionKey: string, wakeOptions: T): T | (T & {
53
+ sessionKey: string;
54
+ });
55
+ /** Default CLI/TUI main session key. */
56
+ export declare function defaultMainSessionKey(agentId?: string, mainKey?: string): string;
57
+ export declare function assertAgentSessionKey(sessionKey: string): void;
58
+ export declare function normalizeSessionKey(sessionKey: string | undefined | null): string;
@@ -0,0 +1,164 @@
1
+ import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
+ import { DEFAULT_ACCOUNT_ID, init_account_id, normalizeAccountId, normalizeOptionalAccountId } from "./account-id.js";
3
+ import { init_string_coerce, normalizeLowercaseStringOrEmpty } from "../utils/string-coerce.js";
4
+ import { getSubagentDepth, init_session_key_utils, isAcpSessionKey, isCronSessionKey, isSubagentSessionKey, parseAgentSessionKey, parseThreadSessionSuffix } from "./session-key-utils.js";
5
+ //#region src/routing/agent-session-key.ts
6
+ function normalizeToken(value) {
7
+ return normalizeLowercaseStringOrEmpty(value);
8
+ }
9
+ function normalizeMainKey(value) {
10
+ return normalizeLowercaseStringOrEmpty(value) || "main";
11
+ }
12
+ function toAgentRequestSessionKey(storeKey) {
13
+ const raw = (storeKey ?? "").trim();
14
+ if (!raw) return;
15
+ return parseAgentSessionKey(raw)?.rest ?? raw;
16
+ }
17
+ function toAgentStoreSessionKey(params) {
18
+ const raw = (params.requestKey ?? "").trim();
19
+ const lowered = normalizeLowercaseStringOrEmpty(raw);
20
+ if (!raw || lowered === "main") return buildAgentMainSessionKey({
21
+ agentId: params.agentId,
22
+ mainKey: params.mainKey
23
+ });
24
+ const parsed = parseAgentSessionKey(raw);
25
+ if (parsed) return `agent:${parsed.agentId}:${parsed.rest}`;
26
+ if (lowered.startsWith("agent:")) return lowered;
27
+ return `agent:${normalizeAgentId(params.agentId)}:${lowered}`;
28
+ }
29
+ function resolveAgentIdFromSessionKey(sessionKey) {
30
+ return normalizeAgentId(parseAgentSessionKey(sessionKey)?.agentId ?? "main");
31
+ }
32
+ function classifySessionKeyShape(sessionKey) {
33
+ const raw = (sessionKey ?? "").trim();
34
+ if (!raw) return "missing";
35
+ if (parseAgentSessionKey(raw)) return "agent";
36
+ return normalizeLowercaseStringOrEmpty(raw).startsWith("agent:") ? "malformed_agent" : "legacy_or_alias";
37
+ }
38
+ function normalizeAgentId(value) {
39
+ const trimmed = (value ?? "").trim();
40
+ if (!trimmed) return DEFAULT_AGENT_ID;
41
+ const normalized = normalizeLowercaseStringOrEmpty(trimmed);
42
+ if (VALID_ID_RE.test(trimmed)) return normalized;
43
+ return normalized.replace(INVALID_CHARS_RE, "-").replace(LEADING_DASH_RE, "").replace(TRAILING_DASH_RE, "").slice(0, 64) || "main";
44
+ }
45
+ function isValidAgentId(value) {
46
+ const trimmed = (value ?? "").trim();
47
+ return Boolean(trimmed) && VALID_ID_RE.test(trimmed);
48
+ }
49
+ function sanitizeAgentId(value) {
50
+ return normalizeAgentId(value);
51
+ }
52
+ function buildAgentMainSessionKey(params) {
53
+ return `agent:${normalizeAgentId(params.agentId)}:${normalizeMainKey(params.mainKey)}`;
54
+ }
55
+ function buildAgentPeerSessionKey(params) {
56
+ const rawKind = params.peerKind ?? "direct";
57
+ const peerKind = rawKind === "dm" ? "direct" : rawKind;
58
+ if (peerKind === "direct") {
59
+ const dmScope = params.dmScope ?? "main";
60
+ let peerId = (params.peerId ?? "").trim();
61
+ const linkedPeerId = dmScope === "main" ? null : resolveLinkedPeerId({
62
+ identityLinks: params.identityLinks,
63
+ channel: params.channel,
64
+ peerId
65
+ });
66
+ if (linkedPeerId) peerId = linkedPeerId;
67
+ peerId = normalizeLowercaseStringOrEmpty(peerId);
68
+ if (dmScope === "per-account-channel-peer" && peerId) {
69
+ const channel = normalizeLowercaseStringOrEmpty(params.channel) || "unknown";
70
+ const accountId = normalizeAccountId(params.accountId);
71
+ return `agent:${normalizeAgentId(params.agentId)}:${channel}:${accountId}:direct:${peerId}`;
72
+ }
73
+ if (dmScope === "per-channel-peer" && peerId) {
74
+ const channel = normalizeLowercaseStringOrEmpty(params.channel) || "unknown";
75
+ return `agent:${normalizeAgentId(params.agentId)}:${channel}:direct:${peerId}`;
76
+ }
77
+ if (dmScope === "per-peer" && peerId) return `agent:${normalizeAgentId(params.agentId)}:direct:${peerId}`;
78
+ return buildAgentMainSessionKey({
79
+ agentId: params.agentId,
80
+ mainKey: params.mainKey
81
+ });
82
+ }
83
+ const channel = normalizeLowercaseStringOrEmpty(params.channel) || "unknown";
84
+ const peerId = normalizeLowercaseStringOrEmpty(params.peerId) || "unknown";
85
+ return `agent:${normalizeAgentId(params.agentId)}:${channel}:${peerKind}:${peerId}`;
86
+ }
87
+ function resolveLinkedPeerId(params) {
88
+ const identityLinks = params.identityLinks;
89
+ if (!identityLinks) return null;
90
+ const peerId = params.peerId.trim();
91
+ if (!peerId) return null;
92
+ const candidates = /* @__PURE__ */ new Set();
93
+ const rawCandidate = normalizeToken(peerId);
94
+ if (rawCandidate) candidates.add(rawCandidate);
95
+ const channel = normalizeToken(params.channel);
96
+ if (channel) {
97
+ const scopedCandidate = normalizeToken(`${channel}:${peerId}`);
98
+ if (scopedCandidate) candidates.add(scopedCandidate);
99
+ }
100
+ if (candidates.size === 0) return null;
101
+ for (const [canonical, ids] of Object.entries(identityLinks)) {
102
+ const canonicalName = canonical.trim();
103
+ if (!canonicalName || !Array.isArray(ids)) continue;
104
+ for (const id of ids) {
105
+ const normalized = normalizeToken(id);
106
+ if (normalized && candidates.has(normalized)) return canonicalName;
107
+ }
108
+ }
109
+ return null;
110
+ }
111
+ function buildGroupHistoryKey(params) {
112
+ const channel = normalizeToken(params.channel) || "unknown";
113
+ const accountId = normalizeAccountId(params.accountId);
114
+ const peerId = normalizeLowercaseStringOrEmpty(params.peerId) || "unknown";
115
+ return `${channel}:${accountId}:${params.peerKind}:${peerId}`;
116
+ }
117
+ function resolveThreadSessionKeys(params) {
118
+ const threadId = (params.threadId ?? "").trim();
119
+ if (!threadId) return {
120
+ sessionKey: params.baseSessionKey,
121
+ parentSessionKey: void 0
122
+ };
123
+ const normalizedThread = params.normalizeThreadId?.(threadId) ?? normalizeLowercaseStringOrEmpty(threadId);
124
+ return {
125
+ sessionKey: params.useSuffix ?? true ? `${params.baseSessionKey}:thread:${normalizedThread}` : params.baseSessionKey,
126
+ parentSessionKey: params.parentSessionKey
127
+ };
128
+ }
129
+ function scopedHeartbeatWakeOptions(sessionKey, wakeOptions) {
130
+ return parseAgentSessionKey(sessionKey) ? {
131
+ ...wakeOptions,
132
+ sessionKey
133
+ } : wakeOptions;
134
+ }
135
+ /** Default CLI/TUI main session key. */
136
+ function defaultMainSessionKey(agentId, mainKey) {
137
+ return buildAgentMainSessionKey({
138
+ agentId: agentId ?? "main",
139
+ mainKey
140
+ });
141
+ }
142
+ function assertAgentSessionKey(sessionKey) {
143
+ if (!parseAgentSessionKey(sessionKey)) throw new Error(`Invalid agent session key (expected agent:{id}:{rest}): ${sessionKey}`);
144
+ }
145
+ function normalizeSessionKey(sessionKey) {
146
+ return (sessionKey ?? "").trim().toLowerCase();
147
+ }
148
+ var DEFAULT_AGENT_ID, DEFAULT_MAIN_KEY, VALID_ID_RE, INVALID_CHARS_RE, LEADING_DASH_RE, TRAILING_DASH_RE;
149
+ var init_agent_session_key = __esmMin((() => {
150
+ init_string_coerce();
151
+ init_account_id();
152
+ init_session_key_utils();
153
+ DEFAULT_AGENT_ID = "main";
154
+ DEFAULT_MAIN_KEY = "main";
155
+ VALID_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/i;
156
+ INVALID_CHARS_RE = /[^a-z0-9_-]+/g;
157
+ LEADING_DASH_RE = /^-+/;
158
+ TRAILING_DASH_RE = /-+$/;
159
+ }));
160
+ //#endregion
161
+ init_agent_session_key();
162
+ export { DEFAULT_ACCOUNT_ID, DEFAULT_AGENT_ID, DEFAULT_MAIN_KEY, assertAgentSessionKey, buildAgentMainSessionKey, buildAgentPeerSessionKey, buildGroupHistoryKey, classifySessionKeyShape, defaultMainSessionKey, getSubagentDepth, init_agent_session_key, isAcpSessionKey, isCronSessionKey, isSubagentSessionKey, isValidAgentId, normalizeAccountId, normalizeAgentId, normalizeMainKey, normalizeOptionalAccountId, normalizeSessionKey, parseAgentSessionKey, parseThreadSessionSuffix, resolveAgentIdFromSessionKey, resolveThreadSessionKeys, sanitizeAgentId, scopedHeartbeatWakeOptions, toAgentRequestSessionKey, toAgentStoreSessionKey };
163
+
164
+ //# sourceMappingURL=agent-session-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-session-key.js","names":[],"sources":["../../../src/routing/agent-session-key.ts"],"sourcesContent":["/**\n * OpenClaw-aligned agent session keys: `agent:{agentId}:{rest}`\n */\n\nimport { normalizeLowercaseStringOrEmpty } from '../utils/string-coerce.js';\nimport { normalizeAccountId } from './account-id.js';\nimport { parseAgentSessionKey } from './session-key-utils.js';\n\nexport {\n getSubagentDepth,\n isAcpSessionKey,\n isCronSessionKey,\n isSubagentSessionKey,\n parseAgentSessionKey,\n parseThreadSessionSuffix,\n type ParsedAgentSessionKey,\n} from './session-key-utils.js';\nexport {\n DEFAULT_ACCOUNT_ID,\n normalizeAccountId,\n normalizeOptionalAccountId,\n} from './account-id.js';\n\nexport const DEFAULT_AGENT_ID = 'main';\nexport const DEFAULT_MAIN_KEY = 'main';\nexport type SessionKeyShape = 'missing' | 'agent' | 'legacy_or_alias' | 'malformed_agent';\n\nexport type PeerKind = 'direct' | 'group' | 'channel' | 'dm';\n\nconst VALID_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/i;\nconst INVALID_CHARS_RE = /[^a-z0-9_-]+/g;\nconst LEADING_DASH_RE = /^-+/;\nconst TRAILING_DASH_RE = /-+$/;\n\nfunction normalizeToken(value: string | undefined | null): string {\n return normalizeLowercaseStringOrEmpty(value);\n}\n\nexport function normalizeMainKey(value: string | undefined | null): string {\n return normalizeLowercaseStringOrEmpty(value) || DEFAULT_MAIN_KEY;\n}\n\nexport function toAgentRequestSessionKey(storeKey: string | undefined | null): string | undefined {\n const raw = (storeKey ?? '').trim();\n if (!raw) {\n return undefined;\n }\n return parseAgentSessionKey(raw)?.rest ?? raw;\n}\n\nexport function toAgentStoreSessionKey(params: {\n agentId: string;\n requestKey: string | undefined | null;\n mainKey?: string | undefined;\n}): string {\n const raw = (params.requestKey ?? '').trim();\n const lowered = normalizeLowercaseStringOrEmpty(raw);\n if (!raw || lowered === DEFAULT_MAIN_KEY) {\n return buildAgentMainSessionKey({ agentId: params.agentId, mainKey: params.mainKey });\n }\n const parsed = parseAgentSessionKey(raw);\n if (parsed) {\n return `agent:${parsed.agentId}:${parsed.rest}`;\n }\n if (lowered.startsWith('agent:')) {\n return lowered;\n }\n return `agent:${normalizeAgentId(params.agentId)}:${lowered}`;\n}\n\nexport function resolveAgentIdFromSessionKey(sessionKey: string | undefined | null): string {\n const parsed = parseAgentSessionKey(sessionKey);\n return normalizeAgentId(parsed?.agentId ?? DEFAULT_AGENT_ID);\n}\n\nexport function classifySessionKeyShape(sessionKey: string | undefined | null): SessionKeyShape {\n const raw = (sessionKey ?? '').trim();\n if (!raw) {\n return 'missing';\n }\n if (parseAgentSessionKey(raw)) {\n return 'agent';\n }\n return normalizeLowercaseStringOrEmpty(raw).startsWith('agent:')\n ? 'malformed_agent'\n : 'legacy_or_alias';\n}\n\nexport function normalizeAgentId(value: string | undefined | null): string {\n const trimmed = (value ?? '').trim();\n if (!trimmed) {\n return DEFAULT_AGENT_ID;\n }\n const normalized = normalizeLowercaseStringOrEmpty(trimmed);\n if (VALID_ID_RE.test(trimmed)) {\n return normalized;\n }\n return (\n normalized\n .replace(INVALID_CHARS_RE, '-')\n .replace(LEADING_DASH_RE, '')\n .replace(TRAILING_DASH_RE, '')\n .slice(0, 64) || DEFAULT_AGENT_ID\n );\n}\n\nexport function isValidAgentId(value: string | undefined | null): boolean {\n const trimmed = (value ?? '').trim();\n return Boolean(trimmed) && VALID_ID_RE.test(trimmed);\n}\n\nexport function sanitizeAgentId(value: string | undefined | null): string {\n return normalizeAgentId(value);\n}\n\nexport function buildAgentMainSessionKey(params: {\n agentId: string;\n mainKey?: string | undefined;\n}): string {\n const agentId = normalizeAgentId(params.agentId);\n const mainKey = normalizeMainKey(params.mainKey);\n return `agent:${agentId}:${mainKey}`;\n}\n\nexport function buildAgentPeerSessionKey(params: {\n agentId: string;\n mainKey?: string | undefined;\n channel: string;\n accountId?: string | null;\n peerKind?: PeerKind | null;\n peerId?: string | null;\n identityLinks?: Record<string, string[]>;\n dmScope?: 'main' | 'per-peer' | 'per-channel-peer' | 'per-account-channel-peer';\n}): string {\n const rawKind = params.peerKind ?? 'direct';\n const peerKind = rawKind === 'dm' ? 'direct' : rawKind;\n\n if (peerKind === 'direct') {\n const dmScope = params.dmScope ?? 'main';\n let peerId = (params.peerId ?? '').trim();\n const linkedPeerId =\n dmScope === 'main'\n ? null\n : resolveLinkedPeerId({\n identityLinks: params.identityLinks,\n channel: params.channel,\n peerId,\n });\n if (linkedPeerId) {\n peerId = linkedPeerId;\n }\n peerId = normalizeLowercaseStringOrEmpty(peerId);\n if (dmScope === 'per-account-channel-peer' && peerId) {\n const channel = normalizeLowercaseStringOrEmpty(params.channel) || 'unknown';\n const accountId = normalizeAccountId(params.accountId);\n return `agent:${normalizeAgentId(params.agentId)}:${channel}:${accountId}:direct:${peerId}`;\n }\n if (dmScope === 'per-channel-peer' && peerId) {\n const channel = normalizeLowercaseStringOrEmpty(params.channel) || 'unknown';\n return `agent:${normalizeAgentId(params.agentId)}:${channel}:direct:${peerId}`;\n }\n if (dmScope === 'per-peer' && peerId) {\n return `agent:${normalizeAgentId(params.agentId)}:direct:${peerId}`;\n }\n return buildAgentMainSessionKey({\n agentId: params.agentId,\n mainKey: params.mainKey,\n });\n }\n\n const channel = normalizeLowercaseStringOrEmpty(params.channel) || 'unknown';\n const peerId = normalizeLowercaseStringOrEmpty(params.peerId) || 'unknown';\n return `agent:${normalizeAgentId(params.agentId)}:${channel}:${peerKind}:${peerId}`;\n}\n\nfunction resolveLinkedPeerId(params: {\n identityLinks?: Record<string, string[]>;\n channel: string;\n peerId: string;\n}): string | null {\n const identityLinks = params.identityLinks;\n if (!identityLinks) {\n return null;\n }\n const peerId = params.peerId.trim();\n if (!peerId) {\n return null;\n }\n const candidates = new Set<string>();\n const rawCandidate = normalizeToken(peerId);\n if (rawCandidate) {\n candidates.add(rawCandidate);\n }\n const channel = normalizeToken(params.channel);\n if (channel) {\n const scopedCandidate = normalizeToken(`${channel}:${peerId}`);\n if (scopedCandidate) {\n candidates.add(scopedCandidate);\n }\n }\n if (candidates.size === 0) {\n return null;\n }\n for (const [canonical, ids] of Object.entries(identityLinks)) {\n const canonicalName = canonical.trim();\n if (!canonicalName || !Array.isArray(ids)) {\n continue;\n }\n for (const id of ids) {\n const normalized = normalizeToken(id);\n if (normalized && candidates.has(normalized)) {\n return canonicalName;\n }\n }\n }\n return null;\n}\n\nexport function buildGroupHistoryKey(params: {\n channel: string;\n accountId?: string | null;\n peerKind: 'group' | 'channel';\n peerId: string;\n}): string {\n const channel = normalizeToken(params.channel) || 'unknown';\n const accountId = normalizeAccountId(params.accountId);\n const peerId = normalizeLowercaseStringOrEmpty(params.peerId) || 'unknown';\n return `${channel}:${accountId}:${params.peerKind}:${peerId}`;\n}\n\nexport function resolveThreadSessionKeys(params: {\n baseSessionKey: string;\n threadId?: string | null;\n parentSessionKey?: string;\n useSuffix?: boolean;\n normalizeThreadId?: (threadId: string) => string;\n}): { sessionKey: string; parentSessionKey?: string } {\n const threadId = (params.threadId ?? '').trim();\n if (!threadId) {\n return { sessionKey: params.baseSessionKey, parentSessionKey: undefined };\n }\n const normalizedThread =\n params.normalizeThreadId?.(threadId) ?? normalizeLowercaseStringOrEmpty(threadId);\n const useSuffix = params.useSuffix ?? true;\n const sessionKey = useSuffix\n ? `${params.baseSessionKey}:thread:${normalizedThread}`\n : params.baseSessionKey;\n return { sessionKey, parentSessionKey: params.parentSessionKey };\n}\n\nexport function scopedHeartbeatWakeOptions<T extends object>(\n sessionKey: string,\n wakeOptions: T,\n): T | (T & { sessionKey: string }) {\n return parseAgentSessionKey(sessionKey) ? { ...wakeOptions, sessionKey } : wakeOptions;\n}\n\n/** Default CLI/TUI main session key. */\nexport function defaultMainSessionKey(agentId?: string, mainKey?: string): string {\n return buildAgentMainSessionKey({ agentId: agentId ?? DEFAULT_AGENT_ID, mainKey });\n}\n\nexport function assertAgentSessionKey(sessionKey: string): void {\n if (!parseAgentSessionKey(sessionKey)) {\n throw new Error(`Invalid agent session key (expected agent:{id}:{rest}): ${sessionKey}`);\n }\n}\n\nexport function normalizeSessionKey(sessionKey: string | undefined | null): string {\n return (sessionKey ?? '').trim().toLowerCase();\n}\n"],"mappings":"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"}
@@ -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, 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, buildAgentMainSessionKey, buildAgentPeerSessionKey, defaultMainSessionKey, parseAgentSessionKey, resolveAgentIdFromSessionKey, toAgentStoreSessionKey, assertAgentSessionKey, normalizeAgentId, normalizeMainKey, DEFAULT_AGENT_ID, DEFAULT_MAIN_KEY, 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,7 @@
1
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";
2
+ import { getSubagentDepth, isCronSessionKey, isSubagentSessionKey, parseAgentSessionKey } from "./session-key-utils.js";
3
+ import { DEFAULT_AGENT_ID, DEFAULT_MAIN_KEY, assertAgentSessionKey, buildAgentMainSessionKey, buildAgentPeerSessionKey, defaultMainSessionKey, normalizeAgentId, normalizeMainKey, normalizeSessionKey, resolveAgentIdFromSessionKey, toAgentStoreSessionKey } from "./agent-session-key.js";
4
+ import { buildSessionKey, buildSubagentSessionKey, getParentSessionKey, init_session_key, isValidSegment, parseSessionKey, sanitizeSegment } from "./session-key.js";
3
5
  import { globMatch, init_bindings, matchesBinding, parseBindingRule, parseBindingRules, resolveRoute } from "./bindings.js";
4
6
  import { agentExists, applyIdentityLinks, buildRouteSessionKey, deriveLastRoutePolicy, getDefaultAgentId, init_resolve_route, pickFirstExistingAgentId, resolveRoute as resolveRoute$1, resolveRouteFromSessionKey } from "./resolve-route.js";
5
7
  //#region src/routing/index.ts
@@ -8,6 +10,6 @@ init_account_id();
8
10
  init_bindings();
9
11
  init_resolve_route();
10
12
  //#endregion
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 };
13
+ export { DEFAULT_ACCOUNT_ID, DEFAULT_AGENT_ID, DEFAULT_MAIN_KEY, agentExists, applyIdentityLinks, assertAgentSessionKey, buildAgentMainSessionKey, buildAgentPeerSessionKey, buildRouteSessionKey, buildSessionKey, buildSubagentSessionKey, defaultMainSessionKey, deriveLastRoutePolicy, getDefaultAgentId, getParentSessionKey, getSubagentDepth, globMatch, isCronSessionKey, isSubagentSessionKey, isValidAccountId, isValidSegment, matchesBinding, normalizeAccountId, normalizeAgentId, normalizeMainKey, normalizeOptionalAccountId, normalizeSessionKey, parseAgentSessionKey, parseBindingRule, parseBindingRules, parseSessionKey, pickFirstExistingAgentId, resolveAgentIdFromSessionKey, resolveRoute as resolveBindingRoute, resolveRoute$1 as resolveRoute, resolveRouteFromSessionKey, sanitizeAccountId, sanitizeSegment, toAgentStoreSessionKey };
12
14
 
13
15
  //# 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 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
+ {"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 buildAgentMainSessionKey,\n buildAgentPeerSessionKey,\n defaultMainSessionKey,\n parseAgentSessionKey,\n resolveAgentIdFromSessionKey,\n toAgentStoreSessionKey,\n assertAgentSessionKey,\n normalizeAgentId,\n normalizeMainKey,\n DEFAULT_AGENT_ID,\n DEFAULT_MAIN_KEY,\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":";;;;;;;kBA+B0B;iBASD;eAaF;oBAmBK"}
@@ -18,10 +18,25 @@ export type IdentityLinks = Record<string, string[]>;
18
18
  * Session-related routing options.
19
19
  */
20
20
  export interface SessionConfig {
21
+ scope?: 'per-sender' | 'global';
22
+ mainKey?: string;
21
23
  /** How DM sessions are scoped / merged */
22
24
  dmScope?: 'main' | 'per-peer' | 'per-channel-peer' | 'per-account-channel-peer';
23
25
  /** Cross-channel identity aliases */
24
26
  identityLinks?: IdentityLinks;
27
+ resetTriggers?: string[];
28
+ idleMinutes?: number;
29
+ reset?: {
30
+ mode?: 'daily' | 'idle';
31
+ atHour?: number;
32
+ idleMinutes?: number;
33
+ };
34
+ resetByType?: {
35
+ direct?: SessionConfig['reset'];
36
+ group?: SessionConfig['reset'];
37
+ thread?: SessionConfig['reset'];
38
+ };
39
+ resetByChannel?: Record<string, NonNullable<SessionConfig['reset']>>;
25
40
  /** Optional session store tuning */
26
41
  storage?: {
27
42
  pruneAfterMs?: number;
@@ -1,7 +1,8 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { init_agent_scope, resolveDefaultAgentId } from "../agent/agent-scope.js";
3
3
  import { init_account_id, normalizeAccountId } from "./account-id.js";
4
- import { buildSessionKey, init_session_key, normalizeSessionKey, parseSessionKey } from "./session-key.js";
4
+ import { buildAgentMainSessionKey, buildAgentPeerSessionKey, init_agent_session_key, normalizeSessionKey } from "./agent-session-key.js";
5
+ import { buildSessionKey, init_session_key, parseSessionKey } from "./session-key.js";
5
6
  import { init_bindings, parseBindingRules, resolveRoute as resolveRoute$1 } from "./bindings.js";
6
7
  //#region src/routing/resolve-route.ts
7
8
  /**
@@ -56,7 +57,8 @@ function buildRouteSessionKey(agentId, channel, accountId, peerKind, peerId, thr
56
57
  peerKind,
57
58
  peerId,
58
59
  threadId: threadId || void 0,
59
- scopeId: scopeId || void 0
60
+ scopeId: scopeId || void 0,
61
+ dmScope: peerKind === "dm" || peerKind === "direct" ? "per-account-channel-peer" : void 0
60
62
  });
61
63
  }
62
64
  /**
@@ -86,28 +88,46 @@ function resolveRoute(input) {
86
88
  memberRoleIds: input.memberRoleIds
87
89
  }, rules, getDefaultAgentId(config));
88
90
  const agentId = pickFirstExistingAgentId(bindingResult.agentId, config);
89
- const dmScope = config.session?.dmScope ?? "per-account-channel-peer";
91
+ const dmScope = config.session?.dmScope ?? "main";
90
92
  let sessionKey;
91
93
  let mainSessionKey;
94
+ const identityLinks = config.session?.identityLinks;
95
+ const mainKey = void 0;
92
96
  if (peerKind === "dm" || peerKind === "direct") {
93
- mainSessionKey = buildRouteSessionKey(agentId, channel, accountId, "dm", "main");
94
- switch (dmScope) {
95
- case "per-peer":
96
- sessionKey = buildRouteSessionKey(agentId, channel, accountId, "dm", peerId);
97
- break;
98
- case "per-channel-peer":
99
- sessionKey = buildRouteSessionKey(agentId, channel, "default", "dm", peerId);
100
- break;
101
- case "per-account-channel-peer":
102
- sessionKey = buildRouteSessionKey(agentId, "default", "default", "dm", peerId);
103
- break;
104
- default:
105
- sessionKey = mainSessionKey;
106
- break;
107
- }
97
+ mainSessionKey = buildAgentMainSessionKey({
98
+ agentId,
99
+ mainKey
100
+ });
101
+ sessionKey = buildAgentPeerSessionKey({
102
+ agentId,
103
+ mainKey,
104
+ channel,
105
+ accountId,
106
+ peerKind: "direct",
107
+ peerId,
108
+ identityLinks,
109
+ dmScope
110
+ });
108
111
  } else {
109
- sessionKey = buildRouteSessionKey(agentId, channel, accountId, peerKind, peerId, threadId);
110
- mainSessionKey = buildRouteSessionKey(agentId, channel, accountId, peerKind, "main");
112
+ const mappedKind = peerKind === "group" || peerKind === "channel" ? peerKind : peerKind;
113
+ sessionKey = buildAgentPeerSessionKey({
114
+ agentId,
115
+ mainKey,
116
+ channel,
117
+ accountId,
118
+ peerKind: mappedKind,
119
+ peerId,
120
+ identityLinks
121
+ });
122
+ mainSessionKey = buildAgentPeerSessionKey({
123
+ agentId,
124
+ mainKey,
125
+ channel,
126
+ accountId,
127
+ peerKind: mappedKind,
128
+ peerId: "main",
129
+ identityLinks
130
+ });
111
131
  }
112
132
  if (threadId && !sessionKey.includes(":thread:")) sessionKey = `${sessionKey}:thread:${threadId.toLowerCase()}`;
113
133
  sessionKey = normalizeSessionKey(sessionKey);
@@ -138,6 +158,7 @@ var init_resolve_route = __esmMin((() => {
138
158
  init_agent_scope();
139
159
  init_bindings();
140
160
  init_session_key();
161
+ init_agent_session_key();
141
162
  init_account_id();
142
163
  }));
143
164
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-route.js","names":["resolveDefaultAgentIdFromConfig","resolveBindingRoute"],"sources":["../../../src/routing/resolve-route.ts"],"sourcesContent":["/**\n * Route resolution\n *\n * Combines binding rules, identity links, and config to pick an agent and session keys.\n */\n\nimport { resolveDefaultAgentId as resolveDefaultAgentIdFromConfig } from '../agent/agent-scope.js';\nimport type { Config } from '../config/schema.js';\nimport type { BindingRule, RouteInput, RouteResult } from './bindings.js';\n\n/**\n * Route context type (alias for RouteInput)\n */\nexport type RouteContext = RouteInput;\nimport { parseBindingRules, resolveRoute as resolveBindingRoute } from './bindings.js';\nimport { buildSessionKey, normalizeSessionKey, parseSessionKey } from './session-key.js';\nimport { normalizeAccountId } from './account-id.js';\n\n/**\n * Identity link map: canonical peer id -> aliases across channels.\n *\n * Shape: `{ canonicalName: [alias1, alias2, ...] }`\n */\nexport type IdentityLinks = Record<string, string[]>;\n\n/**\n * Session-related routing options.\n */\nexport interface SessionConfig {\n /** How DM sessions are scoped / merged */\n dmScope?: 'main' | 'per-peer' | 'per-channel-peer' | 'per-account-channel-peer';\n /** Cross-channel identity aliases */\n identityLinks?: IdentityLinks;\n /** Optional session store tuning */\n storage?: {\n pruneAfterMs?: number;\n maxEntries?: number;\n };\n}\n\n/**\n * Agent list and default id from config.\n */\nexport interface AgentConfig {\n /** Default agent id */\n default?: string;\n /** Registered agents */\n list?: Array<{\n id: string;\n name?: string;\n enabled?: boolean;\n [key: string]: unknown;\n }>;\n}\n\n/**\n * Subset of app config used for routing.\n */\nexport interface RoutingConfig {\n agents?: AgentConfig;\n bindings?: BindingRule[] | any[];\n session?: SessionConfig;\n}\n\n/**\n * Input to `resolveRoute`.\n */\nexport interface ResolveRouteInput extends RouteInput {\n /** Routing config snapshot */\n config: RoutingConfig;\n /** Optional thread id for threaded channels */\n threadId?: string | null;\n}\n\n/**\n * Resolved route including session keys.\n */\nexport interface ResolveRouteResult extends RouteResult {\n /** Active session key for this turn */\n sessionKey: string;\n /** Main session key (DM merge target) */\n mainSessionKey: string;\n /** Whether routing used the main or a per-session key */\n lastRoutePolicy: 'main' | 'session';\n}\n\n/**\n * Apply identity links and return a canonical lowercased peer id.\n */\nexport function applyIdentityLinks(\n peerId: string,\n channel: string,\n identityLinks?: IdentityLinks\n): string {\n if (!identityLinks) {\n return peerId.toLowerCase();\n }\n \n const normalizedPeerId = peerId.trim().toLowerCase();\n if (!normalizedPeerId) {\n return normalizedPeerId;\n }\n \n const candidates = new Set<string>();\n candidates.add(normalizedPeerId);\n \n const channelPrefix = channel.trim().toLowerCase();\n if (channelPrefix) {\n candidates.add(`${channelPrefix}:${normalizedPeerId}`);\n }\n \n // Match any alias to its canonical id\n for (const [canonical, aliases] of Object.entries(identityLinks)) {\n if (!Array.isArray(aliases)) {\n continue;\n }\n \n for (const alias of aliases) {\n const normalizedAlias = alias.trim().toLowerCase();\n if (candidates.has(normalizedAlias)) {\n return canonical.trim().toLowerCase();\n }\n }\n }\n \n return normalizedPeerId;\n}\n\n/**\n * Default agent id from config (`agents.default`, `list[].default`, or `main`).\n */\nexport function getDefaultAgentId(config: RoutingConfig): string {\n return resolveDefaultAgentIdFromConfig(config as Config);\n}\n\n/**\n * Whether `agentId` appears in the enabled agent list (or list is absent).\n */\nexport function agentExists(agentId: string, config: RoutingConfig): boolean {\n if (!config.agents?.list) {\n return true; // No list: treat every id as valid\n }\n \n return config.agents.list.some(\n (agent) => agent.enabled !== false && agent.id.toLowerCase() === agentId.toLowerCase()\n );\n}\n\n/**\n * Return `agentId` if listed, otherwise the default agent id.\n */\nexport function pickFirstExistingAgentId(agentId: string, config: RoutingConfig): string {\n if (!agentId) {\n return getDefaultAgentId(config);\n }\n \n if (agentExists(agentId, config)) {\n return agentId.toLowerCase();\n }\n \n return getDefaultAgentId(config);\n}\n\n/**\n * Thin wrapper around `buildSessionKey` for route inputs.\n */\nexport function buildRouteSessionKey(\n agentId: string,\n channel: string,\n accountId: string,\n peerKind: string,\n peerId: string,\n threadId?: string | null,\n scopeId?: string | null\n): string {\n return buildSessionKey({\n agentId,\n source: channel,\n accountId,\n peerKind,\n peerId,\n threadId: threadId || undefined,\n scopeId: scopeId || undefined,\n });\n}\n\n/**\n * Map session vs main key to policy label.\n */\nexport function deriveLastRoutePolicy(\n sessionKey: string,\n mainSessionKey: string\n): 'main' | 'session' {\n return sessionKey === mainSessionKey ? 'main' : 'session';\n}\n\n/**\n * Resolve agent and session keys from channel context and config.\n */\nexport function resolveRoute(input: ResolveRouteInput): ResolveRouteResult {\n const { config, threadId } = input;\n \n const channel = (input.channel ?? '').trim().toLowerCase() || 'unknown';\n const accountId = normalizeAccountId(input.accountId);\n const peerKind = (input.peerKind ?? 'dm').toLowerCase();\n const rawPeerId = (input.peerId ?? '').trim();\n \n const peerId = applyIdentityLinks(rawPeerId, channel, config.session?.identityLinks ?? {});\n \n const rules = Array.isArray(config.bindings)\n ? parseBindingRules({ bindings: config.bindings })\n : [];\n \n const bindingResult = resolveBindingRoute(\n {\n channel,\n accountId,\n peerKind: input.peerKind,\n peerId: rawPeerId,\n guildId: input.guildId,\n teamId: input.teamId,\n memberRoleIds: input.memberRoleIds,\n },\n rules,\n getDefaultAgentId(config)\n );\n \n const agentId = pickFirstExistingAgentId(bindingResult.agentId, config);\n \n const dmScope = config.session?.dmScope ?? 'per-account-channel-peer';\n \n let sessionKey: string;\n let mainSessionKey: string;\n \n if (peerKind === 'dm' || peerKind === 'direct') {\n // DM: merge or split sessions depending on dmScope\n mainSessionKey = buildRouteSessionKey(agentId, channel, accountId, 'dm', 'main');\n \n switch (dmScope) {\n case 'per-peer':\n sessionKey = buildRouteSessionKey(agentId, channel, accountId, 'dm', peerId);\n break;\n case 'per-channel-peer':\n sessionKey = buildRouteSessionKey(agentId, channel, 'default', 'dm', peerId);\n break;\n case 'per-account-channel-peer':\n sessionKey = buildRouteSessionKey(agentId, 'default', 'default', 'dm', peerId);\n break;\n case 'main':\n default:\n sessionKey = mainSessionKey;\n break;\n }\n } else {\n // Group / channel / other peer kinds\n sessionKey = buildRouteSessionKey(agentId, channel, accountId, peerKind, peerId, threadId);\n mainSessionKey = buildRouteSessionKey(agentId, channel, accountId, peerKind, 'main');\n }\n \n if (threadId && !sessionKey.includes(':thread:')) {\n sessionKey = `${sessionKey}:thread:${threadId.toLowerCase()}`;\n }\n \n sessionKey = normalizeSessionKey(sessionKey);\n mainSessionKey = normalizeSessionKey(mainSessionKey);\n \n return {\n ...bindingResult,\n agentId,\n sessionKey,\n mainSessionKey,\n lastRoutePolicy: deriveLastRoutePolicy(sessionKey, mainSessionKey),\n };\n}\n\n/**\n * Parse basic routing fields from a session key string.\n */\nexport function resolveRouteFromSessionKey(\n sessionKey: string,\n _config: RoutingConfig\n): { agentId: string; source: string; accountId: string; peerKind: string; peerId: string } | null {\n const parsed = parseSessionKey(sessionKey);\n if (!parsed) {\n return null;\n }\n \n return {\n agentId: parsed.agentId,\n source: parsed.source,\n accountId: parsed.accountId,\n peerKind: parsed.peerKind,\n peerId: parsed.peerId,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"resolve-route.js","names":["resolveDefaultAgentIdFromConfig","resolveBindingRoute"],"sources":["../../../src/routing/resolve-route.ts"],"sourcesContent":["/**\n * Route resolution\n *\n * Combines binding rules, identity links, and config to pick an agent and session keys.\n */\n\nimport { resolveDefaultAgentId as resolveDefaultAgentIdFromConfig } from '../agent/agent-scope.js';\nimport type { Config } from '../config/schema.js';\nimport type { BindingRule, RouteInput, RouteResult } from './bindings.js';\n\n/**\n * Route context type (alias for RouteInput)\n */\nexport type RouteContext = RouteInput;\nimport { parseBindingRules, resolveRoute as resolveBindingRoute } from './bindings.js';\nimport { buildSessionKey, normalizeSessionKey, parseSessionKey } from './session-key.js';\nimport {\n buildAgentMainSessionKey,\n buildAgentPeerSessionKey,\n} from './agent-session-key.js';\nimport { normalizeAccountId } from './account-id.js';\n\n/**\n * Identity link map: canonical peer id -> aliases across channels.\n *\n * Shape: `{ canonicalName: [alias1, alias2, ...] }`\n */\nexport type IdentityLinks = Record<string, string[]>;\n\n/**\n * Session-related routing options.\n */\nexport interface SessionConfig {\n scope?: 'per-sender' | 'global';\n mainKey?: string;\n /** How DM sessions are scoped / merged */\n dmScope?: 'main' | 'per-peer' | 'per-channel-peer' | 'per-account-channel-peer';\n /** Cross-channel identity aliases */\n identityLinks?: IdentityLinks;\n resetTriggers?: string[];\n idleMinutes?: number;\n reset?: {\n mode?: 'daily' | 'idle';\n atHour?: number;\n idleMinutes?: number;\n };\n resetByType?: {\n direct?: SessionConfig['reset'];\n group?: SessionConfig['reset'];\n thread?: SessionConfig['reset'];\n };\n resetByChannel?: Record<string, NonNullable<SessionConfig['reset']>>;\n /** Optional session store tuning */\n storage?: {\n pruneAfterMs?: number;\n maxEntries?: number;\n };\n}\n\n/**\n * Agent list and default id from config.\n */\nexport interface AgentConfig {\n /** Default agent id */\n default?: string;\n /** Registered agents */\n list?: Array<{\n id: string;\n name?: string;\n enabled?: boolean;\n [key: string]: unknown;\n }>;\n}\n\n/**\n * Subset of app config used for routing.\n */\nexport interface RoutingConfig {\n agents?: AgentConfig;\n bindings?: BindingRule[] | any[];\n session?: SessionConfig;\n}\n\n/**\n * Input to `resolveRoute`.\n */\nexport interface ResolveRouteInput extends RouteInput {\n /** Routing config snapshot */\n config: RoutingConfig;\n /** Optional thread id for threaded channels */\n threadId?: string | null;\n}\n\n/**\n * Resolved route including session keys.\n */\nexport interface ResolveRouteResult extends RouteResult {\n /** Active session key for this turn */\n sessionKey: string;\n /** Main session key (DM merge target) */\n mainSessionKey: string;\n /** Whether routing used the main or a per-session key */\n lastRoutePolicy: 'main' | 'session';\n}\n\n/**\n * Apply identity links and return a canonical lowercased peer id.\n */\nexport function applyIdentityLinks(\n peerId: string,\n channel: string,\n identityLinks?: IdentityLinks\n): string {\n if (!identityLinks) {\n return peerId.toLowerCase();\n }\n \n const normalizedPeerId = peerId.trim().toLowerCase();\n if (!normalizedPeerId) {\n return normalizedPeerId;\n }\n \n const candidates = new Set<string>();\n candidates.add(normalizedPeerId);\n \n const channelPrefix = channel.trim().toLowerCase();\n if (channelPrefix) {\n candidates.add(`${channelPrefix}:${normalizedPeerId}`);\n }\n \n // Match any alias to its canonical id\n for (const [canonical, aliases] of Object.entries(identityLinks)) {\n if (!Array.isArray(aliases)) {\n continue;\n }\n \n for (const alias of aliases) {\n const normalizedAlias = alias.trim().toLowerCase();\n if (candidates.has(normalizedAlias)) {\n return canonical.trim().toLowerCase();\n }\n }\n }\n \n return normalizedPeerId;\n}\n\n/**\n * Default agent id from config (`agents.default`, `list[].default`, or `main`).\n */\nexport function getDefaultAgentId(config: RoutingConfig): string {\n return resolveDefaultAgentIdFromConfig(config as Config);\n}\n\n/**\n * Whether `agentId` appears in the enabled agent list (or list is absent).\n */\nexport function agentExists(agentId: string, config: RoutingConfig): boolean {\n if (!config.agents?.list) {\n return true; // No list: treat every id as valid\n }\n \n return config.agents.list.some(\n (agent) => agent.enabled !== false && agent.id.toLowerCase() === agentId.toLowerCase()\n );\n}\n\n/**\n * Return `agentId` if listed, otherwise the default agent id.\n */\nexport function pickFirstExistingAgentId(agentId: string, config: RoutingConfig): string {\n if (!agentId) {\n return getDefaultAgentId(config);\n }\n \n if (agentExists(agentId, config)) {\n return agentId.toLowerCase();\n }\n \n return getDefaultAgentId(config);\n}\n\n/**\n * Thin wrapper around `buildSessionKey` for route inputs.\n */\nexport function buildRouteSessionKey(\n agentId: string,\n channel: string,\n accountId: string,\n peerKind: string,\n peerId: string,\n threadId?: string | null,\n scopeId?: string | null,\n): string {\n return buildSessionKey({\n agentId,\n source: channel,\n accountId,\n peerKind,\n peerId,\n threadId: threadId || undefined,\n scopeId: scopeId || undefined,\n dmScope: peerKind === 'dm' || peerKind === 'direct' ? 'per-account-channel-peer' : undefined,\n });\n}\n\n/**\n * Map session vs main key to policy label.\n */\nexport function deriveLastRoutePolicy(\n sessionKey: string,\n mainSessionKey: string\n): 'main' | 'session' {\n return sessionKey === mainSessionKey ? 'main' : 'session';\n}\n\n/**\n * Resolve agent and session keys from channel context and config.\n */\nexport function resolveRoute(input: ResolveRouteInput): ResolveRouteResult {\n const { config, threadId } = input;\n \n const channel = (input.channel ?? '').trim().toLowerCase() || 'unknown';\n const accountId = normalizeAccountId(input.accountId);\n const peerKind = (input.peerKind ?? 'dm').toLowerCase();\n const rawPeerId = (input.peerId ?? '').trim();\n \n const peerId = applyIdentityLinks(rawPeerId, channel, config.session?.identityLinks ?? {});\n \n const rules = Array.isArray(config.bindings)\n ? parseBindingRules({ bindings: config.bindings })\n : [];\n \n const bindingResult = resolveBindingRoute(\n {\n channel,\n accountId,\n peerKind: input.peerKind,\n peerId: rawPeerId,\n guildId: input.guildId,\n teamId: input.teamId,\n memberRoleIds: input.memberRoleIds,\n },\n rules,\n getDefaultAgentId(config)\n );\n \n const agentId = pickFirstExistingAgentId(bindingResult.agentId, config);\n \n const dmScope = config.session?.dmScope ?? 'main';\n\n let sessionKey: string;\n let mainSessionKey: string;\n\n const identityLinks = config.session?.identityLinks;\n const mainKey = undefined;\n\n if (peerKind === 'dm' || peerKind === 'direct') {\n mainSessionKey = buildAgentMainSessionKey({ agentId, mainKey });\n\n sessionKey = buildAgentPeerSessionKey({\n agentId,\n mainKey,\n channel,\n accountId,\n peerKind: 'direct',\n peerId,\n identityLinks,\n dmScope,\n });\n } else {\n const mappedKind = peerKind === 'group' || peerKind === 'channel' ? peerKind : peerKind;\n sessionKey = buildAgentPeerSessionKey({\n agentId,\n mainKey,\n channel,\n accountId,\n peerKind: mappedKind as 'group' | 'channel',\n peerId,\n identityLinks,\n });\n mainSessionKey = buildAgentPeerSessionKey({\n agentId,\n mainKey,\n channel,\n accountId,\n peerKind: mappedKind as 'group' | 'channel',\n peerId: 'main',\n identityLinks,\n });\n }\n\n if (threadId && !sessionKey.includes(':thread:')) {\n sessionKey = `${sessionKey}:thread:${threadId.toLowerCase()}`;\n }\n \n sessionKey = normalizeSessionKey(sessionKey);\n mainSessionKey = normalizeSessionKey(mainSessionKey);\n \n return {\n ...bindingResult,\n agentId,\n sessionKey,\n mainSessionKey,\n lastRoutePolicy: deriveLastRoutePolicy(sessionKey, mainSessionKey),\n };\n}\n\n/**\n * Parse basic routing fields from a session key string.\n */\nexport function resolveRouteFromSessionKey(\n sessionKey: string,\n _config: RoutingConfig\n): { agentId: string; source: string; accountId: string; peerKind: string; peerId: string } | null {\n const parsed = parseSessionKey(sessionKey);\n if (!parsed) {\n return null;\n }\n \n return {\n agentId: parsed.agentId,\n source: parsed.source,\n accountId: parsed.accountId,\n peerKind: parsed.peerKind,\n peerId: parsed.peerId,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { Config } from '../config/schema.js';
2
+ export type SessionScope = 'per-sender' | 'global';
3
+ export declare function resolveTuiSessionKey(params: {
4
+ raw?: string;
5
+ sessionScope: SessionScope;
6
+ currentAgentId: string;
7
+ sessionMainKey: string;
8
+ }): string;
9
+ export declare function resolveInitialTuiAgentId(params: {
10
+ cfg: Config;
11
+ fallbackAgentId: string;
12
+ initialSessionInput?: string;
13
+ cwd?: string;
14
+ }): string;
15
+ /** Resolve TUI startup session key from CLI options and config. */
16
+ export declare function resolveTuiStartupSessionKey(params: {
17
+ cfg: Config;
18
+ sessionOption?: string;
19
+ cwd?: string;
20
+ }): {
21
+ sessionKey: string;
22
+ agentId: string;
23
+ sessionScope: SessionScope;
24
+ sessionMainKey: string;
25
+ };
@@ -0,0 +1,54 @@
1
+ import { init_agent_scope, resolveAgentIdByWorkspacePath, resolveDefaultAgentId } from "../agent/agent-scope.js";
2
+ import { init_string_coerce, normalizeLowercaseStringOrEmpty } from "../utils/string-coerce.js";
3
+ import { parseAgentSessionKey } from "./session-key-utils.js";
4
+ import { buildAgentMainSessionKey, init_agent_session_key, normalizeAgentId, normalizeMainKey } from "./agent-session-key.js";
5
+ //#region src/routing/resolve-tui-session-key.ts
6
+ init_agent_scope();
7
+ init_agent_session_key();
8
+ init_string_coerce();
9
+ function resolveTuiSessionKey(params) {
10
+ const trimmed = (params.raw ?? "").trim();
11
+ if (!trimmed) {
12
+ if (params.sessionScope === "global") return "global";
13
+ return buildAgentMainSessionKey({
14
+ agentId: params.currentAgentId,
15
+ mainKey: params.sessionMainKey
16
+ });
17
+ }
18
+ if (trimmed === "global" || trimmed === "unknown") return trimmed;
19
+ if (trimmed.startsWith("agent:")) return normalizeLowercaseStringOrEmpty(trimmed);
20
+ return `agent:${params.currentAgentId}:${normalizeLowercaseStringOrEmpty(trimmed)}`;
21
+ }
22
+ function resolveInitialTuiAgentId(params) {
23
+ const parsed = parseAgentSessionKey((params.initialSessionInput ?? "").trim());
24
+ if (parsed?.agentId) return normalizeAgentId(parsed.agentId);
25
+ const inferredFromWorkspace = resolveAgentIdByWorkspacePath(params.cfg, params.cwd ?? process.cwd());
26
+ if (inferredFromWorkspace) return inferredFromWorkspace;
27
+ return normalizeAgentId(params.fallbackAgentId);
28
+ }
29
+ /** Resolve TUI startup session key from CLI options and config. */
30
+ function resolveTuiStartupSessionKey(params) {
31
+ const sessionScope = params.cfg.session?.scope ?? "per-sender";
32
+ const sessionMainKey = normalizeMainKey(params.cfg.session?.mainKey);
33
+ const agentId = resolveInitialTuiAgentId({
34
+ cfg: params.cfg,
35
+ fallbackAgentId: resolveDefaultAgentId(params.cfg),
36
+ initialSessionInput: (params.sessionOption ?? "").trim(),
37
+ cwd: params.cwd ?? process.cwd()
38
+ });
39
+ return {
40
+ sessionKey: resolveTuiSessionKey({
41
+ raw: params.sessionOption,
42
+ sessionScope,
43
+ currentAgentId: agentId,
44
+ sessionMainKey
45
+ }),
46
+ agentId,
47
+ sessionScope,
48
+ sessionMainKey
49
+ };
50
+ }
51
+ //#endregion
52
+ export { resolveInitialTuiAgentId, resolveTuiSessionKey, resolveTuiStartupSessionKey };
53
+
54
+ //# sourceMappingURL=resolve-tui-session-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-tui-session-key.js","names":[],"sources":["../../../src/routing/resolve-tui-session-key.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport {\n resolveAgentIdByWorkspacePath,\n resolveDefaultAgentId,\n} from '../agent/agent-scope.js';\nimport {\n buildAgentMainSessionKey,\n normalizeAgentId,\n normalizeMainKey,\n parseAgentSessionKey,\n} from './agent-session-key.js';\nimport { normalizeLowercaseStringOrEmpty } from '../utils/string-coerce.js';\n\nexport type SessionScope = 'per-sender' | 'global';\n\nexport function resolveTuiSessionKey(params: {\n raw?: string;\n sessionScope: SessionScope;\n currentAgentId: string;\n sessionMainKey: string;\n}): string {\n const trimmed = (params.raw ?? '').trim();\n if (!trimmed) {\n if (params.sessionScope === 'global') {\n return 'global';\n }\n return buildAgentMainSessionKey({\n agentId: params.currentAgentId,\n mainKey: params.sessionMainKey,\n });\n }\n if (trimmed === 'global' || trimmed === 'unknown') {\n return trimmed;\n }\n if (trimmed.startsWith('agent:')) {\n return normalizeLowercaseStringOrEmpty(trimmed);\n }\n return `agent:${params.currentAgentId}:${normalizeLowercaseStringOrEmpty(trimmed)}`;\n}\n\nexport function resolveInitialTuiAgentId(params: {\n cfg: Config;\n fallbackAgentId: string;\n initialSessionInput?: string;\n cwd?: string;\n}): string {\n const parsed = parseAgentSessionKey((params.initialSessionInput ?? '').trim());\n if (parsed?.agentId) {\n return normalizeAgentId(parsed.agentId);\n }\n\n const inferredFromWorkspace = resolveAgentIdByWorkspacePath(\n params.cfg,\n params.cwd ?? process.cwd(),\n );\n if (inferredFromWorkspace) {\n return inferredFromWorkspace;\n }\n\n return normalizeAgentId(params.fallbackAgentId);\n}\n\n/** Resolve TUI startup session key from CLI options and config. */\nexport function resolveTuiStartupSessionKey(params: {\n cfg: Config;\n sessionOption?: string;\n cwd?: string;\n}): { sessionKey: string; agentId: string; sessionScope: SessionScope; sessionMainKey: string } {\n const sessionScope = (params.cfg.session?.scope ?? 'per-sender') as SessionScope;\n const sessionMainKey = normalizeMainKey(params.cfg.session?.mainKey);\n const agentId = resolveInitialTuiAgentId({\n cfg: params.cfg,\n fallbackAgentId: resolveDefaultAgentId(params.cfg),\n initialSessionInput: (params.sessionOption ?? '').trim(),\n cwd: params.cwd ?? process.cwd(),\n });\n const sessionKey = resolveTuiSessionKey({\n raw: params.sessionOption,\n sessionScope,\n currentAgentId: agentId,\n sessionMainKey,\n });\n return { sessionKey, agentId, sessionScope, sessionMainKey };\n}\n"],"mappings":";;;;;kBAIiC;wBAMD;oBAC4C;AAI5E,SAAgB,qBAAqB,QAK1B;CACT,MAAM,WAAW,OAAO,OAAO,IAAI,MAAM;AACzC,KAAI,CAAC,SAAS;AACZ,MAAI,OAAO,iBAAiB,SAC1B,QAAO;AAET,SAAO,yBAAyB;GAC9B,SAAS,OAAO;GAChB,SAAS,OAAO;GACjB,CAAC;;AAEJ,KAAI,YAAY,YAAY,YAAY,UACtC,QAAO;AAET,KAAI,QAAQ,WAAW,SAAS,CAC9B,QAAO,gCAAgC,QAAQ;AAEjD,QAAO,SAAS,OAAO,eAAe,GAAG,gCAAgC,QAAQ;;AAGnF,SAAgB,yBAAyB,QAK9B;CACT,MAAM,SAAS,sBAAsB,OAAO,uBAAuB,IAAI,MAAM,CAAC;AAC9E,KAAI,QAAQ,QACV,QAAO,iBAAiB,OAAO,QAAQ;CAGzC,MAAM,wBAAwB,8BAC5B,OAAO,KACP,OAAO,OAAO,QAAQ,KAAK,CAC5B;AACD,KAAI,sBACF,QAAO;AAGT,QAAO,iBAAiB,OAAO,gBAAgB;;;AAIjD,SAAgB,4BAA4B,QAIoD;CAC9F,MAAM,eAAgB,OAAO,IAAI,SAAS,SAAS;CACnD,MAAM,iBAAiB,iBAAiB,OAAO,IAAI,SAAS,QAAQ;CACpE,MAAM,UAAU,yBAAyB;EACvC,KAAK,OAAO;EACZ,iBAAiB,sBAAsB,OAAO,IAAI;EAClD,sBAAsB,OAAO,iBAAiB,IAAI,MAAM;EACxD,KAAK,OAAO,OAAO,QAAQ,KAAK;EACjC,CAAC;AAOF,QAAO;EAAE,YANU,qBAAqB;GACtC,KAAK,OAAO;GACZ;GACA,gBAAgB;GAChB;GACD,CACkB;EAAE;EAAS;EAAc;EAAgB"}
@@ -0,0 +1,24 @@
1
+ export type ParsedAgentSessionKey = {
2
+ agentId: string;
3
+ rest: string;
4
+ };
5
+ export type ParsedThreadSessionSuffix = {
6
+ baseSessionKey: string | undefined;
7
+ threadId: string | undefined;
8
+ };
9
+ export type RawSessionConversationRef = {
10
+ channel: string;
11
+ kind: 'group' | 'channel';
12
+ rawId: string;
13
+ prefix: string;
14
+ };
15
+ /** Parse `agent:{agentId}:{rest}` session keys (OpenClaw canonical form). */
16
+ export declare function parseAgentSessionKey(sessionKey: string | undefined | null): ParsedAgentSessionKey | null;
17
+ export declare function isCronRunSessionKey(sessionKey: string | undefined | null): boolean;
18
+ export declare function isCronSessionKey(sessionKey: string | undefined | null): boolean;
19
+ export declare function isSubagentSessionKey(sessionKey: string | undefined | null): boolean;
20
+ export declare function getSubagentDepth(sessionKey: string | undefined | null): number;
21
+ export declare function isAcpSessionKey(sessionKey: string | undefined | null): boolean;
22
+ export declare function parseThreadSessionSuffix(sessionKey: string | undefined | null): ParsedThreadSessionSuffix;
23
+ export declare function parseRawSessionConversationRef(sessionKey: string | undefined | null): RawSessionConversationRef | null;
24
+ export declare function resolveThreadParentSessionKey(sessionKey: string | undefined | null): string | null;