@xopcai/xopc 0.0.81 → 0.0.83

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 (709) hide show
  1. package/README.md +1 -1
  2. package/README.zh-CN.md +1 -1
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/feishu/src/outbound/media-load.js +2 -3
  5. package/dist/extensions/feishu/src/outbound/media-load.js.map +1 -1
  6. package/dist/extensions/feishu/src/schema/config-schema.d.ts +6 -6
  7. package/dist/extensions/telegram/src/config-schema.d.ts +6 -6
  8. package/dist/extensions/telegram/src/plugin.d.ts +1 -1
  9. package/dist/extensions/telegram/src/plugin.js +1 -1
  10. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  11. package/dist/extensions/telegram/xopc.extension.json +1 -1
  12. package/dist/extensions/weixin/src/api/api.js +3 -3
  13. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  14. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  15. package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
  16. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  17. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  18. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  19. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  20. package/dist/extensions/weixin/src/plugin.js +1 -1
  21. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  22. package/dist/gateway/static/root/assets/agents-CrpYTHJS.js +222 -0
  23. package/dist/gateway/static/root/assets/{apps-page-Ci17oA_o.js → apps-page-1mcKh5Rh.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-settings-zd6QNKPx.js +1 -0
  25. package/dist/gateway/static/root/assets/{channels-status-swr-CUU3faST.js → channels-status-swr-uRAuhiUo.js} +1 -1
  26. package/dist/gateway/static/root/assets/{cron-api-BVQ2n75R.js → cron-api-O2Q_ruV6.js} +1 -1
  27. package/dist/gateway/static/root/assets/{cron-page-x582Y6D5.js → cron-page-By09AQD-.js} +1 -1
  28. package/dist/gateway/static/root/assets/{dist-XT96cQdR.js → dist-BpQxde0t.js} +1 -1
  29. package/dist/gateway/static/root/assets/{extension-debug-page-Czzfrtt5.js → extension-debug-page-CY27wj_p.js} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-page-B_c5UIqX.js → extension-page-C-Ed5ZmP.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-settings-page-Ckvjgw0_.js → extension-settings-page-raLux7E7.js} +1 -1
  32. package/dist/gateway/static/root/assets/fetch-2iRFmd3n.js +3 -0
  33. package/dist/gateway/static/root/assets/{field-primitives-DQpT8iVa.js → field-primitives-fa_hiQcX.js} +1 -1
  34. package/dist/gateway/static/root/assets/{heartbeat-config-api-DKqOuQ0V.js → heartbeat-config-api-BVl5VHvL.js} +1 -1
  35. package/dist/gateway/static/root/assets/index-BuFldCsB.css +1 -0
  36. package/dist/gateway/static/root/assets/{index-Bq3Lg4bG.js → index-Y-iqo-gL.js} +95 -86
  37. package/dist/gateway/static/root/assets/{logs-page-B3CwJNBq.js → logs-page-BdH2n7ZW.js} +1 -1
  38. package/dist/gateway/static/root/assets/sessions-page-Vpchzdp-.js +1 -0
  39. package/dist/gateway/static/root/assets/{settings-form-section-CjjEpVYM.js → settings-form-section-Kk1yAGBl.js} +1 -1
  40. package/dist/gateway/static/root/assets/settings-page-KBm0u6Dz.js +3 -0
  41. package/dist/gateway/static/root/assets/skills-page-BjeXXaOn.js +2 -0
  42. package/dist/gateway/static/root/assets/{theme-store-DnwYutiX.js → theme-store-D01dJt95.js} +1 -1
  43. package/dist/gateway/static/root/assets/{utils-DQehHvlm.js → utils-DpTxN4AF.js} +1 -1
  44. package/dist/gateway/static/root/assets/voice-api-key-field-CwO8Cf01.js +1 -0
  45. package/dist/gateway/static/root/index.html +4 -4
  46. package/dist/package.js +1 -1
  47. package/dist/src/agent/agent-instance-gateway.d.ts +50 -0
  48. package/dist/src/agent/agent-instance-gateway.js +1 -0
  49. package/dist/src/agent/agent-manager.d.ts +20 -14
  50. package/dist/src/agent/agent-manager.js +74 -186
  51. package/dist/src/agent/agent-manager.js.map +1 -1
  52. package/dist/src/agent/background-review/coordinator.d.ts +61 -0
  53. package/dist/src/agent/background-review/coordinator.js +120 -0
  54. package/dist/src/agent/background-review/coordinator.js.map +1 -0
  55. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  56. package/dist/src/agent/child-agent-factory.d.ts +14 -0
  57. package/dist/src/agent/child-agent-factory.js +2 -8
  58. package/dist/src/agent/child-agent-factory.js.map +1 -1
  59. package/dist/src/agent/context/workspace-seed.js +3 -3
  60. package/dist/src/agent/embedded/index.d.ts +1 -2
  61. package/dist/src/agent/embedded/index.js +2 -3
  62. package/dist/src/agent/embedded/run-for-session.d.ts +2 -2
  63. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  64. package/dist/src/agent/embedded/runs.d.ts +32 -0
  65. package/dist/src/agent/embedded/runs.js +79 -19
  66. package/dist/src/agent/embedded/runs.js.map +1 -1
  67. package/dist/src/agent/embedded/session-manager-cache.d.ts +14 -0
  68. package/dist/src/agent/embedded/session-manager-cache.js +32 -11
  69. package/dist/src/agent/embedded/session-manager-cache.js.map +1 -1
  70. package/dist/src/agent/embedded/session-runner.d.ts +37 -7
  71. package/dist/src/agent/embedded/session-runner.js +184 -153
  72. package/dist/src/agent/embedded/session-runner.js.map +1 -1
  73. package/dist/src/agent/embedded/session-tool-result-guard.d.ts +57 -9
  74. package/dist/src/agent/embedded/session-tool-result-guard.js +159 -67
  75. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  76. package/dist/src/agent/goals/goal-run-store.js +4 -4
  77. package/dist/src/agent/goals/persistent-goal-service.d.ts +84 -0
  78. package/dist/src/agent/goals/persistent-goal-service.js +139 -0
  79. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -0
  80. package/dist/src/agent/goals/post-turn.js +2 -2
  81. package/dist/src/agent/goals/state.d.ts +1 -1
  82. package/dist/src/agent/goals/state.js.map +1 -1
  83. package/dist/src/agent/image/load-image-media.js +1 -1
  84. package/dist/src/agent/inbound/inbound-loop.d.ts +77 -0
  85. package/dist/src/agent/inbound/inbound-loop.js +226 -0
  86. package/dist/src/agent/inbound/inbound-loop.js.map +1 -0
  87. package/dist/src/agent/inbound/turn-dispatcher.d.ts +80 -0
  88. package/dist/src/agent/inbound/turn-dispatcher.js +138 -0
  89. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -0
  90. package/dist/src/agent/ipc/bus.js +1 -1
  91. package/dist/src/agent/ipc/inbox.js +2 -2
  92. package/dist/src/agent/ipc/socket.js +1 -1
  93. package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -1
  94. package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
  95. package/dist/src/agent/lifecycle/manager.d.ts +1 -1
  96. package/dist/src/agent/lifecycle/manager.js.map +1 -1
  97. package/dist/src/agent/lifecycle/types.d.ts +1 -1
  98. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  99. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  100. package/dist/src/agent/memory/dreaming/events.js +1 -1
  101. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  102. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  103. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  104. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  105. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  106. package/dist/src/agent/memory/dreaming/utils.d.ts +12 -2
  107. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  108. package/dist/src/agent/memory/dreaming/utils.js.map +1 -1
  109. package/dist/src/agent/memory/index.js +3 -3
  110. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  111. package/dist/src/agent/memory/prefetch-coordinator.d.ts +37 -0
  112. package/dist/src/agent/memory/prefetch-coordinator.js +45 -0
  113. package/dist/src/agent/memory/prefetch-coordinator.js.map +1 -0
  114. package/dist/src/agent/messaging/command-handler.d.ts +5 -1
  115. package/dist/src/agent/messaging/command-handler.js +24 -96
  116. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  117. package/dist/src/agent/messaging/index.d.ts +1 -0
  118. package/dist/src/agent/messaging/index.js +2 -1
  119. package/dist/src/agent/messaging/message-router.d.ts +1 -1
  120. package/dist/src/agent/messaging/message-router.js.map +1 -1
  121. package/dist/src/agent/messaging/outbound-coordinator.d.ts +82 -0
  122. package/dist/src/agent/messaging/outbound-coordinator.js +123 -0
  123. package/dist/src/agent/messaging/outbound-coordinator.js.map +1 -0
  124. package/dist/src/agent/models/manager.js +1 -1
  125. package/dist/src/agent/orchestration/agent-event-handler.d.ts +36 -33
  126. package/dist/src/agent/orchestration/agent-event-handler.js +212 -174
  127. package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
  128. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +4 -4
  129. package/dist/src/agent/orchestration/agent-orchestrator.js +4 -8
  130. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  131. package/dist/src/agent/orchestration/index.d.ts +1 -1
  132. package/dist/src/agent/orchestration/index.js +2 -2
  133. package/dist/src/agent/prompt/service-prompt-builder.js +4 -4
  134. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  135. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  136. package/dist/src/agent/sandbox/path-policy.js +1 -1
  137. package/dist/src/agent/service/async-queue.d.ts +20 -0
  138. package/dist/src/agent/service/async-queue.js +53 -0
  139. package/dist/src/agent/service/async-queue.js.map +1 -0
  140. package/dist/src/agent/service/build-direct-message-content.d.ts +2 -2
  141. package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
  142. package/dist/src/agent/service/direct-turn-helpers.d.ts +70 -0
  143. package/dist/src/agent/service/direct-turn-helpers.js +90 -0
  144. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -0
  145. package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -3
  146. package/dist/src/agent/service/process-direct-one-shot.js +17 -34
  147. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  148. package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
  149. package/dist/src/agent/service/process-direct-streaming.js +133 -167
  150. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  151. package/dist/src/agent/service/webchat-tts.d.ts +2 -2
  152. package/dist/src/agent/service/webchat-tts.js +1 -1
  153. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  154. package/dist/src/agent/service.d.ts +62 -167
  155. package/dist/src/agent/service.js +177 -786
  156. package/dist/src/agent/service.js.map +1 -1
  157. package/dist/src/agent/session/index.d.ts +4 -0
  158. package/dist/src/agent/session/index.js +5 -1
  159. package/dist/src/agent/session/session-config-service.d.ts +68 -0
  160. package/dist/src/agent/session/session-config-service.js +172 -0
  161. package/dist/src/agent/session/session-config-service.js.map +1 -0
  162. package/dist/src/agent/session/session-context.d.ts +27 -19
  163. package/dist/src/agent/session/session-context.js +39 -24
  164. package/dist/src/agent/session/session-context.js.map +1 -1
  165. package/dist/src/agent/session/session-hydrator.d.ts +42 -0
  166. package/dist/src/agent/session/session-hydrator.js +66 -0
  167. package/dist/src/agent/session/session-hydrator.js.map +1 -0
  168. package/dist/src/agent/session/session-inspector.d.ts +80 -0
  169. package/dist/src/agent/session/session-inspector.js +119 -0
  170. package/dist/src/agent/session/session-inspector.js.map +1 -0
  171. package/dist/src/agent/session/session-state-bag.d.ts +83 -0
  172. package/dist/src/agent/session/session-state-bag.js +192 -0
  173. package/dist/src/agent/session/session-state-bag.js.map +1 -0
  174. package/dist/src/agent/skills/config.js +1 -1
  175. package/dist/src/agent/skills/hub-hash.js +2 -2
  176. package/dist/src/agent/skills/hub-lock.js +1 -1
  177. package/dist/src/agent/skills/hub-pull.js +2 -2
  178. package/dist/src/agent/skills/index.d.ts +0 -2
  179. package/dist/src/agent/skills/index.js +3 -5
  180. package/dist/src/agent/skills/index.js.map +1 -1
  181. package/dist/src/agent/skills/managed-store.js +1 -1
  182. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -6
  183. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
  184. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +35 -7
  185. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  186. package/dist/src/agent/skills/scanner.js +1 -1
  187. package/dist/src/agent/skills/skill-manage-ops.js +2 -2
  188. package/dist/src/agent/skills/skill-manager.js +1 -1
  189. package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +7 -0
  190. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +37 -0
  191. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  192. package/dist/src/agent/tools/delegate-tool.d.ts +7 -0
  193. package/dist/src/agent/tools/delegate-tool.js +2 -1
  194. package/dist/src/agent/tools/delegate-tool.js.map +1 -1
  195. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  196. package/dist/src/agent/tools/executor.d.ts +34 -15
  197. package/dist/src/agent/tools/executor.js +44 -79
  198. package/dist/src/agent/tools/executor.js.map +1 -1
  199. package/dist/src/agent/tools/factory.d.ts +6 -0
  200. package/dist/src/agent/tools/factory.js +63 -4
  201. package/dist/src/agent/tools/factory.js.map +1 -1
  202. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  203. package/dist/src/agent/tools/send-media.js +1 -1
  204. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  205. package/dist/src/agent/tools/skills-tools.js +1 -1
  206. package/dist/src/agent/tools/tts-tool.js +1 -1
  207. package/dist/src/agent/tools/write.js +1 -1
  208. package/dist/src/agent/workspace-runtime/registry.d.ts +48 -0
  209. package/dist/src/agent/workspace-runtime/registry.js +59 -0
  210. package/dist/src/agent/workspace-runtime/registry.js.map +1 -0
  211. package/dist/src/auth/credentials.js +3 -3
  212. package/dist/src/auth/profiles/store.js +1 -1
  213. package/dist/src/auth/sync-provider-auth.js +1 -1
  214. package/dist/src/browser/cdp-local-launcher.js +4 -3
  215. package/dist/src/browser/cdp-local-launcher.js.map +1 -1
  216. package/dist/src/browser/index.d.ts +1 -0
  217. package/dist/src/browser/index.js +2 -1
  218. package/dist/src/browser/manager.js +3 -2
  219. package/dist/src/browser/manager.js.map +1 -1
  220. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  221. package/dist/src/browser/providers/browser-use.js +2 -1
  222. package/dist/src/browser/providers/browser-use.js.map +1 -1
  223. package/dist/src/browser/providers/browserbase.js +2 -1
  224. package/dist/src/browser/providers/browserbase.js.map +1 -1
  225. package/dist/src/browser/providers/cloakbrowser.js +7 -6
  226. package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
  227. package/dist/src/browser/providers/playwright-doctor.d.ts +2 -0
  228. package/dist/src/browser/providers/playwright-doctor.js +7 -3
  229. package/dist/src/browser/providers/playwright-doctor.js.map +1 -1
  230. package/dist/src/browser/readiness.d.ts +33 -0
  231. package/dist/src/browser/readiness.js +138 -0
  232. package/dist/src/browser/readiness.js.map +1 -0
  233. package/dist/src/browser/stealth.js +2 -2
  234. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  235. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  236. package/dist/src/channels/channel-domain.d.ts +1 -1
  237. package/dist/src/channels/config-helpers.d.ts +1 -1
  238. package/dist/src/channels/config-helpers.js.map +1 -1
  239. package/dist/src/channels/heartbeat-scheduler.d.ts +40 -0
  240. package/dist/src/channels/heartbeat-scheduler.js +94 -0
  241. package/dist/src/channels/heartbeat-scheduler.js.map +1 -0
  242. package/dist/src/channels/lifecycle-supervisor.d.ts +81 -0
  243. package/dist/src/channels/lifecycle-supervisor.js +263 -0
  244. package/dist/src/channels/lifecycle-supervisor.js.map +1 -0
  245. package/dist/src/channels/manager.d.ts +34 -68
  246. package/dist/src/channels/manager.js +107 -477
  247. package/dist/src/channels/manager.js.map +1 -1
  248. package/dist/src/channels/outbound/deliver.d.ts +1 -1
  249. package/dist/src/channels/outbound/deliver.js.map +1 -1
  250. package/dist/src/channels/outbound/persist-store.js +1 -1
  251. package/dist/src/channels/outbound-sender.d.ts +51 -0
  252. package/dist/src/channels/outbound-sender.js +125 -0
  253. package/dist/src/channels/outbound-sender.js.map +1 -0
  254. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  255. package/dist/src/channels/pairing/pairing-service.d.ts +3 -10
  256. package/dist/src/channels/pairing/pairing-service.js.map +1 -1
  257. package/dist/src/channels/pairing/pairing-store.js +2 -2
  258. package/dist/src/channels/pairing/pairing-types.d.ts +15 -0
  259. package/dist/src/channels/pairing/pairing-types.js +1 -0
  260. package/dist/src/channels/plugin-registry.d.ts +22 -0
  261. package/dist/src/channels/plugin-registry.js +44 -0
  262. package/dist/src/channels/plugin-registry.js.map +1 -0
  263. package/dist/src/channels/plugin-types.d.ts +1 -1
  264. package/dist/src/channels/plugins/types.adapters.d.ts +2 -2
  265. package/dist/src/channels/security-helpers.d.ts +1 -1
  266. package/dist/src/channels/security-helpers.js.map +1 -1
  267. package/dist/src/channels/setup-wizard.d.ts +1 -1
  268. package/dist/src/chat-commands/builtins/config.js +2 -2
  269. package/dist/src/chat-commands/context.js +1 -1
  270. package/dist/src/cli/commands/agent/stream-renderer.js +1 -1
  271. package/dist/src/cli/commands/agent/stream-renderer.js.map +1 -1
  272. package/dist/src/cli/commands/agent.js +4 -4
  273. package/dist/src/cli/commands/agent.js.map +1 -1
  274. package/dist/src/cli/commands/browser-cli-helpers.js +2 -1
  275. package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
  276. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  277. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  278. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  279. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  280. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  281. package/dist/src/cli/commands/extension-dev.js +2 -2
  282. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  283. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  284. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  285. package/dist/src/cli/commands/extension-pack.js +1 -1
  286. package/dist/src/cli/commands/gateway/call.js +1 -1
  287. package/dist/src/cli/commands/gateway/call.js.map +1 -1
  288. package/dist/src/cli/commands/gateway/health.js +1 -1
  289. package/dist/src/cli/commands/gateway/health.js.map +1 -1
  290. package/dist/src/cli/commands/gateway/lifecycle-core.d.ts +31 -12
  291. package/dist/src/cli/commands/gateway/lifecycle-core.js +167 -116
  292. package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
  293. package/dist/src/cli/commands/gateway/lifecycle.d.ts +11 -0
  294. package/dist/src/cli/commands/gateway/lifecycle.js +102 -0
  295. package/dist/src/cli/commands/gateway/lifecycle.js.map +1 -0
  296. package/dist/src/cli/commands/gateway/logs.js +1 -1
  297. package/dist/src/cli/commands/gateway/logs.js.map +1 -1
  298. package/dist/src/cli/commands/gateway/probe.js +1 -1
  299. package/dist/src/cli/commands/gateway/probe.js.map +1 -1
  300. package/dist/src/cli/commands/gateway/restart-health.d.ts +12 -0
  301. package/dist/src/cli/commands/gateway/restart-health.js +45 -1
  302. package/dist/src/cli/commands/gateway/restart-health.js.map +1 -1
  303. package/dist/src/cli/commands/gateway/restart.js +3 -3
  304. package/dist/src/cli/commands/gateway/restart.js.map +1 -1
  305. package/dist/src/cli/commands/gateway/run-foreground.d.ts +0 -1
  306. package/dist/src/cli/commands/gateway/run-foreground.js +0 -35
  307. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  308. package/dist/src/cli/commands/gateway/service.js +1 -1
  309. package/dist/src/cli/commands/gateway/service.js.map +1 -1
  310. package/dist/src/cli/commands/gateway/shared.d.ts +3 -0
  311. package/dist/src/cli/commands/gateway/shared.js +54 -0
  312. package/dist/src/cli/commands/gateway/shared.js.map +1 -0
  313. package/dist/src/cli/commands/gateway/status.js +1 -1
  314. package/dist/src/cli/commands/gateway/status.js.map +1 -1
  315. package/dist/src/cli/commands/gateway/stop.js +2 -2
  316. package/dist/src/cli/commands/gateway/stop.js.map +1 -1
  317. package/dist/src/cli/commands/gateway/token.js +1 -1
  318. package/dist/src/cli/commands/gateway/token.js.map +1 -1
  319. package/dist/src/cli/commands/gateway.js +5 -5
  320. package/dist/src/cli/commands/gateway.js.map +1 -1
  321. package/dist/src/cli/commands/image.js +2 -2
  322. package/dist/src/cli/commands/image.js.map +1 -1
  323. package/dist/src/cli/commands/init.js +4 -4
  324. package/dist/src/cli/commands/models.js +1 -1
  325. package/dist/src/cli/commands/models.js.map +1 -1
  326. package/dist/src/cli/commands/onboard/gateway.d.ts +0 -8
  327. package/dist/src/cli/commands/onboard/gateway.js +48 -49
  328. package/dist/src/cli/commands/onboard/gateway.js.map +1 -1
  329. package/dist/src/cli/commands/onboard.js +9 -64
  330. package/dist/src/cli/commands/onboard.js.map +1 -1
  331. package/dist/src/cli/commands/session/utils.js +1 -1
  332. package/dist/src/cli/commands/session/utils.js.map +1 -1
  333. package/dist/src/cli/commands/skills.js +1 -1
  334. package/dist/src/cli/commands/tailscale.js +1 -1
  335. package/dist/src/cli/commands/tailscale.js.map +1 -1
  336. package/dist/src/cli/context.d.ts +20 -0
  337. package/dist/src/cli/context.js +23 -0
  338. package/dist/src/cli/context.js.map +1 -0
  339. package/dist/src/cli/extension-cli-register.js +3 -3
  340. package/dist/src/cli/gateway-run-argv.js +1 -4
  341. package/dist/src/cli/gateway-run-argv.js.map +1 -1
  342. package/dist/src/cli/gateway-run-fast-path.js +1 -1
  343. package/dist/src/cli/gateway-run-fast-path.js.map +1 -1
  344. package/dist/src/cli/index.d.ts +1 -7
  345. package/dist/src/cli/index.js +4 -6
  346. package/dist/src/cli/index.js.map +1 -1
  347. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  348. package/dist/src/config/commands.flags.d.ts +3 -0
  349. package/dist/src/config/commands.flags.js +11 -0
  350. package/dist/src/config/commands.flags.js.map +1 -0
  351. package/dist/src/config/index.d.ts +1 -0
  352. package/dist/src/config/index.js +6 -5
  353. package/dist/src/config/index.js.map +1 -1
  354. package/dist/src/config/loader.js +2 -2
  355. package/dist/src/config/models-json.js +2 -2
  356. package/dist/src/config/profile.js +2 -2
  357. package/dist/src/config/schema.d.ts +11 -4
  358. package/dist/src/config/schema.js +13 -12
  359. package/dist/src/config/schema.js.map +1 -1
  360. package/dist/src/config/workspace-path-helpers.d.ts +15 -0
  361. package/dist/src/config/workspace-path-helpers.js +14 -0
  362. package/dist/src/config/workspace-path-helpers.js.map +1 -0
  363. package/dist/src/cron/executor.js +4 -4
  364. package/dist/src/cron/executor.js.map +1 -1
  365. package/dist/src/cron/persistence.js +1 -1
  366. package/dist/src/cron/run-log-store.js +1 -1
  367. package/dist/src/daemon/index.d.ts +0 -1
  368. package/dist/src/daemon/index.js +1 -2
  369. package/dist/src/daemon/install-plan.js +3 -2
  370. package/dist/src/daemon/install-plan.js.map +1 -1
  371. package/dist/src/daemon/launchd.js +2 -2
  372. package/dist/src/daemon/systemd.js +2 -2
  373. package/dist/src/daemon/types.d.ts +0 -6
  374. package/dist/src/extensions/api.d.ts +1 -1
  375. package/dist/src/extensions/api.js +2 -2
  376. package/dist/src/extensions/api.js.map +1 -1
  377. package/dist/src/extensions/bundle-mcp.js +1 -1
  378. package/dist/src/extensions/discover-extensions.js +1 -1
  379. package/dist/src/extensions/extension-registry-impl.d.ts +51 -0
  380. package/dist/src/extensions/extension-registry-impl.js +117 -0
  381. package/dist/src/extensions/extension-registry-impl.js.map +1 -0
  382. package/dist/src/extensions/health.js +1 -1
  383. package/dist/src/extensions/index.js +3 -2
  384. package/dist/src/extensions/loader.d.ts +3 -43
  385. package/dist/src/extensions/loader.js +3 -110
  386. package/dist/src/extensions/loader.js.map +1 -1
  387. package/dist/src/extensions/lockfile.js +2 -2
  388. package/dist/src/extensions/sdk/index.js +2 -1
  389. package/dist/src/extensions/sdk/index.js.map +1 -1
  390. package/dist/src/extensions/types/events.d.ts +7 -1
  391. package/dist/src/gateway/agents-admin.js +2 -2
  392. package/dist/src/gateway/file-path-classifier.js +2 -2
  393. package/dist/src/gateway/heartbeat/service.js +2 -2
  394. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  395. package/dist/src/gateway/hono/app.js +40 -37
  396. package/dist/src/gateway/hono/app.js.map +1 -1
  397. package/dist/src/gateway/hono/lib/extension-store.js +1 -1
  398. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  399. package/dist/src/gateway/hono/middleware/auth.d.ts +5 -14
  400. package/dist/src/gateway/hono/middleware/auth.js +92 -105
  401. package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
  402. package/dist/src/gateway/hono/middleware/logger.d.ts +5 -1
  403. package/dist/src/gateway/hono/middleware/logger.js +41 -5
  404. package/dist/src/gateway/hono/middleware/logger.js.map +1 -1
  405. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +14 -0
  406. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +62 -0
  407. package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -0
  408. package/dist/src/gateway/hono/oauth.js +1 -1
  409. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +4 -4
  410. package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
  411. package/dist/src/gateway/hono/routes/browser.d.ts +20 -0
  412. package/dist/src/gateway/hono/routes/browser.js +626 -0
  413. package/dist/src/gateway/hono/routes/browser.js.map +1 -0
  414. package/dist/src/gateway/hono/routes/commands-skills.js +13 -13
  415. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  416. package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +18 -0
  417. package/dist/src/gateway/hono/routes/config-patch/agents.js +418 -0
  418. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -0
  419. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +12 -0
  420. package/dist/src/gateway/hono/routes/config-patch/channels.js +186 -0
  421. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -0
  422. package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +18 -0
  423. package/dist/src/gateway/hono/routes/config-patch/gateway.js +264 -0
  424. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -0
  425. package/dist/src/gateway/hono/routes/config-patch/index.d.ts +9 -0
  426. package/dist/src/gateway/hono/routes/config-patch/index.js +6 -0
  427. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +23 -0
  428. package/dist/src/gateway/hono/routes/config-patch/misc.js +139 -0
  429. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -0
  430. package/dist/src/gateway/hono/routes/config-patch/result.d.ts +18 -0
  431. package/dist/src/gateway/hono/routes/config-patch/result.js +13 -0
  432. package/dist/src/gateway/hono/routes/config-patch/result.js.map +1 -0
  433. package/dist/src/gateway/hono/routes/config.js +20 -1764
  434. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  435. package/dist/src/gateway/hono/routes/dreaming.js +2 -3
  436. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  437. package/dist/src/gateway/hono/routes/exposure.js +2 -1
  438. package/dist/src/gateway/hono/routes/exposure.js.map +1 -1
  439. package/dist/src/gateway/hono/routes/host-fs.js +1 -1
  440. package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -5
  441. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  442. package/dist/src/gateway/hono/routes/mcp.js +1 -2
  443. package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
  444. package/dist/src/gateway/hono/routes/models.js +1 -1
  445. package/dist/src/gateway/hono/routes/sessions.js +32 -32
  446. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  447. package/dist/src/gateway/hono/routes/shares.js +4 -4
  448. package/dist/src/gateway/hono/routes/shares.js.map +1 -1
  449. package/dist/src/gateway/hono/routes/tunnel.js +1 -1
  450. package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
  451. package/dist/src/gateway/hono/routes/workspace.js +6 -7
  452. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  453. package/dist/src/gateway/hono/sse.d.ts +1 -0
  454. package/dist/src/gateway/hono/sse.js +3 -2
  455. package/dist/src/gateway/hono/sse.js.map +1 -1
  456. package/dist/src/gateway/index.d.ts +1 -1
  457. package/dist/src/gateway/index.js +4 -2
  458. package/dist/src/gateway/lock.js +3 -3
  459. package/dist/src/gateway/rate-limit/auth-policy.d.ts +34 -0
  460. package/dist/src/gateway/rate-limit/auth-policy.js +49 -0
  461. package/dist/src/gateway/rate-limit/auth-policy.js.map +1 -0
  462. package/dist/src/gateway/rate-limit/buckets.d.ts +63 -0
  463. package/dist/src/gateway/rate-limit/buckets.js +143 -0
  464. package/dist/src/gateway/rate-limit/buckets.js.map +1 -0
  465. package/dist/src/gateway/rate-limit/env-flags.d.ts +13 -0
  466. package/dist/src/gateway/rate-limit/env-flags.js +16 -0
  467. package/dist/src/gateway/rate-limit/env-flags.js.map +1 -0
  468. package/dist/src/gateway/rate-limit/index.d.ts +3 -0
  469. package/dist/src/gateway/rate-limit/index.js +4 -0
  470. package/dist/src/gateway/run-loop.d.ts +1 -1
  471. package/dist/src/gateway/run-loop.js +24 -4
  472. package/dist/src/gateway/run-loop.js.map +1 -1
  473. package/dist/src/gateway/runtime-config.js +2 -1
  474. package/dist/src/gateway/runtime-config.js.map +1 -1
  475. package/dist/src/gateway/security/audit.js +2 -1
  476. package/dist/src/gateway/security/audit.js.map +1 -1
  477. package/dist/src/gateway/security/index.d.ts +0 -1
  478. package/dist/src/gateway/security/index.js +1 -2
  479. package/dist/src/gateway/security/loopback.d.ts +13 -0
  480. package/dist/src/gateway/security/loopback.js +45 -0
  481. package/dist/src/gateway/security/loopback.js.map +1 -0
  482. package/dist/src/gateway/service/agent-runner.d.ts +108 -0
  483. package/dist/src/gateway/service/agent-runner.js +184 -0
  484. package/dist/src/gateway/service/agent-runner.js.map +1 -0
  485. package/dist/src/gateway/service/config-coordinator.d.ts +119 -0
  486. package/dist/src/gateway/service/config-coordinator.js +351 -0
  487. package/dist/src/gateway/service/config-coordinator.js.map +1 -0
  488. package/dist/src/gateway/service/marketplace-service.d.ts +85 -0
  489. package/dist/src/gateway/service/marketplace-service.js +239 -0
  490. package/dist/src/gateway/service/marketplace-service.js.map +1 -0
  491. package/dist/src/gateway/service/run-gateway-agent.js +5 -5
  492. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  493. package/dist/src/gateway/service/sessions-api.d.ts +125 -0
  494. package/dist/src/gateway/service/sessions-api.js +135 -0
  495. package/dist/src/gateway/service/sessions-api.js.map +1 -0
  496. package/dist/src/gateway/service.d.ts +30 -360
  497. package/dist/src/gateway/service.js +122 -904
  498. package/dist/src/gateway/service.js.map +1 -1
  499. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  500. package/dist/src/gateway/workspace-heartbeat-path.js +1 -2
  501. package/dist/src/gateway/workspace-heartbeat-path.js.map +1 -1
  502. package/dist/src/heartbeat/index.js +1 -1
  503. package/dist/src/infra/gateway-process-argv.d.ts +4 -0
  504. package/dist/src/infra/gateway-process-argv.js +26 -0
  505. package/dist/src/infra/gateway-process-argv.js.map +1 -0
  506. package/dist/src/infra/gateway-processes.d.ts +5 -0
  507. package/dist/src/infra/gateway-processes.js +65 -0
  508. package/dist/src/infra/gateway-processes.js.map +1 -0
  509. package/dist/src/infra/rate-limit/failure-limiter.d.ts +50 -0
  510. package/dist/src/infra/rate-limit/failure-limiter.js +100 -0
  511. package/dist/src/infra/rate-limit/failure-limiter.js.map +1 -0
  512. package/dist/src/infra/rate-limit/index.d.ts +5 -0
  513. package/dist/src/infra/rate-limit/index.js +3 -0
  514. package/dist/src/infra/rate-limit/keyed-store.d.ts +34 -0
  515. package/dist/src/infra/rate-limit/keyed-store.js +44 -0
  516. package/dist/src/infra/rate-limit/keyed-store.js.map +1 -0
  517. package/dist/src/infra/rate-limit/rate-limiter.d.ts +39 -0
  518. package/dist/src/infra/rate-limit/rate-limiter.js +65 -0
  519. package/dist/src/infra/rate-limit/rate-limiter.js.map +1 -0
  520. package/dist/src/infra/restart.d.ts +21 -0
  521. package/dist/src/infra/restart.js +122 -0
  522. package/dist/src/infra/restart.js.map +1 -0
  523. package/dist/src/infra/update-check.js +1 -1
  524. package/dist/src/infra/update-lock.js +3 -3
  525. package/dist/src/infra/update-runner.js +1 -1
  526. package/dist/src/infra/update-startup.js +2 -2
  527. package/dist/src/infra/write-file-atomic.js +2 -2
  528. package/dist/src/mcp/channel-bridge.d.ts +0 -6
  529. package/dist/src/mcp/channel-bridge.js +1 -5
  530. package/dist/src/mcp/channel-bridge.js.map +1 -1
  531. package/dist/src/media-shared/http/ssrf-guard.js +1 -1
  532. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  533. package/dist/src/providers/index.js +2 -2
  534. package/dist/src/providers/model-registry.js +1 -1
  535. package/dist/src/session/config-store.js +2 -2
  536. package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
  537. package/dist/src/session/parity/sessions-json-file-read.d.ts +2 -1
  538. package/dist/src/session/parity/sessions-json-file-read.js.map +1 -1
  539. package/dist/src/session/parity/sessions-json-file.js +1 -1
  540. package/dist/src/session/parity/transcript-file-lock.js +2 -2
  541. package/dist/src/session/parity/transcript-paths.js +1 -1
  542. package/dist/src/session/search-index-cache.js +1 -1
  543. package/dist/src/session/search-index.js +1 -1
  544. package/dist/src/session/session-title.js +1 -1
  545. package/dist/src/session/store.js +5 -5
  546. package/dist/src/share/share-rate-limit.d.ts +10 -2
  547. package/dist/src/share/share-rate-limit.js +39 -27
  548. package/dist/src/share/share-rate-limit.js.map +1 -1
  549. package/dist/src/share/share-store.js +3 -3
  550. package/dist/src/tui/backends/embedded-backend.js +16 -12
  551. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  552. package/dist/src/tui/clipboard-image.js +2 -2
  553. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  554. package/dist/src/tui/format-tui-hotkeys.js +1 -1
  555. package/dist/src/tui/theme-manager.js +1 -1
  556. package/dist/src/tui/tui-keybindings-file.js +1 -1
  557. package/dist/src/tui/tui-scoped-models.js +1 -1
  558. package/dist/src/tui/tui-settings.js +1 -1
  559. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  560. package/dist/src/tui/tui.js +1 -2
  561. package/dist/src/tui/tui.js.map +1 -1
  562. package/dist/src/tui/xopc-tui-keybindings.d.ts +0 -1
  563. package/dist/src/tui/xopc-tui-keybindings.js +1 -2
  564. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  565. package/dist/src/tunnel/frpc-binary.js +2 -2
  566. package/dist/src/tunnel/frpc-config.js +1 -1
  567. package/dist/src/tunnel/frpc-extract.js +1 -1
  568. package/dist/src/tunnel/pairing-rate-limit.d.ts +10 -2
  569. package/dist/src/tunnel/pairing-rate-limit.js +19 -15
  570. package/dist/src/tunnel/pairing-rate-limit.js.map +1 -1
  571. package/dist/src/tunnel/tunnel-rate-limit.d.ts +6 -3
  572. package/dist/src/tunnel/tunnel-rate-limit.js +19 -18
  573. package/dist/src/tunnel/tunnel-rate-limit.js.map +1 -1
  574. package/dist/src/tunnel/tunnel-state.js +1 -1
  575. package/dist/src/utils/logger/audit.js +1 -1
  576. package/dist/src/utils/logger/log-store.js +1 -1
  577. package/dist/src/utils/logger/rotation.js +1 -1
  578. package/dist/src/utils/logger/stats.d.ts +1 -1
  579. package/dist/src/voice/tts/audio.js +1 -1
  580. package/dist/src/voice/tts/factory.js +1 -1
  581. package/dist/src/voice/tts/index.js +2 -2
  582. package/dist/src/voice/tts/merge-config.js +1 -1
  583. package/dist/src/voice/tts/providers/edge-speech.js +1 -1
  584. package/dist/src/voice/tts/service.js +1 -1
  585. package/dist/src/voice/tts/service.js.map +1 -1
  586. package/dist/src/voice/tts/speak-core.js +1 -1
  587. package/package.json +10 -5
  588. package/dist/gateway/static/root/assets/agents-DOONGaKz.js +0 -222
  589. package/dist/gateway/static/root/assets/channels-settings-CARdL-ys.js +0 -1
  590. package/dist/gateway/static/root/assets/fetch-BAAh_kXG.js +0 -3
  591. package/dist/gateway/static/root/assets/index-C8yHX-AA.css +0 -1
  592. package/dist/gateway/static/root/assets/sessions-page-BCNnhz9g.js +0 -1
  593. package/dist/gateway/static/root/assets/settings-page-B7_PjiHL.js +0 -3
  594. package/dist/gateway/static/root/assets/skills-page-VrL9TeVF.js +0 -2
  595. package/dist/gateway/static/root/assets/voice-api-key-field-k4FWwgkk.js +0 -1
  596. package/dist/src/agent/embedded/session-raw-append-message.d.ts +0 -11
  597. package/dist/src/agent/embedded/session-raw-append-message.js +0 -15
  598. package/dist/src/agent/embedded/session-raw-append-message.js.map +0 -1
  599. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.d.ts +0 -15
  600. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js +0 -24
  601. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js.map +0 -1
  602. package/dist/src/agent/embedded/session-tool-result-state.d.ts +0 -17
  603. package/dist/src/agent/embedded/session-tool-result-state.js +0 -26
  604. package/dist/src/agent/embedded/session-tool-result-state.js.map +0 -1
  605. package/dist/src/daemon/launchd-restart-handoff.d.ts +0 -25
  606. package/dist/src/daemon/launchd-restart-handoff.js +0 -132
  607. package/dist/src/daemon/launchd-restart-handoff.js.map +0 -1
  608. package/dist/src/gateway/auth-rate-limit.d.ts +0 -71
  609. package/dist/src/gateway/auth-rate-limit.js +0 -192
  610. package/dist/src/gateway/auth-rate-limit.js.map +0 -1
  611. package/dist/src/gateway/restart-handler.d.ts +0 -14
  612. package/dist/src/gateway/restart-handler.js +0 -64
  613. package/dist/src/gateway/restart-handler.js.map +0 -1
  614. package/dist/src/gateway/security/flood-guard.d.ts +0 -28
  615. package/dist/src/gateway/security/flood-guard.js +0 -42
  616. package/dist/src/gateway/security/flood-guard.js.map +0 -1
  617. package/dist/src/infra/rate-limit.d.ts +0 -38
  618. package/dist/src/infra/rate-limit.js +0 -60
  619. package/dist/src/infra/rate-limit.js.map +0 -1
  620. package/dist/src/infra/restart-intent.d.ts +0 -13
  621. package/dist/src/infra/restart-intent.js +0 -40
  622. package/dist/src/infra/restart-intent.js.map +0 -1
  623. package/dist/src/infra/restart-sentinel.d.ts +0 -23
  624. package/dist/src/infra/restart-sentinel.js +0 -75
  625. package/dist/src/infra/restart-sentinel.js.map +0 -1
  626. package/skills/creative/canvas-design/LICENSE.txt +0 -202
  627. package/skills/creative/canvas-design/SKILL-zh.md +0 -130
  628. package/skills/creative/canvas-design/SKILL.md +0 -130
  629. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
  630. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  631. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  632. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
  633. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  634. package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
  635. package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  636. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  637. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
  638. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  639. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  640. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  641. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
  642. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  643. package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
  644. package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  645. package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
  646. package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  647. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  648. package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
  649. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  650. package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
  651. package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  652. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  653. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
  654. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  655. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  656. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  657. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  658. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  659. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  660. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  661. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  662. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
  663. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  664. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  665. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  666. package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
  667. package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  668. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  669. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
  670. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  671. package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  672. package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  673. package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
  674. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
  675. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  676. package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  677. package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  678. package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  679. package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
  680. package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  681. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  682. package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
  683. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  684. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
  685. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  686. package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  687. package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
  688. package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  689. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  690. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
  691. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
  692. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  693. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  694. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
  695. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  696. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
  697. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  698. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  699. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
  700. package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  701. package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
  702. package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  703. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  704. package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  705. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  706. package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
  707. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  708. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
  709. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
@@ -1,23 +1,17 @@
1
+ import { createLogger } from "../utils/logger/index.js";
2
+ import { init_logger } from "../utils/logger.js";
1
3
  import { init_agent_scope, resolveAgentHomeDir, resolveAgentProfileDir, resolveDefaultAgentId } from "./agent-scope.js";
2
4
  import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
3
5
  import { applyConfigOverrides } from "../config/runtime-overrides.js";
4
- import { init_session_key, parseSessionKey } from "../routing/session-key.js";
5
6
  import { extractProfileAgentId, resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
6
- import { runWithLogContext, updateAsyncLogContext } from "../utils/logger/context.js";
7
- import { createLogger } from "../utils/logger/index.js";
8
- import { init_logger } from "../utils/logger.js";
9
7
  import { extractTextContent } from "./context/workspace.js";
10
8
  import { onSessionTranscriptUpdate } from "../session/transcript-events.js";
11
9
  import { AgentManager } from "./agent-manager.js";
12
- import { MessageBusShutdownError } from "../infra/bus/queue.js";
13
- import "../infra/bus/index.js";
14
10
  import { persistInboundAttachmentsToWorkspace } from "../channels/attachments/inbound-persist.js";
15
11
  import { maybeAutoTitleSessionStore } from "../session/session-title.js";
16
12
  import { SessionStore } from "../session/store.js";
17
13
  import { SessionConfigStore } from "../session/config-store.js";
18
- import { normalizeReasoningLevel, normalizeThinkLevel } from "./transcript/thinking-types.js";
19
- import { resolveEffectiveReasoningLevel, resolveEffectiveThinkingLevel } from "../session/thinking-resolve.js";
20
- import { effectiveWorkspacePathForSession, normalizeWorkingDirectoryInput } from "../session/session-workspace.js";
14
+ import { effectiveWorkspacePathForSession } from "../session/session-workspace.js";
21
15
  import "../session/index.js";
22
16
  import { ExtensionHookRunner } from "../extensions/hooks.js";
23
17
  import "../extensions/index.js";
@@ -42,43 +36,43 @@ import { CompactionLifecycleHandler } from "./lifecycle/handlers/compaction.js";
42
36
  import { MessageRouter } from "./messaging/message-router.js";
43
37
  import { CommandHandler } from "./messaging/command-handler.js";
44
38
  import { StreamManager } from "./messaging/stream-manager.js";
39
+ import { OutboundCoordinator } from "./messaging/outbound-coordinator.js";
45
40
  import "./messaging/index.js";
41
+ import { InboundLoop } from "./inbound/inbound-loop.js";
42
+ import { TurnDispatcher } from "./inbound/turn-dispatcher.js";
46
43
  import { SessionContextManager } from "./session/session-context.js";
47
44
  import { SessionLifecycleManager } from "./session/session-lifecycle.js";
45
+ import { SessionStateBag } from "./session/session-state-bag.js";
46
+ import { SessionConfigService } from "./session/session-config-service.js";
47
+ import { SessionHydrator } from "./session/session-hydrator.js";
48
+ import { SessionInspector } from "./session/session-inspector.js";
48
49
  import "./session/index.js";
49
- import { inboundMessageLogRequestId } from "./service-inbound-utils.js";
50
50
  import { AgentOrchestrator } from "./orchestration/agent-orchestrator.js";
51
51
  import { AgentEventHandler } from "./orchestration/agent-event-handler.js";
52
52
  import "./orchestration/index.js";
53
53
  import { FeedbackCoordinator } from "./feedback/feedback-coordinator.js";
54
54
  import "./feedback/index.js";
55
- import { runProcessDirectStreaming } from "./service/process-direct-streaming.js";
56
- import { handlePersistentGoalPostTurn } from "./goals/post-turn.js";
55
+ import { PersistentGoalService } from "./goals/persistent-goal-service.js";
57
56
  import { reconcileManagedDreamingCronJobs } from "./service/reconcile-dreaming-cron.js";
58
57
  import { parseOutboundSessionKey } from "./service/parse-outbound-session-key.js";
59
- import { runBtwQuery } from "./service/btw-query.js";
60
- import { formatSessionContextReport } from "./service/session-context-report.js";
61
- import { buildDirectUserMessageContent } from "./service/build-direct-message-content.js";
62
- import { maybeEmitWebchatTts } from "./service/webchat-tts.js";
63
- import { runProcessDirect } from "./service/process-direct-one-shot.js";
64
- import { shouldSilence } from "../heartbeat/tokens.js";
65
- import { createTypingController } from "./lifecycle/typing.js";
66
58
  import { cleanTrailingErrors } from "./memory/message-sanitizer.js";
67
59
  import { tryApplySessionTranscriptHygiene } from "./transcript/transcript-hygiene.js";
68
- import { join } from "node:path";
69
60
  import { existsSync, readFileSync } from "node:fs";
70
- import { mkdir } from "node:fs/promises";
61
+ import { join } from "node:path";
71
62
  //#region src/agent/service.ts
72
63
  init_schema();
73
64
  init_logger();
74
- init_session_key();
75
65
  init_agent_scope();
76
66
  const log = createLogger("AgentService");
77
67
  var AgentService = class {
68
+ /**
69
+ * Persistent transcript + session-metadata store. Public so the gateway/TUI
70
+ * can read sessions, delete them, etc. without forcing every CRUD-style
71
+ * operation through a delegation method on `AgentService`.
72
+ */
78
73
  sessionStore;
79
74
  sessionConfigStore;
80
75
  hookRunner;
81
- running = false;
82
76
  agentId;
83
77
  workspaceDir;
84
78
  channelManagerRef = null;
@@ -100,25 +94,59 @@ var AgentService = class {
100
94
  messageRouter;
101
95
  commandHandler;
102
96
  streamManager;
97
+ /**
98
+ * Outbound pipeline: typing controller, silence guard, final response publish,
99
+ * extension `message_sending`/`message_sent` hooks, post-turn `webchat_turn_complete`
100
+ * event. Public so the gateway / channels can drive it directly.
101
+ */
102
+ outboundCoordinator;
103
+ inboundLoop;
104
+ /**
105
+ * Direct-turn entry points: `processDirect` (one-shot), `processDirectStreaming`
106
+ * (SSE generator), webchat steering and SSE injection. Public so the gateway,
107
+ * TUI, CLI, and cron jobs do not need to thread every call through `AgentService`.
108
+ */
109
+ turnDispatcher;
110
+ /**
111
+ * `/goal` runtime: continuation scheduling, persistent-goal API factory,
112
+ * stream-outcome state, post-turn verdict. Public so the gateway can wire
113
+ * the webchat continuation scheduler and read stream outcomes directly.
114
+ */
115
+ persistentGoals;
116
+ /**
117
+ * Per-session config writes (model / thinking / reasoning / working directory).
118
+ * Public so REST endpoints and CLI flows can hit it without going through a
119
+ * monolithic patch entrypoint on `AgentService`.
120
+ */
121
+ sessionConfig;
122
+ /**
123
+ * Hydration — read persisted per-session config and apply it to the runtime
124
+ * (AgentManager / ModelManager). The mirror image of `sessionConfig`: writes
125
+ * go through `sessionConfig`, reads-into-runtime go through `sessionHydrator`.
126
+ */
127
+ sessionHydrator;
128
+ /**
129
+ * Read-only introspection (compaction, /context report, /btw, contextUsage,
130
+ * agentConfig view). Public so REST endpoints and CLI flows can query a
131
+ * session's view without going through delegating methods on `AgentService`.
132
+ */
133
+ sessionInspector;
103
134
  sessionContextManager;
104
135
  sessionLifecycleManager;
105
136
  agentOrchestrator;
106
137
  agentEventHandler;
107
138
  feedbackCoordinator;
108
139
  agentManager;
109
- /** Webchat SSE queue pushers for `clarify_request` and similar mid-turn UI events. */
110
- webchatSseEnqueueBySession = /* @__PURE__ */ new Map();
111
- embeddedStreamTextBySession = /* @__PURE__ */ new Map();
112
- lastAssistantPlainTextBySession = /* @__PURE__ */ new Map();
113
- /** Gateway: drain `processDirectStreaming` for webchat continuations (Hermes FIFO-style). */
114
- persistentGoalWebchatContinuationScheduler;
115
- directStreamOutcomeBySession = /* @__PURE__ */ new Map();
116
- /** Concurrent inbound / direct-stream turns per session (Hermes-style /goal mid-flight guard). */
117
- inboundTurnDepthBySession = /* @__PURE__ */ new Map();
140
+ /**
141
+ * Unified per-session state container (replaces six ad-hoc Maps). Owns webchat
142
+ * publishers, last assistant text, embedded stream buffer, persistent-goal stream
143
+ * outcomes, concurrent-turn depth, and event-listener unsubscribers; runs a TTL
144
+ * sweep for slots that have no explicit owner.
145
+ */
146
+ sessionState = new SessionStateBag();
118
147
  /** Gateway: notify UI after direct `SessionStore.updateMetadata` (no SessionManager emit). */
119
148
  onSessionMetadataUpdated;
120
149
  onSessionTranscriptUpdated;
121
- sessionUnsubscribers = /* @__PURE__ */ new Map();
122
150
  effectiveAppConfig() {
123
151
  const base = this.config.config;
124
152
  return base ? applyConfigOverrides(base) : void 0;
@@ -196,8 +224,13 @@ var AgentService = class {
196
224
  selfVerifyMiddleware: this.selfVerifyMiddleware,
197
225
  systemReminder: this.systemReminder,
198
226
  toolUsageAnalyzer: this.toolUsageAnalyzer,
199
- errorPatternMatcher: this.errorPatternMatcher,
200
- modelManager: this.modelManager
227
+ errorPatternMatcher: this.errorPatternMatcher
228
+ });
229
+ this.sessionHydrator = new SessionHydrator({
230
+ sessionConfigStore: this.sessionConfigStore,
231
+ agentManager: this.agentManager,
232
+ modelManager: this.modelManager,
233
+ getConfig: () => this.effectiveAppConfig()
201
234
  });
202
235
  this.agentOrchestrator = new AgentOrchestrator({
203
236
  agentManager: this.agentManager,
@@ -206,7 +239,7 @@ var AgentService = class {
206
239
  eventHandler: this.agentEventHandler,
207
240
  feedbackCoordinator: this.feedbackCoordinator,
208
241
  sessionConfigStore: this.sessionConfigStore,
209
- hydrateSessionWorkspaceFromStore: (sessionKey) => this.hydrateSessionWorkspaceFromStore(sessionKey),
242
+ sessionHydrator: this.sessionHydrator,
210
243
  getConfig: () => this.effectiveAppConfig(),
211
244
  getThinkingDefault: () => this.effectiveAppConfig()?.agents?.defaults?.thinkingDefault,
212
245
  getThinkingDefaultForSession: (sessionKey) => this.agentManager.getThinkingDefaultForSession(sessionKey),
@@ -218,14 +251,13 @@ var AgentService = class {
218
251
  const ctx = this.sessionContextManager.getContext();
219
252
  if (!ctx || ctx.sessionKey !== sessionKey) return;
220
253
  if (event.type === "token") {
221
- const next = (this.embeddedStreamTextBySession.get(sessionKey) ?? "") + event.content;
222
- this.embeddedStreamTextBySession.set(sessionKey, next);
254
+ const next = this.sessionState.appendEmbeddedStreamText(sessionKey, event.content);
223
255
  this.streamManager.update(next);
224
256
  }
225
257
  },
226
258
  onEmbeddedTurnComplete: (sessionKey, text) => {
227
- if (text?.trim()) this.lastAssistantPlainTextBySession.set(sessionKey, text.trim());
228
- this.embeddedStreamTextBySession.delete(sessionKey);
259
+ if (text) this.sessionState.setLastAssistantText(sessionKey, text);
260
+ this.sessionState.clearEmbeddedStreamText(sessionKey);
229
261
  }
230
262
  });
231
263
  this.messageRouter = new MessageRouter();
@@ -234,7 +266,7 @@ var AgentService = class {
234
266
  bus,
235
267
  sessionStore: this.sessionStore,
236
268
  sessionConfigStore: this.sessionConfigStore,
237
- getPersistentGoalApisForCommand: (routing) => this.getPersistentGoalApisForCommand(routing),
269
+ getPersistentGoalApisForCommand: (routing) => this.persistentGoals.buildApisForRouting(routing),
238
270
  applySessionThinkingLevel: (sessionKey, level) => {
239
271
  this.agentManager.setThinkingLevel(sessionKey, level);
240
272
  },
@@ -247,11 +279,93 @@ var AgentService = class {
247
279
  await this.streamManager.abort();
248
280
  this.agentOrchestrator.abort(sessionKey);
249
281
  },
250
- compactSession: (sessionKey, options) => this.compactSession(sessionKey, options),
251
- btwQuery: (sessionKey, question) => this.btwQuery(sessionKey, question),
252
- getSessionContextReport: (sessionKey, mode) => this.getSessionContextReport(sessionKey, mode)
282
+ compactSession: (sessionKey, options) => this.sessionInspector.compact(sessionKey, options),
283
+ btwQuery: (sessionKey, question) => this.sessionInspector.btwQuery(sessionKey, question),
284
+ getSessionContextReport: (sessionKey, mode) => this.sessionInspector.report(sessionKey, mode)
253
285
  });
254
286
  this.sessionLifecycleManager = new SessionLifecycleManager(this.sessionStore, this.sessionTracker, this.lifecycleManager);
287
+ this.persistentGoals = new PersistentGoalService({
288
+ bus,
289
+ sessionStore: this.sessionStore,
290
+ modelManager: this.modelManager,
291
+ sessionState: this.sessionState,
292
+ getConfig: () => this.effectiveAppConfig(),
293
+ getResolvedWorkspaceForSession: (sk) => this.agentManager.getResolvedWorkspaceForSession(sk),
294
+ onSessionMetadataUpdated: this.onSessionMetadataUpdated,
295
+ notifyWebchatTranscriptAppend: (sk, text) => this.turnDispatcher.notifyWebchatTranscriptAppend(sk, text)
296
+ });
297
+ this.sessionConfig = new SessionConfigService({
298
+ sessionStore: this.sessionStore,
299
+ sessionConfigStore: this.sessionConfigStore,
300
+ modelManager: this.modelManager,
301
+ agentManager: this.agentManager,
302
+ getConfig: () => this.effectiveAppConfig()
303
+ });
304
+ this.sessionInspector = new SessionInspector({
305
+ sessionStore: this.sessionStore,
306
+ sessionConfigStore: this.sessionConfigStore,
307
+ modelManager: this.modelManager,
308
+ agentManager: this.agentManager,
309
+ sessionHydrator: this.sessionHydrator,
310
+ getConfig: () => this.effectiveAppConfig(),
311
+ getContextWindow: () => this.getContextWindow()
312
+ });
313
+ this.outboundCoordinator = new OutboundCoordinator({
314
+ bus,
315
+ hookHandler: this.hookHandler,
316
+ streamManager: this.streamManager,
317
+ getConfig: () => this.effectiveAppConfig(),
318
+ getLastAssistantPlainText: (sk) => this.getLastAssistantPlainText(sk),
319
+ runPersistentGoalPostTurn: (payload) => this.persistentGoals.runPostTurn(payload)
320
+ });
321
+ this.turnDispatcher = new TurnDispatcher({
322
+ log,
323
+ agentManager: this.agentManager,
324
+ sessionStore: this.sessionStore,
325
+ modelManager: this.modelManager,
326
+ sessionConfigStore: this.sessionConfigStore,
327
+ sessionState: this.sessionState,
328
+ commandHandler: this.commandHandler,
329
+ getConfig: () => this.effectiveAppConfig(),
330
+ requireConfig: () => {
331
+ const c = this.config.config;
332
+ if (!c) throw new Error("AgentService requires config.config");
333
+ return c;
334
+ },
335
+ parseSessionKey: (sk) => this.parseSessionKey(sk),
336
+ initSessionContext: (sk, channel, chatId) => this.initSessionContext(sk, channel, chatId),
337
+ sessionHydrator: this.sessionHydrator,
338
+ attachmentRootsForSession: (sk) => this.attachmentRootsForSession(sk),
339
+ prepareInboundAttachments: (sk, att) => this.prepareInboundAttachments(sk, att),
340
+ enqueueMaybeAutoTitleAfterPersist: (sk) => this.enqueueMaybeAutoTitleAfterPersist(sk),
341
+ endDirectRequestContext: () => this.endDirectRequestContext(),
342
+ onSessionTranscriptUpdated: this.onSessionTranscriptUpdated
343
+ });
344
+ this.inboundLoop = new InboundLoop({
345
+ log,
346
+ agentId: this.agentId,
347
+ bus,
348
+ hookHandler: this.hookHandler,
349
+ messageRouter: this.messageRouter,
350
+ commandHandler: this.commandHandler,
351
+ sessionContextManager: this.sessionContextManager,
352
+ feedbackCoordinator: this.feedbackCoordinator,
353
+ agentManager: this.agentManager,
354
+ sessionLifecycleManager: this.sessionLifecycleManager,
355
+ agentOrchestrator: this.agentOrchestrator,
356
+ outboundCoordinator: this.outboundCoordinator,
357
+ streamManager: this.streamManager,
358
+ sessionState: this.sessionState,
359
+ sessionStore: this.sessionStore,
360
+ modelManager: this.modelManager,
361
+ setupSessionEventHandling: (sk) => this.setupSessionEventHandling(sk),
362
+ sessionHydrator: this.sessionHydrator,
363
+ getLastAssistantPlainText: (sk) => this.getLastAssistantPlainText(sk),
364
+ checkAndCompact: (sk, msgs) => this.checkAndCompact(sk, msgs),
365
+ enqueueMaybeAutoTitleAfterPersist: (sk) => this.enqueueMaybeAutoTitleAfterPersist(sk),
366
+ getConfig: () => this.effectiveAppConfig(),
367
+ setStreamHandle: (handle) => this.setStreamHandle(handle)
368
+ });
255
369
  if (!!!process.env.ELECTRON_RUN_AS_NODE) {
256
370
  process.on("SIGINT", () => this.dispose());
257
371
  process.on("SIGTERM", () => this.dispose());
@@ -364,6 +478,7 @@ var AgentService = class {
364
478
  setChannelManager(channelManager) {
365
479
  this.modelManager.setChannelManager(channelManager);
366
480
  this.channelManagerRef = channelManager;
481
+ this.inboundLoop.setChannelManager(channelManager);
367
482
  }
368
483
  /**
369
484
  * Apply config after save or hot reload so the default model updates without restarting the gateway.
@@ -397,22 +512,12 @@ var AgentService = class {
397
512
  if (this.agentManager.setModelForSession(sessionKey, modelId)) this.sessionTracker.touchSession(sessionKey);
398
513
  return true;
399
514
  }
400
- async clearSessionModelOverride(sessionKey) {
401
- this.modelManager.clearSessionModelOverride(sessionKey);
402
- await this.sessionConfigStore.update(sessionKey, { modelOverride: void 0 });
403
- const agent = this.agentManager.getAgent(sessionKey);
404
- if (agent) await this.modelManager.applyModelForSession(agent, sessionKey);
405
- }
406
515
  /**
407
516
  * Clears per-session model override so the next turn uses the configured agent default
408
517
  * (e.g. cron isolated job with no explicit model).
409
518
  */
410
519
  async resetSessionModelToAgentDefault(sessionKey) {
411
- await this.clearSessionModelOverride(sessionKey);
412
- }
413
- async hydrateSessionModelFromStore(sessionKey) {
414
- const cfg = await this.sessionConfigStore.get(sessionKey);
415
- if (cfg?.modelOverride) await this.modelManager.switchModelForSession(sessionKey, cfg.modelOverride);
520
+ await this.sessionConfig.clearModelOverride(sessionKey);
416
521
  }
417
522
  setStreamHandle(handle) {
418
523
  this.streamManager.setHandle(handle);
@@ -424,145 +529,18 @@ var AgentService = class {
424
529
  }
425
530
  /** Last assistant visible plain text for a session (e.g. after a webchat stream). */
426
531
  getLastAssistantPlainText(sessionKey) {
427
- return this.lastAssistantPlainTextBySession.get(sessionKey) ?? this.agentManager.getLastAssistantContent(sessionKey) ?? "";
428
- }
429
- /** Gateway only: webchat continuations bypass the bus and reuse `runGatewayAgent`. */
430
- setPersistentGoalWebchatContinuationScheduler(fn) {
431
- this.persistentGoalWebchatContinuationScheduler = fn;
532
+ return this.sessionState.getLastAssistantText(sessionKey) ?? this.agentManager.getLastAssistantContent(sessionKey) ?? "";
432
533
  }
433
534
  beginInboundTurn(sessionKey) {
434
- this.inboundTurnDepthBySession.set(sessionKey, (this.inboundTurnDepthBySession.get(sessionKey) ?? 0) + 1);
535
+ this.sessionState.beginInboundTurn(sessionKey);
435
536
  }
436
537
  endInboundTurn(sessionKey) {
437
- const n = (this.inboundTurnDepthBySession.get(sessionKey) ?? 1) - 1;
438
- if (n <= 0) this.inboundTurnDepthBySession.delete(sessionKey);
439
- else this.inboundTurnDepthBySession.set(sessionKey, n);
538
+ this.sessionState.endInboundTurn(sessionKey);
440
539
  }
441
540
  getInboundTurnDepth(sessionKey) {
442
- return this.inboundTurnDepthBySession.get(sessionKey) ?? 0;
443
- }
444
- schedulePersistentGoalContinuation(sessionKey, message, routing) {
445
- if (parseSessionKey(sessionKey)?.source === "webchat" && this.persistentGoalWebchatContinuationScheduler) {
446
- this.persistentGoalWebchatContinuationScheduler(sessionKey, message);
447
- return;
448
- }
449
- queueMicrotask(() => {
450
- this.bus.publishInbound({
451
- channel: routing.channel,
452
- chat_id: routing.chatId,
453
- sender_id: "persistent-goal",
454
- content: message,
455
- metadata: {
456
- sessionKey,
457
- ...routing.inboundMetadata
458
- }
459
- }).catch((err) => {
460
- log.warn({
461
- err,
462
- sessionKey
463
- }, "Persistent goal: publishInbound failed");
464
- });
465
- });
466
- }
467
- getPersistentGoalApisForCommand(routing) {
468
- return {
469
- getSessionMetadata: (k) => this.sessionStore.getMetadata(k),
470
- updateSessionMetadata: async (k, u) => {
471
- await this.sessionStore.updateMetadata(k, u);
472
- this.onSessionMetadataUpdated?.(k);
473
- },
474
- loadMessages: (k) => this.sessionStore.loadMessages(k),
475
- saveMessages: (k, m) => this.sessionStore.saveMessages(k, m),
476
- appendAssistantReceipt: async (k, text) => {
477
- const trimmed = text.trim();
478
- if (!trimmed) return;
479
- const { absPath } = await this.sessionStore.resolveTranscriptPath(k);
480
- const workspaceDir = this.agentManager.getResolvedWorkspaceForSession(k);
481
- const { appendPiTranscriptMessage } = await import("../session/parity/jsonl-transcript-io.js");
482
- await appendPiTranscriptMessage({
483
- absPath,
484
- cwd: workspaceDir,
485
- message: {
486
- role: "assistant",
487
- content: [{
488
- type: "text",
489
- text: trimmed
490
- }],
491
- timestamp: Date.now()
492
- },
493
- sessionKey: k
494
- });
495
- this.notifyWebchatTranscriptAppend(k, trimmed);
496
- },
497
- scheduleContinuation: (sk, msg) => {
498
- this.schedulePersistentGoalContinuation(sk, msg, {
499
- channel: routing.channel,
500
- chatId: routing.chatId,
501
- inboundMetadata: routing.inboundMetadata
502
- });
503
- },
504
- inboundConcurrentDepth: (sk) => this.getInboundTurnDepth(sk)
505
- };
506
- }
507
- recordPersistentGoalStreamOutcome(sessionKey, outcome) {
508
- this.directStreamOutcomeBySession.set(sessionKey, outcome);
509
- }
510
- takePersistentGoalStreamOutcome(sessionKey) {
511
- const v = this.directStreamOutcomeBySession.get(sessionKey);
512
- this.directStreamOutcomeBySession.delete(sessionKey);
513
- return v;
514
- }
515
- /**
516
- * After any assistant-visible turn (webchat direct stream or bus-driven channels): extension hook + built-in `/goal` post-turn.
517
- */
518
- async emitSessionTurnComplete(payload) {
519
- await this.hookHandler.triggerWithSessionKey(payload.sessionKey, "webchat_turn_complete", {
520
- sessionKey: payload.sessionKey,
521
- channel: payload.channel,
522
- chatId: payload.chatId,
523
- inboundUserText: payload.inboundUserText,
524
- assistantPlainText: payload.assistantPlainText,
525
- aborted: payload.aborted,
526
- ...payload.streamError !== void 0 ? { streamError: payload.streamError } : {}
527
- });
528
- const apis = this.getPersistentGoalApisForCommand({
529
- sessionKey: payload.sessionKey,
530
- channel: payload.channel,
531
- chatId: payload.chatId,
532
- inboundMetadata: payload.outboundMetadata
533
- });
534
- const publishVerdict = !(parseSessionKey(payload.sessionKey)?.source === "webchat") && payload.channel !== "cli" ? async (text) => {
535
- await this.bus.publishOutbound({
536
- channel: payload.channel,
537
- chat_id: payload.chatId,
538
- content: text,
539
- type: "message",
540
- metadata: {
541
- accountId: payload.outboundMetadata?.accountId,
542
- threadId: payload.outboundMetadata?.threadId
543
- }
544
- });
545
- } : void 0;
546
- let runtimeSessionModelRef;
547
- try {
548
- runtimeSessionModelRef = this.modelManager.getModelForSession(payload.sessionKey);
549
- } catch {
550
- runtimeSessionModelRef = void 0;
551
- }
552
- await handlePersistentGoalPostTurn({
553
- apis,
554
- sessionKey: payload.sessionKey,
555
- assistantPlainText: payload.assistantPlainText,
556
- aborted: payload.aborted,
557
- ...payload.streamError !== void 0 ? { streamError: payload.streamError } : {},
558
- skipPersistentGoalPostTurn: payload.skipPersistentGoalPostTurn ?? false,
559
- config: this.effectiveAppConfig(),
560
- runtimeSessionModelRef,
561
- publishVerdictToChannel: publishVerdict
562
- });
541
+ return this.sessionState.getInboundTurnDepth(sessionKey);
563
542
  }
564
543
  async start() {
565
- this.running = true;
566
544
  await this.sessionConfigStore.initialize();
567
545
  await this.hookHandler.trigger("gateway_start", {
568
546
  port: 0,
@@ -576,27 +554,10 @@ var AgentService = class {
576
554
  }, `Dreaming cron reconcile failed: ${em}`);
577
555
  });
578
556
  log.debug("Agent service started");
579
- await this.hookHandler.trigger("session_start", { sessionId: this.agentId });
580
- while (this.running) try {
581
- const msg = await this.bus.consumeInbound();
582
- await this.handleInboundMessage(msg);
583
- } catch (error) {
584
- if (error instanceof MessageBusShutdownError) break;
585
- const em = error instanceof Error ? error.message : String(error);
586
- log.error({
587
- err: error,
588
- errorMessage: em,
589
- phase: "inbound_consume"
590
- }, `Agent loop failed (will retry in 1s): ${em}`);
591
- await new Promise((resolve) => setTimeout(resolve, 1e3));
592
- }
593
- await this.hookHandler.trigger("session_end", {
594
- sessionId: this.agentId,
595
- messageCount: 0
596
- });
557
+ await this.inboundLoop.start();
597
558
  }
598
559
  stop() {
599
- this.running = false;
560
+ this.inboundLoop.stop();
600
561
  this.agentManager.dispose();
601
562
  this.dispose();
602
563
  this.hookHandler.trigger("gateway_stop", { reason: "stopped" });
@@ -671,7 +632,7 @@ var AgentService = class {
671
632
  channel,
672
633
  chatId
673
634
  });
674
- this.sessionContextManager.setContext(context);
635
+ this.sessionContextManager.enter(context);
675
636
  this.feedbackCoordinator.setContext(context);
676
637
  this.agentManager.getOrCreateAgent(sessionKey);
677
638
  this.setupSessionEventHandling(sessionKey);
@@ -686,43 +647,19 @@ var AgentService = class {
686
647
  return persistInboundAttachmentsToWorkspace(resolveAgentHomeDir(cfg, extractProfileAgentId(sessionKey, cfg)), sessionKey, attachments);
687
648
  }
688
649
  endDirectRequestContext() {
689
- this.sessionContextManager.clearContext();
690
650
  this.feedbackCoordinator.clearContext();
691
651
  this.contextMiddleware.onResponse();
692
652
  }
693
- /** Full session snapshot (metadata + API-shaped messages), e.g. embedded TUI history. */
694
- async loadSessionDetail(sessionKey) {
695
- return this.sessionStore.get(sessionKey);
696
- }
697
- /** Session list for TUI picker (embedded / local). */
698
- async listSessionsForUi(limit = 200) {
699
- return (await this.sessionStore.list({
700
- limit,
701
- sortBy: "updatedAt",
702
- sortOrder: "desc"
703
- })).items;
704
- }
705
- async deleteSessionKey(key) {
706
- return this.sessionStore.deleteSession(key);
707
- }
708
- async renameSessionKey(key, name) {
709
- await this.sessionStore.updateMetadata(key, { name: name.trim() });
710
- }
653
+ /**
654
+ * Reset a session's transcript and drop the in-memory agent so the next turn
655
+ * reloads from disk. Combines two collaborators (sessionStore + agentManager)
656
+ * so it stays on `AgentService`; pure sessionStore reads should use
657
+ * `agentService.sessionStore.*` directly.
658
+ */
711
659
  async clearSessionMessages(key) {
712
660
  await this.sessionStore.saveMessages(key, []);
713
661
  this.agentManager.removeAgent(key);
714
662
  }
715
- async compactSession(sessionKey, options) {
716
- const messages = await this.sessionStore.load(sessionKey);
717
- const contextWindow = this.getContextWindow();
718
- const result = await this.sessionStore.compact(sessionKey, messages, contextWindow, options?.instructions, options?.force ?? true);
719
- if (result.compacted) this.agentManager.removeAgent(sessionKey);
720
- log.info({
721
- sessionKey,
722
- result
723
- }, "Manual compaction complete");
724
- return result;
725
- }
726
663
  /**
727
664
  * Drop in-memory agent so the next turn reloads transcript from disk (e.g. after checkpoint restore).
728
665
  */
@@ -730,234 +667,15 @@ var AgentService = class {
730
667
  this.agentManager.removeAgent(sessionKey);
731
668
  }
732
669
  /**
733
- * One-shot LLM answer for /btw: uses transcript as background only; does not persist to session.
734
- */
735
- async btwQuery(sessionKey, question) {
736
- return runBtwQuery({
737
- sessionKey,
738
- question,
739
- sessionStore: this.sessionStore,
740
- modelForSession: this.modelManager.getModelForSession(sessionKey),
741
- log
742
- });
743
- }
744
- /** Markdown or JSON summary for /context (prompt assembly is approximated from config + transcript stats). */
745
- async getSessionContextReport(sessionKey, mode) {
746
- const messages = await this.sessionStore.load(sessionKey);
747
- const cw = this.getContextWindow();
748
- const stats = this.getSessionStats(sessionKey, messages);
749
- const cfg = this.effectiveAppConfig() ?? this.config.config;
750
- const model = this.modelManager.getModelForSession(sessionKey);
751
- const workspace = effectiveWorkspacePathForSession(cfg, sessionKey, await this.sessionConfigStore.get(sessionKey));
752
- const estTokens = await this.sessionStore.estimateTokenUsage(sessionKey, messages);
753
- const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);
754
- const defaults = cfg.agents?.defaults;
755
- const compaction = defaults?.compaction;
756
- const tools = defaults?.tools;
757
- const toolsSummary = tools && typeof tools === "object" ? Object.entries(tools).filter(([, v]) => v === true).map(([k]) => k).slice(0, 16).join(", ") || "(none explicitly true)" : "(see agents.defaults.tools in config)";
758
- return formatSessionContextReport({
759
- sessionKey,
760
- mode,
761
- model,
762
- workspacePath: workspace,
763
- agentId: profile.agentId,
764
- messageCount: messages.length,
765
- contextWindowNominal: cw,
766
- estimatedTranscriptTokens: estTokens,
767
- thinkingDefault: defaults?.thinkingDefault,
768
- reasoningDefault: defaults?.reasoningDefault,
769
- verboseDefault: defaults?.verboseDefault,
770
- compaction,
771
- toolsFlagsSummary: toolsSummary,
772
- windowStats: stats.windowStats,
773
- compactionRunStats: stats.compactionStats
774
- });
775
- }
776
- getSessionStats(sessionKey, messages) {
777
- return {
778
- windowStats: this.sessionStore.getWindowStats(messages),
779
- compactionStats: this.sessionStore.getCompactionStats(sessionKey),
780
- tokenEstimate: this.sessionStore.estimateTokenUsage(sessionKey, messages)
781
- };
782
- }
783
- /** Rough context usage for TUI footer (estimated tokens vs nominal budget). */
784
- async getSessionContextUsage(sessionKey) {
785
- const messages = await this.sessionStore.load(sessionKey);
786
- const contextWindow = this.getContextWindow();
787
- const estimatedTokens = await this.sessionStore.estimateTokenUsage(sessionKey, messages);
788
- return {
789
- estimatedTokens,
790
- contextWindow,
791
- usagePercent: contextWindow > 0 ? Math.min(100, Math.round(estimatedTokens / contextWindow * 100)) : null
792
- };
793
- }
794
- async applyResolvedThinkingLevel(sessionKey, requestOverride) {
795
- const def = this.effectiveAppConfig()?.agents?.defaults?.thinkingDefault;
796
- const level = await resolveEffectiveThinkingLevel(this.sessionConfigStore, sessionKey, requestOverride, def);
797
- this.agentManager.setThinkingLevel(sessionKey, level);
798
- }
799
- /** Resolved thinking level and effective model ref for a session (Web UI). */
800
- async getSessionAgentConfig(sessionKey) {
801
- await this.hydrateSessionModelFromStore(sessionKey);
802
- const cfg = this.effectiveAppConfig();
803
- const sc = await this.sessionConfigStore.get(sessionKey);
804
- const profileModelRef = resolveEffectiveAgentProfileForSession(cfg, sessionKey).primaryModelRef?.trim();
805
- if (profileModelRef) this.modelManager.setSessionProfileDefault(sessionKey, profileModelRef);
806
- const defThink = cfg.agents?.defaults?.thinkingDefault ?? "medium";
807
- const level = await resolveEffectiveThinkingLevel(this.sessionConfigStore, sessionKey, null, defThink);
808
- const defReason = cfg.agents?.defaults?.reasoningDefault ?? "stream";
809
- const reasoningLevel = await resolveEffectiveReasoningLevel(this.sessionConfigStore, sessionKey, defReason);
810
- return {
811
- thinkingLevel: level,
812
- model: this.modelManager.getModelForSession(sessionKey),
813
- reasoningLevel,
814
- effectiveWorkspacePath: effectiveWorkspacePathForSession(cfg, sessionKey, sc),
815
- workingDirectoryLocked: Boolean(sc?.workingDirectoryOverride?.trim())
816
- };
817
- }
818
- /**
819
670
  * Load session working directory override into AgentManager, ensure directory exists.
820
671
  * Call before AgentManager.getOrCreateAgent for this session.
821
672
  */
822
- async hydrateSessionWorkspaceFromStore(sessionKey) {
823
- const cfg = this.config.config;
824
- if (!cfg) return;
825
- const loaded = await this.sessionConfigStore.get(sessionKey);
826
- if (loaded?.workingDirectoryOverride?.trim()) {
827
- const wdStored = normalizeWorkingDirectoryInput(loaded.workingDirectoryOverride);
828
- if (wdStored.ok) this.agentManager.setSessionWorkspaceOverride(sessionKey, wdStored.path);
829
- else {
830
- log.warn({ sessionKey }, "Invalid stored workingDirectoryOverride; ignoring");
831
- this.agentManager.setSessionWorkspaceOverride(sessionKey, null);
832
- }
833
- } else this.agentManager.setSessionWorkspaceOverride(sessionKey, null);
834
- await mkdir(effectiveWorkspacePathForSession(cfg, sessionKey, loaded), { recursive: true });
835
- }
836
- /**
837
- * Sync persisted session workspace override for an isolated cron run (runs may change when the job is edited).
838
- * Omit or pass empty `workingDirectory` to use the effective agent default workspace for this session key.
839
- */
840
- async applyCronJobWorkingDirectory(sessionKey, workingDirectory) {
841
- const raw = workingDirectory?.trim();
842
- if (raw) {
843
- const wdNorm = normalizeWorkingDirectoryInput(raw);
844
- if (wdNorm.ok === false) {
845
- log.warn({
846
- sessionKey,
847
- error: wdNorm.error
848
- }, "Cron job working directory invalid; using agent default");
849
- await this.clearCronSessionWorkingDirectoryOverride(sessionKey);
850
- return;
851
- }
852
- await mkdir(wdNorm.path, { recursive: true });
853
- await this.sessionConfigStore.update(sessionKey, { workingDirectoryOverride: wdNorm.path });
854
- this.agentManager.setSessionWorkspaceOverride(sessionKey, wdNorm.path);
855
- return;
856
- }
857
- await this.clearCronSessionWorkingDirectoryOverride(sessionKey);
858
- }
859
- async clearCronSessionWorkingDirectoryOverride(sessionKey) {
860
- const existing = await this.sessionConfigStore.get(sessionKey);
861
- if (existing?.workingDirectoryOverride) {
862
- const { workingDirectoryOverride: _removed, ...rest } = existing;
863
- await this.sessionConfigStore.set(sessionKey, rest);
864
- }
865
- this.agentManager.setSessionWorkspaceOverride(sessionKey, null);
866
- }
867
673
  /** Workspace root for UI file tree / editor (same as agent tools after hydration). */
868
674
  async getEffectiveWorkspacePathForSession(sessionKey) {
869
- await this.hydrateSessionWorkspaceFromStore(sessionKey);
675
+ await this.sessionHydrator.workspace(sessionKey);
870
676
  const cfg = this.config.config;
871
677
  return effectiveWorkspacePathForSession(cfg, sessionKey, await this.sessionConfigStore.get(sessionKey));
872
678
  }
873
- async patchSessionAgentConfig(sessionKey, partial) {
874
- if (partial.model !== void 0) if (partial.model === null || partial.model === "") await this.clearSessionModelOverride(sessionKey);
875
- else {
876
- if (!await this.modelManager.switchModelForSession(sessionKey, partial.model)) return {
877
- ok: false,
878
- error: "Invalid model"
879
- };
880
- await this.sessionConfigStore.update(sessionKey, { modelOverride: partial.model });
881
- this.agentManager.setModelForSession(sessionKey, partial.model);
882
- }
883
- if (partial.thinkingLevel !== void 0) {
884
- const normalized = normalizeThinkLevel(partial.thinkingLevel);
885
- if (!normalized) return {
886
- ok: false,
887
- error: "Invalid thinking level"
888
- };
889
- await this.sessionConfigStore.update(sessionKey, { thinkingLevel: normalized });
890
- this.agentManager.setThinkingLevel(sessionKey, normalized);
891
- }
892
- if (partial.reasoningLevel !== void 0) {
893
- const normalized = normalizeReasoningLevel(partial.reasoningLevel);
894
- if (!normalized) return {
895
- ok: false,
896
- error: "Invalid reasoning level"
897
- };
898
- await this.sessionConfigStore.update(sessionKey, { reasoningLevel: normalized });
899
- }
900
- if (partial.workingDirectory !== void 0) {
901
- if (!this.config.config) return {
902
- ok: false,
903
- error: "Config not loaded"
904
- };
905
- const existingRaw = (await this.sessionConfigStore.get(sessionKey))?.workingDirectoryOverride?.trim();
906
- const incoming = partial.workingDirectory.trim();
907
- if ((await this.sessionStore.load(sessionKey)).length > 0) {
908
- if (!incoming) return {
909
- ok: false,
910
- error: "workingDirectory is empty"
911
- };
912
- if (!existingRaw) return {
913
- ok: false,
914
- error: "Working directory can only be set before the first message in this conversation"
915
- };
916
- const prev = normalizeWorkingDirectoryInput(existingRaw);
917
- const next = normalizeWorkingDirectoryInput(incoming);
918
- if (prev.ok && next.ok && prev.path === next.path) {} else return {
919
- ok: false,
920
- error: "Working directory is already set for this session"
921
- };
922
- } else {
923
- if (!incoming) return {
924
- ok: false,
925
- error: "workingDirectory is empty"
926
- };
927
- const wdNorm = normalizeWorkingDirectoryInput(incoming);
928
- switch (wdNorm.ok) {
929
- case true:
930
- if (existingRaw) {
931
- const prev = normalizeWorkingDirectoryInput(existingRaw);
932
- if (prev.ok && prev.path === wdNorm.path) break;
933
- }
934
- await mkdir(wdNorm.path, { recursive: true });
935
- await this.sessionConfigStore.update(sessionKey, { workingDirectoryOverride: wdNorm.path });
936
- this.agentManager.setSessionWorkspaceOverride(sessionKey, wdNorm.path);
937
- this.agentManager.removeAgent(sessionKey);
938
- break;
939
- case false: return {
940
- ok: false,
941
- error: wdNorm.error
942
- };
943
- default: return {
944
- ok: false,
945
- error: "Invalid working directory"
946
- };
947
- }
948
- }
949
- }
950
- return { ok: true };
951
- }
952
- async *processDirectStreaming(content, sessionKey = "cli:direct", attachments, thinking, options) {
953
- yield* runProcessDirectStreaming(this.createProcessDirectStreamingDeps(), {
954
- content,
955
- sessionKey,
956
- attachments,
957
- thinking,
958
- signal: options?.signal
959
- });
960
- }
961
679
  /**
962
680
  * Best-effort timezone resolution for webchat envelope timestamps.
963
681
  * Reads `USER.md` under the agent `profile/` directory and extracts a `Timezone:` line.
@@ -974,310 +692,15 @@ var AgentService = class {
974
692
  return;
975
693
  }
976
694
  }
977
- createProcessDirectStreamingDeps() {
978
- return {
979
- log,
980
- parseSessionKey: (sk) => this.parseSessionKey(sk),
981
- initDirectStreamingSession: (sk, channel, chatId) => this.initSessionContext(sk, channel, chatId),
982
- registerWebchatSsePublisher: (sk, publisher) => {
983
- this.webchatSseEnqueueBySession.set(sk, publisher);
984
- },
985
- unregisterWebchatSsePublisher: (sk) => {
986
- this.webchatSseEnqueueBySession.delete(sk);
987
- },
988
- agentManager: this.agentManager,
989
- hydrateSessionWorkspaceFromStore: (sk) => this.hydrateSessionWorkspaceFromStore(sk),
990
- hydrateSessionModelFromStore: (sk) => this.hydrateSessionModelFromStore(sk),
991
- sessionStore: this.sessionStore,
992
- modelManager: this.modelManager,
993
- applyResolvedThinkingLevel: (sk, t) => this.applyResolvedThinkingLevel(sk, t),
994
- getConfig: () => this.effectiveAppConfig(),
995
- sessionConfigStore: this.sessionConfigStore,
996
- attachmentRootsForSession: (sk) => this.attachmentRootsForSession(sk),
997
- commandHandler: this.commandHandler,
998
- prepareInboundAttachments: (sk, att) => this.prepareInboundAttachments(sk, att),
999
- buildMessageContent: (text, prepared, sk) => buildDirectUserMessageContent({
1000
- content: text,
1001
- attachments: prepared,
1002
- sessionKey: sk,
1003
- config: this.config.config,
1004
- agentManager: this.agentManager,
1005
- modelManager: this.modelManager
1006
- }),
1007
- recordPersistentGoalStreamOutcome: (sk, o) => this.recordPersistentGoalStreamOutcome(sk, o),
1008
- onTurnComplete: (sk, text) => {
1009
- if (text?.trim()) this.lastAssistantPlainTextBySession.set(sk, text.trim());
1010
- this.enqueueMaybeAutoTitleAfterPersist(sk);
1011
- },
1012
- reloadWebchatTranscript: (sk) => {
1013
- this.onSessionTranscriptUpdated?.(sk);
1014
- },
1015
- maybeEmitWebchatTts: (sk, hadVoice) => maybeEmitWebchatTts({
1016
- config: this.config.config,
1017
- agentManager: this.agentManager,
1018
- sessionStore: this.sessionStore,
1019
- log
1020
- }, sk, hadVoice),
1021
- endDirectRequestContext: () => this.endDirectRequestContext()
1022
- };
1023
- }
1024
- /**
1025
- * Inject an SSE event into an in-flight webchat stream (same queue as tokens/tools).
1026
- */
1027
- enqueueWebchatSseEvent(sessionKey, event) {
1028
- const pub = this.webchatSseEnqueueBySession.get(sessionKey);
1029
- if (pub) pub(event);
1030
- }
1031
- /** Push assistant text to an in-flight webchat stream and notify gateway listeners. */
1032
- notifyWebchatTranscriptAppend(sessionKey, assistantText) {
1033
- const trimmed = assistantText.trim();
1034
- if (trimmed) this.enqueueWebchatSseEvent(sessionKey, {
1035
- type: "token",
1036
- content: trimmed
1037
- });
1038
- this.onSessionTranscriptUpdated?.(sessionKey);
1039
- }
1040
- /**
1041
- * Queue a steering user message into pi-agent's in-flight run (delivered after current tool work, before the next LLM call).
1042
- * See `Agent.steer` in `@earendil-works/pi-agent-core`.
1043
- */
1044
- async steerWebchatSession(sessionKey, text) {
1045
- const trimmed = text.trim();
1046
- if (!trimmed) return false;
1047
- try {
1048
- const { queueEmbeddedSteer } = await import("./embedded/runs.js");
1049
- return await queueEmbeddedSteer(sessionKey, trimmed);
1050
- } catch (err) {
1051
- log.warn({
1052
- err,
1053
- sessionKey
1054
- }, "steerWebchatSession failed");
1055
- return false;
1056
- }
1057
- }
1058
- createRunProcessDirectDeps() {
1059
- const cfg = this.config.config;
1060
- if (!cfg) throw new Error("AgentService requires config.config");
1061
- return {
1062
- log,
1063
- config: cfg,
1064
- parseSessionKey: (sk) => this.parseSessionKey(sk),
1065
- initSessionContext: (sk, channel, chatId) => {
1066
- this.initSessionContext(sk, channel, chatId);
1067
- },
1068
- hydrateSessionWorkspaceFromStore: (sk) => this.hydrateSessionWorkspaceFromStore(sk),
1069
- hydrateSessionModelFromStore: (sk) => this.hydrateSessionModelFromStore(sk),
1070
- agentManager: this.agentManager,
1071
- sessionStore: this.sessionStore,
1072
- modelManager: this.modelManager,
1073
- applyResolvedThinkingLevel: (sk, t) => this.applyResolvedThinkingLevel(sk, t),
1074
- prepareInboundAttachments: (sk, att) => this.prepareInboundAttachments(sk, att),
1075
- commandHandler: this.commandHandler,
1076
- onTurnComplete: (sk, text) => {
1077
- if (text?.trim()) this.lastAssistantPlainTextBySession.set(sk, text.trim());
1078
- this.enqueueMaybeAutoTitleAfterPersist(sk);
1079
- },
1080
- endDirectRequestContext: () => this.endDirectRequestContext()
1081
- };
1082
- }
1083
- async processDirect(content, sessionKey = "cli:direct", attachments, thinking) {
1084
- return runProcessDirect(this.createRunProcessDirectDeps(), {
1085
- content,
1086
- sessionKey,
1087
- attachments,
1088
- thinking
1089
- });
1090
- }
1091
- async handleInboundMessage(msg) {
1092
- await runWithLogContext({ requestId: inboundMessageLogRequestId(msg) }, async () => {
1093
- const { context, isCommand, command, commandArgs } = await this.messageRouter.routeMessage(msg);
1094
- const sessionContext = {
1095
- sessionKey: context.sessionKey,
1096
- channel: context.channel,
1097
- chatId: context.chatId,
1098
- senderId: context.senderId || "",
1099
- isGroup: context.isGroup || false,
1100
- metadata: { transcribedVoice: msg.metadata?.transcribedVoice === true }
1101
- };
1102
- updateAsyncLogContext({ sessionId: sessionContext.sessionKey });
1103
- this.sessionContextManager.setContext(sessionContext);
1104
- this.feedbackCoordinator.setContext(sessionContext);
1105
- this.agentManager.getOrCreateAgent(sessionContext.sessionKey);
1106
- this.setupSessionEventHandling(sessionContext.sessionKey);
1107
- await this.sessionLifecycleManager.startSession(sessionContext);
1108
- /** Declared on the function so `finally` can clear typing after outbound (TTS + send). */
1109
- let typingController = null;
1110
- let inboundTurnArmed = false;
1111
- let busProcessFailed;
1112
- try {
1113
- if (msg.channel === "system") {
1114
- await this.handleSystemMessage(msg, sessionContext);
1115
- return;
1116
- }
1117
- if (this.channelManagerRef && msg.channel !== "cli") await this.channelManagerRef.dispatchInboundMessageAction(msg);
1118
- if (isCommand && command) {
1119
- if (await this.commandHandler.executeCommand(command, commandArgs || "", {
1120
- sessionKey: sessionContext.sessionKey,
1121
- channel: sessionContext.channel,
1122
- chatId: sessionContext.chatId,
1123
- senderId: sessionContext.senderId,
1124
- isGroup: sessionContext.isGroup,
1125
- inboundMetadata: msg.metadata
1126
- })) return;
1127
- }
1128
- if (msg.channel !== "cli") {
1129
- typingController = createTypingController({
1130
- intervalSeconds: 5,
1131
- onStart: async () => {
1132
- await this.bus.publishOutbound({
1133
- channel: msg.channel,
1134
- chat_id: msg.chat_id,
1135
- content: "",
1136
- type: "typing_on",
1137
- metadata: {
1138
- accountId: msg.metadata?.accountId,
1139
- threadId: msg.metadata?.threadId,
1140
- sessionWebhook: msg.metadata?.sessionWebhook,
1141
- conversationId: msg.metadata?.conversationId
1142
- }
1143
- });
1144
- },
1145
- onStop: async () => {
1146
- await this.bus.publishOutbound({
1147
- channel: msg.channel,
1148
- chat_id: msg.chat_id,
1149
- content: "",
1150
- type: "typing_off",
1151
- metadata: {
1152
- accountId: msg.metadata?.accountId,
1153
- threadId: msg.metadata?.threadId,
1154
- sessionWebhook: msg.metadata?.sessionWebhook,
1155
- conversationId: msg.metadata?.conversationId
1156
- }
1157
- });
1158
- }
1159
- });
1160
- typingController.start();
1161
- }
1162
- if (this.channelManagerRef && msg.channel !== "cli") {
1163
- const meta = msg.metadata;
1164
- const streamHandle = this.channelManagerRef.startStream(msg.channel, msg.chat_id, meta?.accountId, {
1165
- threadId: meta?.threadId,
1166
- replyToMessageId: meta?.messageId
1167
- });
1168
- if (streamHandle) this.setStreamHandle(streamHandle);
1169
- }
1170
- this.beginInboundTurn(sessionContext.sessionKey);
1171
- inboundTurnArmed = true;
1172
- try {
1173
- await this.agentOrchestrator.process(msg, sessionContext);
1174
- } catch (procErr) {
1175
- busProcessFailed = procErr instanceof Error ? procErr.message : String(procErr);
1176
- throw procErr;
1177
- }
1178
- } finally {
1179
- await this.sessionLifecycleManager.endSession(sessionContext);
1180
- await this.streamManager.end();
1181
- try {
1182
- await this.sendFinalResponse(msg, sessionContext);
1183
- } finally {
1184
- await typingController?.stop();
1185
- }
1186
- if (inboundTurnArmed) {
1187
- const meta = msg.metadata;
1188
- const assistantPlainText = this.getLastAssistantPlainText(sessionContext.sessionKey) ?? "";
1189
- try {
1190
- await this.emitSessionTurnComplete({
1191
- sessionKey: sessionContext.sessionKey,
1192
- channel: sessionContext.channel,
1193
- chatId: sessionContext.chatId,
1194
- inboundUserText: msg.content,
1195
- assistantPlainText,
1196
- aborted: false,
1197
- ...busProcessFailed !== void 0 ? { streamError: busProcessFailed } : {},
1198
- skipPersistentGoalPostTurn: false,
1199
- outboundMetadata: {
1200
- accountId: meta?.accountId,
1201
- threadId: meta?.threadId
1202
- }
1203
- });
1204
- } catch (turnErr) {
1205
- const em = turnErr instanceof Error ? turnErr.message : String(turnErr);
1206
- log.warn({
1207
- err: turnErr,
1208
- sessionKey: sessionContext.sessionKey
1209
- }, `Session turn complete failed: ${em}`);
1210
- }
1211
- this.endInboundTurn(sessionContext.sessionKey);
1212
- }
1213
- this.feedbackCoordinator.endTask();
1214
- this.sessionContextManager.clearContext();
1215
- this.feedbackCoordinator.clearContext();
1216
- }
1217
- });
1218
- }
1219
- async handleSystemMessage(msg, context) {
1220
- log.debug({ sessionKey: context.sessionKey }, "Processing system message");
1221
- await this.hydrateSessionWorkspaceFromStore(context.sessionKey);
1222
- await this.hydrateSessionModelFromStore(context.sessionKey);
1223
- const messages = await this.sessionStore.load(context.sessionKey);
1224
- await this.checkAndCompact(context.sessionKey, messages);
1225
- const systemMessage = {
1226
- role: "user",
1227
- content: [{
1228
- type: "text",
1229
- text: `[System: ${msg.sender_id}] ${msg.content}`
1230
- }],
1231
- timestamp: Date.now()
1232
- };
1233
- try {
1234
- const { runEmbeddedTurnForSession } = await import("./embedded/run-for-session.js");
1235
- const finalContent = (await runEmbeddedTurnForSession({
1236
- sessionKey: context.sessionKey,
1237
- userMessage: systemMessage,
1238
- sessionStore: this.sessionStore,
1239
- agentManager: this.agentManager,
1240
- modelManager: this.modelManager,
1241
- getConfig: () => this.effectiveAppConfig()
1242
- })).lastAssistantText ?? this.getLastAssistantPlainText(context.sessionKey);
1243
- if (finalContent) {
1244
- this.lastAssistantPlainTextBySession.set(context.sessionKey, finalContent);
1245
- const hookResult = await this.hookHandler.runMessageSending(context.chatId, finalContent, context.channel);
1246
- if (hookResult.send) await this.bus.publishOutbound({
1247
- channel: context.channel,
1248
- chat_id: context.chatId,
1249
- content: hookResult.content || finalContent,
1250
- type: "message"
1251
- });
1252
- }
1253
- this.enqueueMaybeAutoTitleAfterPersist(context.sessionKey);
1254
- } catch (error) {
1255
- const em = error instanceof Error ? error.message : String(error);
1256
- log.error({
1257
- err: error,
1258
- errorMessage: em,
1259
- sessionKey: context.sessionKey,
1260
- channel: context.channel,
1261
- chatId: context.chatId,
1262
- senderId: msg.sender_id
1263
- }, `System message handling failed: ${em}`);
1264
- await this.bus.publishOutbound({
1265
- channel: context.channel,
1266
- chat_id: context.chatId,
1267
- content: "❌ An error occurred while processing the system message.",
1268
- type: "message"
1269
- });
1270
- }
1271
- }
1272
695
  /**
1273
696
  * Setup event handling for a specific session
1274
697
  */
1275
698
  setupSessionEventHandling(sessionKey) {
1276
- if (this.sessionUnsubscribers.has(sessionKey)) return;
699
+ if (this.sessionState.hasSessionEventUnsubscriber(sessionKey)) return;
1277
700
  const unsubscribe = this.agentManager.subscribeToSession(sessionKey, (event) => {
1278
701
  this.handleSessionEvent(sessionKey, event);
1279
702
  });
1280
- if (unsubscribe) this.sessionUnsubscribers.set(sessionKey, unsubscribe);
703
+ if (unsubscribe) this.sessionState.setSessionEventUnsubscriber(sessionKey, unsubscribe);
1281
704
  }
1282
705
  /**
1283
706
  * Handle events from a specific session's agent
@@ -1324,41 +747,9 @@ var AgentService = class {
1324
747
  const defaults = this.config.agentDefaults || this.config.config?.agents?.defaults;
1325
748
  return defaults?.maxTokens ? defaults.maxTokens * 4 : 128e3;
1326
749
  }
1327
- async sendFinalResponse(msg, sessionContext) {
1328
- if (this.streamManager.consumeSkipFinalOutbound()) return;
1329
- const finalContent = this.getLastAssistantPlainText(sessionContext.sessionKey);
1330
- if (!finalContent?.trim()) return;
1331
- if (shouldSilence(finalContent, this.config.config?.gateway?.heartbeat?.ackMaxChars ?? 300) || finalContent.trim() === "NO_REPLY") {
1332
- log.debug({ sessionKey: sessionContext.sessionKey }, "Silent reply — skipping outbound");
1333
- return;
1334
- }
1335
- const hookResult = await this.hookHandler.runMessageSending(sessionContext.chatId, finalContent, sessionContext.channel);
1336
- if (!hookResult.send) return;
1337
- await this.bus.publishOutbound({
1338
- channel: sessionContext.channel,
1339
- chat_id: sessionContext.chatId,
1340
- content: hookResult.content || finalContent,
1341
- type: "message",
1342
- metadata: {
1343
- accountId: msg.metadata?.accountId,
1344
- threadId: msg.metadata?.threadId,
1345
- transcribedVoice: sessionContext.metadata?.transcribedVoice,
1346
- sessionWebhook: msg.metadata?.sessionWebhook,
1347
- conversationId: msg.metadata?.conversationId
1348
- }
1349
- });
1350
- }
1351
- /** Extension hooks for ChannelManager outbound pipeline (Gateway). */
1352
- async invokeOutboundMessageSending(to, content, channel) {
1353
- return this.hookHandler.runMessageSending(to, content, channel);
1354
- }
1355
- async invokeOutboundMessageSent(to, content, success, error, channel) {
1356
- return this.hookHandler.runMessageSent(to, content, success, error, channel);
1357
- }
1358
750
  dispose() {
1359
751
  this.sessionTracker.dispose();
1360
- for (const unsubscribe of this.sessionUnsubscribers.values()) unsubscribe();
1361
- this.sessionUnsubscribers.clear();
752
+ this.sessionState.disposeAll();
1362
753
  this.agentManager.dispose();
1363
754
  }
1364
755
  };