@xopcai/xopc 0.0.82 → 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 (704) 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-pJ27dsqn.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-D1KYmOmi.js → channels-status-swr-uRAuhiUo.js} +1 -1
  26. package/dist/gateway/static/root/assets/{cron-api-Y2wfSJVI.js → cron-api-O2Q_ruV6.js} +1 -1
  27. package/dist/gateway/static/root/assets/{cron-page-B97KU_RG.js → cron-page-By09AQD-.js} +1 -1
  28. package/dist/gateway/static/root/assets/{dist-CboA_Css.js → dist-BpQxde0t.js} +1 -1
  29. package/dist/gateway/static/root/assets/{extension-debug-page-DN_zNmpo.js → extension-debug-page-CY27wj_p.js} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-page-BUXtOzv5.js → extension-page-C-Ed5ZmP.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-settings-page-C2dX4KCW.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-B9rOLqdm.js → field-primitives-fa_hiQcX.js} +1 -1
  34. package/dist/gateway/static/root/assets/{heartbeat-config-api-DvfiRVrc.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-DQuaMye9.js → index-Y-iqo-gL.js} +94 -85
  37. package/dist/gateway/static/root/assets/{logs-page-BQuBpHcc.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-2Yu-FASs.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-D2Gn2qod.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 +122 -168
  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 +5 -53
  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 +89 -126
  401. package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
  402. package/dist/src/gateway/hono/middleware/logger.js +1 -1
  403. package/dist/src/gateway/hono/middleware/logger.js.map +1 -1
  404. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +14 -0
  405. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +62 -0
  406. package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -0
  407. package/dist/src/gateway/hono/oauth.js +1 -1
  408. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +4 -4
  409. package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
  410. package/dist/src/gateway/hono/routes/browser.d.ts +20 -0
  411. package/dist/src/gateway/hono/routes/browser.js +626 -0
  412. package/dist/src/gateway/hono/routes/browser.js.map +1 -0
  413. package/dist/src/gateway/hono/routes/commands-skills.js +13 -13
  414. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  415. package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +18 -0
  416. package/dist/src/gateway/hono/routes/config-patch/agents.js +418 -0
  417. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -0
  418. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +12 -0
  419. package/dist/src/gateway/hono/routes/config-patch/channels.js +186 -0
  420. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -0
  421. package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +18 -0
  422. package/dist/src/gateway/hono/routes/config-patch/gateway.js +264 -0
  423. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -0
  424. package/dist/src/gateway/hono/routes/config-patch/index.d.ts +9 -0
  425. package/dist/src/gateway/hono/routes/config-patch/index.js +6 -0
  426. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +23 -0
  427. package/dist/src/gateway/hono/routes/config-patch/misc.js +139 -0
  428. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -0
  429. package/dist/src/gateway/hono/routes/config-patch/result.d.ts +18 -0
  430. package/dist/src/gateway/hono/routes/config-patch/result.js +13 -0
  431. package/dist/src/gateway/hono/routes/config-patch/result.js.map +1 -0
  432. package/dist/src/gateway/hono/routes/config.js +20 -1764
  433. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  434. package/dist/src/gateway/hono/routes/dreaming.js +2 -3
  435. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  436. package/dist/src/gateway/hono/routes/host-fs.js +1 -1
  437. package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -5
  438. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  439. package/dist/src/gateway/hono/routes/mcp.js +1 -2
  440. package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
  441. package/dist/src/gateway/hono/routes/models.js +1 -1
  442. package/dist/src/gateway/hono/routes/sessions.js +32 -32
  443. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  444. package/dist/src/gateway/hono/routes/shares.js +4 -4
  445. package/dist/src/gateway/hono/routes/shares.js.map +1 -1
  446. package/dist/src/gateway/hono/routes/tunnel.js +1 -1
  447. package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
  448. package/dist/src/gateway/hono/routes/workspace.js +6 -7
  449. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  450. package/dist/src/gateway/hono/sse.js +2 -2
  451. package/dist/src/gateway/index.d.ts +1 -1
  452. package/dist/src/gateway/index.js +4 -2
  453. package/dist/src/gateway/lock.js +3 -3
  454. package/dist/src/gateway/rate-limit/auth-policy.d.ts +34 -0
  455. package/dist/src/gateway/rate-limit/auth-policy.js +49 -0
  456. package/dist/src/gateway/rate-limit/auth-policy.js.map +1 -0
  457. package/dist/src/gateway/rate-limit/buckets.d.ts +63 -0
  458. package/dist/src/gateway/rate-limit/buckets.js +143 -0
  459. package/dist/src/gateway/rate-limit/buckets.js.map +1 -0
  460. package/dist/src/gateway/rate-limit/env-flags.d.ts +13 -0
  461. package/dist/src/gateway/rate-limit/env-flags.js +16 -0
  462. package/dist/src/gateway/rate-limit/env-flags.js.map +1 -0
  463. package/dist/src/gateway/rate-limit/index.d.ts +3 -0
  464. package/dist/src/gateway/rate-limit/index.js +4 -0
  465. package/dist/src/gateway/run-loop.d.ts +1 -1
  466. package/dist/src/gateway/run-loop.js +24 -4
  467. package/dist/src/gateway/run-loop.js.map +1 -1
  468. package/dist/src/gateway/runtime-config.js +2 -1
  469. package/dist/src/gateway/runtime-config.js.map +1 -1
  470. package/dist/src/gateway/security/audit.js +2 -1
  471. package/dist/src/gateway/security/audit.js.map +1 -1
  472. package/dist/src/gateway/security/index.d.ts +0 -1
  473. package/dist/src/gateway/security/index.js +1 -2
  474. package/dist/src/gateway/security/loopback.d.ts +13 -0
  475. package/dist/src/gateway/security/loopback.js +45 -0
  476. package/dist/src/gateway/security/loopback.js.map +1 -0
  477. package/dist/src/gateway/service/agent-runner.d.ts +108 -0
  478. package/dist/src/gateway/service/agent-runner.js +184 -0
  479. package/dist/src/gateway/service/agent-runner.js.map +1 -0
  480. package/dist/src/gateway/service/config-coordinator.d.ts +119 -0
  481. package/dist/src/gateway/service/config-coordinator.js +351 -0
  482. package/dist/src/gateway/service/config-coordinator.js.map +1 -0
  483. package/dist/src/gateway/service/marketplace-service.d.ts +85 -0
  484. package/dist/src/gateway/service/marketplace-service.js +239 -0
  485. package/dist/src/gateway/service/marketplace-service.js.map +1 -0
  486. package/dist/src/gateway/service/run-gateway-agent.js +5 -5
  487. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  488. package/dist/src/gateway/service/sessions-api.d.ts +125 -0
  489. package/dist/src/gateway/service/sessions-api.js +135 -0
  490. package/dist/src/gateway/service/sessions-api.js.map +1 -0
  491. package/dist/src/gateway/service.d.ts +30 -360
  492. package/dist/src/gateway/service.js +121 -903
  493. package/dist/src/gateway/service.js.map +1 -1
  494. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  495. package/dist/src/gateway/workspace-heartbeat-path.js +1 -2
  496. package/dist/src/gateway/workspace-heartbeat-path.js.map +1 -1
  497. package/dist/src/heartbeat/index.js +1 -1
  498. package/dist/src/infra/gateway-process-argv.d.ts +4 -0
  499. package/dist/src/infra/gateway-process-argv.js +26 -0
  500. package/dist/src/infra/gateway-process-argv.js.map +1 -0
  501. package/dist/src/infra/gateway-processes.d.ts +5 -0
  502. package/dist/src/infra/gateway-processes.js +65 -0
  503. package/dist/src/infra/gateway-processes.js.map +1 -0
  504. package/dist/src/infra/rate-limit/failure-limiter.d.ts +50 -0
  505. package/dist/src/infra/rate-limit/failure-limiter.js +100 -0
  506. package/dist/src/infra/rate-limit/failure-limiter.js.map +1 -0
  507. package/dist/src/infra/rate-limit/index.d.ts +5 -0
  508. package/dist/src/infra/rate-limit/index.js +3 -0
  509. package/dist/src/infra/rate-limit/keyed-store.d.ts +34 -0
  510. package/dist/src/infra/rate-limit/keyed-store.js +44 -0
  511. package/dist/src/infra/rate-limit/keyed-store.js.map +1 -0
  512. package/dist/src/infra/rate-limit/rate-limiter.d.ts +39 -0
  513. package/dist/src/infra/rate-limit/rate-limiter.js +65 -0
  514. package/dist/src/infra/rate-limit/rate-limiter.js.map +1 -0
  515. package/dist/src/infra/restart.d.ts +21 -0
  516. package/dist/src/infra/restart.js +122 -0
  517. package/dist/src/infra/restart.js.map +1 -0
  518. package/dist/src/infra/update-check.js +1 -1
  519. package/dist/src/infra/update-lock.js +3 -3
  520. package/dist/src/infra/update-runner.js +1 -1
  521. package/dist/src/infra/update-startup.js +2 -2
  522. package/dist/src/infra/write-file-atomic.js +2 -2
  523. package/dist/src/mcp/channel-bridge.d.ts +0 -6
  524. package/dist/src/mcp/channel-bridge.js +1 -5
  525. package/dist/src/mcp/channel-bridge.js.map +1 -1
  526. package/dist/src/media-shared/http/ssrf-guard.js +1 -1
  527. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  528. package/dist/src/providers/index.js +2 -2
  529. package/dist/src/providers/model-registry.js +1 -1
  530. package/dist/src/session/config-store.js +2 -2
  531. package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
  532. package/dist/src/session/parity/sessions-json-file-read.d.ts +2 -1
  533. package/dist/src/session/parity/sessions-json-file-read.js.map +1 -1
  534. package/dist/src/session/parity/sessions-json-file.js +1 -1
  535. package/dist/src/session/parity/transcript-file-lock.js +2 -2
  536. package/dist/src/session/parity/transcript-paths.js +1 -1
  537. package/dist/src/session/search-index-cache.js +1 -1
  538. package/dist/src/session/search-index.js +1 -1
  539. package/dist/src/session/session-title.js +1 -1
  540. package/dist/src/session/store.js +5 -5
  541. package/dist/src/share/share-rate-limit.d.ts +10 -2
  542. package/dist/src/share/share-rate-limit.js +33 -42
  543. package/dist/src/share/share-rate-limit.js.map +1 -1
  544. package/dist/src/share/share-store.js +3 -3
  545. package/dist/src/tui/backends/embedded-backend.js +16 -12
  546. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  547. package/dist/src/tui/clipboard-image.js +2 -2
  548. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  549. package/dist/src/tui/format-tui-hotkeys.js +1 -1
  550. package/dist/src/tui/theme-manager.js +1 -1
  551. package/dist/src/tui/tui-keybindings-file.js +1 -1
  552. package/dist/src/tui/tui-scoped-models.js +1 -1
  553. package/dist/src/tui/tui-settings.js +1 -1
  554. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  555. package/dist/src/tui/tui.js +1 -2
  556. package/dist/src/tui/tui.js.map +1 -1
  557. package/dist/src/tui/xopc-tui-keybindings.d.ts +0 -1
  558. package/dist/src/tui/xopc-tui-keybindings.js +1 -2
  559. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  560. package/dist/src/tunnel/frpc-binary.js +2 -2
  561. package/dist/src/tunnel/frpc-config.js +1 -1
  562. package/dist/src/tunnel/frpc-extract.js +1 -1
  563. package/dist/src/tunnel/pairing-rate-limit.d.ts +10 -2
  564. package/dist/src/tunnel/pairing-rate-limit.js +19 -15
  565. package/dist/src/tunnel/pairing-rate-limit.js.map +1 -1
  566. package/dist/src/tunnel/tunnel-rate-limit.d.ts +6 -3
  567. package/dist/src/tunnel/tunnel-rate-limit.js +11 -22
  568. package/dist/src/tunnel/tunnel-rate-limit.js.map +1 -1
  569. package/dist/src/tunnel/tunnel-state.js +1 -1
  570. package/dist/src/utils/logger/audit.js +1 -1
  571. package/dist/src/utils/logger/log-store.js +1 -1
  572. package/dist/src/utils/logger/rotation.js +1 -1
  573. package/dist/src/utils/logger/stats.d.ts +1 -1
  574. package/dist/src/voice/tts/audio.js +1 -1
  575. package/dist/src/voice/tts/factory.js +1 -1
  576. package/dist/src/voice/tts/index.js +2 -2
  577. package/dist/src/voice/tts/merge-config.js +1 -1
  578. package/dist/src/voice/tts/providers/edge-speech.js +1 -1
  579. package/dist/src/voice/tts/service.js +1 -1
  580. package/dist/src/voice/tts/service.js.map +1 -1
  581. package/dist/src/voice/tts/speak-core.js +1 -1
  582. package/package.json +10 -5
  583. package/dist/gateway/static/root/assets/agents-Cqh1ts38.js +0 -222
  584. package/dist/gateway/static/root/assets/channels-settings-wTiWStg9.js +0 -1
  585. package/dist/gateway/static/root/assets/fetch-BAAh_kXG.js +0 -3
  586. package/dist/gateway/static/root/assets/index-C8yHX-AA.css +0 -1
  587. package/dist/gateway/static/root/assets/sessions-page-BeiFm0Ms.js +0 -1
  588. package/dist/gateway/static/root/assets/settings-page-RPAz_Wg_.js +0 -3
  589. package/dist/gateway/static/root/assets/skills-page-Wu4aNWDx.js +0 -2
  590. package/dist/gateway/static/root/assets/voice-api-key-field-BxIGhhEL.js +0 -1
  591. package/dist/src/agent/embedded/session-raw-append-message.d.ts +0 -11
  592. package/dist/src/agent/embedded/session-raw-append-message.js +0 -15
  593. package/dist/src/agent/embedded/session-raw-append-message.js.map +0 -1
  594. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.d.ts +0 -15
  595. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js +0 -24
  596. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js.map +0 -1
  597. package/dist/src/agent/embedded/session-tool-result-state.d.ts +0 -17
  598. package/dist/src/agent/embedded/session-tool-result-state.js +0 -26
  599. package/dist/src/agent/embedded/session-tool-result-state.js.map +0 -1
  600. package/dist/src/daemon/launchd-restart-handoff.d.ts +0 -25
  601. package/dist/src/daemon/launchd-restart-handoff.js +0 -132
  602. package/dist/src/daemon/launchd-restart-handoff.js.map +0 -1
  603. package/dist/src/gateway/auth-rate-limit.d.ts +0 -71
  604. package/dist/src/gateway/auth-rate-limit.js +0 -192
  605. package/dist/src/gateway/auth-rate-limit.js.map +0 -1
  606. package/dist/src/gateway/restart-handler.d.ts +0 -14
  607. package/dist/src/gateway/restart-handler.js +0 -64
  608. package/dist/src/gateway/restart-handler.js.map +0 -1
  609. package/dist/src/gateway/security/flood-guard.d.ts +0 -28
  610. package/dist/src/gateway/security/flood-guard.js +0 -42
  611. package/dist/src/gateway/security/flood-guard.js.map +0 -1
  612. package/dist/src/infra/rate-limit.d.ts +0 -38
  613. package/dist/src/infra/rate-limit.js +0 -60
  614. package/dist/src/infra/rate-limit.js.map +0 -1
  615. package/dist/src/infra/restart-intent.d.ts +0 -13
  616. package/dist/src/infra/restart-intent.js +0 -40
  617. package/dist/src/infra/restart-intent.js.map +0 -1
  618. package/dist/src/infra/restart-sentinel.d.ts +0 -23
  619. package/dist/src/infra/restart-sentinel.js +0 -75
  620. package/dist/src/infra/restart-sentinel.js.map +0 -1
  621. package/skills/creative/canvas-design/LICENSE.txt +0 -202
  622. package/skills/creative/canvas-design/SKILL-zh.md +0 -130
  623. package/skills/creative/canvas-design/SKILL.md +0 -130
  624. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
  625. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  626. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  627. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
  628. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  629. package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
  630. package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  631. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  632. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
  633. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  634. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  635. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  636. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
  637. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  638. package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
  639. package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  640. package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
  641. package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  642. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  643. package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
  644. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  645. package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
  646. package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  647. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  648. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
  649. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  650. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  651. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  652. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  653. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  654. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  655. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  656. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  657. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
  658. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  659. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  660. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  661. package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
  662. package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  663. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  664. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
  665. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  666. package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  667. package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  668. package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
  669. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
  670. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  671. package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  672. package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  673. package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  674. package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
  675. package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  676. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  677. package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
  678. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  679. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
  680. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  681. package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  682. package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
  683. package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  684. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  685. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
  686. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
  687. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  688. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  689. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
  690. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  691. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
  692. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  693. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  694. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
  695. package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  696. package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
  697. package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  698. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  699. package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  700. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  701. package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
  702. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  703. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
  704. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
@@ -4,76 +4,72 @@ import { extractTextContent } from "../context/workspace.js";
4
4
  //#region src/agent/orchestration/agent-event-handler.ts
5
5
  init_logger();
6
6
  const log = createLogger("AgentEventHandler");
7
- var AgentEventHandler = class {
8
- progressManager;
9
- errorTracker;
10
- requestLimiter;
11
- lifecycleManager;
12
- toolChainTracker;
13
- selfVerifyMiddleware;
14
- systemReminder;
15
- toolUsageAnalyzer;
16
- errorPatternMatcher;
17
- modelManager;
18
- taskStartTime = 0;
19
- constructor(config) {
20
- this.progressManager = config.progressManager;
21
- this.errorTracker = config.errorTracker;
22
- this.requestLimiter = config.requestLimiter;
23
- this.lifecycleManager = config.lifecycleManager;
24
- this.toolChainTracker = config.toolChainTracker;
25
- this.selfVerifyMiddleware = config.selfVerifyMiddleware;
26
- this.systemReminder = config.systemReminder;
27
- this.toolUsageAnalyzer = config.toolUsageAnalyzer;
28
- this.errorPatternMatcher = config.errorPatternMatcher;
29
- this.modelManager = config.modelManager;
7
+ /**
8
+ * Typed pub/sub for agent events. Listeners run in registration order; the bus
9
+ * itself is synchronous — listeners that need async work must dispatch their own
10
+ * promises (typically by awaiting and logging on error, like the lifecycle hooks).
11
+ */
12
+ var SessionEventBus = class {
13
+ listeners = /* @__PURE__ */ new Map();
14
+ on(type, listener) {
15
+ const bucket = this.listeners.get(type) ?? [];
16
+ bucket.push(listener);
17
+ this.listeners.set(type, bucket);
18
+ return () => {
19
+ const current = this.listeners.get(type);
20
+ if (!current) return;
21
+ const idx = current.indexOf(listener);
22
+ if (idx >= 0) current.splice(idx, 1);
23
+ };
30
24
  }
31
- /**
32
- * Handle an agent event
33
- */
34
- handle(event, context) {
25
+ dispatch(event, context) {
35
26
  if (!context) {
36
27
  if (event.type !== "message_update") log.warn({ eventType: event.type }, `Agent event ignored (no SessionContext): ${event.type}`);
37
28
  return;
38
29
  }
39
- switch (event.type) {
40
- case "agent_start":
41
- this.handleAgentStart(event, context);
42
- break;
43
- case "turn_start":
44
- this.handleTurnStart(event, context);
45
- break;
46
- case "message_start":
47
- this.handleMessageStart(event, context);
48
- break;
49
- case "message_end":
50
- this.handleMessageEnd(event, context);
51
- break;
52
- case "tool_execution_start":
53
- this.handleToolExecutionStart(event, context);
54
- break;
55
- case "tool_execution_update":
56
- this.handleToolExecutionUpdate(event, context);
57
- break;
58
- case "tool_execution_end":
59
- this.handleToolExecutionEnd(event, context);
60
- break;
61
- case "message_update": break;
62
- case "turn_end":
63
- this.handleTurnEnd(event, context);
64
- break;
65
- case "agent_end":
66
- this.handleAgentEnd(event, context);
67
- break;
68
- default: log.debug({ eventType: event.type }, "Unhandled event type");
69
- }
30
+ const exact = this.listeners.get(event.type);
31
+ if (exact) for (const listener of exact) listener(event, context);
32
+ const all = this.listeners.get("all");
33
+ if (all) for (const listener of all) listener(event, context);
70
34
  }
71
- handleAgentStart(_event, context) {
35
+ };
36
+ function installProgressListener(bus, progressManager) {
37
+ bus.on("agent_start", () => {
72
38
  log.debug("Agent turn started");
73
- this.taskStartTime = Date.now();
74
- this.progressManager.startTask();
75
- const result = this.requestLimiter.recordRequest();
76
- this.lifecycleManager.emit("llm_request", context.sessionKey, {
39
+ progressManager.startTask();
40
+ });
41
+ bus.on("turn_start", () => {
42
+ log.debug("Turn started");
43
+ progressManager.onTurnStart();
44
+ });
45
+ bus.on("tool_execution_start", (event) => {
46
+ const e = event;
47
+ log.debug({
48
+ tool: e.toolName,
49
+ args: e.args
50
+ }, "Tool execution started");
51
+ progressManager.onToolStart(e.toolName, e.args || {});
52
+ });
53
+ bus.on("tool_execution_update", (event) => {
54
+ const e = event;
55
+ progressManager.onToolUpdate(e.toolName, e.partialResult);
56
+ });
57
+ bus.on("tool_execution_end", (event) => {
58
+ const e = event;
59
+ log.debug({
60
+ tool: e.toolName,
61
+ isError: e.isError
62
+ }, "Tool execution complete");
63
+ progressManager.onToolEnd(e.toolName, e.result, e.isError);
64
+ });
65
+ bus.on("agent_end", () => {
66
+ progressManager.endTask();
67
+ });
68
+ }
69
+ function installRequestLimitListener(bus, deps) {
70
+ bus.on("agent_start", (_event, context) => {
71
+ const result = deps.requestLimiter.recordRequest();
72
+ deps.lifecycleManager.emit("llm_request", context.sessionKey, {
77
73
  requestNumber: result.count,
78
74
  maxRequests: result.limit
79
75
  }, context).catch((err) => {
@@ -86,51 +82,42 @@ var AgentEventHandler = class {
86
82
  maxRequests: result.limit
87
83
  }, `Lifecycle emit llm_request failed: ${em}`);
88
84
  });
89
- this.progressManager.onRequestLimitStatus(result.count, result.limit, result.remaining, result.isWarning, result.shouldStop);
85
+ deps.progressManager.onRequestLimitStatus(result.count, result.limit, result.remaining, result.isWarning, result.shouldStop);
90
86
  if (result.shouldStop) log.error({
91
87
  count: result.count,
92
88
  limit: result.limit,
93
89
  sessionKey: context.sessionKey
94
90
  }, `Request limit reached (${result.count}/${result.limit}) for session`);
95
- }
96
- handleTurnStart(_event, context) {
97
- log.debug("Turn started");
98
- this.progressManager.onTurnStart();
99
- this.toolChainTracker.startChain(context.sessionKey);
100
- }
101
- handleMessageStart(event, _context) {
102
- if (event.message?.role === "assistant") log.debug("Assistant response starting");
103
- }
104
- handleMessageEnd(event, context) {
105
- const msgEvent = event;
106
- if (msgEvent.message?.role === "assistant") {
107
- const content = msgEvent.message.content;
108
- const text = Array.isArray(content) ? extractTextContent(content) : String(content);
109
- log.debug({ contentLength: text.length }, "Assistant response complete");
110
- this.lifecycleManager.emit("llm_response", context.sessionKey, {
111
- response: text,
112
- usage: msgEvent.message.usage
113
- }, context).catch((err) => {
114
- const em = err instanceof Error ? err.message : String(err);
115
- log.warn({
116
- err,
117
- errorMessage: em,
118
- sessionKey: context.sessionKey,
119
- responseChars: text.length
120
- }, `Lifecycle emit llm_response failed: ${em}`);
121
- });
122
- }
123
- }
124
- handleToolExecutionStart(event, context) {
125
- const toolEvent = event;
126
- log.debug({
127
- tool: toolEvent.toolName,
128
- args: toolEvent.args
129
- }, "Tool execution started");
130
- this.progressManager.onToolStart(toolEvent.toolName, toolEvent.args || {});
131
- this.lifecycleManager.emit("tool_call_start", context.sessionKey, {
132
- toolName: toolEvent.toolName,
133
- arguments: toolEvent.args || {},
91
+ });
92
+ bus.on("turn_end", () => {
93
+ deps.requestLimiter.reset();
94
+ });
95
+ }
96
+ function installLifecycleHookListener(bus, lifecycleManager) {
97
+ bus.on("message_end", (event, context) => {
98
+ const e = event;
99
+ if (e.message?.role !== "assistant") return;
100
+ const content = e.message.content;
101
+ const text = Array.isArray(content) ? extractTextContent(content) : String(content);
102
+ log.debug({ contentLength: text.length }, "Assistant response complete");
103
+ lifecycleManager.emit("llm_response", context.sessionKey, {
104
+ response: text,
105
+ usage: e.message.usage
106
+ }, context).catch((err) => {
107
+ const em = err instanceof Error ? err.message : String(err);
108
+ log.warn({
109
+ err,
110
+ errorMessage: em,
111
+ sessionKey: context.sessionKey,
112
+ responseChars: text.length
113
+ }, `Lifecycle emit llm_response failed: ${em}`);
114
+ });
115
+ });
116
+ bus.on("tool_execution_start", (event, context) => {
117
+ const e = event;
118
+ lifecycleManager.emit("tool_call_start", context.sessionKey, {
119
+ toolName: e.toolName,
120
+ arguments: e.args || {},
134
121
  attemptNumber: 1,
135
122
  maxAttempts: 3
136
123
  }, context).catch((err) => {
@@ -139,29 +126,18 @@ var AgentEventHandler = class {
139
126
  err,
140
127
  errorMessage: em,
141
128
  sessionKey: context.sessionKey,
142
- tool: toolEvent.toolName
129
+ tool: e.toolName
143
130
  }, `Lifecycle emit tool_call_start failed: ${em}`);
144
131
  });
145
- this.toolChainTracker.recordCall(context.sessionKey, toolEvent.toolName, toolEvent.args || {}, 0);
146
- this.trackFileEdit(toolEvent.toolName, toolEvent.args);
147
- }
148
- handleToolExecutionUpdate(event, _context) {
149
- const toolEvent = event;
150
- this.progressManager.onToolUpdate(toolEvent.toolName, toolEvent.partialResult);
151
- }
152
- handleToolExecutionEnd(event, context) {
153
- const toolEvent = event;
154
- log.debug({
155
- tool: toolEvent.toolName,
156
- isError: toolEvent.isError
157
- }, "Tool execution complete");
158
- this.progressManager.onToolEnd(toolEvent.toolName, toolEvent.result, toolEvent.isError);
159
- const durationMs = toolEvent.durationMs || 0;
160
- this.lifecycleManager.emit("tool_call_end", context.sessionKey, {
161
- toolName: toolEvent.toolName,
162
- success: !toolEvent.isError,
163
- result: toolEvent.result,
164
- error: toolEvent.isError ? String(toolEvent.result) : void 0,
132
+ });
133
+ bus.on("tool_execution_end", (event, context) => {
134
+ const e = event;
135
+ const durationMs = e.durationMs || 0;
136
+ lifecycleManager.emit("tool_call_end", context.sessionKey, {
137
+ toolName: e.toolName,
138
+ success: !e.isError,
139
+ result: e.result,
140
+ error: e.isError ? String(e.result) : void 0,
165
141
  durationMs
166
142
  }, context).catch((err) => {
167
143
  const em = err instanceof Error ? err.message : String(err);
@@ -169,67 +145,129 @@ var AgentEventHandler = class {
169
145
  err,
170
146
  errorMessage: em,
171
147
  sessionKey: context.sessionKey,
172
- tool: toolEvent.toolName
148
+ tool: e.toolName
173
149
  }, `Lifecycle hook tool_call_end failed: ${em}`);
174
150
  });
175
- toolEvent.result = this.systemReminder.appendToResult(toolEvent.result);
176
- this.toolUsageAnalyzer.recordUsage(toolEvent.toolName, !toolEvent.isError, durationMs);
177
- this.recordToolResult(context.sessionKey, toolEvent.toolName, toolEvent.result, toolEvent.isError, durationMs);
178
- if (toolEvent.isError) {
179
- const errorText = this.extractError(toolEvent.result);
180
- this.errorTracker.recordFailure(toolEvent.toolName, errorText);
181
- const errorMatch = this.errorPatternMatcher.matchError(errorText);
182
- if (errorMatch.matched && errorMatch.pattern) {
183
- const preview = errorText.length > 120 ? `${errorText.slice(0, 120)}…` : errorText;
184
- log.warn({
185
- tool: toolEvent.toolName,
186
- pattern: errorMatch.pattern.name,
187
- errorPreview: preview
188
- }, `Tool error matched pattern "${errorMatch.pattern.name}" (${toolEvent.toolName}): ${preview}`);
189
- }
190
- }
191
- }
192
- handleTurnEnd(_event, context) {
193
- this.errorTracker.reset();
194
- this.requestLimiter.reset();
195
- this.selfVerifyMiddleware.onTurnStart();
196
- this.toolChainTracker.endChain(context.sessionKey);
151
+ });
152
+ }
153
+ function installSystemReminderListener(bus, systemReminder) {
154
+ bus.on("tool_execution_end", (event) => {
155
+ const e = event;
156
+ e.result = systemReminder.appendToResult(e.result);
157
+ });
158
+ }
159
+ function installToolChainListener(bus, toolChainTracker) {
160
+ bus.on("turn_start", (_event, context) => {
161
+ toolChainTracker.startChain(context.sessionKey);
162
+ });
163
+ bus.on("tool_execution_start", (event, context) => {
164
+ const e = event;
165
+ toolChainTracker.recordCall(context.sessionKey, e.toolName, e.args || {}, 0);
166
+ });
167
+ bus.on("tool_execution_end", (event, context) => {
168
+ const e = event;
169
+ const durationMs = e.durationMs || 0;
170
+ const chain = toolChainTracker.getCurrentChain(context.sessionKey);
171
+ if (!chain) return;
172
+ const lastNode = chain.nodes[chain.nodes.length - 1];
173
+ if (lastNode && lastNode.toolName === e.toolName) toolChainTracker.recordResult(context.sessionKey, lastNode.id, e.result, e.isError ? "Tool execution failed" : void 0, durationMs);
174
+ });
175
+ bus.on("turn_end", (_event, context) => {
176
+ toolChainTracker.endChain(context.sessionKey);
177
+ });
178
+ }
179
+ function installToolUsageListener(bus, toolUsageAnalyzer) {
180
+ bus.on("tool_execution_end", (event) => {
181
+ const e = event;
182
+ const durationMs = e.durationMs || 0;
183
+ toolUsageAnalyzer.recordUsage(e.toolName, !e.isError, durationMs);
184
+ });
185
+ }
186
+ function extractErrorText(result) {
187
+ if (typeof result === "string") return result;
188
+ if (result && typeof result === "object") {
189
+ const obj = result;
190
+ if (typeof obj.error === "string") return obj.error;
191
+ if (typeof obj.message === "string") return obj.message;
192
+ return JSON.stringify(result);
197
193
  }
198
- handleAgentEnd(_event, _context) {
199
- this.progressManager.endTask();
200
- }
201
- trackFileEdit(toolName, args) {
194
+ return String(result);
195
+ }
196
+ function installErrorTrackingListener(bus, deps) {
197
+ bus.on("tool_execution_end", (event) => {
198
+ const e = event;
199
+ if (!e.isError) return;
200
+ const errorText = extractErrorText(e.result);
201
+ deps.errorTracker.recordFailure(e.toolName, errorText);
202
+ const errorMatch = deps.errorPatternMatcher.matchError(errorText);
203
+ if (errorMatch.matched && errorMatch.pattern) {
204
+ const preview = errorText.length > 120 ? `${errorText.slice(0, 120)}…` : errorText;
205
+ log.warn({
206
+ tool: e.toolName,
207
+ pattern: errorMatch.pattern.name,
208
+ errorPreview: preview
209
+ }, `Tool error matched pattern "${errorMatch.pattern.name}" (${e.toolName}): ${preview}`);
210
+ }
211
+ });
212
+ bus.on("turn_end", () => {
213
+ deps.errorTracker.reset();
214
+ });
215
+ }
216
+ function installSelfVerifyListener(bus, selfVerifyMiddleware) {
217
+ bus.on("tool_execution_start", (event) => {
218
+ const e = event;
219
+ const args = e.args;
220
+ const toolName = e.toolName;
202
221
  if (!toolName || !args) return;
203
222
  const name = toolName.toLowerCase();
204
- if (name.includes("write") && args.path) this.selfVerifyMiddleware.recordEdit(String(args.path), "write");
205
- else if (name.includes("edit") && args.path) this.selfVerifyMiddleware.recordEdit(String(args.path), "edit");
206
- }
207
- recordToolResult(sessionKey, toolName, result, isError, durationMs) {
208
- const chain = this.toolChainTracker.getCurrentChain(sessionKey);
209
- if (chain) {
210
- const lastNode = chain.nodes[chain.nodes.length - 1];
211
- if (lastNode && lastNode.toolName === toolName) this.toolChainTracker.recordResult(sessionKey, lastNode.id, result, isError ? "Tool execution failed" : void 0, durationMs);
212
- }
223
+ if (name.includes("write") && args.path) selfVerifyMiddleware.recordEdit(String(args.path), "write");
224
+ else if (name.includes("edit") && args.path) selfVerifyMiddleware.recordEdit(String(args.path), "edit");
225
+ });
226
+ bus.on("turn_end", () => {
227
+ selfVerifyMiddleware.onTurnStart();
228
+ });
229
+ }
230
+ /**
231
+ * Thin façade over {@link SessionEventBus} that pre-registers all built-in
232
+ * listeners in their required order. `handle(event, ctx)` is the entry point
233
+ * used by `AgentService.handleSessionEvent`; extensions can hook in via
234
+ * {@link registerListener} without touching this class.
235
+ */
236
+ var AgentEventHandler = class {
237
+ bus;
238
+ constructor(config) {
239
+ this.bus = new SessionEventBus();
240
+ installProgressListener(this.bus, config.progressManager);
241
+ installRequestLimitListener(this.bus, {
242
+ requestLimiter: config.requestLimiter,
243
+ progressManager: config.progressManager,
244
+ lifecycleManager: config.lifecycleManager
245
+ });
246
+ installLifecycleHookListener(this.bus, config.lifecycleManager);
247
+ installSystemReminderListener(this.bus, config.systemReminder);
248
+ installToolUsageListener(this.bus, config.toolUsageAnalyzer);
249
+ installToolChainListener(this.bus, config.toolChainTracker);
250
+ installErrorTrackingListener(this.bus, {
251
+ errorTracker: config.errorTracker,
252
+ errorPatternMatcher: config.errorPatternMatcher
253
+ });
254
+ installSelfVerifyListener(this.bus, config.selfVerifyMiddleware);
213
255
  }
214
- extractError(result) {
215
- if (typeof result === "string") return result;
216
- if (result && typeof result === "object") {
217
- const obj = result;
218
- if (obj.error && typeof obj.error === "string") return obj.error;
219
- if (obj.message && typeof obj.message === "string") return obj.message;
220
- return JSON.stringify(result);
221
- }
222
- return String(result);
256
+ /** Dispatch a pi-agent event to all registered listeners. */
257
+ handle(event, context) {
258
+ this.bus.dispatch(event, context);
223
259
  }
224
260
  /**
225
- * Get task duration in milliseconds
261
+ * Register an additional listener (e.g. from an extension). Returns an
262
+ * unsubscribe function. Listeners run after the built-ins in registration
263
+ * order; if you need to run before a built-in, you must create your own
264
+ * {@link SessionEventBus} instance.
226
265
  */
227
- getTaskDuration() {
228
- if (!this.taskStartTime) return 0;
229
- return Date.now() - this.taskStartTime;
266
+ registerListener(type, listener) {
267
+ return this.bus.on(type, listener);
230
268
  }
231
269
  };
232
270
  //#endregion
233
- export { AgentEventHandler };
271
+ export { AgentEventHandler, SessionEventBus };
234
272
 
235
273
  //# sourceMappingURL=agent-event-handler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-event-handler.js","names":["msgEvent"],"sources":["../../../../src/agent/orchestration/agent-event-handler.ts"],"sourcesContent":["/**\n * Agent Event Handler - Handles all Agent lifecycle events\n *\n * Processes agent events and coordinates related actions like\n * progress updates, error tracking, and lifecycle events.\n */\n\nimport type { AgentEvent } from '@earendil-works/pi-agent-core';\nimport type { SessionContext } from '../session/session-context.js';\nimport type { ProgressFeedbackManager } from '../lifecycle/progress.js';\nimport type { ToolErrorTracker } from '../tools/error-tracker.js';\nimport type { RequestLimiter } from '../models/request-limiter.js';\nimport type { LifecycleManager } from '../lifecycle/index.js';\nimport type { ToolChainTracker } from '../tools/chain-tracker.js';\nimport type { SelfVerifyMiddleware } from '../middleware/index.js';\nimport type { SystemReminder } from '../prompt/system-reminder.js';\nimport type { ToolUsageAnalyzer } from '../tools/usage-analyzer.js';\nimport type { ErrorPatternMatcher } from '../tools/error-pattern-matcher.js';\nimport type { ModelManager } from '../models/index.js';\nimport { extractTextContent } from '../context/workspace.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('AgentEventHandler');\n\nexport interface AgentEventHandlerConfig {\n progressManager: ProgressFeedbackManager;\n errorTracker: ToolErrorTracker;\n requestLimiter: RequestLimiter;\n lifecycleManager: LifecycleManager;\n toolChainTracker: ToolChainTracker;\n selfVerifyMiddleware: SelfVerifyMiddleware;\n systemReminder: SystemReminder;\n toolUsageAnalyzer: ToolUsageAnalyzer;\n errorPatternMatcher: ErrorPatternMatcher;\n modelManager: ModelManager;\n}\n\nexport class AgentEventHandler {\n private progressManager: ProgressFeedbackManager;\n private errorTracker: ToolErrorTracker;\n private requestLimiter: RequestLimiter;\n private lifecycleManager: LifecycleManager;\n private toolChainTracker: ToolChainTracker;\n private selfVerifyMiddleware: SelfVerifyMiddleware;\n private systemReminder: SystemReminder;\n private toolUsageAnalyzer: ToolUsageAnalyzer;\n private errorPatternMatcher: ErrorPatternMatcher;\n private modelManager: ModelManager;\n private taskStartTime: number = 0;\n\n constructor(config: AgentEventHandlerConfig) {\n this.progressManager = config.progressManager;\n this.errorTracker = config.errorTracker;\n this.requestLimiter = config.requestLimiter;\n this.lifecycleManager = config.lifecycleManager;\n this.toolChainTracker = config.toolChainTracker;\n this.selfVerifyMiddleware = config.selfVerifyMiddleware;\n this.systemReminder = config.systemReminder;\n this.toolUsageAnalyzer = config.toolUsageAnalyzer;\n this.errorPatternMatcher = config.errorPatternMatcher;\n this.modelManager = config.modelManager;\n }\n\n /**\n * Handle an agent event\n */\n handle(event: AgentEvent, context: SessionContext | null): void {\n if (!context) {\n if (event.type !== 'message_update') {\n log.warn(\n { eventType: event.type },\n `Agent event ignored (no SessionContext): ${event.type}`,\n );\n }\n return;\n }\n\n switch (event.type) {\n case 'agent_start':\n this.handleAgentStart(event, context);\n break;\n case 'turn_start':\n this.handleTurnStart(event, context);\n break;\n case 'message_start':\n this.handleMessageStart(event, context);\n break;\n case 'message_end':\n this.handleMessageEnd(event, context);\n break;\n case 'tool_execution_start':\n this.handleToolExecutionStart(event, context);\n break;\n case 'tool_execution_update':\n this.handleToolExecutionUpdate(event, context);\n break;\n case 'tool_execution_end':\n this.handleToolExecutionEnd(event, context);\n break;\n case 'message_update':\n // Handled by AgentService for streaming, but we acknowledge it here\n break;\n case 'turn_end':\n this.handleTurnEnd(event, context);\n break;\n case 'agent_end':\n this.handleAgentEnd(event, context);\n break;\n default:\n log.debug({ eventType: (event as AgentEvent).type }, 'Unhandled event type');\n }\n }\n\n private handleAgentStart(_event: AgentEvent, context: SessionContext): void {\n log.debug('Agent turn started');\n this.taskStartTime = Date.now();\n this.progressManager.startTask();\n\n const result = this.requestLimiter.recordRequest();\n\n this.lifecycleManager.emit('llm_request', context.sessionKey, {\n requestNumber: result.count,\n maxRequests: result.limit,\n }, context).catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn(\n { err, errorMessage: em, sessionKey: context.sessionKey, requestNumber: result.count, maxRequests: result.limit },\n `Lifecycle emit llm_request failed: ${em}`,\n );\n });\n\n this.progressManager.onRequestLimitStatus(\n result.count,\n result.limit,\n result.remaining,\n result.isWarning,\n result.shouldStop\n );\n\n if (result.shouldStop) {\n log.error(\n { count: result.count, limit: result.limit, sessionKey: context.sessionKey },\n `Request limit reached (${result.count}/${result.limit}) for session`,\n );\n }\n }\n\n private handleTurnStart(_event: AgentEvent, context: SessionContext): void {\n log.debug('Turn started');\n this.progressManager.onTurnStart();\n // One chain per LLM turn (pi-agent emits turn_start each round; turn_end clears the chain)\n this.toolChainTracker.startChain(context.sessionKey);\n }\n\n private handleMessageStart(event: AgentEvent, _context: SessionContext): void {\n const msgEvent = event as Extract<AgentEvent, { type: 'message_start' }>;\n if (msgEvent.message?.role === 'assistant') {\n log.debug('Assistant response starting');\n }\n }\n\n private handleMessageEnd(event: AgentEvent, context: SessionContext): void {\n const msgEvent = event as Extract<AgentEvent, { type: 'message_end' }>;\n if (msgEvent.message?.role === 'assistant') {\n const content = msgEvent.message.content;\n const text = Array.isArray(content)\n ? extractTextContent(content as Array<{ type: string; text?: string }>)\n : String(content);\n log.debug({ contentLength: text.length }, 'Assistant response complete');\n\n this.lifecycleManager.emit('llm_response', context.sessionKey, {\n response: text,\n usage: (msgEvent.message as any).usage,\n }, context).catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn(\n { err, errorMessage: em, sessionKey: context.sessionKey, responseChars: text.length },\n `Lifecycle emit llm_response failed: ${em}`,\n );\n });\n }\n }\n\n private handleToolExecutionStart(event: AgentEvent, context: SessionContext): void {\n const toolEvent = event as Extract<AgentEvent, { type: 'tool_execution_start' }>;\n log.debug({ tool: toolEvent.toolName, args: toolEvent.args }, 'Tool execution started');\n this.progressManager.onToolStart(toolEvent.toolName, toolEvent.args || {});\n\n this.lifecycleManager.emit('tool_call_start', context.sessionKey, {\n toolName: toolEvent.toolName,\n arguments: toolEvent.args || {},\n attemptNumber: 1,\n maxAttempts: 3,\n }, context).catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn(\n { err, errorMessage: em, sessionKey: context.sessionKey, tool: toolEvent.toolName },\n `Lifecycle emit tool_call_start failed: ${em}`,\n );\n });\n\n this.toolChainTracker.recordCall(\n context.sessionKey,\n toolEvent.toolName,\n toolEvent.args || {},\n 0\n );\n\n // Track file edits for self-verify\n this.trackFileEdit(toolEvent.toolName, toolEvent.args);\n }\n\n private handleToolExecutionUpdate(event: AgentEvent, _context: SessionContext): void {\n const toolEvent = event as Extract<AgentEvent, { type: 'tool_execution_update' }>;\n this.progressManager.onToolUpdate(toolEvent.toolName, toolEvent.partialResult);\n }\n\n private handleToolExecutionEnd(event: AgentEvent, context: SessionContext): void {\n const toolEvent = event as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n log.debug({ tool: toolEvent.toolName, isError: toolEvent.isError }, 'Tool execution complete');\n this.progressManager.onToolEnd(toolEvent.toolName, toolEvent.result, toolEvent.isError);\n\n const durationMs = (toolEvent as any).durationMs || 0;\n\n this.lifecycleManager.emit('tool_call_end', context.sessionKey, {\n toolName: toolEvent.toolName,\n success: !toolEvent.isError,\n result: toolEvent.result,\n error: toolEvent.isError ? String(toolEvent.result) : undefined,\n durationMs,\n }, context).catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn(\n { err, errorMessage: em, sessionKey: context.sessionKey, tool: toolEvent.toolName },\n `Lifecycle hook tool_call_end failed: ${em}`,\n );\n });\n\n // System reminder\n (toolEvent as any).result = this.systemReminder.appendToResult(toolEvent.result);\n\n // Record tool usage\n this.toolUsageAnalyzer.recordUsage(toolEvent.toolName, !toolEvent.isError, durationMs);\n\n // Record tool result in chain\n this.recordToolResult(context.sessionKey, toolEvent.toolName, toolEvent.result, toolEvent.isError, durationMs);\n\n // Track errors\n if (toolEvent.isError) {\n const errorText = this.extractError(toolEvent.result);\n this.errorTracker.recordFailure(toolEvent.toolName, errorText);\n\n // Match error pattern\n const errorMatch = this.errorPatternMatcher.matchError(errorText);\n if (errorMatch.matched && errorMatch.pattern) {\n const preview = errorText.length > 120 ? `${errorText.slice(0, 120)}…` : errorText;\n log.warn(\n { tool: toolEvent.toolName, pattern: errorMatch.pattern.name, errorPreview: preview },\n `Tool error matched pattern \"${errorMatch.pattern.name}\" (${toolEvent.toolName}): ${preview}`,\n );\n }\n }\n }\n\n private handleTurnEnd(_event: AgentEvent, context: SessionContext): void {\n // Reset trackers\n this.errorTracker.reset();\n this.requestLimiter.reset();\n this.selfVerifyMiddleware.onTurnStart();\n this.toolChainTracker.endChain(context.sessionKey);\n }\n\n private handleAgentEnd(_event: AgentEvent, _context: SessionContext): void {\n this.progressManager.endTask();\n }\n\n private trackFileEdit(toolName: string | undefined, args: Record<string, unknown> | undefined): void {\n if (!toolName || !args) return;\n \n const name = toolName.toLowerCase();\n if (name.includes('write') && args.path) {\n this.selfVerifyMiddleware.recordEdit(String(args.path), 'write');\n } else if (name.includes('edit') && args.path) {\n this.selfVerifyMiddleware.recordEdit(String(args.path), 'edit');\n }\n }\n\n private recordToolResult(\n sessionKey: string,\n toolName: string,\n result: unknown,\n isError: boolean,\n durationMs: number\n ): void {\n const chain = this.toolChainTracker.getCurrentChain(sessionKey);\n if (chain) {\n const lastNode = chain.nodes[chain.nodes.length - 1];\n if (lastNode && lastNode.toolName === toolName) {\n this.toolChainTracker.recordResult(\n sessionKey,\n lastNode.id,\n result,\n isError ? 'Tool execution failed' : undefined,\n durationMs\n );\n }\n }\n }\n\n private extractError(result: unknown): string {\n if (typeof result === 'string') return result;\n if (result && typeof result === 'object') {\n const obj = result as Record<string, unknown>;\n if (obj.error && typeof obj.error === 'string') return obj.error;\n if (obj.message && typeof obj.message === 'string') return obj.message;\n return JSON.stringify(result);\n }\n return String(result);\n }\n\n /**\n * Get task duration in milliseconds\n */\n getTaskDuration(): number {\n if (!this.taskStartTime) return 0;\n return Date.now() - this.taskStartTime;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"agent-event-handler.js","names":[],"sources":["../../../../src/agent/orchestration/agent-event-handler.ts"],"sourcesContent":["/**\n * Agent Event Handler — coordinates listeners on pi-agent events.\n *\n * Previously a single god-handler with ten manager fields and one `switch`. Now a\n * thin façade around {@link SessionEventBus}: each concern (progress, lifecycle\n * hooks, tool-chain recording, error tracking, self-verify, etc.) registers its\n * own listener at construction time, and external code can add new listeners via\n * {@link AgentEventHandler.registerListener} without modifying this file (OCP).\n *\n * Ordering note: a few listeners are order-sensitive (notably the\n * `tool_execution_end` chain — `SystemReminder` mutates `event.result` in place\n * and downstream listeners read the mutated value). The `installX` calls below\n * preserve the exact order from the previous implementation.\n */\n\nimport type { AgentEvent } from '@earendil-works/pi-agent-core';\nimport type { SessionContext } from '../session/session-context.js';\nimport type { ProgressFeedbackManager } from '../lifecycle/progress.js';\nimport type { ToolErrorTracker } from '../tools/error-tracker.js';\nimport type { RequestLimiter } from '../models/request-limiter.js';\nimport type { LifecycleManager } from '../lifecycle/index.js';\nimport type { ToolChainTracker } from '../tools/chain-tracker.js';\nimport type { SelfVerifyMiddleware } from '../middleware/index.js';\nimport type { SystemReminder } from '../prompt/system-reminder.js';\nimport type { ToolUsageAnalyzer } from '../tools/usage-analyzer.js';\nimport type { ErrorPatternMatcher } from '../tools/error-pattern-matcher.js';\nimport { extractTextContent } from '../context/workspace.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('AgentEventHandler');\n\n// ── Event bus ──────────────────────────────────────────────────────────────\n\nexport type SessionEventListener = (event: AgentEvent, context: SessionContext) => void;\nexport type SessionEventTypeFilter = AgentEvent['type'] | 'all';\n\n/**\n * Typed pub/sub for agent events. Listeners run in registration order; the bus\n * itself is synchronous — listeners that need async work must dispatch their own\n * promises (typically by awaiting and logging on error, like the lifecycle hooks).\n */\nexport class SessionEventBus {\n private readonly listeners = new Map<SessionEventTypeFilter, SessionEventListener[]>();\n\n on(type: SessionEventTypeFilter, listener: SessionEventListener): () => void {\n const bucket = this.listeners.get(type) ?? [];\n bucket.push(listener);\n this.listeners.set(type, bucket);\n return () => {\n const current = this.listeners.get(type);\n if (!current) return;\n const idx = current.indexOf(listener);\n if (idx >= 0) current.splice(idx, 1);\n };\n }\n\n dispatch(event: AgentEvent, context: SessionContext | null): void {\n if (!context) {\n if (event.type !== 'message_update') {\n log.warn(\n { eventType: event.type },\n `Agent event ignored (no SessionContext): ${event.type}`,\n );\n }\n return;\n }\n const exact = this.listeners.get(event.type);\n if (exact) {\n for (const listener of exact) {\n listener(event, context);\n }\n }\n const all = this.listeners.get('all');\n if (all) {\n for (const listener of all) {\n listener(event, context);\n }\n }\n }\n}\n\n// ── Built-in listener installers ───────────────────────────────────────────\n\nfunction installProgressListener(bus: SessionEventBus, progressManager: ProgressFeedbackManager): void {\n bus.on('agent_start', () => {\n log.debug('Agent turn started');\n progressManager.startTask();\n });\n bus.on('turn_start', () => {\n log.debug('Turn started');\n progressManager.onTurnStart();\n });\n bus.on('tool_execution_start', (event) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_start' }>;\n log.debug({ tool: e.toolName, args: e.args }, 'Tool execution started');\n progressManager.onToolStart(e.toolName, e.args || {});\n });\n bus.on('tool_execution_update', (event) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_update' }>;\n progressManager.onToolUpdate(e.toolName, e.partialResult);\n });\n bus.on('tool_execution_end', (event) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n log.debug({ tool: e.toolName, isError: e.isError }, 'Tool execution complete');\n progressManager.onToolEnd(e.toolName, e.result, e.isError);\n });\n bus.on('agent_end', () => {\n progressManager.endTask();\n });\n}\n\nfunction installRequestLimitListener(\n bus: SessionEventBus,\n deps: {\n requestLimiter: RequestLimiter;\n progressManager: ProgressFeedbackManager;\n lifecycleManager: LifecycleManager;\n },\n): void {\n bus.on('agent_start', (_event, context) => {\n const result = deps.requestLimiter.recordRequest();\n\n deps.lifecycleManager\n .emit(\n 'llm_request',\n context.sessionKey,\n { requestNumber: result.count, maxRequests: result.limit },\n context,\n )\n .catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn(\n {\n err,\n errorMessage: em,\n sessionKey: context.sessionKey,\n requestNumber: result.count,\n maxRequests: result.limit,\n },\n `Lifecycle emit llm_request failed: ${em}`,\n );\n });\n\n deps.progressManager.onRequestLimitStatus(\n result.count,\n result.limit,\n result.remaining,\n result.isWarning,\n result.shouldStop,\n );\n\n if (result.shouldStop) {\n log.error(\n { count: result.count, limit: result.limit, sessionKey: context.sessionKey },\n `Request limit reached (${result.count}/${result.limit}) for session`,\n );\n }\n });\n\n bus.on('turn_end', () => {\n deps.requestLimiter.reset();\n });\n}\n\nfunction installLifecycleHookListener(bus: SessionEventBus, lifecycleManager: LifecycleManager): void {\n bus.on('message_end', (event, context) => {\n const e = event as Extract<AgentEvent, { type: 'message_end' }>;\n if (e.message?.role !== 'assistant') return;\n const content = e.message.content;\n const text = Array.isArray(content)\n ? extractTextContent(content as Array<{ type: string; text?: string }>)\n : String(content);\n log.debug({ contentLength: text.length }, 'Assistant response complete');\n\n lifecycleManager\n .emit(\n 'llm_response',\n context.sessionKey,\n { response: text, usage: (e.message as { usage?: unknown }).usage },\n context,\n )\n .catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn(\n { err, errorMessage: em, sessionKey: context.sessionKey, responseChars: text.length },\n `Lifecycle emit llm_response failed: ${em}`,\n );\n });\n });\n\n bus.on('tool_execution_start', (event, context) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_start' }>;\n lifecycleManager\n .emit(\n 'tool_call_start',\n context.sessionKey,\n {\n toolName: e.toolName,\n arguments: e.args || {},\n attemptNumber: 1,\n maxAttempts: 3,\n },\n context,\n )\n .catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn(\n { err, errorMessage: em, sessionKey: context.sessionKey, tool: e.toolName },\n `Lifecycle emit tool_call_start failed: ${em}`,\n );\n });\n });\n\n bus.on('tool_execution_end', (event, context) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n const durationMs = (e as { durationMs?: number }).durationMs || 0;\n lifecycleManager\n .emit(\n 'tool_call_end',\n context.sessionKey,\n {\n toolName: e.toolName,\n success: !e.isError,\n result: e.result,\n error: e.isError ? String(e.result) : undefined,\n durationMs,\n },\n context,\n )\n .catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn(\n { err, errorMessage: em, sessionKey: context.sessionKey, tool: e.toolName },\n `Lifecycle hook tool_call_end failed: ${em}`,\n );\n });\n });\n}\n\nfunction installSystemReminderListener(bus: SessionEventBus, systemReminder: SystemReminder): void {\n // MUTATES `event.result` so downstream listeners (tool-chain, error-tracking) see\n // the decorated text. Must run AFTER progress + lifecycle hooks (they consume the\n // original) and BEFORE tool-chain + error-tracking.\n bus.on('tool_execution_end', (event) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_end' }> & { result: unknown };\n e.result = systemReminder.appendToResult(e.result);\n });\n}\n\nfunction installToolChainListener(bus: SessionEventBus, toolChainTracker: ToolChainTracker): void {\n bus.on('turn_start', (_event, context) => {\n // One chain per LLM turn (pi-agent emits turn_start each round; turn_end clears the chain).\n toolChainTracker.startChain(context.sessionKey);\n });\n bus.on('tool_execution_start', (event, context) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_start' }>;\n toolChainTracker.recordCall(context.sessionKey, e.toolName, e.args || {}, 0);\n });\n bus.on('tool_execution_end', (event, context) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n const durationMs = (e as { durationMs?: number }).durationMs || 0;\n const chain = toolChainTracker.getCurrentChain(context.sessionKey);\n if (!chain) return;\n const lastNode = chain.nodes[chain.nodes.length - 1];\n if (lastNode && lastNode.toolName === e.toolName) {\n toolChainTracker.recordResult(\n context.sessionKey,\n lastNode.id,\n e.result,\n e.isError ? 'Tool execution failed' : undefined,\n durationMs,\n );\n }\n });\n bus.on('turn_end', (_event, context) => {\n toolChainTracker.endChain(context.sessionKey);\n });\n}\n\nfunction installToolUsageListener(bus: SessionEventBus, toolUsageAnalyzer: ToolUsageAnalyzer): void {\n bus.on('tool_execution_end', (event) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n const durationMs = (e as { durationMs?: number }).durationMs || 0;\n toolUsageAnalyzer.recordUsage(e.toolName, !e.isError, durationMs);\n });\n}\n\nfunction extractErrorText(result: unknown): string {\n if (typeof result === 'string') return result;\n if (result && typeof result === 'object') {\n const obj = result as Record<string, unknown>;\n if (typeof obj.error === 'string') return obj.error;\n if (typeof obj.message === 'string') return obj.message;\n return JSON.stringify(result);\n }\n return String(result);\n}\n\nfunction installErrorTrackingListener(\n bus: SessionEventBus,\n deps: { errorTracker: ToolErrorTracker; errorPatternMatcher: ErrorPatternMatcher },\n): void {\n bus.on('tool_execution_end', (event) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n if (!e.isError) return;\n const errorText = extractErrorText(e.result);\n deps.errorTracker.recordFailure(e.toolName, errorText);\n\n const errorMatch = deps.errorPatternMatcher.matchError(errorText);\n if (errorMatch.matched && errorMatch.pattern) {\n const preview = errorText.length > 120 ? `${errorText.slice(0, 120)}…` : errorText;\n log.warn(\n { tool: e.toolName, pattern: errorMatch.pattern.name, errorPreview: preview },\n `Tool error matched pattern \"${errorMatch.pattern.name}\" (${e.toolName}): ${preview}`,\n );\n }\n });\n bus.on('turn_end', () => {\n deps.errorTracker.reset();\n });\n}\n\nfunction installSelfVerifyListener(bus: SessionEventBus, selfVerifyMiddleware: SelfVerifyMiddleware): void {\n bus.on('tool_execution_start', (event) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_start' }>;\n const args = e.args;\n const toolName = e.toolName;\n if (!toolName || !args) return;\n const name = toolName.toLowerCase();\n if (name.includes('write') && args.path) {\n selfVerifyMiddleware.recordEdit(String(args.path), 'write');\n } else if (name.includes('edit') && args.path) {\n selfVerifyMiddleware.recordEdit(String(args.path), 'edit');\n }\n });\n bus.on('turn_end', () => {\n selfVerifyMiddleware.onTurnStart();\n });\n}\n\n// ── Public façade ───────────────────────────────────────────────────────────\n\nexport interface AgentEventHandlerConfig {\n progressManager: ProgressFeedbackManager;\n errorTracker: ToolErrorTracker;\n requestLimiter: RequestLimiter;\n lifecycleManager: LifecycleManager;\n toolChainTracker: ToolChainTracker;\n selfVerifyMiddleware: SelfVerifyMiddleware;\n systemReminder: SystemReminder;\n toolUsageAnalyzer: ToolUsageAnalyzer;\n errorPatternMatcher: ErrorPatternMatcher;\n}\n\n/**\n * Thin façade over {@link SessionEventBus} that pre-registers all built-in\n * listeners in their required order. `handle(event, ctx)` is the entry point\n * used by `AgentService.handleSessionEvent`; extensions can hook in via\n * {@link registerListener} without touching this class.\n */\nexport class AgentEventHandler {\n private readonly bus: SessionEventBus;\n\n constructor(config: AgentEventHandlerConfig) {\n this.bus = new SessionEventBus();\n\n // Order matters for `tool_execution_end`: SystemReminder mutates `event.result`\n // and ToolChain + ErrorTracking depend on the mutated value. Keep these in this\n // exact sequence.\n installProgressListener(this.bus, config.progressManager);\n installRequestLimitListener(this.bus, {\n requestLimiter: config.requestLimiter,\n progressManager: config.progressManager,\n lifecycleManager: config.lifecycleManager,\n });\n installLifecycleHookListener(this.bus, config.lifecycleManager);\n installSystemReminderListener(this.bus, config.systemReminder);\n installToolUsageListener(this.bus, config.toolUsageAnalyzer);\n installToolChainListener(this.bus, config.toolChainTracker);\n installErrorTrackingListener(this.bus, {\n errorTracker: config.errorTracker,\n errorPatternMatcher: config.errorPatternMatcher,\n });\n installSelfVerifyListener(this.bus, config.selfVerifyMiddleware);\n }\n\n /** Dispatch a pi-agent event to all registered listeners. */\n handle(event: AgentEvent, context: SessionContext | null): void {\n this.bus.dispatch(event, context);\n }\n\n /**\n * Register an additional listener (e.g. from an extension). Returns an\n * unsubscribe function. Listeners run after the built-ins in registration\n * order; if you need to run before a built-in, you must create your own\n * {@link SessionEventBus} instance.\n */\n registerListener(type: SessionEventTypeFilter, listener: SessionEventListener): () => void {\n return this.bus.on(type, listener);\n }\n}\n"],"mappings":"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"}
@@ -7,6 +7,7 @@
7
7
  import type { Config } from '../../config/schema.js';
8
8
  import type { InboundMessage } from '../../infra/bus/index.js';
9
9
  import type { SessionConfigStore, SessionStore } from '../../session/index.js';
10
+ import type { SessionHydrator } from '../session/index.js';
10
11
  import type { ThinkLevel } from '../transcript/thinking-types.js';
11
12
  import type { ModelManager } from '../models/index.js';
12
13
  import type { SessionContext } from '../session/session-context.js';
@@ -21,8 +22,8 @@ export interface AgentOrchestratorConfig {
21
22
  eventHandler: AgentEventHandler;
22
23
  feedbackCoordinator: FeedbackCoordinator;
23
24
  sessionConfigStore: SessionConfigStore;
24
- /** Load per-session workspace override and mkdir before creating the agent. */
25
- hydrateSessionWorkspaceFromStore?: (sessionKey: string) => Promise<void>;
25
+ /** Per-session hydration (workspace override + model override) before the agent runs. */
26
+ sessionHydrator: SessionHydrator;
26
27
  getThinkingDefault: () => ThinkLevel | undefined;
27
28
  /** Per-session default from merged `agents.list` / defaults (optional). */
28
29
  getThinkingDefaultForSession?: (sessionKey: string) => ThinkLevel | undefined;
@@ -48,7 +49,7 @@ export declare class AgentOrchestrator {
48
49
  private eventHandler;
49
50
  private feedbackCoordinator;
50
51
  private sessionConfigStore;
51
- private hydrateSessionWorkspaceFromStore?;
52
+ private sessionHydrator;
52
53
  private getThinkingDefault;
53
54
  private getThinkingDefaultForSession?;
54
55
  private workspaceRoot;
@@ -59,7 +60,6 @@ export declare class AgentOrchestrator {
59
60
  private onEmbeddedStreamEvent?;
60
61
  private onEmbeddedTurnComplete?;
61
62
  constructor(config: AgentOrchestratorConfig);
62
- private hydrateSessionModelFromStore;
63
63
  /**
64
64
  * Process a message through the agent orchestration pipeline
65
65
  */
@@ -23,7 +23,7 @@ var AgentOrchestrator = class {
23
23
  eventHandler;
24
24
  feedbackCoordinator;
25
25
  sessionConfigStore;
26
- hydrateSessionWorkspaceFromStore;
26
+ sessionHydrator;
27
27
  getThinkingDefault;
28
28
  getThinkingDefaultForSession;
29
29
  workspaceRoot;
@@ -40,7 +40,7 @@ var AgentOrchestrator = class {
40
40
  this.eventHandler = config.eventHandler;
41
41
  this.feedbackCoordinator = config.feedbackCoordinator;
42
42
  this.sessionConfigStore = config.sessionConfigStore;
43
- this.hydrateSessionWorkspaceFromStore = config.hydrateSessionWorkspaceFromStore;
43
+ this.sessionHydrator = config.sessionHydrator;
44
44
  this.getThinkingDefault = config.getThinkingDefault;
45
45
  this.getThinkingDefaultForSession = config.getThinkingDefaultForSession;
46
46
  this.workspaceRoot = config.workspaceRoot;
@@ -51,17 +51,13 @@ var AgentOrchestrator = class {
51
51
  this.onEmbeddedStreamEvent = config.onEmbeddedStreamEvent;
52
52
  this.onEmbeddedTurnComplete = config.onEmbeddedTurnComplete;
53
53
  }
54
- async hydrateSessionModelFromStore(sessionKey) {
55
- const cfg = await this.sessionConfigStore.get(sessionKey);
56
- if (cfg?.modelOverride) await this.modelManager.switchModelForSession(sessionKey, cfg.modelOverride);
57
- }
58
54
  /**
59
55
  * Process a message through the agent orchestration pipeline
60
56
  */
61
57
  async process(msg, context) {
62
58
  const { sessionKey } = context;
63
59
  log.debug({ sessionKey }, "Processing message through agent orchestrator");
64
- await this.hydrateSessionWorkspaceFromStore?.(sessionKey);
60
+ await this.sessionHydrator.workspace(sessionKey);
65
61
  if (typeof msg.content === "string" && (sessionKey.startsWith("cron:") || context.channel === "cron")) {
66
62
  const content = msg.content;
67
63
  if (content.includes("__xopc_memory_dreaming_sweep__") || content.includes("__xopc_memory_dreaming_light_sweep__") || content.includes("__xopc_memory_dreaming_rem_sweep__")) {
@@ -116,7 +112,7 @@ var AgentOrchestrator = class {
116
112
  }
117
113
  }
118
114
  try {
119
- await this.hydrateSessionModelFromStore(sessionKey);
115
+ await this.sessionHydrator.model(sessionKey);
120
116
  const thinkingDefault = this.getThinkingDefaultForSession?.(sessionKey) ?? this.getThinkingDefault();
121
117
  const thinkingLevel = await resolveEffectiveThinkingLevel(this.sessionConfigStore, sessionKey, null, thinkingDefault);
122
118
  this.agentManager.setThinkingLevel(sessionKey, thinkingLevel);