@xopcai/xopc 0.0.82 → 0.0.84

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 (740) hide show
  1. package/README.md +3 -1
  2. package/README.zh-CN.md +3 -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-tR-nNP04.js +222 -0
  23. package/dist/gateway/static/root/assets/{apps-page-pJ27dsqn.js → apps-page-BDw6SP-d.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-settings-DEFd-jj1.js +1 -0
  25. package/dist/gateway/static/root/assets/{channels-status-swr-D1KYmOmi.js → channels-status-swr-DI5FHdGe.js} +1 -1
  26. package/dist/gateway/static/root/assets/{cron-api-Y2wfSJVI.js → cron-api-BSqY8LwW.js} +1 -1
  27. package/dist/gateway/static/root/assets/{cron-page-B97KU_RG.js → cron-page-D7lVDjcR.js} +1 -1
  28. package/dist/gateway/static/root/assets/{dist-CboA_Css.js → dist-CqNMNhJM.js} +1 -1
  29. package/dist/gateway/static/root/assets/{extension-debug-page-DN_zNmpo.js → extension-debug-page-gf2L0kY_.js} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-page-BUXtOzv5.js → extension-page-CQo2Xsmg.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-settings-page-C2dX4KCW.js → extension-settings-page-CZf0WoZg.js} +1 -1
  32. package/dist/gateway/static/root/assets/fetch-2iRFmd3n.js +3 -0
  33. package/dist/gateway/static/root/assets/{field-primitives-B9rOLqdm.js → field-primitives-DTtlp-l8.js} +1 -1
  34. package/dist/gateway/static/root/assets/{heartbeat-config-api-DvfiRVrc.js → heartbeat-config-api-B0drdQEJ.js} +1 -1
  35. package/dist/gateway/static/root/assets/{index-DQuaMye9.js → index-0Gt3TG4j.js} +94 -85
  36. package/dist/gateway/static/root/assets/index-BuFldCsB.css +1 -0
  37. package/dist/gateway/static/root/assets/{logs-page-BQuBpHcc.js → logs-page-DMuORLfC.js} +1 -1
  38. package/dist/gateway/static/root/assets/sessions-page-_UO8g6NN.js +1 -0
  39. package/dist/gateway/static/root/assets/{settings-form-section-2Yu-FASs.js → settings-form-section-DkmHkknc.js} +1 -1
  40. package/dist/gateway/static/root/assets/settings-page-Cz8FoW_A.js +3 -0
  41. package/dist/gateway/static/root/assets/skills-page-HrUOxF7H.js +2 -0
  42. package/dist/gateway/static/root/assets/{theme-store-DnwYutiX.js → theme-store-D01dJt95.js} +1 -1
  43. package/dist/gateway/static/root/assets/{utils-D2Gn2qod.js → utils-BFwcR6pL.js} +1 -1
  44. package/dist/gateway/static/root/assets/voice-api-key-field-JF8-aqc5.js +1 -0
  45. package/dist/gateway/static/root/index.html +4 -4
  46. package/dist/package.js +1 -1
  47. package/dist/src/agent/agent-instance-gateway.d.ts +50 -0
  48. package/dist/src/agent/agent-instance-gateway.js +1 -0
  49. package/dist/src/agent/agent-manager.d.ts +20 -14
  50. package/dist/src/agent/agent-manager.js +74 -186
  51. package/dist/src/agent/agent-manager.js.map +1 -1
  52. package/dist/src/agent/background-review/coordinator.d.ts +61 -0
  53. package/dist/src/agent/background-review/coordinator.js +120 -0
  54. package/dist/src/agent/background-review/coordinator.js.map +1 -0
  55. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  56. package/dist/src/agent/child-agent-factory.d.ts +14 -0
  57. package/dist/src/agent/child-agent-factory.js +2 -8
  58. package/dist/src/agent/child-agent-factory.js.map +1 -1
  59. package/dist/src/agent/context/workspace-seed.js +3 -3
  60. package/dist/src/agent/embedded/index.d.ts +1 -2
  61. package/dist/src/agent/embedded/index.js +2 -3
  62. package/dist/src/agent/embedded/run-for-session.d.ts +2 -2
  63. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  64. package/dist/src/agent/embedded/runs.d.ts +32 -0
  65. package/dist/src/agent/embedded/runs.js +79 -19
  66. package/dist/src/agent/embedded/runs.js.map +1 -1
  67. package/dist/src/agent/embedded/session-manager-cache.d.ts +14 -0
  68. package/dist/src/agent/embedded/session-manager-cache.js +32 -11
  69. package/dist/src/agent/embedded/session-manager-cache.js.map +1 -1
  70. package/dist/src/agent/embedded/session-runner.d.ts +37 -7
  71. package/dist/src/agent/embedded/session-runner.js +184 -153
  72. package/dist/src/agent/embedded/session-runner.js.map +1 -1
  73. package/dist/src/agent/embedded/session-tool-result-guard.d.ts +57 -9
  74. package/dist/src/agent/embedded/session-tool-result-guard.js +159 -67
  75. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  76. package/dist/src/agent/goals/goal-run-store.js +4 -4
  77. package/dist/src/agent/goals/persistent-goal-service.d.ts +84 -0
  78. package/dist/src/agent/goals/persistent-goal-service.js +139 -0
  79. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -0
  80. package/dist/src/agent/goals/post-turn.js +2 -2
  81. package/dist/src/agent/goals/state.d.ts +1 -1
  82. package/dist/src/agent/goals/state.js.map +1 -1
  83. package/dist/src/agent/image/load-image-media.js +1 -1
  84. package/dist/src/agent/inbound/inbound-loop.d.ts +77 -0
  85. package/dist/src/agent/inbound/inbound-loop.js +226 -0
  86. package/dist/src/agent/inbound/inbound-loop.js.map +1 -0
  87. package/dist/src/agent/inbound/turn-dispatcher.d.ts +80 -0
  88. package/dist/src/agent/inbound/turn-dispatcher.js +138 -0
  89. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -0
  90. package/dist/src/agent/ipc/bus.js +1 -1
  91. package/dist/src/agent/ipc/inbox.js +2 -2
  92. package/dist/src/agent/ipc/socket.js +1 -1
  93. package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -1
  94. package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
  95. package/dist/src/agent/lifecycle/manager.d.ts +1 -1
  96. package/dist/src/agent/lifecycle/manager.js.map +1 -1
  97. package/dist/src/agent/lifecycle/types.d.ts +1 -1
  98. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  99. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  100. package/dist/src/agent/memory/dreaming/events.js +1 -1
  101. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  102. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  103. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  104. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  105. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  106. package/dist/src/agent/memory/dreaming/utils.d.ts +12 -2
  107. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  108. package/dist/src/agent/memory/dreaming/utils.js.map +1 -1
  109. package/dist/src/agent/memory/index.js +3 -3
  110. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  111. package/dist/src/agent/memory/prefetch-coordinator.d.ts +37 -0
  112. package/dist/src/agent/memory/prefetch-coordinator.js +45 -0
  113. package/dist/src/agent/memory/prefetch-coordinator.js.map +1 -0
  114. package/dist/src/agent/messaging/command-handler.d.ts +5 -1
  115. package/dist/src/agent/messaging/command-handler.js +24 -96
  116. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  117. package/dist/src/agent/messaging/index.d.ts +1 -0
  118. package/dist/src/agent/messaging/index.js +2 -1
  119. package/dist/src/agent/messaging/message-router.d.ts +1 -1
  120. package/dist/src/agent/messaging/message-router.js.map +1 -1
  121. package/dist/src/agent/messaging/outbound-coordinator.d.ts +82 -0
  122. package/dist/src/agent/messaging/outbound-coordinator.js +123 -0
  123. package/dist/src/agent/messaging/outbound-coordinator.js.map +1 -0
  124. package/dist/src/agent/models/manager.js +1 -1
  125. package/dist/src/agent/orchestration/agent-event-handler.d.ts +36 -33
  126. package/dist/src/agent/orchestration/agent-event-handler.js +212 -174
  127. package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
  128. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +4 -4
  129. package/dist/src/agent/orchestration/agent-orchestrator.js +4 -8
  130. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  131. package/dist/src/agent/orchestration/index.d.ts +1 -1
  132. package/dist/src/agent/orchestration/index.js +2 -2
  133. package/dist/src/agent/prompt/service-prompt-builder.js +4 -4
  134. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  135. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  136. package/dist/src/agent/sandbox/path-policy.js +1 -1
  137. package/dist/src/agent/service/async-queue.d.ts +20 -0
  138. package/dist/src/agent/service/async-queue.js +53 -0
  139. package/dist/src/agent/service/async-queue.js.map +1 -0
  140. package/dist/src/agent/service/build-direct-message-content.d.ts +2 -2
  141. package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
  142. package/dist/src/agent/service/direct-turn-helpers.d.ts +70 -0
  143. package/dist/src/agent/service/direct-turn-helpers.js +90 -0
  144. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -0
  145. package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -3
  146. package/dist/src/agent/service/process-direct-one-shot.js +17 -34
  147. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  148. package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
  149. package/dist/src/agent/service/process-direct-streaming.js +122 -168
  150. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  151. package/dist/src/agent/service/webchat-tts.d.ts +2 -2
  152. package/dist/src/agent/service/webchat-tts.js +1 -1
  153. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  154. package/dist/src/agent/service.d.ts +62 -167
  155. package/dist/src/agent/service.js +177 -786
  156. package/dist/src/agent/service.js.map +1 -1
  157. package/dist/src/agent/session/index.d.ts +4 -0
  158. package/dist/src/agent/session/index.js +5 -1
  159. package/dist/src/agent/session/session-config-service.d.ts +68 -0
  160. package/dist/src/agent/session/session-config-service.js +172 -0
  161. package/dist/src/agent/session/session-config-service.js.map +1 -0
  162. package/dist/src/agent/session/session-context.d.ts +27 -19
  163. package/dist/src/agent/session/session-context.js +39 -24
  164. package/dist/src/agent/session/session-context.js.map +1 -1
  165. package/dist/src/agent/session/session-hydrator.d.ts +42 -0
  166. package/dist/src/agent/session/session-hydrator.js +66 -0
  167. package/dist/src/agent/session/session-hydrator.js.map +1 -0
  168. package/dist/src/agent/session/session-inspector.d.ts +80 -0
  169. package/dist/src/agent/session/session-inspector.js +119 -0
  170. package/dist/src/agent/session/session-inspector.js.map +1 -0
  171. package/dist/src/agent/session/session-state-bag.d.ts +83 -0
  172. package/dist/src/agent/session/session-state-bag.js +192 -0
  173. package/dist/src/agent/session/session-state-bag.js.map +1 -0
  174. package/dist/src/agent/skills/config.js +1 -1
  175. package/dist/src/agent/skills/hub-hash.js +2 -2
  176. package/dist/src/agent/skills/hub-lock.js +1 -1
  177. package/dist/src/agent/skills/hub-pull.js +2 -2
  178. package/dist/src/agent/skills/index.d.ts +0 -2
  179. package/dist/src/agent/skills/index.js +3 -5
  180. package/dist/src/agent/skills/index.js.map +1 -1
  181. package/dist/src/agent/skills/managed-store.js +1 -1
  182. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -6
  183. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
  184. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +35 -7
  185. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  186. package/dist/src/agent/skills/scanner.js +1 -1
  187. package/dist/src/agent/skills/skill-manage-ops.js +2 -2
  188. package/dist/src/agent/skills/skill-manager.js +1 -1
  189. package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +7 -0
  190. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +37 -0
  191. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  192. package/dist/src/agent/tools/delegate-tool.d.ts +7 -0
  193. package/dist/src/agent/tools/delegate-tool.js +2 -1
  194. package/dist/src/agent/tools/delegate-tool.js.map +1 -1
  195. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  196. package/dist/src/agent/tools/executor.d.ts +34 -15
  197. package/dist/src/agent/tools/executor.js +44 -79
  198. package/dist/src/agent/tools/executor.js.map +1 -1
  199. package/dist/src/agent/tools/factory.d.ts +6 -0
  200. package/dist/src/agent/tools/factory.js +63 -4
  201. package/dist/src/agent/tools/factory.js.map +1 -1
  202. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  203. package/dist/src/agent/tools/send-media.js +1 -1
  204. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  205. package/dist/src/agent/tools/skills-tools.js +1 -1
  206. package/dist/src/agent/tools/tts-tool.js +1 -1
  207. package/dist/src/agent/tools/write.js +1 -1
  208. package/dist/src/agent/workspace-runtime/registry.d.ts +48 -0
  209. package/dist/src/agent/workspace-runtime/registry.js +59 -0
  210. package/dist/src/agent/workspace-runtime/registry.js.map +1 -0
  211. package/dist/src/auth/credentials.js +3 -3
  212. package/dist/src/auth/profiles/store.js +1 -1
  213. package/dist/src/auth/sync-provider-auth.js +1 -1
  214. package/dist/src/browser/cdp-local-launcher.js +4 -3
  215. package/dist/src/browser/cdp-local-launcher.js.map +1 -1
  216. package/dist/src/browser/index.d.ts +1 -0
  217. package/dist/src/browser/index.js +2 -1
  218. package/dist/src/browser/manager.js +3 -2
  219. package/dist/src/browser/manager.js.map +1 -1
  220. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  221. package/dist/src/browser/providers/browser-use.js +2 -1
  222. package/dist/src/browser/providers/browser-use.js.map +1 -1
  223. package/dist/src/browser/providers/browserbase.js +2 -1
  224. package/dist/src/browser/providers/browserbase.js.map +1 -1
  225. package/dist/src/browser/providers/cloakbrowser.js +7 -6
  226. package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
  227. package/dist/src/browser/providers/playwright-doctor.d.ts +2 -0
  228. package/dist/src/browser/providers/playwright-doctor.js +7 -3
  229. package/dist/src/browser/providers/playwright-doctor.js.map +1 -1
  230. package/dist/src/browser/readiness.d.ts +33 -0
  231. package/dist/src/browser/readiness.js +138 -0
  232. package/dist/src/browser/readiness.js.map +1 -0
  233. package/dist/src/browser/stealth.js +2 -2
  234. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  235. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  236. package/dist/src/channels/channel-domain.d.ts +1 -1
  237. package/dist/src/channels/config-helpers.d.ts +1 -1
  238. package/dist/src/channels/config-helpers.js.map +1 -1
  239. package/dist/src/channels/heartbeat-scheduler.d.ts +40 -0
  240. package/dist/src/channels/heartbeat-scheduler.js +94 -0
  241. package/dist/src/channels/heartbeat-scheduler.js.map +1 -0
  242. package/dist/src/channels/lifecycle-supervisor.d.ts +81 -0
  243. package/dist/src/channels/lifecycle-supervisor.js +263 -0
  244. package/dist/src/channels/lifecycle-supervisor.js.map +1 -0
  245. package/dist/src/channels/manager.d.ts +34 -68
  246. package/dist/src/channels/manager.js +107 -477
  247. package/dist/src/channels/manager.js.map +1 -1
  248. package/dist/src/channels/outbound/deliver.d.ts +1 -1
  249. package/dist/src/channels/outbound/deliver.js.map +1 -1
  250. package/dist/src/channels/outbound/persist-store.js +1 -1
  251. package/dist/src/channels/outbound-sender.d.ts +51 -0
  252. package/dist/src/channels/outbound-sender.js +125 -0
  253. package/dist/src/channels/outbound-sender.js.map +1 -0
  254. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  255. package/dist/src/channels/pairing/pairing-service.d.ts +3 -10
  256. package/dist/src/channels/pairing/pairing-service.js.map +1 -1
  257. package/dist/src/channels/pairing/pairing-store.js +2 -2
  258. package/dist/src/channels/pairing/pairing-types.d.ts +15 -0
  259. package/dist/src/channels/pairing/pairing-types.js +1 -0
  260. package/dist/src/channels/plugin-registry.d.ts +22 -0
  261. package/dist/src/channels/plugin-registry.js +44 -0
  262. package/dist/src/channels/plugin-registry.js.map +1 -0
  263. package/dist/src/channels/plugin-types.d.ts +1 -1
  264. package/dist/src/channels/plugins/types.adapters.d.ts +2 -2
  265. package/dist/src/channels/security-helpers.d.ts +1 -1
  266. package/dist/src/channels/security-helpers.js.map +1 -1
  267. package/dist/src/channels/setup-wizard.d.ts +1 -1
  268. package/dist/src/chat-commands/builtins/config.js +2 -2
  269. package/dist/src/chat-commands/context.js +1 -1
  270. package/dist/src/cli/command-catalog.js +110 -8
  271. package/dist/src/cli/command-catalog.js.map +1 -1
  272. package/dist/src/cli/command-loaders.js +2 -0
  273. package/dist/src/cli/command-loaders.js.map +1 -1
  274. package/dist/src/cli/command-manifest.js +9 -1
  275. package/dist/src/cli/command-manifest.js.map +1 -1
  276. package/dist/src/cli/commands/agent/stream-renderer.js +1 -1
  277. package/dist/src/cli/commands/agent/stream-renderer.js.map +1 -1
  278. package/dist/src/cli/commands/agent.js +4 -4
  279. package/dist/src/cli/commands/agent.js.map +1 -1
  280. package/dist/src/cli/commands/browser-cli-helpers.js +2 -1
  281. package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
  282. package/dist/src/cli/commands/config.js +70 -19
  283. package/dist/src/cli/commands/config.js.map +1 -1
  284. package/dist/src/cli/commands/cron-cli.d.ts +2 -0
  285. package/dist/src/cli/commands/cron-cli.js +15 -0
  286. package/dist/src/cli/commands/cron-cli.js.map +1 -0
  287. package/dist/src/cli/commands/cron.d.ts +4 -1
  288. package/dist/src/cli/commands/cron.js +76 -41
  289. package/dist/src/cli/commands/cron.js.map +1 -1
  290. package/dist/src/cli/commands/doctor/checks/channel-config.js +1 -1
  291. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  292. package/dist/src/cli/commands/doctor/checks/config-health.js +2 -2
  293. package/dist/src/cli/commands/doctor/checks/config-health.js.map +1 -1
  294. package/dist/src/cli/commands/doctor/checks/cron-health.js +1 -1
  295. package/dist/src/cli/commands/doctor/checks/cron-health.js.map +1 -1
  296. package/dist/src/cli/commands/doctor/checks/gateway-health.js +2 -2
  297. package/dist/src/cli/commands/doctor/checks/gateway-health.js.map +1 -1
  298. package/dist/src/cli/commands/doctor/checks/gateway-service.js +2 -2
  299. package/dist/src/cli/commands/doctor/checks/gateway-service.js.map +1 -1
  300. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  301. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  302. package/dist/src/cli/commands/doctor/checks/state-integrity.js +2 -2
  303. package/dist/src/cli/commands/doctor/checks/state-integrity.js.map +1 -1
  304. package/dist/src/cli/commands/doctor/checks/workspace-status.js +4 -4
  305. package/dist/src/cli/commands/doctor/checks/workspace-status.js.map +1 -1
  306. package/dist/src/cli/commands/extension-dev.js +2 -2
  307. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  308. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  309. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  310. package/dist/src/cli/commands/extension-pack.js +1 -1
  311. package/dist/src/cli/commands/gateway/call.js +1 -1
  312. package/dist/src/cli/commands/gateway/call.js.map +1 -1
  313. package/dist/src/cli/commands/gateway/health.js +1 -1
  314. package/dist/src/cli/commands/gateway/health.js.map +1 -1
  315. package/dist/src/cli/commands/gateway/index.d.ts +1 -1
  316. package/dist/src/cli/commands/gateway/index.js +2 -2
  317. package/dist/src/cli/commands/gateway/lifecycle-core.d.ts +31 -12
  318. package/dist/src/cli/commands/gateway/lifecycle-core.js +167 -116
  319. package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
  320. package/dist/src/cli/commands/gateway/lifecycle.d.ts +11 -0
  321. package/dist/src/cli/commands/gateway/lifecycle.js +102 -0
  322. package/dist/src/cli/commands/gateway/lifecycle.js.map +1 -0
  323. package/dist/src/cli/commands/gateway/logs.js +1 -1
  324. package/dist/src/cli/commands/gateway/logs.js.map +1 -1
  325. package/dist/src/cli/commands/gateway/probe.js +1 -1
  326. package/dist/src/cli/commands/gateway/probe.js.map +1 -1
  327. package/dist/src/cli/commands/gateway/restart-health.d.ts +12 -0
  328. package/dist/src/cli/commands/gateway/restart-health.js +45 -1
  329. package/dist/src/cli/commands/gateway/restart-health.js.map +1 -1
  330. package/dist/src/cli/commands/gateway/restart.js +3 -3
  331. package/dist/src/cli/commands/gateway/restart.js.map +1 -1
  332. package/dist/src/cli/commands/gateway/run-foreground.d.ts +0 -1
  333. package/dist/src/cli/commands/gateway/run-foreground.js +0 -35
  334. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  335. package/dist/src/cli/commands/gateway/service.d.ts +4 -0
  336. package/dist/src/cli/commands/gateway/service.js +18 -3
  337. package/dist/src/cli/commands/gateway/service.js.map +1 -1
  338. package/dist/src/cli/commands/gateway/shared.d.ts +3 -0
  339. package/dist/src/cli/commands/gateway/shared.js +54 -0
  340. package/dist/src/cli/commands/gateway/shared.js.map +1 -0
  341. package/dist/src/cli/commands/gateway/status.js +1 -1
  342. package/dist/src/cli/commands/gateway/status.js.map +1 -1
  343. package/dist/src/cli/commands/gateway/stop.js +2 -2
  344. package/dist/src/cli/commands/gateway/stop.js.map +1 -1
  345. package/dist/src/cli/commands/gateway/subcommands.js +1 -4
  346. package/dist/src/cli/commands/gateway/subcommands.js.map +1 -1
  347. package/dist/src/cli/commands/gateway/token.js +1 -1
  348. package/dist/src/cli/commands/gateway/token.js.map +1 -1
  349. package/dist/src/cli/commands/gateway.js +5 -5
  350. package/dist/src/cli/commands/gateway.js.map +1 -1
  351. package/dist/src/cli/commands/image.js +2 -2
  352. package/dist/src/cli/commands/image.js.map +1 -1
  353. package/dist/src/cli/commands/init.js +31 -4
  354. package/dist/src/cli/commands/init.js.map +1 -1
  355. package/dist/src/cli/commands/models.d.ts +4 -1
  356. package/dist/src/cli/commands/models.js +87 -75
  357. package/dist/src/cli/commands/models.js.map +1 -1
  358. package/dist/src/cli/commands/onboard/gateway.d.ts +0 -8
  359. package/dist/src/cli/commands/onboard/gateway.js +48 -49
  360. package/dist/src/cli/commands/onboard/gateway.js.map +1 -1
  361. package/dist/src/cli/commands/onboard.js +11 -64
  362. package/dist/src/cli/commands/onboard.js.map +1 -1
  363. package/dist/src/cli/commands/profile.d.ts +3 -5
  364. package/dist/src/cli/commands/profile.js +31 -31
  365. package/dist/src/cli/commands/profile.js.map +1 -1
  366. package/dist/src/cli/commands/session/utils.js +1 -1
  367. package/dist/src/cli/commands/session/utils.js.map +1 -1
  368. package/dist/src/cli/commands/setup.js +6 -1
  369. package/dist/src/cli/commands/setup.js.map +1 -1
  370. package/dist/src/cli/commands/skills.js +1 -1
  371. package/dist/src/cli/commands/tailscale.js +1 -1
  372. package/dist/src/cli/commands/tailscale.js.map +1 -1
  373. package/dist/src/cli/context.d.ts +20 -0
  374. package/dist/src/cli/context.js +23 -0
  375. package/dist/src/cli/context.js.map +1 -0
  376. package/dist/src/cli/extension-cli-register.js +3 -3
  377. package/dist/src/cli/gateway-run-argv.js +16 -9
  378. package/dist/src/cli/gateway-run-argv.js.map +1 -1
  379. package/dist/src/cli/gateway-run-fast-path.js +1 -1
  380. package/dist/src/cli/gateway-run-fast-path.js.map +1 -1
  381. package/dist/src/cli/index.d.ts +1 -7
  382. package/dist/src/cli/index.js +4 -6
  383. package/dist/src/cli/index.js.map +1 -1
  384. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  385. package/dist/src/config/commands.flags.d.ts +3 -0
  386. package/dist/src/config/commands.flags.js +11 -0
  387. package/dist/src/config/commands.flags.js.map +1 -0
  388. package/dist/src/config/index.d.ts +1 -0
  389. package/dist/src/config/index.js +6 -5
  390. package/dist/src/config/index.js.map +1 -1
  391. package/dist/src/config/loader.js +2 -2
  392. package/dist/src/config/models-json.js +2 -2
  393. package/dist/src/config/profile.js +2 -2
  394. package/dist/src/config/schema.d.ts +11 -4
  395. package/dist/src/config/schema.js +13 -12
  396. package/dist/src/config/schema.js.map +1 -1
  397. package/dist/src/config/workspace-path-helpers.d.ts +15 -0
  398. package/dist/src/config/workspace-path-helpers.js +14 -0
  399. package/dist/src/config/workspace-path-helpers.js.map +1 -0
  400. package/dist/src/cron/executor.js +4 -4
  401. package/dist/src/cron/executor.js.map +1 -1
  402. package/dist/src/cron/persistence.js +1 -1
  403. package/dist/src/cron/run-log-store.js +1 -1
  404. package/dist/src/daemon/index.d.ts +0 -1
  405. package/dist/src/daemon/index.js +1 -2
  406. package/dist/src/daemon/install-plan.js +3 -2
  407. package/dist/src/daemon/install-plan.js.map +1 -1
  408. package/dist/src/daemon/launchd.js +2 -2
  409. package/dist/src/daemon/systemd.js +2 -2
  410. package/dist/src/daemon/types.d.ts +0 -6
  411. package/dist/src/extensions/api.d.ts +1 -1
  412. package/dist/src/extensions/api.js +2 -2
  413. package/dist/src/extensions/api.js.map +1 -1
  414. package/dist/src/extensions/bundle-mcp.js +1 -1
  415. package/dist/src/extensions/discover-extensions.js +1 -1
  416. package/dist/src/extensions/extension-registry-impl.d.ts +51 -0
  417. package/dist/src/extensions/extension-registry-impl.js +117 -0
  418. package/dist/src/extensions/extension-registry-impl.js.map +1 -0
  419. package/dist/src/extensions/health.js +1 -1
  420. package/dist/src/extensions/index.js +3 -2
  421. package/dist/src/extensions/loader.d.ts +3 -43
  422. package/dist/src/extensions/loader.js +3 -110
  423. package/dist/src/extensions/loader.js.map +1 -1
  424. package/dist/src/extensions/lockfile.js +2 -2
  425. package/dist/src/extensions/sdk/index.js +2 -1
  426. package/dist/src/extensions/sdk/index.js.map +1 -1
  427. package/dist/src/extensions/types/events.d.ts +7 -1
  428. package/dist/src/gateway/agents-admin.js +2 -2
  429. package/dist/src/gateway/file-path-classifier.js +2 -2
  430. package/dist/src/gateway/heartbeat/service.js +1 -1
  431. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  432. package/dist/src/gateway/hono/app.js +5 -53
  433. package/dist/src/gateway/hono/app.js.map +1 -1
  434. package/dist/src/gateway/hono/lib/extension-store.js +1 -1
  435. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  436. package/dist/src/gateway/hono/middleware/auth.d.ts +5 -14
  437. package/dist/src/gateway/hono/middleware/auth.js +89 -126
  438. package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
  439. package/dist/src/gateway/hono/middleware/logger.js +1 -1
  440. package/dist/src/gateway/hono/middleware/logger.js.map +1 -1
  441. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +14 -0
  442. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +62 -0
  443. package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -0
  444. package/dist/src/gateway/hono/oauth.js +1 -1
  445. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +4 -4
  446. package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
  447. package/dist/src/gateway/hono/routes/browser.d.ts +20 -0
  448. package/dist/src/gateway/hono/routes/browser.js +626 -0
  449. package/dist/src/gateway/hono/routes/browser.js.map +1 -0
  450. package/dist/src/gateway/hono/routes/commands-skills.js +13 -13
  451. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  452. package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +18 -0
  453. package/dist/src/gateway/hono/routes/config-patch/agents.js +418 -0
  454. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -0
  455. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +12 -0
  456. package/dist/src/gateway/hono/routes/config-patch/channels.js +186 -0
  457. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -0
  458. package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +18 -0
  459. package/dist/src/gateway/hono/routes/config-patch/gateway.js +264 -0
  460. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -0
  461. package/dist/src/gateway/hono/routes/config-patch/index.d.ts +9 -0
  462. package/dist/src/gateway/hono/routes/config-patch/index.js +6 -0
  463. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +23 -0
  464. package/dist/src/gateway/hono/routes/config-patch/misc.js +139 -0
  465. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -0
  466. package/dist/src/gateway/hono/routes/config-patch/result.d.ts +18 -0
  467. package/dist/src/gateway/hono/routes/config-patch/result.js +13 -0
  468. package/dist/src/gateway/hono/routes/config-patch/result.js.map +1 -0
  469. package/dist/src/gateway/hono/routes/config.js +20 -1764
  470. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  471. package/dist/src/gateway/hono/routes/dreaming.js +2 -3
  472. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  473. package/dist/src/gateway/hono/routes/host-fs.js +1 -1
  474. package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -5
  475. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  476. package/dist/src/gateway/hono/routes/mcp.js +1 -2
  477. package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
  478. package/dist/src/gateway/hono/routes/models.js +1 -1
  479. package/dist/src/gateway/hono/routes/sessions.js +32 -32
  480. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  481. package/dist/src/gateway/hono/routes/shares.js +4 -4
  482. package/dist/src/gateway/hono/routes/shares.js.map +1 -1
  483. package/dist/src/gateway/hono/routes/tunnel.js +1 -1
  484. package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
  485. package/dist/src/gateway/hono/routes/workspace.js +6 -7
  486. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  487. package/dist/src/gateway/hono/sse.js +2 -2
  488. package/dist/src/gateway/index.d.ts +1 -1
  489. package/dist/src/gateway/index.js +4 -2
  490. package/dist/src/gateway/lock.js +3 -3
  491. package/dist/src/gateway/rate-limit/auth-policy.d.ts +34 -0
  492. package/dist/src/gateway/rate-limit/auth-policy.js +49 -0
  493. package/dist/src/gateway/rate-limit/auth-policy.js.map +1 -0
  494. package/dist/src/gateway/rate-limit/buckets.d.ts +63 -0
  495. package/dist/src/gateway/rate-limit/buckets.js +143 -0
  496. package/dist/src/gateway/rate-limit/buckets.js.map +1 -0
  497. package/dist/src/gateway/rate-limit/env-flags.d.ts +13 -0
  498. package/dist/src/gateway/rate-limit/env-flags.js +16 -0
  499. package/dist/src/gateway/rate-limit/env-flags.js.map +1 -0
  500. package/dist/src/gateway/rate-limit/index.d.ts +3 -0
  501. package/dist/src/gateway/rate-limit/index.js +4 -0
  502. package/dist/src/gateway/run-loop.d.ts +1 -1
  503. package/dist/src/gateway/run-loop.js +24 -4
  504. package/dist/src/gateway/run-loop.js.map +1 -1
  505. package/dist/src/gateway/runtime-config.js +2 -1
  506. package/dist/src/gateway/runtime-config.js.map +1 -1
  507. package/dist/src/gateway/security/audit.js +2 -1
  508. package/dist/src/gateway/security/audit.js.map +1 -1
  509. package/dist/src/gateway/security/index.d.ts +0 -1
  510. package/dist/src/gateway/security/index.js +1 -2
  511. package/dist/src/gateway/security/loopback.d.ts +13 -0
  512. package/dist/src/gateway/security/loopback.js +45 -0
  513. package/dist/src/gateway/security/loopback.js.map +1 -0
  514. package/dist/src/gateway/service/agent-runner.d.ts +108 -0
  515. package/dist/src/gateway/service/agent-runner.js +184 -0
  516. package/dist/src/gateway/service/agent-runner.js.map +1 -0
  517. package/dist/src/gateway/service/config-coordinator.d.ts +119 -0
  518. package/dist/src/gateway/service/config-coordinator.js +351 -0
  519. package/dist/src/gateway/service/config-coordinator.js.map +1 -0
  520. package/dist/src/gateway/service/marketplace-service.d.ts +85 -0
  521. package/dist/src/gateway/service/marketplace-service.js +239 -0
  522. package/dist/src/gateway/service/marketplace-service.js.map +1 -0
  523. package/dist/src/gateway/service/run-gateway-agent.js +5 -5
  524. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  525. package/dist/src/gateway/service/sessions-api.d.ts +125 -0
  526. package/dist/src/gateway/service/sessions-api.js +135 -0
  527. package/dist/src/gateway/service/sessions-api.js.map +1 -0
  528. package/dist/src/gateway/service.d.ts +30 -360
  529. package/dist/src/gateway/service.js +122 -904
  530. package/dist/src/gateway/service.js.map +1 -1
  531. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  532. package/dist/src/gateway/workspace-heartbeat-path.js +1 -2
  533. package/dist/src/gateway/workspace-heartbeat-path.js.map +1 -1
  534. package/dist/src/infra/gateway-process-argv.d.ts +4 -0
  535. package/dist/src/infra/gateway-process-argv.js +26 -0
  536. package/dist/src/infra/gateway-process-argv.js.map +1 -0
  537. package/dist/src/infra/gateway-processes.d.ts +5 -0
  538. package/dist/src/infra/gateway-processes.js +65 -0
  539. package/dist/src/infra/gateway-processes.js.map +1 -0
  540. package/dist/src/infra/rate-limit/failure-limiter.d.ts +50 -0
  541. package/dist/src/infra/rate-limit/failure-limiter.js +100 -0
  542. package/dist/src/infra/rate-limit/failure-limiter.js.map +1 -0
  543. package/dist/src/infra/rate-limit/index.d.ts +5 -0
  544. package/dist/src/infra/rate-limit/index.js +3 -0
  545. package/dist/src/infra/rate-limit/keyed-store.d.ts +34 -0
  546. package/dist/src/infra/rate-limit/keyed-store.js +44 -0
  547. package/dist/src/infra/rate-limit/keyed-store.js.map +1 -0
  548. package/dist/src/infra/rate-limit/rate-limiter.d.ts +39 -0
  549. package/dist/src/infra/rate-limit/rate-limiter.js +65 -0
  550. package/dist/src/infra/rate-limit/rate-limiter.js.map +1 -0
  551. package/dist/src/infra/restart.d.ts +21 -0
  552. package/dist/src/infra/restart.js +122 -0
  553. package/dist/src/infra/restart.js.map +1 -0
  554. package/dist/src/infra/update-check.js +1 -1
  555. package/dist/src/infra/update-lock.js +3 -3
  556. package/dist/src/infra/update-runner.js +1 -1
  557. package/dist/src/infra/update-startup.js +2 -2
  558. package/dist/src/infra/write-file-atomic.js +2 -2
  559. package/dist/src/mcp/channel-bridge.d.ts +0 -6
  560. package/dist/src/mcp/channel-bridge.js +1 -5
  561. package/dist/src/mcp/channel-bridge.js.map +1 -1
  562. package/dist/src/media-shared/http/ssrf-guard.js +1 -1
  563. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  564. package/dist/src/providers/index.js +2 -2
  565. package/dist/src/providers/model-registry.js +1 -1
  566. package/dist/src/session/config-store.js +2 -2
  567. package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
  568. package/dist/src/session/parity/sessions-json-file-read.d.ts +2 -1
  569. package/dist/src/session/parity/sessions-json-file-read.js.map +1 -1
  570. package/dist/src/session/parity/sessions-json-file.js +1 -1
  571. package/dist/src/session/parity/transcript-file-lock.js +2 -2
  572. package/dist/src/session/parity/transcript-paths.js +1 -1
  573. package/dist/src/session/search-index-cache.js +1 -1
  574. package/dist/src/session/search-index.js +1 -1
  575. package/dist/src/session/session-title.js +1 -1
  576. package/dist/src/session/store.js +5 -5
  577. package/dist/src/share/share-rate-limit.d.ts +10 -2
  578. package/dist/src/share/share-rate-limit.js +33 -42
  579. package/dist/src/share/share-rate-limit.js.map +1 -1
  580. package/dist/src/share/share-store.js +3 -3
  581. package/dist/src/tui/backends/embedded-backend.js +16 -12
  582. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  583. package/dist/src/tui/clipboard-image.js +2 -2
  584. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  585. package/dist/src/tui/format-tui-hotkeys.js +1 -1
  586. package/dist/src/tui/theme-manager.js +1 -1
  587. package/dist/src/tui/tui-keybindings-file.js +1 -1
  588. package/dist/src/tui/tui-scoped-models.js +1 -1
  589. package/dist/src/tui/tui-settings.js +1 -1
  590. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  591. package/dist/src/tui/tui.js +1 -2
  592. package/dist/src/tui/tui.js.map +1 -1
  593. package/dist/src/tui/xopc-tui-keybindings.d.ts +0 -1
  594. package/dist/src/tui/xopc-tui-keybindings.js +1 -2
  595. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  596. package/dist/src/tunnel/frpc-binary.js +2 -2
  597. package/dist/src/tunnel/frpc-config.js +1 -1
  598. package/dist/src/tunnel/frpc-extract.js +1 -1
  599. package/dist/src/tunnel/pairing-rate-limit.d.ts +10 -2
  600. package/dist/src/tunnel/pairing-rate-limit.js +19 -15
  601. package/dist/src/tunnel/pairing-rate-limit.js.map +1 -1
  602. package/dist/src/tunnel/tunnel-rate-limit.d.ts +6 -3
  603. package/dist/src/tunnel/tunnel-rate-limit.js +11 -22
  604. package/dist/src/tunnel/tunnel-rate-limit.js.map +1 -1
  605. package/dist/src/tunnel/tunnel-state.js +1 -1
  606. package/dist/src/utils/logger/audit.js +1 -1
  607. package/dist/src/utils/logger/log-store.js +1 -1
  608. package/dist/src/utils/logger/rotation.js +1 -1
  609. package/dist/src/utils/logger/stats.d.ts +1 -1
  610. package/dist/src/voice/tts/audio.js +1 -1
  611. package/dist/src/voice/tts/factory.js +1 -1
  612. package/dist/src/voice/tts/index.js +2 -2
  613. package/dist/src/voice/tts/merge-config.js +1 -1
  614. package/dist/src/voice/tts/providers/edge-speech.js +1 -1
  615. package/dist/src/voice/tts/service.js +1 -1
  616. package/dist/src/voice/tts/service.js.map +1 -1
  617. package/dist/src/voice/tts/speak-core.js +1 -1
  618. package/package.json +10 -5
  619. package/dist/gateway/static/root/assets/agents-Cqh1ts38.js +0 -222
  620. package/dist/gateway/static/root/assets/channels-settings-wTiWStg9.js +0 -1
  621. package/dist/gateway/static/root/assets/fetch-BAAh_kXG.js +0 -3
  622. package/dist/gateway/static/root/assets/index-C8yHX-AA.css +0 -1
  623. package/dist/gateway/static/root/assets/sessions-page-BeiFm0Ms.js +0 -1
  624. package/dist/gateway/static/root/assets/settings-page-RPAz_Wg_.js +0 -3
  625. package/dist/gateway/static/root/assets/skills-page-Wu4aNWDx.js +0 -2
  626. package/dist/gateway/static/root/assets/voice-api-key-field-BxIGhhEL.js +0 -1
  627. package/dist/src/agent/embedded/session-raw-append-message.d.ts +0 -11
  628. package/dist/src/agent/embedded/session-raw-append-message.js +0 -15
  629. package/dist/src/agent/embedded/session-raw-append-message.js.map +0 -1
  630. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.d.ts +0 -15
  631. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js +0 -24
  632. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js.map +0 -1
  633. package/dist/src/agent/embedded/session-tool-result-state.d.ts +0 -17
  634. package/dist/src/agent/embedded/session-tool-result-state.js +0 -26
  635. package/dist/src/agent/embedded/session-tool-result-state.js.map +0 -1
  636. package/dist/src/daemon/launchd-restart-handoff.d.ts +0 -25
  637. package/dist/src/daemon/launchd-restart-handoff.js +0 -132
  638. package/dist/src/daemon/launchd-restart-handoff.js.map +0 -1
  639. package/dist/src/gateway/auth-rate-limit.d.ts +0 -71
  640. package/dist/src/gateway/auth-rate-limit.js +0 -192
  641. package/dist/src/gateway/auth-rate-limit.js.map +0 -1
  642. package/dist/src/gateway/restart-handler.d.ts +0 -14
  643. package/dist/src/gateway/restart-handler.js +0 -64
  644. package/dist/src/gateway/restart-handler.js.map +0 -1
  645. package/dist/src/gateway/security/flood-guard.d.ts +0 -28
  646. package/dist/src/gateway/security/flood-guard.js +0 -42
  647. package/dist/src/gateway/security/flood-guard.js.map +0 -1
  648. package/dist/src/infra/rate-limit.d.ts +0 -38
  649. package/dist/src/infra/rate-limit.js +0 -60
  650. package/dist/src/infra/rate-limit.js.map +0 -1
  651. package/dist/src/infra/restart-intent.d.ts +0 -13
  652. package/dist/src/infra/restart-intent.js +0 -40
  653. package/dist/src/infra/restart-intent.js.map +0 -1
  654. package/dist/src/infra/restart-sentinel.d.ts +0 -23
  655. package/dist/src/infra/restart-sentinel.js +0 -75
  656. package/dist/src/infra/restart-sentinel.js.map +0 -1
  657. package/skills/creative/canvas-design/LICENSE.txt +0 -202
  658. package/skills/creative/canvas-design/SKILL-zh.md +0 -130
  659. package/skills/creative/canvas-design/SKILL.md +0 -130
  660. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
  661. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  662. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  663. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
  664. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  665. package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
  666. package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  667. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  668. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
  669. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  670. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  671. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  672. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
  673. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  674. package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
  675. package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  676. package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
  677. package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  678. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  679. package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
  680. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  681. package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
  682. package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  683. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  684. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
  685. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  686. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  687. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  688. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  689. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  690. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  691. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  692. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  693. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
  694. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  695. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  696. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  697. package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
  698. package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  699. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  700. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
  701. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  702. package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  703. package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  704. package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
  705. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
  706. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  707. package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  708. package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  709. package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  710. package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
  711. package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  712. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  713. package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
  714. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  715. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
  716. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  717. package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  718. package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
  719. package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  720. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  721. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
  722. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
  723. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  724. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  725. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
  726. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  727. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
  728. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  729. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  730. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
  731. package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  732. package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
  733. package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  734. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  735. package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  736. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  737. package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
  738. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  739. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
  740. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"channel-bridge.js","names":[],"sources":["../../../src/mcp/channel-bridge.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { loadConfig } from '../config/loader.js';\nimport type {\n ApprovalDecision,\n ApprovalKind,\n ClaudeChannelMode,\n ConversationDescriptor,\n PendingApproval,\n QueueEvent,\n SessionRow,\n WaitFilter,\n} from './channel-shared.js';\nimport { toConversation } from './channel-shared.js';\nimport {\n createGatewayHttpClientFromConfig,\n resolveGatewayHttpBaseUrl,\n type GatewayHttpClient,\n} from './gateway-http-client.js';\nimport { loadUndiciRuntimeDeps } from '../infra/undici-fetch.js';\n\nconst QUEUE_LIMIT = 1000;\n\nexport class XopcChannelBridge {\n private client: GatewayHttpClient | null = null;\n private readonly queue: QueueEvent[] = [];\n private readonly pendingApprovals = new Map<string, PendingApproval>();\n private cursor = 0;\n private closed = false;\n private eventsAbort: AbortController | null = null;\n\n constructor(\n private readonly cfg: Config,\n private readonly params: {\n gatewayUrl?: string;\n gatewayToken?: string;\n claudeChannelMode: ClaudeChannelMode;\n verbose: boolean;\n },\n ) {}\n\n setServer(_server: unknown): void {\n void _server;\n }\n\n async start(): Promise<void> {\n this.client = createGatewayHttpClientFromConfig({\n config: this.cfg,\n gatewayUrl: this.params.gatewayUrl,\n gatewayToken: this.params.gatewayToken,\n });\n this.connectEvents();\n }\n\n async close(): Promise<void> {\n this.closed = true;\n this.eventsAbort?.abort();\n this.eventsAbort = null;\n this.queue.length = 0;\n this.pendingApprovals.clear();\n }\n\n private connectEvents(): void {\n if (this.closed) {\n return;\n }\n this.eventsAbort?.abort();\n const abort = new AbortController();\n this.eventsAbort = abort;\n const baseUrl = resolveGatewayHttpBaseUrl(this.cfg, this.params.gatewayUrl);\n void this.runEventsLoop(baseUrl, this.params.gatewayToken, abort.signal);\n }\n\n private async runEventsLoop(\n baseUrl: string,\n token: string | undefined,\n signal: AbortSignal,\n ): Promise<void> {\n const url = new URL(`${baseUrl}/api/events`);\n if (token?.trim()) {\n url.searchParams.set('token', token.trim());\n }\n try {\n const res = await loadUndiciRuntimeDeps().fetch(url.toString(), {\n headers: { Accept: 'text/event-stream' },\n signal,\n });\n if (!res.ok || !res.body) {\n return;\n }\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n while (!this.closed && !signal.aborted) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(value, { stream: true });\n let splitAt = buffer.indexOf('\\n\\n');\n while (splitAt >= 0) {\n this.handleSseChunk(buffer.slice(0, splitAt));\n buffer = buffer.slice(splitAt + 2);\n splitAt = buffer.indexOf('\\n\\n');\n }\n }\n } catch {\n // Best-effort reconnect while bridge stays open.\n }\n if (!this.closed && !signal.aborted) {\n await new Promise((resolve) => setTimeout(resolve, 2000));\n if (!this.closed) {\n this.connectEvents();\n }\n }\n }\n\n private handleSseChunk(chunk: string): void {\n let eventName = 'message';\n let data = '';\n for (const line of chunk.split('\\n')) {\n if (line.startsWith('event:')) {\n eventName = line.slice(6).trim();\n } else if (line.startsWith('data:')) {\n data += line.slice(5).trim();\n }\n }\n if (!data) {\n return;\n }\n try {\n const parsed = JSON.parse(data) as Record<string, unknown>;\n this.enqueueFromBroadcast({ type: eventName, ...parsed });\n } catch {\n this.enqueueFromBroadcast({ type: eventName, raw: data });\n }\n }\n\n private enqueueFromBroadcast(data: Record<string, unknown>): void {\n const type = String(data.type ?? data.event ?? '');\n if (!type) {\n return;\n }\n if (type.includes('message') || type.includes('session')) {\n this.pushEvent({\n cursor: ++this.cursor,\n type: 'message',\n sessionKey: String(data.sessionKey ?? data.key ?? ''),\n raw: data,\n });\n }\n }\n\n private pushEvent(event: QueueEvent): void {\n this.queue.push(event);\n while (this.queue.length > QUEUE_LIMIT) {\n this.queue.shift();\n }\n }\n\n async listConversations(args: {\n limit?: number;\n search?: string;\n channel?: string;\n }): Promise<ConversationDescriptor[]> {\n const client = this.client!;\n const query = new URLSearchParams();\n if (args.limit) query.set('limit', String(args.limit));\n if (args.search) query.set('search', args.search);\n if (args.channel) query.set('channel', args.channel);\n const qs = query.toString();\n const rows = await client.getJson<SessionRow[] | { sessions?: SessionRow[] }>(\n `/api/sessions${qs ? `?${qs}` : ''}`,\n );\n const sessions = Array.isArray(rows) ? rows : (rows.sessions ?? []);\n return sessions\n .map((row) => toConversation(row))\n .filter((c): c is ConversationDescriptor => c !== null);\n }\n\n async getConversation(sessionKey: string): Promise<ConversationDescriptor | null> {\n const client = this.client!;\n try {\n const row = await client.getJson<SessionRow>(`/api/sessions/${encodeURIComponent(sessionKey)}`);\n return toConversation(row);\n } catch {\n return null;\n }\n }\n\n async readMessages(\n sessionKey: string,\n limit: number,\n ): Promise<Array<Record<string, unknown>>> {\n const client = this.client!;\n const payload = await client.getJson<{ messages?: Array<Record<string, unknown>> }>(\n `/api/sessions/${encodeURIComponent(sessionKey)}/messages?limit=${limit}`,\n );\n return payload.messages ?? [];\n }\n\n pollEvents(\n filter: WaitFilter,\n limit: number,\n ): { events: QueueEvent[]; nextCursor: number } {\n const events = this.queue\n .filter((e) => e.cursor > filter.afterCursor)\n .filter((e) => !filter.sessionKey || ('sessionKey' in e && e.sessionKey === filter.sessionKey))\n .slice(0, limit);\n const nextCursor = events.length > 0 ? events[events.length - 1]!.cursor : filter.afterCursor;\n return { events, nextCursor };\n }\n\n async waitForEvent(filter: WaitFilter, timeoutMs: number): Promise<QueueEvent | null> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline && !this.closed) {\n const polled = this.pollEvents(filter, 1);\n if (polled.events.length > 0) {\n return polled.events[0] ?? null;\n }\n await new Promise((r) => setTimeout(r, 250));\n }\n return null;\n }\n\n async sendMessage(params: { sessionKey: string; text: string }): Promise<Record<string, unknown>> {\n const client = this.client!;\n return client.postJson('/api/agent', {\n sessionKey: params.sessionKey,\n message: params.text,\n });\n }\n\n listPendingApprovals(): PendingApproval[] {\n return Array.from(this.pendingApprovals.values());\n }\n\n async respondToApproval(params: {\n kind: ApprovalKind;\n id: string;\n decision: ApprovalDecision;\n }): Promise<Record<string, unknown>> {\n const client = this.client!;\n return client.postJson('/api/mcp/approvals/respond', params);\n }\n\n async handleClaudePermissionRequest(_params: {\n requestId: string;\n toolName: string;\n description: string;\n inputPreview: string;\n }): Promise<void> {\n void _params;\n }\n}\n\nexport async function serveXopcChannelMcp(opts: {\n gatewayUrl?: string;\n gatewayToken?: string;\n claudeChannelMode?: ClaudeChannelMode;\n verbose?: boolean;\n}): Promise<void> {\n const { serveXopcChannelMcpImpl } = await import('./channel-server.js');\n await serveXopcChannelMcpImpl(opts);\n}\n\nexport function loadMcpServeConfig(): Config {\n return loadConfig();\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"channel-bridge.js","names":[],"sources":["../../../src/mcp/channel-bridge.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { loadConfig } from '../config/loader.js';\nimport type {\n ApprovalDecision,\n ApprovalKind,\n ClaudeChannelMode,\n ConversationDescriptor,\n PendingApproval,\n QueueEvent,\n SessionRow,\n WaitFilter,\n} from './channel-shared.js';\nimport { toConversation } from './channel-shared.js';\nimport {\n createGatewayHttpClientFromConfig,\n resolveGatewayHttpBaseUrl,\n type GatewayHttpClient,\n} from './gateway-http-client.js';\nimport { loadUndiciRuntimeDeps } from '../infra/undici-fetch.js';\n\nconst QUEUE_LIMIT = 1000;\n\nexport class XopcChannelBridge {\n private client: GatewayHttpClient | null = null;\n private readonly queue: QueueEvent[] = [];\n private readonly pendingApprovals = new Map<string, PendingApproval>();\n private cursor = 0;\n private closed = false;\n private eventsAbort: AbortController | null = null;\n\n constructor(\n private readonly cfg: Config,\n private readonly params: {\n gatewayUrl?: string;\n gatewayToken?: string;\n claudeChannelMode: ClaudeChannelMode;\n verbose: boolean;\n },\n ) {}\n\n setServer(_server: unknown): void {\n void _server;\n }\n\n async start(): Promise<void> {\n this.client = createGatewayHttpClientFromConfig({\n config: this.cfg,\n gatewayUrl: this.params.gatewayUrl,\n gatewayToken: this.params.gatewayToken,\n });\n this.connectEvents();\n }\n\n async close(): Promise<void> {\n this.closed = true;\n this.eventsAbort?.abort();\n this.eventsAbort = null;\n this.queue.length = 0;\n this.pendingApprovals.clear();\n }\n\n private connectEvents(): void {\n if (this.closed) {\n return;\n }\n this.eventsAbort?.abort();\n const abort = new AbortController();\n this.eventsAbort = abort;\n const baseUrl = resolveGatewayHttpBaseUrl(this.cfg, this.params.gatewayUrl);\n void this.runEventsLoop(baseUrl, this.params.gatewayToken, abort.signal);\n }\n\n private async runEventsLoop(\n baseUrl: string,\n token: string | undefined,\n signal: AbortSignal,\n ): Promise<void> {\n const url = new URL(`${baseUrl}/api/events`);\n if (token?.trim()) {\n url.searchParams.set('token', token.trim());\n }\n try {\n const res = await loadUndiciRuntimeDeps().fetch(url.toString(), {\n headers: { Accept: 'text/event-stream' },\n signal,\n });\n if (!res.ok || !res.body) {\n return;\n }\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n while (!this.closed && !signal.aborted) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(value, { stream: true });\n let splitAt = buffer.indexOf('\\n\\n');\n while (splitAt >= 0) {\n this.handleSseChunk(buffer.slice(0, splitAt));\n buffer = buffer.slice(splitAt + 2);\n splitAt = buffer.indexOf('\\n\\n');\n }\n }\n } catch {\n // Best-effort reconnect while bridge stays open.\n }\n if (!this.closed && !signal.aborted) {\n await new Promise((resolve) => setTimeout(resolve, 2000));\n if (!this.closed) {\n this.connectEvents();\n }\n }\n }\n\n private handleSseChunk(chunk: string): void {\n let eventName = 'message';\n let data = '';\n for (const line of chunk.split('\\n')) {\n if (line.startsWith('event:')) {\n eventName = line.slice(6).trim();\n } else if (line.startsWith('data:')) {\n data += line.slice(5).trim();\n }\n }\n if (!data) {\n return;\n }\n try {\n const parsed = JSON.parse(data) as Record<string, unknown>;\n this.enqueueFromBroadcast({ type: eventName, ...parsed });\n } catch {\n this.enqueueFromBroadcast({ type: eventName, raw: data });\n }\n }\n\n private enqueueFromBroadcast(data: Record<string, unknown>): void {\n const type = String(data.type ?? data.event ?? '');\n if (!type) {\n return;\n }\n if (type.includes('message') || type.includes('session')) {\n this.pushEvent({\n cursor: ++this.cursor,\n type: 'message',\n sessionKey: String(data.sessionKey ?? data.key ?? ''),\n raw: data,\n });\n }\n }\n\n private pushEvent(event: QueueEvent): void {\n this.queue.push(event);\n while (this.queue.length > QUEUE_LIMIT) {\n this.queue.shift();\n }\n }\n\n async listConversations(args: {\n limit?: number;\n search?: string;\n channel?: string;\n }): Promise<ConversationDescriptor[]> {\n const client = this.client!;\n const query = new URLSearchParams();\n if (args.limit) query.set('limit', String(args.limit));\n if (args.search) query.set('search', args.search);\n if (args.channel) query.set('channel', args.channel);\n const qs = query.toString();\n const rows = await client.getJson<SessionRow[] | { sessions?: SessionRow[] }>(\n `/api/sessions${qs ? `?${qs}` : ''}`,\n );\n const sessions = Array.isArray(rows) ? rows : (rows.sessions ?? []);\n return sessions\n .map((row) => toConversation(row))\n .filter((c): c is ConversationDescriptor => c !== null);\n }\n\n async getConversation(sessionKey: string): Promise<ConversationDescriptor | null> {\n const client = this.client!;\n try {\n const row = await client.getJson<SessionRow>(`/api/sessions/${encodeURIComponent(sessionKey)}`);\n return toConversation(row);\n } catch {\n return null;\n }\n }\n\n async readMessages(\n sessionKey: string,\n limit: number,\n ): Promise<Array<Record<string, unknown>>> {\n const client = this.client!;\n const payload = await client.getJson<{ messages?: Array<Record<string, unknown>> }>(\n `/api/sessions/${encodeURIComponent(sessionKey)}/messages?limit=${limit}`,\n );\n return payload.messages ?? [];\n }\n\n pollEvents(\n filter: WaitFilter,\n limit: number,\n ): { events: QueueEvent[]; nextCursor: number } {\n const events = this.queue\n .filter((e) => e.cursor > filter.afterCursor)\n .filter((e) => !filter.sessionKey || ('sessionKey' in e && e.sessionKey === filter.sessionKey))\n .slice(0, limit);\n const nextCursor = events.length > 0 ? events[events.length - 1]!.cursor : filter.afterCursor;\n return { events, nextCursor };\n }\n\n async waitForEvent(filter: WaitFilter, timeoutMs: number): Promise<QueueEvent | null> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline && !this.closed) {\n const polled = this.pollEvents(filter, 1);\n if (polled.events.length > 0) {\n return polled.events[0] ?? null;\n }\n await new Promise((r) => setTimeout(r, 250));\n }\n return null;\n }\n\n async sendMessage(params: { sessionKey: string; text: string }): Promise<Record<string, unknown>> {\n const client = this.client!;\n return client.postJson('/api/agent', {\n sessionKey: params.sessionKey,\n message: params.text,\n });\n }\n\n listPendingApprovals(): PendingApproval[] {\n return Array.from(this.pendingApprovals.values());\n }\n\n async respondToApproval(params: {\n kind: ApprovalKind;\n id: string;\n decision: ApprovalDecision;\n }): Promise<Record<string, unknown>> {\n const client = this.client!;\n return client.postJson('/api/mcp/approvals/respond', params);\n }\n\n async handleClaudePermissionRequest(_params: {\n requestId: string;\n toolName: string;\n description: string;\n inputPreview: string;\n }): Promise<void> {\n void _params;\n }\n}\n\n// `serveXopcChannelMcp` lazy wrapper removed — it dynamically imported\n// `./channel-server.js`, forming a bridge ↔ server ↔ tools ↔ bridge cycle.\n// Callers (currently only `cli/commands/mcp.ts`) should import\n// `serveXopcChannelMcpImpl` directly from `./channel-server.js`.\n\nexport function loadMcpServeConfig(): Config {\n return loadConfig();\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { isIP } from "node:net";
2
- import { lookup } from "node:dns";
3
2
  import { promisify } from "node:util";
3
+ import { lookup } from "node:dns";
4
4
  //#region src/media-shared/http/ssrf-guard.ts
5
5
  /**
6
6
  * SSRF guard for voice / media-understanding HTTP calls.
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { dirname, join } from "node:path";
4
3
  import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
4
+ import { dirname, join } from "node:path";
5
5
  //#region src/providers/auth-runtime/auth-profile-store.ts
6
6
  /**
7
7
  * {@link AuthProfileStore} implementations.
@@ -1,8 +1,8 @@
1
1
  import { __esmMin, __exportAll } from "../../_virtual/_rolldown/runtime.js";
2
- import { hasProviderAuthOnDiskSync, init_sync_provider_auth } from "../auth/sync-provider-auth.js";
3
2
  import { PROVIDER_ENV_MAP, getApiKeyFromEnv, init_env_keys } from "./env-keys.js";
4
- import { ModelRegistry, getModelRegistry, init_model_registry, prewarmModelRegistry, resetModelRegistry } from "./model-registry.js";
5
3
  import { CredentialResolver, hasCredentials, init_credentials, resolveApiKey } from "../auth/credentials.js";
4
+ import { hasProviderAuthOnDiskSync, init_sync_provider_auth } from "../auth/sync-provider-auth.js";
5
+ import { ModelRegistry, getModelRegistry, init_model_registry, prewarmModelRegistry, resetModelRegistry } from "./model-registry.js";
6
6
  import { getProviderRegistry, init_plugin_registry } from "./plugin-registry.js";
7
7
  import { getModel, getModels, getProviders } from "@earendil-works/pi-ai";
8
8
  //#region src/providers/index.ts
@@ -1,10 +1,10 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { createLogger } from "../utils/logger/index.js";
3
3
  import { init_logger } from "../utils/logger.js";
4
+ import { getApiKeyFromEnv, init_env_keys } from "./env-keys.js";
4
5
  import { resolveModelsJsonPath } from "../config/paths.js";
5
6
  import { init_resolve_config_value, resolveConfigValue, resolveHeaders } from "../config/resolve-config-value.js";
6
7
  import { getDefaultModelValues, init_models_json, validateModelsConfig } from "../config/models-json.js";
7
- import { getApiKeyFromEnv, init_env_keys } from "./env-keys.js";
8
8
  import { existsSync, readFileSync } from "fs";
9
9
  import { getModels, getProviders } from "@earendil-works/pi-ai";
10
10
  //#region src/providers/model-registry.ts
@@ -1,9 +1,9 @@
1
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
1
2
  import { createLogger } from "../utils/logger/index.js";
2
3
  import { init_logger } from "../utils/logger.js";
3
- import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
4
+ import { mkdir, readFile } from "fs/promises";
4
5
  import { join } from "path";
5
6
  import { existsSync } from "fs";
6
- import { mkdir, readFile } from "fs/promises";
7
7
  //#region src/session/config-store.ts
8
8
  /**
9
9
  * Session Config Store
@@ -3,9 +3,9 @@ import { loadEntriesFromFile } from "./load-jsonl-entries.js";
3
3
  import { withTranscriptFileLock } from "./transcript-file-lock.js";
4
4
  import { emitSessionTranscriptUpdate } from "../transcript-events.js";
5
5
  import { buildSessionContextForLlm, isTranscriptContextEntry } from "../session-context-for-llm.js";
6
- import path from "node:path";
7
- import { existsSync } from "node:fs";
8
6
  import { randomUUID } from "node:crypto";
7
+ import { existsSync } from "node:fs";
8
+ import path from "node:path";
9
9
  import { CURRENT_SESSION_VERSION, SessionManager } from "@earendil-works/pi-coding-agent";
10
10
  //#region src/session/parity/jsonl-transcript-io.ts
11
11
  init_write_file_atomic();
@@ -1,5 +1,6 @@
1
- import type { SessionsJsonMap } from './sessions-json-file.js';
1
+ type SessionsJsonMap<T> = Record<string, T>;
2
2
  /**
3
3
  * Raw disk read for sessions.json (no in-memory cache).
4
4
  */
5
5
  export declare function readSessionsJsonFileRaw<T extends Record<string, unknown>>(storePath: string): Promise<SessionsJsonMap<T>>;
6
+ export {};
@@ -1 +1 @@
1
- {"version":3,"file":"sessions-json-file-read.js","names":[],"sources":["../../../../src/session/parity/sessions-json-file-read.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\n\nimport type { SessionsJsonMap } from './sessions-json-file.js';\n\n/**\n * Raw disk read for sessions.json (no in-memory cache).\n */\nexport async function readSessionsJsonFileRaw<T extends Record<string, unknown>>(\n storePath: string,\n): Promise<SessionsJsonMap<T>> {\n try {\n const raw = await readFile(storePath, 'utf-8');\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return {};\n }\n return parsed as SessionsJsonMap<T>;\n } catch {\n return {};\n }\n}\n"],"mappings":";;;;;AAOA,eAAsB,wBACpB,WAC6B;AAC7B,KAAI;EACF,MAAM,MAAM,MAAM,SAAS,WAAW,QAAQ;EAC9C,MAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,OAAO,CAChE,QAAO,EAAE;AAEX,SAAO;SACD;AACN,SAAO,EAAE"}
1
+ {"version":3,"file":"sessions-json-file-read.js","names":[],"sources":["../../../../src/session/parity/sessions-json-file-read.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\n\n// Type duplicated inline `sessions-json-file.ts` imports a value from this\n// file (cache.ts → file-read.ts → file.ts), so re-importing the type back\n// would close the loop. The shape is trivial so we declare it locally.\ntype SessionsJsonMap<T> = Record<string, T>;\n\n/**\n * Raw disk read for sessions.json (no in-memory cache).\n */\nexport async function readSessionsJsonFileRaw<T extends Record<string, unknown>>(\n storePath: string,\n): Promise<SessionsJsonMap<T>> {\n try {\n const raw = await readFile(storePath, 'utf-8');\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return {};\n }\n return parsed as SessionsJsonMap<T>;\n } catch {\n return {};\n }\n}\n"],"mappings":";;;;;AAUA,eAAsB,wBACpB,WAC6B;AAC7B,KAAI;EACF,MAAM,MAAM,MAAM,SAAS,WAAW,QAAQ;EAC9C,MAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,OAAO,CAChE,QAAO,EAAE;AAEX,SAAO;SACD;AACN,SAAO,EAAE"}
@@ -1,9 +1,9 @@
1
1
  import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
2
2
  import { readSessionsJsonFileRaw } from "./sessions-json-file-read.js";
3
3
  import { commitSessionsJsonWrite, getSessionsJsonWriteStats, invalidateSessionsJsonCache, noteSessionsJsonWritten, readSessionsJsonCached, resetSessionsJsonCacheForTest } from "./sessions-json-cache.js";
4
- import { dirname } from "node:path";
5
4
  import { existsSync } from "node:fs";
6
5
  import { mkdir } from "node:fs/promises";
6
+ import { dirname } from "node:path";
7
7
  import lockfile from "proper-lockfile";
8
8
  //#region src/session/parity/sessions-json-file.ts
9
9
  init_write_file_atomic();
@@ -1,7 +1,7 @@
1
- import path from "node:path";
2
- import { existsSync } from "node:fs";
3
1
  import { createHash } from "node:crypto";
2
+ import { existsSync } from "node:fs";
4
3
  import { mkdir, open, readFile, rm, stat } from "node:fs/promises";
4
+ import path from "node:path";
5
5
  //#region src/session/parity/transcript-file-lock.ts
6
6
  /**
7
7
  * Cross-process (and re-entrant same-process) advisory lock for session transcript JSONL.
@@ -1,8 +1,8 @@
1
1
  import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
2
2
  import { formatSessionArchiveTimestamp, init_artifacts } from "./artifacts.js";
3
3
  import { init_session_id, validateSessionId } from "./session-id.js";
4
- import { dirname, relative, resolve } from "node:path";
5
4
  import fsSync from "node:fs";
5
+ import { dirname, relative, resolve } from "node:path";
6
6
  //#region src/session/parity/transcript-paths.ts
7
7
  function resolveSessionsDir(opts) {
8
8
  const sessionsDir = opts?.sessionsDir?.trim();
@@ -1,7 +1,7 @@
1
1
  import { FILENAMES, init_paths } from "../config/paths.js";
2
2
  import { SessionSearchIndex } from "./search-index.js";
3
- import { join } from "node:path";
4
3
  import { stat } from "node:fs/promises";
4
+ import { join } from "node:path";
5
5
  //#region src/session/search-index-cache.ts
6
6
  /**
7
7
  * Shared cache for {@link SessionSearchIndex} builds (invalidated on session writes).
@@ -2,8 +2,8 @@ import { init_transcript_paths, resolveSessionFilePath } from "./parity/transcri
2
2
  import { FILENAMES, init_paths } from "../config/paths.js";
3
3
  import { isTranscriptContextEntry } from "./session-context-for-llm.js";
4
4
  import { readTranscriptRowsFromFile, rowsToLlmMessages } from "./parity/jsonl-transcript-io.js";
5
- import { join } from "node:path";
6
5
  import { readFile } from "node:fs/promises";
6
+ import { join } from "node:path";
7
7
  //#region src/session/search-index.ts
8
8
  /**
9
9
  * In-memory inverted index over session transcripts (`sessions.json` + JSONL).
@@ -1,6 +1,6 @@
1
- import { init_session_key, isCronSessionKey, parseSessionKey } from "../routing/session-key.js";
2
1
  import { createLogger } from "../utils/logger/index.js";
3
2
  import { init_logger } from "../utils/logger.js";
3
+ import { init_session_key, isCronSessionKey, parseSessionKey } from "../routing/session-key.js";
4
4
  import { init_providers, resolveModel } from "../providers/index.js";
5
5
  import { readAgentMessageContent } from "../agent/memory/agent-message-access.js";
6
6
  import { stripInboundFileMetadataFromText } from "../channels/attachments/inbound-persist.js";
@@ -1,12 +1,12 @@
1
- import { init_agent_scope, listAgentEntries, resolveDefaultAgentId } from "../agent/agent-scope.js";
2
- import { init_session_key, parseSessionKey } from "../routing/session-key.js";
3
- import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
4
1
  import { createLogger } from "../utils/logger/index.js";
5
2
  import { init_logger } from "../utils/logger.js";
3
+ import { init_agent_scope, listAgentEntries, resolveDefaultAgentId } from "../agent/agent-scope.js";
6
4
  import { init_artifacts, parseCompactionCheckpointTranscriptFileName } from "./parity/artifacts.js";
7
5
  import { init_session_id, validateSessionId } from "./parity/session-id.js";
8
6
  import { archiveFileOnDisk, init_transcript_paths, resolveSessionFilePath, resolveSessionTranscriptPathInDir } from "./parity/transcript-paths.js";
9
7
  import { FILENAMES, init_paths, resolveSessionsDir } from "../config/paths.js";
8
+ import { init_session_key, parseSessionKey } from "../routing/session-key.js";
9
+ import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
10
10
  import { loadEntriesFromFile } from "./parity/load-jsonl-entries.js";
11
11
  import { mergeLlmMessagesPreservingContextRows } from "./session-context-for-llm.js";
12
12
  import { appendPiTranscriptContextEntry, persistMergedTranscriptRows, readTranscriptRowsFromFile, rowsToLlmMessages, writeTranscriptJsonl } from "./parity/jsonl-transcript-io.js";
@@ -19,10 +19,10 @@ import "./types.js";
19
19
  import { readSessionsJsonFile, withSessionsJsonLock } from "./parity/sessions-json-file.js";
20
20
  import { buildSessionsJsonStatsPatch, incrementSessionsJsonStatsForAppend, isAppendOnlyLlmTranscriptMessage, patchSessionsJsonEntryStats } from "./parity/sessions-json-patch.js";
21
21
  import { countTranscriptMessageRows, readDisplayMessagePageFromTranscriptFile } from "./parity/transcript-pagination.js";
22
- import { join } from "path";
23
- import { existsSync } from "fs";
24
22
  import { copyFile, mkdir, readdir, stat, unlink } from "fs/promises";
25
23
  import { randomUUID } from "node:crypto";
24
+ import { join } from "path";
25
+ import { existsSync } from "fs";
26
26
  //#region src/session/store.ts
27
27
  init_paths();
28
28
  init_agent_scope();
@@ -1,4 +1,12 @@
1
- import { type RateLimitResult } from '../infra/rate-limit.js';
2
- export declare function consumeSharePublicLimit(clientIp: string): RateLimitResult;
1
+ export type SharePublicLimitResult = {
2
+ allowed: boolean;
3
+ retryAfterMs: number;
4
+ };
5
+ /**
6
+ * Two-level limiter for public share download routes: a short burst window
7
+ * and a longer aggregate window. The short window kicks in first; if it
8
+ * blocks, the long window isn't consumed (we don't want to penalize twice).
9
+ */
10
+ export declare function consumeSharePublicLimit(clientIp: string): SharePublicLimitResult;
3
11
  /** @internal */
4
12
  export declare function resetSharePublicLimitsForTests(): void;
@@ -1,58 +1,49 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
- import { createFixedWindowRateLimiter } from "../infra/rate-limit.js";
3
+ import { buckets } from "../gateway/rate-limit/buckets.js";
4
+ import "../gateway/rate-limit/index.js";
4
5
  //#region src/share/share-rate-limit.ts
5
6
  init_logger();
6
7
  const log = createLogger("ShareRateLimit");
7
- /** Per-IP rate limiter for public share download routes. */
8
- const SHORT_WINDOW_MAX = 60;
9
- const SHORT_WINDOW_MS = 6e4;
10
- const LONG_WINDOW_MAX = 300;
11
- const LONG_WINDOW_MS = 15 * 6e4;
12
- const shortLimiters = /* @__PURE__ */ new Map();
13
- const longLimiters = /* @__PURE__ */ new Map();
8
+ /**
9
+ * Two-level limiter for public share download routes: a short burst window
10
+ * and a longer aggregate window. The short window kicks in first; if it
11
+ * blocks, the long window isn't consumed (we don't want to penalize twice).
12
+ */
14
13
  function consumeSharePublicLimit(clientIp) {
15
- let shortLimiter = shortLimiters.get(clientIp);
16
- if (!shortLimiter) {
17
- shortLimiter = createFixedWindowRateLimiter({
18
- maxRequests: SHORT_WINDOW_MAX,
19
- windowMs: SHORT_WINDOW_MS
20
- });
21
- shortLimiters.set(clientIp, shortLimiter);
22
- }
23
- const shortResult = shortLimiter.consume();
24
- if (!shortResult.allowed) {
14
+ const short = buckets.sharePublicShort().consume(clientIp);
15
+ if (!short.allowed) {
25
16
  log.warn({
26
17
  clientIp,
27
- limit: SHORT_WINDOW_MAX,
28
- windowSec: Math.round(SHORT_WINDOW_MS / 1e3),
29
- retryAfterSec: Math.ceil(shortResult.retryAfterMs / 1e3),
30
- reason: "short_window_exceeded"
31
- }, `Share public rate limit exceeded: ${SHORT_WINDOW_MAX} req/${SHORT_WINDOW_MS / 1e3}s per IP`);
32
- return shortResult;
18
+ retryAfterSec: Math.ceil(short.retryAfterMs / 1e3),
19
+ reason: "share_short_window"
20
+ }, "Share public rate limit exceeded (short window)");
21
+ return {
22
+ allowed: false,
23
+ retryAfterMs: short.retryAfterMs
24
+ };
33
25
  }
34
- let longLimiter = longLimiters.get(clientIp);
35
- if (!longLimiter) {
36
- longLimiter = createFixedWindowRateLimiter({
37
- maxRequests: LONG_WINDOW_MAX,
38
- windowMs: LONG_WINDOW_MS
39
- });
40
- longLimiters.set(clientIp, longLimiter);
26
+ const long = buckets.sharePublicLong().consume(clientIp);
27
+ if (!long.allowed) {
28
+ log.warn({
29
+ clientIp,
30
+ retryAfterSec: Math.ceil(long.retryAfterMs / 1e3),
31
+ reason: "share_long_window"
32
+ }, "Share public rate limit exceeded (long window)");
33
+ return {
34
+ allowed: false,
35
+ retryAfterMs: long.retryAfterMs
36
+ };
41
37
  }
42
- const longResult = longLimiter.consume();
43
- if (!longResult.allowed) log.warn({
44
- clientIp,
45
- limit: LONG_WINDOW_MAX,
46
- windowSec: Math.round(LONG_WINDOW_MS / 1e3),
47
- retryAfterSec: Math.ceil(longResult.retryAfterMs / 1e3),
48
- reason: "long_window_exceeded"
49
- }, `Share public rate limit exceeded: ${LONG_WINDOW_MAX} req/${LONG_WINDOW_MS / 6e4}min per IP`);
50
- return longResult;
38
+ return {
39
+ allowed: true,
40
+ retryAfterMs: 0
41
+ };
51
42
  }
52
43
  /** @internal */
53
44
  function resetSharePublicLimitsForTests() {
54
- shortLimiters.clear();
55
- longLimiters.clear();
45
+ buckets.sharePublicShort().resetForTests();
46
+ buckets.sharePublicLong().resetForTests();
56
47
  }
57
48
  //#endregion
58
49
  export { consumeSharePublicLimit, resetSharePublicLimitsForTests };
@@ -1 +1 @@
1
- {"version":3,"file":"share-rate-limit.js","names":[],"sources":["../../../src/share/share-rate-limit.ts"],"sourcesContent":["import { createFixedWindowRateLimiter, type RateLimitResult } from '../infra/rate-limit.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst log = createLogger('ShareRateLimit');\n\n/** Per-IP rate limiter for public share download routes. */\nconst SHORT_WINDOW_MAX = 60;\nconst SHORT_WINDOW_MS = 60_000;\n\nconst LONG_WINDOW_MAX = 300;\nconst LONG_WINDOW_MS = 15 * 60_000;\n\nconst shortLimiters = new Map<string, ReturnType<typeof createFixedWindowRateLimiter>>();\nconst longLimiters = new Map<string, ReturnType<typeof createFixedWindowRateLimiter>>();\n\nexport function consumeSharePublicLimit(clientIp: string): RateLimitResult {\n let shortLimiter = shortLimiters.get(clientIp);\n if (!shortLimiter) {\n shortLimiter = createFixedWindowRateLimiter({ maxRequests: SHORT_WINDOW_MAX, windowMs: SHORT_WINDOW_MS });\n shortLimiters.set(clientIp, shortLimiter);\n }\n const shortResult = shortLimiter.consume();\n if (!shortResult.allowed) {\n log.warn(\n {\n clientIp,\n limit: SHORT_WINDOW_MAX,\n windowSec: Math.round(SHORT_WINDOW_MS / 1000),\n retryAfterSec: Math.ceil(shortResult.retryAfterMs / 1000),\n reason: 'short_window_exceeded',\n },\n `Share public rate limit exceeded: ${SHORT_WINDOW_MAX} req/${SHORT_WINDOW_MS / 1000}s per IP`,\n );\n return shortResult;\n }\n\n let longLimiter = longLimiters.get(clientIp);\n if (!longLimiter) {\n longLimiter = createFixedWindowRateLimiter({ maxRequests: LONG_WINDOW_MAX, windowMs: LONG_WINDOW_MS });\n longLimiters.set(clientIp, longLimiter);\n }\n const longResult = longLimiter.consume();\n if (!longResult.allowed) {\n log.warn(\n {\n clientIp,\n limit: LONG_WINDOW_MAX,\n windowSec: Math.round(LONG_WINDOW_MS / 1000),\n retryAfterSec: Math.ceil(longResult.retryAfterMs / 1000),\n reason: 'long_window_exceeded',\n },\n `Share public rate limit exceeded: ${LONG_WINDOW_MAX} req/${LONG_WINDOW_MS / 60000}min per IP`,\n );\n }\n return longResult;\n}\n\n/** @internal */\nexport function resetSharePublicLimitsForTests(): void {\n shortLimiters.clear();\n longLimiters.clear();\n}\n"],"mappings":";;;;aACkD;AAElD,MAAM,MAAM,aAAa,iBAAiB;;AAG1C,MAAM,mBAAmB;AACzB,MAAM,kBAAkB;AAExB,MAAM,kBAAkB;AACxB,MAAM,iBAAiB,KAAK;AAE5B,MAAM,gCAAgB,IAAI,KAA8D;AACxF,MAAM,+BAAe,IAAI,KAA8D;AAEvF,SAAgB,wBAAwB,UAAmC;CACzE,IAAI,eAAe,cAAc,IAAI,SAAS;AAC9C,KAAI,CAAC,cAAc;AACjB,iBAAe,6BAA6B;GAAE,aAAa;GAAkB,UAAU;GAAiB,CAAC;AACzG,gBAAc,IAAI,UAAU,aAAa;;CAE3C,MAAM,cAAc,aAAa,SAAS;AAC1C,KAAI,CAAC,YAAY,SAAS;AACxB,MAAI,KACF;GACE;GACA,OAAO;GACP,WAAW,KAAK,MAAM,kBAAkB,IAAK;GAC7C,eAAe,KAAK,KAAK,YAAY,eAAe,IAAK;GACzD,QAAQ;GACT,EACD,qCAAqC,iBAAiB,OAAO,kBAAkB,IAAK,UACrF;AACD,SAAO;;CAGT,IAAI,cAAc,aAAa,IAAI,SAAS;AAC5C,KAAI,CAAC,aAAa;AAChB,gBAAc,6BAA6B;GAAE,aAAa;GAAiB,UAAU;GAAgB,CAAC;AACtG,eAAa,IAAI,UAAU,YAAY;;CAEzC,MAAM,aAAa,YAAY,SAAS;AACxC,KAAI,CAAC,WAAW,QACd,KAAI,KACF;EACE;EACA,OAAO;EACP,WAAW,KAAK,MAAM,iBAAiB,IAAK;EAC5C,eAAe,KAAK,KAAK,WAAW,eAAe,IAAK;EACxD,QAAQ;EACT,EACD,qCAAqC,gBAAgB,OAAO,iBAAiB,IAAM,YACpF;AAEH,QAAO;;;AAIT,SAAgB,iCAAuC;AACrD,eAAc,OAAO;AACrB,cAAa,OAAO"}
1
+ {"version":3,"file":"share-rate-limit.js","names":[],"sources":["../../../src/share/share-rate-limit.ts"],"sourcesContent":["import { buckets } from '../gateway/rate-limit/index.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst log = createLogger('ShareRateLimit');\n\nexport type SharePublicLimitResult = {\n allowed: boolean;\n retryAfterMs: number;\n};\n\n/**\n * Two-level limiter for public share download routes: a short burst window\n * and a longer aggregate window. The short window kicks in first; if it\n * blocks, the long window isn't consumed (we don't want to penalize twice).\n */\nexport function consumeSharePublicLimit(clientIp: string): SharePublicLimitResult {\n const short = buckets.sharePublicShort().consume(clientIp);\n if (!short.allowed) {\n log.warn(\n {\n clientIp,\n retryAfterSec: Math.ceil(short.retryAfterMs / 1000),\n reason: 'share_short_window',\n },\n 'Share public rate limit exceeded (short window)',\n );\n return { allowed: false, retryAfterMs: short.retryAfterMs };\n }\n\n const long = buckets.sharePublicLong().consume(clientIp);\n if (!long.allowed) {\n log.warn(\n {\n clientIp,\n retryAfterSec: Math.ceil(long.retryAfterMs / 1000),\n reason: 'share_long_window',\n },\n 'Share public rate limit exceeded (long window)',\n );\n return { allowed: false, retryAfterMs: long.retryAfterMs };\n }\n\n return { allowed: true, retryAfterMs: 0 };\n}\n\n/** @internal */\nexport function resetSharePublicLimitsForTests(): void {\n buckets.sharePublicShort().resetForTests();\n buckets.sharePublicLong().resetForTests();\n}\n"],"mappings":";;;;;aACkD;AAElD,MAAM,MAAM,aAAa,iBAAiB;;;;;;AAY1C,SAAgB,wBAAwB,UAA0C;CAChF,MAAM,QAAQ,QAAQ,kBAAkB,CAAC,QAAQ,SAAS;AAC1D,KAAI,CAAC,MAAM,SAAS;AAClB,MAAI,KACF;GACE;GACA,eAAe,KAAK,KAAK,MAAM,eAAe,IAAK;GACnD,QAAQ;GACT,EACD,kDACD;AACD,SAAO;GAAE,SAAS;GAAO,cAAc,MAAM;GAAc;;CAG7D,MAAM,OAAO,QAAQ,iBAAiB,CAAC,QAAQ,SAAS;AACxD,KAAI,CAAC,KAAK,SAAS;AACjB,MAAI,KACF;GACE;GACA,eAAe,KAAK,KAAK,KAAK,eAAe,IAAK;GAClD,QAAQ;GACT,EACD,iDACD;AACD,SAAO;GAAE,SAAS;GAAO,cAAc,KAAK;GAAc;;AAG5D,QAAO;EAAE,SAAS;EAAM,cAAc;EAAG;;;AAI3C,SAAgB,iCAAuC;AACrD,SAAQ,kBAAkB,CAAC,eAAe;AAC1C,SAAQ,iBAAiB,CAAC,eAAe"}
@@ -1,14 +1,14 @@
1
- import { resolveStateDir } from "../config/paths-state.js";
2
1
  import { createLogger } from "../utils/logger/index.js";
3
2
  import { init_logger } from "../utils/logger.js";
3
+ import { resolveStateDir } from "../config/paths-state.js";
4
4
  import { init_paths } from "../config/paths.js";
5
5
  import { isPathUnderWorkspace } from "../gateway/workspace-editor-path.js";
6
6
  import { logShareAudit } from "./share-audit.js";
7
7
  import { SHARE_CONFIG_DEFAULTS } from "./share-types.js";
8
- import { join } from "node:path";
9
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
10
8
  import { randomBytes, randomUUID } from "node:crypto";
9
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
11
10
  import { lstat, realpath, stat } from "node:fs/promises";
11
+ import { join } from "node:path";
12
12
  //#region src/share/share-store.ts
13
13
  init_paths();
14
14
  init_logger();
@@ -1,13 +1,13 @@
1
- import { getWorkspacePath } from "../../config/schema.js";
2
1
  import { createLogger } from "../../utils/logger/index.js";
3
2
  import { init_logger } from "../../utils/logger.js";
4
3
  import { loadConfig } from "../../config/loader.js";
5
4
  import { getAllProviders, getModelsByProvider, init_providers } from "../../providers/index.js";
6
- import { MessageBus, MessageBusShutdownError } from "../../infra/bus/queue.js";
7
- import "../../infra/bus/index.js";
8
5
  import { prependEnvelopeTimestamp } from "../../channels/envelope-timestamp.js";
9
6
  import { messagesToClientHistory } from "../../session/client-history.js";
7
+ import { getWorkspacePath } from "../../config/workspace-path-helpers.js";
10
8
  import { parseModelRef } from "../../agent/models/selection.js";
9
+ import { MessageBus, MessageBusShutdownError } from "../../infra/bus/queue.js";
10
+ import "../../infra/bus/index.js";
11
11
  import { AgentService } from "../../agent/service.js";
12
12
  import "../../agent/index.js";
13
13
  import "../../config/index.js";
@@ -85,7 +85,7 @@ var EmbeddedBackend = class {
85
85
  (async () => {
86
86
  try {
87
87
  const messageForAgent = opts.message.trimStart().startsWith("/") ? opts.message : prependEnvelopeTimestamp(opts.message);
88
- const stream = this.agent.processDirectStreaming(messageForAgent, opts.sessionKey, void 0, opts.thinking, { signal });
88
+ const stream = this.agent.turnDispatcher.processDirectStreaming(messageForAgent, opts.sessionKey, void 0, opts.thinking, { signal });
89
89
  for await (const event of stream) {
90
90
  if (signal.aborted) break;
91
91
  this.onEvent?.({
@@ -118,12 +118,12 @@ var EmbeddedBackend = class {
118
118
  }
119
119
  async steerChat(opts) {
120
120
  if (!this.agent) return { ok: false };
121
- return { ok: await this.agent.steerWebchatSession(opts.sessionKey, opts.message) };
121
+ return { ok: await this.agent.turnDispatcher.steerWebchatSession(opts.sessionKey, opts.message) };
122
122
  }
123
123
  async loadHistory(opts) {
124
124
  if (!this.agent) return { messages: [] };
125
125
  try {
126
- const detail = await this.agent.loadSessionDetail(opts.sessionKey);
126
+ const detail = await this.agent.sessionStore.get(opts.sessionKey);
127
127
  if (!detail) return { messages: [] };
128
128
  return { messages: messagesToClientHistory(detail.messages, { limit: opts.limit }) };
129
129
  } catch (error) {
@@ -138,7 +138,11 @@ var EmbeddedBackend = class {
138
138
  async listSessions() {
139
139
  if (!this.agent) return [];
140
140
  try {
141
- return (await this.agent.listSessionsForUi(200)).map(sessionMetadataToTuiItem);
141
+ return (await this.agent.sessionStore.list({
142
+ limit: 200,
143
+ sortBy: "updatedAt",
144
+ sortOrder: "desc"
145
+ })).items.map(sessionMetadataToTuiItem);
142
146
  } catch (error) {
143
147
  const errorMessage = error instanceof Error ? error.message : String(error);
144
148
  log.warn({
@@ -151,7 +155,7 @@ var EmbeddedBackend = class {
151
155
  async renameSession(sessionKey, name) {
152
156
  if (!this.agent) return { ok: false };
153
157
  try {
154
- await this.agent.renameSessionKey(sessionKey, name);
158
+ await this.agent.sessionStore.updateMetadata(sessionKey, { name: name.trim() });
155
159
  return { ok: true };
156
160
  } catch (error) {
157
161
  const errorMessage = error instanceof Error ? error.message : String(error);
@@ -166,7 +170,7 @@ var EmbeddedBackend = class {
166
170
  async deleteSession(sessionKey) {
167
171
  if (!this.agent) return { ok: false };
168
172
  try {
169
- return { ok: await this.agent.deleteSessionKey(sessionKey) };
173
+ return { ok: await this.agent.sessionStore.deleteSession(sessionKey) };
170
174
  } catch (error) {
171
175
  const errorMessage = error instanceof Error ? error.message : String(error);
172
176
  log.warn({
@@ -183,9 +187,9 @@ var EmbeddedBackend = class {
183
187
  return { model: (typeof modelConfig === "string" ? modelConfig : modelConfig?.primary) ?? void 0 };
184
188
  }
185
189
  try {
186
- const cfg = await this.agent.getSessionAgentConfig(sessionKey);
190
+ const cfg = await this.agent.sessionInspector.agentConfig(sessionKey);
187
191
  const parsed = parseModelRef(cfg.model);
188
- const usage = await this.agent.getSessionContextUsage(sessionKey);
192
+ const usage = await this.agent.sessionInspector.contextUsage(sessionKey);
189
193
  return {
190
194
  model: parsed?.model ?? cfg.model,
191
195
  modelProvider: parsed?.provider,
@@ -225,7 +229,7 @@ var EmbeddedBackend = class {
225
229
  summary: "Agent not started"
226
230
  };
227
231
  try {
228
- const result = await this.agent.compactSession(sessionKey, { force: options?.force ?? true });
232
+ const result = await this.agent.sessionInspector.compact(sessionKey, { force: options?.force ?? true });
229
233
  const summary = result.compacted ? `Compacted (${result.tokensBefore ?? "?"} → ${result.tokensAfter ?? "?"} tokens)` : "Nothing to compact";
230
234
  return {
231
235
  compacted: result.compacted,
@@ -1 +1 @@
1
- {"version":3,"file":"embedded-backend.js","names":[],"sources":["../../../../src/tui/backends/embedded-backend.ts"],"sourcesContent":["import type { ExtensionRegistryImpl } from '../../extensions/loader.js';\nimport { AgentService } from '../../agent/index.js';\nimport { parseModelRef } from '../../agent/models/selection.js';\nimport { messagesToClientHistory } from '../../session/client-history.js';\nimport { prependEnvelopeTimestamp } from '../../channels/envelope-timestamp.js';\nimport { loadConfig, getWorkspacePath } from '../../config/index.js';\nimport { MessageBus, MessageBusShutdownError } from '../../infra/bus/index.js';\nimport { getAllProviders, getModelsByProvider } from '../../providers/index.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type {\n ChatSendOptions,\n HistoryMessage,\n TuiBackend,\n TuiEvent,\n TuiModelChoice,\n TuiSessionItem,\n} from '../tui-backend.js';\nimport type { SessionInfo } from '../tui-types.js';\nimport { sessionMetadataToTuiItem } from '../tui-session-format.js';\n\nconst log = createLogger('TUI:Embedded');\n\n/**\n * TUI backend that runs the agent in-process (no gateway required).\n *\n * Wraps `AgentService` directly and emits TuiEvents by observing the\n * `MessageBus` output stream.\n */\nexport class EmbeddedBackend implements TuiBackend {\n private bus: MessageBus;\n private agent: AgentService | null = null;\n private running = false;\n private chatAbort: AbortController | null = null;\n\n onEvent?: (evt: TuiEvent) => void;\n onConnected?: () => void;\n onDisconnected?: (reason: string) => void;\n\n constructor(private readonly opts?: { extensionRegistry?: ExtensionRegistryImpl }) {\n this.bus = new MessageBus();\n }\n\n get connectionLabel(): string {\n return 'local embedded';\n }\n\n start(): void {\n if (this.running) return;\n this.running = true;\n\n const config = loadConfig();\n const workspace = getWorkspacePath(config);\n const modelConfig = config.agents?.defaults?.model;\n const modelId = typeof modelConfig === 'string' ? modelConfig : modelConfig?.primary;\n\n this.agent = new AgentService(this.bus, {\n workspace: workspace ?? process.cwd(),\n model: modelId,\n config,\n extensionRegistry: this.opts?.extensionRegistry,\n });\n\n this.agent.start().catch((err) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n log.error({ err, errorMessage }, `Embedded agent failed: ${errorMessage}`);\n this.onDisconnected?.(errorMessage);\n });\n\n // Process outbound messages in background\n this.processOutbound();\n\n // Signal ready\n queueMicrotask(() => this.onConnected?.());\n }\n\n stop(): void {\n this.running = false;\n this.chatAbort?.abort();\n this.chatAbort = null;\n this.bus.shutdown();\n void this.agent?.stop();\n this.agent = null;\n }\n\n async sendChat(opts: ChatSendOptions): Promise<{ runId: string }> {\n if (!this.agent) throw new Error('Agent not started');\n\n const runId = crypto.randomUUID();\n this.chatAbort?.abort();\n this.chatAbort = new AbortController();\n const signal = this.chatAbort.signal;\n\n this.onEvent?.({ event: 'status', data: { status: 'started', runId } });\n\n // Run the stream in background so the TUI event loop stays responsive.\n void (async () => {\n try {\n // Prepend envelope timestamp so the model knows the current date/time,\n // matching the behavior of channel pipelines (Telegram, Weixin, etc.).\n // Skip for slash commands — parseSlashCommand requires lines starting with '/'.\n const messageForAgent = opts.message.trimStart().startsWith('/')\n ? opts.message\n : prependEnvelopeTimestamp(opts.message);\n\n const stream = this.agent!.processDirectStreaming(\n messageForAgent,\n opts.sessionKey,\n undefined,\n opts.thinking,\n { signal },\n );\n\n for await (const event of stream) {\n if (signal.aborted) break;\n this.onEvent?.({ event: event.type, data: event });\n }\n\n if (!signal.aborted) {\n this.onEvent?.({\n event: 'result',\n data: { ok: true },\n });\n }\n } catch (error) {\n if (signal.aborted) return;\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.onEvent?.({ event: 'error', data: { content: errorMessage } });\n }\n })();\n\n return { runId };\n }\n\n async abortChat(_opts: { sessionKey: string; runId: string }): Promise<{ ok: boolean }> {\n if (this.chatAbort) {\n this.chatAbort.abort();\n this.chatAbort = null;\n return { ok: true };\n }\n return { ok: false };\n }\n\n async steerChat(opts: { sessionKey: string; message: string }): Promise<{ ok: boolean }> {\n if (!this.agent) return { ok: false };\n const ok = await this.agent.steerWebchatSession(opts.sessionKey, opts.message);\n return { ok };\n }\n\n async loadHistory(opts: {\n sessionKey: string;\n limit?: number;\n }): Promise<{ messages: HistoryMessage[] }> {\n if (!this.agent) {\n return { messages: [] };\n }\n try {\n const detail = await this.agent.loadSessionDetail(opts.sessionKey);\n if (!detail) {\n return { messages: [] };\n }\n return {\n messages: messagesToClientHistory(detail.messages, { limit: opts.limit }),\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, errorMessage }, `Embedded loadHistory failed: ${errorMessage}`);\n return { messages: [] };\n }\n }\n\n async listSessions(): Promise<TuiSessionItem[]> {\n if (!this.agent) return [];\n try {\n const items = await this.agent.listSessionsForUi(200);\n return items.map(sessionMetadataToTuiItem);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, errorMessage }, `Embedded listSessions failed: ${errorMessage}`);\n return [];\n }\n }\n\n async renameSession(sessionKey: string, name: string): Promise<{ ok: boolean }> {\n if (!this.agent) return { ok: false };\n try {\n await this.agent.renameSessionKey(sessionKey, name);\n return { ok: true };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, sessionKey, errorMessage }, `Embedded renameSession failed: ${errorMessage}`);\n return { ok: false };\n }\n }\n\n async deleteSession(sessionKey: string): Promise<{ ok: boolean }> {\n if (!this.agent) return { ok: false };\n try {\n const ok = await this.agent.deleteSessionKey(sessionKey);\n return { ok };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, sessionKey, errorMessage }, `Embedded deleteSession failed: ${errorMessage}`);\n return { ok: false };\n }\n }\n\n async getSessionInfo(sessionKey: string): Promise<SessionInfo> {\n if (!this.agent) {\n const config = loadConfig();\n const modelConfig = config.agents?.defaults?.model;\n const model = typeof modelConfig === 'string' ? modelConfig : modelConfig?.primary;\n return { model: model ?? undefined };\n }\n try {\n const cfg = await this.agent.getSessionAgentConfig(sessionKey);\n const parsed = parseModelRef(cfg.model);\n const usage = await this.agent.getSessionContextUsage(sessionKey);\n return {\n model: parsed?.model ?? cfg.model,\n modelProvider: parsed?.provider,\n thinkingLevel: cfg.thinkingLevel,\n totalTokens: usage.estimatedTokens,\n contextWindow: usage.contextWindow,\n contextUsagePercent: usage.usagePercent,\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n log.warn({ err, sessionKey, errorMessage }, `getSessionInfo failed: ${errorMessage}`);\n const config = loadConfig();\n const modelConfig = config.agents?.defaults?.model;\n const model = typeof modelConfig === 'string' ? modelConfig : modelConfig?.primary;\n return { model: model ?? undefined };\n }\n }\n\n async listModels(): Promise<TuiModelChoice[]> {\n const choices: TuiModelChoice[] = [];\n for (const provider of getAllProviders()) {\n for (const model of getModelsByProvider(provider)) {\n choices.push({\n id: model.id,\n name: model.name ?? model.id,\n provider,\n });\n }\n }\n return choices;\n }\n\n async resetSession(sessionKey: string): Promise<void> {\n if (!this.agent) return;\n await this.agent.clearSessionMessages(sessionKey);\n }\n\n async patchSession(\n _sessionKey: string,\n _patch: Record<string, unknown>,\n ): Promise<void> {\n // Not supported in embedded mode\n }\n\n async compactSession(\n sessionKey: string,\n options?: { force?: boolean },\n ): Promise<{ compacted: boolean; summary?: string }> {\n if (!this.agent) return { compacted: false, summary: 'Agent not started' };\n try {\n const result = await this.agent.compactSession(sessionKey, { force: options?.force ?? true });\n const summary = result.compacted\n ? `Compacted (${result.tokensBefore ?? '?'} → ${result.tokensAfter ?? '?'} tokens)`\n : 'Nothing to compact';\n return { compacted: result.compacted, summary };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n return { compacted: false, summary: errorMessage };\n }\n }\n\n private processOutbound(): void {\n void (async () => {\n while (this.running) {\n try {\n const msg = await this.bus.consumeOutbound();\n log.debug({ channel: msg.channel, chatId: msg.chat_id }, 'Outbound message');\n } catch (error) {\n if (error instanceof MessageBusShutdownError) break;\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, errorMessage }, `Outbound processor failed: ${errorMessage}`);\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n }\n })();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"embedded-backend.js","names":[],"sources":["../../../../src/tui/backends/embedded-backend.ts"],"sourcesContent":["import type { ExtensionRegistryImpl } from '../../extensions/loader.js';\nimport { AgentService } from '../../agent/index.js';\nimport { parseModelRef } from '../../agent/models/selection.js';\nimport { messagesToClientHistory } from '../../session/client-history.js';\nimport { prependEnvelopeTimestamp } from '../../channels/envelope-timestamp.js';\nimport { loadConfig, getWorkspacePath } from '../../config/index.js';\nimport { MessageBus, MessageBusShutdownError } from '../../infra/bus/index.js';\nimport { getAllProviders, getModelsByProvider } from '../../providers/index.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type {\n ChatSendOptions,\n HistoryMessage,\n TuiBackend,\n TuiEvent,\n TuiModelChoice,\n TuiSessionItem,\n} from '../tui-backend.js';\nimport type { SessionInfo } from '../tui-types.js';\nimport { sessionMetadataToTuiItem } from '../tui-session-format.js';\n\nconst log = createLogger('TUI:Embedded');\n\n/**\n * TUI backend that runs the agent in-process (no gateway required).\n *\n * Wraps `AgentService` directly and emits TuiEvents by observing the\n * `MessageBus` output stream.\n */\nexport class EmbeddedBackend implements TuiBackend {\n private bus: MessageBus;\n private agent: AgentService | null = null;\n private running = false;\n private chatAbort: AbortController | null = null;\n\n onEvent?: (evt: TuiEvent) => void;\n onConnected?: () => void;\n onDisconnected?: (reason: string) => void;\n\n constructor(private readonly opts?: { extensionRegistry?: ExtensionRegistryImpl }) {\n this.bus = new MessageBus();\n }\n\n get connectionLabel(): string {\n return 'local embedded';\n }\n\n start(): void {\n if (this.running) return;\n this.running = true;\n\n const config = loadConfig();\n const workspace = getWorkspacePath(config);\n const modelConfig = config.agents?.defaults?.model;\n const modelId = typeof modelConfig === 'string' ? modelConfig : modelConfig?.primary;\n\n this.agent = new AgentService(this.bus, {\n workspace: workspace ?? process.cwd(),\n model: modelId,\n config,\n extensionRegistry: this.opts?.extensionRegistry,\n });\n\n this.agent.start().catch((err) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n log.error({ err, errorMessage }, `Embedded agent failed: ${errorMessage}`);\n this.onDisconnected?.(errorMessage);\n });\n\n // Process outbound messages in background\n this.processOutbound();\n\n // Signal ready\n queueMicrotask(() => this.onConnected?.());\n }\n\n stop(): void {\n this.running = false;\n this.chatAbort?.abort();\n this.chatAbort = null;\n this.bus.shutdown();\n void this.agent?.stop();\n this.agent = null;\n }\n\n async sendChat(opts: ChatSendOptions): Promise<{ runId: string }> {\n if (!this.agent) throw new Error('Agent not started');\n\n const runId = crypto.randomUUID();\n this.chatAbort?.abort();\n this.chatAbort = new AbortController();\n const signal = this.chatAbort.signal;\n\n this.onEvent?.({ event: 'status', data: { status: 'started', runId } });\n\n // Run the stream in background so the TUI event loop stays responsive.\n void (async () => {\n try {\n // Prepend envelope timestamp so the model knows the current date/time,\n // matching the behavior of channel pipelines (Telegram, Weixin, etc.).\n // Skip for slash commands — parseSlashCommand requires lines starting with '/'.\n const messageForAgent = opts.message.trimStart().startsWith('/')\n ? opts.message\n : prependEnvelopeTimestamp(opts.message);\n\n const stream = this.agent!.turnDispatcher.processDirectStreaming(\n messageForAgent,\n opts.sessionKey,\n undefined,\n opts.thinking,\n { signal },\n );\n\n for await (const event of stream) {\n if (signal.aborted) break;\n this.onEvent?.({ event: event.type, data: event });\n }\n\n if (!signal.aborted) {\n this.onEvent?.({\n event: 'result',\n data: { ok: true },\n });\n }\n } catch (error) {\n if (signal.aborted) return;\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.onEvent?.({ event: 'error', data: { content: errorMessage } });\n }\n })();\n\n return { runId };\n }\n\n async abortChat(_opts: { sessionKey: string; runId: string }): Promise<{ ok: boolean }> {\n if (this.chatAbort) {\n this.chatAbort.abort();\n this.chatAbort = null;\n return { ok: true };\n }\n return { ok: false };\n }\n\n async steerChat(opts: { sessionKey: string; message: string }): Promise<{ ok: boolean }> {\n if (!this.agent) return { ok: false };\n const ok = await this.agent.turnDispatcher.steerWebchatSession(opts.sessionKey, opts.message);\n return { ok };\n }\n\n async loadHistory(opts: {\n sessionKey: string;\n limit?: number;\n }): Promise<{ messages: HistoryMessage[] }> {\n if (!this.agent) {\n return { messages: [] };\n }\n try {\n const detail = await this.agent.sessionStore.get(opts.sessionKey);\n if (!detail) {\n return { messages: [] };\n }\n return {\n messages: messagesToClientHistory(detail.messages, { limit: opts.limit }),\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, errorMessage }, `Embedded loadHistory failed: ${errorMessage}`);\n return { messages: [] };\n }\n }\n\n async listSessions(): Promise<TuiSessionItem[]> {\n if (!this.agent) return [];\n try {\n const result = await this.agent.sessionStore.list({\n limit: 200,\n sortBy: 'updatedAt',\n sortOrder: 'desc',\n });\n return result.items.map(sessionMetadataToTuiItem);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, errorMessage }, `Embedded listSessions failed: ${errorMessage}`);\n return [];\n }\n }\n\n async renameSession(sessionKey: string, name: string): Promise<{ ok: boolean }> {\n if (!this.agent) return { ok: false };\n try {\n await this.agent.sessionStore.updateMetadata(sessionKey, { name: name.trim() });\n return { ok: true };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, sessionKey, errorMessage }, `Embedded renameSession failed: ${errorMessage}`);\n return { ok: false };\n }\n }\n\n async deleteSession(sessionKey: string): Promise<{ ok: boolean }> {\n if (!this.agent) return { ok: false };\n try {\n const ok = await this.agent.sessionStore.deleteSession(sessionKey);\n return { ok };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, sessionKey, errorMessage }, `Embedded deleteSession failed: ${errorMessage}`);\n return { ok: false };\n }\n }\n\n async getSessionInfo(sessionKey: string): Promise<SessionInfo> {\n if (!this.agent) {\n const config = loadConfig();\n const modelConfig = config.agents?.defaults?.model;\n const model = typeof modelConfig === 'string' ? modelConfig : modelConfig?.primary;\n return { model: model ?? undefined };\n }\n try {\n const cfg = await this.agent.sessionInspector.agentConfig(sessionKey);\n const parsed = parseModelRef(cfg.model);\n const usage = await this.agent.sessionInspector.contextUsage(sessionKey);\n return {\n model: parsed?.model ?? cfg.model,\n modelProvider: parsed?.provider,\n thinkingLevel: cfg.thinkingLevel,\n totalTokens: usage.estimatedTokens,\n contextWindow: usage.contextWindow,\n contextUsagePercent: usage.usagePercent,\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n log.warn({ err, sessionKey, errorMessage }, `getSessionInfo failed: ${errorMessage}`);\n const config = loadConfig();\n const modelConfig = config.agents?.defaults?.model;\n const model = typeof modelConfig === 'string' ? modelConfig : modelConfig?.primary;\n return { model: model ?? undefined };\n }\n }\n\n async listModels(): Promise<TuiModelChoice[]> {\n const choices: TuiModelChoice[] = [];\n for (const provider of getAllProviders()) {\n for (const model of getModelsByProvider(provider)) {\n choices.push({\n id: model.id,\n name: model.name ?? model.id,\n provider,\n });\n }\n }\n return choices;\n }\n\n async resetSession(sessionKey: string): Promise<void> {\n if (!this.agent) return;\n await this.agent.clearSessionMessages(sessionKey);\n }\n\n async patchSession(\n _sessionKey: string,\n _patch: Record<string, unknown>,\n ): Promise<void> {\n // Not supported in embedded mode\n }\n\n async compactSession(\n sessionKey: string,\n options?: { force?: boolean },\n ): Promise<{ compacted: boolean; summary?: string }> {\n if (!this.agent) return { compacted: false, summary: 'Agent not started' };\n try {\n const result = await this.agent.sessionInspector.compact(sessionKey, { force: options?.force ?? true });\n const summary = result.compacted\n ? `Compacted (${result.tokensBefore ?? '?'} → ${result.tokensAfter ?? '?'} tokens)`\n : 'Nothing to compact';\n return { compacted: result.compacted, summary };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n return { compacted: false, summary: errorMessage };\n }\n }\n\n private processOutbound(): void {\n void (async () => {\n while (this.running) {\n try {\n const msg = await this.bus.consumeOutbound();\n log.debug({ channel: msg.channel, chatId: msg.chat_id }, 'Outbound message');\n } catch (error) {\n if (error instanceof MessageBusShutdownError) break;\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ err: error, errorMessage }, `Outbound processor failed: ${errorMessage}`);\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n }\n })();\n }\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { readFileSync, unlinkSync, writeFileSync } from "node:fs";
1
3
  import { join } from "node:path";
2
4
  import { tmpdir } from "node:os";
3
- import { readFileSync, unlinkSync, writeFileSync } from "node:fs";
4
- import { randomUUID } from "node:crypto";
5
5
  import { spawnSync } from "node:child_process";
6
6
  //#region src/tui/clipboard-image.ts
7
7
  const SUPPORTED_IMAGE_MIME_TYPES = [
@@ -1,8 +1,8 @@
1
- import { getWorkspacePath } from "../../config/schema.js";
2
1
  import { createLogger } from "../../utils/logger/index.js";
3
2
  import { init_logger } from "../../utils/logger.js";
4
3
  import { init_paths, resolveExtensionsDir } from "../../config/paths.js";
5
4
  import { loadConfig } from "../../config/loader.js";
5
+ import { getWorkspacePath } from "../../config/workspace-path-helpers.js";
6
6
  import { ExtensionLoader } from "../../extensions/loader.js";
7
7
  import "../../config/index.js";
8
8
  //#region src/tui/extension-host/load-extensions.ts
@@ -1,5 +1,5 @@
1
- import { getTuiKeybindingsPath } from "./tui-keybindings-file.js";
2
1
  import { XOPC_TUI_HOTKEY_ORDER } from "./xopc-tui-keybindings.js";
2
+ import { getTuiKeybindingsPath } from "./tui-keybindings-file.js";
3
3
  //#region src/tui/format-tui-hotkeys.ts
4
4
  function formatKeyIds(manager, id) {
5
5
  const keys = manager.getKeys(id);
@@ -2,8 +2,8 @@ import { resolveStateDir } from "../config/paths-state.js";
2
2
  import { init_paths } from "../config/paths.js";
3
3
  import { palette } from "./theme/dark.js";
4
4
  import { palette as palette$1 } from "./theme/light.js";
5
- import { join } from "node:path";
6
5
  import { existsSync, readFileSync, readdirSync } from "node:fs";
6
+ import { join } from "node:path";
7
7
  import chalk from "chalk";
8
8
  //#region src/tui/theme-manager.ts
9
9
  init_paths();