@xopcai/xopc 0.0.99 → 0.0.101

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 (362) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/src/account-manager.d.ts +3 -3
  3. package/dist/extensions/telegram/src/account-manager.js +8 -8
  4. package/dist/extensions/telegram/src/account-manager.js.map +1 -1
  5. package/dist/extensions/telegram/src/actions/message-actions.d.ts +4 -0
  6. package/dist/extensions/telegram/src/actions/message-actions.js +71 -0
  7. package/dist/extensions/telegram/src/actions/message-actions.js.map +1 -0
  8. package/dist/extensions/telegram/src/adapters/config-adapter.js +9 -1
  9. package/dist/extensions/telegram/src/adapters/config-adapter.js.map +1 -1
  10. package/dist/extensions/telegram/src/adapters/config-surface.js +1 -1
  11. package/dist/extensions/telegram/src/adapters/config-surface.js.map +1 -1
  12. package/dist/extensions/telegram/src/adapters/outbound-adapter.d.ts +2 -1
  13. package/dist/extensions/telegram/src/adapters/outbound-adapter.js +18 -4
  14. package/dist/extensions/telegram/src/adapters/outbound-adapter.js.map +1 -1
  15. package/dist/extensions/telegram/src/adapters/security-adapter.js +2 -1
  16. package/dist/extensions/telegram/src/adapters/security-adapter.js.map +1 -1
  17. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +90 -6
  18. package/dist/extensions/telegram/src/adapters/streaming-adapter.js.map +1 -1
  19. package/dist/extensions/telegram/src/adapters/types.d.ts +9 -1
  20. package/dist/extensions/telegram/src/api-root.d.ts +4 -0
  21. package/dist/extensions/telegram/src/api-root.js +42 -0
  22. package/dist/extensions/telegram/src/api-root.js.map +1 -0
  23. package/dist/extensions/telegram/src/approval-delivery.d.ts +9 -0
  24. package/dist/extensions/telegram/src/approval-delivery.js +36 -0
  25. package/dist/extensions/telegram/src/approval-delivery.js.map +1 -0
  26. package/dist/extensions/telegram/src/approval-store.d.ts +25 -0
  27. package/dist/extensions/telegram/src/approval-store.js +61 -0
  28. package/dist/extensions/telegram/src/approval-store.js.map +1 -0
  29. package/dist/extensions/telegram/src/config-schema.d.ts +185 -35
  30. package/dist/extensions/telegram/src/config-schema.js +67 -45
  31. package/dist/extensions/telegram/src/config-schema.js.map +1 -1
  32. package/dist/extensions/telegram/src/conversation-id.d.ts +6 -0
  33. package/dist/extensions/telegram/src/conversation-id.js +18 -0
  34. package/dist/extensions/telegram/src/conversation-id.js.map +1 -0
  35. package/dist/extensions/telegram/src/doctor.d.ts +5 -0
  36. package/dist/extensions/telegram/src/doctor.js +80 -0
  37. package/dist/extensions/telegram/src/doctor.js.map +1 -0
  38. package/dist/extensions/telegram/src/exec-approval-handler.d.ts +7 -0
  39. package/dist/extensions/telegram/src/exec-approval-handler.js +36 -0
  40. package/dist/extensions/telegram/src/exec-approval-handler.js.map +1 -0
  41. package/dist/extensions/telegram/src/exec-approvals.d.ts +8 -0
  42. package/dist/extensions/telegram/src/exec-approvals.js +20 -0
  43. package/dist/extensions/telegram/src/exec-approvals.js.map +1 -0
  44. package/dist/extensions/telegram/src/focus-handler.d.ts +12 -0
  45. package/dist/extensions/telegram/src/focus-handler.js +55 -0
  46. package/dist/extensions/telegram/src/focus-handler.js.map +1 -0
  47. package/dist/extensions/telegram/src/group-config-resolver.d.ts +12 -0
  48. package/dist/extensions/telegram/src/group-config-resolver.js +17 -0
  49. package/dist/extensions/telegram/src/group-config-resolver.js.map +1 -0
  50. package/dist/extensions/telegram/src/inbound-coalescer.d.ts +15 -0
  51. package/dist/extensions/telegram/src/inbound-coalescer.js +107 -0
  52. package/dist/extensions/telegram/src/inbound-coalescer.js.map +1 -0
  53. package/dist/extensions/telegram/src/inbound-processor.d.ts +1 -0
  54. package/dist/extensions/telegram/src/inbound-processor.js +41 -4
  55. package/dist/extensions/telegram/src/inbound-processor.js.map +1 -1
  56. package/dist/extensions/telegram/src/network-errors.d.ts +2 -0
  57. package/dist/extensions/telegram/src/network-errors.js +23 -0
  58. package/dist/extensions/telegram/src/network-errors.js.map +1 -0
  59. package/dist/extensions/telegram/src/plugin.d.ts +11 -0
  60. package/dist/extensions/telegram/src/plugin.js +191 -57
  61. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  62. package/dist/extensions/telegram/src/polling-session.d.ts +17 -0
  63. package/dist/extensions/telegram/src/polling-session.js +112 -0
  64. package/dist/extensions/telegram/src/polling-session.js.map +1 -0
  65. package/dist/extensions/telegram/src/proxy-fetch.d.ts +2 -0
  66. package/dist/extensions/telegram/src/proxy-fetch.js +14 -0
  67. package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -0
  68. package/dist/extensions/telegram/src/reactions.d.ts +14 -0
  69. package/dist/extensions/telegram/src/reactions.js +48 -0
  70. package/dist/extensions/telegram/src/reactions.js.map +1 -0
  71. package/dist/extensions/telegram/src/reply-params.d.ts +15 -0
  72. package/dist/extensions/telegram/src/reply-params.js +28 -0
  73. package/dist/extensions/telegram/src/reply-params.js.map +1 -0
  74. package/dist/extensions/telegram/src/startup-errors.d.ts +3 -0
  75. package/dist/extensions/telegram/src/startup-errors.js +27 -0
  76. package/dist/extensions/telegram/src/startup-errors.js.map +1 -0
  77. package/dist/extensions/telegram/src/telegram-actions.d.ts +25 -0
  78. package/dist/extensions/telegram/src/telegram-actions.js +65 -0
  79. package/dist/extensions/telegram/src/telegram-actions.js.map +1 -0
  80. package/dist/extensions/telegram/src/thread-bindings.d.ts +15 -0
  81. package/dist/extensions/telegram/src/thread-bindings.js +22 -0
  82. package/dist/extensions/telegram/src/thread-bindings.js.map +1 -0
  83. package/dist/extensions/telegram/src/token-resolver.d.ts +8 -0
  84. package/dist/extensions/telegram/src/token-resolver.js +34 -0
  85. package/dist/extensions/telegram/src/token-resolver.js.map +1 -0
  86. package/dist/extensions/telegram/src/update-offset-store.d.ts +9 -0
  87. package/dist/extensions/telegram/src/update-offset-store.js +66 -0
  88. package/dist/extensions/telegram/src/update-offset-store.js.map +1 -0
  89. package/dist/extensions/telegram/xopc.extension.json +1 -1
  90. package/dist/extensions/weixin/src/api/api.js +5 -3
  91. package/dist/extensions/weixin/src/api/api.js.map +1 -1
  92. package/dist/gateway/static/root/assets/{agents-4KTK-Ku7.js → agents-u8cmUfGQ.js} +2 -2
  93. package/dist/gateway/static/root/assets/{apps-page-DkgInY2w.js → apps-page-DF8m9cUE.js} +1 -1
  94. package/dist/gateway/static/root/assets/{attachment-preview-renderer-DBAxQXb-.js → attachment-preview-renderer-CybMSIoS.js} +2 -2
  95. package/dist/gateway/static/root/assets/{attachment-process-heavy-Csq3TrrP.js → attachment-process-heavy-RnGYy9bC.js} +2 -2
  96. package/dist/gateway/static/root/assets/channels-settings-BM3doRvi.js +1 -0
  97. package/dist/gateway/static/root/assets/channels-status-swr-ah4zWEIP.js +8 -0
  98. package/dist/gateway/static/root/assets/{cron-api-BRDli2Mm.js → cron-api-DgMuL_2b.js} +1 -1
  99. package/dist/gateway/static/root/assets/{cron-page-BzEr5Za8.js → cron-page-COfUPKfq.js} +1 -1
  100. package/dist/gateway/static/root/assets/{dist-BsHh1vX0.js → dist-Dzy3Q0ZH.js} +1 -1
  101. package/dist/gateway/static/root/assets/{docx-preview-Dxj1EkCO.js → docx-preview-CajIk2FR.js} +1 -1
  102. package/dist/gateway/static/root/assets/{extension-debug-page-TWt5q_ef.js → extension-debug-page-kyxxefKh.js} +1 -1
  103. package/dist/gateway/static/root/assets/{extension-page-C3kV8ZvZ.js → extension-page-BVbCBHoI.js} +1 -1
  104. package/dist/gateway/static/root/assets/{extension-settings-page-Csy9LNC6.js → extension-settings-page-t1lb2A7v.js} +1 -1
  105. package/dist/gateway/static/root/assets/{fetch-BLLOP2CM.js → fetch-drJUxxKP.js} +1 -1
  106. package/dist/gateway/static/root/assets/{field-primitives-MXbM8HvY.js → field-primitives-6Vo1Yga4.js} +1 -1
  107. package/dist/gateway/static/root/assets/{heartbeat-config-api-CkoyqfRx.js → heartbeat-config-api-BF3psu4O.js} +1 -1
  108. package/dist/gateway/static/root/assets/index-DjNDHzwG.css +1 -0
  109. package/dist/gateway/static/root/assets/index-WAyKAilR.js +4840 -0
  110. package/dist/gateway/static/root/assets/{logs-page-B2vY41ph.js → logs-page-BTVPXcHV.js} +1 -1
  111. package/dist/gateway/static/root/assets/{note-detail-page-B7qE5pkO.js → note-detail-page-DqSAg_5Z.js} +1 -1
  112. package/dist/gateway/static/root/assets/{note-time-NBBReVR4.js → note-time-FSOjchic.js} +1 -1
  113. package/dist/gateway/static/root/assets/{notes-page-CsWYaqYM.js → notes-page-DkRX7BE2.js} +1 -1
  114. package/dist/gateway/static/root/assets/{sessions-page-BPGY3SCT.js → sessions-page-Khdw35Zk.js} +1 -1
  115. package/dist/gateway/static/root/assets/{settings-advanced-gate-DtA451RM.js → settings-advanced-gate-DspC8oEm.js} +2 -2
  116. package/dist/gateway/static/root/assets/{settings-form-section-DYR_SPlX.js → settings-form-section-DuxvUuur.js} +1 -1
  117. package/dist/gateway/static/root/assets/{settings-page-BJUgZQzN.js → settings-page-DN8JBZ8F.js} +2 -2
  118. package/dist/gateway/static/root/assets/{share-preview-page-3u8VFmdo.js → share-preview-page-UNAcbiMb.js} +2 -2
  119. package/dist/gateway/static/root/assets/{skills-page-DuyhcH4U.js → skills-page-ByYT0fXZ.js} +1 -1
  120. package/dist/gateway/static/root/assets/{theme-store-e2q2yjs4.js → theme-store-B6KXPHgK.js} +1 -1
  121. package/dist/gateway/static/root/assets/url-q28QhI7l.js +3 -0
  122. package/dist/gateway/static/root/assets/{utils-B4Vw3fnc.js → utils-DK_1H47k.js} +1 -1
  123. package/dist/gateway/static/root/assets/{voice-api-key-field-BFY67Hhp.js → voice-api-key-field-BYN2EIMs.js} +1 -1
  124. package/dist/gateway/static/root/assets/{workflow-page.utils-yUJ5jexd.js → workflow-page.utils-Bi19YNTr.js} +1 -1
  125. package/dist/gateway/static/root/assets/{workflows-page-DIMHCpNt.js → workflows-page-DP57FEKW.js} +1 -1
  126. package/dist/gateway/static/root/index.html +5 -5
  127. package/dist/package.js +1 -1
  128. package/dist/src/agent/agent-manager.d.ts +4 -0
  129. package/dist/src/agent/agent-manager.js +84 -4
  130. package/dist/src/agent/agent-manager.js.map +1 -1
  131. package/dist/src/agent/child-agent-factory.d.ts +1 -0
  132. package/dist/src/agent/child-agent-factory.js +13 -10
  133. package/dist/src/agent/child-agent-factory.js.map +1 -1
  134. package/dist/src/agent/embedded/run-for-session.d.ts +1 -0
  135. package/dist/src/agent/embedded/run-for-session.js +2 -0
  136. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  137. package/dist/src/agent/embedded/run-turn.js +1 -17
  138. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  139. package/dist/src/agent/embedded/session-runner.js +3 -1
  140. package/dist/src/agent/embedded/session-runner.js.map +1 -1
  141. package/dist/src/agent/embedded/session-tool-result-guard.d.ts +1 -0
  142. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -0
  143. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  144. package/dist/src/agent/inbound/attachment-pipeline.d.ts +37 -0
  145. package/dist/src/agent/inbound/attachment-pipeline.js +169 -0
  146. package/dist/src/agent/inbound/attachment-pipeline.js.map +1 -0
  147. package/dist/src/agent/inbound/turn-dispatcher.d.ts +3 -5
  148. package/dist/src/agent/inbound/turn-dispatcher.js +1 -2
  149. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  150. package/dist/src/agent/memory/index.d.ts +2 -0
  151. package/dist/src/agent/memory/index.js +2 -1
  152. package/dist/src/agent/memory/memory-flush.d.ts +27 -0
  153. package/dist/src/agent/memory/memory-flush.js +124 -0
  154. package/dist/src/agent/memory/memory-flush.js.map +1 -0
  155. package/dist/src/agent/messaging/outbound-coordinator.js +2 -1
  156. package/dist/src/agent/messaging/outbound-coordinator.js.map +1 -1
  157. package/dist/src/agent/messaging/stream-manager.d.ts +2 -0
  158. package/dist/src/agent/messaging/stream-manager.js +3 -0
  159. package/dist/src/agent/messaging/stream-manager.js.map +1 -1
  160. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +0 -4
  161. package/dist/src/agent/orchestration/agent-orchestrator.js +40 -107
  162. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  163. package/dist/src/agent/prompt/contribution.d.ts +9 -0
  164. package/dist/src/agent/prompt/contribution.js +1 -0
  165. package/dist/src/agent/prompt/safety.js +0 -10
  166. package/dist/src/agent/prompt/safety.js.map +1 -1
  167. package/dist/src/agent/prompt/sanitize-for-prompt.d.ts +6 -0
  168. package/dist/src/agent/prompt/sanitize-for-prompt.js +13 -0
  169. package/dist/src/agent/prompt/sanitize-for-prompt.js.map +1 -0
  170. package/dist/src/agent/prompt/sections/behavior.d.ts +5 -0
  171. package/dist/src/agent/prompt/sections/behavior.js +50 -0
  172. package/dist/src/agent/prompt/sections/behavior.js.map +1 -0
  173. package/dist/src/agent/prompt/sections/memory-skills.d.ts +9 -0
  174. package/dist/src/agent/prompt/sections/memory-skills.js +59 -0
  175. package/dist/src/agent/prompt/sections/memory-skills.js.map +1 -0
  176. package/dist/src/agent/prompt/sections/messaging-runtime.d.ts +16 -0
  177. package/dist/src/agent/prompt/sections/messaging-runtime.js +69 -0
  178. package/dist/src/agent/prompt/sections/messaging-runtime.js.map +1 -0
  179. package/dist/src/agent/prompt/sections/project-context.d.ts +16 -0
  180. package/dist/src/agent/prompt/sections/project-context.js +58 -0
  181. package/dist/src/agent/prompt/sections/project-context.js.map +1 -0
  182. package/dist/src/agent/prompt/sections/tooling.d.ts +5 -0
  183. package/dist/src/agent/prompt/sections/tooling.js +119 -0
  184. package/dist/src/agent/prompt/sections/tooling.js.map +1 -0
  185. package/dist/src/agent/prompt/sections/workspace-runtime.d.ts +11 -0
  186. package/dist/src/agent/prompt/sections/workspace-runtime.js +32 -0
  187. package/dist/src/agent/prompt/sections/workspace-runtime.js.map +1 -0
  188. package/dist/src/agent/prompt/service-prompt-builder.d.ts +13 -0
  189. package/dist/src/agent/prompt/service-prompt-builder.js +54 -13
  190. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  191. package/dist/src/agent/prompt/subagent-context.d.ts +15 -0
  192. package/dist/src/agent/prompt/subagent-context.js +68 -0
  193. package/dist/src/agent/prompt/subagent-context.js.map +1 -0
  194. package/dist/src/agent/prompt/system-prompt-params.d.ts +53 -0
  195. package/dist/src/agent/prompt/system-prompt-params.js +74 -0
  196. package/dist/src/agent/prompt/system-prompt-params.js.map +1 -0
  197. package/dist/src/agent/prompt/system-prompt.d.ts +22 -11
  198. package/dist/src/agent/prompt/system-prompt.js +79 -193
  199. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  200. package/dist/src/agent/prompt/types.d.ts +3 -0
  201. package/dist/src/agent/service/build-direct-message-content.d.ts +5 -21
  202. package/dist/src/agent/service/build-direct-message-content.js +11 -64
  203. package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
  204. package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -1
  205. package/dist/src/agent/service/direct-turn-helpers.js +7 -0
  206. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  207. package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -3
  208. package/dist/src/agent/service/process-direct-one-shot.js +22 -17
  209. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  210. package/dist/src/agent/service/process-direct-streaming.d.ts +6 -20
  211. package/dist/src/agent/service/process-direct-streaming.js +39 -40
  212. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  213. package/dist/src/agent/service/webchat-tts.d.ts +4 -9
  214. package/dist/src/agent/service/webchat-tts.js +9 -20
  215. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  216. package/dist/src/agent/service.d.ts +8 -19
  217. package/dist/src/agent/service.js +53 -11
  218. package/dist/src/agent/service.js.map +1 -1
  219. package/dist/src/agent/tools/factory.js +2 -0
  220. package/dist/src/agent/tools/factory.js.map +1 -1
  221. package/dist/src/agent/tools/index.d.ts +1 -0
  222. package/dist/src/agent/tools/index.js +2 -1
  223. package/dist/src/agent/tools/media-read-tool.d.ts +2 -0
  224. package/dist/src/agent/tools/media-read-tool.js +89 -0
  225. package/dist/src/agent/tools/media-read-tool.js.map +1 -0
  226. package/dist/src/auth/credentials.js +0 -1
  227. package/dist/src/auth/credentials.js.map +1 -1
  228. package/dist/src/channels/attachments/attachment-classifiers.d.ts +8 -0
  229. package/dist/src/channels/attachments/attachment-classifiers.js +11 -0
  230. package/dist/src/channels/attachments/attachment-classifiers.js.map +1 -0
  231. package/dist/src/channels/attachments/inbound-persist.d.ts +13 -34
  232. package/dist/src/channels/attachments/inbound-persist.js +34 -102
  233. package/dist/src/channels/attachments/inbound-persist.js.map +1 -1
  234. package/dist/src/channels/attachments/inbound-types.d.ts +13 -0
  235. package/dist/src/channels/attachments/inbound-types.js +30 -0
  236. package/dist/src/channels/attachments/inbound-types.js.map +1 -0
  237. package/dist/src/channels/attachments/outbound-tts-persist.d.ts +3 -12
  238. package/dist/src/channels/attachments/outbound-tts-persist.js +28 -48
  239. package/dist/src/channels/attachments/outbound-tts-persist.js.map +1 -1
  240. package/dist/src/channels/attachments/voice-stt-webchat.d.ts +3 -3
  241. package/dist/src/channels/attachments/voice-stt-webchat.js +8 -14
  242. package/dist/src/channels/attachments/voice-stt-webchat.js.map +1 -1
  243. package/dist/src/channels/channel-domain.d.ts +30 -2
  244. package/dist/src/channels/exec-approval-runtime.d.ts +29 -0
  245. package/dist/src/channels/exec-approval-runtime.js +30 -0
  246. package/dist/src/channels/exec-approval-runtime.js.map +1 -0
  247. package/dist/src/channels/index.js +1 -1
  248. package/dist/src/channels/plugin-types.d.ts +1 -0
  249. package/dist/src/channels/transport-types.d.ts +2 -2
  250. package/dist/src/cli/bin.d.ts +1 -0
  251. package/dist/src/cli/bin.js +1 -0
  252. package/dist/src/cli/bin.js.map +1 -1
  253. package/dist/src/cli/commands/channels.js +1 -1
  254. package/dist/src/cli/commands/doctor/checks/database-schema.d.ts +2 -0
  255. package/dist/src/cli/commands/doctor/checks/database-schema.js +62 -0
  256. package/dist/src/cli/commands/doctor/checks/database-schema.js.map +1 -0
  257. package/dist/src/cli/commands/doctor/flow.js +2 -0
  258. package/dist/src/cli/commands/doctor/flow.js.map +1 -1
  259. package/dist/src/cli/commands/init.js +2 -57
  260. package/dist/src/cli/commands/init.js.map +1 -1
  261. package/dist/src/cli/commands/onboard/channels/registry.js +1 -1
  262. package/dist/src/cli/commands/setup.js +6 -5
  263. package/dist/src/cli/commands/setup.js.map +1 -1
  264. package/dist/src/cli/utils/init-workspace-core.js +1 -2
  265. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  266. package/dist/src/config/index.js +2 -2
  267. package/dist/src/config/paths.d.ts +0 -13
  268. package/dist/src/config/paths.js +1 -20
  269. package/dist/src/config/paths.js.map +1 -1
  270. package/dist/src/config/rules.js +1 -1
  271. package/dist/src/config/schema.d.ts +24 -0
  272. package/dist/src/config/schema.js +33 -2
  273. package/dist/src/config/schema.js.map +1 -1
  274. package/dist/src/cron/executor.js +2 -2
  275. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  276. package/dist/src/gateway/hono/oauth-async.js +36 -3
  277. package/dist/src/gateway/hono/oauth-async.js.map +1 -1
  278. package/dist/src/gateway/hono/routes/config-patch/channels.js +3 -3
  279. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  280. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  281. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  282. package/dist/src/gateway/hono/routes/media.d.ts +3 -0
  283. package/dist/src/gateway/hono/routes/media.js +50 -0
  284. package/dist/src/gateway/hono/routes/media.js.map +1 -0
  285. package/dist/src/gateway/hono/routes/sessions.js +6 -0
  286. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  287. package/dist/src/gateway/hono/routes/workspace.js +1 -87
  288. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  289. package/dist/src/gateway/service/sessions-api.js +3 -0
  290. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  291. package/dist/src/infra/http-proxy-env.d.ts +4 -0
  292. package/dist/src/infra/http-proxy-env.js +23 -0
  293. package/dist/src/infra/http-proxy-env.js.map +1 -0
  294. package/dist/src/media/index.d.ts +5 -0
  295. package/dist/src/media/index.js +5 -0
  296. package/dist/src/media/media-reference.d.ts +23 -0
  297. package/dist/src/media/media-reference.js +34 -0
  298. package/dist/src/media/media-reference.js.map +1 -0
  299. package/dist/src/media/paths.d.ts +5 -0
  300. package/dist/src/media/paths.js +20 -0
  301. package/dist/src/media/paths.js.map +1 -0
  302. package/dist/src/media/session-references.d.ts +8 -0
  303. package/dist/src/media/session-references.js +45 -0
  304. package/dist/src/media/session-references.js.map +1 -0
  305. package/dist/src/media/store.d.ts +19 -0
  306. package/dist/src/media/store.js +131 -0
  307. package/dist/src/media/store.js.map +1 -0
  308. package/dist/src/media/types.d.ts +34 -0
  309. package/dist/src/media/types.js +1 -0
  310. package/dist/src/media/uri.d.ts +15 -0
  311. package/dist/src/media/uri.js +51 -0
  312. package/dist/src/media/uri.js.map +1 -0
  313. package/dist/src/session/session-title.js +6 -3
  314. package/dist/src/session/session-title.js.map +1 -1
  315. package/dist/src/session/store.js +1 -1
  316. package/dist/src/session/store.js.map +1 -1
  317. package/dist/src/session/types.d.ts +12 -7
  318. package/dist/src/session/types.js.map +1 -1
  319. package/dist/src/storage/sqlite/index.d.ts +4 -1
  320. package/dist/src/storage/sqlite/index.js +6 -2
  321. package/dist/src/storage/sqlite/migrations/002_add_flush_columns.sql +3 -0
  322. package/dist/src/storage/sqlite/migrations/discover.d.ts +4 -0
  323. package/dist/src/storage/sqlite/migrations/discover.js +38 -0
  324. package/dist/src/storage/sqlite/migrations/discover.js.map +1 -0
  325. package/dist/src/storage/sqlite/migrations/discover.ts +52 -0
  326. package/dist/src/storage/sqlite/migrations/errors.d.ts +11 -0
  327. package/dist/src/storage/sqlite/migrations/errors.js +27 -0
  328. package/dist/src/storage/sqlite/migrations/errors.js.map +1 -0
  329. package/dist/src/storage/sqlite/migrations/errors.ts +32 -0
  330. package/dist/src/storage/sqlite/migrations/runner.d.ts +22 -0
  331. package/dist/src/storage/sqlite/migrations/runner.js +97 -0
  332. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -0
  333. package/dist/src/storage/sqlite/migrations/runner.ts +153 -0
  334. package/dist/src/storage/sqlite/migrations/types.d.ts +12 -0
  335. package/dist/src/storage/sqlite/migrations/types.js +1 -0
  336. package/dist/src/storage/sqlite/migrations/types.ts +13 -0
  337. package/dist/src/storage/sqlite/row-mappers.d.ts +4 -0
  338. package/dist/src/storage/sqlite/row-mappers.js +4 -0
  339. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  340. package/dist/src/storage/sqlite/schema-version.d.ts +6 -0
  341. package/dist/src/storage/sqlite/schema-version.js +29 -0
  342. package/dist/src/storage/sqlite/schema-version.js.map +1 -0
  343. package/dist/src/storage/sqlite/schema.d.ts +5 -3
  344. package/dist/src/storage/sqlite/schema.js +24 -28
  345. package/dist/src/storage/sqlite/schema.js.map +1 -1
  346. package/dist/src/storage/sqlite/schema.sql +2 -0
  347. package/dist/src/storage/sqlite/session-metadata.js +1 -0
  348. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  349. package/dist/src/storage/sqlite/session-repository.js +7 -3
  350. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  351. package/package.json +3 -3
  352. package/dist/gateway/static/root/assets/channels-settings-BxW1Xio4.js +0 -1
  353. package/dist/gateway/static/root/assets/channels-status-swr-Cxm6AvQO.js +0 -8
  354. package/dist/gateway/static/root/assets/index-BJDmBCSl.css +0 -1
  355. package/dist/gateway/static/root/assets/index-Cbg5TS5m.js +0 -4707
  356. package/dist/gateway/static/root/assets/url-DpFBIyN9.js +0 -3
  357. package/dist/src/cli/commands/onboard/workspace.d.ts +0 -14
  358. package/dist/src/cli/commands/onboard/workspace.js +0 -33
  359. package/dist/src/cli/commands/onboard/workspace.js.map +0 -1
  360. package/dist/src/cli/utils/workspace.d.ts +0 -35
  361. package/dist/src/cli/utils/workspace.js +0 -72
  362. package/dist/src/cli/utils/workspace.js.map +0 -1
@@ -1,66 +1,46 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { join, resolve } from "path";
4
- import { mkdir, writeFile } from "fs/promises";
5
- import { randomBytes } from "crypto";
3
+ import { saveMediaBuffer } from "../../media/store.js";
6
4
  //#region src/channels/attachments/outbound-tts-persist.ts
7
- /**
8
- * Persist outbound TTS audio under `<agentHome>/tts/<session>/`.
9
- */
10
5
  init_logger();
11
6
  const log = createLogger("OutboundTtsPersist");
12
- const TTS_REL_ROOT = "tts";
13
- function sanitizeSessionSegment(sessionKey) {
14
- return sessionKey.replace(/[^a-zA-Z0-9_.-]+/g, "_").slice(0, 180) || "session";
15
- }
16
7
  function extForFormat(format) {
17
8
  const f = format.toLowerCase();
18
- if (f === "opus" || f === "ogg") return "ogg";
19
- if (f === "mp3" || f === "mpeg") return "mp3";
20
- if (f === "wav") return "wav";
21
- return "bin";
9
+ if (f === "opus" || f === "ogg") return ".ogg";
10
+ if (f === "mp3" || f === "mpeg") return ".mp3";
11
+ if (f === "wav") return ".wav";
12
+ return ".bin";
22
13
  }
23
- function resolveUnderRoot(root, rel, requiredPrefix) {
24
- const normalized = rel.replace(/\\/g, "/").replace(/^\/+/, "");
25
- if (normalized.includes("..") || !normalized.startsWith(requiredPrefix)) return null;
26
- const abs = resolve(root, ...normalized.split("/"));
27
- const rootResolved = resolve(root);
28
- if (!abs.startsWith(rootResolved)) return null;
29
- return abs;
14
+ function mimeForFormat(format) {
15
+ const f = format.toLowerCase();
16
+ if (f === "opus" || f === "ogg") return "audio/ogg";
17
+ if (f === "mp3" || f === "mpeg") return "audio/mpeg";
18
+ if (f === "wav") return "audio/wav";
19
+ return "application/octet-stream";
30
20
  }
31
- async function persistOutboundTtsAudio(agentHomeRoot, sessionKey, audioBuffer, format) {
32
- const sessionSeg = sanitizeSessionSegment(sessionKey);
33
- const dirAbs = resolve(agentHomeRoot, "tts", sessionSeg);
34
- await mkdir(dirAbs, { recursive: true });
21
+ async function persistOutboundTtsAudio(audioBuffer, format) {
35
22
  const ext = extForFormat(format);
36
- const fname = `assist_${Date.now()}_${randomBytes(4).toString("hex")}.${ext}`;
37
- await writeFile(join(dirAbs, fname), audioBuffer);
38
- const workspaceRelativePath = [
39
- "tts",
40
- sessionSeg,
41
- fname
42
- ].join("/");
23
+ const saved = await saveMediaBuffer(audioBuffer, {
24
+ contentType: mimeForFormat(format),
25
+ bucket: "tts",
26
+ originalFilename: `assist${ext}`
27
+ });
43
28
  log.debug({
44
- sessionKey,
45
- workspaceRelativePath,
46
- bytes: audioBuffer.length
29
+ uri: saved.uri,
30
+ bytes: saved.size
47
31
  }, "TTS audio persisted");
48
32
  return {
49
- workspaceRelativePath,
50
- name: fname,
51
- size: audioBuffer.length
33
+ id: saved.id,
34
+ bucket: "tts",
35
+ type: "voice",
36
+ mimeType: saved.contentType,
37
+ name: saved.id,
38
+ size: saved.size,
39
+ uri: saved.uri,
40
+ path: saved.path
52
41
  };
53
42
  }
54
- /**
55
- * Resolve a stored relative path under `tts/`.
56
- */
57
- function resolveSafeTtsFilePath(roots, relRaw) {
58
- const rel = relRaw.replace(/\\/g, "/").replace(/^\/+/, "");
59
- if (rel.includes("..")) return null;
60
- if (rel.startsWith(`tts/`)) return resolveUnderRoot(roots.agentHome, rel, `tts/`);
61
- return null;
62
- }
63
43
  //#endregion
64
- export { TTS_REL_ROOT, persistOutboundTtsAudio, resolveSafeTtsFilePath };
44
+ export { persistOutboundTtsAudio };
65
45
 
66
46
  //# sourceMappingURL=outbound-tts-persist.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"outbound-tts-persist.js","names":[],"sources":["../../../../src/channels/attachments/outbound-tts-persist.ts"],"sourcesContent":["/**\n * Persist outbound TTS audio under `<agentHome>/tts/<session>/`.\n */\n\nimport { mkdir, writeFile } from 'fs/promises';\nimport { join, resolve } from 'path';\nimport { randomBytes } from 'crypto';\nimport { createLogger } from '../../utils/logger.js';\nimport type { InternalAttachmentRoots } from './inbound-persist.js';\n\nconst log = createLogger('OutboundTtsPersist');\n\nexport const TTS_REL_ROOT = 'tts';\n\nfunction sanitizeSessionSegment(sessionKey: string): string {\n return sessionKey.replace(/[^a-zA-Z0-9_.-]+/g, '_').slice(0, 180) || 'session';\n}\n\nfunction extForFormat(format: string): string {\n const f = format.toLowerCase();\n if (f === 'opus' || f === 'ogg') return 'ogg';\n if (f === 'mp3' || f === 'mpeg') return 'mp3';\n if (f === 'wav') return 'wav';\n return 'bin';\n}\n\nfunction resolveUnderRoot(root: string, rel: string, requiredPrefix: string): string | null {\n const normalized = rel.replace(/\\\\/g, '/').replace(/^\\/+/, '');\n if (normalized.includes('..') || !normalized.startsWith(requiredPrefix)) {\n return null;\n }\n const abs = resolve(root, ...normalized.split('/'));\n const rootResolved = resolve(root);\n if (!abs.startsWith(rootResolved)) {\n return null;\n }\n return abs;\n}\n\nexport async function persistOutboundTtsAudio(\n agentHomeRoot: string,\n sessionKey: string,\n audioBuffer: Buffer,\n format: string,\n): Promise<{\n workspaceRelativePath: string;\n name: string;\n size: number;\n}> {\n const sessionSeg = sanitizeSessionSegment(sessionKey);\n const dirAbs = resolve(agentHomeRoot, TTS_REL_ROOT, sessionSeg);\n await mkdir(dirAbs, { recursive: true });\n const ext = extForFormat(format);\n const fname = `assist_${Date.now()}_${randomBytes(4).toString('hex')}.${ext}`;\n const absFile = join(dirAbs, fname);\n await writeFile(absFile, audioBuffer);\n const workspaceRelativePath = [TTS_REL_ROOT, sessionSeg, fname].join('/');\n log.debug({ sessionKey, workspaceRelativePath, bytes: audioBuffer.length }, 'TTS audio persisted');\n return {\n workspaceRelativePath,\n name: fname,\n size: audioBuffer.length,\n };\n}\n\n/**\n * Resolve a stored relative path under `tts/`.\n */\nexport function resolveSafeTtsFilePath(roots: InternalAttachmentRoots, relRaw: string): string | null {\n const rel = relRaw.replace(/\\\\/g, '/').replace(/^\\/+/, '');\n if (rel.includes('..')) {\n return null;\n }\n\n if (rel.startsWith(`${TTS_REL_ROOT}/`)) {\n return resolveUnderRoot(roots.agentHome, rel, `${TTS_REL_ROOT}/`);\n }\n\n return null;\n}\n"],"mappings":";;;;;;;;;aAOqD;AAGrD,MAAM,MAAM,aAAa,qBAAqB;AAE9C,MAAa,eAAe;AAE5B,SAAS,uBAAuB,YAA4B;AAC1D,QAAO,WAAW,QAAQ,qBAAqB,IAAI,CAAC,MAAM,GAAG,IAAI,IAAI;;AAGvE,SAAS,aAAa,QAAwB;CAC5C,MAAM,IAAI,OAAO,aAAa;AAC9B,KAAI,MAAM,UAAU,MAAM,MAAO,QAAO;AACxC,KAAI,MAAM,SAAS,MAAM,OAAQ,QAAO;AACxC,KAAI,MAAM,MAAO,QAAO;AACxB,QAAO;;AAGT,SAAS,iBAAiB,MAAc,KAAa,gBAAuC;CAC1F,MAAM,aAAa,IAAI,QAAQ,OAAO,IAAI,CAAC,QAAQ,QAAQ,GAAG;AAC9D,KAAI,WAAW,SAAS,KAAK,IAAI,CAAC,WAAW,WAAW,eAAe,CACrE,QAAO;CAET,MAAM,MAAM,QAAQ,MAAM,GAAG,WAAW,MAAM,IAAI,CAAC;CACnD,MAAM,eAAe,QAAQ,KAAK;AAClC,KAAI,CAAC,IAAI,WAAW,aAAa,CAC/B,QAAO;AAET,QAAO;;AAGT,eAAsB,wBACpB,eACA,YACA,aACA,QAKC;CACD,MAAM,aAAa,uBAAuB,WAAW;CACrD,MAAM,SAAS,QAAQ,eAAA,OAA6B,WAAW;AAC/D,OAAM,MAAM,QAAQ,EAAE,WAAW,MAAM,CAAC;CACxC,MAAM,MAAM,aAAa,OAAO;CAChC,MAAM,QAAQ,UAAU,KAAK,KAAK,CAAC,GAAG,YAAY,EAAE,CAAC,SAAS,MAAM,CAAC,GAAG;AAExE,OAAM,UADU,KAAK,QAAQ,MACN,EAAE,YAAY;CACrC,MAAM,wBAAwB;;EAAe;EAAY;EAAM,CAAC,KAAK,IAAI;AACzE,KAAI,MAAM;EAAE;EAAY;EAAuB,OAAO,YAAY;EAAQ,EAAE,sBAAsB;AAClG,QAAO;EACL;EACA,MAAM;EACN,MAAM,YAAY;EACnB;;;;;AAMH,SAAgB,uBAAuB,OAAgC,QAA+B;CACpG,MAAM,MAAM,OAAO,QAAQ,OAAO,IAAI,CAAC,QAAQ,QAAQ,GAAG;AAC1D,KAAI,IAAI,SAAS,KAAK,CACpB,QAAO;AAGT,KAAI,IAAI,WAAW,OAAmB,CACpC,QAAO,iBAAiB,MAAM,WAAW,KAAK,OAAmB;AAGnE,QAAO"}
1
+ {"version":3,"file":"outbound-tts-persist.js","names":[],"sources":["../../../../src/channels/attachments/outbound-tts-persist.ts"],"sourcesContent":["/**\n * Persist outbound TTS audio to `{stateDir}/media/tts/`.\n */\n\nimport { createLogger } from '../../utils/logger.js';\nimport { saveMediaBuffer } from '../../media/index.js';\nimport type { MediaRef } from '../../media/types.js';\n\nconst log = createLogger('OutboundTtsPersist');\n\nfunction extForFormat(format: string): string {\n const f = format.toLowerCase();\n if (f === 'opus' || f === 'ogg') return '.ogg';\n if (f === 'mp3' || f === 'mpeg') return '.mp3';\n if (f === 'wav') return '.wav';\n return '.bin';\n}\n\nfunction mimeForFormat(format: string): string {\n const f = format.toLowerCase();\n if (f === 'opus' || f === 'ogg') return 'audio/ogg';\n if (f === 'mp3' || f === 'mpeg') return 'audio/mpeg';\n if (f === 'wav') return 'audio/wav';\n return 'application/octet-stream';\n}\n\nexport async function persistOutboundTtsAudio(\n audioBuffer: Buffer,\n format: string,\n): Promise<MediaRef> {\n const ext = extForFormat(format);\n const saved = await saveMediaBuffer(audioBuffer, {\n contentType: mimeForFormat(format),\n bucket: 'tts',\n originalFilename: `assist${ext}`,\n });\n\n log.debug({ uri: saved.uri, bytes: saved.size }, 'TTS audio persisted');\n\n return {\n id: saved.id,\n bucket: 'tts',\n type: 'voice',\n mimeType: saved.contentType,\n name: saved.id,\n size: saved.size,\n uri: saved.uri,\n path: saved.path,\n };\n}\n"],"mappings":";;;;aAIqD;AAIrD,MAAM,MAAM,aAAa,qBAAqB;AAE9C,SAAS,aAAa,QAAwB;CAC5C,MAAM,IAAI,OAAO,aAAa;AAC9B,KAAI,MAAM,UAAU,MAAM,MAAO,QAAO;AACxC,KAAI,MAAM,SAAS,MAAM,OAAQ,QAAO;AACxC,KAAI,MAAM,MAAO,QAAO;AACxB,QAAO;;AAGT,SAAS,cAAc,QAAwB;CAC7C,MAAM,IAAI,OAAO,aAAa;AAC9B,KAAI,MAAM,UAAU,MAAM,MAAO,QAAO;AACxC,KAAI,MAAM,SAAS,MAAM,OAAQ,QAAO;AACxC,KAAI,MAAM,MAAO,QAAO;AACxB,QAAO;;AAGT,eAAsB,wBACpB,aACA,QACmB;CACnB,MAAM,MAAM,aAAa,OAAO;CAChC,MAAM,QAAQ,MAAM,gBAAgB,aAAa;EAC/C,aAAa,cAAc,OAAO;EAClC,QAAQ;EACR,kBAAkB,SAAS;EAC5B,CAAC;AAEF,KAAI,MAAM;EAAE,KAAK,MAAM;EAAK,OAAO,MAAM;EAAM,EAAE,sBAAsB;AAEvE,QAAO;EACL,IAAI,MAAM;EACV,QAAQ;EACR,MAAM;EACN,UAAU,MAAM;EAChB,MAAM,MAAM;EACZ,MAAM,MAAM;EACZ,KAAK,MAAM;EACX,MAAM,MAAM;EACb"}
@@ -2,12 +2,12 @@
2
2
  * STT for webchat voice attachments: merge transcripts into user text and track inbound voice for TTS trigger.
3
3
  */
4
4
  import type { STTConfig } from '../../voice/stt/types.js';
5
- import { type InboundAttachmentInput, type InternalAttachmentRoots } from './inbound-persist.js';
5
+ import { type InboundAttachmentInput, type MediaRef } from './inbound-persist.js';
6
6
  export declare function mergeSttConfigFromAppConfig(stt: Partial<STTConfig> | undefined, toolsMedia?: {
7
7
  models?: STTConfig['sharedModels'];
8
8
  }): STTConfig;
9
- export declare function isVoiceLikeAttachment(att: InboundAttachmentInput): boolean;
10
- export declare function mergeVoiceTranscriptsIntoUserText(attachmentRoots: InternalAttachmentRoots, prepared: InboundAttachmentInput[] | undefined, userText: string, sttConfig: STTConfig, opts?: {
9
+ export declare function isVoiceLikeAttachment(att: InboundAttachmentInput | MediaRef): boolean;
10
+ export declare function mergeVoiceTranscriptsIntoUserText(prepared: (InboundAttachmentInput | MediaRef)[] | undefined, userText: string, sttConfig: STTConfig, opts?: {
11
11
  skipVoiceTranscription?: boolean;
12
12
  }): Promise<{
13
13
  text: string;
@@ -1,13 +1,9 @@
1
- import { decodeInboundAttachmentBase64, resolveSafeInboundFilePath } from "./inbound-persist.js";
1
+ import { decodeInboundAttachmentBase64, readInboundAttachmentBuffer } from "./inbound-persist.js";
2
2
  import { DEFAULT_STT_CONFIG } from "../../voice/stt/types.js";
3
3
  import { transcribe } from "../../voice/stt/transcribe-core.js";
4
4
  import { isSTTAvailable } from "../../voice/stt/availability.js";
5
5
  import "../../voice/stt/index.js";
6
- import { readFile } from "fs/promises";
7
6
  //#region src/channels/attachments/voice-stt-webchat.ts
8
- /**
9
- * STT for webchat voice attachments: merge transcripts into user text and track inbound voice for TTS trigger.
10
- */
11
7
  const STT_MAX_BYTES = 25 * 1024 * 1024;
12
8
  function mergeSttProviders(base, patch) {
13
9
  if (!base && !patch) return void 0;
@@ -35,7 +31,7 @@ function isVoiceLikeAttachment(att) {
35
31
  if (att.type === "voice") return true;
36
32
  return (att.mimeType?.toLowerCase() ?? "").startsWith("audio/");
37
33
  }
38
- async function mergeVoiceTranscriptsIntoUserText(attachmentRoots, prepared, userText, sttConfig, opts) {
34
+ async function mergeVoiceTranscriptsIntoUserText(prepared, userText, sttConfig, opts) {
39
35
  if (!prepared?.length) return {
40
36
  text: userText,
41
37
  inboundVoice: false,
@@ -60,14 +56,12 @@ async function mergeVoiceTranscriptsIntoUserText(attachmentRoots, prepared, user
60
56
  for (const att of prepared) {
61
57
  if (!isVoiceLikeAttachment(att)) continue;
62
58
  let buf = null;
63
- if (att.workspaceRelativePath) {
64
- const abs = resolveSafeInboundFilePath(attachmentRoots, att.workspaceRelativePath);
65
- if (abs) try {
66
- buf = await readFile(abs);
67
- } catch {
68
- buf = null;
69
- }
70
- } else if (att.data) try {
59
+ if ("uri" in att && att.uri?.trim()) try {
60
+ buf = await readInboundAttachmentBuffer(att.uri.trim());
61
+ } catch {
62
+ buf = null;
63
+ }
64
+ else if ("data" in att && att.data) try {
71
65
  buf = decodeInboundAttachmentBase64(att.data);
72
66
  } catch {
73
67
  buf = null;
@@ -1 +1 @@
1
- {"version":3,"file":"voice-stt-webchat.js","names":[],"sources":["../../../../src/channels/attachments/voice-stt-webchat.ts"],"sourcesContent":["/**\n * STT for webchat voice attachments: merge transcripts into user text and track inbound voice for TTS trigger.\n */\n\nimport { readFile } from 'fs/promises';\n\nimport type { STTConfig } from '../../voice/stt/types.js';\nimport { DEFAULT_STT_CONFIG } from '../../voice/stt/types.js';\nimport { isSTTAvailable, transcribe } from '../../voice/stt/index.js';\nimport {\n resolveSafeInboundFilePath,\n type InboundAttachmentInput,\n type InternalAttachmentRoots,\n decodeInboundAttachmentBase64,\n} from './inbound-persist.js';\n\nconst STT_MAX_BYTES = 25 * 1024 * 1024;\n\nfunction mergeSttProviders(\n base: STTConfig['providers'],\n patch: STTConfig['providers'],\n): STTConfig['providers'] {\n if (!base && !patch) return undefined;\n const merged: Record<string, Record<string, unknown>> = { ...(base ?? {}) };\n for (const [id, slice] of Object.entries(patch ?? {})) {\n merged[id] = { ...(merged[id] ?? {}), ...slice };\n }\n return merged;\n}\n\nexport function mergeSttConfigFromAppConfig(\n stt: Partial<STTConfig> | undefined,\n toolsMedia?: { models?: STTConfig['sharedModels'] },\n): STTConfig {\n const p = stt ?? {};\n return {\n ...DEFAULT_STT_CONFIG,\n ...p,\n providers: mergeSttProviders(DEFAULT_STT_CONFIG.providers, p.providers),\n fallback: { ...DEFAULT_STT_CONFIG.fallback!, ...p.fallback },\n ...(toolsMedia?.models?.length ? { sharedModels: toolsMedia.models } : {}),\n };\n}\n\nexport function isVoiceLikeAttachment(att: InboundAttachmentInput): boolean {\n if (att.type === 'voice') return true;\n const m = att.mimeType?.toLowerCase() ?? '';\n return m.startsWith('audio/');\n}\n\nexport async function mergeVoiceTranscriptsIntoUserText(\n attachmentRoots: InternalAttachmentRoots,\n prepared: InboundAttachmentInput[] | undefined,\n userText: string,\n sttConfig: STTConfig,\n opts?: { skipVoiceTranscription?: boolean },\n): Promise<{ text: string; inboundVoice: boolean; voiceTranscripts: string[] }> {\n if (!prepared?.length) {\n return { text: userText, inboundVoice: false, voiceTranscripts: [] };\n }\n\n const hasVoice = prepared.some(isVoiceLikeAttachment);\n if (!hasVoice) {\n return { text: userText, inboundVoice: false, voiceTranscripts: [] };\n }\n\n if (opts?.skipVoiceTranscription === true) {\n return { text: userText, inboundVoice: true, voiceTranscripts: [] };\n }\n\n if (!isSTTAvailable(sttConfig)) {\n return { text: userText, inboundVoice: true, voiceTranscripts: [] };\n }\n\n const transcripts: string[] = [];\n\n for (const att of prepared) {\n if (!isVoiceLikeAttachment(att)) continue;\n\n let buf: Buffer | null = null;\n if (att.workspaceRelativePath) {\n const abs = resolveSafeInboundFilePath(attachmentRoots, att.workspaceRelativePath);\n if (abs) {\n try {\n buf = await readFile(abs);\n } catch {\n buf = null;\n }\n }\n } else if (att.data) {\n try {\n buf = decodeInboundAttachmentBase64(att.data);\n } catch {\n buf = null;\n }\n }\n\n if (!buf || buf.length === 0) {\n transcripts.push('[Voice: empty]');\n continue;\n }\n if (buf.length > STT_MAX_BYTES) {\n transcripts.push('[Voice: file too large]');\n continue;\n }\n\n try {\n const r = await transcribe(buf, sttConfig, {\n language: sttConfig.provider === 'alibaba' ? 'zh' : undefined,\n });\n transcripts.push(r.text.trim() || '[Voice: no speech detected]');\n } catch {\n transcripts.push('[STT failed]');\n }\n }\n\n const merged = [transcripts.filter(Boolean).join('\\n'), userText.trim()].filter(Boolean).join('\\n\\n');\n return { text: merged || userText, inboundVoice: true, voiceTranscripts: transcripts };\n}\n"],"mappings":";;;;;;;;;;AAgBA,MAAM,gBAAgB,KAAK,OAAO;AAElC,SAAS,kBACP,MACA,OACwB;AACxB,KAAI,CAAC,QAAQ,CAAC,MAAO,QAAO,KAAA;CAC5B,MAAM,SAAkD,EAAE,GAAI,QAAQ,EAAE,EAAG;AAC3E,MAAK,MAAM,CAAC,IAAI,UAAU,OAAO,QAAQ,SAAS,EAAE,CAAC,CACnD,QAAO,MAAM;EAAE,GAAI,OAAO,OAAO,EAAE;EAAG,GAAG;EAAO;AAElD,QAAO;;AAGT,SAAgB,4BACd,KACA,YACW;CACX,MAAM,IAAI,OAAO,EAAE;AACnB,QAAO;EACL,GAAG;EACH,GAAG;EACH,WAAW,kBAAkB,mBAAmB,WAAW,EAAE,UAAU;EACvE,UAAU;GAAE,GAAG,mBAAmB;GAAW,GAAG,EAAE;GAAU;EAC5D,GAAI,YAAY,QAAQ,SAAS,EAAE,cAAc,WAAW,QAAQ,GAAG,EAAE;EAC1E;;AAGH,SAAgB,sBAAsB,KAAsC;AAC1E,KAAI,IAAI,SAAS,QAAS,QAAO;AAEjC,SADU,IAAI,UAAU,aAAa,IAAI,IAChC,WAAW,SAAS;;AAG/B,eAAsB,kCACpB,iBACA,UACA,UACA,WACA,MAC8E;AAC9E,KAAI,CAAC,UAAU,OACb,QAAO;EAAE,MAAM;EAAU,cAAc;EAAO,kBAAkB,EAAE;EAAE;AAItE,KAAI,CADa,SAAS,KAAK,sBAClB,CACX,QAAO;EAAE,MAAM;EAAU,cAAc;EAAO,kBAAkB,EAAE;EAAE;AAGtE,KAAI,MAAM,2BAA2B,KACnC,QAAO;EAAE,MAAM;EAAU,cAAc;EAAM,kBAAkB,EAAE;EAAE;AAGrE,KAAI,CAAC,eAAe,UAAU,CAC5B,QAAO;EAAE,MAAM;EAAU,cAAc;EAAM,kBAAkB,EAAE;EAAE;CAGrE,MAAM,cAAwB,EAAE;AAEhC,MAAK,MAAM,OAAO,UAAU;AAC1B,MAAI,CAAC,sBAAsB,IAAI,CAAE;EAEjC,IAAI,MAAqB;AACzB,MAAI,IAAI,uBAAuB;GAC7B,MAAM,MAAM,2BAA2B,iBAAiB,IAAI,sBAAsB;AAClF,OAAI,IACF,KAAI;AACF,UAAM,MAAM,SAAS,IAAI;WACnB;AACN,UAAM;;aAGD,IAAI,KACb,KAAI;AACF,SAAM,8BAA8B,IAAI,KAAK;UACvC;AACN,SAAM;;AAIV,MAAI,CAAC,OAAO,IAAI,WAAW,GAAG;AAC5B,eAAY,KAAK,iBAAiB;AAClC;;AAEF,MAAI,IAAI,SAAS,eAAe;AAC9B,eAAY,KAAK,0BAA0B;AAC3C;;AAGF,MAAI;GACF,MAAM,IAAI,MAAM,WAAW,KAAK,WAAW,EACzC,UAAU,UAAU,aAAa,YAAY,OAAO,KAAA,GACrD,CAAC;AACF,eAAY,KAAK,EAAE,KAAK,MAAM,IAAI,8BAA8B;UAC1D;AACN,eAAY,KAAK,eAAe;;;AAKpC,QAAO;EAAE,MADM,CAAC,YAAY,OAAO,QAAQ,CAAC,KAAK,KAAK,EAAE,SAAS,MAAM,CAAC,CAAC,OAAO,QAAQ,CAAC,KAAK,OACzE,IAAI;EAAU,cAAc;EAAM,kBAAkB;EAAa"}
1
+ {"version":3,"file":"voice-stt-webchat.js","names":[],"sources":["../../../../src/channels/attachments/voice-stt-webchat.ts"],"sourcesContent":["/**\n * STT for webchat voice attachments: merge transcripts into user text and track inbound voice for TTS trigger.\n */\n\nimport type { STTConfig } from '../../voice/stt/types.js';\nimport { DEFAULT_STT_CONFIG } from '../../voice/stt/types.js';\nimport { isSTTAvailable, transcribe } from '../../voice/stt/index.js';\nimport {\n decodeInboundAttachmentBase64,\n readInboundAttachmentBuffer,\n type InboundAttachmentInput,\n type MediaRef,\n} from './inbound-persist.js';\n\nconst STT_MAX_BYTES = 25 * 1024 * 1024;\n\nfunction mergeSttProviders(\n base: STTConfig['providers'],\n patch: STTConfig['providers'],\n): STTConfig['providers'] {\n if (!base && !patch) return undefined;\n const merged: Record<string, Record<string, unknown>> = { ...(base ?? {}) };\n for (const [id, slice] of Object.entries(patch ?? {})) {\n merged[id] = { ...(merged[id] ?? {}), ...slice };\n }\n return merged;\n}\n\nexport function mergeSttConfigFromAppConfig(\n stt: Partial<STTConfig> | undefined,\n toolsMedia?: { models?: STTConfig['sharedModels'] },\n): STTConfig {\n const p = stt ?? {};\n return {\n ...DEFAULT_STT_CONFIG,\n ...p,\n providers: mergeSttProviders(DEFAULT_STT_CONFIG.providers, p.providers),\n fallback: { ...DEFAULT_STT_CONFIG.fallback!, ...p.fallback },\n ...(toolsMedia?.models?.length ? { sharedModels: toolsMedia.models } : {}),\n };\n}\n\nexport function isVoiceLikeAttachment(att: InboundAttachmentInput | MediaRef): boolean {\n if (att.type === 'voice') return true;\n const m = att.mimeType?.toLowerCase() ?? '';\n return m.startsWith('audio/');\n}\n\nexport async function mergeVoiceTranscriptsIntoUserText(\n prepared: (InboundAttachmentInput | MediaRef)[] | undefined,\n userText: string,\n sttConfig: STTConfig,\n opts?: { skipVoiceTranscription?: boolean },\n): Promise<{ text: string; inboundVoice: boolean; voiceTranscripts: string[] }> {\n if (!prepared?.length) {\n return { text: userText, inboundVoice: false, voiceTranscripts: [] };\n }\n\n const hasVoice = prepared.some(isVoiceLikeAttachment);\n if (!hasVoice) {\n return { text: userText, inboundVoice: false, voiceTranscripts: [] };\n }\n\n if (opts?.skipVoiceTranscription === true) {\n return { text: userText, inboundVoice: true, voiceTranscripts: [] };\n }\n\n if (!isSTTAvailable(sttConfig)) {\n return { text: userText, inboundVoice: true, voiceTranscripts: [] };\n }\n\n const transcripts: string[] = [];\n\n for (const att of prepared) {\n if (!isVoiceLikeAttachment(att)) continue;\n\n let buf: Buffer | null = null;\n if ('uri' in att && att.uri?.trim()) {\n try {\n buf = await readInboundAttachmentBuffer(att.uri.trim());\n } catch {\n buf = null;\n }\n } else if ('data' in att && att.data) {\n try {\n buf = decodeInboundAttachmentBase64(att.data);\n } catch {\n buf = null;\n }\n }\n\n if (!buf || buf.length === 0) {\n transcripts.push('[Voice: empty]');\n continue;\n }\n if (buf.length > STT_MAX_BYTES) {\n transcripts.push('[Voice: file too large]');\n continue;\n }\n\n try {\n const r = await transcribe(buf, sttConfig, {\n language: sttConfig.provider === 'alibaba' ? 'zh' : undefined,\n });\n transcripts.push(r.text.trim() || '[Voice: no speech detected]');\n } catch {\n transcripts.push('[STT failed]');\n }\n }\n\n const merged = [transcripts.filter(Boolean).join('\\n'), userText.trim()].filter(Boolean).join('\\n\\n');\n return { text: merged || userText, inboundVoice: true, voiceTranscripts: transcripts };\n}\n"],"mappings":";;;;;;AAcA,MAAM,gBAAgB,KAAK,OAAO;AAElC,SAAS,kBACP,MACA,OACwB;AACxB,KAAI,CAAC,QAAQ,CAAC,MAAO,QAAO,KAAA;CAC5B,MAAM,SAAkD,EAAE,GAAI,QAAQ,EAAE,EAAG;AAC3E,MAAK,MAAM,CAAC,IAAI,UAAU,OAAO,QAAQ,SAAS,EAAE,CAAC,CACnD,QAAO,MAAM;EAAE,GAAI,OAAO,OAAO,EAAE;EAAG,GAAG;EAAO;AAElD,QAAO;;AAGT,SAAgB,4BACd,KACA,YACW;CACX,MAAM,IAAI,OAAO,EAAE;AACnB,QAAO;EACL,GAAG;EACH,GAAG;EACH,WAAW,kBAAkB,mBAAmB,WAAW,EAAE,UAAU;EACvE,UAAU;GAAE,GAAG,mBAAmB;GAAW,GAAG,EAAE;GAAU;EAC5D,GAAI,YAAY,QAAQ,SAAS,EAAE,cAAc,WAAW,QAAQ,GAAG,EAAE;EAC1E;;AAGH,SAAgB,sBAAsB,KAAiD;AACrF,KAAI,IAAI,SAAS,QAAS,QAAO;AAEjC,SADU,IAAI,UAAU,aAAa,IAAI,IAChC,WAAW,SAAS;;AAG/B,eAAsB,kCACpB,UACA,UACA,WACA,MAC8E;AAC9E,KAAI,CAAC,UAAU,OACb,QAAO;EAAE,MAAM;EAAU,cAAc;EAAO,kBAAkB,EAAE;EAAE;AAItE,KAAI,CADa,SAAS,KAAK,sBAClB,CACX,QAAO;EAAE,MAAM;EAAU,cAAc;EAAO,kBAAkB,EAAE;EAAE;AAGtE,KAAI,MAAM,2BAA2B,KACnC,QAAO;EAAE,MAAM;EAAU,cAAc;EAAM,kBAAkB,EAAE;EAAE;AAGrE,KAAI,CAAC,eAAe,UAAU,CAC5B,QAAO;EAAE,MAAM;EAAU,cAAc;EAAM,kBAAkB,EAAE;EAAE;CAGrE,MAAM,cAAwB,EAAE;AAEhC,MAAK,MAAM,OAAO,UAAU;AAC1B,MAAI,CAAC,sBAAsB,IAAI,CAAE;EAEjC,IAAI,MAAqB;AACzB,MAAI,SAAS,OAAO,IAAI,KAAK,MAAM,CACjC,KAAI;AACF,SAAM,MAAM,4BAA4B,IAAI,IAAI,MAAM,CAAC;UACjD;AACN,SAAM;;WAEC,UAAU,OAAO,IAAI,KAC9B,KAAI;AACF,SAAM,8BAA8B,IAAI,KAAK;UACvC;AACN,SAAM;;AAIV,MAAI,CAAC,OAAO,IAAI,WAAW,GAAG;AAC5B,eAAY,KAAK,iBAAiB;AAClC;;AAEF,MAAI,IAAI,SAAS,eAAe;AAC9B,eAAY,KAAK,0BAA0B;AAC3C;;AAGF,MAAI;GACF,MAAM,IAAI,MAAM,WAAW,KAAK,WAAW,EACzC,UAAU,UAAU,aAAa,YAAY,OAAO,KAAA,GACrD,CAAC;AACF,eAAY,KAAK,EAAE,KAAK,MAAM,IAAI,8BAA8B;UAC1D;AACN,eAAY,KAAK,eAAe;;;AAKpC,QAAO;EAAE,MADM,CAAC,YAAY,OAAO,QAAQ,CAAC,KAAK,KAAK,EAAE,SAAS,MAAM,CAAC,CAAC,OAAO,QAAQ,CAAC,KAAK,OACzE,IAAI;EAAU,cAAc;EAAM,kBAAkB;EAAa"}
@@ -13,6 +13,7 @@ export interface TelegramTopicConfig {
13
13
  enabled?: boolean;
14
14
  allowFrom?: Array<string | number>;
15
15
  systemPrompt?: string;
16
+ agentId?: string;
16
17
  groupPolicy?: GroupPolicy;
17
18
  }
18
19
  export type DmPolicy = 'pairing' | 'allowlist' | 'open' | 'disabled';
@@ -25,6 +26,7 @@ export interface TelegramGroupConfig {
25
26
  enabled?: boolean;
26
27
  allowFrom?: Array<string | number>;
27
28
  systemPrompt?: string;
29
+ agentId?: string;
28
30
  topics?: Record<string, TelegramTopicConfig>;
29
31
  }
30
32
  export interface TelegramAccountConfig {
@@ -41,9 +43,24 @@ export interface TelegramAccountConfig {
41
43
  groups?: Record<string, TelegramGroupConfig>;
42
44
  historyLimit?: number;
43
45
  textChunkLimit?: number;
44
- streamMode?: 'off' | 'partial' | 'block';
46
+ streaming?: {
47
+ mode?: 'off' | 'partial' | 'block';
48
+ preview?: {
49
+ toolProgress?: boolean;
50
+ };
51
+ block?: {
52
+ coalesce?: {
53
+ minChars?: number;
54
+ idleMs?: number;
55
+ };
56
+ };
57
+ };
45
58
  proxy?: string;
46
59
  apiRoot?: string;
60
+ pollingStallThresholdMs?: number;
61
+ reactionLevel?: 'off' | 'ack' | 'minimal' | 'extensive';
62
+ reactionNotifications?: 'off' | 'own' | 'all';
63
+ ackReaction?: string;
47
64
  }
48
65
  export interface TelegramChannelConfig {
49
66
  enabled?: boolean;
@@ -54,7 +71,18 @@ export interface TelegramChannelConfig {
54
71
  dmPolicy?: DmPolicy;
55
72
  groupPolicy?: GroupPolicy;
56
73
  replyToMode?: ReplyToMode;
57
- streamMode?: 'off' | 'partial' | 'block';
74
+ streaming?: {
75
+ mode?: 'off' | 'partial' | 'block';
76
+ preview?: {
77
+ toolProgress?: boolean;
78
+ };
79
+ block?: {
80
+ coalesce?: {
81
+ minChars?: number;
82
+ idleMs?: number;
83
+ };
84
+ };
85
+ };
58
86
  historyLimit?: number;
59
87
  textChunkLimit?: number;
60
88
  proxy?: string;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Channel exec-approval gate — plugins register handlers; agent runtime invokes before risky tools.
3
+ */
4
+ import type { Config } from '../config/schema.js';
5
+ export interface ExecApprovalRequestPayload {
6
+ sessionKey: string;
7
+ channel: string;
8
+ chatId: string;
9
+ accountId?: string;
10
+ toolName: string;
11
+ summary: string;
12
+ details?: Record<string, unknown>;
13
+ }
14
+ export interface ExecApprovalHandler {
15
+ isEnabled(cfg: Config, params: {
16
+ channel: string;
17
+ accountId?: string;
18
+ }): boolean;
19
+ requestApproval(cfg: Config, payload: ExecApprovalRequestPayload): Promise<boolean>;
20
+ }
21
+ export declare function registerChannelExecApprovalHandler(channelId: string, handler: ExecApprovalHandler): () => void;
22
+ export declare function maybeRequestChannelExecApproval(params: {
23
+ cfg: Config;
24
+ payload: ExecApprovalRequestPayload;
25
+ }): Promise<{
26
+ required: boolean;
27
+ approved: boolean;
28
+ reason?: string;
29
+ }>;
@@ -0,0 +1,30 @@
1
+ //#region src/channels/exec-approval-runtime.ts
2
+ const handlers = /* @__PURE__ */ new Map();
3
+ function registerChannelExecApprovalHandler(channelId, handler) {
4
+ handlers.set(channelId, handler);
5
+ return () => handlers.delete(channelId);
6
+ }
7
+ async function maybeRequestChannelExecApproval(params) {
8
+ const handler = handlers.get(params.payload.channel);
9
+ if (!handler) return {
10
+ required: false,
11
+ approved: true
12
+ };
13
+ if (!handler.isEnabled(params.cfg, {
14
+ channel: params.payload.channel,
15
+ accountId: params.payload.accountId
16
+ })) return {
17
+ required: false,
18
+ approved: true
19
+ };
20
+ const approved = await handler.requestApproval(params.cfg, params.payload);
21
+ return {
22
+ required: true,
23
+ approved,
24
+ reason: approved ? void 0 : "Exec approval denied or timed out"
25
+ };
26
+ }
27
+ //#endregion
28
+ export { maybeRequestChannelExecApproval, registerChannelExecApprovalHandler };
29
+
30
+ //# sourceMappingURL=exec-approval-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec-approval-runtime.js","names":[],"sources":["../../../src/channels/exec-approval-runtime.ts"],"sourcesContent":["/**\n * Channel exec-approval gate — plugins register handlers; agent runtime invokes before risky tools.\n */\n\nimport type { Config } from '../config/schema.js';\n\nexport interface ExecApprovalRequestPayload {\n sessionKey: string;\n channel: string;\n chatId: string;\n accountId?: string;\n toolName: string;\n summary: string;\n details?: Record<string, unknown>;\n}\n\nexport interface ExecApprovalHandler {\n isEnabled(cfg: Config, params: { channel: string; accountId?: string }): boolean;\n requestApproval(cfg: Config, payload: ExecApprovalRequestPayload): Promise<boolean>;\n}\n\nconst handlers = new Map<string, ExecApprovalHandler>();\n\nexport function registerChannelExecApprovalHandler(channelId: string, handler: ExecApprovalHandler): () => void {\n handlers.set(channelId, handler);\n return () => handlers.delete(channelId);\n}\n\nexport async function maybeRequestChannelExecApproval(params: {\n cfg: Config;\n payload: ExecApprovalRequestPayload;\n}): Promise<{ required: boolean; approved: boolean; reason?: string }> {\n const handler = handlers.get(params.payload.channel);\n if (!handler) {\n return { required: false, approved: true };\n }\n if (!handler.isEnabled(params.cfg, { channel: params.payload.channel, accountId: params.payload.accountId })) {\n return { required: false, approved: true };\n }\n const approved = await handler.requestApproval(params.cfg, params.payload);\n return {\n required: true,\n approved,\n reason: approved ? undefined : 'Exec approval denied or timed out',\n };\n}\n"],"mappings":";AAqBA,MAAM,2BAAW,IAAI,KAAkC;AAEvD,SAAgB,mCAAmC,WAAmB,SAA0C;AAC9G,UAAS,IAAI,WAAW,QAAQ;AAChC,cAAa,SAAS,OAAO,UAAU;;AAGzC,eAAsB,gCAAgC,QAGiB;CACrE,MAAM,UAAU,SAAS,IAAI,OAAO,QAAQ,QAAQ;AACpD,KAAI,CAAC,QACH,QAAO;EAAE,UAAU;EAAO,UAAU;EAAM;AAE5C,KAAI,CAAC,QAAQ,UAAU,OAAO,KAAK;EAAE,SAAS,OAAO,QAAQ;EAAS,WAAW,OAAO,QAAQ;EAAW,CAAC,CAC1G,QAAO;EAAE,UAAU;EAAO,UAAU;EAAM;CAE5C,MAAM,WAAW,MAAM,QAAQ,gBAAgB,OAAO,KAAK,OAAO,QAAQ;AAC1E,QAAO;EACL,UAAU;EACV;EACA,QAAQ,WAAW,KAAA,IAAY;EAChC"}
@@ -1,4 +1,5 @@
1
1
  import { parseFrontmatterBlock } from "../markdown/frontmatter.js";
2
+ import { getChannelPlugin, getChannelRegistryVersion, listChannelPlugins, syncChannelPluginsFromManager } from "./plugins/registry.js";
2
3
  import { compileAllowlist, evaluateAccess, hasBotMention, removeBotMention, resolveAllowlistMatch, resolveAllowlistMatchSimple, resolveDmPolicy, resolveGroupPolicy } from "./security.js";
3
4
  import { CHAT_CHANNEL_ORDER, getChatChannelMeta, isChatChannelId, listChatChannelMeta } from "./registry.js";
4
5
  import { findFenceSpanAt, isSafeFenceBreak, parseFenceSpans } from "../markdown/fences.js";
@@ -12,7 +13,6 @@ import "./plugins/bundled.js";
12
13
  import { getChannelDock, getDockForBuiltinChannel } from "./dock.js";
13
14
  import "./format.js";
14
15
  import { MessagePipeline, createEnvelopeTimestampHandler, createFilterCommandsHandler, createFilterEmptyHandler, createFilterSelfHandler, createPipeline, standardPreflightHandlers, standardProcessHandlers } from "./pipeline.js";
15
- import { getChannelPlugin, getChannelRegistryVersion, listChannelPlugins, syncChannelPluginsFromManager } from "./plugins/registry.js";
16
16
  import { ChannelManager, createChannelManager } from "./manager.js";
17
17
  import { collectSetupWizardChannels } from "./setup-wizard-discovery.js";
18
18
  export { CHAT_CHANNEL_ORDER, ChannelManager, MessagePipeline, buildCodeSpanIndex, bundledChannelPlugins, chunkMarkdownIR, chunkText, collectSetupWizardChannels, compileAllowlist, convertMarkdownTables, createChannelManager, createEnvelopeTimestampHandler, createFilterCommandsHandler, createFilterEmptyHandler, createFilterSelfHandler, createInlineCodeState, createPipeline, evaluateAccess, findFenceSpanAt, getChannelDock, getChannelPlugin, getChannelRegistryVersion, getChatChannelMeta, getDockForBuiltinChannel, hasBotMention, isChatChannelId, isSafeFenceBreak, listChannelPlugins, listChatChannelMeta, markdownToIR, markdownToIRWithMeta, parseFenceSpans, parseFrontmatterBlock, removeBotMention, renderMarkdownWithMarkers, resolveAllowlistMatch, resolveAllowlistMatchSimple, resolveDmPolicy, resolveGroupPolicy, standardPreflightHandlers, standardProcessHandlers, syncChannelPluginsFromManager };
@@ -290,6 +290,7 @@ export interface ChannelPollResult {
290
290
  }
291
291
  export interface ChannelStreamHandle {
292
292
  update: (text: string) => void;
293
+ updateReasoning?: (text: string) => void;
293
294
  updateProgress?: (text: string, stage: string, detail?: string) => void;
294
295
  setProgress?: (stage: string, detail?: string) => void;
295
296
  end: () => Promise<void>;
@@ -14,8 +14,8 @@ export interface InboundMessage {
14
14
  data?: string;
15
15
  name?: string;
16
16
  size?: number;
17
- /** Relative to configured workspace (`agents.defaults.workspace`), POSIX `/`. */
18
- workspaceRelativePath?: string;
17
+ /** Already persisted pass-through by URI. */
18
+ uri?: string;
19
19
  }>;
20
20
  metadata?: Record<string, unknown>;
21
21
  }
@@ -4,3 +4,4 @@
4
4
  * (Bundlers may reorder imports in `index.ts`; this file stays dependency-minimal.)
5
5
  */
6
6
  import './cli-log-level-preset.js';
7
+ import '../infra/http-proxy-env.js';
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { version } from "../../package.js";
3
+ import "../infra/http-proxy-env.js";
3
4
  import "./cli-log-level-preset.js";
4
5
  import { ensureXopcCliOnPath } from "../infra/path-env.js";
5
6
  import { formatRootHelp } from "./command-manifest.js";
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","names":["pkg.version"],"sources":["../../../src/cli/bin.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * CLI entry: log-level preset must run before any module that initializes the logger.\n * (Bundlers may reorder imports in `index.ts`; this file stays dependency-minimal.)\n */\nimport './cli-log-level-preset.js';\n\nimport pkg from '../../package.json' with { type: 'json' };\nimport { ensureXopcCliOnPath } from '../infra/path-env.js';\nimport { formatRootHelp } from './command-manifest.js';\n\nensureXopcCliOnPath();\n\nfunction printRootHelp(): void {\n console.log(formatRootHelp());\n}\n\nconst rootArgs = process.argv.slice(2).filter((arg) => arg !== '--');\nif (rootArgs.length === 1 && (rootArgs[0] === '--version' || rootArgs[0] === '-V')) {\n console.log(pkg.version);\n process.exit(0);\n}\nif (rootArgs.length === 1 && (rootArgs[0] === '--help' || rootArgs[0] === '-h' || rootArgs[0] === 'help')) {\n printRootHelp();\n process.exit(0);\n}\n\nconst filteredArgv = process.argv.filter((arg, index) => {\n if (arg !== '--') return true;\n return index < 2;\n});\n\nconst { tryRunGatewayRunFastPath } = await import('./gateway-run-fast-path.js');\nif (await tryRunGatewayRunFastPath(filteredArgv)) {\n process.exit(typeof process.exitCode === 'number' ? process.exitCode : 0);\n}\n\nconst { runCli } = await import('./index.js');\nawait runCli(process.argv);\n"],"mappings":";;;;;;AAWA,qBAAqB;AAErB,SAAS,gBAAsB;AAC7B,SAAQ,IAAI,gBAAgB,CAAC;;AAG/B,MAAM,WAAW,QAAQ,KAAK,MAAM,EAAE,CAAC,QAAQ,QAAQ,QAAQ,KAAK;AACpE,IAAI,SAAS,WAAW,MAAM,SAAS,OAAO,eAAe,SAAS,OAAO,OAAO;AAClF,SAAQ,IAAIA,QAAY;AACxB,SAAQ,KAAK,EAAE;;AAEjB,IAAI,SAAS,WAAW,MAAM,SAAS,OAAO,YAAY,SAAS,OAAO,QAAQ,SAAS,OAAO,SAAS;AACzG,gBAAe;AACf,SAAQ,KAAK,EAAE;;AAGjB,MAAM,eAAe,QAAQ,KAAK,QAAQ,KAAK,UAAU;AACvD,KAAI,QAAQ,KAAM,QAAO;AACzB,QAAO,QAAQ;EACf;AAEF,MAAM,EAAE,6BAA6B,MAAM,OAAO;AAClD,IAAI,MAAM,yBAAyB,aAAa,CAC9C,SAAQ,KAAK,OAAO,QAAQ,aAAa,WAAW,QAAQ,WAAW,EAAE;AAG3E,MAAM,EAAE,WAAW,MAAM,OAAO;AAChC,MAAM,OAAO,QAAQ,KAAK"}
1
+ {"version":3,"file":"bin.js","names":["pkg.version"],"sources":["../../../src/cli/bin.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * CLI entry: log-level preset must run before any module that initializes the logger.\n * (Bundlers may reorder imports in `index.ts`; this file stays dependency-minimal.)\n */\nimport './cli-log-level-preset.js';\nimport '../infra/http-proxy-env.js';\n\nimport pkg from '../../package.json' with { type: 'json' };\nimport { ensureXopcCliOnPath } from '../infra/path-env.js';\nimport { formatRootHelp } from './command-manifest.js';\n\nensureXopcCliOnPath();\n\nfunction printRootHelp(): void {\n console.log(formatRootHelp());\n}\n\nconst rootArgs = process.argv.slice(2).filter((arg) => arg !== '--');\nif (rootArgs.length === 1 && (rootArgs[0] === '--version' || rootArgs[0] === '-V')) {\n console.log(pkg.version);\n process.exit(0);\n}\nif (rootArgs.length === 1 && (rootArgs[0] === '--help' || rootArgs[0] === '-h' || rootArgs[0] === 'help')) {\n printRootHelp();\n process.exit(0);\n}\n\nconst filteredArgv = process.argv.filter((arg, index) => {\n if (arg !== '--') return true;\n return index < 2;\n});\n\nconst { tryRunGatewayRunFastPath } = await import('./gateway-run-fast-path.js');\nif (await tryRunGatewayRunFastPath(filteredArgv)) {\n process.exit(typeof process.exitCode === 'number' ? process.exitCode : 0);\n}\n\nconst { runCli } = await import('./index.js');\nawait runCli(process.argv);\n"],"mappings":";;;;;;;AAYA,qBAAqB;AAErB,SAAS,gBAAsB;AAC7B,SAAQ,IAAI,gBAAgB,CAAC;;AAG/B,MAAM,WAAW,QAAQ,KAAK,MAAM,EAAE,CAAC,QAAQ,QAAQ,QAAQ,KAAK;AACpE,IAAI,SAAS,WAAW,MAAM,SAAS,OAAO,eAAe,SAAS,OAAO,OAAO;AAClF,SAAQ,IAAIA,QAAY;AACxB,SAAQ,KAAK,EAAE;;AAEjB,IAAI,SAAS,WAAW,MAAM,SAAS,OAAO,YAAY,SAAS,OAAO,QAAQ,SAAS,OAAO,SAAS;AACzG,gBAAe;AACf,SAAQ,KAAK,EAAE;;AAGjB,MAAM,eAAe,QAAQ,KAAK,QAAQ,KAAK,UAAU;AACvD,KAAI,QAAQ,KAAM,QAAO;AACzB,QAAO,QAAQ;EACf;AAEF,MAAM,EAAE,6BAA6B,MAAM,OAAO;AAClD,IAAI,MAAM,yBAAyB,aAAa,CAC9C,SAAQ,KAAK,OAAO,QAAQ,aAAa,WAAW,QAAQ,WAAW,EAAE;AAG3E,MAAM,EAAE,WAAW,MAAM,OAAO;AAChC,MAAM,OAAO,QAAQ,KAAK"}
@@ -1,8 +1,8 @@
1
1
  import { init_paths, resolveConfigPath } from "../../config/paths.js";
2
2
  import { init_loader, loadConfig } from "../../config/loader.js";
3
+ import { getChannelPlugin, listChannelPlugins, syncChannelPluginsFromManager } from "../../channels/plugins/registry.js";
3
4
  import { approveChannelPairingFromCli } from "../../channels/pairing/approve-cli.js";
4
5
  import { bundledChannelPlugins } from "../../generated/bundled-channel-plugins.js";
5
- import { getChannelPlugin, listChannelPlugins, syncChannelPluginsFromManager } from "../../channels/plugins/registry.js";
6
6
  import { formatExamples, register } from "../registry.js";
7
7
  import { colors } from "../utils/colors.js";
8
8
  import { SETUP_EXIT } from "./setup-shared/types.js";
@@ -0,0 +1,2 @@
1
+ import type { CheckResult, DoctorContext } from '../types.js';
2
+ export declare function checkDatabaseSchema(ctx: DoctorContext): Promise<CheckResult>;
@@ -0,0 +1,62 @@
1
+ import { init_loader, loadConfig } from "../../../../config/loader.js";
2
+ import { inspectSchemaMigrationStatus } from "../../../../storage/sqlite/migrations/runner.js";
3
+ import { requireXopcDatabase } from "../../../../storage/sqlite/connection.js";
4
+ import { getSqliteDatabase } from "../../../../storage/sqlite/transaction.js";
5
+ import "../../../../storage/sqlite/index.js";
6
+ import { existsSync } from "node:fs";
7
+ //#region src/cli/commands/doctor/checks/database-schema.ts
8
+ init_loader();
9
+ async function checkDatabaseSchema(ctx) {
10
+ if (!existsSync(ctx.configPath)) return {
11
+ id: "database-schema",
12
+ label: "Database schema",
13
+ status: "skip",
14
+ message: "No config file; skipped.",
15
+ hints: []
16
+ };
17
+ try {
18
+ loadConfig(ctx.configPath);
19
+ } catch {
20
+ return {
21
+ id: "database-schema",
22
+ label: "Database schema",
23
+ status: "warn",
24
+ message: "Config invalid; database schema check skipped.",
25
+ hints: ["Fix xopc.json before running database checks."]
26
+ };
27
+ }
28
+ requireXopcDatabase();
29
+ const status = inspectSchemaMigrationStatus(getSqliteDatabase());
30
+ if (status.isTooNew) return {
31
+ id: "database-schema",
32
+ label: "Database schema",
33
+ status: "fail",
34
+ message: `Database schema v${status.dbVersion} is newer than this app (v${status.appVersion}).`,
35
+ hints: ["Upgrade xopc to a newer release that supports this database version.", "Or restore xopc.db from a backup taken before the upgrade."]
36
+ };
37
+ if (status.hasMigrationGap) return {
38
+ id: "database-schema",
39
+ label: "Database schema",
40
+ status: "fail",
41
+ message: `Database schema v${status.dbVersion} is missing migration to v${status.missingVersion}.`,
42
+ hints: [`This app supports schema v${status.appVersion} but is missing migration file ${String(status.missingVersion).padStart(3, "0")}_*.sql.`, "Upgrade xopc to a release that bundles the required migration."]
43
+ };
44
+ if (status.pendingVersions.length > 0) return {
45
+ id: "database-schema",
46
+ label: "Database schema",
47
+ status: "warn",
48
+ message: `Database schema v${status.dbVersion}; pending migration to v${status.appVersion} on next gateway start.`,
49
+ hints: [`Pending steps: v${status.pendingVersions.join(", v")}`, "Restart the gateway (or open the Electron app) to apply migrations automatically."]
50
+ };
51
+ return {
52
+ id: "database-schema",
53
+ label: "Database schema",
54
+ status: "pass",
55
+ message: `SQLite schema v${status.dbVersion} (current release v2).`,
56
+ hints: []
57
+ };
58
+ }
59
+ //#endregion
60
+ export { checkDatabaseSchema };
61
+
62
+ //# sourceMappingURL=database-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-schema.js","names":[],"sources":["../../../../../../src/cli/commands/doctor/checks/database-schema.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\n\nimport { loadConfig } from '../../../../config/loader.js';\nimport {\n inspectSchemaMigrationStatus,\n XOPC_DB_SCHEMA_VERSION,\n} from '../../../../storage/sqlite/migrations/runner.js';\nimport {\n getSqliteDatabase,\n requireXopcDatabase,\n} from '../../../../storage/sqlite/index.js';\nimport type { CheckResult, DoctorContext } from '../types.js';\n\nexport async function checkDatabaseSchema(ctx: DoctorContext): Promise<CheckResult> {\n if (!existsSync(ctx.configPath)) {\n return {\n id: 'database-schema',\n label: 'Database schema',\n status: 'skip',\n message: 'No config file; skipped.',\n hints: [],\n };\n }\n\n try {\n loadConfig(ctx.configPath);\n } catch {\n return {\n id: 'database-schema',\n label: 'Database schema',\n status: 'warn',\n message: 'Config invalid; database schema check skipped.',\n hints: ['Fix xopc.json before running database checks.'],\n };\n }\n\n requireXopcDatabase();\n const status = inspectSchemaMigrationStatus(getSqliteDatabase());\n\n if (status.isTooNew) {\n return {\n id: 'database-schema',\n label: 'Database schema',\n status: 'fail',\n message: `Database schema v${status.dbVersion} is newer than this app (v${status.appVersion}).`,\n hints: [\n 'Upgrade xopc to a newer release that supports this database version.',\n 'Or restore xopc.db from a backup taken before the upgrade.',\n ],\n };\n }\n\n if (status.hasMigrationGap) {\n return {\n id: 'database-schema',\n label: 'Database schema',\n status: 'fail',\n message: `Database schema v${status.dbVersion} is missing migration to v${status.missingVersion}.`,\n hints: [\n `This app supports schema v${status.appVersion} but is missing migration file ${String(status.missingVersion).padStart(3, '0')}_*.sql.`,\n 'Upgrade xopc to a release that bundles the required migration.',\n ],\n };\n }\n\n if (status.pendingVersions.length > 0) {\n return {\n id: 'database-schema',\n label: 'Database schema',\n status: 'warn',\n message: `Database schema v${status.dbVersion}; pending migration to v${status.appVersion} on next gateway start.`,\n hints: [\n `Pending steps: v${status.pendingVersions.join(', v')}`,\n 'Restart the gateway (or open the Electron app) to apply migrations automatically.',\n ],\n };\n }\n\n return {\n id: 'database-schema',\n label: 'Database schema',\n status: 'pass',\n message: `SQLite schema v${status.dbVersion} (current release v${XOPC_DB_SCHEMA_VERSION}).`,\n hints: [],\n };\n}\n"],"mappings":";;;;;;;aAE0D;AAW1D,eAAsB,oBAAoB,KAA0C;AAClF,KAAI,CAAC,WAAW,IAAI,WAAW,CAC7B,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO,EAAE;EACV;AAGH,KAAI;AACF,aAAW,IAAI,WAAW;SACpB;AACN,SAAO;GACL,IAAI;GACJ,OAAO;GACP,QAAQ;GACR,SAAS;GACT,OAAO,CAAC,gDAAgD;GACzD;;AAGH,sBAAqB;CACrB,MAAM,SAAS,6BAA6B,mBAAmB,CAAC;AAEhE,KAAI,OAAO,SACT,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,oBAAoB,OAAO,UAAU,4BAA4B,OAAO,WAAW;EAC5F,OAAO,CACL,wEACA,6DACD;EACF;AAGH,KAAI,OAAO,gBACT,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,oBAAoB,OAAO,UAAU,4BAA4B,OAAO,eAAe;EAChG,OAAO,CACL,6BAA6B,OAAO,WAAW,iCAAiC,OAAO,OAAO,eAAe,CAAC,SAAS,GAAG,IAAI,CAAC,UAC/H,iEACD;EACF;AAGH,KAAI,OAAO,gBAAgB,SAAS,EAClC,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,oBAAoB,OAAO,UAAU,0BAA0B,OAAO,WAAW;EAC1F,OAAO,CACL,mBAAmB,OAAO,gBAAgB,KAAK,MAAM,IACrD,oFACD;EACF;AAGH,QAAO;EACL,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,SAAS,kBAAkB,OAAO,UAAU;EAC5C,OAAO,EAAE;EACV"}
@@ -2,6 +2,7 @@ import { printJsonResults, printResults } from "./format.js";
2
2
  import { checkNodeVersion } from "./checks/node-version.js";
3
3
  import { checkConfigHealth } from "./checks/config-health.js";
4
4
  import { checkStateIntegrity } from "./checks/state-integrity.js";
5
+ import { checkDatabaseSchema } from "./checks/database-schema.js";
5
6
  import { checkProviderAuth } from "./checks/provider-auth.js";
6
7
  import { checkChannelConfig } from "./checks/channel-config.js";
7
8
  import { checkChannelPairingPending } from "./checks/channel-pairing-pending.js";
@@ -19,6 +20,7 @@ const DOCTOR_CHECKS = [
19
20
  checkNodeVersion,
20
21
  checkConfigHealth,
21
22
  checkStateIntegrity,
23
+ checkDatabaseSchema,
22
24
  checkProviderAuth,
23
25
  checkChannelConfig,
24
26
  checkChannelPairingPending,
@@ -1 +1 @@
1
- {"version":3,"file":"flow.js","names":[],"sources":["../../../../../src/cli/commands/doctor/flow.ts"],"sourcesContent":["import { printJsonResults, printResults } from './format.js';\nimport type { CheckResult, DoctorCheck, DoctorContext } from './types.js';\nimport { checkNodeVersion } from './checks/node-version.js';\nimport { checkConfigHealth } from './checks/config-health.js';\nimport { checkStateIntegrity } from './checks/state-integrity.js';\nimport { checkProviderAuth } from './checks/provider-auth.js';\nimport { checkChannelConfig } from './checks/channel-config.js';\nimport { checkChannelPairingPending } from './checks/channel-pairing-pending.js';\nimport { checkGatewayHealth } from './checks/gateway-health.js';\nimport { checkSessionIntegrity } from './checks/session-integrity.js';\nimport { checkGatewayService } from './checks/gateway-service.js';\nimport { checkSecurityAudit } from './checks/security-audit.js';\nimport { checkWorkspaceStatus } from './checks/workspace-status.js';\nimport { checkCronHealth } from './checks/cron-health.js';\nimport { checkVersionUpdate } from './checks/version-check.js';\nimport { checkChannelPlugins } from './checks/channel-plugins.js';\n\nconst DOCTOR_CHECKS: DoctorCheck[] = [\n checkVersionUpdate,\n checkNodeVersion,\n checkConfigHealth,\n checkStateIntegrity,\n checkProviderAuth,\n checkChannelConfig,\n checkChannelPairingPending,\n checkSecurityAudit,\n checkWorkspaceStatus,\n checkGatewayService,\n checkGatewayHealth,\n checkCronHealth,\n checkSessionIntegrity,\n];\n\n/**\n * Headless data collection — used by both CLI and gateway API.\n */\nexport async function collectDoctorResults(ctx: DoctorContext): Promise<CheckResult[]> {\n if (ctx.options.security) {\n return [await checkSecurityAudit(ctx)];\n }\n\n const results: CheckResult[] = [];\n\n for (const check of DOCTOR_CHECKS) {\n results.push(await check(ctx));\n }\n\n results.push(...(await checkChannelPlugins(ctx)));\n\n return results;\n}\n\n/**\n * CLI entry point — collect and print.\n */\nexport async function runDoctor(ctx: DoctorContext): Promise<CheckResult[]> {\n const results = await collectDoctorResults(ctx);\n\n if (ctx.options.json) {\n printJsonResults(results);\n } else {\n printResults(results, { security: ctx.options.security });\n }\n\n return results;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,MAAM,gBAA+B;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;AAKD,eAAsB,qBAAqB,KAA4C;AACrF,KAAI,IAAI,QAAQ,SACd,QAAO,CAAC,MAAM,mBAAmB,IAAI,CAAC;CAGxC,MAAM,UAAyB,EAAE;AAEjC,MAAK,MAAM,SAAS,cAClB,SAAQ,KAAK,MAAM,MAAM,IAAI,CAAC;AAGhC,SAAQ,KAAK,GAAI,MAAM,oBAAoB,IAAI,CAAE;AAEjD,QAAO;;;;;AAMT,eAAsB,UAAU,KAA4C;CAC1E,MAAM,UAAU,MAAM,qBAAqB,IAAI;AAE/C,KAAI,IAAI,QAAQ,KACd,kBAAiB,QAAQ;KAEzB,cAAa,SAAS,EAAE,UAAU,IAAI,QAAQ,UAAU,CAAC;AAG3D,QAAO"}
1
+ {"version":3,"file":"flow.js","names":[],"sources":["../../../../../src/cli/commands/doctor/flow.ts"],"sourcesContent":["import { printJsonResults, printResults } from './format.js';\nimport type { CheckResult, DoctorCheck, DoctorContext } from './types.js';\nimport { checkNodeVersion } from './checks/node-version.js';\nimport { checkConfigHealth } from './checks/config-health.js';\nimport { checkStateIntegrity } from './checks/state-integrity.js';\nimport { checkDatabaseSchema } from './checks/database-schema.js';\nimport { checkProviderAuth } from './checks/provider-auth.js';\nimport { checkChannelConfig } from './checks/channel-config.js';\nimport { checkChannelPairingPending } from './checks/channel-pairing-pending.js';\nimport { checkGatewayHealth } from './checks/gateway-health.js';\nimport { checkSessionIntegrity } from './checks/session-integrity.js';\nimport { checkGatewayService } from './checks/gateway-service.js';\nimport { checkSecurityAudit } from './checks/security-audit.js';\nimport { checkWorkspaceStatus } from './checks/workspace-status.js';\nimport { checkCronHealth } from './checks/cron-health.js';\nimport { checkVersionUpdate } from './checks/version-check.js';\nimport { checkChannelPlugins } from './checks/channel-plugins.js';\n\nconst DOCTOR_CHECKS: DoctorCheck[] = [\n checkVersionUpdate,\n checkNodeVersion,\n checkConfigHealth,\n checkStateIntegrity,\n checkDatabaseSchema,\n checkProviderAuth,\n checkChannelConfig,\n checkChannelPairingPending,\n checkSecurityAudit,\n checkWorkspaceStatus,\n checkGatewayService,\n checkGatewayHealth,\n checkCronHealth,\n checkSessionIntegrity,\n];\n\n/**\n * Headless data collection — used by both CLI and gateway API.\n */\nexport async function collectDoctorResults(ctx: DoctorContext): Promise<CheckResult[]> {\n if (ctx.options.security) {\n return [await checkSecurityAudit(ctx)];\n }\n\n const results: CheckResult[] = [];\n\n for (const check of DOCTOR_CHECKS) {\n results.push(await check(ctx));\n }\n\n results.push(...(await checkChannelPlugins(ctx)));\n\n return results;\n}\n\n/**\n * CLI entry point — collect and print.\n */\nexport async function runDoctor(ctx: DoctorContext): Promise<CheckResult[]> {\n const results = await collectDoctorResults(ctx);\n\n if (ctx.options.json) {\n printJsonResults(results);\n } else {\n printResults(results, { security: ctx.options.security });\n }\n\n return results;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,MAAM,gBAA+B;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;AAKD,eAAsB,qBAAqB,KAA4C;AACrF,KAAI,IAAI,QAAQ,SACd,QAAO,CAAC,MAAM,mBAAmB,IAAI,CAAC;CAGxC,MAAM,UAAyB,EAAE;AAEjC,MAAK,MAAM,SAAS,cAClB,SAAQ,KAAK,MAAM,MAAM,IAAI,CAAC;AAGhC,SAAQ,KAAK,GAAI,MAAM,oBAAoB,IAAI,CAAE;AAEjD,QAAO;;;;;AAMT,eAAsB,UAAU,KAA4C;CAC1E,MAAM,UAAU,MAAM,qBAAqB,IAAI;AAE/C,KAAI,IAAI,QAAQ,KACd,kBAAiB,QAAQ;KAEzB,cAAa,SAAS,EAAE,UAAU,IAAI,QAAQ,UAAU,CAAC;AAG3D,QAAO"}
@@ -2,8 +2,7 @@ import { resolveStateDir } from "../../config/paths-state.js";
2
2
  import { resolveAgentWorkspaceDir } from "../../agent/agent-scope.js";
3
3
  import { createLogger } from "../../utils/logger/index.js";
4
4
  import { init_logger } from "../../utils/logger.js";
5
- import { WORKSPACE_FILES, init_paths, resolveAgentDir, resolveAgentHomeDir, resolveAgentMetadataPath, resolveAgentProfileDir, resolveBinDir, resolveConfigPath, resolveCredentialsDir, resolveCronDir, resolveExtensionsDir, resolveInboxDir, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogsDir, resolveSkillsDir, resolveToolsDir, resolveWorkspaceStateDir, resolveWorkspaceStatePath } from "../../config/paths.js";
6
- import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
5
+ import { WORKSPACE_FILES, init_paths, resolveAgentDir, resolveAgentHomeDir, resolveAgentProfileDir, resolveConfigPath } from "../../config/paths.js";
7
6
  import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
8
7
  import { formatExamples, register } from "../registry.js";
9
8
  import { join } from "path";
@@ -11,7 +10,6 @@ import { existsSync } from "fs";
11
10
  import { mkdir, writeFile } from "fs/promises";
12
11
  import { Command } from "commander";
13
12
  //#region src/cli/commands/init.ts
14
- init_write_file_atomic();
15
13
  init_logger();
16
14
  init_paths();
17
15
  init_loader();
@@ -34,59 +32,16 @@ async function initCommand(options = {}) {
34
32
  }
35
33
  }
36
34
  await mkdir(stateDir, { recursive: true });
37
- await mkdir(resolveCredentialsDir(), { recursive: true });
38
- await mkdir(join(resolveCredentialsDir(), "oauth"), { recursive: true });
39
- await mkdir(resolveExtensionsDir(), { recursive: true });
40
- await mkdir(resolveSkillsDir(), { recursive: true });
41
- await mkdir(resolveCronDir(), { recursive: true });
42
- await mkdir(join(resolveCronDir(), "logs"), { recursive: true });
43
- await mkdir(resolveLogsDir(), { recursive: true });
44
- await mkdir(resolveBinDir(), { recursive: true });
45
- await mkdir(resolveToolsDir(), { recursive: true });
46
35
  const configPath = resolveConfigPath();
47
36
  const cfg = loadConfig(configPath);
48
37
  await mkdir(resolveAgentHomeDir(cfg, agentId), { recursive: true });
49
38
  await mkdir(resolveAgentProfileDir(cfg, agentId), { recursive: true });
50
39
  await mkdir(resolveAgentDir(cfg, agentId), { recursive: true });
51
- await mkdir(join(resolveAgentDir(cfg, agentId), "credentials"), { recursive: true });
52
- const wsRoot = resolveAgentWorkspaceDir(cfg, agentId);
53
- await mkdir(wsRoot, { recursive: true });
54
- await mkdir(resolveWorkspaceStateDir(cfg, agentId), { recursive: true });
55
- await mkdir(join(wsRoot, "memory"), { recursive: true });
56
- await mkdir(resolveInboxDir(cfg, agentId), { recursive: true });
57
- await mkdir(resolveInboxPendingDir(cfg, agentId), { recursive: true });
58
- await mkdir(resolveInboxProcessedDir(cfg, agentId), { recursive: true });
40
+ await mkdir(resolveAgentWorkspaceDir(cfg, agentId), { recursive: true });
59
41
  if (!existsSync(configPath) || options.force) {
60
42
  await saveConfig(cfg, configPath);
61
43
  log.info({ configPath }, "Created initial configuration");
62
44
  }
63
- const agentMetadataPath = resolveAgentMetadataPath(cfg, agentId);
64
- if (!existsSync(agentMetadataPath) || options.force) {
65
- const agentMetadata = {
66
- version: 1,
67
- id: agentId,
68
- name: agentId === "main" ? "Main Agent" : `Agent ${agentId}`,
69
- description: agentId === "main" ? "Primary agent for daily tasks" : `Specialized agent for ${agentId}`,
70
- model: "anthropic/claude-sonnet-4-5",
71
- createdAt: (/* @__PURE__ */ new Date()).toISOString(),
72
- lastActiveAt: (/* @__PURE__ */ new Date()).toISOString(),
73
- config: {
74
- maxTokens: 8192,
75
- temperature: .7,
76
- compaction: {
77
- enabled: true,
78
- mode: "default"
79
- }
80
- },
81
- channels: ["gateway"],
82
- tags: agentId === "main" ? ["personal", "primary"] : []
83
- };
84
- await writeTextAtomic(agentMetadataPath, JSON.stringify(agentMetadata, null, 2));
85
- log.info({
86
- agentId,
87
- agentMetadataPath
88
- }, "Created agent metadata");
89
- }
90
45
  if (!options.skipWorkspace) await createWorkspaceFiles(cfg, agentId);
91
46
  log.info({
92
47
  stateDir,
@@ -263,16 +218,6 @@ _Review and update this periodically from daily memory files._
263
218
  `, "utf-8");
264
219
  log.info({ path: memoryPath }, "Created MEMORY.md");
265
220
  }
266
- const workspaceStatePath = resolveWorkspaceStatePath(cfg, agentId);
267
- if (!existsSync(workspaceStatePath)) {
268
- const workspaceState = {
269
- version: 1,
270
- agentId,
271
- profileMarkdownSeededAt: (/* @__PURE__ */ new Date()).toISOString()
272
- };
273
- await writeTextAtomic(workspaceStatePath, JSON.stringify(workspaceState, null, 2));
274
- log.info({ path: workspaceStatePath }, "Created workspace state");
275
- }
276
221
  }
277
222
  function createInitCommand(_ctx) {
278
223
  return new Command("init").description("Initialize xopc state directories, config, and agent workspace").addHelpText("after", formatExamples([