@xopcai/xopc 0.0.81 → 0.0.83

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (709) hide show
  1. package/README.md +1 -1
  2. package/README.zh-CN.md +1 -1
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/feishu/src/outbound/media-load.js +2 -3
  5. package/dist/extensions/feishu/src/outbound/media-load.js.map +1 -1
  6. package/dist/extensions/feishu/src/schema/config-schema.d.ts +6 -6
  7. package/dist/extensions/telegram/src/config-schema.d.ts +6 -6
  8. package/dist/extensions/telegram/src/plugin.d.ts +1 -1
  9. package/dist/extensions/telegram/src/plugin.js +1 -1
  10. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  11. package/dist/extensions/telegram/xopc.extension.json +1 -1
  12. package/dist/extensions/weixin/src/api/api.js +3 -3
  13. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  14. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  15. package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
  16. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  17. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  18. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  19. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  20. package/dist/extensions/weixin/src/plugin.js +1 -1
  21. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  22. package/dist/gateway/static/root/assets/agents-CrpYTHJS.js +222 -0
  23. package/dist/gateway/static/root/assets/{apps-page-Ci17oA_o.js → apps-page-1mcKh5Rh.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-settings-zd6QNKPx.js +1 -0
  25. package/dist/gateway/static/root/assets/{channels-status-swr-CUU3faST.js → channels-status-swr-uRAuhiUo.js} +1 -1
  26. package/dist/gateway/static/root/assets/{cron-api-BVQ2n75R.js → cron-api-O2Q_ruV6.js} +1 -1
  27. package/dist/gateway/static/root/assets/{cron-page-x582Y6D5.js → cron-page-By09AQD-.js} +1 -1
  28. package/dist/gateway/static/root/assets/{dist-XT96cQdR.js → dist-BpQxde0t.js} +1 -1
  29. package/dist/gateway/static/root/assets/{extension-debug-page-Czzfrtt5.js → extension-debug-page-CY27wj_p.js} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-page-B_c5UIqX.js → extension-page-C-Ed5ZmP.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-settings-page-Ckvjgw0_.js → extension-settings-page-raLux7E7.js} +1 -1
  32. package/dist/gateway/static/root/assets/fetch-2iRFmd3n.js +3 -0
  33. package/dist/gateway/static/root/assets/{field-primitives-DQpT8iVa.js → field-primitives-fa_hiQcX.js} +1 -1
  34. package/dist/gateway/static/root/assets/{heartbeat-config-api-DKqOuQ0V.js → heartbeat-config-api-BVl5VHvL.js} +1 -1
  35. package/dist/gateway/static/root/assets/index-BuFldCsB.css +1 -0
  36. package/dist/gateway/static/root/assets/{index-Bq3Lg4bG.js → index-Y-iqo-gL.js} +95 -86
  37. package/dist/gateway/static/root/assets/{logs-page-B3CwJNBq.js → logs-page-BdH2n7ZW.js} +1 -1
  38. package/dist/gateway/static/root/assets/sessions-page-Vpchzdp-.js +1 -0
  39. package/dist/gateway/static/root/assets/{settings-form-section-CjjEpVYM.js → settings-form-section-Kk1yAGBl.js} +1 -1
  40. package/dist/gateway/static/root/assets/settings-page-KBm0u6Dz.js +3 -0
  41. package/dist/gateway/static/root/assets/skills-page-BjeXXaOn.js +2 -0
  42. package/dist/gateway/static/root/assets/{theme-store-DnwYutiX.js → theme-store-D01dJt95.js} +1 -1
  43. package/dist/gateway/static/root/assets/{utils-DQehHvlm.js → utils-DpTxN4AF.js} +1 -1
  44. package/dist/gateway/static/root/assets/voice-api-key-field-CwO8Cf01.js +1 -0
  45. package/dist/gateway/static/root/index.html +4 -4
  46. package/dist/package.js +1 -1
  47. package/dist/src/agent/agent-instance-gateway.d.ts +50 -0
  48. package/dist/src/agent/agent-instance-gateway.js +1 -0
  49. package/dist/src/agent/agent-manager.d.ts +20 -14
  50. package/dist/src/agent/agent-manager.js +74 -186
  51. package/dist/src/agent/agent-manager.js.map +1 -1
  52. package/dist/src/agent/background-review/coordinator.d.ts +61 -0
  53. package/dist/src/agent/background-review/coordinator.js +120 -0
  54. package/dist/src/agent/background-review/coordinator.js.map +1 -0
  55. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  56. package/dist/src/agent/child-agent-factory.d.ts +14 -0
  57. package/dist/src/agent/child-agent-factory.js +2 -8
  58. package/dist/src/agent/child-agent-factory.js.map +1 -1
  59. package/dist/src/agent/context/workspace-seed.js +3 -3
  60. package/dist/src/agent/embedded/index.d.ts +1 -2
  61. package/dist/src/agent/embedded/index.js +2 -3
  62. package/dist/src/agent/embedded/run-for-session.d.ts +2 -2
  63. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  64. package/dist/src/agent/embedded/runs.d.ts +32 -0
  65. package/dist/src/agent/embedded/runs.js +79 -19
  66. package/dist/src/agent/embedded/runs.js.map +1 -1
  67. package/dist/src/agent/embedded/session-manager-cache.d.ts +14 -0
  68. package/dist/src/agent/embedded/session-manager-cache.js +32 -11
  69. package/dist/src/agent/embedded/session-manager-cache.js.map +1 -1
  70. package/dist/src/agent/embedded/session-runner.d.ts +37 -7
  71. package/dist/src/agent/embedded/session-runner.js +184 -153
  72. package/dist/src/agent/embedded/session-runner.js.map +1 -1
  73. package/dist/src/agent/embedded/session-tool-result-guard.d.ts +57 -9
  74. package/dist/src/agent/embedded/session-tool-result-guard.js +159 -67
  75. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  76. package/dist/src/agent/goals/goal-run-store.js +4 -4
  77. package/dist/src/agent/goals/persistent-goal-service.d.ts +84 -0
  78. package/dist/src/agent/goals/persistent-goal-service.js +139 -0
  79. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -0
  80. package/dist/src/agent/goals/post-turn.js +2 -2
  81. package/dist/src/agent/goals/state.d.ts +1 -1
  82. package/dist/src/agent/goals/state.js.map +1 -1
  83. package/dist/src/agent/image/load-image-media.js +1 -1
  84. package/dist/src/agent/inbound/inbound-loop.d.ts +77 -0
  85. package/dist/src/agent/inbound/inbound-loop.js +226 -0
  86. package/dist/src/agent/inbound/inbound-loop.js.map +1 -0
  87. package/dist/src/agent/inbound/turn-dispatcher.d.ts +80 -0
  88. package/dist/src/agent/inbound/turn-dispatcher.js +138 -0
  89. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -0
  90. package/dist/src/agent/ipc/bus.js +1 -1
  91. package/dist/src/agent/ipc/inbox.js +2 -2
  92. package/dist/src/agent/ipc/socket.js +1 -1
  93. package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -1
  94. package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
  95. package/dist/src/agent/lifecycle/manager.d.ts +1 -1
  96. package/dist/src/agent/lifecycle/manager.js.map +1 -1
  97. package/dist/src/agent/lifecycle/types.d.ts +1 -1
  98. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  99. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  100. package/dist/src/agent/memory/dreaming/events.js +1 -1
  101. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  102. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  103. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  104. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  105. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  106. package/dist/src/agent/memory/dreaming/utils.d.ts +12 -2
  107. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  108. package/dist/src/agent/memory/dreaming/utils.js.map +1 -1
  109. package/dist/src/agent/memory/index.js +3 -3
  110. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  111. package/dist/src/agent/memory/prefetch-coordinator.d.ts +37 -0
  112. package/dist/src/agent/memory/prefetch-coordinator.js +45 -0
  113. package/dist/src/agent/memory/prefetch-coordinator.js.map +1 -0
  114. package/dist/src/agent/messaging/command-handler.d.ts +5 -1
  115. package/dist/src/agent/messaging/command-handler.js +24 -96
  116. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  117. package/dist/src/agent/messaging/index.d.ts +1 -0
  118. package/dist/src/agent/messaging/index.js +2 -1
  119. package/dist/src/agent/messaging/message-router.d.ts +1 -1
  120. package/dist/src/agent/messaging/message-router.js.map +1 -1
  121. package/dist/src/agent/messaging/outbound-coordinator.d.ts +82 -0
  122. package/dist/src/agent/messaging/outbound-coordinator.js +123 -0
  123. package/dist/src/agent/messaging/outbound-coordinator.js.map +1 -0
  124. package/dist/src/agent/models/manager.js +1 -1
  125. package/dist/src/agent/orchestration/agent-event-handler.d.ts +36 -33
  126. package/dist/src/agent/orchestration/agent-event-handler.js +212 -174
  127. package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
  128. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +4 -4
  129. package/dist/src/agent/orchestration/agent-orchestrator.js +4 -8
  130. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  131. package/dist/src/agent/orchestration/index.d.ts +1 -1
  132. package/dist/src/agent/orchestration/index.js +2 -2
  133. package/dist/src/agent/prompt/service-prompt-builder.js +4 -4
  134. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  135. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  136. package/dist/src/agent/sandbox/path-policy.js +1 -1
  137. package/dist/src/agent/service/async-queue.d.ts +20 -0
  138. package/dist/src/agent/service/async-queue.js +53 -0
  139. package/dist/src/agent/service/async-queue.js.map +1 -0
  140. package/dist/src/agent/service/build-direct-message-content.d.ts +2 -2
  141. package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
  142. package/dist/src/agent/service/direct-turn-helpers.d.ts +70 -0
  143. package/dist/src/agent/service/direct-turn-helpers.js +90 -0
  144. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -0
  145. package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -3
  146. package/dist/src/agent/service/process-direct-one-shot.js +17 -34
  147. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  148. package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
  149. package/dist/src/agent/service/process-direct-streaming.js +133 -167
  150. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  151. package/dist/src/agent/service/webchat-tts.d.ts +2 -2
  152. package/dist/src/agent/service/webchat-tts.js +1 -1
  153. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  154. package/dist/src/agent/service.d.ts +62 -167
  155. package/dist/src/agent/service.js +177 -786
  156. package/dist/src/agent/service.js.map +1 -1
  157. package/dist/src/agent/session/index.d.ts +4 -0
  158. package/dist/src/agent/session/index.js +5 -1
  159. package/dist/src/agent/session/session-config-service.d.ts +68 -0
  160. package/dist/src/agent/session/session-config-service.js +172 -0
  161. package/dist/src/agent/session/session-config-service.js.map +1 -0
  162. package/dist/src/agent/session/session-context.d.ts +27 -19
  163. package/dist/src/agent/session/session-context.js +39 -24
  164. package/dist/src/agent/session/session-context.js.map +1 -1
  165. package/dist/src/agent/session/session-hydrator.d.ts +42 -0
  166. package/dist/src/agent/session/session-hydrator.js +66 -0
  167. package/dist/src/agent/session/session-hydrator.js.map +1 -0
  168. package/dist/src/agent/session/session-inspector.d.ts +80 -0
  169. package/dist/src/agent/session/session-inspector.js +119 -0
  170. package/dist/src/agent/session/session-inspector.js.map +1 -0
  171. package/dist/src/agent/session/session-state-bag.d.ts +83 -0
  172. package/dist/src/agent/session/session-state-bag.js +192 -0
  173. package/dist/src/agent/session/session-state-bag.js.map +1 -0
  174. package/dist/src/agent/skills/config.js +1 -1
  175. package/dist/src/agent/skills/hub-hash.js +2 -2
  176. package/dist/src/agent/skills/hub-lock.js +1 -1
  177. package/dist/src/agent/skills/hub-pull.js +2 -2
  178. package/dist/src/agent/skills/index.d.ts +0 -2
  179. package/dist/src/agent/skills/index.js +3 -5
  180. package/dist/src/agent/skills/index.js.map +1 -1
  181. package/dist/src/agent/skills/managed-store.js +1 -1
  182. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -6
  183. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
  184. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +35 -7
  185. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  186. package/dist/src/agent/skills/scanner.js +1 -1
  187. package/dist/src/agent/skills/skill-manage-ops.js +2 -2
  188. package/dist/src/agent/skills/skill-manager.js +1 -1
  189. package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +7 -0
  190. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +37 -0
  191. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  192. package/dist/src/agent/tools/delegate-tool.d.ts +7 -0
  193. package/dist/src/agent/tools/delegate-tool.js +2 -1
  194. package/dist/src/agent/tools/delegate-tool.js.map +1 -1
  195. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  196. package/dist/src/agent/tools/executor.d.ts +34 -15
  197. package/dist/src/agent/tools/executor.js +44 -79
  198. package/dist/src/agent/tools/executor.js.map +1 -1
  199. package/dist/src/agent/tools/factory.d.ts +6 -0
  200. package/dist/src/agent/tools/factory.js +63 -4
  201. package/dist/src/agent/tools/factory.js.map +1 -1
  202. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  203. package/dist/src/agent/tools/send-media.js +1 -1
  204. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  205. package/dist/src/agent/tools/skills-tools.js +1 -1
  206. package/dist/src/agent/tools/tts-tool.js +1 -1
  207. package/dist/src/agent/tools/write.js +1 -1
  208. package/dist/src/agent/workspace-runtime/registry.d.ts +48 -0
  209. package/dist/src/agent/workspace-runtime/registry.js +59 -0
  210. package/dist/src/agent/workspace-runtime/registry.js.map +1 -0
  211. package/dist/src/auth/credentials.js +3 -3
  212. package/dist/src/auth/profiles/store.js +1 -1
  213. package/dist/src/auth/sync-provider-auth.js +1 -1
  214. package/dist/src/browser/cdp-local-launcher.js +4 -3
  215. package/dist/src/browser/cdp-local-launcher.js.map +1 -1
  216. package/dist/src/browser/index.d.ts +1 -0
  217. package/dist/src/browser/index.js +2 -1
  218. package/dist/src/browser/manager.js +3 -2
  219. package/dist/src/browser/manager.js.map +1 -1
  220. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  221. package/dist/src/browser/providers/browser-use.js +2 -1
  222. package/dist/src/browser/providers/browser-use.js.map +1 -1
  223. package/dist/src/browser/providers/browserbase.js +2 -1
  224. package/dist/src/browser/providers/browserbase.js.map +1 -1
  225. package/dist/src/browser/providers/cloakbrowser.js +7 -6
  226. package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
  227. package/dist/src/browser/providers/playwright-doctor.d.ts +2 -0
  228. package/dist/src/browser/providers/playwright-doctor.js +7 -3
  229. package/dist/src/browser/providers/playwright-doctor.js.map +1 -1
  230. package/dist/src/browser/readiness.d.ts +33 -0
  231. package/dist/src/browser/readiness.js +138 -0
  232. package/dist/src/browser/readiness.js.map +1 -0
  233. package/dist/src/browser/stealth.js +2 -2
  234. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  235. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  236. package/dist/src/channels/channel-domain.d.ts +1 -1
  237. package/dist/src/channels/config-helpers.d.ts +1 -1
  238. package/dist/src/channels/config-helpers.js.map +1 -1
  239. package/dist/src/channels/heartbeat-scheduler.d.ts +40 -0
  240. package/dist/src/channels/heartbeat-scheduler.js +94 -0
  241. package/dist/src/channels/heartbeat-scheduler.js.map +1 -0
  242. package/dist/src/channels/lifecycle-supervisor.d.ts +81 -0
  243. package/dist/src/channels/lifecycle-supervisor.js +263 -0
  244. package/dist/src/channels/lifecycle-supervisor.js.map +1 -0
  245. package/dist/src/channels/manager.d.ts +34 -68
  246. package/dist/src/channels/manager.js +107 -477
  247. package/dist/src/channels/manager.js.map +1 -1
  248. package/dist/src/channels/outbound/deliver.d.ts +1 -1
  249. package/dist/src/channels/outbound/deliver.js.map +1 -1
  250. package/dist/src/channels/outbound/persist-store.js +1 -1
  251. package/dist/src/channels/outbound-sender.d.ts +51 -0
  252. package/dist/src/channels/outbound-sender.js +125 -0
  253. package/dist/src/channels/outbound-sender.js.map +1 -0
  254. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  255. package/dist/src/channels/pairing/pairing-service.d.ts +3 -10
  256. package/dist/src/channels/pairing/pairing-service.js.map +1 -1
  257. package/dist/src/channels/pairing/pairing-store.js +2 -2
  258. package/dist/src/channels/pairing/pairing-types.d.ts +15 -0
  259. package/dist/src/channels/pairing/pairing-types.js +1 -0
  260. package/dist/src/channels/plugin-registry.d.ts +22 -0
  261. package/dist/src/channels/plugin-registry.js +44 -0
  262. package/dist/src/channels/plugin-registry.js.map +1 -0
  263. package/dist/src/channels/plugin-types.d.ts +1 -1
  264. package/dist/src/channels/plugins/types.adapters.d.ts +2 -2
  265. package/dist/src/channels/security-helpers.d.ts +1 -1
  266. package/dist/src/channels/security-helpers.js.map +1 -1
  267. package/dist/src/channels/setup-wizard.d.ts +1 -1
  268. package/dist/src/chat-commands/builtins/config.js +2 -2
  269. package/dist/src/chat-commands/context.js +1 -1
  270. package/dist/src/cli/commands/agent/stream-renderer.js +1 -1
  271. package/dist/src/cli/commands/agent/stream-renderer.js.map +1 -1
  272. package/dist/src/cli/commands/agent.js +4 -4
  273. package/dist/src/cli/commands/agent.js.map +1 -1
  274. package/dist/src/cli/commands/browser-cli-helpers.js +2 -1
  275. package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
  276. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  277. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  278. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  279. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  280. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  281. package/dist/src/cli/commands/extension-dev.js +2 -2
  282. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  283. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  284. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  285. package/dist/src/cli/commands/extension-pack.js +1 -1
  286. package/dist/src/cli/commands/gateway/call.js +1 -1
  287. package/dist/src/cli/commands/gateway/call.js.map +1 -1
  288. package/dist/src/cli/commands/gateway/health.js +1 -1
  289. package/dist/src/cli/commands/gateway/health.js.map +1 -1
  290. package/dist/src/cli/commands/gateway/lifecycle-core.d.ts +31 -12
  291. package/dist/src/cli/commands/gateway/lifecycle-core.js +167 -116
  292. package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
  293. package/dist/src/cli/commands/gateway/lifecycle.d.ts +11 -0
  294. package/dist/src/cli/commands/gateway/lifecycle.js +102 -0
  295. package/dist/src/cli/commands/gateway/lifecycle.js.map +1 -0
  296. package/dist/src/cli/commands/gateway/logs.js +1 -1
  297. package/dist/src/cli/commands/gateway/logs.js.map +1 -1
  298. package/dist/src/cli/commands/gateway/probe.js +1 -1
  299. package/dist/src/cli/commands/gateway/probe.js.map +1 -1
  300. package/dist/src/cli/commands/gateway/restart-health.d.ts +12 -0
  301. package/dist/src/cli/commands/gateway/restart-health.js +45 -1
  302. package/dist/src/cli/commands/gateway/restart-health.js.map +1 -1
  303. package/dist/src/cli/commands/gateway/restart.js +3 -3
  304. package/dist/src/cli/commands/gateway/restart.js.map +1 -1
  305. package/dist/src/cli/commands/gateway/run-foreground.d.ts +0 -1
  306. package/dist/src/cli/commands/gateway/run-foreground.js +0 -35
  307. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  308. package/dist/src/cli/commands/gateway/service.js +1 -1
  309. package/dist/src/cli/commands/gateway/service.js.map +1 -1
  310. package/dist/src/cli/commands/gateway/shared.d.ts +3 -0
  311. package/dist/src/cli/commands/gateway/shared.js +54 -0
  312. package/dist/src/cli/commands/gateway/shared.js.map +1 -0
  313. package/dist/src/cli/commands/gateway/status.js +1 -1
  314. package/dist/src/cli/commands/gateway/status.js.map +1 -1
  315. package/dist/src/cli/commands/gateway/stop.js +2 -2
  316. package/dist/src/cli/commands/gateway/stop.js.map +1 -1
  317. package/dist/src/cli/commands/gateway/token.js +1 -1
  318. package/dist/src/cli/commands/gateway/token.js.map +1 -1
  319. package/dist/src/cli/commands/gateway.js +5 -5
  320. package/dist/src/cli/commands/gateway.js.map +1 -1
  321. package/dist/src/cli/commands/image.js +2 -2
  322. package/dist/src/cli/commands/image.js.map +1 -1
  323. package/dist/src/cli/commands/init.js +4 -4
  324. package/dist/src/cli/commands/models.js +1 -1
  325. package/dist/src/cli/commands/models.js.map +1 -1
  326. package/dist/src/cli/commands/onboard/gateway.d.ts +0 -8
  327. package/dist/src/cli/commands/onboard/gateway.js +48 -49
  328. package/dist/src/cli/commands/onboard/gateway.js.map +1 -1
  329. package/dist/src/cli/commands/onboard.js +9 -64
  330. package/dist/src/cli/commands/onboard.js.map +1 -1
  331. package/dist/src/cli/commands/session/utils.js +1 -1
  332. package/dist/src/cli/commands/session/utils.js.map +1 -1
  333. package/dist/src/cli/commands/skills.js +1 -1
  334. package/dist/src/cli/commands/tailscale.js +1 -1
  335. package/dist/src/cli/commands/tailscale.js.map +1 -1
  336. package/dist/src/cli/context.d.ts +20 -0
  337. package/dist/src/cli/context.js +23 -0
  338. package/dist/src/cli/context.js.map +1 -0
  339. package/dist/src/cli/extension-cli-register.js +3 -3
  340. package/dist/src/cli/gateway-run-argv.js +1 -4
  341. package/dist/src/cli/gateway-run-argv.js.map +1 -1
  342. package/dist/src/cli/gateway-run-fast-path.js +1 -1
  343. package/dist/src/cli/gateway-run-fast-path.js.map +1 -1
  344. package/dist/src/cli/index.d.ts +1 -7
  345. package/dist/src/cli/index.js +4 -6
  346. package/dist/src/cli/index.js.map +1 -1
  347. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  348. package/dist/src/config/commands.flags.d.ts +3 -0
  349. package/dist/src/config/commands.flags.js +11 -0
  350. package/dist/src/config/commands.flags.js.map +1 -0
  351. package/dist/src/config/index.d.ts +1 -0
  352. package/dist/src/config/index.js +6 -5
  353. package/dist/src/config/index.js.map +1 -1
  354. package/dist/src/config/loader.js +2 -2
  355. package/dist/src/config/models-json.js +2 -2
  356. package/dist/src/config/profile.js +2 -2
  357. package/dist/src/config/schema.d.ts +11 -4
  358. package/dist/src/config/schema.js +13 -12
  359. package/dist/src/config/schema.js.map +1 -1
  360. package/dist/src/config/workspace-path-helpers.d.ts +15 -0
  361. package/dist/src/config/workspace-path-helpers.js +14 -0
  362. package/dist/src/config/workspace-path-helpers.js.map +1 -0
  363. package/dist/src/cron/executor.js +4 -4
  364. package/dist/src/cron/executor.js.map +1 -1
  365. package/dist/src/cron/persistence.js +1 -1
  366. package/dist/src/cron/run-log-store.js +1 -1
  367. package/dist/src/daemon/index.d.ts +0 -1
  368. package/dist/src/daemon/index.js +1 -2
  369. package/dist/src/daemon/install-plan.js +3 -2
  370. package/dist/src/daemon/install-plan.js.map +1 -1
  371. package/dist/src/daemon/launchd.js +2 -2
  372. package/dist/src/daemon/systemd.js +2 -2
  373. package/dist/src/daemon/types.d.ts +0 -6
  374. package/dist/src/extensions/api.d.ts +1 -1
  375. package/dist/src/extensions/api.js +2 -2
  376. package/dist/src/extensions/api.js.map +1 -1
  377. package/dist/src/extensions/bundle-mcp.js +1 -1
  378. package/dist/src/extensions/discover-extensions.js +1 -1
  379. package/dist/src/extensions/extension-registry-impl.d.ts +51 -0
  380. package/dist/src/extensions/extension-registry-impl.js +117 -0
  381. package/dist/src/extensions/extension-registry-impl.js.map +1 -0
  382. package/dist/src/extensions/health.js +1 -1
  383. package/dist/src/extensions/index.js +3 -2
  384. package/dist/src/extensions/loader.d.ts +3 -43
  385. package/dist/src/extensions/loader.js +3 -110
  386. package/dist/src/extensions/loader.js.map +1 -1
  387. package/dist/src/extensions/lockfile.js +2 -2
  388. package/dist/src/extensions/sdk/index.js +2 -1
  389. package/dist/src/extensions/sdk/index.js.map +1 -1
  390. package/dist/src/extensions/types/events.d.ts +7 -1
  391. package/dist/src/gateway/agents-admin.js +2 -2
  392. package/dist/src/gateway/file-path-classifier.js +2 -2
  393. package/dist/src/gateway/heartbeat/service.js +2 -2
  394. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  395. package/dist/src/gateway/hono/app.js +40 -37
  396. package/dist/src/gateway/hono/app.js.map +1 -1
  397. package/dist/src/gateway/hono/lib/extension-store.js +1 -1
  398. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  399. package/dist/src/gateway/hono/middleware/auth.d.ts +5 -14
  400. package/dist/src/gateway/hono/middleware/auth.js +92 -105
  401. package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
  402. package/dist/src/gateway/hono/middleware/logger.d.ts +5 -1
  403. package/dist/src/gateway/hono/middleware/logger.js +41 -5
  404. package/dist/src/gateway/hono/middleware/logger.js.map +1 -1
  405. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +14 -0
  406. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +62 -0
  407. package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -0
  408. package/dist/src/gateway/hono/oauth.js +1 -1
  409. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +4 -4
  410. package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
  411. package/dist/src/gateway/hono/routes/browser.d.ts +20 -0
  412. package/dist/src/gateway/hono/routes/browser.js +626 -0
  413. package/dist/src/gateway/hono/routes/browser.js.map +1 -0
  414. package/dist/src/gateway/hono/routes/commands-skills.js +13 -13
  415. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  416. package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +18 -0
  417. package/dist/src/gateway/hono/routes/config-patch/agents.js +418 -0
  418. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -0
  419. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +12 -0
  420. package/dist/src/gateway/hono/routes/config-patch/channels.js +186 -0
  421. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -0
  422. package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +18 -0
  423. package/dist/src/gateway/hono/routes/config-patch/gateway.js +264 -0
  424. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -0
  425. package/dist/src/gateway/hono/routes/config-patch/index.d.ts +9 -0
  426. package/dist/src/gateway/hono/routes/config-patch/index.js +6 -0
  427. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +23 -0
  428. package/dist/src/gateway/hono/routes/config-patch/misc.js +139 -0
  429. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -0
  430. package/dist/src/gateway/hono/routes/config-patch/result.d.ts +18 -0
  431. package/dist/src/gateway/hono/routes/config-patch/result.js +13 -0
  432. package/dist/src/gateway/hono/routes/config-patch/result.js.map +1 -0
  433. package/dist/src/gateway/hono/routes/config.js +20 -1764
  434. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  435. package/dist/src/gateway/hono/routes/dreaming.js +2 -3
  436. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  437. package/dist/src/gateway/hono/routes/exposure.js +2 -1
  438. package/dist/src/gateway/hono/routes/exposure.js.map +1 -1
  439. package/dist/src/gateway/hono/routes/host-fs.js +1 -1
  440. package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -5
  441. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  442. package/dist/src/gateway/hono/routes/mcp.js +1 -2
  443. package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
  444. package/dist/src/gateway/hono/routes/models.js +1 -1
  445. package/dist/src/gateway/hono/routes/sessions.js +32 -32
  446. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  447. package/dist/src/gateway/hono/routes/shares.js +4 -4
  448. package/dist/src/gateway/hono/routes/shares.js.map +1 -1
  449. package/dist/src/gateway/hono/routes/tunnel.js +1 -1
  450. package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
  451. package/dist/src/gateway/hono/routes/workspace.js +6 -7
  452. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  453. package/dist/src/gateway/hono/sse.d.ts +1 -0
  454. package/dist/src/gateway/hono/sse.js +3 -2
  455. package/dist/src/gateway/hono/sse.js.map +1 -1
  456. package/dist/src/gateway/index.d.ts +1 -1
  457. package/dist/src/gateway/index.js +4 -2
  458. package/dist/src/gateway/lock.js +3 -3
  459. package/dist/src/gateway/rate-limit/auth-policy.d.ts +34 -0
  460. package/dist/src/gateway/rate-limit/auth-policy.js +49 -0
  461. package/dist/src/gateway/rate-limit/auth-policy.js.map +1 -0
  462. package/dist/src/gateway/rate-limit/buckets.d.ts +63 -0
  463. package/dist/src/gateway/rate-limit/buckets.js +143 -0
  464. package/dist/src/gateway/rate-limit/buckets.js.map +1 -0
  465. package/dist/src/gateway/rate-limit/env-flags.d.ts +13 -0
  466. package/dist/src/gateway/rate-limit/env-flags.js +16 -0
  467. package/dist/src/gateway/rate-limit/env-flags.js.map +1 -0
  468. package/dist/src/gateway/rate-limit/index.d.ts +3 -0
  469. package/dist/src/gateway/rate-limit/index.js +4 -0
  470. package/dist/src/gateway/run-loop.d.ts +1 -1
  471. package/dist/src/gateway/run-loop.js +24 -4
  472. package/dist/src/gateway/run-loop.js.map +1 -1
  473. package/dist/src/gateway/runtime-config.js +2 -1
  474. package/dist/src/gateway/runtime-config.js.map +1 -1
  475. package/dist/src/gateway/security/audit.js +2 -1
  476. package/dist/src/gateway/security/audit.js.map +1 -1
  477. package/dist/src/gateway/security/index.d.ts +0 -1
  478. package/dist/src/gateway/security/index.js +1 -2
  479. package/dist/src/gateway/security/loopback.d.ts +13 -0
  480. package/dist/src/gateway/security/loopback.js +45 -0
  481. package/dist/src/gateway/security/loopback.js.map +1 -0
  482. package/dist/src/gateway/service/agent-runner.d.ts +108 -0
  483. package/dist/src/gateway/service/agent-runner.js +184 -0
  484. package/dist/src/gateway/service/agent-runner.js.map +1 -0
  485. package/dist/src/gateway/service/config-coordinator.d.ts +119 -0
  486. package/dist/src/gateway/service/config-coordinator.js +351 -0
  487. package/dist/src/gateway/service/config-coordinator.js.map +1 -0
  488. package/dist/src/gateway/service/marketplace-service.d.ts +85 -0
  489. package/dist/src/gateway/service/marketplace-service.js +239 -0
  490. package/dist/src/gateway/service/marketplace-service.js.map +1 -0
  491. package/dist/src/gateway/service/run-gateway-agent.js +5 -5
  492. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  493. package/dist/src/gateway/service/sessions-api.d.ts +125 -0
  494. package/dist/src/gateway/service/sessions-api.js +135 -0
  495. package/dist/src/gateway/service/sessions-api.js.map +1 -0
  496. package/dist/src/gateway/service.d.ts +30 -360
  497. package/dist/src/gateway/service.js +122 -904
  498. package/dist/src/gateway/service.js.map +1 -1
  499. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  500. package/dist/src/gateway/workspace-heartbeat-path.js +1 -2
  501. package/dist/src/gateway/workspace-heartbeat-path.js.map +1 -1
  502. package/dist/src/heartbeat/index.js +1 -1
  503. package/dist/src/infra/gateway-process-argv.d.ts +4 -0
  504. package/dist/src/infra/gateway-process-argv.js +26 -0
  505. package/dist/src/infra/gateway-process-argv.js.map +1 -0
  506. package/dist/src/infra/gateway-processes.d.ts +5 -0
  507. package/dist/src/infra/gateway-processes.js +65 -0
  508. package/dist/src/infra/gateway-processes.js.map +1 -0
  509. package/dist/src/infra/rate-limit/failure-limiter.d.ts +50 -0
  510. package/dist/src/infra/rate-limit/failure-limiter.js +100 -0
  511. package/dist/src/infra/rate-limit/failure-limiter.js.map +1 -0
  512. package/dist/src/infra/rate-limit/index.d.ts +5 -0
  513. package/dist/src/infra/rate-limit/index.js +3 -0
  514. package/dist/src/infra/rate-limit/keyed-store.d.ts +34 -0
  515. package/dist/src/infra/rate-limit/keyed-store.js +44 -0
  516. package/dist/src/infra/rate-limit/keyed-store.js.map +1 -0
  517. package/dist/src/infra/rate-limit/rate-limiter.d.ts +39 -0
  518. package/dist/src/infra/rate-limit/rate-limiter.js +65 -0
  519. package/dist/src/infra/rate-limit/rate-limiter.js.map +1 -0
  520. package/dist/src/infra/restart.d.ts +21 -0
  521. package/dist/src/infra/restart.js +122 -0
  522. package/dist/src/infra/restart.js.map +1 -0
  523. package/dist/src/infra/update-check.js +1 -1
  524. package/dist/src/infra/update-lock.js +3 -3
  525. package/dist/src/infra/update-runner.js +1 -1
  526. package/dist/src/infra/update-startup.js +2 -2
  527. package/dist/src/infra/write-file-atomic.js +2 -2
  528. package/dist/src/mcp/channel-bridge.d.ts +0 -6
  529. package/dist/src/mcp/channel-bridge.js +1 -5
  530. package/dist/src/mcp/channel-bridge.js.map +1 -1
  531. package/dist/src/media-shared/http/ssrf-guard.js +1 -1
  532. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  533. package/dist/src/providers/index.js +2 -2
  534. package/dist/src/providers/model-registry.js +1 -1
  535. package/dist/src/session/config-store.js +2 -2
  536. package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
  537. package/dist/src/session/parity/sessions-json-file-read.d.ts +2 -1
  538. package/dist/src/session/parity/sessions-json-file-read.js.map +1 -1
  539. package/dist/src/session/parity/sessions-json-file.js +1 -1
  540. package/dist/src/session/parity/transcript-file-lock.js +2 -2
  541. package/dist/src/session/parity/transcript-paths.js +1 -1
  542. package/dist/src/session/search-index-cache.js +1 -1
  543. package/dist/src/session/search-index.js +1 -1
  544. package/dist/src/session/session-title.js +1 -1
  545. package/dist/src/session/store.js +5 -5
  546. package/dist/src/share/share-rate-limit.d.ts +10 -2
  547. package/dist/src/share/share-rate-limit.js +39 -27
  548. package/dist/src/share/share-rate-limit.js.map +1 -1
  549. package/dist/src/share/share-store.js +3 -3
  550. package/dist/src/tui/backends/embedded-backend.js +16 -12
  551. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  552. package/dist/src/tui/clipboard-image.js +2 -2
  553. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  554. package/dist/src/tui/format-tui-hotkeys.js +1 -1
  555. package/dist/src/tui/theme-manager.js +1 -1
  556. package/dist/src/tui/tui-keybindings-file.js +1 -1
  557. package/dist/src/tui/tui-scoped-models.js +1 -1
  558. package/dist/src/tui/tui-settings.js +1 -1
  559. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  560. package/dist/src/tui/tui.js +1 -2
  561. package/dist/src/tui/tui.js.map +1 -1
  562. package/dist/src/tui/xopc-tui-keybindings.d.ts +0 -1
  563. package/dist/src/tui/xopc-tui-keybindings.js +1 -2
  564. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  565. package/dist/src/tunnel/frpc-binary.js +2 -2
  566. package/dist/src/tunnel/frpc-config.js +1 -1
  567. package/dist/src/tunnel/frpc-extract.js +1 -1
  568. package/dist/src/tunnel/pairing-rate-limit.d.ts +10 -2
  569. package/dist/src/tunnel/pairing-rate-limit.js +19 -15
  570. package/dist/src/tunnel/pairing-rate-limit.js.map +1 -1
  571. package/dist/src/tunnel/tunnel-rate-limit.d.ts +6 -3
  572. package/dist/src/tunnel/tunnel-rate-limit.js +19 -18
  573. package/dist/src/tunnel/tunnel-rate-limit.js.map +1 -1
  574. package/dist/src/tunnel/tunnel-state.js +1 -1
  575. package/dist/src/utils/logger/audit.js +1 -1
  576. package/dist/src/utils/logger/log-store.js +1 -1
  577. package/dist/src/utils/logger/rotation.js +1 -1
  578. package/dist/src/utils/logger/stats.d.ts +1 -1
  579. package/dist/src/voice/tts/audio.js +1 -1
  580. package/dist/src/voice/tts/factory.js +1 -1
  581. package/dist/src/voice/tts/index.js +2 -2
  582. package/dist/src/voice/tts/merge-config.js +1 -1
  583. package/dist/src/voice/tts/providers/edge-speech.js +1 -1
  584. package/dist/src/voice/tts/service.js +1 -1
  585. package/dist/src/voice/tts/service.js.map +1 -1
  586. package/dist/src/voice/tts/speak-core.js +1 -1
  587. package/package.json +10 -5
  588. package/dist/gateway/static/root/assets/agents-DOONGaKz.js +0 -222
  589. package/dist/gateway/static/root/assets/channels-settings-CARdL-ys.js +0 -1
  590. package/dist/gateway/static/root/assets/fetch-BAAh_kXG.js +0 -3
  591. package/dist/gateway/static/root/assets/index-C8yHX-AA.css +0 -1
  592. package/dist/gateway/static/root/assets/sessions-page-BCNnhz9g.js +0 -1
  593. package/dist/gateway/static/root/assets/settings-page-B7_PjiHL.js +0 -3
  594. package/dist/gateway/static/root/assets/skills-page-VrL9TeVF.js +0 -2
  595. package/dist/gateway/static/root/assets/voice-api-key-field-k4FWwgkk.js +0 -1
  596. package/dist/src/agent/embedded/session-raw-append-message.d.ts +0 -11
  597. package/dist/src/agent/embedded/session-raw-append-message.js +0 -15
  598. package/dist/src/agent/embedded/session-raw-append-message.js.map +0 -1
  599. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.d.ts +0 -15
  600. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js +0 -24
  601. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js.map +0 -1
  602. package/dist/src/agent/embedded/session-tool-result-state.d.ts +0 -17
  603. package/dist/src/agent/embedded/session-tool-result-state.js +0 -26
  604. package/dist/src/agent/embedded/session-tool-result-state.js.map +0 -1
  605. package/dist/src/daemon/launchd-restart-handoff.d.ts +0 -25
  606. package/dist/src/daemon/launchd-restart-handoff.js +0 -132
  607. package/dist/src/daemon/launchd-restart-handoff.js.map +0 -1
  608. package/dist/src/gateway/auth-rate-limit.d.ts +0 -71
  609. package/dist/src/gateway/auth-rate-limit.js +0 -192
  610. package/dist/src/gateway/auth-rate-limit.js.map +0 -1
  611. package/dist/src/gateway/restart-handler.d.ts +0 -14
  612. package/dist/src/gateway/restart-handler.js +0 -64
  613. package/dist/src/gateway/restart-handler.js.map +0 -1
  614. package/dist/src/gateway/security/flood-guard.d.ts +0 -28
  615. package/dist/src/gateway/security/flood-guard.js +0 -42
  616. package/dist/src/gateway/security/flood-guard.js.map +0 -1
  617. package/dist/src/infra/rate-limit.d.ts +0 -38
  618. package/dist/src/infra/rate-limit.js +0 -60
  619. package/dist/src/infra/rate-limit.js.map +0 -1
  620. package/dist/src/infra/restart-intent.d.ts +0 -13
  621. package/dist/src/infra/restart-intent.js +0 -40
  622. package/dist/src/infra/restart-intent.js.map +0 -1
  623. package/dist/src/infra/restart-sentinel.d.ts +0 -23
  624. package/dist/src/infra/restart-sentinel.js +0 -75
  625. package/dist/src/infra/restart-sentinel.js.map +0 -1
  626. package/skills/creative/canvas-design/LICENSE.txt +0 -202
  627. package/skills/creative/canvas-design/SKILL-zh.md +0 -130
  628. package/skills/creative/canvas-design/SKILL.md +0 -130
  629. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
  630. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  631. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  632. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
  633. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  634. package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
  635. package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  636. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  637. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
  638. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  639. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  640. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  641. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
  642. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  643. package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
  644. package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  645. package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
  646. package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  647. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  648. package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
  649. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  650. package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
  651. package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  652. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  653. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
  654. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  655. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  656. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  657. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  658. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  659. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  660. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  661. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  662. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
  663. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  664. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  665. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  666. package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
  667. package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  668. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  669. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
  670. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  671. package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  672. package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  673. package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
  674. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
  675. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  676. package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  677. package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  678. package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  679. package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
  680. package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  681. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  682. package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
  683. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  684. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
  685. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  686. package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  687. package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
  688. package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  689. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  690. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
  691. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
  692. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  693. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  694. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
  695. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  696. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
  697. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  698. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  699. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
  700. package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  701. package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
  702. package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  703. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  704. package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  705. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  706. package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
  707. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  708. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
  709. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
@@ -2,7 +2,7 @@ import type { Config } from '../../config/schema.js';
2
2
  import type { InternalAttachmentRoots } from '../../channels/attachments/inbound-persist.js';
3
3
  import { type SessionConfigStore, type SessionStore } from '../../session/index.js';
4
4
  import type { SessionContext } from '../session/index.js';
5
- import type { AgentManager } from '../agent-manager.js';
5
+ import type { AgentInstanceGateway } from '../agent-instance-gateway.js';
6
6
  import type { CommandHandler } from '../messaging/command-handler.js';
7
7
  import type { ModelManager } from '../models/index.js';
8
8
  export type DirectStreamInboundAttachment = {
@@ -30,7 +30,7 @@ export interface ProcessDirectStreamingDeps {
30
30
  [key: string]: unknown;
31
31
  }) => void) => void;
32
32
  unregisterWebchatSsePublisher: (sessionKey: string) => void;
33
- agentManager: AgentManager;
33
+ agentManager: AgentInstanceGateway;
34
34
  hydrateSessionWorkspaceFromStore: (sessionKey: string) => Promise<void>;
35
35
  hydrateSessionModelFromStore: (sessionKey: string) => Promise<void>;
36
36
  sessionStore: SessionStore;
@@ -1,179 +1,147 @@
1
1
  import { appendPiTranscriptMessage } from "../../session/parity/jsonl-transcript-io.js";
2
- import { extractAgentUserPlainText } from "../memory/user-message-text.js";
3
2
  import { resolveEffectiveReasoningLevel } from "../../session/thinking-resolve.js";
4
3
  import "../../session/index.js";
5
- import { parseSlashCommand } from "../../chat-commands/command-parse.js";
6
- import { commandRegistry } from "../../chat-commands/registry.js";
7
4
  import { isVoiceLikeAttachment, mergeSttConfigFromAppConfig, mergeVoiceTranscriptsIntoUserText } from "../../channels/attachments/voice-stt-webchat.js";
8
- import "../../chat-commands/index.js";
9
5
  import { abortEmbeddedRun } from "../embedded/runs.js";
10
6
  import { mapEmbeddedEventToGatewaySse } from "../embedded/map-stream-events.js";
11
- import { runEmbeddedTurnForSession } from "../embedded/run-for-session.js";
12
7
  import { applyReasoningVisibilityToSseEvent } from "../streaming/reasoning-visibility-sse.js";
13
- import crypto from "node:crypto";
8
+ import { AsyncQueue } from "./async-queue.js";
9
+ import { hydratePerTurnState, runDirectAgentTurn, tryRunSlashCommand } from "./direct-turn-helpers.js";
14
10
  //#region src/agent/service/process-direct-streaming.ts
15
11
  async function* runProcessDirectStreaming(deps, input) {
16
- const { log, parseSessionKey, initDirectStreamingSession, registerWebchatSsePublisher, unregisterWebchatSsePublisher, agentManager, hydrateSessionWorkspaceFromStore, hydrateSessionModelFromStore, sessionStore, modelManager, applyResolvedThinkingLevel, getConfig, sessionConfigStore, attachmentRootsForSession, commandHandler, prepareInboundAttachments, buildMessageContent, recordPersistentGoalStreamOutcome, onTurnComplete, reloadWebchatTranscript, maybeEmitWebchatTts, endDirectRequestContext } = deps;
17
12
  const sessionKey = input.sessionKey ?? "cli:direct";
18
- const { channel, chatId } = parseSessionKey(sessionKey);
19
- const context = initDirectStreamingSession(sessionKey, channel, chatId);
20
- const runId = crypto.randomUUID();
21
- const eventQueue = [];
22
- let resolveWaiting = null;
23
- let agentDone = false;
13
+ const { channel, chatId } = deps.parseSessionKey(sessionKey);
14
+ const context = deps.initDirectStreamingSession(sessionKey, channel, chatId);
15
+ const queue = new AsyncQueue();
24
16
  let reasoningLevel = "stream";
25
- const enqueueSseEvent = (event) => {
26
- eventQueue.push(event);
27
- if (resolveWaiting) {
28
- resolveWaiting();
29
- resolveWaiting = null;
30
- }
31
- };
32
- const pushEvent = (event) => {
17
+ const pushVisible = (event) => {
33
18
  const visible = applyReasoningVisibilityToSseEvent(event, reasoningLevel);
34
- if (visible !== null) enqueueSseEvent(visible);
19
+ if (visible !== null) queue.push(visible);
35
20
  };
36
- if (channel === "webchat") registerWebchatSsePublisher(sessionKey, (e) => pushEvent(e));
21
+ if (channel === "webchat") deps.registerWebchatSsePublisher(sessionKey, pushVisible);
37
22
  const signal = input.signal;
38
23
  let userAborted = false;
39
24
  let abortHandled = false;
40
- try {
41
- await hydrateSessionWorkspaceFromStore(sessionKey);
42
- await hydrateSessionModelFromStore(sessionKey);
43
- await applyResolvedThinkingLevel(sessionKey, input.thinking);
44
- reasoningLevel = await resolveEffectiveReasoningLevel(sessionConfigStore, sessionKey, getConfig()?.agents?.defaults?.reasoningDefault ?? "stream");
45
- const prepared = await prepareInboundAttachments(sessionKey, input.attachments);
46
- const sttCfg = mergeSttConfigFromAppConfig(getConfig()?.tools?.media?.audio, getConfig()?.tools?.media);
47
- const { text: mergedUserText, inboundVoice, voiceTranscripts } = await mergeVoiceTranscriptsIntoUserText(attachmentRootsForSession(sessionKey), prepared, input.content, sttCfg);
48
- if (inboundVoice) {
49
- const transcriptParts = [voiceTranscripts.filter(Boolean).join("\n"), input.content.trim()].filter(Boolean);
50
- const voiceAttachments = (prepared ?? []).filter(isVoiceLikeAttachment).map((att) => ({
51
- workspaceRelativePath: att.workspaceRelativePath,
52
- mimeType: att.mimeType,
53
- name: att.name
54
- }));
55
- pushEvent({
56
- type: "user_transcript",
57
- text: transcriptParts.join("\n\n"),
58
- attachments: voiceAttachments
59
- });
60
- }
61
- const armAbort = () => {
62
- if (abortHandled) return;
63
- abortHandled = true;
64
- userAborted = true;
65
- abortEmbeddedRun(sessionKey);
66
- agentDone = true;
67
- pushEvent({ type: "__done__" });
68
- };
69
- if (signal) if (signal.aborted) armAbort();
70
- else signal.addEventListener("abort", armAbort, { once: true });
71
- const commandInfo = parseSlashCommand(mergedUserText);
72
- let ranSlashCommand = false;
73
- let webchatSlashReceipt;
74
- if (!abortHandled && commandInfo) {
75
- if (commandRegistry.has(commandInfo.command)) {
25
+ let inboundVoice = false;
26
+ let ranSlashCommand = false;
27
+ let mergedUserText = input.content;
28
+ let webchatSlashReceipt;
29
+ const taskPromise = (async () => {
30
+ try {
31
+ await hydratePerTurnState(deps, sessionKey, input.thinking);
32
+ {
33
+ const defReason = deps.getConfig()?.agents?.defaults?.reasoningDefault ?? "stream";
34
+ reasoningLevel = await resolveEffectiveReasoningLevel(deps.sessionConfigStore, sessionKey, defReason);
35
+ }
36
+ const prepared = await deps.prepareInboundAttachments(sessionKey, input.attachments);
37
+ const sttCfg = mergeSttConfigFromAppConfig(deps.getConfig()?.tools?.media?.audio, deps.getConfig()?.tools?.media);
38
+ const voiceMerge = await mergeVoiceTranscriptsIntoUserText(deps.attachmentRootsForSession(sessionKey), prepared, input.content, sttCfg);
39
+ mergedUserText = voiceMerge.text;
40
+ inboundVoice = voiceMerge.inboundVoice;
41
+ if (inboundVoice) {
42
+ const transcriptParts = [voiceMerge.voiceTranscripts.filter(Boolean).join("\n"), input.content.trim()].filter(Boolean);
43
+ const voiceAttachments = (prepared ?? []).filter(isVoiceLikeAttachment).map((att) => ({
44
+ workspaceRelativePath: att.workspaceRelativePath,
45
+ mimeType: att.mimeType,
46
+ name: att.name
47
+ }));
48
+ pushVisible({
49
+ type: "user_transcript",
50
+ text: transcriptParts.join("\n\n"),
51
+ attachments: voiceAttachments
52
+ });
53
+ }
54
+ const armAbort = () => {
55
+ if (abortHandled) return;
56
+ abortHandled = true;
57
+ userAborted = true;
58
+ abortEmbeddedRun(sessionKey);
59
+ queue.close();
60
+ };
61
+ if (signal) {
62
+ if (signal.aborted) {
63
+ armAbort();
64
+ return;
65
+ }
66
+ signal.addEventListener("abort", armAbort, { once: true });
67
+ }
68
+ const slash = await tryRunSlashCommand(deps, {
69
+ sessionKey,
70
+ channel,
71
+ chatId,
72
+ senderId: context.senderId,
73
+ isGroup: context.isGroup
74
+ }, mergedUserText);
75
+ if (slash.matched) {
76
76
  ranSlashCommand = true;
77
- try {
78
- const { aggregatedText } = await commandHandler.executeCommandAndAggregateReply(commandInfo.command, commandInfo.args, {
79
- sessionKey,
80
- channel,
81
- chatId,
82
- senderId: context.senderId,
83
- isGroup: context.isGroup,
84
- inboundMetadata: {}
77
+ const text = slash.aggregatedText.trim();
78
+ if (text) {
79
+ webchatSlashReceipt = text;
80
+ pushVisible({
81
+ type: "token",
82
+ content: text
85
83
  });
86
- if (aggregatedText?.trim()) {
87
- webchatSlashReceipt = aggregatedText.trim();
88
- pushEvent({
89
- type: "token",
90
- content: webchatSlashReceipt
91
- });
92
- } else if (channel === "webchat") {
93
- webchatSlashReceipt = "Command finished with no assistant text. If you used `/goal`, a follow-up turn may still be scheduled automatically.";
94
- pushEvent({
95
- type: "token",
96
- content: webchatSlashReceipt
97
- });
98
- }
99
- } catch (cmdErr) {
100
- const em = cmdErr instanceof Error ? cmdErr.message : String(cmdErr);
101
- log.warn({
102
- err: cmdErr,
103
- sessionKey,
104
- command: commandInfo.command
105
- }, `Slash command failed: ${em}`);
106
- webchatSlashReceipt = `Command error: ${em}`;
107
- pushEvent({
84
+ } else if (channel === "webchat") {
85
+ webchatSlashReceipt = "Command finished with no assistant text. If you used `/goal`, a follow-up turn may still be scheduled automatically.";
86
+ pushVisible({
108
87
  type: "token",
109
88
  content: webchatSlashReceipt
110
89
  });
111
90
  }
112
- pushEvent({ type: "__done__" });
113
- agentDone = true;
91
+ return;
114
92
  }
115
- }
116
- if (!abortHandled && !ranSlashCommand) {
93
+ const textForAgent = mergedUserText.trimStart().startsWith("/skill:") ? deps.agentManager.expandSkillUserText(mergedUserText) : mergedUserText;
117
94
  const userMessage = {
118
95
  role: "user",
119
- content: await buildMessageContent(mergedUserText.trimStart().startsWith("/skill:") ? agentManager.expandSkillUserText(mergedUserText) : mergedUserText, prepared, sessionKey),
96
+ content: await deps.buildMessageContent(textForAgent, prepared, sessionKey),
120
97
  timestamp: Date.now()
121
98
  };
122
- const userPlain = extractAgentUserPlainText(userMessage);
123
- const userMessageForModel = await agentManager.applyMemoryPrefetchToUserMessage(userMessage, sessionKey);
124
- (async () => {
125
- const result = await runEmbeddedTurnForSession({
126
- sessionKey,
127
- runId,
128
- userMessage: userMessageForModel,
129
- sessionStore,
130
- agentManager,
131
- modelManager,
132
- getConfig,
133
- abortSignal: signal,
134
- beforeTurn: () => agentManager.beginBackgroundReviewUserTurn(sessionKey),
135
- onEvent: (embeddedEvent) => {
136
- const mapped = mapEmbeddedEventToGatewaySse(embeddedEvent);
137
- if (mapped) pushEvent(mapped);
138
- }
139
- });
140
- agentManager.afterAgentTurn(sessionKey, userPlain);
141
- agentManager.scheduleBackgroundReviewAfterUserTurn(sessionKey);
142
- if (result.lastAssistantText) onTurnComplete?.(sessionKey, result.lastAssistantText);
143
- if (!result.ok && result.errorMessage && !abortHandled) pushEvent({
144
- type: "error",
145
- content: result.errorMessage
146
- });
147
- })().then(() => {
148
- if (abortHandled) return;
149
- agentDone = true;
150
- pushEvent({ type: "__done__" });
151
- }).catch((err) => {
152
- if (abortHandled) return;
153
- agentDone = true;
154
- pushEvent({
155
- type: "error",
156
- content: err instanceof Error ? err.message : String(err)
157
- });
158
- pushEvent({ type: "__done__" });
99
+ if (channel === "webchat") pushVisible({
100
+ type: "user_message",
101
+ timestamp: userMessage.timestamp,
102
+ content: userMessage.content,
103
+ attachments: prepared?.map((att) => ({
104
+ type: att.type,
105
+ mimeType: att.mimeType,
106
+ name: att.name,
107
+ size: att.size,
108
+ workspaceRelativePath: att.workspaceRelativePath
109
+ }))
159
110
  });
111
+ const result = await runDirectAgentTurn({
112
+ sessionStore: deps.sessionStore,
113
+ agentManager: deps.agentManager,
114
+ modelManager: deps.modelManager,
115
+ config: deps.getConfig()
116
+ }, {
117
+ sessionKey,
118
+ userMessage,
119
+ abortSignal: signal,
120
+ onEvent: (embeddedEvent) => {
121
+ const mapped = mapEmbeddedEventToGatewaySse(embeddedEvent);
122
+ if (mapped) pushVisible(mapped);
123
+ }
124
+ });
125
+ if (result.lastAssistantText) deps.onTurnComplete?.(sessionKey, result.lastAssistantText);
126
+ if (!result.ok && result.errorMessage && !abortHandled) pushVisible({
127
+ type: "error",
128
+ content: result.errorMessage
129
+ });
130
+ } catch (err) {
131
+ if (!abortHandled) pushVisible({
132
+ type: "error",
133
+ content: err instanceof Error ? err.message : String(err)
134
+ });
135
+ } finally {
136
+ queue.close();
160
137
  }
161
- while (true) if (eventQueue.length > 0) {
162
- const event = eventQueue.shift();
163
- if (event.type === "__done__") break;
164
- yield event;
165
- } else if (agentDone) break;
166
- else await new Promise((resolve) => {
167
- resolveWaiting = resolve;
168
- });
169
- while (eventQueue.length > 0) {
170
- const event = eventQueue.shift();
171
- if (event.type === "__done__") continue;
172
- yield event;
173
- }
138
+ })();
139
+ try {
140
+ for await (const event of queue) yield event;
141
+ await taskPromise;
174
142
  if (channel === "webchat" && ranSlashCommand) try {
175
- const { absPath } = await sessionStore.resolveTranscriptPath(sessionKey);
176
- const workspaceDir = agentManager.getResolvedWorkspaceForSession(sessionKey);
143
+ const { absPath } = await deps.sessionStore.resolveTranscriptPath(sessionKey);
144
+ const workspaceDir = deps.agentManager.getResolvedWorkspaceForSession(sessionKey);
177
145
  await appendPiTranscriptMessage({
178
146
  absPath,
179
147
  cwd: workspaceDir,
@@ -187,36 +155,34 @@ async function* runProcessDirectStreaming(deps, input) {
187
155
  },
188
156
  sessionKey
189
157
  });
190
- if (webchatSlashReceipt?.trim()) {
191
- await appendPiTranscriptMessage({
192
- absPath,
193
- cwd: workspaceDir,
194
- message: {
195
- role: "assistant",
196
- content: [{
197
- type: "text",
198
- text: webchatSlashReceipt.trim()
199
- }],
200
- timestamp: Date.now()
201
- },
202
- sessionKey
203
- });
204
- reloadWebchatTranscript?.(sessionKey);
205
- } else reloadWebchatTranscript?.(sessionKey);
158
+ if (webchatSlashReceipt?.trim()) await appendPiTranscriptMessage({
159
+ absPath,
160
+ cwd: workspaceDir,
161
+ message: {
162
+ role: "assistant",
163
+ content: [{
164
+ type: "text",
165
+ text: webchatSlashReceipt.trim()
166
+ }],
167
+ timestamp: Date.now()
168
+ },
169
+ sessionKey
170
+ });
171
+ deps.reloadWebchatTranscript?.(sessionKey);
206
172
  } catch (err) {
207
- log.warn({
173
+ deps.log.warn({
208
174
  err,
209
175
  sessionKey
210
176
  }, "Failed to persist webchat slash command receipt");
211
177
  }
212
178
  if (!userAborted) {
213
- const ttsAudioEvent = await maybeEmitWebchatTts(sessionKey, inboundVoice);
179
+ const ttsAudioEvent = await deps.maybeEmitWebchatTts(sessionKey, inboundVoice);
214
180
  if (ttsAudioEvent) yield ttsAudioEvent;
215
181
  }
216
- recordPersistentGoalStreamOutcome?.(sessionKey, { skipPersistentGoalPostTurn: ranSlashCommand });
182
+ deps.recordPersistentGoalStreamOutcome?.(sessionKey, { skipPersistentGoalPostTurn: ranSlashCommand });
217
183
  } finally {
218
- if (channel === "webchat") unregisterWebchatSsePublisher(sessionKey);
219
- endDirectRequestContext();
184
+ if (channel === "webchat") deps.unregisterWebchatSsePublisher(sessionKey);
185
+ deps.endDirectRequestContext();
220
186
  }
221
187
  }
222
188
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"process-direct-streaming.js","names":[],"sources":["../../../../src/agent/service/process-direct-streaming.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\n\nimport type { Config } from '../../config/schema.js';\nimport type { InternalAttachmentRoots } from '../../channels/attachments/inbound-persist.js';\nimport { commandRegistry } from '../../chat-commands/index.js';\nimport { parseSlashCommand } from '../../chat-commands/command-parse.js';\nimport {\n isVoiceLikeAttachment,\n mergeVoiceTranscriptsIntoUserText,\n mergeSttConfigFromAppConfig,\n} from '../../channels/attachments/voice-stt-webchat.js';\nimport {\n resolveEffectiveReasoningLevel,\n type SessionConfigStore,\n type SessionStore,\n} from '../../session/index.js';\nimport { appendPiTranscriptMessage } from '../../session/parity/jsonl-transcript-io.js';\nimport type { SessionContext } from '../session/index.js';\nimport { extractAgentUserPlainText } from '../memory/user-message-text.js';\nimport { applyReasoningVisibilityToSseEvent } from '../streaming/reasoning-visibility-sse.js';\nimport type { ReasoningLevel } from '../transcript/thinking-types.js';\nimport { runEmbeddedTurnForSession } from '../embedded/run-for-session.js';\nimport { abortEmbeddedRun } from '../embedded/runs.js';\nimport { mapEmbeddedEventToGatewaySse } from '../embedded/map-stream-events.js';\nimport type { AgentManager } from '../agent-manager.js';\nimport type { CommandHandler } from '../messaging/command-handler.js';\nimport type { ModelManager } from '../models/index.js';\n\nexport type DirectStreamInboundAttachment = {\n type: string;\n mimeType?: string;\n data?: string;\n name?: string;\n size?: number;\n workspaceRelativePath?: string;\n};\n\nexport type ProcessDirectStreamLog = {\n info: (obj: Record<string, unknown>, msg: string) => void;\n warn: (obj: Record<string, unknown>, msg: string) => void;\n debug?: (obj: Record<string, unknown>, msg: string) => void;\n};\n\nexport interface ProcessDirectStreamingDeps {\n log: ProcessDirectStreamLog;\n parseSessionKey: (sessionKey: string) => { channel: string; chatId: string };\n initDirectStreamingSession: (\n sessionKey: string,\n channel: string,\n chatId: string,\n ) => SessionContext;\n registerWebchatSsePublisher: (\n sessionKey: string,\n publisher: (event: { type: string; [key: string]: unknown }) => void,\n ) => void;\n unregisterWebchatSsePublisher: (sessionKey: string) => void;\n agentManager: AgentManager;\n hydrateSessionWorkspaceFromStore: (sessionKey: string) => Promise<void>;\n hydrateSessionModelFromStore: (sessionKey: string) => Promise<void>;\n sessionStore: SessionStore;\n modelManager: ModelManager;\n applyResolvedThinkingLevel: (sessionKey: string, thinking?: string | null) => Promise<void>;\n getConfig: () => Config | undefined;\n sessionConfigStore: SessionConfigStore;\n attachmentRootsForSession: (sessionKey: string) => InternalAttachmentRoots;\n commandHandler: Pick<CommandHandler, 'executeCommandAndAggregateReply'>;\n prepareInboundAttachments: (\n sessionKey: string,\n attachments?: DirectStreamInboundAttachment[],\n ) => Promise<DirectStreamInboundAttachment[] | undefined>;\n buildMessageContent: (\n content: string,\n attachments: DirectStreamInboundAttachment[] | undefined,\n sessionKey: string,\n ) => Promise<Array<{ type: 'text'; text: string } | { type: 'image'; data: string; mimeType: string }>>;\n recordPersistentGoalStreamOutcome?: (\n sessionKey: string,\n outcome: { skipPersistentGoalPostTurn: boolean },\n ) => void;\n onTurnComplete?: (sessionKey: string, lastAssistantText?: string) => void;\n /** Disk-only transcript sync (slash receipt already streamed as tokens). */\n reloadWebchatTranscript?: (sessionKey: string) => void;\n maybeEmitWebchatTts: (\n sessionKey: string,\n hadInboundVoice: boolean,\n ) => Promise<{ type: 'tts_audio'; workspaceRelativePath: string; mimeType: string; name: string } | null>;\n endDirectRequestContext: () => void;\n}\n\nexport interface ProcessDirectStreamingInput {\n content: string;\n sessionKey?: string;\n attachments?: DirectStreamInboundAttachment[];\n thinking?: string;\n signal?: AbortSignal;\n}\n\nexport type ProcessDirectStreamingSseEvent = { type: string; [key: string]: unknown };\n\nexport async function* runProcessDirectStreaming(\n deps: ProcessDirectStreamingDeps,\n input: ProcessDirectStreamingInput,\n): AsyncGenerator<ProcessDirectStreamingSseEvent, void, unknown> {\n const {\n log,\n parseSessionKey,\n initDirectStreamingSession,\n registerWebchatSsePublisher,\n unregisterWebchatSsePublisher,\n agentManager,\n hydrateSessionWorkspaceFromStore,\n hydrateSessionModelFromStore,\n sessionStore,\n modelManager,\n applyResolvedThinkingLevel,\n getConfig,\n sessionConfigStore,\n attachmentRootsForSession,\n commandHandler,\n prepareInboundAttachments,\n buildMessageContent,\n recordPersistentGoalStreamOutcome,\n onTurnComplete,\n reloadWebchatTranscript,\n maybeEmitWebchatTts,\n endDirectRequestContext,\n } = deps;\n\n const sessionKey = input.sessionKey ?? 'cli:direct';\n const { channel, chatId } = parseSessionKey(sessionKey);\n const context = initDirectStreamingSession(sessionKey, channel, chatId);\n const runId = crypto.randomUUID();\n\n const eventQueue: ProcessDirectStreamingSseEvent[] = [];\n let resolveWaiting: (() => void) | null = null;\n let agentDone = false;\n\n let reasoningLevel: ReasoningLevel = 'stream';\n\n const enqueueSseEvent = (event: ProcessDirectStreamingSseEvent) => {\n eventQueue.push(event);\n if (resolveWaiting) {\n resolveWaiting();\n resolveWaiting = null;\n }\n };\n\n const pushEvent = (event: ProcessDirectStreamingSseEvent) => {\n const visible = applyReasoningVisibilityToSseEvent(event, reasoningLevel);\n if (visible !== null) {\n enqueueSseEvent(visible);\n }\n };\n\n if (channel === 'webchat') {\n registerWebchatSsePublisher(sessionKey, (e) => pushEvent(e));\n }\n\n const signal = input.signal;\n let userAborted = false;\n let abortHandled = false;\n\n try {\n await hydrateSessionWorkspaceFromStore(sessionKey);\n await hydrateSessionModelFromStore(sessionKey);\n await applyResolvedThinkingLevel(sessionKey, input.thinking);\n {\n const defReason = (getConfig()?.agents?.defaults?.reasoningDefault ?? 'stream') as ReasoningLevel;\n reasoningLevel = await resolveEffectiveReasoningLevel(sessionConfigStore, sessionKey, defReason);\n }\n\n const prepared = await prepareInboundAttachments(sessionKey, input.attachments);\n\n const sttCfg = mergeSttConfigFromAppConfig(getConfig()?.tools?.media?.audio, getConfig()?.tools?.media);\n const { text: mergedUserText, inboundVoice, voiceTranscripts } =\n await mergeVoiceTranscriptsIntoUserText(\n attachmentRootsForSession(sessionKey),\n prepared,\n input.content,\n sttCfg,\n );\n\n if (inboundVoice) {\n const transcriptParts = [\n voiceTranscripts.filter(Boolean).join('\\n'),\n input.content.trim(),\n ].filter(Boolean);\n const voiceAttachments = (prepared ?? []).filter(isVoiceLikeAttachment).map((att) => ({\n workspaceRelativePath: att.workspaceRelativePath,\n mimeType: att.mimeType,\n name: att.name,\n }));\n pushEvent({\n type: 'user_transcript',\n text: transcriptParts.join('\\n\\n'),\n attachments: voiceAttachments,\n });\n }\n\n const armAbort = () => {\n if (abortHandled) {\n return;\n }\n abortHandled = true;\n userAborted = true;\n void abortEmbeddedRun(sessionKey);\n agentDone = true;\n pushEvent({ type: '__done__' });\n };\n if (signal) {\n if (signal.aborted) {\n armAbort();\n } else {\n signal.addEventListener('abort', armAbort, { once: true });\n }\n }\n\n const commandInfo = parseSlashCommand(mergedUserText);\n let ranSlashCommand = false;\n let webchatSlashReceipt: string | undefined;\n if (!abortHandled && commandInfo) {\n if (commandRegistry.has(commandInfo.command)) {\n ranSlashCommand = true;\n try {\n const { aggregatedText } = await commandHandler.executeCommandAndAggregateReply(\n commandInfo.command,\n commandInfo.args,\n {\n sessionKey,\n channel,\n chatId,\n senderId: context.senderId,\n isGroup: context.isGroup,\n inboundMetadata: {},\n },\n );\n if (aggregatedText?.trim()) {\n webchatSlashReceipt = aggregatedText.trim();\n pushEvent({ type: 'token', content: webchatSlashReceipt });\n } else if (channel === 'webchat') {\n webchatSlashReceipt =\n 'Command finished with no assistant text. If you used `/goal`, a follow-up turn may still be scheduled automatically.';\n pushEvent({ type: 'token', content: webchatSlashReceipt });\n }\n } catch (cmdErr) {\n const em = cmdErr instanceof Error ? cmdErr.message : String(cmdErr);\n log.warn({ err: cmdErr, sessionKey, command: commandInfo.command }, `Slash command failed: ${em}`);\n webchatSlashReceipt = `Command error: ${em}`;\n pushEvent({ type: 'token', content: webchatSlashReceipt });\n }\n pushEvent({ type: '__done__' });\n agentDone = true;\n }\n }\n\n if (!abortHandled && !ranSlashCommand) {\n const textForAgent = mergedUserText.trimStart().startsWith('/skill:')\n ? agentManager.expandSkillUserText(mergedUserText)\n : mergedUserText;\n const messageContent = await buildMessageContent(textForAgent, prepared, sessionKey);\n\n const userMessage = {\n role: 'user' as const,\n content: messageContent,\n timestamp: Date.now(),\n };\n const userPlain = extractAgentUserPlainText(userMessage);\n const userMessageForModel = await agentManager.applyMemoryPrefetchToUserMessage(\n userMessage,\n sessionKey,\n );\n\n const agentPromise = (async () => {\n const result = await runEmbeddedTurnForSession({\n sessionKey,\n runId,\n userMessage: userMessageForModel,\n sessionStore,\n agentManager,\n modelManager,\n getConfig,\n abortSignal: signal,\n beforeTurn: () => agentManager.beginBackgroundReviewUserTurn(sessionKey),\n onEvent: (embeddedEvent) => {\n const mapped = mapEmbeddedEventToGatewaySse(embeddedEvent);\n if (mapped) {\n pushEvent(mapped);\n }\n },\n });\n agentManager.afterAgentTurn(sessionKey, userPlain);\n agentManager.scheduleBackgroundReviewAfterUserTurn(sessionKey);\n if (result.lastAssistantText) {\n onTurnComplete?.(sessionKey, result.lastAssistantText);\n }\n if (!result.ok && result.errorMessage && !abortHandled) {\n pushEvent({ type: 'error', content: result.errorMessage });\n }\n })();\n\n agentPromise\n .then(() => {\n if (abortHandled) {\n return;\n }\n agentDone = true;\n pushEvent({ type: '__done__' });\n })\n .catch((err) => {\n if (abortHandled) {\n return;\n }\n agentDone = true;\n pushEvent({ type: 'error', content: err instanceof Error ? err.message : String(err) });\n pushEvent({ type: '__done__' });\n });\n }\n\n while (true) {\n if (eventQueue.length > 0) {\n const event = eventQueue.shift()!;\n if (event.type === '__done__') break;\n yield event;\n } else if (agentDone) {\n break;\n } else {\n await new Promise<void>((resolve) => {\n resolveWaiting = resolve;\n });\n }\n }\n\n while (eventQueue.length > 0) {\n const event = eventQueue.shift()!;\n if (event.type === '__done__') continue;\n yield event;\n }\n\n if (channel === 'webchat' && ranSlashCommand) {\n try {\n const { absPath } = await sessionStore.resolveTranscriptPath(sessionKey);\n const workspaceDir = agentManager.getResolvedWorkspaceForSession(sessionKey);\n const userMsg = {\n role: 'user' as const,\n content: [{ type: 'text' as const, text: mergedUserText }],\n timestamp: Date.now(),\n } as AgentMessage;\n await appendPiTranscriptMessage({\n absPath,\n cwd: workspaceDir,\n message: userMsg,\n sessionKey,\n });\n if (webchatSlashReceipt?.trim()) {\n const assistantMsg = {\n role: 'assistant' as const,\n content: [{ type: 'text' as const, text: webchatSlashReceipt.trim() }],\n timestamp: Date.now(),\n } as AgentMessage;\n await appendPiTranscriptMessage({\n absPath,\n cwd: workspaceDir,\n message: assistantMsg,\n sessionKey,\n });\n reloadWebchatTranscript?.(sessionKey);\n } else {\n reloadWebchatTranscript?.(sessionKey);\n }\n } catch (err) {\n log.warn({ err, sessionKey }, 'Failed to persist webchat slash command receipt');\n }\n }\n\n if (!userAborted) {\n const ttsAudioEvent = await maybeEmitWebchatTts(sessionKey, inboundVoice);\n if (ttsAudioEvent) {\n yield ttsAudioEvent;\n }\n }\n\n recordPersistentGoalStreamOutcome?.(sessionKey, { skipPersistentGoalPostTurn: ranSlashCommand });\n } finally {\n if (channel === 'webchat') {\n unregisterWebchatSsePublisher(sessionKey);\n }\n endDirectRequestContext();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"process-direct-streaming.js","names":[],"sources":["../../../../src/agent/service/process-direct-streaming.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\n\nimport type { Config } from '../../config/schema.js';\nimport type { InternalAttachmentRoots } from '../../channels/attachments/inbound-persist.js';\nimport {\n isVoiceLikeAttachment,\n mergeVoiceTranscriptsIntoUserText,\n mergeSttConfigFromAppConfig,\n} from '../../channels/attachments/voice-stt-webchat.js';\nimport {\n resolveEffectiveReasoningLevel,\n type SessionConfigStore,\n type SessionStore,\n} from '../../session/index.js';\nimport { appendPiTranscriptMessage } from '../../session/parity/jsonl-transcript-io.js';\nimport type { SessionContext } from '../session/index.js';\nimport { applyReasoningVisibilityToSseEvent } from '../streaming/reasoning-visibility-sse.js';\nimport type { ReasoningLevel } from '../transcript/thinking-types.js';\nimport { abortEmbeddedRun } from '../embedded/runs.js';\nimport { mapEmbeddedEventToGatewaySse } from '../embedded/map-stream-events.js';\nimport type { AgentInstanceGateway } from '../agent-instance-gateway.js';\nimport type { CommandHandler } from '../messaging/command-handler.js';\nimport type { ModelManager } from '../models/index.js';\n\nimport { AsyncQueue } from './async-queue.js';\nimport {\n hydratePerTurnState,\n runDirectAgentTurn,\n tryRunSlashCommand,\n} from './direct-turn-helpers.js';\n\nexport type DirectStreamInboundAttachment = {\n type: string;\n mimeType?: string;\n data?: string;\n name?: string;\n size?: number;\n workspaceRelativePath?: string;\n};\n\nexport type ProcessDirectStreamLog = {\n info: (obj: Record<string, unknown>, msg: string) => void;\n warn: (obj: Record<string, unknown>, msg: string) => void;\n debug?: (obj: Record<string, unknown>, msg: string) => void;\n};\n\nexport interface ProcessDirectStreamingDeps {\n log: ProcessDirectStreamLog;\n parseSessionKey: (sessionKey: string) => { channel: string; chatId: string };\n initDirectStreamingSession: (\n sessionKey: string,\n channel: string,\n chatId: string,\n ) => SessionContext;\n registerWebchatSsePublisher: (\n sessionKey: string,\n publisher: (event: { type: string; [key: string]: unknown }) => void,\n ) => void;\n unregisterWebchatSsePublisher: (sessionKey: string) => void;\n agentManager: AgentInstanceGateway;\n hydrateSessionWorkspaceFromStore: (sessionKey: string) => Promise<void>;\n hydrateSessionModelFromStore: (sessionKey: string) => Promise<void>;\n sessionStore: SessionStore;\n modelManager: ModelManager;\n applyResolvedThinkingLevel: (sessionKey: string, thinking?: string | null) => Promise<void>;\n getConfig: () => Config | undefined;\n sessionConfigStore: SessionConfigStore;\n attachmentRootsForSession: (sessionKey: string) => InternalAttachmentRoots;\n commandHandler: Pick<CommandHandler, 'executeCommandAndAggregateReply'>;\n prepareInboundAttachments: (\n sessionKey: string,\n attachments?: DirectStreamInboundAttachment[],\n ) => Promise<DirectStreamInboundAttachment[] | undefined>;\n buildMessageContent: (\n content: string,\n attachments: DirectStreamInboundAttachment[] | undefined,\n sessionKey: string,\n ) => Promise<Array<{ type: 'text'; text: string } | { type: 'image'; data: string; mimeType: string }>>;\n recordPersistentGoalStreamOutcome?: (\n sessionKey: string,\n outcome: { skipPersistentGoalPostTurn: boolean },\n ) => void;\n onTurnComplete?: (sessionKey: string, lastAssistantText?: string) => void;\n /** Disk-only transcript sync (slash receipt already streamed as tokens). */\n reloadWebchatTranscript?: (sessionKey: string) => void;\n maybeEmitWebchatTts: (\n sessionKey: string,\n hadInboundVoice: boolean,\n ) => Promise<{ type: 'tts_audio'; workspaceRelativePath: string; mimeType: string; name: string } | null>;\n endDirectRequestContext: () => void;\n}\n\nexport interface ProcessDirectStreamingInput {\n content: string;\n sessionKey?: string;\n attachments?: DirectStreamInboundAttachment[];\n thinking?: string;\n signal?: AbortSignal;\n}\n\nexport type ProcessDirectStreamingSseEvent = { type: string; [key: string]: unknown };\n\nexport async function* runProcessDirectStreaming(\n deps: ProcessDirectStreamingDeps,\n input: ProcessDirectStreamingInput,\n): AsyncGenerator<ProcessDirectStreamingSseEvent, void, unknown> {\n const sessionKey = input.sessionKey ?? 'cli:direct';\n const { channel, chatId } = deps.parseSessionKey(sessionKey);\n const context = deps.initDirectStreamingSession(sessionKey, channel, chatId);\n\n const queue = new AsyncQueue<ProcessDirectStreamingSseEvent>();\n let reasoningLevel: ReasoningLevel = 'stream';\n\n const pushVisible = (event: ProcessDirectStreamingSseEvent) => {\n const visible = applyReasoningVisibilityToSseEvent(event, reasoningLevel);\n if (visible !== null) {\n queue.push(visible);\n }\n };\n\n if (channel === 'webchat') {\n deps.registerWebchatSsePublisher(sessionKey, pushVisible);\n }\n\n const signal = input.signal;\n let userAborted = false;\n let abortHandled = false;\n let inboundVoice = false;\n let ranSlashCommand = false;\n let mergedUserText = input.content;\n let webchatSlashReceipt: string | undefined;\n\n // Kick off the agent task in the background; events stream into `queue` as they happen\n // and the generator below drains `queue` until the task closes it.\n const taskPromise = (async () => {\n try {\n await hydratePerTurnState(deps, sessionKey, input.thinking);\n {\n const defReason = (deps.getConfig()?.agents?.defaults?.reasoningDefault ?? 'stream') as ReasoningLevel;\n reasoningLevel = await resolveEffectiveReasoningLevel(deps.sessionConfigStore, sessionKey, defReason);\n }\n\n const prepared = await deps.prepareInboundAttachments(sessionKey, input.attachments);\n\n const sttCfg = mergeSttConfigFromAppConfig(deps.getConfig()?.tools?.media?.audio, deps.getConfig()?.tools?.media);\n const voiceMerge = await mergeVoiceTranscriptsIntoUserText(\n deps.attachmentRootsForSession(sessionKey),\n prepared,\n input.content,\n sttCfg,\n );\n mergedUserText = voiceMerge.text;\n inboundVoice = voiceMerge.inboundVoice;\n\n if (inboundVoice) {\n const transcriptParts = [\n voiceMerge.voiceTranscripts.filter(Boolean).join('\\n'),\n input.content.trim(),\n ].filter(Boolean);\n const voiceAttachments = (prepared ?? []).filter(isVoiceLikeAttachment).map((att) => ({\n workspaceRelativePath: att.workspaceRelativePath,\n mimeType: att.mimeType,\n name: att.name,\n }));\n pushVisible({\n type: 'user_transcript',\n text: transcriptParts.join('\\n\\n'),\n attachments: voiceAttachments,\n });\n }\n\n const armAbort = () => {\n if (abortHandled) {\n return;\n }\n abortHandled = true;\n userAborted = true;\n void abortEmbeddedRun(sessionKey);\n queue.close();\n };\n if (signal) {\n if (signal.aborted) {\n armAbort();\n return;\n }\n signal.addEventListener('abort', armAbort, { once: true });\n }\n\n const slash = await tryRunSlashCommand(\n deps,\n { sessionKey, channel, chatId, senderId: context.senderId, isGroup: context.isGroup },\n mergedUserText,\n );\n if (slash.matched) {\n ranSlashCommand = true;\n const text = slash.aggregatedText.trim();\n if (text) {\n webchatSlashReceipt = text;\n pushVisible({ type: 'token', content: text });\n } else if (channel === 'webchat') {\n webchatSlashReceipt =\n 'Command finished with no assistant text. If you used `/goal`, a follow-up turn may still be scheduled automatically.';\n pushVisible({ type: 'token', content: webchatSlashReceipt });\n }\n return;\n }\n\n const textForAgent = mergedUserText.trimStart().startsWith('/skill:')\n ? deps.agentManager.expandSkillUserText(mergedUserText)\n : mergedUserText;\n const messageContent = await deps.buildMessageContent(textForAgent, prepared, sessionKey);\n\n const userMessage = {\n role: 'user' as const,\n content: messageContent,\n timestamp: Date.now(),\n };\n if (channel === 'webchat') {\n pushVisible({\n type: 'user_message',\n timestamp: userMessage.timestamp,\n content: userMessage.content,\n attachments: prepared?.map((att) => ({\n type: att.type,\n mimeType: att.mimeType,\n name: att.name,\n size: att.size,\n workspaceRelativePath: att.workspaceRelativePath,\n })),\n });\n }\n\n const result = await runDirectAgentTurn(\n {\n sessionStore: deps.sessionStore,\n agentManager: deps.agentManager,\n modelManager: deps.modelManager,\n config: deps.getConfig(),\n },\n {\n sessionKey,\n userMessage,\n abortSignal: signal,\n onEvent: (embeddedEvent) => {\n const mapped = mapEmbeddedEventToGatewaySse(embeddedEvent);\n if (mapped) {\n pushVisible(mapped);\n }\n },\n },\n );\n\n if (result.lastAssistantText) {\n deps.onTurnComplete?.(sessionKey, result.lastAssistantText);\n }\n if (!result.ok && result.errorMessage && !abortHandled) {\n pushVisible({ type: 'error', content: result.errorMessage });\n }\n } catch (err) {\n if (!abortHandled) {\n pushVisible({ type: 'error', content: err instanceof Error ? err.message : String(err) });\n }\n } finally {\n queue.close();\n }\n })();\n\n try {\n for await (const event of queue) {\n yield event;\n }\n await taskPromise; // surface unexpected throws\n\n if (channel === 'webchat' && ranSlashCommand) {\n try {\n const { absPath } = await deps.sessionStore.resolveTranscriptPath(sessionKey);\n const workspaceDir = deps.agentManager.getResolvedWorkspaceForSession(sessionKey);\n const userMsg = {\n role: 'user' as const,\n content: [{ type: 'text' as const, text: mergedUserText }],\n timestamp: Date.now(),\n } as AgentMessage;\n await appendPiTranscriptMessage({\n absPath,\n cwd: workspaceDir,\n message: userMsg,\n sessionKey,\n });\n if (webchatSlashReceipt?.trim()) {\n const assistantMsg = {\n role: 'assistant' as const,\n content: [{ type: 'text' as const, text: webchatSlashReceipt.trim() }],\n timestamp: Date.now(),\n } as AgentMessage;\n await appendPiTranscriptMessage({\n absPath,\n cwd: workspaceDir,\n message: assistantMsg,\n sessionKey,\n });\n }\n deps.reloadWebchatTranscript?.(sessionKey);\n } catch (err) {\n deps.log.warn({ err, sessionKey }, 'Failed to persist webchat slash command receipt');\n }\n }\n\n if (!userAborted) {\n const ttsAudioEvent = await deps.maybeEmitWebchatTts(sessionKey, inboundVoice);\n if (ttsAudioEvent) {\n yield ttsAudioEvent;\n }\n }\n\n deps.recordPersistentGoalStreamOutcome?.(sessionKey, { skipPersistentGoalPostTurn: ranSlashCommand });\n } finally {\n if (channel === 'webchat') {\n deps.unregisterWebchatSsePublisher(sessionKey);\n }\n deps.endDirectRequestContext();\n }\n}\n"],"mappings":";;;;;;;;;;AAsGA,gBAAuB,0BACrB,MACA,OAC+D;CAC/D,MAAM,aAAa,MAAM,cAAc;CACvC,MAAM,EAAE,SAAS,WAAW,KAAK,gBAAgB,WAAW;CAC5D,MAAM,UAAU,KAAK,2BAA2B,YAAY,SAAS,OAAO;CAE5E,MAAM,QAAQ,IAAI,YAA4C;CAC9D,IAAI,iBAAiC;CAErC,MAAM,eAAe,UAA0C;EAC7D,MAAM,UAAU,mCAAmC,OAAO,eAAe;AACzE,MAAI,YAAY,KACd,OAAM,KAAK,QAAQ;;AAIvB,KAAI,YAAY,UACd,MAAK,4BAA4B,YAAY,YAAY;CAG3D,MAAM,SAAS,MAAM;CACrB,IAAI,cAAc;CAClB,IAAI,eAAe;CACnB,IAAI,eAAe;CACnB,IAAI,kBAAkB;CACtB,IAAI,iBAAiB,MAAM;CAC3B,IAAI;CAIJ,MAAM,eAAe,YAAY;AAC/B,MAAI;AACF,SAAM,oBAAoB,MAAM,YAAY,MAAM,SAAS;GAC3D;IACE,MAAM,YAAa,KAAK,WAAW,EAAE,QAAQ,UAAU,oBAAoB;AAC3E,qBAAiB,MAAM,+BAA+B,KAAK,oBAAoB,YAAY,UAAU;;GAGvG,MAAM,WAAW,MAAM,KAAK,0BAA0B,YAAY,MAAM,YAAY;GAEpF,MAAM,SAAS,4BAA4B,KAAK,WAAW,EAAE,OAAO,OAAO,OAAO,KAAK,WAAW,EAAE,OAAO,MAAM;GACjH,MAAM,aAAa,MAAM,kCACvB,KAAK,0BAA0B,WAAW,EAC1C,UACA,MAAM,SACN,OACD;AACD,oBAAiB,WAAW;AAC5B,kBAAe,WAAW;AAE1B,OAAI,cAAc;IAChB,MAAM,kBAAkB,CACtB,WAAW,iBAAiB,OAAO,QAAQ,CAAC,KAAK,KAAK,EACtD,MAAM,QAAQ,MAAM,CACrB,CAAC,OAAO,QAAQ;IACjB,MAAM,oBAAoB,YAAY,EAAE,EAAE,OAAO,sBAAsB,CAAC,KAAK,SAAS;KACpF,uBAAuB,IAAI;KAC3B,UAAU,IAAI;KACd,MAAM,IAAI;KACX,EAAE;AACH,gBAAY;KACV,MAAM;KACN,MAAM,gBAAgB,KAAK,OAAO;KAClC,aAAa;KACd,CAAC;;GAGJ,MAAM,iBAAiB;AACrB,QAAI,aACF;AAEF,mBAAe;AACf,kBAAc;AACT,qBAAiB,WAAW;AACjC,UAAM,OAAO;;AAEf,OAAI,QAAQ;AACV,QAAI,OAAO,SAAS;AAClB,eAAU;AACV;;AAEF,WAAO,iBAAiB,SAAS,UAAU,EAAE,MAAM,MAAM,CAAC;;GAG5D,MAAM,QAAQ,MAAM,mBAClB,MACA;IAAE;IAAY;IAAS;IAAQ,UAAU,QAAQ;IAAU,SAAS,QAAQ;IAAS,EACrF,eACD;AACD,OAAI,MAAM,SAAS;AACjB,sBAAkB;IAClB,MAAM,OAAO,MAAM,eAAe,MAAM;AACxC,QAAI,MAAM;AACR,2BAAsB;AACtB,iBAAY;MAAE,MAAM;MAAS,SAAS;MAAM,CAAC;eACpC,YAAY,WAAW;AAChC,2BACE;AACF,iBAAY;MAAE,MAAM;MAAS,SAAS;MAAqB,CAAC;;AAE9D;;GAGF,MAAM,eAAe,eAAe,WAAW,CAAC,WAAW,UAAU,GACjE,KAAK,aAAa,oBAAoB,eAAe,GACrD;GAGJ,MAAM,cAAc;IAClB,MAAM;IACN,SAAS,MAJkB,KAAK,oBAAoB,cAAc,UAAU,WAAW;IAKvF,WAAW,KAAK,KAAK;IACtB;AACD,OAAI,YAAY,UACd,aAAY;IACV,MAAM;IACN,WAAW,YAAY;IACvB,SAAS,YAAY;IACrB,aAAa,UAAU,KAAK,SAAS;KACnC,MAAM,IAAI;KACV,UAAU,IAAI;KACd,MAAM,IAAI;KACV,MAAM,IAAI;KACV,uBAAuB,IAAI;KAC5B,EAAE;IACJ,CAAC;GAGJ,MAAM,SAAS,MAAM,mBACnB;IACE,cAAc,KAAK;IACnB,cAAc,KAAK;IACnB,cAAc,KAAK;IACnB,QAAQ,KAAK,WAAW;IACzB,EACD;IACE;IACA;IACA,aAAa;IACb,UAAU,kBAAkB;KAC1B,MAAM,SAAS,6BAA6B,cAAc;AAC1D,SAAI,OACF,aAAY,OAAO;;IAGxB,CACF;AAED,OAAI,OAAO,kBACT,MAAK,iBAAiB,YAAY,OAAO,kBAAkB;AAE7D,OAAI,CAAC,OAAO,MAAM,OAAO,gBAAgB,CAAC,aACxC,aAAY;IAAE,MAAM;IAAS,SAAS,OAAO;IAAc,CAAC;WAEvD,KAAK;AACZ,OAAI,CAAC,aACH,aAAY;IAAE,MAAM;IAAS,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;IAAE,CAAC;YAEnF;AACR,SAAM,OAAO;;KAEb;AAEJ,KAAI;AACF,aAAW,MAAM,SAAS,MACxB,OAAM;AAER,QAAM;AAEN,MAAI,YAAY,aAAa,gBAC3B,KAAI;GACF,MAAM,EAAE,YAAY,MAAM,KAAK,aAAa,sBAAsB,WAAW;GAC7E,MAAM,eAAe,KAAK,aAAa,+BAA+B,WAAW;AAMjF,SAAM,0BAA0B;IAC9B;IACA,KAAK;IACL,SAAS;KAPT,MAAM;KACN,SAAS,CAAC;MAAE,MAAM;MAAiB,MAAM;MAAgB,CAAC;KAC1D,WAAW,KAAK,KAAK;KAKL;IAChB;IACD,CAAC;AACF,OAAI,qBAAqB,MAAM,CAM7B,OAAM,0BAA0B;IAC9B;IACA,KAAK;IACL,SAAS;KAPT,MAAM;KACN,SAAS,CAAC;MAAE,MAAM;MAAiB,MAAM,oBAAoB,MAAM;MAAE,CAAC;KACtE,WAAW,KAAK,KAAK;KAKA;IACrB;IACD,CAAC;AAEJ,QAAK,0BAA0B,WAAW;WACnC,KAAK;AACZ,QAAK,IAAI,KAAK;IAAE;IAAK;IAAY,EAAE,kDAAkD;;AAIzF,MAAI,CAAC,aAAa;GAChB,MAAM,gBAAgB,MAAM,KAAK,oBAAoB,YAAY,aAAa;AAC9E,OAAI,cACF,OAAM;;AAIV,OAAK,oCAAoC,YAAY,EAAE,4BAA4B,iBAAiB,CAAC;WAC7F;AACR,MAAI,YAAY,UACd,MAAK,8BAA8B,WAAW;AAEhD,OAAK,yBAAyB"}
@@ -1,5 +1,5 @@
1
1
  import type { Config } from '../../config/schema.js';
2
- import type { AgentManager } from '../agent-manager.js';
2
+ import type { AgentInstanceGateway } from '../agent-instance-gateway.js';
3
3
  import type { SessionStore } from '../../session/index.js';
4
4
  export type WebchatTtsResult = {
5
5
  type: 'tts_audio';
@@ -9,7 +9,7 @@ export type WebchatTtsResult = {
9
9
  };
10
10
  export type WebchatTtsDeps = {
11
11
  config: Config | undefined;
12
- agentManager: AgentManager;
12
+ agentManager: AgentInstanceGateway;
13
13
  sessionStore: SessionStore;
14
14
  log: {
15
15
  warn: (obj: Record<string, unknown>, msg: string) => void;
@@ -1,8 +1,8 @@
1
1
  import { init_agent_scope, resolveAgentHomeDir } from "../agent-scope.js";
2
2
  import { extractProfileAgentId } from "../../config/agent-profile.js";
3
3
  import { isTTSAvailable } from "../../voice/tts/factory.js";
4
- import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
5
4
  import { speak } from "../../voice/tts/speak-core.js";
5
+ import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
6
6
  import { getChannelOutputFormat, shouldUseTTS } from "../../voice/tts/service.js";
7
7
  import { compressAudio } from "../../voice/tts/audio.js";
8
8
  import "../../voice/tts/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"webchat-tts.js","names":[],"sources":["../../../../src/agent/service/webchat-tts.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { persistOutboundTtsAudio } from '../../channels/attachments/outbound-tts-persist.js';\nimport { compressAudio } from '../../voice/tts/audio.js';\nimport { speak } from '../../voice/tts/index.js';\nimport { mergeTtsConfigFromAppConfig } from '../../voice/tts/merge-config.js';\nimport { shouldUseTTS, getChannelOutputFormat } from '../../voice/tts/service.js';\nimport { isTTSAvailable } from '../../voice/tts/factory.js';\nimport { resolveAgentHomeDir } from '../agent-scope.js';\nimport { extractProfileAgentId } from '../../config/agent-profile.js';\nimport type { AgentManager } from '../agent-manager.js';\nimport type { SessionStore } from '../../session/index.js';\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\n\nexport type WebchatTtsResult = {\n type: 'tts_audio';\n workspaceRelativePath: string;\n mimeType: string;\n name: string;\n};\n\nexport type WebchatTtsDeps = {\n config: Config | undefined;\n agentManager: AgentManager;\n sessionStore: SessionStore;\n log: { warn: (obj: Record<string, unknown>, msg: string) => void };\n};\n\n/**\n * Generate TTS for webchat when config allows; persist under agent home `tts/`.\n */\nexport async function maybeEmitWebchatTts(\n deps: WebchatTtsDeps,\n sessionKey: string,\n hadInboundVoice: boolean,\n): Promise<WebchatTtsResult | null> {\n const ttsConfig = mergeTtsConfigFromAppConfig(deps.config?.messages?.tts);\n if (!isTTSAvailable(ttsConfig)) {\n return null;\n }\n const decision = shouldUseTTS(ttsConfig, hadInboundVoice);\n if (!decision.useTTS) {\n return null;\n }\n const text = deps.agentManager.getLastAssistantContent(sessionKey)?.trim();\n if (!text) {\n return null;\n }\n try {\n const webOut = getChannelOutputFormat('webchat');\n const fmt = webOut.format as 'opus' | 'mp3' | 'wav';\n const ttsResult = await speak(text, ttsConfig, {\n appConfig: deps.config,\n tts: { format: fmt },\n });\n const { buffer, format } = await compressAudio(\n Buffer.from(ttsResult.audio),\n ttsResult.format,\n webOut.format === 'mp3' ? 'mp3' : 'opus',\n );\n const normalizedMime =\n format === 'opus' || format === 'ogg'\n ? 'audio/ogg'\n : format === 'mp3' || format === 'mpeg'\n ? 'audio/mpeg'\n : format === 'wav'\n ? 'audio/wav'\n : `audio/${format}`;\n const cfg = deps.config!;\n const persisted = await persistOutboundTtsAudio(\n resolveAgentHomeDir(cfg, extractProfileAgentId(sessionKey, cfg)),\n sessionKey,\n buffer,\n format,\n );\n await appendAttachmentToLastAssistant(deps.sessionStore, sessionKey, {\n type: 'audio',\n mimeType: normalizedMime,\n name: persisted.name,\n size: persisted.size,\n workspaceRelativePath: persisted.workspaceRelativePath,\n });\n return {\n type: 'tts_audio',\n workspaceRelativePath: persisted.workspaceRelativePath,\n mimeType: normalizedMime,\n name: persisted.name,\n };\n } catch (err) {\n deps.log.warn({ err, sessionKey }, 'Webchat TTS failed');\n return null;\n }\n}\n\nexport async function appendAttachmentToLastAssistant(\n sessionStore: SessionStore,\n sessionKey: string,\n att: {\n type: string;\n mimeType: string;\n name: string;\n size: number;\n workspaceRelativePath: string;\n },\n): Promise<void> {\n const loaded = await sessionStore.load(sessionKey);\n for (let i = loaded.length - 1; i >= 0; i--) {\n const m = loaded[i] as { role?: string; attachments?: unknown[] };\n if (m.role === 'assistant') {\n const prev = (m.attachments ?? []) as Array<{ workspaceRelativePath?: string }>;\n if (prev.some((x) => x.workspaceRelativePath === att.workspaceRelativePath)) {\n return;\n }\n const next = [...prev, att];\n loaded[i] = { ...m, attachments: next } as unknown as AgentMessage;\n await sessionStore.save(sessionKey, loaded);\n return;\n }\n }\n}\n"],"mappings":";;;;;;;;;;kBAOwD;;;;AAuBxD,eAAsB,oBACpB,MACA,YACA,iBACkC;CAClC,MAAM,YAAY,4BAA4B,KAAK,QAAQ,UAAU,IAAI;AACzE,KAAI,CAAC,eAAe,UAAU,CAC5B,QAAO;AAGT,KAAI,CADa,aAAa,WAAW,gBAC5B,CAAC,OACZ,QAAO;CAET,MAAM,OAAO,KAAK,aAAa,wBAAwB,WAAW,EAAE,MAAM;AAC1E,KAAI,CAAC,KACH,QAAO;AAET,KAAI;EACF,MAAM,SAAS,uBAAuB,UAAU;EAChD,MAAM,MAAM,OAAO;EACnB,MAAM,YAAY,MAAM,MAAM,MAAM,WAAW;GAC7C,WAAW,KAAK;GAChB,KAAK,EAAE,QAAQ,KAAK;GACrB,CAAC;EACF,MAAM,EAAE,QAAQ,WAAW,MAAM,cAC/B,OAAO,KAAK,UAAU,MAAM,EAC5B,UAAU,QACV,OAAO,WAAW,QAAQ,QAAQ,OACnC;EACD,MAAM,iBACJ,WAAW,UAAU,WAAW,QAC5B,cACA,WAAW,SAAS,WAAW,SAC7B,eACA,WAAW,QACT,cACA,SAAS;EACnB,MAAM,MAAM,KAAK;EACjB,MAAM,YAAY,MAAM,wBACtB,oBAAoB,KAAK,sBAAsB,YAAY,IAAI,CAAC,EAChE,YACA,QACA,OACD;AACD,QAAM,gCAAgC,KAAK,cAAc,YAAY;GACnE,MAAM;GACN,UAAU;GACV,MAAM,UAAU;GAChB,MAAM,UAAU;GAChB,uBAAuB,UAAU;GAClC,CAAC;AACF,SAAO;GACL,MAAM;GACN,uBAAuB,UAAU;GACjC,UAAU;GACV,MAAM,UAAU;GACjB;UACM,KAAK;AACZ,OAAK,IAAI,KAAK;GAAE;GAAK;GAAY,EAAE,qBAAqB;AACxD,SAAO;;;AAIX,eAAsB,gCACpB,cACA,YACA,KAOe;CACf,MAAM,SAAS,MAAM,aAAa,KAAK,WAAW;AAClD,MAAK,IAAI,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK;EAC3C,MAAM,IAAI,OAAO;AACjB,MAAI,EAAE,SAAS,aAAa;GAC1B,MAAM,OAAQ,EAAE,eAAe,EAAE;AACjC,OAAI,KAAK,MAAM,MAAM,EAAE,0BAA0B,IAAI,sBAAsB,CACzE;GAEF,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI;AAC3B,UAAO,KAAK;IAAE,GAAG;IAAG,aAAa;IAAM;AACvC,SAAM,aAAa,KAAK,YAAY,OAAO;AAC3C"}
1
+ {"version":3,"file":"webchat-tts.js","names":[],"sources":["../../../../src/agent/service/webchat-tts.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { persistOutboundTtsAudio } from '../../channels/attachments/outbound-tts-persist.js';\nimport { compressAudio } from '../../voice/tts/audio.js';\nimport { speak } from '../../voice/tts/index.js';\nimport { mergeTtsConfigFromAppConfig } from '../../voice/tts/merge-config.js';\nimport { shouldUseTTS, getChannelOutputFormat } from '../../voice/tts/service.js';\nimport { isTTSAvailable } from '../../voice/tts/factory.js';\nimport { resolveAgentHomeDir } from '../agent-scope.js';\nimport { extractProfileAgentId } from '../../config/agent-profile.js';\nimport type { AgentInstanceGateway } from '../agent-instance-gateway.js';\nimport type { SessionStore } from '../../session/index.js';\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\n\nexport type WebchatTtsResult = {\n type: 'tts_audio';\n workspaceRelativePath: string;\n mimeType: string;\n name: string;\n};\n\nexport type WebchatTtsDeps = {\n config: Config | undefined;\n agentManager: AgentInstanceGateway;\n sessionStore: SessionStore;\n log: { warn: (obj: Record<string, unknown>, msg: string) => void };\n};\n\n/**\n * Generate TTS for webchat when config allows; persist under agent home `tts/`.\n */\nexport async function maybeEmitWebchatTts(\n deps: WebchatTtsDeps,\n sessionKey: string,\n hadInboundVoice: boolean,\n): Promise<WebchatTtsResult | null> {\n const ttsConfig = mergeTtsConfigFromAppConfig(deps.config?.messages?.tts);\n if (!isTTSAvailable(ttsConfig)) {\n return null;\n }\n const decision = shouldUseTTS(ttsConfig, hadInboundVoice);\n if (!decision.useTTS) {\n return null;\n }\n const text = deps.agentManager.getLastAssistantContent(sessionKey)?.trim();\n if (!text) {\n return null;\n }\n try {\n const webOut = getChannelOutputFormat('webchat');\n const fmt = webOut.format as 'opus' | 'mp3' | 'wav';\n const ttsResult = await speak(text, ttsConfig, {\n appConfig: deps.config,\n tts: { format: fmt },\n });\n const { buffer, format } = await compressAudio(\n Buffer.from(ttsResult.audio),\n ttsResult.format,\n webOut.format === 'mp3' ? 'mp3' : 'opus',\n );\n const normalizedMime =\n format === 'opus' || format === 'ogg'\n ? 'audio/ogg'\n : format === 'mp3' || format === 'mpeg'\n ? 'audio/mpeg'\n : format === 'wav'\n ? 'audio/wav'\n : `audio/${format}`;\n const cfg = deps.config!;\n const persisted = await persistOutboundTtsAudio(\n resolveAgentHomeDir(cfg, extractProfileAgentId(sessionKey, cfg)),\n sessionKey,\n buffer,\n format,\n );\n await appendAttachmentToLastAssistant(deps.sessionStore, sessionKey, {\n type: 'audio',\n mimeType: normalizedMime,\n name: persisted.name,\n size: persisted.size,\n workspaceRelativePath: persisted.workspaceRelativePath,\n });\n return {\n type: 'tts_audio',\n workspaceRelativePath: persisted.workspaceRelativePath,\n mimeType: normalizedMime,\n name: persisted.name,\n };\n } catch (err) {\n deps.log.warn({ err, sessionKey }, 'Webchat TTS failed');\n return null;\n }\n}\n\nexport async function appendAttachmentToLastAssistant(\n sessionStore: SessionStore,\n sessionKey: string,\n att: {\n type: string;\n mimeType: string;\n name: string;\n size: number;\n workspaceRelativePath: string;\n },\n): Promise<void> {\n const loaded = await sessionStore.load(sessionKey);\n for (let i = loaded.length - 1; i >= 0; i--) {\n const m = loaded[i] as { role?: string; attachments?: unknown[] };\n if (m.role === 'assistant') {\n const prev = (m.attachments ?? []) as Array<{ workspaceRelativePath?: string }>;\n if (prev.some((x) => x.workspaceRelativePath === att.workspaceRelativePath)) {\n return;\n }\n const next = [...prev, att];\n loaded[i] = { ...m, attachments: next } as unknown as AgentMessage;\n await sessionStore.save(sessionKey, loaded);\n return;\n }\n }\n}\n"],"mappings":";;;;;;;;;;kBAOwD;;;;AAuBxD,eAAsB,oBACpB,MACA,YACA,iBACkC;CAClC,MAAM,YAAY,4BAA4B,KAAK,QAAQ,UAAU,IAAI;AACzE,KAAI,CAAC,eAAe,UAAU,CAC5B,QAAO;AAGT,KAAI,CADa,aAAa,WAAW,gBAC5B,CAAC,OACZ,QAAO;CAET,MAAM,OAAO,KAAK,aAAa,wBAAwB,WAAW,EAAE,MAAM;AAC1E,KAAI,CAAC,KACH,QAAO;AAET,KAAI;EACF,MAAM,SAAS,uBAAuB,UAAU;EAChD,MAAM,MAAM,OAAO;EACnB,MAAM,YAAY,MAAM,MAAM,MAAM,WAAW;GAC7C,WAAW,KAAK;GAChB,KAAK,EAAE,QAAQ,KAAK;GACrB,CAAC;EACF,MAAM,EAAE,QAAQ,WAAW,MAAM,cAC/B,OAAO,KAAK,UAAU,MAAM,EAC5B,UAAU,QACV,OAAO,WAAW,QAAQ,QAAQ,OACnC;EACD,MAAM,iBACJ,WAAW,UAAU,WAAW,QAC5B,cACA,WAAW,SAAS,WAAW,SAC7B,eACA,WAAW,QACT,cACA,SAAS;EACnB,MAAM,MAAM,KAAK;EACjB,MAAM,YAAY,MAAM,wBACtB,oBAAoB,KAAK,sBAAsB,YAAY,IAAI,CAAC,EAChE,YACA,QACA,OACD;AACD,QAAM,gCAAgC,KAAK,cAAc,YAAY;GACnE,MAAM;GACN,UAAU;GACV,MAAM,UAAU;GAChB,MAAM,UAAU;GAChB,uBAAuB,UAAU;GAClC,CAAC;AACF,SAAO;GACL,MAAM;GACN,uBAAuB,UAAU;GACjC,UAAU;GACV,MAAM,UAAU;GACjB;UACM,KAAK;AACZ,OAAK,IAAI,KAAK;GAAE;GAAK;GAAY,EAAE,qBAAqB;AACxD,SAAO;;;AAIX,eAAsB,gCACpB,cACA,YACA,KAOe;CACf,MAAM,SAAS,MAAM,aAAa,KAAK,WAAW;AAClD,MAAK,IAAI,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK;EAC3C,MAAM,IAAI,OAAO;AACjB,MAAI,EAAE,SAAS,aAAa;GAC1B,MAAM,OAAQ,EAAE,eAAe,EAAE;AACjC,OAAI,KAAK,MAAM,MAAM,EAAE,0BAA0B,IAAI,sBAAsB,CACzE;GAEF,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI;AAC3B,UAAO,KAAK;IAAE,GAAG;IAAG,aAAa;IAAM;AACvC,SAAM,aAAa,KAAK,YAAY,OAAO;AAC3C"}