@xopcai/xopc 0.0.149 → 0.0.150

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 (2873) hide show
  1. package/README.md +10 -0
  2. package/README.zh-CN.md +10 -0
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/dashscope/src/image-generation-provider.js +0 -2
  5. package/dist/extensions/demo-memory/src/index.js +0 -2
  6. package/dist/extensions/fal/src/image-generation-provider.js +0 -2
  7. package/dist/extensions/feishu/src/actions/message-action-handler.js +0 -2
  8. package/dist/extensions/feishu/src/adapters/cli-login.js +0 -2
  9. package/dist/extensions/feishu/src/adapters/gateway-setup.js +0 -2
  10. package/dist/extensions/feishu/src/adapters/onboard-cli.js +0 -2
  11. package/dist/extensions/feishu/src/auth/app-registration.js +0 -2
  12. package/dist/extensions/feishu/src/auth/pairing.js +0 -2
  13. package/dist/extensions/feishu/src/auth/paths.js +0 -2
  14. package/dist/extensions/feishu/src/directory/directory-adapter.js +0 -2
  15. package/dist/extensions/feishu/src/format.js +0 -2
  16. package/dist/extensions/feishu/src/index.js +0 -2
  17. package/dist/extensions/feishu/src/outbound/actions.js +0 -2
  18. package/dist/extensions/feishu/src/outbound/media-load.js +0 -2
  19. package/dist/extensions/feishu/src/outbound/outbound-adapter.js +0 -2
  20. package/dist/extensions/feishu/src/pairing/feishu-pairing-prompt.js +0 -2
  21. package/dist/extensions/feishu/src/pairing-config-resolver.js +0 -2
  22. package/dist/extensions/feishu/src/plugin.js +0 -2
  23. package/dist/extensions/feishu/src/schema/config-schema.js +0 -2
  24. package/dist/extensions/feishu/src/state/accounts.js +0 -2
  25. package/dist/extensions/feishu/src/state/message-bindings.js +0 -2
  26. package/dist/extensions/feishu/src/state/thread-bindings.js +0 -2
  27. package/dist/extensions/feishu/src/status/doctor.js +0 -2
  28. package/dist/extensions/feishu/src/status/status-adapter.js +0 -2
  29. package/dist/extensions/feishu/src/streaming/streaming-adapter.js +0 -2
  30. package/dist/extensions/feishu/src/subagent-hooks.js +0 -2
  31. package/dist/extensions/feishu/src/tools/docx/docx-batch-insert.js +0 -2
  32. package/dist/extensions/feishu/src/tools/docx/docx-color-text.d.ts +6 -3386
  33. package/dist/extensions/feishu/src/tools/docx/docx-color-text.js +0 -2
  34. package/dist/extensions/feishu/src/tools/docx/docx-table-ops.d.ts +16 -16927
  35. package/dist/extensions/feishu/src/tools/docx/docx-table-ops.js +0 -2
  36. package/dist/extensions/feishu/src/tools/tools.js +0 -2
  37. package/dist/extensions/feishu/src/transport/client/client.js +2 -4
  38. package/dist/extensions/feishu/src/transport/client/lark-sdk-logger.js +0 -2
  39. package/dist/extensions/feishu/src/transport/client/lark-sdk.d.ts +3 -0
  40. package/dist/extensions/feishu/src/transport/client/lark-sdk.js +14 -0
  41. package/dist/extensions/feishu/src/transport/reliability/dedupe.js +0 -2
  42. package/dist/extensions/feishu/src/transport/reliability/inbound-pipeline.js +0 -2
  43. package/dist/extensions/feishu/src/transport/socket-mode/monitor.js +0 -2
  44. package/dist/extensions/feishu/src/transport/socket-mode/retry.js +0 -2
  45. package/dist/extensions/feishu/src/transport/text/mentions.js +0 -2
  46. package/dist/extensions/feishu/src/transport/webhook/monitor.js +3 -5
  47. package/dist/extensions/feishu/src/ui/config-surface.js +0 -2
  48. package/dist/extensions/feishu/src/workflow-progress.js +0 -2
  49. package/dist/extensions/google/src/image-generation-provider.js +0 -2
  50. package/dist/extensions/minimax/src/image-generation-provider.js +0 -2
  51. package/dist/extensions/openai/src/image-generation-provider.js +0 -2
  52. package/dist/extensions/telegram/src/access-control.js +0 -2
  53. package/dist/extensions/telegram/src/account-manager.js +0 -2
  54. package/dist/extensions/telegram/src/actions/message-actions.js +0 -2
  55. package/dist/extensions/telegram/src/adapters/command-adapter.js +0 -2
  56. package/dist/extensions/telegram/src/adapters/config-adapter.js +0 -2
  57. package/dist/extensions/telegram/src/adapters/debounce-keys.js +0 -2
  58. package/dist/extensions/telegram/src/adapters/gateway-adapter.js +0 -2
  59. package/dist/extensions/telegram/src/adapters/gateway-setup.js +0 -2
  60. package/dist/extensions/telegram/src/adapters/inbound-access.js +0 -2
  61. package/dist/extensions/telegram/src/adapters/index.js +0 -2
  62. package/dist/extensions/telegram/src/adapters/onboard-cli.js +0 -2
  63. package/dist/extensions/telegram/src/adapters/outbound-adapter.js +0 -2
  64. package/dist/extensions/telegram/src/adapters/security-adapter.js +0 -2
  65. package/dist/extensions/telegram/src/adapters/setup-wizard.js +0 -2
  66. package/dist/extensions/telegram/src/adapters/status-adapter.js +0 -2
  67. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +0 -2
  68. package/dist/extensions/telegram/src/api-root.js +0 -2
  69. package/dist/extensions/telegram/src/approval-delivery.js +0 -2
  70. package/dist/extensions/telegram/src/approval-store.js +0 -2
  71. package/dist/extensions/telegram/src/caption.js +0 -2
  72. package/dist/extensions/telegram/src/command-handler.js +0 -2
  73. package/dist/extensions/telegram/src/config-schema.js +0 -2
  74. package/dist/extensions/telegram/src/conversation-id.js +0 -2
  75. package/dist/extensions/telegram/src/dedupe.js +0 -2
  76. package/dist/extensions/telegram/src/delivery-chat-id.js +0 -2
  77. package/dist/extensions/telegram/src/doctor.js +0 -2
  78. package/dist/extensions/telegram/src/draft-stream-lifecycle.js +0 -2
  79. package/dist/extensions/telegram/src/draft-stream-loop.js +0 -2
  80. package/dist/extensions/telegram/src/draft-stream.js +0 -2
  81. package/dist/extensions/telegram/src/errors.js +0 -2
  82. package/dist/extensions/telegram/src/exec-approval-handler.js +0 -2
  83. package/dist/extensions/telegram/src/exec-approvals.js +0 -2
  84. package/dist/extensions/telegram/src/focus-handler.js +0 -2
  85. package/dist/extensions/telegram/src/format.js +0 -2
  86. package/dist/extensions/telegram/src/group-config-resolver.js +0 -2
  87. package/dist/extensions/telegram/src/inbound-coalescer.js +0 -2
  88. package/dist/extensions/telegram/src/inbound-processor.js +0 -2
  89. package/dist/extensions/telegram/src/index.js +0 -2
  90. package/dist/extensions/telegram/src/inline-keyboards.js +0 -2
  91. package/dist/extensions/telegram/src/network-errors.js +0 -2
  92. package/dist/extensions/telegram/src/outbound-sender.js +0 -2
  93. package/dist/extensions/telegram/src/pairing-config-resolver.js +0 -2
  94. package/dist/extensions/telegram/src/plugin-defaults.js +0 -2
  95. package/dist/extensions/telegram/src/plugin.js +0 -2
  96. package/dist/extensions/telegram/src/polling-session.js +0 -2
  97. package/dist/extensions/telegram/src/proxy-fetch.js +0 -2
  98. package/dist/extensions/telegram/src/reactions.js +0 -2
  99. package/dist/extensions/telegram/src/reply-params.js +0 -2
  100. package/dist/extensions/telegram/src/routing-integration.js +0 -2
  101. package/dist/extensions/telegram/src/send-options.js +0 -2
  102. package/dist/extensions/telegram/src/sent-cache.js +0 -2
  103. package/dist/extensions/telegram/src/startup-errors.js +0 -2
  104. package/dist/extensions/telegram/src/telegram-actions.js +0 -2
  105. package/dist/extensions/telegram/src/telegram-draft-errors.js +0 -2
  106. package/dist/extensions/telegram/src/thread-bindings.js +0 -2
  107. package/dist/extensions/telegram/src/timeout-abort.js +0 -2
  108. package/dist/extensions/telegram/src/token-resolver.js +0 -2
  109. package/dist/extensions/telegram/src/update-offset-store.js +0 -2
  110. package/dist/extensions/telegram/src/workflow-progress.js +0 -2
  111. package/dist/extensions/telegram/xopc.extension.json +1 -1
  112. package/dist/extensions/weixin/src/adapters/onboard-cli.js +0 -2
  113. package/dist/extensions/weixin/src/api/api.js +0 -2
  114. package/dist/extensions/weixin/src/api/config-cache.js +0 -2
  115. package/dist/extensions/weixin/src/api/session-guard.js +0 -2
  116. package/dist/extensions/weixin/src/api/types.js +0 -2
  117. package/dist/extensions/weixin/src/auth/accounts.js +0 -2
  118. package/dist/extensions/weixin/src/auth/login-qr.js +0 -2
  119. package/dist/extensions/weixin/src/auth/pairing.js +0 -2
  120. package/dist/extensions/weixin/src/auth/weixin-account-id.js +0 -2
  121. package/dist/extensions/weixin/src/cdn/aes-ecb.js +0 -2
  122. package/dist/extensions/weixin/src/cdn/cdn-upload.js +0 -2
  123. package/dist/extensions/weixin/src/cdn/cdn-url.js +0 -2
  124. package/dist/extensions/weixin/src/cdn/pic-decrypt.js +0 -2
  125. package/dist/extensions/weixin/src/cdn/upload.js +0 -2
  126. package/dist/extensions/weixin/src/cli/gateway-qr-login.js +0 -2
  127. package/dist/extensions/weixin/src/cli/qr-login.js +0 -2
  128. package/dist/extensions/weixin/src/config-schema.js +0 -2
  129. package/dist/extensions/weixin/src/config-surface.js +0 -2
  130. package/dist/extensions/weixin/src/delivery-to.js +0 -2
  131. package/dist/extensions/weixin/src/index.js +0 -2
  132. package/dist/extensions/weixin/src/media/data-url.js +0 -2
  133. package/dist/extensions/weixin/src/media/media-download.js +0 -2
  134. package/dist/extensions/weixin/src/media/mime.js +0 -2
  135. package/dist/extensions/weixin/src/media/silk-transcode.js +0 -2
  136. package/dist/extensions/weixin/src/messaging/context-token-init.js +0 -2
  137. package/dist/extensions/weixin/src/messaging/debug-mode.js +0 -2
  138. package/dist/extensions/weixin/src/messaging/error-notice.js +0 -2
  139. package/dist/extensions/weixin/src/messaging/inbound.js +0 -2
  140. package/dist/extensions/weixin/src/messaging/markdown-filter.js +0 -2
  141. package/dist/extensions/weixin/src/messaging/process-message.js +0 -2
  142. package/dist/extensions/weixin/src/messaging/send-media.js +0 -2
  143. package/dist/extensions/weixin/src/messaging/send.js +0 -2
  144. package/dist/extensions/weixin/src/messaging/slash-commands.js +0 -2
  145. package/dist/extensions/weixin/src/messaging/typing-ticket-store.js +0 -2
  146. package/dist/extensions/weixin/src/monitor/monitor.js +0 -2
  147. package/dist/extensions/weixin/src/outbound-send.js +0 -2
  148. package/dist/extensions/weixin/src/pairing-config-resolver.js +0 -2
  149. package/dist/extensions/weixin/src/plugin.js +0 -2
  150. package/dist/extensions/weixin/src/routing-integration.js +0 -2
  151. package/dist/extensions/weixin/src/storage/state-dir.js +0 -2
  152. package/dist/extensions/weixin/src/storage/sync-buf.js +0 -2
  153. package/dist/extensions/weixin/src/util/logger.js +0 -2
  154. package/dist/extensions/weixin/src/util/random.js +0 -2
  155. package/dist/extensions/weixin/src/util/redact.js +0 -2
  156. package/dist/extensions/weixin/src/workflow-progress.js +0 -2
  157. package/dist/gateway/static/root/assets/{activity-store-B4s0ipx2.js → activity-store-B3YP7y9d.js} +1 -1
  158. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BSccACje.js → agent-avatar-dicebear-BaP05tRU.js} +1 -1
  159. package/dist/gateway/static/root/assets/{agents-DZDOcgz5.js → agents-QArUBYV7.js} +1 -1
  160. package/dist/gateway/static/root/assets/{api-BMdUsNCV.js → api-BirUfJgj.js} +1 -1
  161. package/dist/gateway/static/root/assets/{app-management-settings-panel-DrLGhYkI.js → app-management-settings-panel-D5Cg_a6I.js} +1 -1
  162. package/dist/gateway/static/root/assets/{appearance-settings-BNasnY9D.js → appearance-settings-BBsAkJ56.js} +1 -1
  163. package/dist/gateway/static/root/assets/{apps-page-Cmr-Hvm9.js → apps-page-D1uAUndU.js} +1 -1
  164. package/dist/gateway/static/root/assets/{archive-plugin-BQ17IK9x.js → archive-plugin-D3OmrvFx.js} +1 -1
  165. package/dist/gateway/static/root/assets/{attachment-load-HXvgWHXu.js → attachment-load-Cgkm_5mb.js} +1 -1
  166. package/dist/gateway/static/root/assets/{automation-suggestion-card-CjIWpsch.js → automation-suggestion-card-CHvxSz-t.js} +1 -1
  167. package/dist/gateway/static/root/assets/{automations-page-TWgUAI8t.js → automations-page-BWQk03Vu.js} +1 -1
  168. package/dist/gateway/static/root/assets/{binary-plugins-DifWJzNZ.js → binary-plugins-dJR5UuzL.js} +1 -1
  169. package/dist/gateway/static/root/assets/{block-editor-DtRzIkPU.js → block-editor-v4_7o92L.js} +2 -2
  170. package/dist/gateway/static/root/assets/{browser-settings-page-DBsFItW_.js → browser-settings-page-SruFGuBP.js} +1 -1
  171. package/dist/gateway/static/root/assets/{capability-presets-api-DazKjWW1.js → capability-presets-api-BcTjPLiD.js} +1 -1
  172. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-Cvrw4fD1.js → capability-presets-settings-panel-CddBf58y.js} +1 -1
  173. package/dist/gateway/static/root/assets/{channel-recipient-api-Bea6if_6.js → channel-recipient-api-BbDlMRm5.js} +1 -1
  174. package/dist/gateway/static/root/assets/{channels-settings-BBkzrBYy.js → channels-settings-WI5tQ5tn.js} +1 -1
  175. package/dist/gateway/static/root/assets/channels-status-swr-Dt2EROlf.js +1 -0
  176. package/dist/gateway/static/root/assets/{connector-logo-BjbYbJjQ.js → connector-logo-BNthqff-.js} +1 -1
  177. package/dist/gateway/static/root/assets/{connectors-page-DLsZCAw7.js → connectors-page-DavHJ6rR.js} +1 -1
  178. package/dist/gateway/static/root/assets/desktop-pet-CVajXkdj.js +1 -0
  179. package/dist/gateway/static/root/assets/desktop-pet-settings-SHI66eIi.js +1 -0
  180. package/dist/gateway/static/root/assets/{directory-picker-path-field-C8zZNUzC.js → directory-picker-path-field-BdWd7m-p.js} +1 -1
  181. package/dist/gateway/static/root/assets/{dreaming-settings-gJSw7Adk.js → dreaming-settings-CXDhu3Me.js} +1 -1
  182. package/dist/gateway/static/root/assets/{extension-debug-page-DFE5ADJ0.js → extension-debug-page-CLJTGozU.js} +1 -1
  183. package/dist/gateway/static/root/assets/{extension-page-CfR-aW8G.js → extension-page-ClxpGfzA.js} +1 -1
  184. package/dist/gateway/static/root/assets/{extension-settings-page-CFIEbs2L.js → extension-settings-page-CDA3ZJ8k.js} +1 -1
  185. package/dist/gateway/static/root/assets/{gateway-config-api-B6M_ra8U.js → gateway-config-api-DpXL78pS.js} +1 -1
  186. package/dist/gateway/static/root/assets/{gateway-settings-BrxzyVW2.js → gateway-settings-Co-mXFP_.js} +1 -1
  187. package/dist/gateway/static/root/assets/{gateway-startup-retry-DNA3OOzV.js → gateway-startup-retry-D0SU7dte.js} +1 -1
  188. package/dist/gateway/static/root/assets/{goal-create-dialog-DRVRLc5Z.js → goal-create-dialog-BO6G--Ec.js} +1 -1
  189. package/dist/gateway/static/root/assets/{goal-detail-page-8F7NElzP.js → goal-detail-page-DK8eog4h.js} +1 -1
  190. package/dist/gateway/static/root/assets/{goals-config-api-D88opgcs.js → goals-config-api-r71aDqix.js} +1 -1
  191. package/dist/gateway/static/root/assets/{goals-page-BaoLiV8G.js → goals-page-AcROW97U.js} +2 -2
  192. package/dist/gateway/static/root/assets/{goals-settings-D07UL8Jo.js → goals-settings-CZOLhkTH.js} +1 -1
  193. package/dist/gateway/static/root/assets/{heartbeat-settings-YCSNOcXC.js → heartbeat-settings-F9S1gIFo.js} +1 -1
  194. package/dist/gateway/static/root/assets/index-C46C7Xee.css +1 -0
  195. package/dist/gateway/static/root/assets/{index-CH7XN6KY.js → index-IPmCli0N.js} +41 -41
  196. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BHnh5OoY.js → keyboard-shortcuts-settings-B3CUVfZ8.js} +1 -1
  197. package/dist/gateway/static/root/assets/{local-app-workbench-page-Boe8n4zH.js → local-app-workbench-page-HVq6NUvQ.js} +1 -1
  198. package/dist/gateway/static/root/assets/{local-apps-page-CKvtLzsF.js → local-apps-page-n7YJfRkU.js} +1 -1
  199. package/dist/gateway/static/root/assets/{locale-store-BneNAR8R.js → locale-store-BvcHGPHU.js} +1 -1
  200. package/dist/gateway/static/root/assets/{logs-page-Cb4Uptct.js → logs-page-Dgko6r04.js} +1 -1
  201. package/dist/gateway/static/root/assets/{markdown-split-BVSFG99p.js → markdown-split-1mnXr-JA.js} +1 -1
  202. package/dist/gateway/static/root/assets/{media-plugins-DdOjIVk3.js → media-plugins-D2bcxXrT.js} +1 -1
  203. package/dist/gateway/static/root/assets/{messages-t1yPaVCt.js → messages-BH7paqYt.js} +2 -2
  204. package/dist/gateway/static/root/assets/{models-hub-panel-CNiUKZUV.js → models-hub-panel-DD0cEfmR.js} +1 -1
  205. package/dist/gateway/static/root/assets/{notes-page-ZbLR3awn.js → notes-page-Wjc2utlj.js} +1 -1
  206. package/dist/gateway/static/root/assets/{notes-workbench-C9__VkD6.js → notes-workbench-BkA2yg9K.js} +2 -2
  207. package/dist/gateway/static/root/assets/{page-tabs-DMlQERNg.js → page-tabs-vdljrKuG.js} +1 -1
  208. package/dist/gateway/static/root/assets/{preview-open-alternatives-CbiJRPxK.js → preview-open-alternatives-BHki0l-E.js} +1 -1
  209. package/dist/gateway/static/root/assets/{project-detail-page-CZhuB5kO.js → project-detail-page-CXwVNLgg.js} +1 -1
  210. package/dist/gateway/static/root/assets/{projects-page-BOq4WVdR.js → projects-page-DlfvNcLh.js} +1 -1
  211. package/dist/gateway/static/root/assets/{remote-access-hub-BxGq0ebQ.js → remote-access-hub-BQyEX2Ui.js} +1 -1
  212. package/dist/gateway/static/root/assets/{save-bar-controls-BZTj3hxl.js → save-bar-controls-Vy4EmvEh.js} +1 -1
  213. package/dist/gateway/static/root/assets/{schedule-field-CxYDObjT.js → schedule-field-CVcwC7k_.js} +1 -1
  214. package/dist/gateway/static/root/assets/{schema-form-CBbXgpKQ.js → schema-form-DhMA1vkR.js} +1 -1
  215. package/dist/gateway/static/root/assets/{sessions-page-B6gSU_Au.js → sessions-page-CqQEW8oT.js} +1 -1
  216. package/dist/gateway/static/root/assets/settings-advanced-gate-M8fleFSc.js +1 -0
  217. package/dist/gateway/static/root/assets/{settings-collapsible-section-BySKZ8rp.js → settings-collapsible-section-C0xcL0vB.js} +1 -1
  218. package/dist/gateway/static/root/assets/{settings-form-section-CjINay6t.js → settings-form-section-Cgj4iVpx.js} +1 -1
  219. package/dist/gateway/static/root/assets/{settings-loading-skeleton-vitElc-n.js → settings-loading-skeleton-CC_NmD69.js} +1 -1
  220. package/dist/gateway/static/root/assets/{settings-page-BNrVwuL7.js → settings-page-B7_JZ2rM.js} +1 -1
  221. package/dist/gateway/static/root/assets/{settings-page-layout-HdlQOOqp.js → settings-page-layout-CKuQT4SG.js} +1 -1
  222. package/dist/gateway/static/root/assets/{setup-status-panel-BJeA4mmk.js → setup-status-panel-DvR8Y5YN.js} +1 -1
  223. package/dist/gateway/static/root/assets/{share-preview-page-DC-eQONB.js → share-preview-page-BmVw-6SJ.js} +1 -1
  224. package/dist/gateway/static/root/assets/{shares-settings-DB2KYA2_.js → shares-settings-C0JYYhGx.js} +1 -1
  225. package/dist/gateway/static/root/assets/skill-reload-api-DBFBczqN.js +1 -0
  226. package/dist/gateway/static/root/assets/{skills-page-Pm0fNe_p.js → skills-page-KAI9qBDD.js} +1 -1
  227. package/dist/gateway/static/root/assets/{system-settings-panel-CVa90q2f.js → system-settings-panel-D6d8VAk8.js} +1 -1
  228. package/dist/gateway/static/root/assets/{theme-store-D1cOpgsy.js → theme-store-EbMQ3TYi.js} +1 -1
  229. package/dist/gateway/static/root/assets/{typed-models-lib-DIKF9vpz.js → typed-models-lib-D63hJX-S.js} +1 -1
  230. package/dist/gateway/static/root/assets/{use-channel-catalog-DnvpI0Ys.js → use-channel-catalog-D-I-qki9.js} +1 -1
  231. package/dist/gateway/static/root/assets/{user-context-page-DnLqQyRG.js → user-context-page-Cuft-EbR.js} +1 -1
  232. package/dist/gateway/static/root/assets/{user-profile-fields-editor-y8gTmkPX.js → user-profile-fields-editor-CPaoS8Zl.js} +1 -1
  233. package/dist/gateway/static/root/assets/{user-profile-settings-panel-C3pvqe28.js → user-profile-settings-panel-Bs13qcx1.js} +1 -1
  234. package/dist/gateway/static/root/assets/{utils-BK2vwu_3.js → utils-3mnkFvPw.js} +1 -1
  235. package/dist/gateway/static/root/assets/{voice-api-key-field-BiFIIWC4.js → voice-api-key-field-C716UEi9.js} +1 -1
  236. package/dist/gateway/static/root/assets/{work-discovery-page-D2-_bC0J.js → work-discovery-page-CFSkHa0v.js} +1 -1
  237. package/dist/gateway/static/root/assets/{work-item-detail-page-B0FPG4eJ.js → work-item-detail-page-DaapBdoZ.js} +1 -1
  238. package/dist/gateway/static/root/assets/{work-page-BDeVxts_.js → work-page-DMtX92vs.js} +1 -1
  239. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BPzS67fU.js → workflow-run-setup-panel-B9FnZNWZ.js} +1 -1
  240. package/dist/gateway/static/root/assets/{workflows-page-xPhmrRLs.js → workflows-page-BgvE0_Iv.js} +1 -1
  241. package/dist/gateway/static/root/favicon.svg +1 -187
  242. package/dist/gateway/static/root/index.html +7 -7
  243. package/dist/gateway/static/root/logo-dark.svg +1 -185
  244. package/dist/gateway/static/root/logo.svg +1 -185
  245. package/dist/package.js +1 -3
  246. package/dist/src/activity/context.js +0 -2
  247. package/dist/src/activity/emitter.js +0 -2
  248. package/dist/src/activity/service.js +0 -2
  249. package/dist/src/agent/agent-manager.js +0 -2
  250. package/dist/src/agent/agent-scope.js +0 -2
  251. package/dist/src/agent/background-review/coordinator.js +0 -2
  252. package/dist/src/agent/background-review/prompts.js +0 -2
  253. package/dist/src/agent/background-review/run-background-review.js +0 -2
  254. package/dist/src/agent/background-review/settings.js +0 -2
  255. package/dist/src/agent/bootstrap/bootstrap-cache.js +0 -2
  256. package/dist/src/agent/bootstrap/bootstrap-context.js +0 -2
  257. package/dist/src/agent/bootstrap/bootstrap-files.js +0 -2
  258. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +0 -2
  259. package/dist/src/agent/bootstrap/load-bootstrap-files.js +0 -2
  260. package/dist/src/agent/bootstrap/project-agents-context.js +0 -2
  261. package/dist/src/agent/capabilities/definitions.js +0 -2
  262. package/dist/src/agent/capabilities/registry.js +0 -2
  263. package/dist/src/agent/child-agent-factory.js +0 -2
  264. package/dist/src/agent/client-error-format.js +0 -2
  265. package/dist/src/agent/code-intelligence/binary.js +0 -2
  266. package/dist/src/agent/code-intelligence/runtime.js +0 -2
  267. package/dist/src/agent/code-intelligence/tools.js +0 -2
  268. package/dist/src/agent/coding/turn-diff-tracker.js +0 -2
  269. package/dist/src/agent/context/expand-at-file-mentions.js +0 -2
  270. package/dist/src/agent/context/project-context.js +0 -2
  271. package/dist/src/agent/context/workspace-seed.js +0 -2
  272. package/dist/src/agent/context/workspace-state.js +0 -2
  273. package/dist/src/agent/context/workspace.js +0 -2
  274. package/dist/src/agent/embedded/run-for-session.js +0 -2
  275. package/dist/src/agent/embedded/run-turn.js +0 -2
  276. package/dist/src/agent/embedded/runs.js +0 -2
  277. package/dist/src/agent/embedded/session-manager-init.js +0 -2
  278. package/dist/src/agent/embedded/session-runner.js +0 -2
  279. package/dist/src/agent/embedded/session-tool-result-guard.js +0 -2
  280. package/dist/src/agent/embedded/sqlite-hydrating-session-manager.js +0 -2
  281. package/dist/src/agent/embedded/subscribe-session.js +0 -2
  282. package/dist/src/agent/embedded/system-prompt-override.js +0 -2
  283. package/dist/src/agent/embedded/tool-result-context-guard.js +0 -2
  284. package/dist/src/agent/embedded/tool-result-truncation.js +0 -2
  285. package/dist/src/agent/embedded/xopc-auth-storage.js +0 -2
  286. package/dist/src/agent/embedded/xopc-stream-bridge.js +0 -2
  287. package/dist/src/agent/embedded/xopc-tools-bridge.js +0 -2
  288. package/dist/src/agent/failover-error.js +0 -2
  289. package/dist/src/agent/fallback/candidates.js +0 -2
  290. package/dist/src/agent/fallback/reason.js +0 -2
  291. package/dist/src/agent/feedback/feedback-coordinator.js +0 -2
  292. package/dist/src/agent/goals/checklist-judge.js +0 -2
  293. package/dist/src/agent/goals/checklist-types.js +0 -2
  294. package/dist/src/agent/goals/evaluate-turn.js +0 -2
  295. package/dist/src/agent/goals/goal-locale.js +0 -2
  296. package/dist/src/agent/goals/judge.js +0 -2
  297. package/dist/src/agent/goals/persistent-goal-service.js +0 -2
  298. package/dist/src/agent/goals/post-turn.js +0 -2
  299. package/dist/src/agent/goals/state.js +0 -2
  300. package/dist/src/agent/image/generation/bundled-registry.js +0 -2
  301. package/dist/src/agent/image/generation/bundled.js +0 -2
  302. package/dist/src/agent/image/generation/image-assets.js +0 -2
  303. package/dist/src/agent/image/generation/model-ref.js +0 -2
  304. package/dist/src/agent/image/generation/normalization.js +0 -2
  305. package/dist/src/agent/image/generation/openai-compatible-image-provider.js +0 -2
  306. package/dist/src/agent/image/generation/provider-registry.js +0 -2
  307. package/dist/src/agent/image/generation/runtime.js +0 -2
  308. package/dist/src/agent/image/image-helpers.js +0 -2
  309. package/dist/src/agent/image/image-model-fallback.js +0 -2
  310. package/dist/src/agent/image/inbound-image-handling.js +0 -2
  311. package/dist/src/agent/image/load-image-media.js +0 -2
  312. package/dist/src/agent/image/tool-model-config.js +0 -2
  313. package/dist/src/agent/image/understanding/pi-ai-provider.js +0 -2
  314. package/dist/src/agent/image/understanding/provider-registry.js +0 -2
  315. package/dist/src/agent/image/understanding/runtime.js +0 -2
  316. package/dist/src/agent/image/vision-detection.js +0 -2
  317. package/dist/src/agent/inbound/attachment-pipeline.js +0 -2
  318. package/dist/src/agent/inbound/inbound-loop.js +0 -2
  319. package/dist/src/agent/inbound/turn-dispatcher.js +0 -2
  320. package/dist/src/agent/ipc/bus.js +0 -2
  321. package/dist/src/agent/ipc/inbox.js +0 -2
  322. package/dist/src/agent/ipc/socket.js +0 -2
  323. package/dist/src/agent/ipc/types.js +0 -2
  324. package/dist/src/agent/lifecycle/handlers/compaction.js +0 -2
  325. package/dist/src/agent/lifecycle/hook-handler.js +0 -2
  326. package/dist/src/agent/lifecycle/manager.js +0 -2
  327. package/dist/src/agent/lifecycle/progress.js +0 -2
  328. package/dist/src/agent/lifecycle/timeout-wrapper.js +0 -2
  329. package/dist/src/agent/lifecycle/typing.js +0 -2
  330. package/dist/src/agent/mcp/bundle-mcp-config.js +0 -2
  331. package/dist/src/agent/mcp/bundle-mcp-materialize.js +0 -2
  332. package/dist/src/agent/mcp/bundle-mcp-names.js +0 -2
  333. package/dist/src/agent/mcp/bundle-mcp-policy.js +0 -2
  334. package/dist/src/agent/mcp/bundle-mcp-runtime.js +0 -2
  335. package/dist/src/agent/mcp/embedded-mcp.js +0 -2
  336. package/dist/src/agent/mcp/mcp-config-shared.js +0 -2
  337. package/dist/src/agent/mcp/mcp-http.js +0 -2
  338. package/dist/src/agent/mcp/mcp-stdio-transport.js +0 -2
  339. package/dist/src/agent/mcp/mcp-stdio.js +0 -2
  340. package/dist/src/agent/mcp/mcp-tool-meta.js +0 -2
  341. package/dist/src/agent/mcp/mcp-transport-config.js +0 -2
  342. package/dist/src/agent/mcp/mcp-transport.js +0 -2
  343. package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js +0 -2
  344. package/dist/src/agent/media-generation/model-ref.js +0 -2
  345. package/dist/src/agent/media-generation/normalization.types.js +0 -2
  346. package/dist/src/agent/media-generation/runtime-shared.js +0 -2
  347. package/dist/src/agent/memory/agent-message-access.js +0 -2
  348. package/dist/src/agent/memory/builtin-memory-store.js +0 -2
  349. package/dist/src/agent/memory/builtin-provider.js +0 -2
  350. package/dist/src/agent/memory/compaction.js +0 -2
  351. package/dist/src/agent/memory/context/planner.js +0 -2
  352. package/dist/src/agent/memory/context-fence.js +0 -2
  353. package/dist/src/agent/memory/create-memory-manager.js +0 -2
  354. package/dist/src/agent/memory/dreaming/config.js +0 -2
  355. package/dist/src/agent/memory/dreaming/constants.js +0 -2
  356. package/dist/src/agent/memory/dreaming/deep-promotion.js +0 -2
  357. package/dist/src/agent/memory/dreaming/events.js +0 -2
  358. package/dist/src/agent/memory/dreaming/last-run.js +0 -2
  359. package/dist/src/agent/memory/dreaming/light-sweep.js +0 -2
  360. package/dist/src/agent/memory/dreaming/preview.js +0 -2
  361. package/dist/src/agent/memory/dreaming/promotion-lifecycle.js +0 -2
  362. package/dist/src/agent/memory/dreaming/rem-patterns.js +0 -2
  363. package/dist/src/agent/memory/dreaming/scope.js +0 -2
  364. package/dist/src/agent/memory/dreaming/short-term-store.js +0 -2
  365. package/dist/src/agent/memory/dreaming/utils.js +0 -2
  366. package/dist/src/agent/memory/lifecycle.js +0 -2
  367. package/dist/src/agent/memory/manager.js +0 -2
  368. package/dist/src/agent/memory/memory-config.js +0 -2
  369. package/dist/src/agent/memory/message-sanitizer.js +0 -2
  370. package/dist/src/agent/memory/plugin-discovery.js +0 -2
  371. package/dist/src/agent/memory/sensitivity.js +0 -2
  372. package/dist/src/agent/memory/source-origin.js +0 -2
  373. package/dist/src/agent/memory/stub-memory-provider.js +0 -2
  374. package/dist/src/agent/memory/summary-generator.js +0 -2
  375. package/dist/src/agent/memory/understanding/correction.js +0 -2
  376. package/dist/src/agent/memory/understanding/quality.js +0 -2
  377. package/dist/src/agent/memory/understanding/service.js +0 -2
  378. package/dist/src/agent/memory/user-context-coordinator.js +0 -2
  379. package/dist/src/agent/memory/user-message-text.js +0 -2
  380. package/dist/src/agent/memory/window.js +0 -2
  381. package/dist/src/agent/messaging/command-handler.js +0 -2
  382. package/dist/src/agent/messaging/message-router.js +0 -2
  383. package/dist/src/agent/messaging/outbound-coordinator.js +0 -2
  384. package/dist/src/agent/messaging/stream-manager.js +0 -2
  385. package/dist/src/agent/middleware/context.js +0 -2
  386. package/dist/src/agent/middleware/self-verify.js +0 -2
  387. package/dist/src/agent/models/manager.js +0 -2
  388. package/dist/src/agent/models/request-limiter.js +0 -2
  389. package/dist/src/agent/models/selection.js +0 -2
  390. package/dist/src/agent/orchestration/agent-event-handler.js +0 -2
  391. package/dist/src/agent/orchestration/agent-orchestrator.js +0 -2
  392. package/dist/src/agent/orchestration/llm-turn-retry.js +0 -2
  393. package/dist/src/agent/orchestration/loop-guard.js +0 -2
  394. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +0 -2
  395. package/dist/src/agent/prompt/cache-boundary.js +0 -2
  396. package/dist/src/agent/prompt/memory/index.js +0 -2
  397. package/dist/src/agent/prompt/safety.js +0 -2
  398. package/dist/src/agent/prompt/sanitize-for-prompt.js +0 -2
  399. package/dist/src/agent/prompt/sections/behavior.js +0 -2
  400. package/dist/src/agent/prompt/sections/memory-skills.js +0 -2
  401. package/dist/src/agent/prompt/sections/messaging-runtime.js +0 -2
  402. package/dist/src/agent/prompt/sections/project-context.js +0 -2
  403. package/dist/src/agent/prompt/sections/tooling.js +0 -2
  404. package/dist/src/agent/prompt/sections/workspace-runtime.js +0 -2
  405. package/dist/src/agent/prompt/service-prompt-builder.js +0 -2
  406. package/dist/src/agent/prompt/subagent-context.js +0 -2
  407. package/dist/src/agent/prompt/system-prompt-params.js +0 -2
  408. package/dist/src/agent/prompt/system-prompt.js +0 -2
  409. package/dist/src/agent/prompt/system-reminder.js +0 -2
  410. package/dist/src/agent/reply/apply-turn-user-enrichment.js +0 -2
  411. package/dist/src/agent/reply/post-compaction-context.js +0 -2
  412. package/dist/src/agent/reply/startup-context.js +0 -2
  413. package/dist/src/agent/reply/workspace-boundary-read.js +0 -2
  414. package/dist/src/agent/sandbox/command-validator.js +0 -2
  415. package/dist/src/agent/sandbox/exec-policy.js +0 -2
  416. package/dist/src/agent/sandbox/path-policy.js +0 -2
  417. package/dist/src/agent/sandbox/sanitize-env-vars.js +0 -2
  418. package/dist/src/agent/sandbox/types.js +0 -2
  419. package/dist/src/agent/service/async-queue.js +0 -2
  420. package/dist/src/agent/service/btw-query.js +0 -2
  421. package/dist/src/agent/service/build-direct-message-content.js +0 -2
  422. package/dist/src/agent/service/direct-turn-helpers.js +0 -2
  423. package/dist/src/agent/service/parse-outbound-session-key.js +0 -2
  424. package/dist/src/agent/service/process-direct-one-shot.js +0 -2
  425. package/dist/src/agent/service/process-direct-streaming.js +0 -2
  426. package/dist/src/agent/service/session-context-report.js +0 -2
  427. package/dist/src/agent/service/webchat-tts.js +0 -2
  428. package/dist/src/agent/service-inbound-utils.js +0 -2
  429. package/dist/src/agent/service.js +0 -2
  430. package/dist/src/agent/session/session-config-service.js +0 -2
  431. package/dist/src/agent/session/session-context.js +0 -2
  432. package/dist/src/agent/session/session-hydrator.js +0 -2
  433. package/dist/src/agent/session/session-inspector.js +0 -2
  434. package/dist/src/agent/session/session-lifecycle.js +0 -2
  435. package/dist/src/agent/session/session-state-bag.js +0 -2
  436. package/dist/src/agent/session/tracker.js +0 -2
  437. package/dist/src/agent/skills/config.js +0 -2
  438. package/dist/src/agent/skills/filesystem-watcher.js +0 -2
  439. package/dist/src/agent/skills/format-skills-prompt.js +0 -2
  440. package/dist/src/agent/skills/hub-hash.js +0 -2
  441. package/dist/src/agent/skills/hub-lock.js +0 -2
  442. package/dist/src/agent/skills/hub-pull.js +0 -2
  443. package/dist/src/agent/skills/index.js +0 -2
  444. package/dist/src/agent/skills/install-target.js +0 -2
  445. package/dist/src/agent/skills/installer.js +0 -2
  446. package/dist/src/agent/skills/managed-store.js +0 -2
  447. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +0 -2
  448. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +0 -2
  449. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +0 -2
  450. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +0 -2
  451. package/dist/src/agent/skills/marketplace/marketplace-category-order.js +0 -2
  452. package/dist/src/agent/skills/marketplace/registry.js +0 -2
  453. package/dist/src/agent/skills/marketplace/resolve-adapter.js +0 -2
  454. package/dist/src/agent/skills/parse-skill-metadata.js +0 -2
  455. package/dist/src/agent/skills/required-env-vars.js +0 -2
  456. package/dist/src/agent/skills/scanner.js +0 -2
  457. package/dist/src/agent/skills/skill-manage-ops.js +0 -2
  458. package/dist/src/agent/skills/skill-manager.js +0 -2
  459. package/dist/src/agent/skills/skill-markdown-preview-from-raw.js +0 -2
  460. package/dist/src/agent/skills/skill-tool-gating.js +0 -2
  461. package/dist/src/agent/skills/skill-view-path.js +0 -2
  462. package/dist/src/agent/skills/skills-marketplace.js +0 -2
  463. package/dist/src/agent/skills/test-framework.js +0 -2
  464. package/dist/src/agent/skills/watcher.js +0 -2
  465. package/dist/src/agent/skills/workspace-skills-dir.js +0 -2
  466. package/dist/src/agent/source-context/injector.js +0 -2
  467. package/dist/src/agent/source-context/types.js +0 -2
  468. package/dist/src/agent/starter-agents.js +0 -2
  469. package/dist/src/agent/streaming/reasoning-visibility-sse.js +0 -2
  470. package/dist/src/agent/tool-manuals/browser.js +0 -2
  471. package/dist/src/agent/tool-manuals/index.js +0 -2
  472. package/dist/src/agent/tool-manuals/xopc-use.js +0 -2
  473. package/dist/src/agent/tools/apply-patch.js +0 -2
  474. package/dist/src/agent/tools/automation-tool.js +0 -2
  475. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +0 -2
  476. package/dist/src/agent/tools/browser/tool/schemas.js +0 -2
  477. package/dist/src/agent/tools/chain-tracker.js +0 -2
  478. package/dist/src/agent/tools/clarify-tool.js +0 -2
  479. package/dist/src/agent/tools/cli-clarify.js +0 -2
  480. package/dist/src/agent/tools/communication.js +0 -2
  481. package/dist/src/agent/tools/composio-tool.js +0 -2
  482. package/dist/src/agent/tools/concurrency.js +0 -2
  483. package/dist/src/agent/tools/create-share-tool.js +0 -2
  484. package/dist/src/agent/tools/curated-memory-tool.js +0 -2
  485. package/dist/src/agent/tools/delegate-tool.js +0 -2
  486. package/dist/src/agent/tools/desktop-pet-tool.d.ts +12 -0
  487. package/dist/src/agent/tools/desktop-pet-tool.js +28 -2
  488. package/dist/src/agent/tools/dreaming-tool.js +0 -2
  489. package/dist/src/agent/tools/edit-diff.js +0 -2
  490. package/dist/src/agent/tools/error-pattern-matcher.js +0 -2
  491. package/dist/src/agent/tools/error-tracker.js +0 -2
  492. package/dist/src/agent/tools/exec-command.js +0 -2
  493. package/dist/src/agent/tools/execute-code-tool.js +0 -2
  494. package/dist/src/agent/tools/executor.js +0 -2
  495. package/dist/src/agent/tools/factory.js +0 -2
  496. package/dist/src/agent/tools/find.js +0 -2
  497. package/dist/src/agent/tools/goal-evidence-recorder.js +0 -2
  498. package/dist/src/agent/tools/goal-tool.js +0 -2
  499. package/dist/src/agent/tools/grep.js +0 -2
  500. package/dist/src/agent/tools/image-generate-tool.js +0 -2
  501. package/dist/src/agent/tools/image-tool.js +0 -2
  502. package/dist/src/agent/tools/list-dir.js +0 -2
  503. package/dist/src/agent/tools/media-read-tool.js +0 -2
  504. package/dist/src/agent/tools/memory-tool.js +0 -2
  505. package/dist/src/agent/tools/metadata.js +0 -2
  506. package/dist/src/agent/tools/read.js +0 -2
  507. package/dist/src/agent/tools/search/http.js +0 -2
  508. package/dist/src/agent/tools/search/providers/bing-api.js +0 -2
  509. package/dist/src/agent/tools/search/providers/bing-html.js +0 -2
  510. package/dist/src/agent/tools/search/providers/brave.js +0 -2
  511. package/dist/src/agent/tools/search/providers/duckduckgo-html.js +0 -2
  512. package/dist/src/agent/tools/search/providers/searxng.js +0 -2
  513. package/dist/src/agent/tools/search/providers/tavily.js +0 -2
  514. package/dist/src/agent/tools/search/region.js +0 -2
  515. package/dist/src/agent/tools/search/registry.js +0 -2
  516. package/dist/src/agent/tools/search/resolve-config.js +0 -2
  517. package/dist/src/agent/tools/send-media.js +0 -2
  518. package/dist/src/agent/tools/session-search-tool.js +0 -2
  519. package/dist/src/agent/tools/session-status-tool.js +0 -2
  520. package/dist/src/agent/tools/skill-install-tool.js +0 -2
  521. package/dist/src/agent/tools/skill-manage-tool.js +0 -2
  522. package/dist/src/agent/tools/skills-tools.js +0 -2
  523. package/dist/src/agent/tools/structured-output.js +0 -2
  524. package/dist/src/agent/tools/todo-tool.js +0 -2
  525. package/dist/src/agent/tools/tool-manual-tool.js +0 -2
  526. package/dist/src/agent/tools/tool-paths.js +0 -2
  527. package/dist/src/agent/tools/truncate.js +0 -2
  528. package/dist/src/agent/tools/tts-tool.js +0 -2
  529. package/dist/src/agent/tools/update-plan-tool.js +0 -2
  530. package/dist/src/agent/tools/url-safety.js +0 -2
  531. package/dist/src/agent/tools/usage-analyzer.js +0 -2
  532. package/dist/src/agent/tools/web-extract.js +0 -2
  533. package/dist/src/agent/tools/web.js +4 -4
  534. package/dist/src/agent/tools/workflow-tool.js +0 -2
  535. package/dist/src/agent/tools/write.js +0 -2
  536. package/dist/src/agent/tools/xopc-use-tool.js +0 -2
  537. package/dist/src/agent/transcript/google-api.js +0 -2
  538. package/dist/src/agent/transcript/model-selection.js +0 -2
  539. package/dist/src/agent/transcript/provider-capabilities.js +0 -2
  540. package/dist/src/agent/transcript/session-transcript-repair.js +0 -2
  541. package/dist/src/agent/transcript/strip-tool-messages.js +0 -2
  542. package/dist/src/agent/transcript/thinking-types.js +0 -2
  543. package/dist/src/agent/transcript/thinking.js +0 -2
  544. package/dist/src/agent/transcript/tool-call-id.js +0 -2
  545. package/dist/src/agent/transcript/transcript-hygiene.js +0 -2
  546. package/dist/src/agent/transcript/transcript-policy.js +0 -2
  547. package/dist/src/agent/workflow/agent-progress.js +0 -2
  548. package/dist/src/agent/workflow/builtins/index.js +0 -2
  549. package/dist/src/agent/workflow/catalog.js +0 -2
  550. package/dist/src/agent/workflow/progress-broker.js +0 -2
  551. package/dist/src/agent/workflow/snapshot-empty.js +0 -2
  552. package/dist/src/agent/workflow/snapshot.js +0 -2
  553. package/dist/src/agent/workflow/step-labels.js +0 -2
  554. package/dist/src/agent/workflow/structured-output-tool.js +0 -2
  555. package/dist/src/agent/workflow/subagent-runner.js +0 -2
  556. package/dist/src/agent/workflow/workflow-child-tools.js +0 -2
  557. package/dist/src/agent/workspace-runtime/registry.js +0 -2
  558. package/dist/src/agent-manifest/index.js +0 -2
  559. package/dist/src/agent-manifest/preset-chain.js +0 -2
  560. package/dist/src/agent-manifest/prompt.js +0 -2
  561. package/dist/src/agent-manifest/resolver.js +0 -2
  562. package/dist/src/agent-manifest/schema.js +0 -2
  563. package/dist/src/agent-manifest/validator.js +0 -2
  564. package/dist/src/agent-runtime/boundary-guard.js +0 -2
  565. package/dist/src/agent-runtime/memory-runtime.js +0 -2
  566. package/dist/src/agent-runtime/model-router.js +0 -2
  567. package/dist/src/agent-runtime/run-trace.js +0 -2
  568. package/dist/src/agent-runtime/runtime-profile.js +0 -2
  569. package/dist/src/agent-runtime/tool-registry.js +0 -2
  570. package/dist/src/agent-runtime/workflow-runtime.js +0 -2
  571. package/dist/src/ai-assist/text-assist.js +0 -2
  572. package/dist/src/auth/credentials.js +0 -2
  573. package/dist/src/auth/index.js +0 -2
  574. package/dist/src/auth/oauth/anthropic.js +0 -2
  575. package/dist/src/auth/oauth/github-copilot.js +0 -2
  576. package/dist/src/auth/oauth/google-oauth/google-antigravity.js +0 -2
  577. package/dist/src/auth/oauth/google-oauth/google-gemini-cli.js +0 -2
  578. package/dist/src/auth/oauth/google-oauth/oauth-page.js +0 -2
  579. package/dist/src/auth/oauth/google-oauth/pkce.js +0 -2
  580. package/dist/src/auth/oauth/kimi-coding.js +0 -2
  581. package/dist/src/auth/oauth/minimax-cn.js +0 -2
  582. package/dist/src/auth/oauth/minimax.js +0 -2
  583. package/dist/src/auth/oauth/openai-codex.js +0 -2
  584. package/dist/src/auth/oauth/pkce.js +0 -2
  585. package/dist/src/auth/profiles/oauth.js +0 -2
  586. package/dist/src/auth/profiles/order.js +0 -2
  587. package/dist/src/auth/profiles/profiles.js +0 -2
  588. package/dist/src/auth/profiles/store.js +0 -2
  589. package/dist/src/auth/sync-provider-auth.js +0 -2
  590. package/dist/src/automations/api/routes.js +0 -2
  591. package/dist/src/automations/domain/schedule.js +0 -2
  592. package/dist/src/automations/domain/validation.js +0 -2
  593. package/dist/src/automations/draft/automation-draft-prompt.js +0 -2
  594. package/dist/src/automations/draft/automation-draft-service.js +0 -2
  595. package/dist/src/automations/draft/automation-draft-validator.js +0 -2
  596. package/dist/src/automations/product-events.js +0 -2
  597. package/dist/src/automations/service/action-executor.js +0 -2
  598. package/dist/src/automations/service/automation-service.js +0 -2
  599. package/dist/src/automations/storage/automation-repository.js +0 -2
  600. package/dist/src/automations/storage/automation-run-repository.js +0 -2
  601. package/dist/src/browser/actions/extension-registry-bridge.js +0 -2
  602. package/dist/src/browser/actions/registry.js +0 -2
  603. package/dist/src/browser/backend-from-config.js +0 -2
  604. package/dist/src/browser/browser-command-timeout.js +0 -2
  605. package/dist/src/browser/cache-dir-policy.js +0 -2
  606. package/dist/src/browser/cdp-local-launcher.js +0 -2
  607. package/dist/src/browser/cdp-supervisor.js +0 -2
  608. package/dist/src/browser/free-port.js +0 -2
  609. package/dist/src/browser/humanize.js +0 -2
  610. package/dist/src/browser/install-lock.js +0 -2
  611. package/dist/src/browser/manager.js +0 -2
  612. package/dist/src/browser/pipeline/output.js +0 -2
  613. package/dist/src/browser/pipeline/runner.js +0 -2
  614. package/dist/src/browser/pipeline/schema.js +0 -2
  615. package/dist/src/browser/pipeline/source.js +0 -2
  616. package/dist/src/browser/pipeline/template.js +0 -2
  617. package/dist/src/browser/providers/browser-ext-install.js +0 -2
  618. package/dist/src/browser/providers/browser-use.js +0 -2
  619. package/dist/src/browser/providers/browserbase.js +0 -2
  620. package/dist/src/browser/providers/cloakbrowser.js +0 -2
  621. package/dist/src/browser/providers/extension-ws-acquire.js +0 -2
  622. package/dist/src/browser/providers/extension.js +0 -2
  623. package/dist/src/browser/providers/playwright-doctor.js +13 -4
  624. package/dist/src/browser/providers/playwright-install.js +0 -2
  625. package/dist/src/browser/readiness.js +0 -2
  626. package/dist/src/browser/schemas.js +0 -2
  627. package/dist/src/browser/session-lifecycle.js +0 -2
  628. package/dist/src/browser/snapshot-helpers.js +0 -2
  629. package/dist/src/browser/stealth.js +0 -2
  630. package/dist/src/browser/url-policy.js +0 -2
  631. package/dist/src/capabilities/store-connector.js +0 -2
  632. package/dist/src/channels/attachments/attachment-classifiers.js +0 -2
  633. package/dist/src/channels/attachments/inbound-persist.js +0 -2
  634. package/dist/src/channels/attachments/inbound-types.js +0 -2
  635. package/dist/src/channels/attachments/outbound-tts-persist.js +0 -2
  636. package/dist/src/channels/attachments/voice-stt-webchat.js +0 -2
  637. package/dist/src/channels/catalog/channel-catalog-service.js +0 -2
  638. package/dist/src/channels/config-helpers.js +0 -2
  639. package/dist/src/channels/envelope-timestamp.js +0 -2
  640. package/dist/src/channels/exec-approval-runtime.js +0 -2
  641. package/dist/src/channels/health-monitor.js +0 -2
  642. package/dist/src/channels/heartbeat-scheduler.js +0 -2
  643. package/dist/src/channels/internal-outbound.js +0 -2
  644. package/dist/src/channels/lifecycle-supervisor.js +0 -2
  645. package/dist/src/channels/manager.js +0 -2
  646. package/dist/src/channels/media.js +0 -2
  647. package/dist/src/channels/outbound/deliver.js +0 -2
  648. package/dist/src/channels/outbound/normalize.js +0 -2
  649. package/dist/src/channels/outbound/persist-store.js +0 -2
  650. package/dist/src/channels/outbound/queue.js +0 -2
  651. package/dist/src/channels/outbound-sender.js +0 -2
  652. package/dist/src/channels/pairing/allow-from-file.js +0 -2
  653. package/dist/src/channels/pairing/approve-cli.js +0 -2
  654. package/dist/src/channels/pairing/pairing-challenge.js +0 -2
  655. package/dist/src/channels/pairing/pairing-constants.js +0 -2
  656. package/dist/src/channels/pairing/pairing-events.js +0 -2
  657. package/dist/src/channels/pairing/pairing-messages.js +0 -2
  658. package/dist/src/channels/pairing/pairing-service.js +0 -2
  659. package/dist/src/channels/pairing/pairing-store-adapter.js +0 -2
  660. package/dist/src/channels/pairing/pairing-store.js +0 -2
  661. package/dist/src/channels/pairing/paths.js +0 -2
  662. package/dist/src/channels/pairing/preseed-allow-from.js +0 -2
  663. package/dist/src/channels/pipeline.js +0 -2
  664. package/dist/src/channels/plugin-registry.js +0 -2
  665. package/dist/src/channels/plugins/registry.js +0 -2
  666. package/dist/src/channels/restart-policy.js +0 -2
  667. package/dist/src/channels/security-helpers.js +0 -2
  668. package/dist/src/channels/security.js +0 -2
  669. package/dist/src/channels/setup-wizard-discovery.js +0 -2
  670. package/dist/src/chat-commands/agent-edit.js +0 -2
  671. package/dist/src/chat-commands/builtins/config.js +0 -2
  672. package/dist/src/chat-commands/builtins/context.js +0 -2
  673. package/dist/src/chat-commands/builtins/goal.js +0 -2
  674. package/dist/src/chat-commands/builtins/model.js +0 -2
  675. package/dist/src/chat-commands/builtins/review.js +0 -2
  676. package/dist/src/chat-commands/builtins/session.js +0 -2
  677. package/dist/src/chat-commands/builtins/skill.js +0 -2
  678. package/dist/src/chat-commands/builtins/subgoal.js +0 -2
  679. package/dist/src/chat-commands/builtins/system.js +0 -2
  680. package/dist/src/chat-commands/builtins/thinking.js +0 -2
  681. package/dist/src/chat-commands/builtins/tts.js +0 -2
  682. package/dist/src/chat-commands/builtins/workflow.js +0 -2
  683. package/dist/src/chat-commands/command-parse.js +0 -2
  684. package/dist/src/chat-commands/config-paths.js +0 -2
  685. package/dist/src/chat-commands/config-value.js +0 -2
  686. package/dist/src/chat-commands/context.js +0 -2
  687. package/dist/src/chat-commands/format-output.js +0 -2
  688. package/dist/src/chat-commands/index.js +0 -2
  689. package/dist/src/chat-commands/processor.js +0 -2
  690. package/dist/src/chat-commands/registry.js +0 -2
  691. package/dist/src/chat-commands/session-key.js +0 -2
  692. package/dist/src/cli/argv-invocation.js +0 -2
  693. package/dist/src/cli/argv.js +0 -2
  694. package/dist/src/cli/bin.js +0 -2
  695. package/dist/src/cli/cli-log-level-preset.js +0 -2
  696. package/dist/src/cli/command-catalog.js +0 -2
  697. package/dist/src/cli/command-loaders.js +0 -2
  698. package/dist/src/cli/command-manifest.js +0 -2
  699. package/dist/src/cli/command-path-matches.js +0 -2
  700. package/dist/src/cli/command-path-policy.js +0 -2
  701. package/dist/src/cli/command-startup-policy.js +0 -2
  702. package/dist/src/cli/commands/agent/interactive.js +0 -2
  703. package/dist/src/cli/commands/agent/sessions.js +0 -2
  704. package/dist/src/cli/commands/agent/stream-renderer.js +0 -2
  705. package/dist/src/cli/commands/agent.js +0 -2
  706. package/dist/src/cli/commands/agents.js +0 -2
  707. package/dist/src/cli/commands/auth.js +0 -2
  708. package/dist/src/cli/commands/browser-cli-helpers.js +0 -2
  709. package/dist/src/cli/commands/browser.js +0 -2
  710. package/dist/src/cli/commands/channels.js +0 -2
  711. package/dist/src/cli/commands/config.js +0 -2
  712. package/dist/src/cli/commands/connectors.js +0 -2
  713. package/dist/src/cli/commands/doctor/checks/channel-config.js +0 -2
  714. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js +0 -2
  715. package/dist/src/cli/commands/doctor/checks/channel-plugins.js +0 -2
  716. package/dist/src/cli/commands/doctor/checks/config-health.js +0 -2
  717. package/dist/src/cli/commands/doctor/checks/database-schema.js +0 -2
  718. package/dist/src/cli/commands/doctor/checks/gateway-health.js +0 -2
  719. package/dist/src/cli/commands/doctor/checks/gateway-service.js +0 -2
  720. package/dist/src/cli/commands/doctor/checks/migrations.js +0 -2
  721. package/dist/src/cli/commands/doctor/checks/node-version.js +0 -2
  722. package/dist/src/cli/commands/doctor/checks/provider-auth.js +0 -2
  723. package/dist/src/cli/commands/doctor/checks/security-audit.js +0 -2
  724. package/dist/src/cli/commands/doctor/checks/session-integrity.js +0 -2
  725. package/dist/src/cli/commands/doctor/checks/state-integrity.js +0 -2
  726. package/dist/src/cli/commands/doctor/checks/version-check.js +0 -2
  727. package/dist/src/cli/commands/doctor/checks/workspace-status.js +0 -2
  728. package/dist/src/cli/commands/doctor/flow.js +0 -2
  729. package/dist/src/cli/commands/doctor/format.js +0 -2
  730. package/dist/src/cli/commands/doctor/index.js +0 -2
  731. package/dist/src/cli/commands/extension-create.js +0 -2
  732. package/dist/src/cli/commands/extension-dev.js +0 -2
  733. package/dist/src/cli/commands/extension-marketplace.js +0 -2
  734. package/dist/src/cli/commands/extension-pack.js +0 -2
  735. package/dist/src/cli/commands/extension.js +0 -2
  736. package/dist/src/cli/commands/gateway/call.js +0 -2
  737. package/dist/src/cli/commands/gateway/health.js +0 -2
  738. package/dist/src/cli/commands/gateway/lifecycle-core.js +0 -2
  739. package/dist/src/cli/commands/gateway/lifecycle.js +0 -2
  740. package/dist/src/cli/commands/gateway/logs.js +0 -2
  741. package/dist/src/cli/commands/gateway/probe.js +0 -2
  742. package/dist/src/cli/commands/gateway/restart-health.js +0 -2
  743. package/dist/src/cli/commands/gateway/restart.js +0 -2
  744. package/dist/src/cli/commands/gateway/run-foreground.js +0 -2
  745. package/dist/src/cli/commands/gateway/service.js +0 -2
  746. package/dist/src/cli/commands/gateway/shared.js +0 -2
  747. package/dist/src/cli/commands/gateway/status.js +0 -2
  748. package/dist/src/cli/commands/gateway/stop.js +0 -2
  749. package/dist/src/cli/commands/gateway/subcommands.js +0 -2
  750. package/dist/src/cli/commands/gateway/token.js +0 -2
  751. package/dist/src/cli/commands/gateway-ssh-tunnel.js +0 -2
  752. package/dist/src/cli/commands/gateway.js +0 -2
  753. package/dist/src/cli/commands/goal.js +0 -2
  754. package/dist/src/cli/commands/image.js +0 -2
  755. package/dist/src/cli/commands/init.js +0 -2
  756. package/dist/src/cli/commands/logs.js +0 -2
  757. package/dist/src/cli/commands/models.js +0 -2
  758. package/dist/src/cli/commands/onboard/channels/index.js +0 -2
  759. package/dist/src/cli/commands/onboard/channels/onboard-to-configurator.js +0 -2
  760. package/dist/src/cli/commands/onboard/channels/registry.js +0 -2
  761. package/dist/src/cli/commands/onboard/channels/wizard-to-configurator.js +0 -2
  762. package/dist/src/cli/commands/onboard/gateway.js +0 -2
  763. package/dist/src/cli/commands/onboard/model.js +0 -2
  764. package/dist/src/cli/commands/onboard.js +0 -2
  765. package/dist/src/cli/commands/profile.js +0 -2
  766. package/dist/src/cli/commands/project.js +0 -2
  767. package/dist/src/cli/commands/providers.js +0 -2
  768. package/dist/src/cli/commands/resume.js +0 -2
  769. package/dist/src/cli/commands/search.js +0 -2
  770. package/dist/src/cli/commands/session/actions.js +0 -2
  771. package/dist/src/cli/commands/session/utils.js +0 -2
  772. package/dist/src/cli/commands/session.js +0 -2
  773. package/dist/src/cli/commands/setup-shared/output.js +0 -2
  774. package/dist/src/cli/commands/setup-shared/prompts.js +0 -2
  775. package/dist/src/cli/commands/setup-shared/runner.js +0 -2
  776. package/dist/src/cli/commands/setup-shared/types.js +0 -2
  777. package/dist/src/cli/commands/setup.js +0 -2
  778. package/dist/src/cli/commands/skills-test.js +0 -2
  779. package/dist/src/cli/commands/skills.js +0 -2
  780. package/dist/src/cli/commands/tailscale.js +0 -2
  781. package/dist/src/cli/commands/tui-runner.js +0 -2
  782. package/dist/src/cli/commands/tui.js +0 -2
  783. package/dist/src/cli/commands/tunnel.js +0 -2
  784. package/dist/src/cli/commands/update.js +0 -2
  785. package/dist/src/cli/commands/voice.js +0 -2
  786. package/dist/src/cli/context.js +0 -2
  787. package/dist/src/cli/extension-cli-register.js +0 -2
  788. package/dist/src/cli/gateway-run-argv.js +0 -2
  789. package/dist/src/cli/gateway-run-fast-path.js +0 -2
  790. package/dist/src/cli/index.js +0 -2
  791. package/dist/src/cli/registry.js +0 -2
  792. package/dist/src/cli/templates.js +0 -2
  793. package/dist/src/cli/utils/colors.js +0 -2
  794. package/dist/src/cli/utils/gateway-client-options.js +0 -2
  795. package/dist/src/cli/utils/gateway-client.js +0 -2
  796. package/dist/src/cli/utils/init-workspace-core.js +0 -2
  797. package/dist/src/cli/utils/init-workspace.js +0 -2
  798. package/dist/src/cli/utils/oauth-login.js +0 -2
  799. package/dist/src/cli/utils/oauth-providers.js +0 -2
  800. package/dist/src/cli/utils/session.js +0 -2
  801. package/dist/src/commands/agents.config.js +0 -2
  802. package/dist/src/config/agent-profile.js +0 -2
  803. package/dist/src/config/agent-typed-models.js +0 -2
  804. package/dist/src/config/commands.flags.js +0 -2
  805. package/dist/src/config/default-model.js +0 -2
  806. package/dist/src/config/diff.js +0 -2
  807. package/dist/src/config/gateway-bind.js +0 -2
  808. package/dist/src/config/index.js +0 -2
  809. package/dist/src/config/loader.js +0 -2
  810. package/dist/src/config/mcp-config-normalize.js +0 -2
  811. package/dist/src/config/model-input.js +0 -2
  812. package/dist/src/config/models-json.js +0 -2
  813. package/dist/src/config/paths-state.js +0 -2
  814. package/dist/src/config/paths.js +0 -2
  815. package/dist/src/config/profile.js +0 -2
  816. package/dist/src/config/public-url.js +0 -2
  817. package/dist/src/config/reload.js +0 -2
  818. package/dist/src/config/resolve-config-value.js +0 -2
  819. package/dist/src/config/rules.js +0 -2
  820. package/dist/src/config/runtime-overrides.js +0 -2
  821. package/dist/src/config/schema.js +0 -2
  822. package/dist/src/config/validate-channel-configs.js +0 -2
  823. package/dist/src/config/voice.js +0 -2
  824. package/dist/src/config/web-patch.js +0 -2
  825. package/dist/src/config/workspace-defaults.js +0 -2
  826. package/dist/src/config/workspace-dirs.js +0 -2
  827. package/dist/src/config/workspace-path-helpers.js +0 -2
  828. package/dist/src/config/workspace-path.js +0 -2
  829. package/dist/src/connectors/approval.js +0 -2
  830. package/dist/src/connectors/auth-provider-registry.js +0 -2
  831. package/dist/src/connectors/builtin-catalog.js +0 -2
  832. package/dist/src/connectors/catalog.js +0 -2
  833. package/dist/src/connectors/composio-catalog.js +0 -2
  834. package/dist/src/connectors/composio-logo.js +0 -2
  835. package/dist/src/connectors/composio-sessions.js +9 -5
  836. package/dist/src/connectors/composio-triggers.js +0 -2
  837. package/dist/src/connectors/composio.js +0 -2
  838. package/dist/src/connectors/connector-memory-sync.js +0 -2
  839. package/dist/src/connectors/health.js +0 -2
  840. package/dist/src/connectors/install.js +0 -2
  841. package/dist/src/connectors/instances.js +0 -2
  842. package/dist/src/connectors/integration-strategy.js +0 -2
  843. package/dist/src/connectors/lifecycle.js +0 -2
  844. package/dist/src/connectors/materialize.js +0 -2
  845. package/dist/src/connectors/policy.js +0 -2
  846. package/dist/src/connectors/providers.js +0 -2
  847. package/dist/src/connectors/registries/modelscope.js +0 -2
  848. package/dist/src/connectors/registries/official-mcp.js +0 -2
  849. package/dist/src/connectors/registries/search.js +0 -2
  850. package/dist/src/connectors/registries/smithery.js +0 -2
  851. package/dist/src/connectors/runtime-adapter-registry.js +0 -2
  852. package/dist/src/connectors/secret-store.js +0 -2
  853. package/dist/src/connectors/setup-secrets.js +0 -2
  854. package/dist/src/connectors/supervisor.js +0 -2
  855. package/dist/src/connectors/usage.js +0 -2
  856. package/dist/src/connectors/workflow-preflight.js +0 -2
  857. package/dist/src/daemon/constants.js +0 -2
  858. package/dist/src/daemon/install-plan.js +0 -2
  859. package/dist/src/daemon/launchd.js +0 -2
  860. package/dist/src/daemon/schtasks.js +0 -2
  861. package/dist/src/daemon/service-audit.js +0 -2
  862. package/dist/src/daemon/service.js +0 -2
  863. package/dist/src/daemon/systemd.js +0 -2
  864. package/dist/src/document-understanding/extract.js +0 -2
  865. package/dist/src/errors/index.js +0 -2
  866. package/dist/src/extensions/activation-context.js +0 -2
  867. package/dist/src/extensions/activation-planner.js +0 -2
  868. package/dist/src/extensions/api.js +0 -2
  869. package/dist/src/extensions/bundle-mcp.js +0 -2
  870. package/dist/src/extensions/bundled-extension-activation.js +0 -2
  871. package/dist/src/extensions/diagnostics.js +0 -2
  872. package/dist/src/extensions/discover-extensions.js +0 -2
  873. package/dist/src/extensions/engine-check.js +0 -2
  874. package/dist/src/extensions/extension-metadata-snapshot.js +0 -2
  875. package/dist/src/extensions/extension-registry-impl.js +0 -2
  876. package/dist/src/extensions/health.js +0 -2
  877. package/dist/src/extensions/hooks.js +0 -2
  878. package/dist/src/extensions/index.js +0 -2
  879. package/dist/src/extensions/install-transaction.js +0 -2
  880. package/dist/src/extensions/install.js +0 -2
  881. package/dist/src/extensions/loader.js +0 -2
  882. package/dist/src/extensions/lockfile.js +0 -2
  883. package/dist/src/extensions/manifest-registry.js +0 -2
  884. package/dist/src/extensions/marketplace.js +0 -2
  885. package/dist/src/extensions/media-provider-contracts.js +0 -2
  886. package/dist/src/extensions/normalize-manifest.js +0 -2
  887. package/dist/src/extensions/onboard-helpers.js +0 -2
  888. package/dist/src/extensions/package-contract.js +0 -2
  889. package/dist/src/extensions/sdk/channel-entry.js +0 -2
  890. package/dist/src/extensions/sdk/channel-helpers.js +0 -2
  891. package/dist/src/extensions/sdk/index.js +0 -2
  892. package/dist/src/extensions/sdk/lazy.js +0 -2
  893. package/dist/src/extensions/sdk/testing.js +0 -2
  894. package/dist/src/extensions/security.js +0 -2
  895. package/dist/src/extensions/slots.js +0 -2
  896. package/dist/src/extensions/speech-provider-contracts.js +0 -2
  897. package/dist/src/extensions/store-zip-limits.js +0 -2
  898. package/dist/src/extensions/typed-event-bus.js +0 -2
  899. package/dist/src/extensions/types/hooks.js +0 -2
  900. package/dist/src/extensions/types/providers.js +0 -2
  901. package/dist/src/extensions/update.js +0 -2
  902. package/dist/src/extensions/when-context.js +0 -2
  903. package/dist/src/extensions/when-expression.js +0 -2
  904. package/dist/src/gateway/agent-builtin-tools.js +0 -2
  905. package/dist/src/gateway/agent-run-relay.js +0 -2
  906. package/dist/src/gateway/agents-admin.js +0 -2
  907. package/dist/src/gateway/auth.js +0 -2
  908. package/dist/src/gateway/capability-presets-admin.js +0 -2
  909. package/dist/src/gateway/chat-limits.js +0 -2
  910. package/dist/src/gateway/chat-stream/mapper.js +28 -14
  911. package/dist/src/gateway/chat-stream/pet-feedback.d.ts +13 -0
  912. package/dist/src/gateway/chat-stream/pet-feedback.js +45 -0
  913. package/dist/src/gateway/chat-stream/protocol.d.ts +26 -0
  914. package/dist/src/gateway/clarify-bridge.js +3 -3
  915. package/dist/src/gateway/clarify-runtime.js +0 -2
  916. package/dist/src/gateway/client-ip.js +0 -2
  917. package/dist/src/gateway/config-tools-web.js +0 -2
  918. package/dist/src/gateway/credential.js +0 -2
  919. package/dist/src/gateway/discovery/mdns.js +0 -2
  920. package/dist/src/gateway/dreaming-automation-reconciler.js +0 -2
  921. package/dist/src/gateway/ensure-network-cors.js +0 -2
  922. package/dist/src/gateway/file-path-classifier.js +0 -2
  923. package/dist/src/gateway/file-reference-registry.js +0 -2
  924. package/dist/src/gateway/global-defaults-admin.js +0 -2
  925. package/dist/src/gateway/heartbeat/service.js +0 -2
  926. package/dist/src/gateway/hono/app.js +0 -2
  927. package/dist/src/gateway/hono/lib/agent-model.js +0 -2
  928. package/dist/src/gateway/hono/lib/config-payload.js +0 -2
  929. package/dist/src/gateway/hono/lib/extension-assets.js +0 -2
  930. package/dist/src/gateway/hono/lib/extension-store.js +0 -2
  931. package/dist/src/gateway/hono/lib/mask-secret-length.js +0 -2
  932. package/dist/src/gateway/hono/lib/route-logger.js +0 -2
  933. package/dist/src/gateway/hono/lib/safe-providers-config.js +0 -2
  934. package/dist/src/gateway/hono/lib/safe-voice-config.js +0 -2
  935. package/dist/src/gateway/hono/lib/startup-unavailable.js +0 -2
  936. package/dist/src/gateway/hono/lib/static-ui.js +0 -2
  937. package/dist/src/gateway/hono/middleware/auth.js +0 -2
  938. package/dist/src/gateway/hono/middleware/log-context.js +0 -2
  939. package/dist/src/gateway/hono/middleware/logger.js +0 -2
  940. package/dist/src/gateway/hono/middleware/route-errors.js +0 -2
  941. package/dist/src/gateway/hono/middleware/scopes.js +0 -2
  942. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +0 -2
  943. package/dist/src/gateway/hono/oauth-async.js +0 -2
  944. package/dist/src/gateway/hono/oauth.js +0 -2
  945. package/dist/src/gateway/hono/routes/activity.js +0 -2
  946. package/dist/src/gateway/hono/routes/agent-stream.js +0 -2
  947. package/dist/src/gateway/hono/routes/agents.js +0 -2
  948. package/dist/src/gateway/hono/routes/ai-assist.js +0 -2
  949. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +0 -2
  950. package/dist/src/gateway/hono/routes/browser-install.js +0 -2
  951. package/dist/src/gateway/hono/routes/browser.js +0 -2
  952. package/dist/src/gateway/hono/routes/capabilities.js +0 -2
  953. package/dist/src/gateway/hono/routes/capability-presets.js +0 -2
  954. package/dist/src/gateway/hono/routes/channels.js +0 -2
  955. package/dist/src/gateway/hono/routes/commands-skills.js +0 -2
  956. package/dist/src/gateway/hono/routes/config-patch/agents.js +0 -2
  957. package/dist/src/gateway/hono/routes/config-patch/channels.js +0 -2
  958. package/dist/src/gateway/hono/routes/config-patch/gateway.js +0 -2
  959. package/dist/src/gateway/hono/routes/config-patch/misc.js +0 -2
  960. package/dist/src/gateway/hono/routes/config-patch/result.js +0 -2
  961. package/dist/src/gateway/hono/routes/config.js +0 -2
  962. package/dist/src/gateway/hono/routes/connectors.js +0 -2
  963. package/dist/src/gateway/hono/routes/doctor.js +0 -2
  964. package/dist/src/gateway/hono/routes/dreaming.js +0 -2
  965. package/dist/src/gateway/hono/routes/exposure.js +0 -2
  966. package/dist/src/gateway/hono/routes/extension-gateway.js +0 -2
  967. package/dist/src/gateway/hono/routes/global-defaults.js +0 -2
  968. package/dist/src/gateway/hono/routes/goals.js +0 -2
  969. package/dist/src/gateway/hono/routes/home.js +0 -2
  970. package/dist/src/gateway/hono/routes/host-fs.js +0 -2
  971. package/dist/src/gateway/hono/routes/index.js +0 -2
  972. package/dist/src/gateway/hono/routes/lazy-bundles.js +0 -2
  973. package/dist/src/gateway/hono/routes/lazy-fallback.js +0 -2
  974. package/dist/src/gateway/hono/routes/local-apps.js +0 -2
  975. package/dist/src/gateway/hono/routes/logs.js +0 -2
  976. package/dist/src/gateway/hono/routes/mcp.js +0 -2
  977. package/dist/src/gateway/hono/routes/media.js +0 -2
  978. package/dist/src/gateway/hono/routes/memory.js +0 -2
  979. package/dist/src/gateway/hono/routes/migrations.js +0 -2
  980. package/dist/src/gateway/hono/routes/mobile.js +0 -2
  981. package/dist/src/gateway/hono/routes/models.js +0 -2
  982. package/dist/src/gateway/hono/routes/notes.js +3 -3
  983. package/dist/src/gateway/hono/routes/projects.js +0 -2
  984. package/dist/src/gateway/hono/routes/public-gateway.js +0 -2
  985. package/dist/src/gateway/hono/routes/search.js +0 -2
  986. package/dist/src/gateway/hono/routes/sessions.js +0 -2
  987. package/dist/src/gateway/hono/routes/shares.js +0 -2
  988. package/dist/src/gateway/hono/routes/site-shares.js +0 -2
  989. package/dist/src/gateway/hono/routes/status.js +0 -2
  990. package/dist/src/gateway/hono/routes/tui.js +0 -2
  991. package/dist/src/gateway/hono/routes/tunnel.js +0 -2
  992. package/dist/src/gateway/hono/routes/update.js +0 -2
  993. package/dist/src/gateway/hono/routes/voice.js +0 -2
  994. package/dist/src/gateway/hono/routes/work-discovery.js +0 -2
  995. package/dist/src/gateway/hono/routes/workflows.js +0 -2
  996. package/dist/src/gateway/hono/routes/workspace.js +0 -2
  997. package/dist/src/gateway/hono/routes/you.js +0 -2
  998. package/dist/src/gateway/hono/sse-json.js +0 -2
  999. package/dist/src/gateway/hono/sse.js +0 -2
  1000. package/dist/src/gateway/host.js +0 -2
  1001. package/dist/src/gateway/image-capabilities.js +0 -2
  1002. package/dist/src/gateway/listen.js +0 -2
  1003. package/dist/src/gateway/lock.js +0 -2
  1004. package/dist/src/gateway/ports.js +0 -2
  1005. package/dist/src/gateway/protocol.js +0 -2
  1006. package/dist/src/gateway/public-url.js +0 -2
  1007. package/dist/src/gateway/rate-limit/auth-policy.js +0 -2
  1008. package/dist/src/gateway/rate-limit/buckets.js +0 -2
  1009. package/dist/src/gateway/rate-limit/env-flags.js +0 -2
  1010. package/dist/src/gateway/resolve-channel-connect-defer.js +0 -2
  1011. package/dist/src/gateway/resolve-webchat-session-key.js +0 -2
  1012. package/dist/src/gateway/respawn.js +0 -2
  1013. package/dist/src/gateway/run-loop.js +0 -2
  1014. package/dist/src/gateway/runtime-config.js +0 -2
  1015. package/dist/src/gateway/security/audit.js +0 -2
  1016. package/dist/src/gateway/security/csp.js +0 -2
  1017. package/dist/src/gateway/security/dangerous-tools.js +0 -2
  1018. package/dist/src/gateway/security/external-content.js +0 -2
  1019. package/dist/src/gateway/security/known-weak-secrets.js +0 -2
  1020. package/dist/src/gateway/security/loopback.js +0 -2
  1021. package/dist/src/gateway/security/operator-scopes.js +0 -2
  1022. package/dist/src/gateway/security/origin-check.js +0 -2
  1023. package/dist/src/gateway/security/preauth-connection-budget.js +0 -2
  1024. package/dist/src/gateway/security/secret-equal.js +0 -2
  1025. package/dist/src/gateway/server-tailscale.js +0 -2
  1026. package/dist/src/gateway/server.js +0 -2
  1027. package/dist/src/gateway/service/agent-runner.js +0 -2
  1028. package/dist/src/gateway/service/config-coordinator.js +0 -2
  1029. package/dist/src/gateway/service/marketplace-service.js +0 -2
  1030. package/dist/src/gateway/service/run-gateway-agent.js +0 -2
  1031. package/dist/src/gateway/service/session-chat-ids.js +0 -2
  1032. package/dist/src/gateway/service/sessions-api.js +0 -2
  1033. package/dist/src/gateway/service/sse-hub.js +0 -2
  1034. package/dist/src/gateway/service.js +0 -2
  1035. package/dist/src/gateway/session-reset-service.js +0 -2
  1036. package/dist/src/gateway/startup-readiness.js +0 -2
  1037. package/dist/src/gateway/startup-trace.js +0 -2
  1038. package/dist/src/gateway/tailscale-auth.js +0 -2
  1039. package/dist/src/gateway/tailscale-lifecycle.js +0 -2
  1040. package/dist/src/gateway/tls-server.js +0 -2
  1041. package/dist/src/gateway/trusted-proxy.js +0 -2
  1042. package/dist/src/gateway/user-turn-input.js +0 -2
  1043. package/dist/src/gateway/workspace-editor-path.js +0 -2
  1044. package/dist/src/gateway/workspace-file-search.js +0 -2
  1045. package/dist/src/gateway/workspace-fs-file-list.js +0 -2
  1046. package/dist/src/gateway/workspace-heartbeat-path.js +0 -2
  1047. package/dist/src/gateway/workspace-ripgrep.js +0 -2
  1048. package/dist/src/gateway/ws-security.js +0 -2
  1049. package/dist/src/generated/bundled-image-generation-providers.js +0 -2
  1050. package/dist/src/goals/goal-contract-draft.js +0 -2
  1051. package/dist/src/goals/goal-evidence-review.js +0 -2
  1052. package/dist/src/goals/goal-notifications.js +0 -2
  1053. package/dist/src/goals/goal-queue-store.js +0 -2
  1054. package/dist/src/goals/goal-runner.js +0 -2
  1055. package/dist/src/goals/goal-service.js +0 -2
  1056. package/dist/src/goals/goal-store.js +0 -2
  1057. package/dist/src/goals/goal-workflow-judge.js +0 -2
  1058. package/dist/src/heartbeat/active-hours.js +0 -2
  1059. package/dist/src/heartbeat/content-check.js +0 -2
  1060. package/dist/src/heartbeat/event-prompt.js +0 -2
  1061. package/dist/src/heartbeat/tokens.js +0 -2
  1062. package/dist/src/heartbeat/wake.js +0 -2
  1063. package/dist/src/i18n/format.js +0 -2
  1064. package/dist/src/i18n/goals-bundle.js +0 -2
  1065. package/dist/src/i18n/locale.js +0 -2
  1066. package/dist/src/i18n/locales/goals.en.js +0 -2
  1067. package/dist/src/i18n/locales/goals.zh.js +0 -2
  1068. package/dist/src/i18n/locales/share-tool.en.js +0 -2
  1069. package/dist/src/i18n/locales/share-tool.zh.js +0 -2
  1070. package/dist/src/i18n/share-tool-bundle.js +0 -2
  1071. package/dist/src/index.js +0 -2
  1072. package/dist/src/infra/brew.js +0 -2
  1073. package/dist/src/infra/bus/queue.js +0 -2
  1074. package/dist/src/infra/debounce.js +0 -2
  1075. package/dist/src/infra/exec.js +0 -2
  1076. package/dist/src/infra/gateway-process-argv.js +0 -2
  1077. package/dist/src/infra/gateway-processes.js +0 -2
  1078. package/dist/src/infra/host-env-security-policy.js +0 -2
  1079. package/dist/src/infra/host-env-security.js +0 -2
  1080. package/dist/src/infra/http-proxy-env.js +0 -2
  1081. package/dist/src/infra/is-main.js +0 -2
  1082. package/dist/src/infra/json-utf8-bytes.js +0 -2
  1083. package/dist/src/infra/node-sqlite.js +0 -2
  1084. package/dist/src/infra/package-json.js +0 -2
  1085. package/dist/src/infra/package-update-steps.js +0 -2
  1086. package/dist/src/infra/path-env.js +0 -2
  1087. package/dist/src/infra/path-prepend.js +0 -2
  1088. package/dist/src/infra/ports.js +0 -2
  1089. package/dist/src/infra/rate-limit/failure-limiter.js +0 -2
  1090. package/dist/src/infra/rate-limit/keyed-store.js +0 -2
  1091. package/dist/src/infra/rate-limit/rate-limiter.js +0 -2
  1092. package/dist/src/infra/restart.js +0 -2
  1093. package/dist/src/infra/retry.js +0 -2
  1094. package/dist/src/infra/run-command.js +0 -2
  1095. package/dist/src/infra/sqlite-errors.js +0 -2
  1096. package/dist/src/infra/ssh-tunnel.js +0 -2
  1097. package/dist/src/infra/stable-node-path.js +0 -2
  1098. package/dist/src/infra/tailscale.js +0 -2
  1099. package/dist/src/infra/undici-fetch.js +0 -2
  1100. package/dist/src/infra/unhandled-rejections.js +0 -2
  1101. package/dist/src/infra/update-channels.js +0 -2
  1102. package/dist/src/infra/update-check.js +0 -2
  1103. package/dist/src/infra/update-global.js +0 -2
  1104. package/dist/src/infra/update-lock.js +0 -2
  1105. package/dist/src/infra/update-log.js +0 -2
  1106. package/dist/src/infra/update-restart.js +0 -2
  1107. package/dist/src/infra/update-runner.js +0 -2
  1108. package/dist/src/infra/update-startup.js +0 -2
  1109. package/dist/src/infra/warning-filter.js +0 -2
  1110. package/dist/src/infra/write-file-atomic.js +0 -2
  1111. package/dist/src/knowledge/connected-knowledge-pipeline.js +0 -2
  1112. package/dist/src/knowledge/coordinator.js +0 -2
  1113. package/dist/src/knowledge/ingestion-service.js +0 -2
  1114. package/dist/src/local-apps/acceptance.js +0 -2
  1115. package/dist/src/local-apps/preview-runtime-bridge.js +0 -2
  1116. package/dist/src/local-apps/runtime-entry.js +0 -2
  1117. package/dist/src/local-apps/scaffold.js +0 -2
  1118. package/dist/src/local-apps/service.js +0 -2
  1119. package/dist/src/local-apps/store.js +0 -2
  1120. package/dist/src/markdown/chunk.js +0 -2
  1121. package/dist/src/markdown/code-spans.js +0 -2
  1122. package/dist/src/markdown/fences.js +0 -2
  1123. package/dist/src/markdown/frontmatter.js +0 -2
  1124. package/dist/src/markdown/ir.js +0 -2
  1125. package/dist/src/markdown/render.js +0 -2
  1126. package/dist/src/markdown/tables.js +0 -2
  1127. package/dist/src/mcp/channel-bridge.js +0 -2
  1128. package/dist/src/mcp/channel-server.js +0 -2
  1129. package/dist/src/mcp/channel-shared.js +0 -2
  1130. package/dist/src/mcp/channel-tools.js +0 -2
  1131. package/dist/src/mcp/gateway-http-client.js +0 -2
  1132. package/dist/src/media/media-reference.js +0 -2
  1133. package/dist/src/media/paths.js +0 -2
  1134. package/dist/src/media/session-references.js +0 -2
  1135. package/dist/src/media/store.js +0 -2
  1136. package/dist/src/media/uri.js +0 -2
  1137. package/dist/src/media-shared/http/api-key-rotation.js +0 -2
  1138. package/dist/src/media-shared/http/deadline.js +0 -2
  1139. package/dist/src/media-shared/http/private-network.js +0 -2
  1140. package/dist/src/media-shared/http/provider-http-errors.js +0 -2
  1141. package/dist/src/media-shared/http/provider-http.js +0 -2
  1142. package/dist/src/media-shared/http/resolve-provider-http-request-config.js +0 -2
  1143. package/dist/src/media-shared/http/ssrf-guard.js +0 -2
  1144. package/dist/src/media-shared/http/test-helpers/mock-server.js +0 -2
  1145. package/dist/src/media-understanding/audio-transcription-runner.js +0 -2
  1146. package/dist/src/media-understanding/openai-compatible-audio.js +0 -2
  1147. package/dist/src/media-understanding/registry.js +0 -2
  1148. package/dist/src/media-understanding/resolve-entries.js +0 -2
  1149. package/dist/src/media-understanding/runner.js +0 -2
  1150. package/dist/src/migrations/config/default-capability-preset.js +0 -2
  1151. package/dist/src/migrations/registry.js +0 -2
  1152. package/dist/src/migrations/runner.js +0 -2
  1153. package/dist/src/mobile/notification-service.js +0 -2
  1154. package/dist/src/mobile/notification-store.js +0 -2
  1155. package/dist/src/mobile/notification-types.js +0 -2
  1156. package/dist/src/notes/agent-context.js +0 -2
  1157. package/dist/src/notes/attachment-ref.js +0 -2
  1158. package/dist/src/notes/note-attachment-sync.js +0 -2
  1159. package/dist/src/notes/note-index-meta.js +0 -2
  1160. package/dist/src/notes/note-markdown.js +0 -2
  1161. package/dist/src/notes/paths.js +0 -2
  1162. package/dist/src/notes/service.d.ts +3 -1
  1163. package/dist/src/notes/service.js +19 -5
  1164. package/dist/src/notes/store.js +0 -2
  1165. package/dist/src/package-version.js +0 -2
  1166. package/dist/src/pets/factory.d.ts +13 -0
  1167. package/dist/src/pets/factory.js +23 -2
  1168. package/dist/src/pets/manifest.js +0 -2
  1169. package/dist/src/pets/validator.js +0 -2
  1170. package/dist/src/process/kill-tree.js +0 -2
  1171. package/dist/src/project-trust/trust-store.js +0 -2
  1172. package/dist/src/projects/automation-bind.js +0 -2
  1173. package/dist/src/projects/goal-bind.js +0 -2
  1174. package/dist/src/projects/memory-bind.js +0 -2
  1175. package/dist/src/projects/project-agent-suggestion.js +0 -2
  1176. package/dist/src/projects/project-agent.js +0 -2
  1177. package/dist/src/projects/project-kind.js +0 -2
  1178. package/dist/src/projects/project-loop.js +0 -2
  1179. package/dist/src/projects/project-service.js +0 -2
  1180. package/dist/src/projects/project-store.js +0 -2
  1181. package/dist/src/projects/session-bind.js +0 -2
  1182. package/dist/src/projects/workflow-bind.js +0 -2
  1183. package/dist/src/projects/workspace-project.js +0 -2
  1184. package/dist/src/projects/workspace.js +0 -2
  1185. package/dist/src/providers/auth-runtime/auth-profile-store.js +0 -2
  1186. package/dist/src/providers/auth-runtime/is-configured.js +0 -2
  1187. package/dist/src/providers/auth-runtime/oauth.js +0 -2
  1188. package/dist/src/providers/auth-runtime/resolve-api-key.js +0 -2
  1189. package/dist/src/providers/auth-runtime/resolve-auth.js +0 -2
  1190. package/dist/src/providers/constants.js +0 -2
  1191. package/dist/src/providers/domestic-presets.js +0 -2
  1192. package/dist/src/providers/env-keys.js +0 -2
  1193. package/dist/src/providers/extension-stream-bridge.js +0 -2
  1194. package/dist/src/providers/index.js +0 -2
  1195. package/dist/src/providers/model-call.js +0 -2
  1196. package/dist/src/providers/model-discovery.js +0 -2
  1197. package/dist/src/providers/model-registry.js +0 -2
  1198. package/dist/src/providers/model-supplements.js +0 -2
  1199. package/dist/src/providers/plugin-registry.js +0 -2
  1200. package/dist/src/providers/presentation.js +0 -2
  1201. package/dist/src/remote-access/exposure-guards.js +0 -2
  1202. package/dist/src/remote-access/exposure-manager.js +0 -2
  1203. package/dist/src/review/review-git.js +0 -2
  1204. package/dist/src/review/review-types.js +0 -2
  1205. package/dist/src/routing/account-id.js +0 -2
  1206. package/dist/src/routing/agent-session-key.js +0 -2
  1207. package/dist/src/routing/bindings.js +0 -2
  1208. package/dist/src/routing/index.js +0 -2
  1209. package/dist/src/routing/resolve-route.js +0 -2
  1210. package/dist/src/routing/resolve-tui-session-key.js +0 -2
  1211. package/dist/src/routing/session-key-utils.js +0 -2
  1212. package/dist/src/routing/session-key.js +0 -2
  1213. package/dist/src/session/abort-cutoff.js +0 -2
  1214. package/dist/src/session/chat-export.js +0 -2
  1215. package/dist/src/session/client-history.js +0 -2
  1216. package/dist/src/session/compaction-checkpoints.js +0 -2
  1217. package/dist/src/session/config-store.js +0 -2
  1218. package/dist/src/session/init-session-turn.js +0 -2
  1219. package/dist/src/session/lifecycle-timestamps.js +0 -2
  1220. package/dist/src/session/load-jsonl-entries.js +0 -2
  1221. package/dist/src/session/manager.js +0 -2
  1222. package/dist/src/session/patch-metadata.js +0 -2
  1223. package/dist/src/session/reset-policy.js +0 -2
  1224. package/dist/src/session/reset-triggers.js +0 -2
  1225. package/dist/src/session/reset-type.js +0 -2
  1226. package/dist/src/session/resolve-session.js +0 -2
  1227. package/dist/src/session/session-context-for-llm.js +0 -2
  1228. package/dist/src/session/session-id.js +0 -2
  1229. package/dist/src/session/session-title.js +0 -2
  1230. package/dist/src/session/session-workspace.js +0 -2
  1231. package/dist/src/session/store.js +0 -2
  1232. package/dist/src/session/stored-rows-to-file-entries.js +0 -2
  1233. package/dist/src/session/thinking-resolve.js +0 -2
  1234. package/dist/src/session/transcript-events.js +0 -2
  1235. package/dist/src/session/transcript-format.js +0 -2
  1236. package/dist/src/session/transcript-outline.js +0 -2
  1237. package/dist/src/session/transcript-stats.js +0 -2
  1238. package/dist/src/session/types.js +0 -2
  1239. package/dist/src/session/user-round-delete.js +0 -2
  1240. package/dist/src/share/share-audit.js +0 -2
  1241. package/dist/src/share/share-auto.js +0 -2
  1242. package/dist/src/share/share-config.js +0 -2
  1243. package/dist/src/share/share-landing.js +0 -2
  1244. package/dist/src/share/share-rate-limit.js +0 -2
  1245. package/dist/src/share/share-store.js +0 -2
  1246. package/dist/src/share/share-thumbnail.js +0 -2
  1247. package/dist/src/share/share-types.js +0 -2
  1248. package/dist/src/share/share-url.js +0 -2
  1249. package/dist/src/share/share-zip.js +0 -2
  1250. package/dist/src/share/site-proxy.js +0 -2
  1251. package/dist/src/share/site-share-config.js +0 -2
  1252. package/dist/src/share/site-share-router.js +0 -2
  1253. package/dist/src/share/site-share-store.js +0 -2
  1254. package/dist/src/share/site-share-types.js +0 -2
  1255. package/dist/src/share/site-static-serve.js +0 -2
  1256. package/dist/src/storage/sqlite/activity-repository.js +0 -2
  1257. package/dist/src/storage/sqlite/config-repository.js +0 -2
  1258. package/dist/src/storage/sqlite/connection.js +0 -2
  1259. package/dist/src/storage/sqlite/connector-repository.js +0 -2
  1260. package/dist/src/storage/sqlite/fts.js +0 -2
  1261. package/dist/src/storage/sqlite/knowledge-repository.js +0 -2
  1262. package/dist/src/storage/sqlite/memory-index-repository.js +0 -2
  1263. package/dist/src/storage/sqlite/memory-records-repository.js +0 -2
  1264. package/dist/src/storage/sqlite/memory-reference-consent-repository.js +0 -2
  1265. package/dist/src/storage/sqlite/migrations/discover.js +0 -2
  1266. package/dist/src/storage/sqlite/migrations/errors.js +0 -2
  1267. package/dist/src/storage/sqlite/migrations/runner.js +0 -2
  1268. package/dist/src/storage/sqlite/note-agent-context-repository.js +0 -2
  1269. package/dist/src/storage/sqlite/notes-repository.js +0 -2
  1270. package/dist/src/storage/sqlite/paths.js +0 -2
  1271. package/dist/src/storage/sqlite/row-mappers.js +0 -2
  1272. package/dist/src/storage/sqlite/schema-version.js +0 -2
  1273. package/dist/src/storage/sqlite/schema.js +0 -2
  1274. package/dist/src/storage/sqlite/session-metadata.js +0 -2
  1275. package/dist/src/storage/sqlite/session-repository.js +0 -2
  1276. package/dist/src/storage/sqlite/transaction.js +0 -2
  1277. package/dist/src/storage/sqlite/transcript-repository.js +0 -2
  1278. package/dist/src/storage/sqlite/user-profile-setup-repository.js +0 -2
  1279. package/dist/src/storage/sqlite/user-trust-repository.js +0 -2
  1280. package/dist/src/tui/backends/embedded-backend.js +0 -2
  1281. package/dist/src/tui/backends/gateway-sse-backend.js +0 -2
  1282. package/dist/src/tui/chat-history.js +0 -2
  1283. package/dist/src/tui/clipboard-image.js +0 -2
  1284. package/dist/src/tui/clipboard-text.js +0 -2
  1285. package/dist/src/tui/components/assistant-message.js +0 -2
  1286. package/dist/src/tui/components/bash-execution.js +0 -2
  1287. package/dist/src/tui/components/bash-summary.js +0 -2
  1288. package/dist/src/tui/components/branch-message-summary.js +0 -2
  1289. package/dist/src/tui/components/branch-summary.js +0 -2
  1290. package/dist/src/tui/components/chat-log.js +0 -2
  1291. package/dist/src/tui/components/compaction-summary.js +0 -2
  1292. package/dist/src/tui/components/custom-editor.js +0 -2
  1293. package/dist/src/tui/components/custom-message.js +0 -2
  1294. package/dist/src/tui/components/dynamic-border.js +0 -2
  1295. package/dist/src/tui/components/extension-dialog.js +0 -2
  1296. package/dist/src/tui/components/fuzzy-filter.js +0 -2
  1297. package/dist/src/tui/components/scoped-models-selector.js +0 -2
  1298. package/dist/src/tui/components/searchable-select-list.js +0 -2
  1299. package/dist/src/tui/components/session-selector.js +0 -2
  1300. package/dist/src/tui/components/settings-selector.js +0 -2
  1301. package/dist/src/tui/components/thinking-selector.js +0 -2
  1302. package/dist/src/tui/components/tool-execution.js +0 -2
  1303. package/dist/src/tui/components/tui-bottom-bar.js +0 -2
  1304. package/dist/src/tui/components/tui-header.js +0 -2
  1305. package/dist/src/tui/components/user-message.js +0 -2
  1306. package/dist/src/tui/components/visual-truncate.js +0 -2
  1307. package/dist/src/tui/extension-host/autocomplete.js +0 -2
  1308. package/dist/src/tui/extension-host/host.js +0 -2
  1309. package/dist/src/tui/extension-host/load-extensions.js +0 -2
  1310. package/dist/src/tui/extension-host/runtime-context.js +0 -2
  1311. package/dist/src/tui/extension-host/runtime.js +0 -2
  1312. package/dist/src/tui/extension-host/surface.js +0 -2
  1313. package/dist/src/tui/extension-host/tool-renderers.js +0 -2
  1314. package/dist/src/tui/format-tui-hotkeys.js +0 -2
  1315. package/dist/src/tui/sse-consumer.js +0 -2
  1316. package/dist/src/tui/theme/dark.js +0 -2
  1317. package/dist/src/tui/theme/light.js +0 -2
  1318. package/dist/src/tui/theme-manager.js +0 -2
  1319. package/dist/src/tui/theme.js +0 -2
  1320. package/dist/src/tui/tool-summary.js +0 -2
  1321. package/dist/src/tui/tui-agent-events.js +0 -2
  1322. package/dist/src/tui/tui-command-formatters.js +0 -2
  1323. package/dist/src/tui/tui-commands.js +0 -2
  1324. package/dist/src/tui/tui-context-usage.js +0 -2
  1325. package/dist/src/tui/tui-extension-user-message.js +0 -2
  1326. package/dist/src/tui/tui-fd-path.js +0 -2
  1327. package/dist/src/tui/tui-file-autocomplete.js +0 -2
  1328. package/dist/src/tui/tui-follow-up-queue.js +0 -2
  1329. package/dist/src/tui/tui-git-branch.js +0 -2
  1330. package/dist/src/tui/tui-keybindings-file.js +0 -2
  1331. package/dist/src/tui/tui-lifecycle.js +0 -2
  1332. package/dist/src/tui/tui-local-shell.js +0 -2
  1333. package/dist/src/tui/tui-model-picker.js +0 -2
  1334. package/dist/src/tui/tui-oauth-login.js +0 -2
  1335. package/dist/src/tui/tui-overlays.js +0 -2
  1336. package/dist/src/tui/tui-picker-overlay.js +0 -2
  1337. package/dist/src/tui/tui-run-state.js +0 -2
  1338. package/dist/src/tui/tui-run-status-format.js +0 -2
  1339. package/dist/src/tui/tui-runtime-hints.js +0 -2
  1340. package/dist/src/tui/tui-scoped-models.js +0 -2
  1341. package/dist/src/tui/tui-session-actions.js +0 -2
  1342. package/dist/src/tui/tui-session-format.js +0 -2
  1343. package/dist/src/tui/tui-session-snapshot.js +0 -2
  1344. package/dist/src/tui/tui-session-stats.js +0 -2
  1345. package/dist/src/tui/tui-settings.js +0 -2
  1346. package/dist/src/tui/tui-skills-autocomplete.js +0 -2
  1347. package/dist/src/tui/tui-startup-resources.js +0 -2
  1348. package/dist/src/tui/tui-startup-text.js +0 -2
  1349. package/dist/src/tui/tui-stdio-filter.js +0 -2
  1350. package/dist/src/tui/tui-submit.js +0 -2
  1351. package/dist/src/tui/tui-suspend.js +0 -2
  1352. package/dist/src/tui/tui-timeline-picker.js +0 -2
  1353. package/dist/src/tui/tui-timeline.js +0 -2
  1354. package/dist/src/tui/tui-tool-diff.js +0 -2
  1355. package/dist/src/tui/tui-tool-result.js +0 -2
  1356. package/dist/src/tui/tui-transcript-tree-picker.js +0 -2
  1357. package/dist/src/tui/tui-transcript-tree.js +0 -2
  1358. package/dist/src/tui/tui-types.js +0 -2
  1359. package/dist/src/tui/tui-workflow-slash.js +0 -2
  1360. package/dist/src/tui/tui.js +0 -2
  1361. package/dist/src/tui/xopc-tui-keybindings.js +0 -2
  1362. package/dist/src/tunnel/broker-client.js +0 -2
  1363. package/dist/src/tunnel/consent.js +0 -2
  1364. package/dist/src/tunnel/enable-lan-pairing.js +0 -2
  1365. package/dist/src/tunnel/env.js +0 -2
  1366. package/dist/src/tunnel/frp-subdomain-host.js +0 -2
  1367. package/dist/src/tunnel/frpc-binary.js +0 -2
  1368. package/dist/src/tunnel/frpc-config.js +0 -2
  1369. package/dist/src/tunnel/frpc-extract.js +0 -2
  1370. package/dist/src/tunnel/frpc-process.js +0 -2
  1371. package/dist/src/tunnel/gateway-lifecycle.js +0 -2
  1372. package/dist/src/tunnel/pair-context.js +0 -2
  1373. package/dist/src/tunnel/pair-url.js +0 -2
  1374. package/dist/src/tunnel/pairing-rate-limit.js +0 -2
  1375. package/dist/src/tunnel/pairing.js +0 -2
  1376. package/dist/src/tunnel/tunnel-audit.js +0 -2
  1377. package/dist/src/tunnel/tunnel-config.js +0 -2
  1378. package/dist/src/tunnel/tunnel-persist.js +0 -2
  1379. package/dist/src/tunnel/tunnel-qr.js +0 -2
  1380. package/dist/src/tunnel/tunnel-rate-limit.js +0 -2
  1381. package/dist/src/tunnel/tunnel-service.js +0 -2
  1382. package/dist/src/tunnel/tunnel-state.js +0 -2
  1383. package/dist/src/tunnel/well-known.js +0 -2
  1384. package/dist/src/user-context/config.js +0 -2
  1385. package/dist/src/user-context/import.js +0 -2
  1386. package/dist/src/user-context/owner.js +0 -2
  1387. package/dist/src/user-context/profile.js +0 -2
  1388. package/dist/src/user-context/projection.js +0 -2
  1389. package/dist/src/user-context/runtime.js +0 -2
  1390. package/dist/src/user-context/source-recommendations.js +0 -2
  1391. package/dist/src/user-context/trust-policy.js +0 -2
  1392. package/dist/src/utils/global-singleton.js +0 -2
  1393. package/dist/src/utils/helpers.js +0 -2
  1394. package/dist/src/utils/index.js +0 -2
  1395. package/dist/src/utils/is-record.js +0 -2
  1396. package/dist/src/utils/logger/audit.js +0 -2
  1397. package/dist/src/utils/logger/config.js +0 -2
  1398. package/dist/src/utils/logger/context.js +0 -2
  1399. package/dist/src/utils/logger/exporters.js +0 -2
  1400. package/dist/src/utils/logger/index.js +0 -2
  1401. package/dist/src/utils/logger/log-store.js +0 -2
  1402. package/dist/src/utils/logger/log-stream.js +0 -2
  1403. package/dist/src/utils/logger/pino-record.js +0 -2
  1404. package/dist/src/utils/logger/redact.js +0 -2
  1405. package/dist/src/utils/logger/rotation.js +0 -2
  1406. package/dist/src/utils/logger/shutdown.js +0 -2
  1407. package/dist/src/utils/logger/stats.js +0 -2
  1408. package/dist/src/utils/logger/streams.js +0 -2
  1409. package/dist/src/utils/logger/types.js +0 -2
  1410. package/dist/src/utils/logger.js +0 -2
  1411. package/dist/src/utils/redact-sensitive-url.js +0 -2
  1412. package/dist/src/utils/sanitize-log.js +0 -2
  1413. package/dist/src/utils/string-coerce.js +0 -2
  1414. package/dist/src/voice/language-profile.js +0 -2
  1415. package/dist/src/voice/local/model-files.js +0 -2
  1416. package/dist/src/voice/local/model-manager.js +0 -2
  1417. package/dist/src/voice/local/models.js +0 -2
  1418. package/dist/src/voice/local/runtime-client.js +0 -2
  1419. package/dist/src/voice/local/runtime-dispatcher.js +0 -2
  1420. package/dist/src/voice/local/runtime-worker.js +12 -4
  1421. package/dist/src/voice/local/wav.js +0 -2
  1422. package/dist/src/voice/metadata/builtin.js +0 -2
  1423. package/dist/src/voice/metadata/registry.js +0 -2
  1424. package/dist/src/voice/stt/availability.js +0 -2
  1425. package/dist/src/voice/stt/config-slice.js +0 -2
  1426. package/dist/src/voice/stt/factory.js +0 -2
  1427. package/dist/src/voice/stt/index.js +0 -2
  1428. package/dist/src/voice/stt/list-providers.js +0 -2
  1429. package/dist/src/voice/stt/mention.js +0 -2
  1430. package/dist/src/voice/stt/preflight.js +0 -2
  1431. package/dist/src/voice/stt/providers/alibaba-transcription.js +0 -2
  1432. package/dist/src/voice/stt/providers/local-transcription.js +0 -2
  1433. package/dist/src/voice/stt/providers/openai-transcription.js +0 -2
  1434. package/dist/src/voice/stt/transcribe-core.js +0 -2
  1435. package/dist/src/voice/stt/types.js +0 -2
  1436. package/dist/src/voice/tts/audio.js +0 -2
  1437. package/dist/src/voice/tts/config-slice.js +0 -2
  1438. package/dist/src/voice/tts/directives.js +0 -2
  1439. package/dist/src/voice/tts/factory.js +0 -2
  1440. package/dist/src/voice/tts/list-providers.js +0 -2
  1441. package/dist/src/voice/tts/merge-config.js +0 -2
  1442. package/dist/src/voice/tts/openai-compatible-speech.js +0 -2
  1443. package/dist/src/voice/tts/payload.js +0 -2
  1444. package/dist/src/voice/tts/preprocess.js +0 -2
  1445. package/dist/src/voice/tts/providers/alibaba-speech.js +0 -2
  1446. package/dist/src/voice/tts/providers/edge-speech.js +0 -2
  1447. package/dist/src/voice/tts/providers/minimax-speech.js +0 -2
  1448. package/dist/src/voice/tts/providers/openai-speech.js +0 -2
  1449. package/dist/src/voice/tts/sentence-boundary.js +0 -2
  1450. package/dist/src/voice/tts/service.js +0 -2
  1451. package/dist/src/voice/tts/speak-core.js +0 -2
  1452. package/dist/src/voice/tts/speech-registry.js +0 -2
  1453. package/dist/src/voice/tts/status-tracker.js +0 -2
  1454. package/dist/src/voice/tts/summarize.js +0 -2
  1455. package/dist/src/voice/tts/types.js +0 -2
  1456. package/dist/src/work-discovery/analyzer.js +0 -2
  1457. package/dist/src/work-discovery/probe.js +0 -2
  1458. package/dist/src/work-discovery/repository.js +0 -2
  1459. package/dist/src/work-discovery/service.js +0 -2
  1460. package/dist/src/work-items/agent-context.js +0 -2
  1461. package/dist/src/work-items/work-item-service.js +0 -2
  1462. package/dist/src/work-items/work-item-store.js +0 -2
  1463. package/dist/src/work-items/work-item-workflow-judge.js +0 -2
  1464. package/dist/src/workflows/authoring/workflow-draft-store.js +0 -2
  1465. package/dist/src/workflows/domain/definition-utils.js +0 -2
  1466. package/dist/src/workflows/domain/run.js +0 -2
  1467. package/dist/src/workflows/domain/schema-validation.js +0 -2
  1468. package/dist/src/workflows/domain/validation.js +0 -2
  1469. package/dist/src/workflows/draft/workflow-draft-prompt.js +0 -2
  1470. package/dist/src/workflows/draft/workflow-draft-service.js +0 -2
  1471. package/dist/src/workflows/draft/workflow-draft-validator.js +0 -2
  1472. package/dist/src/workflows/engine/projector.js +0 -2
  1473. package/dist/src/workflows/engine/workflow-engine.js +0 -2
  1474. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +0 -2
  1475. package/dist/src/workflows/runtime/graph-workflow-runtime.js +0 -2
  1476. package/dist/src/workflows/service/run-view-to-snapshot.js +0 -2
  1477. package/dist/src/workflows/service/workflow-run-service.js +1 -3
  1478. package/dist/src/workflows/service/workflow-session-bridge.js +0 -2
  1479. package/dist/src/workflows/service/workflow-session-key.js +0 -2
  1480. package/dist/src/workflows/store/event-store.js +0 -2
  1481. package/dist/src/workflows/store/paths.js +0 -2
  1482. package/dist/src/workflows/store/run-index-store.js +0 -2
  1483. package/dist/src/workflows/store/run-store.js +0 -2
  1484. package/package.json +41 -11
  1485. package/skills/creative/hatch-pet/SKILL.md +1 -0
  1486. package/dist/extensions/dashscope/src/image-generation-provider.js.map +0 -1
  1487. package/dist/extensions/demo-memory/src/index.js.map +0 -1
  1488. package/dist/extensions/fal/src/image-generation-provider.js.map +0 -1
  1489. package/dist/extensions/feishu/src/actions/message-action-handler.js.map +0 -1
  1490. package/dist/extensions/feishu/src/adapters/cli-login.js.map +0 -1
  1491. package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +0 -1
  1492. package/dist/extensions/feishu/src/adapters/onboard-cli.js.map +0 -1
  1493. package/dist/extensions/feishu/src/auth/app-registration.js.map +0 -1
  1494. package/dist/extensions/feishu/src/auth/pairing.js.map +0 -1
  1495. package/dist/extensions/feishu/src/auth/paths.js.map +0 -1
  1496. package/dist/extensions/feishu/src/directory/directory-adapter.js.map +0 -1
  1497. package/dist/extensions/feishu/src/format.js.map +0 -1
  1498. package/dist/extensions/feishu/src/index.js.map +0 -1
  1499. package/dist/extensions/feishu/src/outbound/actions.js.map +0 -1
  1500. package/dist/extensions/feishu/src/outbound/media-load.js.map +0 -1
  1501. package/dist/extensions/feishu/src/outbound/outbound-adapter.js.map +0 -1
  1502. package/dist/extensions/feishu/src/pairing/feishu-pairing-prompt.js.map +0 -1
  1503. package/dist/extensions/feishu/src/pairing-config-resolver.js.map +0 -1
  1504. package/dist/extensions/feishu/src/plugin.js.map +0 -1
  1505. package/dist/extensions/feishu/src/schema/config-schema.js.map +0 -1
  1506. package/dist/extensions/feishu/src/state/accounts.js.map +0 -1
  1507. package/dist/extensions/feishu/src/state/message-bindings.js.map +0 -1
  1508. package/dist/extensions/feishu/src/state/thread-bindings.js.map +0 -1
  1509. package/dist/extensions/feishu/src/status/doctor.js.map +0 -1
  1510. package/dist/extensions/feishu/src/status/status-adapter.js.map +0 -1
  1511. package/dist/extensions/feishu/src/streaming/streaming-adapter.js.map +0 -1
  1512. package/dist/extensions/feishu/src/subagent-hooks.js.map +0 -1
  1513. package/dist/extensions/feishu/src/tools/docx/docx-batch-insert.js.map +0 -1
  1514. package/dist/extensions/feishu/src/tools/docx/docx-color-text.js.map +0 -1
  1515. package/dist/extensions/feishu/src/tools/docx/docx-table-ops.js.map +0 -1
  1516. package/dist/extensions/feishu/src/tools/tools.js.map +0 -1
  1517. package/dist/extensions/feishu/src/transport/client/client.js.map +0 -1
  1518. package/dist/extensions/feishu/src/transport/client/lark-sdk-logger.js.map +0 -1
  1519. package/dist/extensions/feishu/src/transport/reliability/dedupe.js.map +0 -1
  1520. package/dist/extensions/feishu/src/transport/reliability/inbound-pipeline.js.map +0 -1
  1521. package/dist/extensions/feishu/src/transport/socket-mode/monitor.js.map +0 -1
  1522. package/dist/extensions/feishu/src/transport/socket-mode/retry.js.map +0 -1
  1523. package/dist/extensions/feishu/src/transport/text/mentions.js.map +0 -1
  1524. package/dist/extensions/feishu/src/transport/webhook/monitor.js.map +0 -1
  1525. package/dist/extensions/feishu/src/ui/config-surface.js.map +0 -1
  1526. package/dist/extensions/feishu/src/workflow-progress.js.map +0 -1
  1527. package/dist/extensions/google/src/image-generation-provider.js.map +0 -1
  1528. package/dist/extensions/minimax/src/image-generation-provider.js.map +0 -1
  1529. package/dist/extensions/openai/src/image-generation-provider.js.map +0 -1
  1530. package/dist/extensions/telegram/src/access-control.js.map +0 -1
  1531. package/dist/extensions/telegram/src/account-manager.js.map +0 -1
  1532. package/dist/extensions/telegram/src/actions/message-actions.js.map +0 -1
  1533. package/dist/extensions/telegram/src/adapters/command-adapter.js.map +0 -1
  1534. package/dist/extensions/telegram/src/adapters/config-adapter.js.map +0 -1
  1535. package/dist/extensions/telegram/src/adapters/debounce-keys.js.map +0 -1
  1536. package/dist/extensions/telegram/src/adapters/gateway-adapter.js.map +0 -1
  1537. package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +0 -1
  1538. package/dist/extensions/telegram/src/adapters/inbound-access.js.map +0 -1
  1539. package/dist/extensions/telegram/src/adapters/index.js.map +0 -1
  1540. package/dist/extensions/telegram/src/adapters/onboard-cli.js.map +0 -1
  1541. package/dist/extensions/telegram/src/adapters/outbound-adapter.js.map +0 -1
  1542. package/dist/extensions/telegram/src/adapters/security-adapter.js.map +0 -1
  1543. package/dist/extensions/telegram/src/adapters/setup-wizard.js.map +0 -1
  1544. package/dist/extensions/telegram/src/adapters/status-adapter.js.map +0 -1
  1545. package/dist/extensions/telegram/src/adapters/streaming-adapter.js.map +0 -1
  1546. package/dist/extensions/telegram/src/api-root.js.map +0 -1
  1547. package/dist/extensions/telegram/src/approval-delivery.js.map +0 -1
  1548. package/dist/extensions/telegram/src/approval-store.js.map +0 -1
  1549. package/dist/extensions/telegram/src/caption.js.map +0 -1
  1550. package/dist/extensions/telegram/src/command-handler.js.map +0 -1
  1551. package/dist/extensions/telegram/src/config-schema.js.map +0 -1
  1552. package/dist/extensions/telegram/src/conversation-id.js.map +0 -1
  1553. package/dist/extensions/telegram/src/dedupe.js.map +0 -1
  1554. package/dist/extensions/telegram/src/delivery-chat-id.js.map +0 -1
  1555. package/dist/extensions/telegram/src/doctor.js.map +0 -1
  1556. package/dist/extensions/telegram/src/draft-stream-lifecycle.js.map +0 -1
  1557. package/dist/extensions/telegram/src/draft-stream-loop.js.map +0 -1
  1558. package/dist/extensions/telegram/src/draft-stream.js.map +0 -1
  1559. package/dist/extensions/telegram/src/errors.js.map +0 -1
  1560. package/dist/extensions/telegram/src/exec-approval-handler.js.map +0 -1
  1561. package/dist/extensions/telegram/src/exec-approvals.js.map +0 -1
  1562. package/dist/extensions/telegram/src/focus-handler.js.map +0 -1
  1563. package/dist/extensions/telegram/src/format.js.map +0 -1
  1564. package/dist/extensions/telegram/src/group-config-resolver.js.map +0 -1
  1565. package/dist/extensions/telegram/src/inbound-coalescer.js.map +0 -1
  1566. package/dist/extensions/telegram/src/inbound-processor.js.map +0 -1
  1567. package/dist/extensions/telegram/src/index.js.map +0 -1
  1568. package/dist/extensions/telegram/src/inline-keyboards.js.map +0 -1
  1569. package/dist/extensions/telegram/src/network-errors.js.map +0 -1
  1570. package/dist/extensions/telegram/src/outbound-sender.js.map +0 -1
  1571. package/dist/extensions/telegram/src/pairing-config-resolver.js.map +0 -1
  1572. package/dist/extensions/telegram/src/plugin-defaults.js.map +0 -1
  1573. package/dist/extensions/telegram/src/plugin.js.map +0 -1
  1574. package/dist/extensions/telegram/src/polling-session.js.map +0 -1
  1575. package/dist/extensions/telegram/src/proxy-fetch.js.map +0 -1
  1576. package/dist/extensions/telegram/src/reactions.js.map +0 -1
  1577. package/dist/extensions/telegram/src/reply-params.js.map +0 -1
  1578. package/dist/extensions/telegram/src/routing-integration.js.map +0 -1
  1579. package/dist/extensions/telegram/src/send-options.js.map +0 -1
  1580. package/dist/extensions/telegram/src/sent-cache.js.map +0 -1
  1581. package/dist/extensions/telegram/src/startup-errors.js.map +0 -1
  1582. package/dist/extensions/telegram/src/telegram-actions.js.map +0 -1
  1583. package/dist/extensions/telegram/src/telegram-draft-errors.js.map +0 -1
  1584. package/dist/extensions/telegram/src/thread-bindings.js.map +0 -1
  1585. package/dist/extensions/telegram/src/timeout-abort.js.map +0 -1
  1586. package/dist/extensions/telegram/src/token-resolver.js.map +0 -1
  1587. package/dist/extensions/telegram/src/update-offset-store.js.map +0 -1
  1588. package/dist/extensions/telegram/src/workflow-progress.js.map +0 -1
  1589. package/dist/extensions/weixin/src/adapters/onboard-cli.js.map +0 -1
  1590. package/dist/extensions/weixin/src/api/api.js.map +0 -1
  1591. package/dist/extensions/weixin/src/api/config-cache.js.map +0 -1
  1592. package/dist/extensions/weixin/src/api/session-guard.js.map +0 -1
  1593. package/dist/extensions/weixin/src/api/types.js.map +0 -1
  1594. package/dist/extensions/weixin/src/auth/accounts.js.map +0 -1
  1595. package/dist/extensions/weixin/src/auth/login-qr.js.map +0 -1
  1596. package/dist/extensions/weixin/src/auth/pairing.js.map +0 -1
  1597. package/dist/extensions/weixin/src/auth/weixin-account-id.js.map +0 -1
  1598. package/dist/extensions/weixin/src/cdn/aes-ecb.js.map +0 -1
  1599. package/dist/extensions/weixin/src/cdn/cdn-upload.js.map +0 -1
  1600. package/dist/extensions/weixin/src/cdn/cdn-url.js.map +0 -1
  1601. package/dist/extensions/weixin/src/cdn/pic-decrypt.js.map +0 -1
  1602. package/dist/extensions/weixin/src/cdn/upload.js.map +0 -1
  1603. package/dist/extensions/weixin/src/cli/gateway-qr-login.js.map +0 -1
  1604. package/dist/extensions/weixin/src/cli/qr-login.js.map +0 -1
  1605. package/dist/extensions/weixin/src/config-schema.js.map +0 -1
  1606. package/dist/extensions/weixin/src/config-surface.js.map +0 -1
  1607. package/dist/extensions/weixin/src/delivery-to.js.map +0 -1
  1608. package/dist/extensions/weixin/src/index.js.map +0 -1
  1609. package/dist/extensions/weixin/src/media/data-url.js.map +0 -1
  1610. package/dist/extensions/weixin/src/media/media-download.js.map +0 -1
  1611. package/dist/extensions/weixin/src/media/mime.js.map +0 -1
  1612. package/dist/extensions/weixin/src/media/silk-transcode.js.map +0 -1
  1613. package/dist/extensions/weixin/src/messaging/context-token-init.js.map +0 -1
  1614. package/dist/extensions/weixin/src/messaging/debug-mode.js.map +0 -1
  1615. package/dist/extensions/weixin/src/messaging/error-notice.js.map +0 -1
  1616. package/dist/extensions/weixin/src/messaging/inbound.js.map +0 -1
  1617. package/dist/extensions/weixin/src/messaging/markdown-filter.js.map +0 -1
  1618. package/dist/extensions/weixin/src/messaging/process-message.js.map +0 -1
  1619. package/dist/extensions/weixin/src/messaging/send-media.js.map +0 -1
  1620. package/dist/extensions/weixin/src/messaging/send.js.map +0 -1
  1621. package/dist/extensions/weixin/src/messaging/slash-commands.js.map +0 -1
  1622. package/dist/extensions/weixin/src/messaging/typing-ticket-store.js.map +0 -1
  1623. package/dist/extensions/weixin/src/monitor/monitor.js.map +0 -1
  1624. package/dist/extensions/weixin/src/outbound-send.js.map +0 -1
  1625. package/dist/extensions/weixin/src/pairing-config-resolver.js.map +0 -1
  1626. package/dist/extensions/weixin/src/plugin.js.map +0 -1
  1627. package/dist/extensions/weixin/src/routing-integration.js.map +0 -1
  1628. package/dist/extensions/weixin/src/storage/state-dir.js.map +0 -1
  1629. package/dist/extensions/weixin/src/storage/sync-buf.js.map +0 -1
  1630. package/dist/extensions/weixin/src/util/logger.js.map +0 -1
  1631. package/dist/extensions/weixin/src/util/random.js.map +0 -1
  1632. package/dist/extensions/weixin/src/util/redact.js.map +0 -1
  1633. package/dist/extensions/weixin/src/workflow-progress.js.map +0 -1
  1634. package/dist/gateway/static/root/assets/channels-status-swr-CuU6ez3y.js +0 -1
  1635. package/dist/gateway/static/root/assets/desktop-pet-C6V-PHwi.js +0 -1
  1636. package/dist/gateway/static/root/assets/desktop-pet-settings-5Fcz47XQ.js +0 -1
  1637. package/dist/gateway/static/root/assets/index-Dfnl9tp_.css +0 -1
  1638. package/dist/gateway/static/root/assets/settings-advanced-gate-DwuBL834.js +0 -1
  1639. package/dist/gateway/static/root/assets/skill-reload-api-DQtZiejw.js +0 -1
  1640. package/dist/gateway/static/root/favicon-icon.svg +0 -187
  1641. package/dist/package.js.map +0 -1
  1642. package/dist/src/activity/context.js.map +0 -1
  1643. package/dist/src/activity/emitter.js.map +0 -1
  1644. package/dist/src/activity/service.js.map +0 -1
  1645. package/dist/src/agent/agent-manager.js.map +0 -1
  1646. package/dist/src/agent/agent-scope.js.map +0 -1
  1647. package/dist/src/agent/background-review/coordinator.js.map +0 -1
  1648. package/dist/src/agent/background-review/prompts.js.map +0 -1
  1649. package/dist/src/agent/background-review/run-background-review.js.map +0 -1
  1650. package/dist/src/agent/background-review/settings.js.map +0 -1
  1651. package/dist/src/agent/bootstrap/bootstrap-cache.js.map +0 -1
  1652. package/dist/src/agent/bootstrap/bootstrap-context.js.map +0 -1
  1653. package/dist/src/agent/bootstrap/bootstrap-files.js.map +0 -1
  1654. package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +0 -1
  1655. package/dist/src/agent/bootstrap/load-bootstrap-files.js.map +0 -1
  1656. package/dist/src/agent/bootstrap/project-agents-context.js.map +0 -1
  1657. package/dist/src/agent/capabilities/definitions.js.map +0 -1
  1658. package/dist/src/agent/capabilities/registry.js.map +0 -1
  1659. package/dist/src/agent/child-agent-factory.js.map +0 -1
  1660. package/dist/src/agent/client-error-format.js.map +0 -1
  1661. package/dist/src/agent/code-intelligence/binary.js.map +0 -1
  1662. package/dist/src/agent/code-intelligence/runtime.js.map +0 -1
  1663. package/dist/src/agent/code-intelligence/tools.js.map +0 -1
  1664. package/dist/src/agent/coding/turn-diff-tracker.js.map +0 -1
  1665. package/dist/src/agent/context/expand-at-file-mentions.js.map +0 -1
  1666. package/dist/src/agent/context/project-context.js.map +0 -1
  1667. package/dist/src/agent/context/workspace-seed.js.map +0 -1
  1668. package/dist/src/agent/context/workspace-state.js.map +0 -1
  1669. package/dist/src/agent/context/workspace.js.map +0 -1
  1670. package/dist/src/agent/embedded/run-for-session.js.map +0 -1
  1671. package/dist/src/agent/embedded/run-turn.js.map +0 -1
  1672. package/dist/src/agent/embedded/runs.js.map +0 -1
  1673. package/dist/src/agent/embedded/session-manager-init.js.map +0 -1
  1674. package/dist/src/agent/embedded/session-runner.js.map +0 -1
  1675. package/dist/src/agent/embedded/session-tool-result-guard.js.map +0 -1
  1676. package/dist/src/agent/embedded/sqlite-hydrating-session-manager.js.map +0 -1
  1677. package/dist/src/agent/embedded/subscribe-session.js.map +0 -1
  1678. package/dist/src/agent/embedded/system-prompt-override.js.map +0 -1
  1679. package/dist/src/agent/embedded/tool-result-context-guard.js.map +0 -1
  1680. package/dist/src/agent/embedded/tool-result-truncation.js.map +0 -1
  1681. package/dist/src/agent/embedded/xopc-auth-storage.js.map +0 -1
  1682. package/dist/src/agent/embedded/xopc-stream-bridge.js.map +0 -1
  1683. package/dist/src/agent/embedded/xopc-tools-bridge.js.map +0 -1
  1684. package/dist/src/agent/failover-error.js.map +0 -1
  1685. package/dist/src/agent/fallback/candidates.js.map +0 -1
  1686. package/dist/src/agent/fallback/reason.js.map +0 -1
  1687. package/dist/src/agent/feedback/feedback-coordinator.js.map +0 -1
  1688. package/dist/src/agent/goals/checklist-judge.js.map +0 -1
  1689. package/dist/src/agent/goals/checklist-types.js.map +0 -1
  1690. package/dist/src/agent/goals/evaluate-turn.js.map +0 -1
  1691. package/dist/src/agent/goals/goal-locale.js.map +0 -1
  1692. package/dist/src/agent/goals/judge.js.map +0 -1
  1693. package/dist/src/agent/goals/persistent-goal-service.js.map +0 -1
  1694. package/dist/src/agent/goals/post-turn.js.map +0 -1
  1695. package/dist/src/agent/goals/state.js.map +0 -1
  1696. package/dist/src/agent/image/generation/bundled-registry.js.map +0 -1
  1697. package/dist/src/agent/image/generation/bundled.js.map +0 -1
  1698. package/dist/src/agent/image/generation/image-assets.js.map +0 -1
  1699. package/dist/src/agent/image/generation/model-ref.js.map +0 -1
  1700. package/dist/src/agent/image/generation/normalization.js.map +0 -1
  1701. package/dist/src/agent/image/generation/openai-compatible-image-provider.js.map +0 -1
  1702. package/dist/src/agent/image/generation/provider-registry.js.map +0 -1
  1703. package/dist/src/agent/image/generation/runtime.js.map +0 -1
  1704. package/dist/src/agent/image/image-helpers.js.map +0 -1
  1705. package/dist/src/agent/image/image-model-fallback.js.map +0 -1
  1706. package/dist/src/agent/image/inbound-image-handling.js.map +0 -1
  1707. package/dist/src/agent/image/load-image-media.js.map +0 -1
  1708. package/dist/src/agent/image/tool-model-config.js.map +0 -1
  1709. package/dist/src/agent/image/understanding/pi-ai-provider.js.map +0 -1
  1710. package/dist/src/agent/image/understanding/provider-registry.js.map +0 -1
  1711. package/dist/src/agent/image/understanding/runtime.js.map +0 -1
  1712. package/dist/src/agent/image/vision-detection.js.map +0 -1
  1713. package/dist/src/agent/inbound/attachment-pipeline.js.map +0 -1
  1714. package/dist/src/agent/inbound/inbound-loop.js.map +0 -1
  1715. package/dist/src/agent/inbound/turn-dispatcher.js.map +0 -1
  1716. package/dist/src/agent/ipc/bus.js.map +0 -1
  1717. package/dist/src/agent/ipc/inbox.js.map +0 -1
  1718. package/dist/src/agent/ipc/socket.js.map +0 -1
  1719. package/dist/src/agent/ipc/types.js.map +0 -1
  1720. package/dist/src/agent/lifecycle/handlers/compaction.js.map +0 -1
  1721. package/dist/src/agent/lifecycle/hook-handler.js.map +0 -1
  1722. package/dist/src/agent/lifecycle/manager.js.map +0 -1
  1723. package/dist/src/agent/lifecycle/progress.js.map +0 -1
  1724. package/dist/src/agent/lifecycle/timeout-wrapper.js.map +0 -1
  1725. package/dist/src/agent/lifecycle/typing.js.map +0 -1
  1726. package/dist/src/agent/mcp/bundle-mcp-config.js.map +0 -1
  1727. package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +0 -1
  1728. package/dist/src/agent/mcp/bundle-mcp-names.js.map +0 -1
  1729. package/dist/src/agent/mcp/bundle-mcp-policy.js.map +0 -1
  1730. package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +0 -1
  1731. package/dist/src/agent/mcp/embedded-mcp.js.map +0 -1
  1732. package/dist/src/agent/mcp/mcp-config-shared.js.map +0 -1
  1733. package/dist/src/agent/mcp/mcp-http.js.map +0 -1
  1734. package/dist/src/agent/mcp/mcp-stdio-transport.js.map +0 -1
  1735. package/dist/src/agent/mcp/mcp-stdio.js.map +0 -1
  1736. package/dist/src/agent/mcp/mcp-tool-meta.js.map +0 -1
  1737. package/dist/src/agent/mcp/mcp-transport-config.js.map +0 -1
  1738. package/dist/src/agent/mcp/mcp-transport.js.map +0 -1
  1739. package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js.map +0 -1
  1740. package/dist/src/agent/media-generation/model-ref.js.map +0 -1
  1741. package/dist/src/agent/media-generation/normalization.types.js.map +0 -1
  1742. package/dist/src/agent/media-generation/runtime-shared.js.map +0 -1
  1743. package/dist/src/agent/memory/agent-message-access.js.map +0 -1
  1744. package/dist/src/agent/memory/builtin-memory-store.js.map +0 -1
  1745. package/dist/src/agent/memory/builtin-provider.js.map +0 -1
  1746. package/dist/src/agent/memory/compaction.js.map +0 -1
  1747. package/dist/src/agent/memory/context/planner.js.map +0 -1
  1748. package/dist/src/agent/memory/context-fence.js.map +0 -1
  1749. package/dist/src/agent/memory/create-memory-manager.js.map +0 -1
  1750. package/dist/src/agent/memory/dreaming/config.js.map +0 -1
  1751. package/dist/src/agent/memory/dreaming/constants.js.map +0 -1
  1752. package/dist/src/agent/memory/dreaming/deep-promotion.js.map +0 -1
  1753. package/dist/src/agent/memory/dreaming/events.js.map +0 -1
  1754. package/dist/src/agent/memory/dreaming/last-run.js.map +0 -1
  1755. package/dist/src/agent/memory/dreaming/light-sweep.js.map +0 -1
  1756. package/dist/src/agent/memory/dreaming/preview.js.map +0 -1
  1757. package/dist/src/agent/memory/dreaming/promotion-lifecycle.js.map +0 -1
  1758. package/dist/src/agent/memory/dreaming/rem-patterns.js.map +0 -1
  1759. package/dist/src/agent/memory/dreaming/scope.js.map +0 -1
  1760. package/dist/src/agent/memory/dreaming/short-term-store.js.map +0 -1
  1761. package/dist/src/agent/memory/dreaming/utils.js.map +0 -1
  1762. package/dist/src/agent/memory/lifecycle.js.map +0 -1
  1763. package/dist/src/agent/memory/manager.js.map +0 -1
  1764. package/dist/src/agent/memory/memory-config.js.map +0 -1
  1765. package/dist/src/agent/memory/message-sanitizer.js.map +0 -1
  1766. package/dist/src/agent/memory/plugin-discovery.js.map +0 -1
  1767. package/dist/src/agent/memory/sensitivity.js.map +0 -1
  1768. package/dist/src/agent/memory/source-origin.js.map +0 -1
  1769. package/dist/src/agent/memory/stub-memory-provider.js.map +0 -1
  1770. package/dist/src/agent/memory/summary-generator.js.map +0 -1
  1771. package/dist/src/agent/memory/understanding/correction.js.map +0 -1
  1772. package/dist/src/agent/memory/understanding/quality.js.map +0 -1
  1773. package/dist/src/agent/memory/understanding/service.js.map +0 -1
  1774. package/dist/src/agent/memory/user-context-coordinator.js.map +0 -1
  1775. package/dist/src/agent/memory/user-message-text.js.map +0 -1
  1776. package/dist/src/agent/memory/window.js.map +0 -1
  1777. package/dist/src/agent/messaging/command-handler.js.map +0 -1
  1778. package/dist/src/agent/messaging/message-router.js.map +0 -1
  1779. package/dist/src/agent/messaging/outbound-coordinator.js.map +0 -1
  1780. package/dist/src/agent/messaging/stream-manager.js.map +0 -1
  1781. package/dist/src/agent/middleware/context.js.map +0 -1
  1782. package/dist/src/agent/middleware/self-verify.js.map +0 -1
  1783. package/dist/src/agent/models/manager.js.map +0 -1
  1784. package/dist/src/agent/models/request-limiter.js.map +0 -1
  1785. package/dist/src/agent/models/selection.js.map +0 -1
  1786. package/dist/src/agent/orchestration/agent-event-handler.js.map +0 -1
  1787. package/dist/src/agent/orchestration/agent-orchestrator.js.map +0 -1
  1788. package/dist/src/agent/orchestration/llm-turn-retry.js.map +0 -1
  1789. package/dist/src/agent/orchestration/loop-guard.js.map +0 -1
  1790. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js.map +0 -1
  1791. package/dist/src/agent/prompt/cache-boundary.js.map +0 -1
  1792. package/dist/src/agent/prompt/memory/index.js.map +0 -1
  1793. package/dist/src/agent/prompt/safety.js.map +0 -1
  1794. package/dist/src/agent/prompt/sanitize-for-prompt.js.map +0 -1
  1795. package/dist/src/agent/prompt/sections/behavior.js.map +0 -1
  1796. package/dist/src/agent/prompt/sections/memory-skills.js.map +0 -1
  1797. package/dist/src/agent/prompt/sections/messaging-runtime.js.map +0 -1
  1798. package/dist/src/agent/prompt/sections/project-context.js.map +0 -1
  1799. package/dist/src/agent/prompt/sections/tooling.js.map +0 -1
  1800. package/dist/src/agent/prompt/sections/workspace-runtime.js.map +0 -1
  1801. package/dist/src/agent/prompt/service-prompt-builder.js.map +0 -1
  1802. package/dist/src/agent/prompt/subagent-context.js.map +0 -1
  1803. package/dist/src/agent/prompt/system-prompt-params.js.map +0 -1
  1804. package/dist/src/agent/prompt/system-prompt.js.map +0 -1
  1805. package/dist/src/agent/prompt/system-reminder.js.map +0 -1
  1806. package/dist/src/agent/reply/apply-turn-user-enrichment.js.map +0 -1
  1807. package/dist/src/agent/reply/post-compaction-context.js.map +0 -1
  1808. package/dist/src/agent/reply/startup-context.js.map +0 -1
  1809. package/dist/src/agent/reply/workspace-boundary-read.js.map +0 -1
  1810. package/dist/src/agent/sandbox/command-validator.js.map +0 -1
  1811. package/dist/src/agent/sandbox/exec-policy.js.map +0 -1
  1812. package/dist/src/agent/sandbox/path-policy.js.map +0 -1
  1813. package/dist/src/agent/sandbox/sanitize-env-vars.js.map +0 -1
  1814. package/dist/src/agent/sandbox/types.js.map +0 -1
  1815. package/dist/src/agent/service/async-queue.js.map +0 -1
  1816. package/dist/src/agent/service/btw-query.js.map +0 -1
  1817. package/dist/src/agent/service/build-direct-message-content.js.map +0 -1
  1818. package/dist/src/agent/service/direct-turn-helpers.js.map +0 -1
  1819. package/dist/src/agent/service/parse-outbound-session-key.js.map +0 -1
  1820. package/dist/src/agent/service/process-direct-one-shot.js.map +0 -1
  1821. package/dist/src/agent/service/process-direct-streaming.js.map +0 -1
  1822. package/dist/src/agent/service/session-context-report.js.map +0 -1
  1823. package/dist/src/agent/service/webchat-tts.js.map +0 -1
  1824. package/dist/src/agent/service-inbound-utils.js.map +0 -1
  1825. package/dist/src/agent/service.js.map +0 -1
  1826. package/dist/src/agent/session/session-config-service.js.map +0 -1
  1827. package/dist/src/agent/session/session-context.js.map +0 -1
  1828. package/dist/src/agent/session/session-hydrator.js.map +0 -1
  1829. package/dist/src/agent/session/session-inspector.js.map +0 -1
  1830. package/dist/src/agent/session/session-lifecycle.js.map +0 -1
  1831. package/dist/src/agent/session/session-state-bag.js.map +0 -1
  1832. package/dist/src/agent/session/tracker.js.map +0 -1
  1833. package/dist/src/agent/skills/config.js.map +0 -1
  1834. package/dist/src/agent/skills/filesystem-watcher.js.map +0 -1
  1835. package/dist/src/agent/skills/format-skills-prompt.js.map +0 -1
  1836. package/dist/src/agent/skills/hub-hash.js.map +0 -1
  1837. package/dist/src/agent/skills/hub-lock.js.map +0 -1
  1838. package/dist/src/agent/skills/hub-pull.js.map +0 -1
  1839. package/dist/src/agent/skills/index.js.map +0 -1
  1840. package/dist/src/agent/skills/install-target.js.map +0 -1
  1841. package/dist/src/agent/skills/installer.js.map +0 -1
  1842. package/dist/src/agent/skills/managed-store.js.map +0 -1
  1843. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +0 -1
  1844. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +0 -1
  1845. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +0 -1
  1846. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +0 -1
  1847. package/dist/src/agent/skills/marketplace/marketplace-category-order.js.map +0 -1
  1848. package/dist/src/agent/skills/marketplace/registry.js.map +0 -1
  1849. package/dist/src/agent/skills/marketplace/resolve-adapter.js.map +0 -1
  1850. package/dist/src/agent/skills/parse-skill-metadata.js.map +0 -1
  1851. package/dist/src/agent/skills/required-env-vars.js.map +0 -1
  1852. package/dist/src/agent/skills/scanner.js.map +0 -1
  1853. package/dist/src/agent/skills/skill-manage-ops.js.map +0 -1
  1854. package/dist/src/agent/skills/skill-manager.js.map +0 -1
  1855. package/dist/src/agent/skills/skill-markdown-preview-from-raw.js.map +0 -1
  1856. package/dist/src/agent/skills/skill-tool-gating.js.map +0 -1
  1857. package/dist/src/agent/skills/skill-view-path.js.map +0 -1
  1858. package/dist/src/agent/skills/skills-marketplace.js.map +0 -1
  1859. package/dist/src/agent/skills/test-framework.js.map +0 -1
  1860. package/dist/src/agent/skills/watcher.js.map +0 -1
  1861. package/dist/src/agent/skills/workspace-skills-dir.js.map +0 -1
  1862. package/dist/src/agent/source-context/injector.js.map +0 -1
  1863. package/dist/src/agent/source-context/types.js.map +0 -1
  1864. package/dist/src/agent/starter-agents.js.map +0 -1
  1865. package/dist/src/agent/streaming/reasoning-visibility-sse.js.map +0 -1
  1866. package/dist/src/agent/tool-manuals/browser.js.map +0 -1
  1867. package/dist/src/agent/tool-manuals/index.js.map +0 -1
  1868. package/dist/src/agent/tool-manuals/xopc-use.js.map +0 -1
  1869. package/dist/src/agent/tools/apply-patch.js.map +0 -1
  1870. package/dist/src/agent/tools/automation-tool.js.map +0 -1
  1871. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +0 -1
  1872. package/dist/src/agent/tools/browser/tool/schemas.js.map +0 -1
  1873. package/dist/src/agent/tools/chain-tracker.js.map +0 -1
  1874. package/dist/src/agent/tools/clarify-tool.js.map +0 -1
  1875. package/dist/src/agent/tools/cli-clarify.js.map +0 -1
  1876. package/dist/src/agent/tools/communication.js.map +0 -1
  1877. package/dist/src/agent/tools/composio-tool.js.map +0 -1
  1878. package/dist/src/agent/tools/concurrency.js.map +0 -1
  1879. package/dist/src/agent/tools/create-share-tool.js.map +0 -1
  1880. package/dist/src/agent/tools/curated-memory-tool.js.map +0 -1
  1881. package/dist/src/agent/tools/delegate-tool.js.map +0 -1
  1882. package/dist/src/agent/tools/desktop-pet-tool.js.map +0 -1
  1883. package/dist/src/agent/tools/dreaming-tool.js.map +0 -1
  1884. package/dist/src/agent/tools/edit-diff.js.map +0 -1
  1885. package/dist/src/agent/tools/error-pattern-matcher.js.map +0 -1
  1886. package/dist/src/agent/tools/error-tracker.js.map +0 -1
  1887. package/dist/src/agent/tools/exec-command.js.map +0 -1
  1888. package/dist/src/agent/tools/execute-code-tool.js.map +0 -1
  1889. package/dist/src/agent/tools/executor.js.map +0 -1
  1890. package/dist/src/agent/tools/factory.js.map +0 -1
  1891. package/dist/src/agent/tools/find.js.map +0 -1
  1892. package/dist/src/agent/tools/goal-evidence-recorder.js.map +0 -1
  1893. package/dist/src/agent/tools/goal-tool.js.map +0 -1
  1894. package/dist/src/agent/tools/grep.js.map +0 -1
  1895. package/dist/src/agent/tools/image-generate-tool.js.map +0 -1
  1896. package/dist/src/agent/tools/image-tool.js.map +0 -1
  1897. package/dist/src/agent/tools/list-dir.js.map +0 -1
  1898. package/dist/src/agent/tools/media-read-tool.js.map +0 -1
  1899. package/dist/src/agent/tools/memory-tool.js.map +0 -1
  1900. package/dist/src/agent/tools/metadata.js.map +0 -1
  1901. package/dist/src/agent/tools/read.js.map +0 -1
  1902. package/dist/src/agent/tools/search/http.js.map +0 -1
  1903. package/dist/src/agent/tools/search/providers/bing-api.js.map +0 -1
  1904. package/dist/src/agent/tools/search/providers/bing-html.js.map +0 -1
  1905. package/dist/src/agent/tools/search/providers/brave.js.map +0 -1
  1906. package/dist/src/agent/tools/search/providers/duckduckgo-html.js.map +0 -1
  1907. package/dist/src/agent/tools/search/providers/searxng.js.map +0 -1
  1908. package/dist/src/agent/tools/search/providers/tavily.js.map +0 -1
  1909. package/dist/src/agent/tools/search/region.js.map +0 -1
  1910. package/dist/src/agent/tools/search/registry.js.map +0 -1
  1911. package/dist/src/agent/tools/search/resolve-config.js.map +0 -1
  1912. package/dist/src/agent/tools/send-media.js.map +0 -1
  1913. package/dist/src/agent/tools/session-search-tool.js.map +0 -1
  1914. package/dist/src/agent/tools/session-status-tool.js.map +0 -1
  1915. package/dist/src/agent/tools/skill-install-tool.js.map +0 -1
  1916. package/dist/src/agent/tools/skill-manage-tool.js.map +0 -1
  1917. package/dist/src/agent/tools/skills-tools.js.map +0 -1
  1918. package/dist/src/agent/tools/structured-output.js.map +0 -1
  1919. package/dist/src/agent/tools/todo-tool.js.map +0 -1
  1920. package/dist/src/agent/tools/tool-manual-tool.js.map +0 -1
  1921. package/dist/src/agent/tools/tool-paths.js.map +0 -1
  1922. package/dist/src/agent/tools/truncate.js.map +0 -1
  1923. package/dist/src/agent/tools/tts-tool.js.map +0 -1
  1924. package/dist/src/agent/tools/update-plan-tool.js.map +0 -1
  1925. package/dist/src/agent/tools/url-safety.js.map +0 -1
  1926. package/dist/src/agent/tools/usage-analyzer.js.map +0 -1
  1927. package/dist/src/agent/tools/web-extract.js.map +0 -1
  1928. package/dist/src/agent/tools/web.js.map +0 -1
  1929. package/dist/src/agent/tools/workflow-tool.js.map +0 -1
  1930. package/dist/src/agent/tools/write.js.map +0 -1
  1931. package/dist/src/agent/tools/xopc-use-tool.js.map +0 -1
  1932. package/dist/src/agent/transcript/google-api.js.map +0 -1
  1933. package/dist/src/agent/transcript/model-selection.js.map +0 -1
  1934. package/dist/src/agent/transcript/provider-capabilities.js.map +0 -1
  1935. package/dist/src/agent/transcript/session-transcript-repair.js.map +0 -1
  1936. package/dist/src/agent/transcript/strip-tool-messages.js.map +0 -1
  1937. package/dist/src/agent/transcript/thinking-types.js.map +0 -1
  1938. package/dist/src/agent/transcript/thinking.js.map +0 -1
  1939. package/dist/src/agent/transcript/tool-call-id.js.map +0 -1
  1940. package/dist/src/agent/transcript/transcript-hygiene.js.map +0 -1
  1941. package/dist/src/agent/transcript/transcript-policy.js.map +0 -1
  1942. package/dist/src/agent/workflow/agent-progress.js.map +0 -1
  1943. package/dist/src/agent/workflow/builtins/index.js.map +0 -1
  1944. package/dist/src/agent/workflow/catalog.js.map +0 -1
  1945. package/dist/src/agent/workflow/progress-broker.js.map +0 -1
  1946. package/dist/src/agent/workflow/snapshot-empty.js.map +0 -1
  1947. package/dist/src/agent/workflow/snapshot.js.map +0 -1
  1948. package/dist/src/agent/workflow/step-labels.js.map +0 -1
  1949. package/dist/src/agent/workflow/structured-output-tool.js.map +0 -1
  1950. package/dist/src/agent/workflow/subagent-runner.js.map +0 -1
  1951. package/dist/src/agent/workflow/workflow-child-tools.js.map +0 -1
  1952. package/dist/src/agent/workspace-runtime/registry.js.map +0 -1
  1953. package/dist/src/agent-manifest/index.js.map +0 -1
  1954. package/dist/src/agent-manifest/preset-chain.js.map +0 -1
  1955. package/dist/src/agent-manifest/prompt.js.map +0 -1
  1956. package/dist/src/agent-manifest/resolver.js.map +0 -1
  1957. package/dist/src/agent-manifest/schema.js.map +0 -1
  1958. package/dist/src/agent-manifest/validator.js.map +0 -1
  1959. package/dist/src/agent-runtime/boundary-guard.js.map +0 -1
  1960. package/dist/src/agent-runtime/memory-runtime.js.map +0 -1
  1961. package/dist/src/agent-runtime/model-router.js.map +0 -1
  1962. package/dist/src/agent-runtime/run-trace.js.map +0 -1
  1963. package/dist/src/agent-runtime/runtime-profile.js.map +0 -1
  1964. package/dist/src/agent-runtime/tool-registry.js.map +0 -1
  1965. package/dist/src/agent-runtime/workflow-runtime.js.map +0 -1
  1966. package/dist/src/ai-assist/text-assist.js.map +0 -1
  1967. package/dist/src/auth/credentials.js.map +0 -1
  1968. package/dist/src/auth/index.js.map +0 -1
  1969. package/dist/src/auth/oauth/anthropic.js.map +0 -1
  1970. package/dist/src/auth/oauth/github-copilot.js.map +0 -1
  1971. package/dist/src/auth/oauth/google-oauth/google-antigravity.js.map +0 -1
  1972. package/dist/src/auth/oauth/google-oauth/google-gemini-cli.js.map +0 -1
  1973. package/dist/src/auth/oauth/google-oauth/oauth-page.js.map +0 -1
  1974. package/dist/src/auth/oauth/google-oauth/pkce.js.map +0 -1
  1975. package/dist/src/auth/oauth/kimi-coding.js.map +0 -1
  1976. package/dist/src/auth/oauth/minimax-cn.js.map +0 -1
  1977. package/dist/src/auth/oauth/minimax.js.map +0 -1
  1978. package/dist/src/auth/oauth/openai-codex.js.map +0 -1
  1979. package/dist/src/auth/oauth/pkce.js.map +0 -1
  1980. package/dist/src/auth/profiles/oauth.js.map +0 -1
  1981. package/dist/src/auth/profiles/order.js.map +0 -1
  1982. package/dist/src/auth/profiles/profiles.js.map +0 -1
  1983. package/dist/src/auth/profiles/store.js.map +0 -1
  1984. package/dist/src/auth/sync-provider-auth.js.map +0 -1
  1985. package/dist/src/automations/api/routes.js.map +0 -1
  1986. package/dist/src/automations/domain/schedule.js.map +0 -1
  1987. package/dist/src/automations/domain/validation.js.map +0 -1
  1988. package/dist/src/automations/draft/automation-draft-prompt.js.map +0 -1
  1989. package/dist/src/automations/draft/automation-draft-service.js.map +0 -1
  1990. package/dist/src/automations/draft/automation-draft-validator.js.map +0 -1
  1991. package/dist/src/automations/product-events.js.map +0 -1
  1992. package/dist/src/automations/service/action-executor.js.map +0 -1
  1993. package/dist/src/automations/service/automation-service.js.map +0 -1
  1994. package/dist/src/automations/storage/automation-repository.js.map +0 -1
  1995. package/dist/src/automations/storage/automation-run-repository.js.map +0 -1
  1996. package/dist/src/browser/actions/extension-registry-bridge.js.map +0 -1
  1997. package/dist/src/browser/actions/registry.js.map +0 -1
  1998. package/dist/src/browser/backend-from-config.js.map +0 -1
  1999. package/dist/src/browser/browser-command-timeout.js.map +0 -1
  2000. package/dist/src/browser/cache-dir-policy.js.map +0 -1
  2001. package/dist/src/browser/cdp-local-launcher.js.map +0 -1
  2002. package/dist/src/browser/cdp-supervisor.js.map +0 -1
  2003. package/dist/src/browser/free-port.js.map +0 -1
  2004. package/dist/src/browser/humanize.js.map +0 -1
  2005. package/dist/src/browser/install-lock.js.map +0 -1
  2006. package/dist/src/browser/manager.js.map +0 -1
  2007. package/dist/src/browser/pipeline/output.js.map +0 -1
  2008. package/dist/src/browser/pipeline/runner.js.map +0 -1
  2009. package/dist/src/browser/pipeline/schema.js.map +0 -1
  2010. package/dist/src/browser/pipeline/source.js.map +0 -1
  2011. package/dist/src/browser/pipeline/template.js.map +0 -1
  2012. package/dist/src/browser/providers/browser-ext-install.js.map +0 -1
  2013. package/dist/src/browser/providers/browser-use.js.map +0 -1
  2014. package/dist/src/browser/providers/browserbase.js.map +0 -1
  2015. package/dist/src/browser/providers/cloakbrowser.js.map +0 -1
  2016. package/dist/src/browser/providers/extension-ws-acquire.js.map +0 -1
  2017. package/dist/src/browser/providers/extension.js.map +0 -1
  2018. package/dist/src/browser/providers/playwright-doctor.js.map +0 -1
  2019. package/dist/src/browser/providers/playwright-install.js.map +0 -1
  2020. package/dist/src/browser/readiness.js.map +0 -1
  2021. package/dist/src/browser/schemas.js.map +0 -1
  2022. package/dist/src/browser/session-lifecycle.js.map +0 -1
  2023. package/dist/src/browser/snapshot-helpers.js.map +0 -1
  2024. package/dist/src/browser/stealth.js.map +0 -1
  2025. package/dist/src/browser/url-policy.js.map +0 -1
  2026. package/dist/src/capabilities/store-connector.js.map +0 -1
  2027. package/dist/src/channels/attachments/attachment-classifiers.js.map +0 -1
  2028. package/dist/src/channels/attachments/inbound-persist.js.map +0 -1
  2029. package/dist/src/channels/attachments/inbound-types.js.map +0 -1
  2030. package/dist/src/channels/attachments/outbound-tts-persist.js.map +0 -1
  2031. package/dist/src/channels/attachments/voice-stt-webchat.js.map +0 -1
  2032. package/dist/src/channels/catalog/channel-catalog-service.js.map +0 -1
  2033. package/dist/src/channels/config-helpers.js.map +0 -1
  2034. package/dist/src/channels/envelope-timestamp.js.map +0 -1
  2035. package/dist/src/channels/exec-approval-runtime.js.map +0 -1
  2036. package/dist/src/channels/health-monitor.js.map +0 -1
  2037. package/dist/src/channels/heartbeat-scheduler.js.map +0 -1
  2038. package/dist/src/channels/internal-outbound.js.map +0 -1
  2039. package/dist/src/channels/lifecycle-supervisor.js.map +0 -1
  2040. package/dist/src/channels/manager.js.map +0 -1
  2041. package/dist/src/channels/media.js.map +0 -1
  2042. package/dist/src/channels/outbound/deliver.js.map +0 -1
  2043. package/dist/src/channels/outbound/normalize.js.map +0 -1
  2044. package/dist/src/channels/outbound/persist-store.js.map +0 -1
  2045. package/dist/src/channels/outbound/queue.js.map +0 -1
  2046. package/dist/src/channels/outbound-sender.js.map +0 -1
  2047. package/dist/src/channels/pairing/allow-from-file.js.map +0 -1
  2048. package/dist/src/channels/pairing/approve-cli.js.map +0 -1
  2049. package/dist/src/channels/pairing/pairing-challenge.js.map +0 -1
  2050. package/dist/src/channels/pairing/pairing-constants.js.map +0 -1
  2051. package/dist/src/channels/pairing/pairing-events.js.map +0 -1
  2052. package/dist/src/channels/pairing/pairing-messages.js.map +0 -1
  2053. package/dist/src/channels/pairing/pairing-service.js.map +0 -1
  2054. package/dist/src/channels/pairing/pairing-store-adapter.js.map +0 -1
  2055. package/dist/src/channels/pairing/pairing-store.js.map +0 -1
  2056. package/dist/src/channels/pairing/paths.js.map +0 -1
  2057. package/dist/src/channels/pairing/preseed-allow-from.js.map +0 -1
  2058. package/dist/src/channels/pipeline.js.map +0 -1
  2059. package/dist/src/channels/plugin-registry.js.map +0 -1
  2060. package/dist/src/channels/plugins/registry.js.map +0 -1
  2061. package/dist/src/channels/restart-policy.js.map +0 -1
  2062. package/dist/src/channels/security-helpers.js.map +0 -1
  2063. package/dist/src/channels/security.js.map +0 -1
  2064. package/dist/src/channels/setup-wizard-discovery.js.map +0 -1
  2065. package/dist/src/chat-commands/agent-edit.js.map +0 -1
  2066. package/dist/src/chat-commands/builtins/config.js.map +0 -1
  2067. package/dist/src/chat-commands/builtins/context.js.map +0 -1
  2068. package/dist/src/chat-commands/builtins/goal.js.map +0 -1
  2069. package/dist/src/chat-commands/builtins/model.js.map +0 -1
  2070. package/dist/src/chat-commands/builtins/review.js.map +0 -1
  2071. package/dist/src/chat-commands/builtins/session.js.map +0 -1
  2072. package/dist/src/chat-commands/builtins/skill.js.map +0 -1
  2073. package/dist/src/chat-commands/builtins/subgoal.js.map +0 -1
  2074. package/dist/src/chat-commands/builtins/system.js.map +0 -1
  2075. package/dist/src/chat-commands/builtins/thinking.js.map +0 -1
  2076. package/dist/src/chat-commands/builtins/tts.js.map +0 -1
  2077. package/dist/src/chat-commands/builtins/workflow.js.map +0 -1
  2078. package/dist/src/chat-commands/command-parse.js.map +0 -1
  2079. package/dist/src/chat-commands/config-paths.js.map +0 -1
  2080. package/dist/src/chat-commands/config-value.js.map +0 -1
  2081. package/dist/src/chat-commands/context.js.map +0 -1
  2082. package/dist/src/chat-commands/format-output.js.map +0 -1
  2083. package/dist/src/chat-commands/index.js.map +0 -1
  2084. package/dist/src/chat-commands/processor.js.map +0 -1
  2085. package/dist/src/chat-commands/registry.js.map +0 -1
  2086. package/dist/src/chat-commands/session-key.js.map +0 -1
  2087. package/dist/src/cli/argv-invocation.js.map +0 -1
  2088. package/dist/src/cli/argv.js.map +0 -1
  2089. package/dist/src/cli/bin.js.map +0 -1
  2090. package/dist/src/cli/cli-log-level-preset.js.map +0 -1
  2091. package/dist/src/cli/command-catalog.js.map +0 -1
  2092. package/dist/src/cli/command-loaders.js.map +0 -1
  2093. package/dist/src/cli/command-manifest.js.map +0 -1
  2094. package/dist/src/cli/command-path-matches.js.map +0 -1
  2095. package/dist/src/cli/command-path-policy.js.map +0 -1
  2096. package/dist/src/cli/command-startup-policy.js.map +0 -1
  2097. package/dist/src/cli/commands/agent/interactive.js.map +0 -1
  2098. package/dist/src/cli/commands/agent/sessions.js.map +0 -1
  2099. package/dist/src/cli/commands/agent/stream-renderer.js.map +0 -1
  2100. package/dist/src/cli/commands/agent.js.map +0 -1
  2101. package/dist/src/cli/commands/agents.js.map +0 -1
  2102. package/dist/src/cli/commands/auth.js.map +0 -1
  2103. package/dist/src/cli/commands/browser-cli-helpers.js.map +0 -1
  2104. package/dist/src/cli/commands/browser.js.map +0 -1
  2105. package/dist/src/cli/commands/channels.js.map +0 -1
  2106. package/dist/src/cli/commands/config.js.map +0 -1
  2107. package/dist/src/cli/commands/connectors.js.map +0 -1
  2108. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +0 -1
  2109. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js.map +0 -1
  2110. package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +0 -1
  2111. package/dist/src/cli/commands/doctor/checks/config-health.js.map +0 -1
  2112. package/dist/src/cli/commands/doctor/checks/database-schema.js.map +0 -1
  2113. package/dist/src/cli/commands/doctor/checks/gateway-health.js.map +0 -1
  2114. package/dist/src/cli/commands/doctor/checks/gateway-service.js.map +0 -1
  2115. package/dist/src/cli/commands/doctor/checks/migrations.js.map +0 -1
  2116. package/dist/src/cli/commands/doctor/checks/node-version.js.map +0 -1
  2117. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +0 -1
  2118. package/dist/src/cli/commands/doctor/checks/security-audit.js.map +0 -1
  2119. package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +0 -1
  2120. package/dist/src/cli/commands/doctor/checks/state-integrity.js.map +0 -1
  2121. package/dist/src/cli/commands/doctor/checks/version-check.js.map +0 -1
  2122. package/dist/src/cli/commands/doctor/checks/workspace-status.js.map +0 -1
  2123. package/dist/src/cli/commands/doctor/flow.js.map +0 -1
  2124. package/dist/src/cli/commands/doctor/format.js.map +0 -1
  2125. package/dist/src/cli/commands/doctor/index.js.map +0 -1
  2126. package/dist/src/cli/commands/extension-create.js.map +0 -1
  2127. package/dist/src/cli/commands/extension-dev.js.map +0 -1
  2128. package/dist/src/cli/commands/extension-marketplace.js.map +0 -1
  2129. package/dist/src/cli/commands/extension-pack.js.map +0 -1
  2130. package/dist/src/cli/commands/extension.js.map +0 -1
  2131. package/dist/src/cli/commands/gateway/call.js.map +0 -1
  2132. package/dist/src/cli/commands/gateway/health.js.map +0 -1
  2133. package/dist/src/cli/commands/gateway/lifecycle-core.js.map +0 -1
  2134. package/dist/src/cli/commands/gateway/lifecycle.js.map +0 -1
  2135. package/dist/src/cli/commands/gateway/logs.js.map +0 -1
  2136. package/dist/src/cli/commands/gateway/probe.js.map +0 -1
  2137. package/dist/src/cli/commands/gateway/restart-health.js.map +0 -1
  2138. package/dist/src/cli/commands/gateway/restart.js.map +0 -1
  2139. package/dist/src/cli/commands/gateway/run-foreground.js.map +0 -1
  2140. package/dist/src/cli/commands/gateway/service.js.map +0 -1
  2141. package/dist/src/cli/commands/gateway/shared.js.map +0 -1
  2142. package/dist/src/cli/commands/gateway/status.js.map +0 -1
  2143. package/dist/src/cli/commands/gateway/stop.js.map +0 -1
  2144. package/dist/src/cli/commands/gateway/subcommands.js.map +0 -1
  2145. package/dist/src/cli/commands/gateway/token.js.map +0 -1
  2146. package/dist/src/cli/commands/gateway-ssh-tunnel.js.map +0 -1
  2147. package/dist/src/cli/commands/gateway.js.map +0 -1
  2148. package/dist/src/cli/commands/goal.js.map +0 -1
  2149. package/dist/src/cli/commands/image.js.map +0 -1
  2150. package/dist/src/cli/commands/init.js.map +0 -1
  2151. package/dist/src/cli/commands/logs.js.map +0 -1
  2152. package/dist/src/cli/commands/models.js.map +0 -1
  2153. package/dist/src/cli/commands/onboard/channels/index.js.map +0 -1
  2154. package/dist/src/cli/commands/onboard/channels/onboard-to-configurator.js.map +0 -1
  2155. package/dist/src/cli/commands/onboard/channels/registry.js.map +0 -1
  2156. package/dist/src/cli/commands/onboard/channels/wizard-to-configurator.js.map +0 -1
  2157. package/dist/src/cli/commands/onboard/gateway.js.map +0 -1
  2158. package/dist/src/cli/commands/onboard/model.js.map +0 -1
  2159. package/dist/src/cli/commands/onboard.js.map +0 -1
  2160. package/dist/src/cli/commands/profile.js.map +0 -1
  2161. package/dist/src/cli/commands/project.js.map +0 -1
  2162. package/dist/src/cli/commands/providers.js.map +0 -1
  2163. package/dist/src/cli/commands/resume.js.map +0 -1
  2164. package/dist/src/cli/commands/search.js.map +0 -1
  2165. package/dist/src/cli/commands/session/actions.js.map +0 -1
  2166. package/dist/src/cli/commands/session/utils.js.map +0 -1
  2167. package/dist/src/cli/commands/session.js.map +0 -1
  2168. package/dist/src/cli/commands/setup-shared/output.js.map +0 -1
  2169. package/dist/src/cli/commands/setup-shared/prompts.js.map +0 -1
  2170. package/dist/src/cli/commands/setup-shared/runner.js.map +0 -1
  2171. package/dist/src/cli/commands/setup-shared/types.js.map +0 -1
  2172. package/dist/src/cli/commands/setup.js.map +0 -1
  2173. package/dist/src/cli/commands/skills-test.js.map +0 -1
  2174. package/dist/src/cli/commands/skills.js.map +0 -1
  2175. package/dist/src/cli/commands/tailscale.js.map +0 -1
  2176. package/dist/src/cli/commands/tui-runner.js.map +0 -1
  2177. package/dist/src/cli/commands/tui.js.map +0 -1
  2178. package/dist/src/cli/commands/tunnel.js.map +0 -1
  2179. package/dist/src/cli/commands/update.js.map +0 -1
  2180. package/dist/src/cli/commands/voice.js.map +0 -1
  2181. package/dist/src/cli/context.js.map +0 -1
  2182. package/dist/src/cli/extension-cli-register.js.map +0 -1
  2183. package/dist/src/cli/gateway-run-argv.js.map +0 -1
  2184. package/dist/src/cli/gateway-run-fast-path.js.map +0 -1
  2185. package/dist/src/cli/index.js.map +0 -1
  2186. package/dist/src/cli/registry.js.map +0 -1
  2187. package/dist/src/cli/templates.js.map +0 -1
  2188. package/dist/src/cli/utils/colors.js.map +0 -1
  2189. package/dist/src/cli/utils/gateway-client-options.js.map +0 -1
  2190. package/dist/src/cli/utils/gateway-client.js.map +0 -1
  2191. package/dist/src/cli/utils/init-workspace-core.js.map +0 -1
  2192. package/dist/src/cli/utils/init-workspace.js.map +0 -1
  2193. package/dist/src/cli/utils/oauth-login.js.map +0 -1
  2194. package/dist/src/cli/utils/oauth-providers.js.map +0 -1
  2195. package/dist/src/cli/utils/session.js.map +0 -1
  2196. package/dist/src/commands/agents.config.js.map +0 -1
  2197. package/dist/src/config/agent-profile.js.map +0 -1
  2198. package/dist/src/config/agent-typed-models.js.map +0 -1
  2199. package/dist/src/config/commands.flags.js.map +0 -1
  2200. package/dist/src/config/default-model.js.map +0 -1
  2201. package/dist/src/config/diff.js.map +0 -1
  2202. package/dist/src/config/gateway-bind.js.map +0 -1
  2203. package/dist/src/config/index.js.map +0 -1
  2204. package/dist/src/config/loader.js.map +0 -1
  2205. package/dist/src/config/mcp-config-normalize.js.map +0 -1
  2206. package/dist/src/config/model-input.js.map +0 -1
  2207. package/dist/src/config/models-json.js.map +0 -1
  2208. package/dist/src/config/paths-state.js.map +0 -1
  2209. package/dist/src/config/paths.js.map +0 -1
  2210. package/dist/src/config/profile.js.map +0 -1
  2211. package/dist/src/config/public-url.js.map +0 -1
  2212. package/dist/src/config/reload.js.map +0 -1
  2213. package/dist/src/config/resolve-config-value.js.map +0 -1
  2214. package/dist/src/config/rules.js.map +0 -1
  2215. package/dist/src/config/runtime-overrides.js.map +0 -1
  2216. package/dist/src/config/schema.js.map +0 -1
  2217. package/dist/src/config/validate-channel-configs.js.map +0 -1
  2218. package/dist/src/config/voice.js.map +0 -1
  2219. package/dist/src/config/web-patch.js.map +0 -1
  2220. package/dist/src/config/workspace-defaults.js.map +0 -1
  2221. package/dist/src/config/workspace-dirs.js.map +0 -1
  2222. package/dist/src/config/workspace-path-helpers.js.map +0 -1
  2223. package/dist/src/config/workspace-path.js.map +0 -1
  2224. package/dist/src/connectors/approval.js.map +0 -1
  2225. package/dist/src/connectors/auth-provider-registry.js.map +0 -1
  2226. package/dist/src/connectors/builtin-catalog.js.map +0 -1
  2227. package/dist/src/connectors/catalog.js.map +0 -1
  2228. package/dist/src/connectors/composio-catalog.js.map +0 -1
  2229. package/dist/src/connectors/composio-logo.js.map +0 -1
  2230. package/dist/src/connectors/composio-sessions.js.map +0 -1
  2231. package/dist/src/connectors/composio-triggers.js.map +0 -1
  2232. package/dist/src/connectors/composio.js.map +0 -1
  2233. package/dist/src/connectors/connector-memory-sync.js.map +0 -1
  2234. package/dist/src/connectors/health.js.map +0 -1
  2235. package/dist/src/connectors/install.js.map +0 -1
  2236. package/dist/src/connectors/instances.js.map +0 -1
  2237. package/dist/src/connectors/integration-strategy.js.map +0 -1
  2238. package/dist/src/connectors/lifecycle.js.map +0 -1
  2239. package/dist/src/connectors/materialize.js.map +0 -1
  2240. package/dist/src/connectors/policy.js.map +0 -1
  2241. package/dist/src/connectors/providers.js.map +0 -1
  2242. package/dist/src/connectors/registries/modelscope.js.map +0 -1
  2243. package/dist/src/connectors/registries/official-mcp.js.map +0 -1
  2244. package/dist/src/connectors/registries/search.js.map +0 -1
  2245. package/dist/src/connectors/registries/smithery.js.map +0 -1
  2246. package/dist/src/connectors/runtime-adapter-registry.js.map +0 -1
  2247. package/dist/src/connectors/secret-store.js.map +0 -1
  2248. package/dist/src/connectors/setup-secrets.js.map +0 -1
  2249. package/dist/src/connectors/supervisor.js.map +0 -1
  2250. package/dist/src/connectors/usage.js.map +0 -1
  2251. package/dist/src/connectors/workflow-preflight.js.map +0 -1
  2252. package/dist/src/daemon/constants.js.map +0 -1
  2253. package/dist/src/daemon/install-plan.js.map +0 -1
  2254. package/dist/src/daemon/launchd.js.map +0 -1
  2255. package/dist/src/daemon/schtasks.js.map +0 -1
  2256. package/dist/src/daemon/service-audit.js.map +0 -1
  2257. package/dist/src/daemon/service.js.map +0 -1
  2258. package/dist/src/daemon/systemd.js.map +0 -1
  2259. package/dist/src/document-understanding/extract.js.map +0 -1
  2260. package/dist/src/errors/index.js.map +0 -1
  2261. package/dist/src/extensions/activation-context.js.map +0 -1
  2262. package/dist/src/extensions/activation-planner.js.map +0 -1
  2263. package/dist/src/extensions/api.js.map +0 -1
  2264. package/dist/src/extensions/bundle-mcp.js.map +0 -1
  2265. package/dist/src/extensions/bundled-extension-activation.js.map +0 -1
  2266. package/dist/src/extensions/diagnostics.js.map +0 -1
  2267. package/dist/src/extensions/discover-extensions.js.map +0 -1
  2268. package/dist/src/extensions/engine-check.js.map +0 -1
  2269. package/dist/src/extensions/extension-metadata-snapshot.js.map +0 -1
  2270. package/dist/src/extensions/extension-registry-impl.js.map +0 -1
  2271. package/dist/src/extensions/health.js.map +0 -1
  2272. package/dist/src/extensions/hooks.js.map +0 -1
  2273. package/dist/src/extensions/index.js.map +0 -1
  2274. package/dist/src/extensions/install-transaction.js.map +0 -1
  2275. package/dist/src/extensions/install.js.map +0 -1
  2276. package/dist/src/extensions/loader.js.map +0 -1
  2277. package/dist/src/extensions/lockfile.js.map +0 -1
  2278. package/dist/src/extensions/manifest-registry.js.map +0 -1
  2279. package/dist/src/extensions/marketplace.js.map +0 -1
  2280. package/dist/src/extensions/media-provider-contracts.js.map +0 -1
  2281. package/dist/src/extensions/normalize-manifest.js.map +0 -1
  2282. package/dist/src/extensions/onboard-helpers.js.map +0 -1
  2283. package/dist/src/extensions/package-contract.js.map +0 -1
  2284. package/dist/src/extensions/sdk/channel-entry.js.map +0 -1
  2285. package/dist/src/extensions/sdk/channel-helpers.js.map +0 -1
  2286. package/dist/src/extensions/sdk/index.js.map +0 -1
  2287. package/dist/src/extensions/sdk/lazy.js.map +0 -1
  2288. package/dist/src/extensions/sdk/testing.js.map +0 -1
  2289. package/dist/src/extensions/security.js.map +0 -1
  2290. package/dist/src/extensions/slots.js.map +0 -1
  2291. package/dist/src/extensions/speech-provider-contracts.js.map +0 -1
  2292. package/dist/src/extensions/store-zip-limits.js.map +0 -1
  2293. package/dist/src/extensions/typed-event-bus.js.map +0 -1
  2294. package/dist/src/extensions/types/hooks.js.map +0 -1
  2295. package/dist/src/extensions/types/providers.js.map +0 -1
  2296. package/dist/src/extensions/update.js.map +0 -1
  2297. package/dist/src/extensions/when-context.js.map +0 -1
  2298. package/dist/src/extensions/when-expression.js.map +0 -1
  2299. package/dist/src/gateway/agent-builtin-tools.js.map +0 -1
  2300. package/dist/src/gateway/agent-run-relay.js.map +0 -1
  2301. package/dist/src/gateway/agents-admin.js.map +0 -1
  2302. package/dist/src/gateway/auth.js.map +0 -1
  2303. package/dist/src/gateway/capability-presets-admin.js.map +0 -1
  2304. package/dist/src/gateway/chat-limits.js.map +0 -1
  2305. package/dist/src/gateway/chat-stream/mapper.js.map +0 -1
  2306. package/dist/src/gateway/clarify-bridge.js.map +0 -1
  2307. package/dist/src/gateway/clarify-runtime.js.map +0 -1
  2308. package/dist/src/gateway/client-ip.js.map +0 -1
  2309. package/dist/src/gateway/config-tools-web.js.map +0 -1
  2310. package/dist/src/gateway/credential.js.map +0 -1
  2311. package/dist/src/gateway/discovery/mdns.js.map +0 -1
  2312. package/dist/src/gateway/dreaming-automation-reconciler.js.map +0 -1
  2313. package/dist/src/gateway/ensure-network-cors.js.map +0 -1
  2314. package/dist/src/gateway/file-path-classifier.js.map +0 -1
  2315. package/dist/src/gateway/file-reference-registry.js.map +0 -1
  2316. package/dist/src/gateway/global-defaults-admin.js.map +0 -1
  2317. package/dist/src/gateway/heartbeat/service.js.map +0 -1
  2318. package/dist/src/gateway/hono/app.js.map +0 -1
  2319. package/dist/src/gateway/hono/lib/agent-model.js.map +0 -1
  2320. package/dist/src/gateway/hono/lib/config-payload.js.map +0 -1
  2321. package/dist/src/gateway/hono/lib/extension-assets.js.map +0 -1
  2322. package/dist/src/gateway/hono/lib/extension-store.js.map +0 -1
  2323. package/dist/src/gateway/hono/lib/mask-secret-length.js.map +0 -1
  2324. package/dist/src/gateway/hono/lib/route-logger.js.map +0 -1
  2325. package/dist/src/gateway/hono/lib/safe-providers-config.js.map +0 -1
  2326. package/dist/src/gateway/hono/lib/safe-voice-config.js.map +0 -1
  2327. package/dist/src/gateway/hono/lib/startup-unavailable.js.map +0 -1
  2328. package/dist/src/gateway/hono/lib/static-ui.js.map +0 -1
  2329. package/dist/src/gateway/hono/middleware/auth.js.map +0 -1
  2330. package/dist/src/gateway/hono/middleware/log-context.js.map +0 -1
  2331. package/dist/src/gateway/hono/middleware/logger.js.map +0 -1
  2332. package/dist/src/gateway/hono/middleware/route-errors.js.map +0 -1
  2333. package/dist/src/gateway/hono/middleware/scopes.js.map +0 -1
  2334. package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +0 -1
  2335. package/dist/src/gateway/hono/oauth-async.js.map +0 -1
  2336. package/dist/src/gateway/hono/oauth.js.map +0 -1
  2337. package/dist/src/gateway/hono/routes/activity.js.map +0 -1
  2338. package/dist/src/gateway/hono/routes/agent-stream.js.map +0 -1
  2339. package/dist/src/gateway/hono/routes/agents.js.map +0 -1
  2340. package/dist/src/gateway/hono/routes/ai-assist.js.map +0 -1
  2341. package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +0 -1
  2342. package/dist/src/gateway/hono/routes/browser-install.js.map +0 -1
  2343. package/dist/src/gateway/hono/routes/browser.js.map +0 -1
  2344. package/dist/src/gateway/hono/routes/capabilities.js.map +0 -1
  2345. package/dist/src/gateway/hono/routes/capability-presets.js.map +0 -1
  2346. package/dist/src/gateway/hono/routes/channels.js.map +0 -1
  2347. package/dist/src/gateway/hono/routes/commands-skills.js.map +0 -1
  2348. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +0 -1
  2349. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +0 -1
  2350. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +0 -1
  2351. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +0 -1
  2352. package/dist/src/gateway/hono/routes/config-patch/result.js.map +0 -1
  2353. package/dist/src/gateway/hono/routes/config.js.map +0 -1
  2354. package/dist/src/gateway/hono/routes/connectors.js.map +0 -1
  2355. package/dist/src/gateway/hono/routes/doctor.js.map +0 -1
  2356. package/dist/src/gateway/hono/routes/dreaming.js.map +0 -1
  2357. package/dist/src/gateway/hono/routes/exposure.js.map +0 -1
  2358. package/dist/src/gateway/hono/routes/extension-gateway.js.map +0 -1
  2359. package/dist/src/gateway/hono/routes/global-defaults.js.map +0 -1
  2360. package/dist/src/gateway/hono/routes/goals.js.map +0 -1
  2361. package/dist/src/gateway/hono/routes/home.js.map +0 -1
  2362. package/dist/src/gateway/hono/routes/host-fs.js.map +0 -1
  2363. package/dist/src/gateway/hono/routes/index.js.map +0 -1
  2364. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +0 -1
  2365. package/dist/src/gateway/hono/routes/lazy-fallback.js.map +0 -1
  2366. package/dist/src/gateway/hono/routes/local-apps.js.map +0 -1
  2367. package/dist/src/gateway/hono/routes/logs.js.map +0 -1
  2368. package/dist/src/gateway/hono/routes/mcp.js.map +0 -1
  2369. package/dist/src/gateway/hono/routes/media.js.map +0 -1
  2370. package/dist/src/gateway/hono/routes/memory.js.map +0 -1
  2371. package/dist/src/gateway/hono/routes/migrations.js.map +0 -1
  2372. package/dist/src/gateway/hono/routes/mobile.js.map +0 -1
  2373. package/dist/src/gateway/hono/routes/models.js.map +0 -1
  2374. package/dist/src/gateway/hono/routes/notes.js.map +0 -1
  2375. package/dist/src/gateway/hono/routes/projects.js.map +0 -1
  2376. package/dist/src/gateway/hono/routes/public-gateway.js.map +0 -1
  2377. package/dist/src/gateway/hono/routes/search.js.map +0 -1
  2378. package/dist/src/gateway/hono/routes/sessions.js.map +0 -1
  2379. package/dist/src/gateway/hono/routes/shares.js.map +0 -1
  2380. package/dist/src/gateway/hono/routes/site-shares.js.map +0 -1
  2381. package/dist/src/gateway/hono/routes/status.js.map +0 -1
  2382. package/dist/src/gateway/hono/routes/tui.js.map +0 -1
  2383. package/dist/src/gateway/hono/routes/tunnel.js.map +0 -1
  2384. package/dist/src/gateway/hono/routes/update.js.map +0 -1
  2385. package/dist/src/gateway/hono/routes/voice.js.map +0 -1
  2386. package/dist/src/gateway/hono/routes/work-discovery.js.map +0 -1
  2387. package/dist/src/gateway/hono/routes/workflows.js.map +0 -1
  2388. package/dist/src/gateway/hono/routes/workspace.js.map +0 -1
  2389. package/dist/src/gateway/hono/routes/you.js.map +0 -1
  2390. package/dist/src/gateway/hono/sse-json.js.map +0 -1
  2391. package/dist/src/gateway/hono/sse.js.map +0 -1
  2392. package/dist/src/gateway/host.js.map +0 -1
  2393. package/dist/src/gateway/image-capabilities.js.map +0 -1
  2394. package/dist/src/gateway/listen.js.map +0 -1
  2395. package/dist/src/gateway/lock.js.map +0 -1
  2396. package/dist/src/gateway/ports.js.map +0 -1
  2397. package/dist/src/gateway/protocol.js.map +0 -1
  2398. package/dist/src/gateway/public-url.js.map +0 -1
  2399. package/dist/src/gateway/rate-limit/auth-policy.js.map +0 -1
  2400. package/dist/src/gateway/rate-limit/buckets.js.map +0 -1
  2401. package/dist/src/gateway/rate-limit/env-flags.js.map +0 -1
  2402. package/dist/src/gateway/resolve-channel-connect-defer.js.map +0 -1
  2403. package/dist/src/gateway/resolve-webchat-session-key.js.map +0 -1
  2404. package/dist/src/gateway/respawn.js.map +0 -1
  2405. package/dist/src/gateway/run-loop.js.map +0 -1
  2406. package/dist/src/gateway/runtime-config.js.map +0 -1
  2407. package/dist/src/gateway/security/audit.js.map +0 -1
  2408. package/dist/src/gateway/security/csp.js.map +0 -1
  2409. package/dist/src/gateway/security/dangerous-tools.js.map +0 -1
  2410. package/dist/src/gateway/security/external-content.js.map +0 -1
  2411. package/dist/src/gateway/security/known-weak-secrets.js.map +0 -1
  2412. package/dist/src/gateway/security/loopback.js.map +0 -1
  2413. package/dist/src/gateway/security/operator-scopes.js.map +0 -1
  2414. package/dist/src/gateway/security/origin-check.js.map +0 -1
  2415. package/dist/src/gateway/security/preauth-connection-budget.js.map +0 -1
  2416. package/dist/src/gateway/security/secret-equal.js.map +0 -1
  2417. package/dist/src/gateway/server-tailscale.js.map +0 -1
  2418. package/dist/src/gateway/server.js.map +0 -1
  2419. package/dist/src/gateway/service/agent-runner.js.map +0 -1
  2420. package/dist/src/gateway/service/config-coordinator.js.map +0 -1
  2421. package/dist/src/gateway/service/marketplace-service.js.map +0 -1
  2422. package/dist/src/gateway/service/run-gateway-agent.js.map +0 -1
  2423. package/dist/src/gateway/service/session-chat-ids.js.map +0 -1
  2424. package/dist/src/gateway/service/sessions-api.js.map +0 -1
  2425. package/dist/src/gateway/service/sse-hub.js.map +0 -1
  2426. package/dist/src/gateway/service.js.map +0 -1
  2427. package/dist/src/gateway/session-reset-service.js.map +0 -1
  2428. package/dist/src/gateway/startup-readiness.js.map +0 -1
  2429. package/dist/src/gateway/startup-trace.js.map +0 -1
  2430. package/dist/src/gateway/tailscale-auth.js.map +0 -1
  2431. package/dist/src/gateway/tailscale-lifecycle.js.map +0 -1
  2432. package/dist/src/gateway/tls-server.js.map +0 -1
  2433. package/dist/src/gateway/trusted-proxy.js.map +0 -1
  2434. package/dist/src/gateway/user-turn-input.js.map +0 -1
  2435. package/dist/src/gateway/workspace-editor-path.js.map +0 -1
  2436. package/dist/src/gateway/workspace-file-search.js.map +0 -1
  2437. package/dist/src/gateway/workspace-fs-file-list.js.map +0 -1
  2438. package/dist/src/gateway/workspace-heartbeat-path.js.map +0 -1
  2439. package/dist/src/gateway/workspace-ripgrep.js.map +0 -1
  2440. package/dist/src/gateway/ws-security.js.map +0 -1
  2441. package/dist/src/generated/bundled-image-generation-providers.js.map +0 -1
  2442. package/dist/src/goals/goal-contract-draft.js.map +0 -1
  2443. package/dist/src/goals/goal-evidence-review.js.map +0 -1
  2444. package/dist/src/goals/goal-notifications.js.map +0 -1
  2445. package/dist/src/goals/goal-queue-store.js.map +0 -1
  2446. package/dist/src/goals/goal-runner.js.map +0 -1
  2447. package/dist/src/goals/goal-service.js.map +0 -1
  2448. package/dist/src/goals/goal-store.js.map +0 -1
  2449. package/dist/src/goals/goal-workflow-judge.js.map +0 -1
  2450. package/dist/src/heartbeat/active-hours.js.map +0 -1
  2451. package/dist/src/heartbeat/content-check.js.map +0 -1
  2452. package/dist/src/heartbeat/event-prompt.js.map +0 -1
  2453. package/dist/src/heartbeat/tokens.js.map +0 -1
  2454. package/dist/src/heartbeat/wake.js.map +0 -1
  2455. package/dist/src/i18n/format.js.map +0 -1
  2456. package/dist/src/i18n/goals-bundle.js.map +0 -1
  2457. package/dist/src/i18n/locale.js.map +0 -1
  2458. package/dist/src/i18n/locales/goals.en.js.map +0 -1
  2459. package/dist/src/i18n/locales/goals.zh.js.map +0 -1
  2460. package/dist/src/i18n/locales/share-tool.en.js.map +0 -1
  2461. package/dist/src/i18n/locales/share-tool.zh.js.map +0 -1
  2462. package/dist/src/i18n/share-tool-bundle.js.map +0 -1
  2463. package/dist/src/index.js.map +0 -1
  2464. package/dist/src/infra/brew.js.map +0 -1
  2465. package/dist/src/infra/bus/queue.js.map +0 -1
  2466. package/dist/src/infra/debounce.js.map +0 -1
  2467. package/dist/src/infra/exec.js.map +0 -1
  2468. package/dist/src/infra/gateway-process-argv.js.map +0 -1
  2469. package/dist/src/infra/gateway-processes.js.map +0 -1
  2470. package/dist/src/infra/host-env-security-policy.js.map +0 -1
  2471. package/dist/src/infra/host-env-security.js.map +0 -1
  2472. package/dist/src/infra/http-proxy-env.js.map +0 -1
  2473. package/dist/src/infra/is-main.js.map +0 -1
  2474. package/dist/src/infra/json-utf8-bytes.js.map +0 -1
  2475. package/dist/src/infra/node-sqlite.js.map +0 -1
  2476. package/dist/src/infra/package-json.js.map +0 -1
  2477. package/dist/src/infra/package-update-steps.js.map +0 -1
  2478. package/dist/src/infra/path-env.js.map +0 -1
  2479. package/dist/src/infra/path-prepend.js.map +0 -1
  2480. package/dist/src/infra/ports.js.map +0 -1
  2481. package/dist/src/infra/rate-limit/failure-limiter.js.map +0 -1
  2482. package/dist/src/infra/rate-limit/keyed-store.js.map +0 -1
  2483. package/dist/src/infra/rate-limit/rate-limiter.js.map +0 -1
  2484. package/dist/src/infra/restart.js.map +0 -1
  2485. package/dist/src/infra/retry.js.map +0 -1
  2486. package/dist/src/infra/run-command.js.map +0 -1
  2487. package/dist/src/infra/sqlite-errors.js.map +0 -1
  2488. package/dist/src/infra/ssh-tunnel.js.map +0 -1
  2489. package/dist/src/infra/stable-node-path.js.map +0 -1
  2490. package/dist/src/infra/tailscale.js.map +0 -1
  2491. package/dist/src/infra/undici-fetch.js.map +0 -1
  2492. package/dist/src/infra/unhandled-rejections.js.map +0 -1
  2493. package/dist/src/infra/update-channels.js.map +0 -1
  2494. package/dist/src/infra/update-check.js.map +0 -1
  2495. package/dist/src/infra/update-global.js.map +0 -1
  2496. package/dist/src/infra/update-lock.js.map +0 -1
  2497. package/dist/src/infra/update-log.js.map +0 -1
  2498. package/dist/src/infra/update-restart.js.map +0 -1
  2499. package/dist/src/infra/update-runner.js.map +0 -1
  2500. package/dist/src/infra/update-startup.js.map +0 -1
  2501. package/dist/src/infra/warning-filter.js.map +0 -1
  2502. package/dist/src/infra/write-file-atomic.js.map +0 -1
  2503. package/dist/src/knowledge/connected-knowledge-pipeline.js.map +0 -1
  2504. package/dist/src/knowledge/coordinator.js.map +0 -1
  2505. package/dist/src/knowledge/ingestion-service.js.map +0 -1
  2506. package/dist/src/local-apps/acceptance.js.map +0 -1
  2507. package/dist/src/local-apps/preview-runtime-bridge.js.map +0 -1
  2508. package/dist/src/local-apps/runtime-entry.js.map +0 -1
  2509. package/dist/src/local-apps/scaffold.js.map +0 -1
  2510. package/dist/src/local-apps/service.js.map +0 -1
  2511. package/dist/src/local-apps/store.js.map +0 -1
  2512. package/dist/src/markdown/chunk.js.map +0 -1
  2513. package/dist/src/markdown/code-spans.js.map +0 -1
  2514. package/dist/src/markdown/fences.js.map +0 -1
  2515. package/dist/src/markdown/frontmatter.js.map +0 -1
  2516. package/dist/src/markdown/ir.js.map +0 -1
  2517. package/dist/src/markdown/render.js.map +0 -1
  2518. package/dist/src/markdown/tables.js.map +0 -1
  2519. package/dist/src/mcp/channel-bridge.js.map +0 -1
  2520. package/dist/src/mcp/channel-server.js.map +0 -1
  2521. package/dist/src/mcp/channel-shared.js.map +0 -1
  2522. package/dist/src/mcp/channel-tools.js.map +0 -1
  2523. package/dist/src/mcp/gateway-http-client.js.map +0 -1
  2524. package/dist/src/media/media-reference.js.map +0 -1
  2525. package/dist/src/media/paths.js.map +0 -1
  2526. package/dist/src/media/session-references.js.map +0 -1
  2527. package/dist/src/media/store.js.map +0 -1
  2528. package/dist/src/media/uri.js.map +0 -1
  2529. package/dist/src/media-shared/http/api-key-rotation.js.map +0 -1
  2530. package/dist/src/media-shared/http/deadline.js.map +0 -1
  2531. package/dist/src/media-shared/http/private-network.js.map +0 -1
  2532. package/dist/src/media-shared/http/provider-http-errors.js.map +0 -1
  2533. package/dist/src/media-shared/http/provider-http.js.map +0 -1
  2534. package/dist/src/media-shared/http/resolve-provider-http-request-config.js.map +0 -1
  2535. package/dist/src/media-shared/http/ssrf-guard.js.map +0 -1
  2536. package/dist/src/media-shared/http/test-helpers/mock-server.js.map +0 -1
  2537. package/dist/src/media-understanding/audio-transcription-runner.js.map +0 -1
  2538. package/dist/src/media-understanding/openai-compatible-audio.js.map +0 -1
  2539. package/dist/src/media-understanding/registry.js.map +0 -1
  2540. package/dist/src/media-understanding/resolve-entries.js.map +0 -1
  2541. package/dist/src/media-understanding/runner.js.map +0 -1
  2542. package/dist/src/migrations/config/default-capability-preset.js.map +0 -1
  2543. package/dist/src/migrations/registry.js.map +0 -1
  2544. package/dist/src/migrations/runner.js.map +0 -1
  2545. package/dist/src/mobile/notification-service.js.map +0 -1
  2546. package/dist/src/mobile/notification-store.js.map +0 -1
  2547. package/dist/src/mobile/notification-types.js.map +0 -1
  2548. package/dist/src/notes/agent-context.js.map +0 -1
  2549. package/dist/src/notes/attachment-ref.js.map +0 -1
  2550. package/dist/src/notes/note-attachment-sync.js.map +0 -1
  2551. package/dist/src/notes/note-index-meta.js.map +0 -1
  2552. package/dist/src/notes/note-markdown.js.map +0 -1
  2553. package/dist/src/notes/paths.js.map +0 -1
  2554. package/dist/src/notes/service.js.map +0 -1
  2555. package/dist/src/notes/store.js.map +0 -1
  2556. package/dist/src/package-version.js.map +0 -1
  2557. package/dist/src/pets/factory.js.map +0 -1
  2558. package/dist/src/pets/manifest.js.map +0 -1
  2559. package/dist/src/pets/validator.js.map +0 -1
  2560. package/dist/src/process/kill-tree.js.map +0 -1
  2561. package/dist/src/project-trust/trust-store.js.map +0 -1
  2562. package/dist/src/projects/automation-bind.js.map +0 -1
  2563. package/dist/src/projects/goal-bind.js.map +0 -1
  2564. package/dist/src/projects/memory-bind.js.map +0 -1
  2565. package/dist/src/projects/project-agent-suggestion.js.map +0 -1
  2566. package/dist/src/projects/project-agent.js.map +0 -1
  2567. package/dist/src/projects/project-kind.js.map +0 -1
  2568. package/dist/src/projects/project-loop.js.map +0 -1
  2569. package/dist/src/projects/project-service.js.map +0 -1
  2570. package/dist/src/projects/project-store.js.map +0 -1
  2571. package/dist/src/projects/session-bind.js.map +0 -1
  2572. package/dist/src/projects/workflow-bind.js.map +0 -1
  2573. package/dist/src/projects/workspace-project.js.map +0 -1
  2574. package/dist/src/projects/workspace.js.map +0 -1
  2575. package/dist/src/providers/auth-runtime/auth-profile-store.js.map +0 -1
  2576. package/dist/src/providers/auth-runtime/is-configured.js.map +0 -1
  2577. package/dist/src/providers/auth-runtime/oauth.js.map +0 -1
  2578. package/dist/src/providers/auth-runtime/resolve-api-key.js.map +0 -1
  2579. package/dist/src/providers/auth-runtime/resolve-auth.js.map +0 -1
  2580. package/dist/src/providers/constants.js.map +0 -1
  2581. package/dist/src/providers/domestic-presets.js.map +0 -1
  2582. package/dist/src/providers/env-keys.js.map +0 -1
  2583. package/dist/src/providers/extension-stream-bridge.js.map +0 -1
  2584. package/dist/src/providers/index.js.map +0 -1
  2585. package/dist/src/providers/model-call.js.map +0 -1
  2586. package/dist/src/providers/model-discovery.js.map +0 -1
  2587. package/dist/src/providers/model-registry.js.map +0 -1
  2588. package/dist/src/providers/model-supplements.js.map +0 -1
  2589. package/dist/src/providers/plugin-registry.js.map +0 -1
  2590. package/dist/src/providers/presentation.js.map +0 -1
  2591. package/dist/src/remote-access/exposure-guards.js.map +0 -1
  2592. package/dist/src/remote-access/exposure-manager.js.map +0 -1
  2593. package/dist/src/review/review-git.js.map +0 -1
  2594. package/dist/src/review/review-types.js.map +0 -1
  2595. package/dist/src/routing/account-id.js.map +0 -1
  2596. package/dist/src/routing/agent-session-key.js.map +0 -1
  2597. package/dist/src/routing/bindings.js.map +0 -1
  2598. package/dist/src/routing/index.js.map +0 -1
  2599. package/dist/src/routing/resolve-route.js.map +0 -1
  2600. package/dist/src/routing/resolve-tui-session-key.js.map +0 -1
  2601. package/dist/src/routing/session-key-utils.js.map +0 -1
  2602. package/dist/src/routing/session-key.js.map +0 -1
  2603. package/dist/src/session/abort-cutoff.js.map +0 -1
  2604. package/dist/src/session/chat-export.js.map +0 -1
  2605. package/dist/src/session/client-history.js.map +0 -1
  2606. package/dist/src/session/compaction-checkpoints.js.map +0 -1
  2607. package/dist/src/session/config-store.js.map +0 -1
  2608. package/dist/src/session/init-session-turn.js.map +0 -1
  2609. package/dist/src/session/lifecycle-timestamps.js.map +0 -1
  2610. package/dist/src/session/load-jsonl-entries.js.map +0 -1
  2611. package/dist/src/session/manager.js.map +0 -1
  2612. package/dist/src/session/patch-metadata.js.map +0 -1
  2613. package/dist/src/session/reset-policy.js.map +0 -1
  2614. package/dist/src/session/reset-triggers.js.map +0 -1
  2615. package/dist/src/session/reset-type.js.map +0 -1
  2616. package/dist/src/session/resolve-session.js.map +0 -1
  2617. package/dist/src/session/session-context-for-llm.js.map +0 -1
  2618. package/dist/src/session/session-id.js.map +0 -1
  2619. package/dist/src/session/session-title.js.map +0 -1
  2620. package/dist/src/session/session-workspace.js.map +0 -1
  2621. package/dist/src/session/store.js.map +0 -1
  2622. package/dist/src/session/stored-rows-to-file-entries.js.map +0 -1
  2623. package/dist/src/session/thinking-resolve.js.map +0 -1
  2624. package/dist/src/session/transcript-events.js.map +0 -1
  2625. package/dist/src/session/transcript-format.js.map +0 -1
  2626. package/dist/src/session/transcript-outline.js.map +0 -1
  2627. package/dist/src/session/transcript-stats.js.map +0 -1
  2628. package/dist/src/session/types.js.map +0 -1
  2629. package/dist/src/session/user-round-delete.js.map +0 -1
  2630. package/dist/src/share/share-audit.js.map +0 -1
  2631. package/dist/src/share/share-auto.js.map +0 -1
  2632. package/dist/src/share/share-config.js.map +0 -1
  2633. package/dist/src/share/share-landing.js.map +0 -1
  2634. package/dist/src/share/share-rate-limit.js.map +0 -1
  2635. package/dist/src/share/share-store.js.map +0 -1
  2636. package/dist/src/share/share-thumbnail.js.map +0 -1
  2637. package/dist/src/share/share-types.js.map +0 -1
  2638. package/dist/src/share/share-url.js.map +0 -1
  2639. package/dist/src/share/share-zip.js.map +0 -1
  2640. package/dist/src/share/site-proxy.js.map +0 -1
  2641. package/dist/src/share/site-share-config.js.map +0 -1
  2642. package/dist/src/share/site-share-router.js.map +0 -1
  2643. package/dist/src/share/site-share-store.js.map +0 -1
  2644. package/dist/src/share/site-share-types.js.map +0 -1
  2645. package/dist/src/share/site-static-serve.js.map +0 -1
  2646. package/dist/src/storage/sqlite/activity-repository.js.map +0 -1
  2647. package/dist/src/storage/sqlite/config-repository.js.map +0 -1
  2648. package/dist/src/storage/sqlite/connection.js.map +0 -1
  2649. package/dist/src/storage/sqlite/connector-repository.js.map +0 -1
  2650. package/dist/src/storage/sqlite/fts.js.map +0 -1
  2651. package/dist/src/storage/sqlite/knowledge-repository.js.map +0 -1
  2652. package/dist/src/storage/sqlite/memory-index-repository.js.map +0 -1
  2653. package/dist/src/storage/sqlite/memory-records-repository.js.map +0 -1
  2654. package/dist/src/storage/sqlite/memory-reference-consent-repository.js.map +0 -1
  2655. package/dist/src/storage/sqlite/migrations/discover.js.map +0 -1
  2656. package/dist/src/storage/sqlite/migrations/errors.js.map +0 -1
  2657. package/dist/src/storage/sqlite/migrations/runner.js.map +0 -1
  2658. package/dist/src/storage/sqlite/note-agent-context-repository.js.map +0 -1
  2659. package/dist/src/storage/sqlite/notes-repository.js.map +0 -1
  2660. package/dist/src/storage/sqlite/paths.js.map +0 -1
  2661. package/dist/src/storage/sqlite/row-mappers.js.map +0 -1
  2662. package/dist/src/storage/sqlite/schema-version.js.map +0 -1
  2663. package/dist/src/storage/sqlite/schema.js.map +0 -1
  2664. package/dist/src/storage/sqlite/session-metadata.js.map +0 -1
  2665. package/dist/src/storage/sqlite/session-repository.js.map +0 -1
  2666. package/dist/src/storage/sqlite/transaction.js.map +0 -1
  2667. package/dist/src/storage/sqlite/transcript-repository.js.map +0 -1
  2668. package/dist/src/storage/sqlite/user-profile-setup-repository.js.map +0 -1
  2669. package/dist/src/storage/sqlite/user-trust-repository.js.map +0 -1
  2670. package/dist/src/tui/backends/embedded-backend.js.map +0 -1
  2671. package/dist/src/tui/backends/gateway-sse-backend.js.map +0 -1
  2672. package/dist/src/tui/chat-history.js.map +0 -1
  2673. package/dist/src/tui/clipboard-image.js.map +0 -1
  2674. package/dist/src/tui/clipboard-text.js.map +0 -1
  2675. package/dist/src/tui/components/assistant-message.js.map +0 -1
  2676. package/dist/src/tui/components/bash-execution.js.map +0 -1
  2677. package/dist/src/tui/components/bash-summary.js.map +0 -1
  2678. package/dist/src/tui/components/branch-message-summary.js.map +0 -1
  2679. package/dist/src/tui/components/branch-summary.js.map +0 -1
  2680. package/dist/src/tui/components/chat-log.js.map +0 -1
  2681. package/dist/src/tui/components/compaction-summary.js.map +0 -1
  2682. package/dist/src/tui/components/custom-editor.js.map +0 -1
  2683. package/dist/src/tui/components/custom-message.js.map +0 -1
  2684. package/dist/src/tui/components/dynamic-border.js.map +0 -1
  2685. package/dist/src/tui/components/extension-dialog.js.map +0 -1
  2686. package/dist/src/tui/components/fuzzy-filter.js.map +0 -1
  2687. package/dist/src/tui/components/scoped-models-selector.js.map +0 -1
  2688. package/dist/src/tui/components/searchable-select-list.js.map +0 -1
  2689. package/dist/src/tui/components/session-selector.js.map +0 -1
  2690. package/dist/src/tui/components/settings-selector.js.map +0 -1
  2691. package/dist/src/tui/components/thinking-selector.js.map +0 -1
  2692. package/dist/src/tui/components/tool-execution.js.map +0 -1
  2693. package/dist/src/tui/components/tui-bottom-bar.js.map +0 -1
  2694. package/dist/src/tui/components/tui-header.js.map +0 -1
  2695. package/dist/src/tui/components/user-message.js.map +0 -1
  2696. package/dist/src/tui/components/visual-truncate.js.map +0 -1
  2697. package/dist/src/tui/extension-host/autocomplete.js.map +0 -1
  2698. package/dist/src/tui/extension-host/host.js.map +0 -1
  2699. package/dist/src/tui/extension-host/load-extensions.js.map +0 -1
  2700. package/dist/src/tui/extension-host/runtime-context.js.map +0 -1
  2701. package/dist/src/tui/extension-host/runtime.js.map +0 -1
  2702. package/dist/src/tui/extension-host/surface.js.map +0 -1
  2703. package/dist/src/tui/extension-host/tool-renderers.js.map +0 -1
  2704. package/dist/src/tui/format-tui-hotkeys.js.map +0 -1
  2705. package/dist/src/tui/sse-consumer.js.map +0 -1
  2706. package/dist/src/tui/theme/dark.js.map +0 -1
  2707. package/dist/src/tui/theme/light.js.map +0 -1
  2708. package/dist/src/tui/theme-manager.js.map +0 -1
  2709. package/dist/src/tui/theme.js.map +0 -1
  2710. package/dist/src/tui/tool-summary.js.map +0 -1
  2711. package/dist/src/tui/tui-agent-events.js.map +0 -1
  2712. package/dist/src/tui/tui-command-formatters.js.map +0 -1
  2713. package/dist/src/tui/tui-commands.js.map +0 -1
  2714. package/dist/src/tui/tui-context-usage.js.map +0 -1
  2715. package/dist/src/tui/tui-extension-user-message.js.map +0 -1
  2716. package/dist/src/tui/tui-fd-path.js.map +0 -1
  2717. package/dist/src/tui/tui-file-autocomplete.js.map +0 -1
  2718. package/dist/src/tui/tui-follow-up-queue.js.map +0 -1
  2719. package/dist/src/tui/tui-git-branch.js.map +0 -1
  2720. package/dist/src/tui/tui-keybindings-file.js.map +0 -1
  2721. package/dist/src/tui/tui-lifecycle.js.map +0 -1
  2722. package/dist/src/tui/tui-local-shell.js.map +0 -1
  2723. package/dist/src/tui/tui-model-picker.js.map +0 -1
  2724. package/dist/src/tui/tui-oauth-login.js.map +0 -1
  2725. package/dist/src/tui/tui-overlays.js.map +0 -1
  2726. package/dist/src/tui/tui-picker-overlay.js.map +0 -1
  2727. package/dist/src/tui/tui-run-state.js.map +0 -1
  2728. package/dist/src/tui/tui-run-status-format.js.map +0 -1
  2729. package/dist/src/tui/tui-runtime-hints.js.map +0 -1
  2730. package/dist/src/tui/tui-scoped-models.js.map +0 -1
  2731. package/dist/src/tui/tui-session-actions.js.map +0 -1
  2732. package/dist/src/tui/tui-session-format.js.map +0 -1
  2733. package/dist/src/tui/tui-session-snapshot.js.map +0 -1
  2734. package/dist/src/tui/tui-session-stats.js.map +0 -1
  2735. package/dist/src/tui/tui-settings.js.map +0 -1
  2736. package/dist/src/tui/tui-skills-autocomplete.js.map +0 -1
  2737. package/dist/src/tui/tui-startup-resources.js.map +0 -1
  2738. package/dist/src/tui/tui-startup-text.js.map +0 -1
  2739. package/dist/src/tui/tui-stdio-filter.js.map +0 -1
  2740. package/dist/src/tui/tui-submit.js.map +0 -1
  2741. package/dist/src/tui/tui-suspend.js.map +0 -1
  2742. package/dist/src/tui/tui-timeline-picker.js.map +0 -1
  2743. package/dist/src/tui/tui-timeline.js.map +0 -1
  2744. package/dist/src/tui/tui-tool-diff.js.map +0 -1
  2745. package/dist/src/tui/tui-tool-result.js.map +0 -1
  2746. package/dist/src/tui/tui-transcript-tree-picker.js.map +0 -1
  2747. package/dist/src/tui/tui-transcript-tree.js.map +0 -1
  2748. package/dist/src/tui/tui-types.js.map +0 -1
  2749. package/dist/src/tui/tui-workflow-slash.js.map +0 -1
  2750. package/dist/src/tui/tui.js.map +0 -1
  2751. package/dist/src/tui/xopc-tui-keybindings.js.map +0 -1
  2752. package/dist/src/tunnel/broker-client.js.map +0 -1
  2753. package/dist/src/tunnel/consent.js.map +0 -1
  2754. package/dist/src/tunnel/enable-lan-pairing.js.map +0 -1
  2755. package/dist/src/tunnel/env.js.map +0 -1
  2756. package/dist/src/tunnel/frp-subdomain-host.js.map +0 -1
  2757. package/dist/src/tunnel/frpc-binary.js.map +0 -1
  2758. package/dist/src/tunnel/frpc-config.js.map +0 -1
  2759. package/dist/src/tunnel/frpc-extract.js.map +0 -1
  2760. package/dist/src/tunnel/frpc-process.js.map +0 -1
  2761. package/dist/src/tunnel/gateway-lifecycle.js.map +0 -1
  2762. package/dist/src/tunnel/pair-context.js.map +0 -1
  2763. package/dist/src/tunnel/pair-url.js.map +0 -1
  2764. package/dist/src/tunnel/pairing-rate-limit.js.map +0 -1
  2765. package/dist/src/tunnel/pairing.js.map +0 -1
  2766. package/dist/src/tunnel/tunnel-audit.js.map +0 -1
  2767. package/dist/src/tunnel/tunnel-config.js.map +0 -1
  2768. package/dist/src/tunnel/tunnel-persist.js.map +0 -1
  2769. package/dist/src/tunnel/tunnel-qr.js.map +0 -1
  2770. package/dist/src/tunnel/tunnel-rate-limit.js.map +0 -1
  2771. package/dist/src/tunnel/tunnel-service.js.map +0 -1
  2772. package/dist/src/tunnel/tunnel-state.js.map +0 -1
  2773. package/dist/src/tunnel/well-known.js.map +0 -1
  2774. package/dist/src/user-context/config.js.map +0 -1
  2775. package/dist/src/user-context/import.js.map +0 -1
  2776. package/dist/src/user-context/owner.js.map +0 -1
  2777. package/dist/src/user-context/profile.js.map +0 -1
  2778. package/dist/src/user-context/projection.js.map +0 -1
  2779. package/dist/src/user-context/runtime.js.map +0 -1
  2780. package/dist/src/user-context/source-recommendations.js.map +0 -1
  2781. package/dist/src/user-context/trust-policy.js.map +0 -1
  2782. package/dist/src/utils/global-singleton.js.map +0 -1
  2783. package/dist/src/utils/helpers.js.map +0 -1
  2784. package/dist/src/utils/index.js.map +0 -1
  2785. package/dist/src/utils/is-record.js.map +0 -1
  2786. package/dist/src/utils/logger/audit.js.map +0 -1
  2787. package/dist/src/utils/logger/config.js.map +0 -1
  2788. package/dist/src/utils/logger/context.js.map +0 -1
  2789. package/dist/src/utils/logger/exporters.js.map +0 -1
  2790. package/dist/src/utils/logger/index.js.map +0 -1
  2791. package/dist/src/utils/logger/log-store.js.map +0 -1
  2792. package/dist/src/utils/logger/log-stream.js.map +0 -1
  2793. package/dist/src/utils/logger/pino-record.js.map +0 -1
  2794. package/dist/src/utils/logger/redact.js.map +0 -1
  2795. package/dist/src/utils/logger/rotation.js.map +0 -1
  2796. package/dist/src/utils/logger/shutdown.js.map +0 -1
  2797. package/dist/src/utils/logger/stats.js.map +0 -1
  2798. package/dist/src/utils/logger/streams.js.map +0 -1
  2799. package/dist/src/utils/logger/types.js.map +0 -1
  2800. package/dist/src/utils/logger.js.map +0 -1
  2801. package/dist/src/utils/redact-sensitive-url.js.map +0 -1
  2802. package/dist/src/utils/sanitize-log.js.map +0 -1
  2803. package/dist/src/utils/string-coerce.js.map +0 -1
  2804. package/dist/src/voice/language-profile.js.map +0 -1
  2805. package/dist/src/voice/local/model-files.js.map +0 -1
  2806. package/dist/src/voice/local/model-manager.js.map +0 -1
  2807. package/dist/src/voice/local/models.js.map +0 -1
  2808. package/dist/src/voice/local/runtime-client.js.map +0 -1
  2809. package/dist/src/voice/local/runtime-dispatcher.js.map +0 -1
  2810. package/dist/src/voice/local/runtime-worker.js.map +0 -1
  2811. package/dist/src/voice/local/wav.js.map +0 -1
  2812. package/dist/src/voice/metadata/builtin.js.map +0 -1
  2813. package/dist/src/voice/metadata/registry.js.map +0 -1
  2814. package/dist/src/voice/stt/availability.js.map +0 -1
  2815. package/dist/src/voice/stt/config-slice.js.map +0 -1
  2816. package/dist/src/voice/stt/factory.js.map +0 -1
  2817. package/dist/src/voice/stt/index.js.map +0 -1
  2818. package/dist/src/voice/stt/list-providers.js.map +0 -1
  2819. package/dist/src/voice/stt/mention.js.map +0 -1
  2820. package/dist/src/voice/stt/preflight.js.map +0 -1
  2821. package/dist/src/voice/stt/providers/alibaba-transcription.js.map +0 -1
  2822. package/dist/src/voice/stt/providers/local-transcription.js.map +0 -1
  2823. package/dist/src/voice/stt/providers/openai-transcription.js.map +0 -1
  2824. package/dist/src/voice/stt/transcribe-core.js.map +0 -1
  2825. package/dist/src/voice/stt/types.js.map +0 -1
  2826. package/dist/src/voice/tts/audio.js.map +0 -1
  2827. package/dist/src/voice/tts/config-slice.js.map +0 -1
  2828. package/dist/src/voice/tts/directives.js.map +0 -1
  2829. package/dist/src/voice/tts/factory.js.map +0 -1
  2830. package/dist/src/voice/tts/list-providers.js.map +0 -1
  2831. package/dist/src/voice/tts/merge-config.js.map +0 -1
  2832. package/dist/src/voice/tts/openai-compatible-speech.js.map +0 -1
  2833. package/dist/src/voice/tts/payload.js.map +0 -1
  2834. package/dist/src/voice/tts/preprocess.js.map +0 -1
  2835. package/dist/src/voice/tts/providers/alibaba-speech.js.map +0 -1
  2836. package/dist/src/voice/tts/providers/edge-speech.js.map +0 -1
  2837. package/dist/src/voice/tts/providers/minimax-speech.js.map +0 -1
  2838. package/dist/src/voice/tts/providers/openai-speech.js.map +0 -1
  2839. package/dist/src/voice/tts/sentence-boundary.js.map +0 -1
  2840. package/dist/src/voice/tts/service.js.map +0 -1
  2841. package/dist/src/voice/tts/speak-core.js.map +0 -1
  2842. package/dist/src/voice/tts/speech-registry.js.map +0 -1
  2843. package/dist/src/voice/tts/status-tracker.js.map +0 -1
  2844. package/dist/src/voice/tts/summarize.js.map +0 -1
  2845. package/dist/src/voice/tts/types.js.map +0 -1
  2846. package/dist/src/work-discovery/analyzer.js.map +0 -1
  2847. package/dist/src/work-discovery/probe.js.map +0 -1
  2848. package/dist/src/work-discovery/repository.js.map +0 -1
  2849. package/dist/src/work-discovery/service.js.map +0 -1
  2850. package/dist/src/work-items/agent-context.js.map +0 -1
  2851. package/dist/src/work-items/work-item-service.js.map +0 -1
  2852. package/dist/src/work-items/work-item-store.js.map +0 -1
  2853. package/dist/src/work-items/work-item-workflow-judge.js.map +0 -1
  2854. package/dist/src/workflows/authoring/workflow-draft-store.js.map +0 -1
  2855. package/dist/src/workflows/domain/definition-utils.js.map +0 -1
  2856. package/dist/src/workflows/domain/run.js.map +0 -1
  2857. package/dist/src/workflows/domain/schema-validation.js.map +0 -1
  2858. package/dist/src/workflows/domain/validation.js.map +0 -1
  2859. package/dist/src/workflows/draft/workflow-draft-prompt.js.map +0 -1
  2860. package/dist/src/workflows/draft/workflow-draft-service.js.map +0 -1
  2861. package/dist/src/workflows/draft/workflow-draft-validator.js.map +0 -1
  2862. package/dist/src/workflows/engine/projector.js.map +0 -1
  2863. package/dist/src/workflows/engine/workflow-engine.js.map +0 -1
  2864. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +0 -1
  2865. package/dist/src/workflows/runtime/graph-workflow-runtime.js.map +0 -1
  2866. package/dist/src/workflows/service/run-view-to-snapshot.js.map +0 -1
  2867. package/dist/src/workflows/service/workflow-run-service.js.map +0 -1
  2868. package/dist/src/workflows/service/workflow-session-bridge.js.map +0 -1
  2869. package/dist/src/workflows/service/workflow-session-key.js.map +0 -1
  2870. package/dist/src/workflows/store/event-store.js.map +0 -1
  2871. package/dist/src/workflows/store/paths.js.map +0 -1
  2872. package/dist/src/workflows/store/run-index-store.js.map +0 -1
  2873. package/dist/src/workflows/store/run-store.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"audio.js","names":[],"sources":["../../../../src/voice/tts/audio.ts"],"sourcesContent":["/**\n * Audio Compression Utilities\n */\n\nimport { spawn } from 'child_process';\nimport { writeFile, unlink } from 'fs/promises';\nimport { tmpdir } from 'os';\nimport { join } from 'path';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('AudioUtils');\n\n/**\n * Execute a command using spawn (avoids shell injection)\n */\nfunction spawnAsync(command: string, args: string[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const process = spawn(command, args, { stdio: 'ignore' });\n process.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`${command} exited with code ${code}`));\n });\n process.on('error', reject);\n });\n}\n\nexport interface CompressionResult {\n buffer: Buffer;\n format: string;\n}\n\n/** When TTS returns WAV, ffmpeg can target Opus (Telegram, etc.) or MP3 (Weixin VoiceItem, webchat). */\nexport type WavCompressionTarget = 'opus' | 'mp3';\n\n/**\n * Compress WAV using ffmpeg. Non-WAV inputs are returned unchanged.\n * Default `wavTarget` is Opus (common for Telegram voice).\n */\nexport async function compressAudio(\n audioBuffer: Buffer,\n inputFormat: string,\n wavTarget: WavCompressionTarget = 'opus',\n): Promise<CompressionResult> {\n if (inputFormat !== 'wav') {\n return { buffer: audioBuffer, format: inputFormat };\n }\n\n const tempDir = tmpdir();\n const inputPath = join(tempDir, `input_${Date.now()}.wav`);\n const outExt = wavTarget === 'mp3' ? 'mp3' : 'opus';\n const outputPath = join(tempDir, `output_${Date.now()}.${outExt}`);\n\n try {\n await writeFile(inputPath, audioBuffer);\n\n if (wavTarget === 'mp3') {\n await spawnAsync('ffmpeg', [\n '-i', inputPath,\n '-c:a', 'libmp3lame',\n '-b:a', '64k',\n outputPath,\n '-y',\n ]);\n } else {\n await spawnAsync('ffmpeg', [\n '-i', inputPath,\n '-c:a', 'libopus',\n '-b:a', '24k',\n '-vbr', 'on',\n outputPath,\n '-y',\n ]);\n }\n\n const { readFile } = await import('fs/promises');\n const compressedBuffer = await readFile(outputPath);\n\n log.info(\n {\n originalSize: audioBuffer.length,\n compressedSize: compressedBuffer.length,\n ratio: ((compressedBuffer.length / audioBuffer.length) * 100).toFixed(1) + '%',\n wavTarget,\n },\n 'Audio compressed successfully',\n );\n\n return { buffer: compressedBuffer, format: wavTarget === 'mp3' ? 'mp3' : 'opus' };\n } catch (error) {\n const hint =\n error instanceof Error && (error as NodeJS.ErrnoException).code === 'ENOENT'\n ? ' (install ffmpeg and ensure it is on PATH for wav compression)'\n : '';\n log.warn({ error, inputFormat, wavTarget }, `Audio compression failed, using original${hint}`);\n return { buffer: audioBuffer, format: inputFormat };\n } finally {\n try {\n await unlink(inputPath).catch(() => {});\n await unlink(outputPath).catch(() => {});\n } catch {}\n }\n}\n"],"mappings":";;;;;;;;;;aAQqD;AAErD,MAAM,MAAM,aAAa,aAAa;;;;AAKtC,SAAS,WAAW,SAAiB,MAA+B;AAClE,QAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,UAAU,MAAM,SAAS,MAAM,EAAE,OAAO,UAAU,CAAC;AACzD,UAAQ,GAAG,UAAU,SAAS;AAC5B,OAAI,SAAS,EAAG,UAAS;OACpB,wBAAO,IAAI,MAAM,GAAG,QAAQ,oBAAoB,OAAO,CAAC;IAC7D;AACF,UAAQ,GAAG,SAAS,OAAO;GAC3B;;;;;;AAeJ,eAAsB,cACpB,aACA,aACA,YAAkC,QACN;AAC5B,KAAI,gBAAgB,MAClB,QAAO;EAAE,QAAQ;EAAa,QAAQ;EAAa;CAGrD,MAAM,UAAU,QAAQ;CACxB,MAAM,YAAY,KAAK,SAAS,SAAS,KAAK,KAAK,CAAC,MAAM;CAC1D,MAAM,SAAS,cAAc,QAAQ,QAAQ;CAC7C,MAAM,aAAa,KAAK,SAAS,UAAU,KAAK,KAAK,CAAC,GAAG,SAAS;AAElE,KAAI;AACF,QAAM,UAAU,WAAW,YAAY;AAEvC,MAAI,cAAc,MAChB,OAAM,WAAW,UAAU;GACzB;GAAM;GACN;GAAQ;GACR;GAAQ;GACR;GACA;GACD,CAAC;MAEF,OAAM,WAAW,UAAU;GACzB;GAAM;GACN;GAAQ;GACR;GAAQ;GACR;GAAQ;GACR;GACA;GACD,CAAC;EAGJ,MAAM,EAAE,aAAa,MAAM,OAAO;EAClC,MAAM,mBAAmB,MAAM,SAAS,WAAW;AAEnD,MAAI,KACF;GACE,cAAc,YAAY;GAC1B,gBAAgB,iBAAiB;GACjC,QAAS,iBAAiB,SAAS,YAAY,SAAU,KAAK,QAAQ,EAAE,GAAG;GAC3E;GACD,EACD,gCACD;AAED,SAAO;GAAE,QAAQ;GAAkB,QAAQ,cAAc,QAAQ,QAAQ;GAAQ;UAC1E,OAAO;EACd,MAAM,OACJ,iBAAiB,SAAU,MAAgC,SAAS,WAChE,mEACA;AACN,MAAI,KAAK;GAAE;GAAO;GAAa;GAAW,EAAE,2CAA2C,OAAO;AAC9F,SAAO;GAAE,QAAQ;GAAa,QAAQ;GAAa;WAC3C;AACR,MAAI;AACF,SAAM,OAAO,UAAU,CAAC,YAAY,GAAG;AACvC,SAAM,OAAO,WAAW,CAAC,YAAY,GAAG;UAClC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-slice.js","names":[],"sources":["../../../../src/voice/tts/config-slice.ts"],"sourcesContent":["/**\n * TTS config slice resolution — maps persisted config to per-provider raw config.\n *\n * Reads `messages.tts.providers.<id>` only — there is no legacy flat-key form.\n */\n\nimport type { TTSConfig } from './types.js';\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\n/** Collect provider-id → raw config entries from the `providers` map. */\nexport function collectTtsProviderConfigEntries(\n config: Partial<TTSConfig> | Record<string, unknown> | undefined,\n): Record<string, Record<string, unknown>> {\n const raw = (config ?? {}) as Record<string, unknown>;\n const providers = asRecord(raw.providers);\n if (!providers) return {};\n const entries: Record<string, Record<string, unknown>> = {};\n for (const [providerId, value] of Object.entries(providers)) {\n entries[providerId] = { ...(asRecord(value) ?? {}) };\n }\n return entries;\n}\n\n/** Resolve the raw config slice for one provider id. */\nexport function resolveTtsProviderConfigSlice(\n providerId: string,\n config: Partial<TTSConfig> | Record<string, unknown> | undefined,\n): Record<string, unknown> {\n return collectTtsProviderConfigEntries(config)[providerId] ?? {};\n}\n\n/**\n * Build the `rawConfig` object passed into `SpeechProviderPlugin.resolveConfig`.\n * Includes the full TTS block plus a normalized `providers` map.\n */\nexport function buildTtsResolveRawConfig(\n providerId: string,\n config: Partial<TTSConfig> | Record<string, unknown>,\n): Record<string, unknown> {\n const entries = collectTtsProviderConfigEntries(config);\n return {\n ...(config as Record<string, unknown>),\n providers: entries,\n [providerId]: entries[providerId] ?? {},\n };\n}\n"],"mappings":";AAQA,SAAS,SAAS,OAAqD;AACrE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM,GACtE,QACD,KAAA;;;AAIN,SAAgB,gCACd,QACyC;CAEzC,MAAM,YAAY,UADL,UAAU,EAAE,EACM,UAAU;AACzC,KAAI,CAAC,UAAW,QAAO,EAAE;CACzB,MAAM,UAAmD,EAAE;AAC3D,MAAK,MAAM,CAAC,YAAY,UAAU,OAAO,QAAQ,UAAU,CACzD,SAAQ,cAAc,EAAE,GAAI,SAAS,MAAM,IAAI,EAAE,EAAG;AAEtD,QAAO;;;AAIT,SAAgB,8BACd,YACA,QACyB;AACzB,QAAO,gCAAgC,OAAO,CAAC,eAAe,EAAE;;;;;;AAOlE,SAAgB,yBACd,YACA,QACyB;CACzB,MAAM,UAAU,gCAAgC,OAAO;AACvD,QAAO;EACL,GAAI;EACJ,WAAW;GACV,aAAa,QAAQ,eAAe,EAAE;EACxC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"directives.js","names":[],"sources":["../../../../src/voice/tts/directives.ts"],"sourcesContent":["/**\n * TTS directive parser.\n *\n * Parses `[[tts:key=value]]` and `[[tts:text]]...[[/tts:text]]` blocks.\n *\n * Per-provider key handling (voice/model/speed) is delegated to each\n * `SpeechProviderPlugin.parseDirectiveToken`. The parser:\n * 1. Pulls out the `text` block and the global `provider` token here (these\n * are cross-provider concerns).\n * 2. For every other token, asks each registered provider via\n * `parseDirectiveToken({ key, value, policy })`. The first provider whose\n * result has `handled === true` wins; its returned overrides are merged\n * into `overrides[provider.id]`.\n * 3. Tokens that no provider handles produce a warning (helps catch typos).\n *\n * Adding a new provider with a new directive key (e.g. `[[tts:emotion=happy]]`)\n * requires no change to this file — the provider's own `parseDirectiveToken`\n * declares which keys it owns.\n */\n\nimport { createLogger } from '../../utils/logger.js';\n\nimport './providers/index.js'; // side-effect: register built-in providers\nimport { listSpeechProviders } from './speech-registry.js';\nimport type { TTSModelOverrideConfig, TTSProvider, TtsDirectiveOverrides, TtsDirectiveParseResult } from './types.js';\n\nconst log = createLogger('TTS:Directives');\n\nconst VALID_PROVIDERS: TTSProvider[] = ['openai', 'alibaba', 'edge', 'minimax'];\n\nfunction isValidProvider(value: string): value is TTSProvider {\n return VALID_PROVIDERS.includes(value as TTSProvider);\n}\n\nfunction parseNumber(value: string): number | undefined {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\n/**\n * Apply a provider-handled override into the bucket for `providerId`. Mutates\n * `overrides` in place. Maps the SpeechProviderOverrides keys (model/voice/speed)\n * onto the per-provider bucket in TtsDirectiveOverrides.\n */\nfunction recordProviderOverride(\n overrides: TtsDirectiveOverrides,\n providerId: string,\n patch: { model?: string; voice?: string; speed?: number },\n): void {\n if (!isValidProvider(providerId)) {\n return;\n }\n const bucket = (overrides[providerId] as Record<string, unknown> | undefined) ?? {};\n if (patch.voice !== undefined) {\n bucket.voice = patch.voice;\n }\n if (patch.model !== undefined) {\n bucket.model = patch.model;\n }\n if (patch.speed !== undefined) {\n bucket.speed = patch.speed;\n }\n (overrides as Record<string, unknown>)[providerId] = bucket;\n}\n\nexport function parseTtsDirectives(\n text: string,\n policy: TTSModelOverrideConfig = { enabled: true },\n): TtsDirectiveParseResult {\n if (!policy.enabled) {\n return {\n cleanedText: text,\n hasDirective: false,\n overrides: {},\n warnings: [],\n };\n }\n\n const overrides: TtsDirectiveOverrides = {};\n const warnings: string[] = [];\n let cleanedText = text;\n let hasDirective = false;\n\n // 1. Pull out [[tts:text]]...[[/tts:text]] blocks (cross-provider concern).\n const textBlockRegex = /\\[\\[tts:text\\]\\]([\\s\\S]*?)\\[\\[\\/tts:text\\]\\]/gi;\n cleanedText = cleanedText.replace(textBlockRegex, (_match, inner: string) => {\n hasDirective = true;\n if (policy.allowText && overrides.ttsText === undefined) {\n overrides.ttsText = inner.trim();\n }\n return '';\n });\n\n const providers = listSpeechProviders();\n\n // 2. Parse [[tts:key=value ...]] tokens.\n const directiveRegex = /\\[\\[tts:([^\\]]+)\\]\\]/gi;\n cleanedText = cleanedText.replace(directiveRegex, (_match, body: string) => {\n hasDirective = true;\n const tokens = body.split(/\\s+/).filter(Boolean);\n\n for (const token of tokens) {\n const eqIndex = token.indexOf('=');\n if (eqIndex === -1) {\n continue;\n }\n const key = token.slice(0, eqIndex).toLowerCase().trim();\n const value = token.slice(eqIndex + 1).trim();\n if (!key || !value) {\n continue;\n }\n\n // Cross-provider: provider switch.\n if (key === 'provider') {\n if (!policy.allowProvider) {\n continue;\n }\n if (isValidProvider(value)) {\n overrides.provider = value;\n } else {\n warnings.push(`Invalid provider \"${value}\"`);\n }\n continue;\n }\n\n // Cross-provider: speed (validated globally with shared 0.25-4.0 range).\n // Per-provider plugins may also accept their own `speed` token.\n if (key === 'speed') {\n if (!policy.allowVoiceSettings) {\n continue;\n }\n const speed = parseNumber(value);\n if (speed !== undefined && speed >= 0.25 && speed <= 4.0) {\n (overrides as Record<string, unknown>).speed = speed;\n } else {\n warnings.push(`Invalid speed \"${value}\" (must be 0.25-4.0)`);\n }\n continue;\n }\n\n // Per-provider: ask each registered plugin. First handled wins.\n let handled = false;\n for (const plugin of providers) {\n if (typeof plugin.parseDirectiveToken !== 'function') {\n continue;\n }\n const result = plugin.parseDirectiveToken({\n key,\n value,\n policy: {\n enabled: policy.enabled ?? true,\n allowText: policy.allowText ?? false,\n allowProvider: policy.allowProvider ?? false,\n allowVoice: policy.allowVoice ?? false,\n allowModelId: policy.allowModelId ?? false,\n allowVoiceSettings: policy.allowVoiceSettings ?? false,\n allowNormalization: policy.allowNormalization ?? false,\n allowSeed: policy.allowSeed ?? false,\n },\n });\n if (result.handled) {\n handled = true;\n if (result.warnings) {\n warnings.push(...result.warnings);\n }\n if (result.overrides) {\n recordProviderOverride(overrides, plugin.id, result.overrides);\n }\n break;\n }\n }\n if (!handled) {\n warnings.push(`Unknown TTS directive key \"${key}\"`);\n }\n }\n\n return '';\n });\n\n cleanedText = cleanedText\n .replace(/[ \\t]+/g, ' ')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n\n if (warnings.length > 0) {\n log.debug({ warnings }, 'TTS directive warnings');\n }\n\n return {\n cleanedText,\n ttsText: overrides.ttsText,\n hasDirective,\n overrides,\n warnings,\n };\n}\n\nexport function hasTtsDirectives(text: string): boolean {\n return /\\[\\[tts:/i.test(text);\n}\n\nexport function stripTtsDirectives(text: string): string {\n return text\n .replace(/\\[\\[tts:text\\]\\][\\s\\S]*?\\[\\[\\/tts:text\\]\\]/gi, '')\n .replace(/\\[\\[tts:[^\\]]+\\]\\]/gi, '')\n .replace(/[ \\t]+/g, ' ')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\nexport function buildTtsSystemPromptHint(config: {\n enabled: boolean;\n trigger: string;\n maxTextLength?: number;\n modelOverrides?: TTSModelOverrideConfig;\n /** Current channel id (e.g. telegram) for output format hint */\n channel?: string;\n /** Preferred audio format for this channel when known */\n channelAudioFormat?: string;\n /** Whether voice-note style delivery is supported */\n channelVoiceBubble?: boolean;\n /** `text_to_speech` tool is registered */\n textToSpeechTool?: boolean;\n}): string | undefined {\n if (!config.enabled) {\n return undefined;\n }\n\n const hints: string[] = ['Voice (TTS) is enabled.'];\n\n switch (config.trigger) {\n case 'inbound':\n hints.push(\"Only use TTS when the user's last message includes audio/voice.\");\n break;\n case 'tagged':\n hints.push('Only use TTS when you include [[tts]] or [[tts:text]] tags.');\n break;\n case 'always':\n hints.push('You can use TTS for any message by including [[tts]] tag.');\n break;\n case 'off':\n return undefined;\n }\n\n const maxLength = config.maxTextLength || 4096;\n hints.push(`Keep spoken text ≤${maxLength} chars.`);\n\n if (config.channel && (config.channelAudioFormat || config.channelVoiceBubble !== undefined)) {\n const fmt = config.channelAudioFormat ?? 'mp3';\n const bubble =\n config.channelVoiceBubble === true\n ? 'voice-note compatible'\n : config.channelVoiceBubble === false\n ? 'attachment / inline audio only'\n : 'channel default';\n hints.push(`Channel ${config.channel}: prefer ${fmt}; ${bubble}.`);\n }\n\n if (config.textToSpeechTool) {\n hints.push(\n 'You may call `text_to_speech` to generate speech when the user asks you to read aloud or voice fits better than text. Do not use it on every reply.',\n );\n }\n\n if (config.modelOverrides?.enabled) {\n const allowed: string[] = [];\n if (config.modelOverrides.allowText) allowed.push('[[tts:text]]...[[/tts:text]]');\n if (config.modelOverrides.allowVoice) allowed.push('[[tts:voice=...]]');\n if (config.modelOverrides.allowModelId) allowed.push('[[tts:model=...]]');\n if (config.modelOverrides.allowProvider) allowed.push('[[tts:provider=...]]');\n\n if (allowed.length > 0) {\n hints.push(`Use ${allowed.join(', ')} to control voice output.`);\n }\n }\n\n return hints.join('\\n');\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"factory.js","names":[],"sources":["../../../../src/voice/tts/factory.ts"],"sourcesContent":["/**\n * TTS factory — registry-driven provider chain construction.\n *\n * Looks up SpeechProviderPlugin instances from the central registry\n * (src/voice/tts/speech-registry.ts), builds per-provider config via\n * plugin.resolveConfig, and filters out providers that report\n * isConfigured() === false.\n *\n * Side-effect import of `./providers/index.js` ensures all built-in providers\n * self-register before the first lookup.\n */\n\nimport { createLogger } from '../../utils/logger.js';\n\nimport './providers/index.js'; // side-effect: register built-in providers\nimport { buildTtsResolveRawConfig } from './config-slice.js';\nimport { getSpeechProvider, listSpeechProviders } from './speech-registry.js';\nimport type { SpeechProviderConfig, SpeechProviderPlugin } from './speech-provider-types.js';\nimport type { TTSConfig, TTSProvider } from './types.js';\n\nconst log = createLogger('TTS:Factory');\n\n/** A configured plugin ready to synthesize, with its resolved config snapshot. */\nexport interface ResolvedSpeechProvider {\n plugin: SpeechProviderPlugin;\n /** Provider id from the chain config (may differ from plugin.id when alias). */\n providerId: TTSProvider;\n /** Per-provider normalized config (output of plugin.resolveConfig). */\n providerConfig: SpeechProviderConfig;\n /** Plugin-shared timeout/maxLength carried from TTSConfig. */\n timeoutMs: number;\n}\n\n/** Resolve a single provider id → plugin + per-call config, or null if unavailable. */\nexport function resolveSpeechProvider(\n providerId: TTSProvider,\n config: TTSConfig,\n): ResolvedSpeechProvider | null {\n const plugin = getSpeechProvider(providerId);\n if (!plugin) {\n log.warn({ providerId }, `Unknown TTS provider \"${providerId}\" (not registered)`);\n return null;\n }\n const rawConfig = buildTtsResolveRawConfig(providerId, config);\n const timeoutMs = config.timeoutMs ?? 30_000;\n // SpeechProviderResolveConfigContext requires `cfg: Config` but this entry\n // point only holds a TTSConfig slice. Cast through unknown — built-in\n // providers' resolveConfig implementations only read `rawConfig`.\n const providerConfig = plugin.resolveConfig({\n cfg: undefined as unknown as Parameters<typeof plugin.resolveConfig>[0]['cfg'],\n rawConfig,\n timeoutMs,\n });\n if (!plugin.isConfigured({ providerConfig, timeoutMs })) {\n log.debug({ providerId }, `Provider \"${providerId}\" reports not configured; skipping`);\n return null;\n }\n return {\n plugin,\n providerId,\n providerConfig,\n timeoutMs,\n };\n}\n\n/** Order providers: explicit fallback when enabled, otherwise auto-select by registry order. */\nexport function resolveProviderOrder(\n primary: TTSProvider,\n fallback: TTSConfig['fallback'] | undefined,\n config: TTSConfig,\n): TTSProvider[] {\n if (fallback?.enabled && fallback.order.length > 0) {\n const order: TTSProvider[] = [primary];\n for (const provider of fallback.order) {\n if (provider !== primary && !order.includes(provider)) {\n order.push(provider);\n }\n }\n return order;\n }\n\n const configured = listSpeechProviders()\n .map((plugin) => {\n const resolved = resolveSpeechProvider(plugin.id, config);\n return resolved ? plugin : null;\n })\n .filter((plugin): plugin is SpeechProviderPlugin => plugin !== null)\n .sort((left, right) => {\n const leftOrder = left.autoSelectOrder ?? Number.MAX_SAFE_INTEGER;\n const rightOrder = right.autoSelectOrder ?? Number.MAX_SAFE_INTEGER;\n if (leftOrder !== rightOrder) {\n return leftOrder - rightOrder;\n }\n return left.id.localeCompare(right.id);\n })\n .map((plugin) => plugin.id);\n\n const order: TTSProvider[] = [primary];\n for (const providerId of configured) {\n if (providerId !== primary && !order.includes(providerId)) {\n order.push(providerId);\n }\n }\n return order;\n}\n\n/** Resolve the full provider chain in priority order; only configured plugins included. */\nexport function resolveSpeechProviderChain(config: TTSConfig): ResolvedSpeechProvider[] {\n if (!config.enabled) {\n throw new Error('TTS is not enabled');\n }\n const order = resolveProviderOrder(config.provider, config.fallback, config);\n const chain: ResolvedSpeechProvider[] = [];\n for (const providerId of order) {\n const resolved = resolveSpeechProvider(providerId, config);\n if (resolved) {\n chain.push(resolved);\n }\n }\n if (chain.length === 0) {\n throw new Error('No TTS providers are available');\n }\n log.debug(\n { primary: config.provider, chain: chain.map((c) => c.providerId) },\n 'TTS provider chain resolved',\n );\n return chain;\n}\n\n// ---- Public API ---------------------------------------------------------\n\nexport function isTTSAvailable(config?: TTSConfig): boolean {\n if (!config?.enabled) {\n return false;\n }\n try {\n return resolveSpeechProviderChain(config).length > 0;\n } catch {\n return false;\n }\n}\n\nexport function isProviderConfigured(provider: TTSProvider, config: TTSConfig): boolean {\n return resolveSpeechProvider(provider, config) !== null;\n}\n\nexport function getAvailableProviders(config: TTSConfig): TTSProvider[] {\n return listSpeechProviders()\n .map((plugin) => plugin.id)\n .filter((provider) => isProviderConfigured(provider, config));\n}\n\n/** List all registered SpeechProviderPlugin ids — primarily for the gateway console. */\nexport function listRegisteredSpeechProviderIds(): string[] {\n return listSpeechProviders().map((plugin) => plugin.id);\n}\n"],"mappings":";;;;;;aAYqD;AAQrD,MAAM,MAAM,aAAa,cAAc;;AAcvC,SAAgB,sBACd,YACA,QAC+B;CAC/B,MAAM,SAAS,kBAAkB,WAAW;AAC5C,KAAI,CAAC,QAAQ;AACX,MAAI,KAAK,EAAE,YAAY,EAAE,yBAAyB,WAAW,oBAAoB;AACjF,SAAO;;CAET,MAAM,YAAY,yBAAyB,YAAY,OAAO;CAC9D,MAAM,YAAY,OAAO,aAAa;CAItC,MAAM,iBAAiB,OAAO,cAAc;EAC1C,KAAK,KAAA;EACL;EACA;EACD,CAAC;AACF,KAAI,CAAC,OAAO,aAAa;EAAE;EAAgB;EAAW,CAAC,EAAE;AACvD,MAAI,MAAM,EAAE,YAAY,EAAE,aAAa,WAAW,oCAAoC;AACtF,SAAO;;AAET,QAAO;EACL;EACA;EACA;EACA;EACD;;;AAIH,SAAgB,qBACd,SACA,UACA,QACe;AACf,KAAI,UAAU,WAAW,SAAS,MAAM,SAAS,GAAG;EAClD,MAAM,QAAuB,CAAC,QAAQ;AACtC,OAAK,MAAM,YAAY,SAAS,MAC9B,KAAI,aAAa,WAAW,CAAC,MAAM,SAAS,SAAS,CACnD,OAAM,KAAK,SAAS;AAGxB,SAAO;;CAGT,MAAM,aAAa,qBAAqB,CACrC,KAAK,WAAW;AAEf,SADiB,sBAAsB,OAAO,IAAI,OACnC,GAAG,SAAS;GAC3B,CACD,QAAQ,WAA2C,WAAW,KAAK,CACnE,MAAM,MAAM,UAAU;EACrB,MAAM,YAAY,KAAK,mBAAmB,OAAO;EACjD,MAAM,aAAa,MAAM,mBAAmB,OAAO;AACnD,MAAI,cAAc,WAChB,QAAO,YAAY;AAErB,SAAO,KAAK,GAAG,cAAc,MAAM,GAAG;GACtC,CACD,KAAK,WAAW,OAAO,GAAG;CAE7B,MAAM,QAAuB,CAAC,QAAQ;AACtC,MAAK,MAAM,cAAc,WACvB,KAAI,eAAe,WAAW,CAAC,MAAM,SAAS,WAAW,CACvD,OAAM,KAAK,WAAW;AAG1B,QAAO;;;AAIT,SAAgB,2BAA2B,QAA6C;AACtF,KAAI,CAAC,OAAO,QACV,OAAM,IAAI,MAAM,qBAAqB;CAEvC,MAAM,QAAQ,qBAAqB,OAAO,UAAU,OAAO,UAAU,OAAO;CAC5E,MAAM,QAAkC,EAAE;AAC1C,MAAK,MAAM,cAAc,OAAO;EAC9B,MAAM,WAAW,sBAAsB,YAAY,OAAO;AAC1D,MAAI,SACF,OAAM,KAAK,SAAS;;AAGxB,KAAI,MAAM,WAAW,EACnB,OAAM,IAAI,MAAM,iCAAiC;AAEnD,KAAI,MACF;EAAE,SAAS,OAAO;EAAU,OAAO,MAAM,KAAK,MAAM,EAAE,WAAW;EAAE,EACnE,8BACD;AACD,QAAO;;AAKT,SAAgB,eAAe,QAA6B;AAC1D,KAAI,CAAC,QAAQ,QACX,QAAO;AAET,KAAI;AACF,SAAO,2BAA2B,OAAO,CAAC,SAAS;SAC7C;AACN,SAAO;;;AAIX,SAAgB,qBAAqB,UAAuB,QAA4B;AACtF,QAAO,sBAAsB,UAAU,OAAO,KAAK;;AAGrD,SAAgB,sBAAsB,QAAkC;AACtE,QAAO,qBAAqB,CACzB,KAAK,WAAW,OAAO,GAAG,CAC1B,QAAQ,aAAa,qBAAqB,UAAU,OAAO,CAAC;;;AAIjE,SAAgB,kCAA4C;AAC1D,QAAO,qBAAqB,CAAC,KAAK,WAAW,OAAO,GAAG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-providers.js","names":[],"sources":["../../../../src/voice/tts/list-providers.ts"],"sourcesContent":["/**\n * Registry-driven TTS provider listing for gateway / Web UI discovery.\n */\n\nimport type { Config } from '../../config/schema.js';\nimport { getVoiceProviderMetadata, type VoiceProviderMetadata } from '../metadata/index.js';\n\nimport { resolveSpeechProvider } from './factory.js';\nimport { mergeTtsConfigFromAppConfig } from './merge-config.js';\nimport { listSpeechProviders } from './speech-registry.js';\n\nexport interface TtsProviderListEntry extends VoiceProviderMetadata {\n aliases: string[];\n configured: boolean;\n}\n\nexport interface TtsProvidersPayload {\n providers: TtsProviderListEntry[];\n active: string;\n}\n\nfunction fallbackMetadata(providerId: string, aliases: readonly string[]): VoiceProviderMetadata {\n return {\n id: providerId,\n capability: 'tts',\n displayName: providerId,\n aliases: [...aliases],\n fields: [\n { key: 'apiKey', label: 'API Key', type: 'password', secret: true },\n { key: 'model', label: 'Model', type: 'string' },\n { key: 'voice', label: 'Voice', type: 'string' },\n ],\n diagnostics: {\n requiresApiKey: true,\n configPath: `messages.tts.providers.${providerId}`,\n },\n };\n}\n\n/** List registered speech providers with configured state and UI metadata. */\nexport function listTtsProvidersForApi(config: Config | undefined): TtsProvidersPayload {\n const ttsConfig = mergeTtsConfigFromAppConfig(config?.messages?.tts);\n const providers: TtsProviderListEntry[] = listSpeechProviders().map((plugin) => {\n const metadata = getVoiceProviderMetadata('tts', plugin.id) ?? fallbackMetadata(plugin.id, plugin.aliases ?? []);\n return {\n ...metadata,\n aliases: [...(metadata.aliases ?? plugin.aliases ?? [])],\n configured: resolveSpeechProvider(plugin.id, ttsConfig) !== null,\n };\n });\n\n return {\n providers,\n active: ttsConfig.provider,\n };\n}\n"],"mappings":";;;;;;AAqBA,SAAS,iBAAiB,YAAoB,SAAmD;AAC/F,QAAO;EACL,IAAI;EACJ,YAAY;EACZ,aAAa;EACb,SAAS,CAAC,GAAG,QAAQ;EACrB,QAAQ;GACN;IAAE,KAAK;IAAU,OAAO;IAAW,MAAM;IAAY,QAAQ;IAAM;GACnE;IAAE,KAAK;IAAS,OAAO;IAAS,MAAM;IAAU;GAChD;IAAE,KAAK;IAAS,OAAO;IAAS,MAAM;IAAU;GACjD;EACD,aAAa;GACX,gBAAgB;GAChB,YAAY,0BAA0B;GACvC;EACF;;;AAIH,SAAgB,uBAAuB,QAAiD;CACtF,MAAM,YAAY,4BAA4B,QAAQ,UAAU,IAAI;AAUpE,QAAO;EACL,WAVwC,qBAAqB,CAAC,KAAK,WAAW;GAC9E,MAAM,WAAW,yBAAyB,OAAO,OAAO,GAAG,IAAI,iBAAiB,OAAO,IAAI,OAAO,WAAW,EAAE,CAAC;AAChH,UAAO;IACL,GAAG;IACH,SAAS,CAAC,GAAI,SAAS,WAAW,OAAO,WAAW,EAAE,CAAE;IACxD,YAAY,sBAAsB,OAAO,IAAI,UAAU,KAAK;IAC7D;IAIQ;EACT,QAAQ,UAAU;EACnB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge-config.js","names":[],"sources":["../../../../src/voice/tts/merge-config.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { DEFAULT_TTS_CONFIG, type TTSConfig } from './types.js';\nimport { isTTSAvailable } from './factory.js';\n\n/**\n * Merge persisted app config `tts` with defaults to a full {@link TTSConfig}\n * for validation (provider chain, env-based keys, etc.).\n */\nfunction normalizeTtsTrigger(raw: unknown): TTSConfig['trigger'] {\n const t = typeof raw === 'string' ? raw.toLowerCase() : '';\n if (t === 'off' || t === 'always' || t === 'inbound' || t === 'tagged') return t;\n return DEFAULT_TTS_CONFIG.trigger;\n}\n\nfunction normalizeTtsProvider(raw: unknown): string {\n return typeof raw === 'string' && raw.trim().length > 0 ? raw.trim() : DEFAULT_TTS_CONFIG.provider;\n}\n\nfunction mergeProviderEntries(\n base: Record<string, Record<string, unknown>> | undefined,\n patch: Record<string, Record<string, unknown>> | undefined,\n): Record<string, Record<string, unknown>> | undefined {\n if (!base && !patch) {\n return undefined;\n }\n const merged: Record<string, Record<string, unknown>> = { ...(base ?? {}) };\n for (const [providerId, slice] of Object.entries(patch ?? {})) {\n merged[providerId] = { ...(merged[providerId] ?? {}), ...slice };\n }\n return merged;\n}\n\nexport function mergeTtsConfigFromAppConfig(tts: Partial<TTSConfig> | undefined): TTSConfig {\n const p = (tts ?? {}) as Partial<TTSConfig>;\n return {\n ...DEFAULT_TTS_CONFIG,\n ...p,\n enabled: p.enabled ?? DEFAULT_TTS_CONFIG.enabled,\n provider: normalizeTtsProvider(p.provider),\n trigger: normalizeTtsTrigger(p.trigger ?? DEFAULT_TTS_CONFIG.trigger),\n fallback: {\n ...DEFAULT_TTS_CONFIG.fallback!,\n ...p.fallback,\n },\n modelOverrides: {\n ...DEFAULT_TTS_CONFIG.modelOverrides!,\n ...p.modelOverrides,\n },\n providers: mergeProviderEntries(DEFAULT_TTS_CONFIG.providers, p.providers),\n summarization: {\n ...DEFAULT_TTS_CONFIG.summarization,\n ...p.summarization,\n },\n };\n}\n\n/**\n * User-facing hint when TTS is enabled in settings but no provider can run.\n */\nexport function formatTtsSetupHint(): string {\n return (\n `⚠️ *TTS is on, but no provider can run yet.*\\n\\n` +\n `Configure one of the following in \\`~/.xopc/xopc.json\\` (or env):\\n` +\n `• *OpenAI*: \\`OPENAI_API_KEY\\` or \\`messages.tts.providers.openai.apiKey\\`\\n` +\n `• *Alibaba*: \\`DASHSCOPE_API_KEY\\` or \\`messages.tts.providers.alibaba.apiKey\\`\\n` +\n `• *MiniMax*: \\`MINIMAX_API_KEY\\` or \\`messages.tts.providers.minimax.apiKey\\`\\n` +\n `• *Edge* (no key): ensure \\`messages.tts.providers.edge.enabled\\` is not \\`false\\`\\n` +\n `• *Local CLI*: \\`messages.tts.providers.tts-local-cli.command\\`\\n\\n` +\n `You can also use the gateway Web UI → Settings → Voice.`\n );\n}\n\n/**\n * Append readiness / setup guidance when TTS is enabled but unavailable.\n */\nexport function appendTtsReadinessNote(content: string, appConfig: Config | undefined): string {\n const effective = mergeTtsConfigFromAppConfig(appConfig?.messages?.tts);\n if (!effective.enabled) {\n return content;\n }\n if (isTTSAvailable(effective)) {\n return content;\n }\n return `${content}\\n\\n${formatTtsSetupHint()}`;\n}\n"],"mappings":";;;;;;;AAQA,SAAS,oBAAoB,KAAoC;CAC/D,MAAM,IAAI,OAAO,QAAQ,WAAW,IAAI,aAAa,GAAG;AACxD,KAAI,MAAM,SAAS,MAAM,YAAY,MAAM,aAAa,MAAM,SAAU,QAAO;AAC/E,QAAO,mBAAmB;;AAG5B,SAAS,qBAAqB,KAAsB;AAClD,QAAO,OAAO,QAAQ,YAAY,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,MAAM,GAAG,mBAAmB;;AAG5F,SAAS,qBACP,MACA,OACqD;AACrD,KAAI,CAAC,QAAQ,CAAC,MACZ;CAEF,MAAM,SAAkD,EAAE,GAAI,QAAQ,EAAE,EAAG;AAC3E,MAAK,MAAM,CAAC,YAAY,UAAU,OAAO,QAAQ,SAAS,EAAE,CAAC,CAC3D,QAAO,cAAc;EAAE,GAAI,OAAO,eAAe,EAAE;EAAG,GAAG;EAAO;AAElE,QAAO;;AAGT,SAAgB,4BAA4B,KAAgD;CAC1F,MAAM,IAAK,OAAO,EAAE;AACpB,QAAO;EACL,GAAG;EACH,GAAG;EACH,SAAS,EAAE,WAAW,mBAAmB;EACzC,UAAU,qBAAqB,EAAE,SAAS;EAC1C,SAAS,oBAAoB,EAAE,WAAW,mBAAmB,QAAQ;EACrE,UAAU;GACR,GAAG,mBAAmB;GACtB,GAAG,EAAE;GACN;EACD,gBAAgB;GACd,GAAG,mBAAmB;GACtB,GAAG,EAAE;GACN;EACD,WAAW,qBAAqB,mBAAmB,WAAW,EAAE,UAAU;EAC1E,eAAe;GACb,GAAG,mBAAmB;GACtB,GAAG,EAAE;GACN;EACF;;;;;AAMH,SAAgB,qBAA6B;AAC3C,QACE;;;;;AAcJ,SAAgB,uBAAuB,SAAiB,WAAuC;CAC7F,MAAM,YAAY,4BAA4B,WAAW,UAAU,IAAI;AACvE,KAAI,CAAC,UAAU,QACb,QAAO;AAET,KAAI,eAAe,UAAU,CAC3B,QAAO;AAET,QAAO,GAAG,QAAQ,MAAM,oBAAoB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-compatible-speech.js","names":["normalizeBaseUrlGeneric"],"sources":["../../../../src/voice/tts/openai-compatible-speech.ts"],"sourcesContent":["/**\n * Factory: createOpenAiCompatibleSpeechProvider\n *\n * Most TTS providers (OpenAI, MiniMax, ElevenLabs, OpenRouter, ...) speak the\n * OpenAI `/audio/speech` POST shape. This factory eliminates the boilerplate so\n * a new compatible vendor is ~30 lines of declaration instead of a full provider\n * implementation.\n *\n * Ported from openclaw/src/tts/openai-compatible-speech-provider.ts (commit\n * baseline 2026-05-08), with the following INTENTIONAL OMISSIONS per\n * docs/voice-rearchitecture.md §15.3:\n * - resolveTalkConfig / resolveTalkOverrides (talk-mode is excluded)\n * - Persona resolution context (persona system is excluded)\n * - Custom dispatcherPolicy (xopc uses Node 22 native fetch — see ssrf-guard.ts)\n *\n * DECISION: We use `Record<string, unknown>` for the extra-config slot rather\n * than openclaw's generic `<ExtraConfig extends Record<string, unknown>>`. The\n * generic adds significant TypeScript complexity but no runtime safety; we\n * declare per-provider config types in each provider file's own normalizer.\n *\n * DECISION: `voiceCompatibleResponseFormats` defaults to `['opus']` if omitted,\n * because Telegram voice notes require opus/ogg. Providers that natively support\n * opus output (OpenAI, ElevenLabs) can rely on this; others (MiniMax mp3-only)\n * pass an empty array and downstream ffmpeg-compresses to opus.\n */\n\nimport {\n ProviderHttpError,\n fetchWithTimeoutGuarded,\n normalizeBaseUrl as normalizeBaseUrlGeneric,\n postJsonRequest,\n} from '../../media-shared/http/index.js';\nimport { createLogger } from '../../utils/logger.js';\n\nimport type {\n SpeechDirectiveTokenParseContext,\n SpeechDirectiveTokenParseResult,\n SpeechProviderConfig,\n SpeechProviderConfiguredContext,\n SpeechProviderOverrides,\n SpeechProviderPlugin,\n SpeechProviderResolveConfigContext,\n SpeechSynthesisRequest,\n SpeechSynthesisResult,\n SpeechVoiceOption,\n} from './speech-provider-types.js';\n\nconst log = createLogger('SpeechProvider:OpenAiCompat');\n\ninterface OpenAiCompatibleBaseConfig {\n apiKey?: string;\n baseUrl?: string;\n model: string;\n voice: string;\n speed?: number;\n responseFormat?: string;\n}\n\nexport type OpenAiCompatibleSpeechProviderConfig = OpenAiCompatibleBaseConfig &\n Record<string, unknown>;\n\nexport interface OpenAiCompatibleSpeechProviderExtraJsonBodyField {\n /** Key to read from normalized config. */\n configKey: string;\n /** Key to send in the HTTP body. Defaults to `configKey`. */\n requestKey?: string;\n}\n\nexport interface OpenAiCompatibleSpeechProviderOptions {\n /** Canonical provider id (e.g. \"openai\", \"minimax\"). */\n id: string;\n /** Optional aliases for provider lookup. */\n aliases?: readonly string[];\n /** Human-readable label for error messages and logs (e.g. \"OpenAI\", \"MiniMax\"). */\n label: string;\n /** Sort key for UI auto-fallback ordering. Lower = higher priority. */\n autoSelectOrder: number;\n /** Allowed model ids. Used by listVoices and validation. */\n models: readonly string[];\n /** Allowed voice ids. */\n voices: readonly string[];\n /** Default model when config does not specify. */\n defaultModel: string;\n /** Default voice. */\n defaultVoice: string;\n /** Default base URL (e.g. \"https://api.openai.com/v1\"). */\n defaultBaseUrl: string;\n /** Env var name for the api key (e.g. \"OPENAI_API_KEY\"). */\n envKey: string;\n /** Allowed response formats. */\n responseFormats: readonly string[];\n /** Default response format (e.g. \"opus\" for OpenAI, \"mp3\" for MiniMax). */\n defaultResponseFormat: string;\n /** Response formats that produce a voice-note-compatible buffer (no ffmpeg needed). */\n voiceCompatibleResponseFormats?: readonly string[];\n /** Extra static headers (e.g. `{ \"OpenAI-Beta\": \"...\" }`). Auth header is added automatically. */\n extraHeaders?: Record<string, string>;\n /** Read provider-specific extra config keys (e.g. MiniMax's `groupId`). */\n readExtraConfig?: (raw: Record<string, unknown> | undefined) => Record<string, unknown>;\n /** Provider-specific extra body fields to copy from config into request JSON. */\n extraJsonBodyFields?: readonly OpenAiCompatibleSpeechProviderExtraJsonBodyField[];\n /** Override the API error label (defaults to `${label} TTS API error`). */\n apiErrorLabel?: string;\n /** Override the missing-key error message. */\n missingApiKeyError?: string;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction trimToUndefined(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction asFiniteNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string') {\n const parsed = Number.parseFloat(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return undefined;\n}\n\nfunction compactKey(value: string): string {\n return value.replace(/[^a-z0-9]+/giu, '').toLowerCase();\n}\n\nfunction normalizeResponseFormat(label: string, formats: readonly string[], value: unknown): string | undefined {\n const next = trimToUndefined(value)?.toLowerCase();\n if (!next) {\n return undefined;\n }\n if (formats.includes(next)) {\n return next;\n }\n throw new Error(`Invalid ${label} speech responseFormat: ${next}`);\n}\n\nfunction buildExtraJsonBodyFields(\n config: OpenAiCompatibleSpeechProviderConfig,\n fields: readonly OpenAiCompatibleSpeechProviderExtraJsonBodyField[] | undefined,\n): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n for (const field of fields ?? []) {\n const value = config[field.configKey];\n if (value !== undefined && value !== null && value !== '') {\n body[field.requestKey ?? field.configKey] = value;\n }\n }\n return body;\n}\n\nfunction readSpeechOverrides(overrides: SpeechProviderOverrides | undefined): {\n model?: string;\n voice?: string;\n speed?: number;\n} {\n if (!overrides) {\n return {};\n }\n return {\n model: trimToUndefined(overrides.model ?? overrides.modelId),\n voice: trimToUndefined(overrides.voice ?? overrides.voiceId),\n speed: asFiniteNumber(overrides.speed),\n };\n}\n\nfunction parseDirectiveTokenInternal(\n ctx: SpeechDirectiveTokenParseContext,\n providerConfigKey: string,\n): SpeechDirectiveTokenParseResult {\n const compactProviderKey = compactKey(providerConfigKey);\n switch (ctx.key) {\n case 'voice':\n case 'voice_id':\n case 'voiceid':\n case `${providerConfigKey}_voice`:\n case `${compactProviderKey}voice`:\n if (!ctx.policy.allowVoice) {\n return { handled: true };\n }\n return { handled: true, overrides: { voice: ctx.value } };\n case 'model':\n case 'model_id':\n case 'modelid':\n case `${providerConfigKey}_model`:\n case `${compactProviderKey}model`:\n if (!ctx.policy.allowModelId) {\n return { handled: true };\n }\n return { handled: true, overrides: { model: ctx.value } };\n case 'speed': {\n const speed = asFiniteNumber(ctx.value);\n if (speed === undefined) {\n return { handled: true, warnings: [`Invalid speed value: ${ctx.value}`] };\n }\n return { handled: true, overrides: { speed } };\n }\n default:\n return { handled: false };\n }\n}\n\nexport function createOpenAiCompatibleSpeechProvider(\n options: OpenAiCompatibleSpeechProviderOptions,\n): SpeechProviderPlugin {\n const providerConfigKey = options.id;\n const voiceCompatibleResponseFormats = options.voiceCompatibleResponseFormats ?? ['opus'];\n\n function readExtraConfig(raw: Record<string, unknown> | undefined): Record<string, unknown> {\n return options.readExtraConfig?.(raw) ?? {};\n }\n\n function normalizeConfig(rawConfig: Record<string, unknown>): OpenAiCompatibleSpeechProviderConfig {\n const raw = asObject(rawConfig[providerConfigKey]) ?? rawConfig;\n return {\n apiKey: trimToUndefined(raw.apiKey),\n baseUrl: trimToUndefined(raw.baseUrl)\n ? normalizeBaseUrlGeneric(String(raw.baseUrl))\n : undefined,\n model: trimToUndefined(raw.model ?? raw.modelId) ?? options.defaultModel,\n voice: trimToUndefined(raw.voice ?? raw.voiceId) ?? options.defaultVoice,\n speed: asFiniteNumber(raw.speed),\n responseFormat: normalizeResponseFormat(options.label, options.responseFormats, raw.responseFormat),\n ...readExtraConfig(raw),\n };\n }\n\n function readProviderConfig(config: SpeechProviderConfig): OpenAiCompatibleSpeechProviderConfig {\n return {\n apiKey: trimToUndefined(config.apiKey),\n baseUrl: trimToUndefined(config.baseUrl)\n ? normalizeBaseUrlGeneric(String(config.baseUrl))\n : undefined,\n model: trimToUndefined(config.model ?? config.modelId) ?? options.defaultModel,\n voice: trimToUndefined(config.voice ?? config.voiceId) ?? options.defaultVoice,\n speed: asFiniteNumber(config.speed),\n responseFormat:\n normalizeResponseFormat(options.label, options.responseFormats, config.responseFormat) ??\n options.defaultResponseFormat,\n ...readExtraConfig(config),\n };\n }\n\n function resolveApiKey(providerConfig: OpenAiCompatibleSpeechProviderConfig): string | undefined {\n return providerConfig.apiKey ?? trimToUndefined(process.env[options.envKey]);\n }\n\n function resolveBaseUrl(providerConfig: OpenAiCompatibleSpeechProviderConfig): string {\n return providerConfig.baseUrl ?? options.defaultBaseUrl.replace(/\\/+$/u, '');\n }\n\n return {\n id: options.id,\n aliases: options.aliases,\n autoSelectOrder: options.autoSelectOrder,\n\n resolveConfig: (ctx: SpeechProviderResolveConfigContext) => normalizeConfig(ctx.rawConfig),\n\n isConfigured: (ctx: SpeechProviderConfiguredContext) =>\n Boolean(resolveApiKey(readProviderConfig(ctx.providerConfig))),\n\n parseDirectiveToken: (ctx) => parseDirectiveTokenInternal(ctx, providerConfigKey),\n\n listVoices: async (): Promise<SpeechVoiceOption[]> =>\n options.voices.map((voice) => ({ id: voice, name: voice })),\n\n synthesize: async (req: SpeechSynthesisRequest): Promise<SpeechSynthesisResult> => {\n const config = readProviderConfig(req.providerConfig);\n const overrides = readSpeechOverrides(req.providerOverrides);\n const apiKey = resolveApiKey(config);\n if (!apiKey) {\n throw new Error(options.missingApiKeyError ?? `${options.label} API key missing`);\n }\n const baseUrl = resolveBaseUrl(config);\n const responseFormat = config.responseFormat ?? options.defaultResponseFormat;\n const speed = overrides.speed ?? config.speed;\n const model = overrides.model ?? config.model;\n const voice = overrides.voice ?? config.voice;\n\n const url = `${baseUrl}/audio/speech`;\n log.debug(\n { provider: options.id, model, voice, responseFormat, baseUrl, target: req.target },\n `Calling ${options.label} TTS`,\n );\n\n // postJsonRequest already throws ProviderHttpError on non-2xx.\n const response = await postJsonRequest(url, {\n timeoutMs: req.timeoutMs,\n label: options.apiErrorLabel ?? `${options.label} TTS API error`,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n ...options.extraHeaders,\n },\n body: {\n model,\n input: req.text,\n voice,\n response_format: responseFormat,\n ...(speed === undefined ? {} : { speed }),\n ...buildExtraJsonBodyFields(config, options.extraJsonBodyFields),\n },\n });\n\n const audioBuffer = Buffer.from(await response.arrayBuffer());\n return {\n audioBuffer,\n outputFormat: responseFormat,\n fileExtension: responseFormat,\n voiceCompatible: voiceCompatibleResponseFormats.includes(responseFormat),\n };\n },\n\n /**\n * Streaming via OpenAI's POST /audio/speech (the response body itself is\n * the audio stream — no SSE / WebSocket needed). We do NOT call assertOk\n * via postJsonRequest because we want to surface the body as-is for\n * streaming consumers; instead we manually check status and convert to\n * ProviderHttpError on failure (matches openclaw behavior).\n */\n synthesizeStream: async (req) => {\n const config = readProviderConfig(req.providerConfig);\n const overrides = readSpeechOverrides(req.providerOverrides);\n const apiKey = resolveApiKey(config);\n if (!apiKey) {\n throw new Error(options.missingApiKeyError ?? `${options.label} API key missing`);\n }\n const baseUrl = resolveBaseUrl(config);\n const responseFormat = config.responseFormat ?? options.defaultResponseFormat;\n const speed = overrides.speed ?? config.speed;\n const model = overrides.model ?? config.model;\n const voice = overrides.voice ?? config.voice;\n\n const response = await fetchWithTimeoutGuarded(`${baseUrl}/audio/speech`, {\n timeoutMs: req.timeoutMs,\n label: options.apiErrorLabel ?? `${options.label} TTS streaming`,\n init: {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'content-type': 'application/json',\n accept: 'application/octet-stream',\n ...options.extraHeaders,\n },\n body: JSON.stringify({\n model,\n input: req.text,\n voice,\n response_format: responseFormat,\n stream: true,\n ...(speed === undefined ? {} : { speed }),\n ...buildExtraJsonBodyFields(config, options.extraJsonBodyFields),\n }),\n },\n });\n\n if (!response.ok) {\n const detail = await response.text().catch(() => undefined);\n throw new ProviderHttpError({\n label: options.apiErrorLabel ?? `${options.label} TTS streaming`,\n status: response.status,\n detail: detail?.slice(0, 220),\n });\n }\n if (!response.body) {\n throw new Error(`${options.label} TTS streaming: empty response body`);\n }\n\n return {\n audioStream: response.body,\n outputFormat: responseFormat,\n fileExtension: responseFormat,\n voiceCompatible: voiceCompatibleResponseFormats.includes(responseFormat),\n };\n },\n };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"payload.js","names":[],"sources":["../../../../src/voice/tts/payload.ts"],"sourcesContent":["import type { OutboundMessage } from '../../channels/transport-types.js';\nimport type { Config } from '../../config/schema.js';\nimport type { TTSConfig, TTSAutoMode } from './types.js';\nimport { shouldUseTTS, getChannelOutputFormat } from './service.js';\nimport { speak } from './speak-core.js';\nimport { compressAudio } from './audio.js';\nimport { recordTtsSuccess, recordTtsFailure } from './status-tracker.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('TTS/Payload');\n\nexport interface TTSApplyOptions {\n config: TTSConfig | undefined;\n channel: string;\n inboundAudio: boolean;\n /** Resolves summarization LLM when enabled */\n appConfig?: Config;\n}\n\nexport async function maybeApplyTtsToPayload(\n msg: OutboundMessage,\n options: TTSApplyOptions\n): Promise<OutboundMessage> {\n const { config, channel, inboundAudio } = options;\n\n if (!msg.content?.trim()) return msg;\n if (msg.mediaUrl) return msg;\n\n const ttsDecision = shouldUseTTS(config, inboundAudio);\n if (!ttsDecision.useTTS) {\n log.debug({ reason: ttsDecision.reason }, 'TTS skipped');\n return msg;\n }\n\n const trigger = config?.trigger || 'off';\n if (trigger === 'off') return msg;\n\n if (trigger === 'tagged') {\n const hasTtsDirective = /\\[\\[tts\\]\\]/i.test(msg.content);\n if (!hasTtsDirective) return msg;\n msg = {\n ...msg,\n content: msg.content.replace(/\\[\\[tts\\]\\]/gi, '').trim(),\n };\n }\n\n const startTime = Date.now();\n\n try {\n const outFmt = getChannelOutputFormat(channel);\n const ttsResult = await speak(msg.content, config, {\n appConfig: options.appConfig,\n tts: {\n format: outFmt.format as 'opus' | 'mp3' | 'wav',\n },\n });\n\n const wavTarget = outFmt.format === 'mp3' ? 'mp3' : 'opus';\n const { buffer: compressedAudio, format: compressedFormat } = await compressAudio(\n Buffer.from(ttsResult.audio),\n ttsResult.format,\n wavTarget,\n );\n\n const mimeType =\n compressedFormat === 'opus'\n ? 'audio/ogg'\n : compressedFormat === 'mp3' || compressedFormat === 'mpeg'\n ? 'audio/mpeg'\n : `audio/${compressedFormat}`;\n const base64 = compressedAudio.toString('base64');\n const dataUrl = `data:${mimeType};base64,${base64}`;\n\n const latencyMs = Date.now() - startTime;\n recordTtsSuccess({\n provider: ttsResult.provider,\n latencyMs,\n textLength: msg.content.length,\n audioSize: compressedAudio.length,\n audioFormat: compressedFormat,\n usedFallback: Boolean(ttsResult.fallbackFrom),\n wasSummarized: Boolean(ttsResult.wasSummarized),\n });\n\n log.info({ channel, provider: ttsResult.provider, format: compressedFormat }, 'TTS generated');\n\n return {\n ...msg,\n mediaUrl: dataUrl,\n mediaType: 'audio',\n audioAsVoice: outFmt.voiceCompatible,\n };\n } catch (error) {\n const latencyMs = Date.now() - startTime;\n recordTtsFailure({\n latencyMs,\n textLength: msg.content?.length ?? 0,\n error: error instanceof Error ? error.message : String(error),\n });\n log.warn({ error }, 'TTS failed, sending text');\n return msg;\n }\n}\n\nexport function isTtsEnabled(config: TTSConfig | undefined): boolean {\n if (!config?.enabled) return false;\n return config.trigger !== 'off';\n}\n\nexport function resolveTtsAutoMode(\n config: TTSConfig | undefined,\n sessionOverride?: string\n): TTSAutoMode {\n if (sessionOverride) {\n const normalized = sessionOverride.toLowerCase().trim();\n if (['off', 'always', 'inbound', 'tagged'].includes(normalized)) {\n return normalized as TTSAutoMode;\n }\n }\n if (!config?.enabled) return 'off';\n return config.trigger || 'off';\n}\n"],"mappings":";;;;;;;aAOqD;AAErD,MAAM,MAAM,aAAa,cAAc;AAUvC,eAAsB,uBACpB,KACA,SAC0B;CAC1B,MAAM,EAAE,QAAQ,SAAS,iBAAiB;AAE1C,KAAI,CAAC,IAAI,SAAS,MAAM,CAAE,QAAO;AACjC,KAAI,IAAI,SAAU,QAAO;CAEzB,MAAM,cAAc,aAAa,QAAQ,aAAa;AACtD,KAAI,CAAC,YAAY,QAAQ;AACvB,MAAI,MAAM,EAAE,QAAQ,YAAY,QAAQ,EAAE,cAAc;AACxD,SAAO;;CAGT,MAAM,UAAU,QAAQ,WAAW;AACnC,KAAI,YAAY,MAAO,QAAO;AAE9B,KAAI,YAAY,UAAU;AAExB,MAAI,CADoB,eAAe,KAAK,IAAI,QAC5B,CAAE,QAAO;AAC7B,QAAM;GACJ,GAAG;GACH,SAAS,IAAI,QAAQ,QAAQ,iBAAiB,GAAG,CAAC,MAAM;GACzD;;CAGH,MAAM,YAAY,KAAK,KAAK;AAE5B,KAAI;EACF,MAAM,SAAS,uBAAuB,QAAQ;EAC9C,MAAM,YAAY,MAAM,MAAM,IAAI,SAAS,QAAQ;GACjD,WAAW,QAAQ;GACnB,KAAK,EACH,QAAQ,OAAO,QAChB;GACF,CAAC;EAEF,MAAM,YAAY,OAAO,WAAW,QAAQ,QAAQ;EACpD,MAAM,EAAE,QAAQ,iBAAiB,QAAQ,qBAAqB,MAAM,cAClE,OAAO,KAAK,UAAU,MAAM,EAC5B,UAAU,QACV,UACD;EASD,MAAM,UAAU,QANd,qBAAqB,SACjB,cACA,qBAAqB,SAAS,qBAAqB,SACjD,eACA,SAAS,mBAEgB,UADlB,gBAAgB,SAAS,SACS;EAEjD,MAAM,YAAY,KAAK,KAAK,GAAG;AAC/B,mBAAiB;GACf,UAAU,UAAU;GACpB;GACA,YAAY,IAAI,QAAQ;GACxB,WAAW,gBAAgB;GAC3B,aAAa;GACb,cAAc,QAAQ,UAAU,aAAa;GAC7C,eAAe,QAAQ,UAAU,cAAc;GAChD,CAAC;AAEF,MAAI,KAAK;GAAE;GAAS,UAAU,UAAU;GAAU,QAAQ;GAAkB,EAAE,gBAAgB;AAE9F,SAAO;GACL,GAAG;GACH,UAAU;GACV,WAAW;GACX,cAAc,OAAO;GACtB;UACM,OAAO;AAEd,mBAAiB;GACf,WAFgB,KAAK,KAAK,GAAG;GAG7B,YAAY,IAAI,SAAS,UAAU;GACnC,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;GAC9D,CAAC;AACF,MAAI,KAAK,EAAE,OAAO,EAAE,2BAA2B;AAC/C,SAAO;;;AAIX,SAAgB,aAAa,QAAwC;AACnE,KAAI,CAAC,QAAQ,QAAS,QAAO;AAC7B,QAAO,OAAO,YAAY;;AAG5B,SAAgB,mBACd,QACA,iBACa;AACb,KAAI,iBAAiB;EACnB,MAAM,aAAa,gBAAgB,aAAa,CAAC,MAAM;AACvD,MAAI;GAAC;GAAO;GAAU;GAAW;GAAS,CAAC,SAAS,WAAW,CAC7D,QAAO;;AAGX,KAAI,CAAC,QAAQ,QAAS,QAAO;AAC7B,QAAO,OAAO,WAAW"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"preprocess.js","names":[],"sources":["../../../../src/voice/tts/preprocess.ts"],"sourcesContent":["import { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('TTS:Preprocess');\n\nexport interface PreprocessOptions {\n maxLength?: number;\n stripMarkdown?: boolean;\n normalizeWhitespace?: boolean;\n}\n\nexport interface PreprocessResult {\n text: string;\n wasTruncated: boolean;\n originalLength: number;\n finalLength: number;\n}\n\nexport function stripMarkdown(text: string): string {\n return (\n text\n .replace(/```[\\s\\S]*?```/g, (match) => {\n const content = match.replace(/```(\\w+)?\\n?/, '').replace(/```$/, '');\n return content.trim();\n })\n .replace(/^#{1,6}\\s+/gm, '')\n .replace(/(\\*\\*|__)(.+?)\\1/g, '$2')\n .replace(/(\\*|_)(.+?)\\1/g, '$2')\n .replace(/`([^`]+)`/g, '$1')\n .replace(/^\\s*>\\s*/gm, '')\n .replace(/!\\[([^\\]]*)\\]\\([^)]+\\)/g, '$1')\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1')\n .replace(/~~(.+?)~~/g, '$1')\n .replace(/^(---+|\\*\\*\\*+|___+)\\s*$/gm, '')\n .replace(/^\\s*[-*+]\\s+/gm, '')\n .replace(/^\\s*\\d+\\.\\s+/gm, '')\n .replace(/<[^>]+>/g, '')\n );\n}\n\nexport function normalizeWhitespace(text: string): string {\n return (\n text\n .replace(/[ \\t]+/g, ' ')\n .replace(/\\n{3,}/g, '\\n\\n')\n .split('\\n')\n .map((line) => line.trim())\n .join('\\n')\n .trim()\n );\n}\n\nexport function truncateText(text: string, maxLength: number): { text: string; wasTruncated: boolean } {\n if (text.length <= maxLength) {\n return { text, wasTruncated: false };\n }\n\n let truncateAt = maxLength - 3;\n while (truncateAt > 0 && text[truncateAt] !== ' ' && text[truncateAt] !== '\\n') {\n truncateAt--;\n }\n\n if (truncateAt <= maxLength * 0.8) {\n truncateAt = maxLength - 3;\n }\n\n return {\n text: text.slice(0, truncateAt).trim() + '...',\n wasTruncated: true,\n };\n}\n\nexport function preprocessText(\n text: string,\n options: PreprocessOptions = {}\n): PreprocessResult {\n const {\n maxLength = 4096,\n stripMarkdown: shouldStripMarkdown = true,\n normalizeWhitespace: shouldNormalizeWhitespace = true,\n } = options;\n\n const originalLength = text.length;\n let processed = text;\n\n if (shouldStripMarkdown) {\n processed = stripMarkdown(processed);\n log.debug({ originalLength, afterMarkdown: processed.length }, 'Stripped markdown');\n }\n\n if (shouldNormalizeWhitespace) {\n processed = normalizeWhitespace(processed);\n log.debug({ afterWhitespace: processed.length }, 'Normalized whitespace');\n }\n\n const { text: finalText, wasTruncated } = truncateText(processed, maxLength);\n\n if (wasTruncated) {\n log.warn(\n { originalLength, finalLength: finalText.length, maxLength },\n 'Text truncated for TTS'\n );\n }\n\n return {\n text: finalText,\n wasTruncated,\n originalLength,\n finalLength: finalText.length,\n };\n}\n\nexport function checkTTSSuitability(text: string): { suitable: boolean; reason?: string } {\n const trimmed = text.trim();\n\n if (trimmed.length < 10) {\n return { suitable: false, reason: 'Text too short for TTS (min 10 chars)' };\n }\n\n const codePattern = /[{};\\[\\]\\(\\)=><]/g;\n const codeMatches = trimmed.match(codePattern);\n const codeRatio = codeMatches ? codeMatches.length / trimmed.length : 0;\n if (codeRatio > 0.3) {\n return { suitable: false, reason: 'Text appears to be mostly code' };\n }\n\n if (/^(https?:\\/\\/\\S+\\s*)+$/.test(trimmed)) {\n return { suitable: false, reason: 'Text contains only URLs' };\n }\n\n return { suitable: true };\n}\n"],"mappings":";;;aAAqD;AAErD,MAAM,MAAM,aAAa,iBAAiB;AAe1C,SAAgB,cAAc,MAAsB;AAClD,QACE,KACG,QAAQ,oBAAoB,UAAU;AAErC,SADgB,MAAM,QAAQ,gBAAgB,GAAG,CAAC,QAAQ,QAAQ,GACpD,CAAC,MAAM;GACrB,CACD,QAAQ,gBAAgB,GAAG,CAC3B,QAAQ,qBAAqB,KAAK,CAClC,QAAQ,kBAAkB,KAAK,CAC/B,QAAQ,cAAc,KAAK,CAC3B,QAAQ,cAAc,GAAG,CACzB,QAAQ,2BAA2B,KAAK,CACxC,QAAQ,0BAA0B,KAAK,CACvC,QAAQ,cAAc,KAAK,CAC3B,QAAQ,8BAA8B,GAAG,CACzC,QAAQ,kBAAkB,GAAG,CAC7B,QAAQ,kBAAkB,GAAG,CAC7B,QAAQ,YAAY,GAAG;;AAI9B,SAAgB,oBAAoB,MAAsB;AACxD,QACE,KACG,QAAQ,WAAW,IAAI,CACvB,QAAQ,WAAW,OAAO,CAC1B,MAAM,KAAK,CACX,KAAK,SAAS,KAAK,MAAM,CAAC,CAC1B,KAAK,KAAK,CACV,MAAM;;AAIb,SAAgB,aAAa,MAAc,WAA4D;AACrG,KAAI,KAAK,UAAU,UACjB,QAAO;EAAE;EAAM,cAAc;EAAO;CAGtC,IAAI,aAAa,YAAY;AAC7B,QAAO,aAAa,KAAK,KAAK,gBAAgB,OAAO,KAAK,gBAAgB,KACxE;AAGF,KAAI,cAAc,YAAY,GAC5B,cAAa,YAAY;AAG3B,QAAO;EACL,MAAM,KAAK,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG;EACzC,cAAc;EACf;;AAGH,SAAgB,eACd,MACA,UAA6B,EAAE,EACb;CAClB,MAAM,EACJ,YAAY,MACZ,eAAe,sBAAsB,MACrC,qBAAqB,4BAA4B,SAC/C;CAEJ,MAAM,iBAAiB,KAAK;CAC5B,IAAI,YAAY;AAEhB,KAAI,qBAAqB;AACvB,cAAY,cAAc,UAAU;AACpC,MAAI,MAAM;GAAE;GAAgB,eAAe,UAAU;GAAQ,EAAE,oBAAoB;;AAGrF,KAAI,2BAA2B;AAC7B,cAAY,oBAAoB,UAAU;AAC1C,MAAI,MAAM,EAAE,iBAAiB,UAAU,QAAQ,EAAE,wBAAwB;;CAG3E,MAAM,EAAE,MAAM,WAAW,iBAAiB,aAAa,WAAW,UAAU;AAE5E,KAAI,aACF,KAAI,KACF;EAAE;EAAgB,aAAa,UAAU;EAAQ;EAAW,EAC5D,yBACD;AAGH,QAAO;EACL,MAAM;EACN;EACA;EACA,aAAa,UAAU;EACxB;;AAGH,SAAgB,oBAAoB,MAAsD;CACxF,MAAM,UAAU,KAAK,MAAM;AAE3B,KAAI,QAAQ,SAAS,GACnB,QAAO;EAAE,UAAU;EAAO,QAAQ;EAAyC;CAI7E,MAAM,cAAc,QAAQ,MAAM,oBAAY;AAE9C,MADkB,cAAc,YAAY,SAAS,QAAQ,SAAS,KACtD,GACd,QAAO;EAAE,UAAU;EAAO,QAAQ;EAAkC;AAGtE,KAAI,yBAAyB,KAAK,QAAQ,CACxC,QAAO;EAAE,UAAU;EAAO,QAAQ;EAA2B;AAG/D,QAAO,EAAE,UAAU,MAAM"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"alibaba-speech.js","names":[],"sources":["../../../../../src/voice/tts/providers/alibaba-speech.ts"],"sourcesContent":["/**\n * Alibaba DashScope TTS provider (qwen-tts model).\n *\n * Implements the SpeechProviderPlugin contract directly because DashScope's\n * response shape (output.audio.url for the audio binary, no direct stream)\n * doesn't fit the OpenAI-compatible factory.\n *\n * Implementation notes (per docs/voice-rearchitecture.md §8.4.1):\n * - `synthesizeStream` is intentionally not implemented. Native qwen-tts\n * streaming uses a WebSocket protocol\n * (wss://dashscope.aliyuncs.com/api-ws/v1/inference); speak-core's stream\n * fallback wraps `synthesize` output as a single-chunk ReadableStream so\n * callers see the same shape.\n * - `maxTextLength = 512` (DashScope qwen-tts hard limit). Enforced upstream\n * via `truncateAtSentenceBoundary` before this provider sees the text.\n * - The audio URL returned by DashScope is hosted on Alibaba's CDN (variable\n * hostname). We do not SSRF-guard the audio fetch because:\n * (a) the URL is provided by the same provider we already trust for the\n * initial synthesis call,\n * (b) it's HTTPS-only and short-lived (~5 min TTL),\n * (c) maintaining a hostname allowlist breaks every time Alibaba rotates\n * CDN domains.\n * A dedicated `assertSafeUrl` for trusted-CDN responses can be added later\n * as a hardening pass.\n */\n\nimport {\n ProviderHttpError,\n fetchWithTimeoutGuarded,\n postJsonRequest,\n} from '../../../media-shared/http/index.js';\nimport { createLogger } from '../../../utils/logger.js';\nimport { registerSpeechProvider } from '../speech-registry.js';\nimport type {\n SpeechDirectiveTokenParseContext,\n SpeechDirectiveTokenParseResult,\n SpeechProviderConfig,\n SpeechProviderConfiguredContext,\n SpeechProviderPlugin,\n SpeechProviderResolveConfigContext,\n SpeechSynthesisRequest,\n SpeechSynthesisResult,\n} from '../speech-provider-types.js';\n\nconst log = createLogger('SpeechProvider:Alibaba');\n\nconst DEFAULT_BASE_URL =\n 'https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation';\nconst DEFAULT_MODEL = 'qwen-tts';\nconst DEFAULT_VOICE = 'longxiaochun';\nconst ENV_KEY = 'DASHSCOPE_API_KEY';\nconst MAX_TEXT_LENGTH = 512;\nconst ALIBABA_VOICES = [\n 'Cherry',\n 'Ethan',\n 'Serena',\n 'Chelsie',\n 'longxiaochun',\n 'longxiaobai',\n 'longwan',\n 'longcheng',\n] as const;\n\ninterface AlibabaTtsConfig extends Record<string, unknown> {\n apiKey?: string;\n baseUrl: string;\n model: string;\n voice: string;\n}\n\ninterface CosyVoiceResponse {\n output: {\n audio?: { url?: string; data?: string };\n speech?: string;\n speech_url?: string;\n finish_reason?: string;\n };\n usage?: { characters?: number };\n request_id?: string;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction trimToUndefined(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction normalizeConfig(rawConfig: Record<string, unknown>): AlibabaTtsConfig {\n const raw = asObject(rawConfig.alibaba) ?? {};\n return {\n apiKey: trimToUndefined(raw.apiKey),\n baseUrl: trimToUndefined(raw.baseUrl) ?? DEFAULT_BASE_URL,\n model: trimToUndefined(raw.model ?? raw.modelId) ?? DEFAULT_MODEL,\n voice: trimToUndefined(raw.voice ?? raw.voiceId) ?? DEFAULT_VOICE,\n };\n}\n\nfunction readProviderConfig(config: SpeechProviderConfig): AlibabaTtsConfig {\n return {\n apiKey: trimToUndefined(config.apiKey),\n baseUrl: trimToUndefined(config.baseUrl) ?? DEFAULT_BASE_URL,\n model: trimToUndefined(config.model ?? config.modelId) ?? DEFAULT_MODEL,\n voice: trimToUndefined(config.voice ?? config.voiceId) ?? DEFAULT_VOICE,\n };\n}\n\nfunction resolveApiKey(config: AlibabaTtsConfig): string | undefined {\n return config.apiKey ?? trimToUndefined(process.env[ENV_KEY]);\n}\n\nfunction parseDirectiveTokenInternal(\n ctx: SpeechDirectiveTokenParseContext,\n): SpeechDirectiveTokenParseResult {\n switch (ctx.key) {\n case 'voice':\n case 'voice_id':\n case 'voiceid':\n case 'alibaba_voice':\n case 'alibabavoice':\n if (!ctx.policy.allowVoice) {\n return { handled: true };\n }\n return { handled: true, overrides: { voice: ctx.value } };\n case 'model':\n case 'model_id':\n case 'modelid':\n case 'alibaba_model':\n case 'alibabamodel':\n if (!ctx.policy.allowModelId) {\n return { handled: true };\n }\n return { handled: true, overrides: { model: ctx.value } };\n default:\n return { handled: false };\n }\n}\n\nexport const alibabaSpeechProvider: SpeechProviderPlugin = {\n id: 'alibaba',\n aliases: ['dashscope', 'qwen-tts'],\n autoSelectOrder: 25,\n\n resolveConfig: (ctx: SpeechProviderResolveConfigContext) => normalizeConfig(ctx.rawConfig),\n\n isConfigured: (ctx: SpeechProviderConfiguredContext) =>\n Boolean(resolveApiKey(readProviderConfig(ctx.providerConfig))),\n\n parseDirectiveToken: parseDirectiveTokenInternal,\n\n listVoices: async () => ALIBABA_VOICES.map((id) => ({ id, name: id })),\n\n synthesize: async (req: SpeechSynthesisRequest): Promise<SpeechSynthesisResult> => {\n const config = readProviderConfig(req.providerConfig);\n const apiKey = resolveApiKey(config);\n if (!apiKey) {\n throw new Error(\n `Alibaba TTS API key missing (set ${ENV_KEY} or messages.tts.providers.alibaba.apiKey)`,\n );\n }\n if (req.text.length > MAX_TEXT_LENGTH) {\n throw new Error(\n `Alibaba TTS text exceeds ${MAX_TEXT_LENGTH} char limit (got ${req.text.length})`,\n );\n }\n\n const overrides = req.providerOverrides ?? {};\n const model = trimToUndefined(overrides.model ?? overrides.modelId) ?? config.model;\n const voice = trimToUndefined(overrides.voice ?? overrides.voiceId) ?? config.voice;\n\n log.debug({ model, voice, textLength: req.text.length }, 'Calling Alibaba TTS');\n\n const response = await postJsonRequest(config.baseUrl, {\n timeoutMs: req.timeoutMs,\n label: 'Alibaba TTS',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'X-DashScope-DataInspection': 'disable',\n },\n body: {\n model,\n input: { text: req.text },\n parameters: { voice },\n },\n });\n\n const data = (await response.json()) as CosyVoiceResponse;\n\n // DashScope occasionally returns `finish_reason: \"null\"` (string) on failure.\n if (data.output?.finish_reason === 'null' && !data.output?.audio?.url) {\n throw new Error(`Alibaba TTS API error: ${JSON.stringify(data)}`);\n }\n\n let audioBuffer: Buffer;\n const audioUrl = data.output?.audio?.url ?? data.output?.speech_url;\n if (audioUrl) {\n // CDN URL — see file-level DECISION on why we skip SSRF here.\n const audioResponse = await fetchWithTimeoutGuarded(audioUrl, {\n timeoutMs: req.timeoutMs,\n label: 'Alibaba TTS audio download',\n allowPrivateNetwork: false,\n });\n if (!audioResponse.ok) {\n throw new ProviderHttpError({\n label: 'Alibaba TTS audio download',\n status: audioResponse.status,\n detail: audioResponse.statusText,\n });\n }\n audioBuffer = Buffer.from(await audioResponse.arrayBuffer());\n } else if (data.output?.speech) {\n audioBuffer = Buffer.from(data.output.speech, 'base64');\n } else if (data.output?.audio?.data) {\n audioBuffer = Buffer.from(data.output.audio.data, 'base64');\n } else {\n throw new Error('No audio returned from Alibaba TTS');\n }\n\n log.debug(\n { size: audioBuffer.length, characters: data.usage?.characters, requestId: data.request_id },\n 'Alibaba TTS completed',\n );\n\n return {\n audioBuffer,\n outputFormat: 'wav',\n fileExtension: 'wav',\n // wav is NOT a Telegram voice-note format → ffmpeg compresses downstream.\n voiceCompatible: false,\n };\n },\n\n // synthesizeStream intentionally omitted — see file-level DECISION.\n};\n\nregisterSpeechProvider(alibabaSpeechProvider);\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"edge-speech.js","names":[],"sources":["../../../../../src/voice/tts/providers/edge-speech.ts"],"sourcesContent":["/**\n * Edge TTS provider — wraps the `node-edge-tts` package. Requires no API key\n * (Microsoft's Edge browser endpoint is unauthenticated).\n *\n * Implementation notes:\n * - Temp-file dance (mkdtemp → ttsPromise → readFileSync → rm) is required\n * because `node-edge-tts` does not expose a stream-to-buffer API.\n * - `synthesizeStream` is implemented as \"synthesize + wrap as single-chunk\n * stream\" so callers see uniform behavior. This is not a true network\n * stream; it's buffered-then-wrapped.\n * - `inferEdgeExtension` derives the file extension from Edge's outputFormat\n * string.\n */\n\nimport { mkdtempSync, readFileSync, rmSync, statSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\n\nimport { createLogger } from '../../../utils/logger.js';\nimport { registerSpeechProvider } from '../speech-registry.js';\nimport type {\n SpeechDirectiveTokenParseContext,\n SpeechDirectiveTokenParseResult,\n SpeechProviderConfig,\n SpeechProviderConfiguredContext,\n SpeechProviderPlugin,\n SpeechProviderResolveConfigContext,\n SpeechSynthesisRequest,\n SpeechSynthesisResult,\n SpeechSynthesisStreamRequest,\n SpeechSynthesisStreamResult,\n} from '../speech-provider-types.js';\n\nconst log = createLogger('SpeechProvider:Edge');\n\nconst DEFAULT_VOICE = 'zh-CN-XiaoxiaoNeural';\nconst DEFAULT_LANG = 'zh-CN';\nconst DEFAULT_OUTPUT_FORMAT = 'audio-24khz-48kbitrate-mono-mp3';\n\ninterface EdgeTtsConfig extends Record<string, unknown> {\n voice: string;\n lang: string;\n outputFormat: string;\n pitch?: string;\n rate?: string;\n volume?: string;\n proxy?: string;\n enabled: boolean;\n}\n\nfunction trimToUndefined(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction inferEdgeExtension(outputFormat: string): { ext: string; format: string } {\n const normalized = outputFormat.toLowerCase();\n if (normalized.includes('webm')) return { ext: 'webm', format: 'webm' };\n if (normalized.includes('opus')) return { ext: 'opus', format: 'opus' };\n if (normalized.includes('ogg')) return { ext: 'ogg', format: 'ogg' };\n if (normalized.includes('wav') || normalized.includes('riff') || normalized.includes('pcm')) {\n return { ext: 'wav', format: 'wav' };\n }\n return { ext: 'mp3', format: 'mp3' };\n}\n\nfunction normalizeConfig(rawConfig: Record<string, unknown>): EdgeTtsConfig {\n const raw = asObject(rawConfig.edge) ?? rawConfig;\n return {\n voice: trimToUndefined(raw.voice ?? raw.voiceId) ?? DEFAULT_VOICE,\n lang: trimToUndefined(raw.lang) ?? DEFAULT_LANG,\n outputFormat: trimToUndefined(raw.outputFormat) ?? DEFAULT_OUTPUT_FORMAT,\n pitch: trimToUndefined(raw.pitch),\n rate: trimToUndefined(raw.rate),\n volume: trimToUndefined(raw.volume),\n proxy: trimToUndefined(raw.proxy),\n enabled: raw.enabled !== false, // default-on\n };\n}\n\nfunction readProviderConfig(config: SpeechProviderConfig): EdgeTtsConfig {\n return {\n voice: trimToUndefined(config.voice ?? config.voiceId) ?? DEFAULT_VOICE,\n lang: trimToUndefined(config.lang) ?? DEFAULT_LANG,\n outputFormat: trimToUndefined(config.outputFormat) ?? DEFAULT_OUTPUT_FORMAT,\n pitch: trimToUndefined(config.pitch),\n rate: trimToUndefined(config.rate),\n volume: trimToUndefined(config.volume),\n proxy: trimToUndefined(config.proxy),\n enabled: config.enabled !== false,\n };\n}\n\nfunction parseDirectiveTokenInternal(\n ctx: SpeechDirectiveTokenParseContext,\n): SpeechDirectiveTokenParseResult {\n switch (ctx.key) {\n case 'voice':\n case 'voice_id':\n case 'voiceid':\n case 'edge_voice':\n case 'edgevoice':\n if (!ctx.policy.allowVoice) {\n return { handled: true };\n }\n return { handled: true, overrides: { voice: ctx.value } };\n default:\n return { handled: false };\n }\n}\n\nasync function waitForNonEmptyFile(filePath: string, timeoutMs: number): Promise<void> {\n const deadline = Date.now() + Math.min(Math.max(timeoutMs, 1000), 5000);\n while (Date.now() < deadline) {\n try {\n if (statSync(filePath).size > 0) return;\n } catch {\n // The Edge package may resolve before the file is visible on slower filesystems.\n }\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n}\n\nasync function synthesizeToBuffer(\n text: string,\n config: EdgeTtsConfig,\n voiceOverride: string | undefined,\n timeoutMs: number,\n): Promise<{ buffer: Buffer; outputFormat: string; ext: string }> {\n // Lazy import — node-edge-tts loads ws transitively; skip cost for users that\n // never enable the edge provider.\n const { EdgeTTS } = await import('node-edge-tts');\n\n const voice = voiceOverride ?? config.voice;\n const tempDir = mkdtempSync(path.join(tmpdir(), 'tts-edge-'));\n const { ext, format } = inferEdgeExtension(config.outputFormat);\n const outputPath = path.join(tempDir, `speech-${Date.now()}.${ext}`);\n\n try {\n log.debug(\n { voice, outputFormat: config.outputFormat, textLength: text.length },\n 'Calling Edge TTS',\n );\n const tts = new EdgeTTS({\n voice,\n lang: config.lang,\n outputFormat: config.outputFormat,\n proxy: config.proxy,\n rate: config.rate,\n pitch: config.pitch,\n volume: config.volume,\n timeout: timeoutMs,\n });\n await tts.ttsPromise(text, outputPath);\n await waitForNonEmptyFile(outputPath, timeoutMs);\n const buffer = readFileSync(outputPath);\n if (buffer.length === 0) {\n throw new Error(`Edge TTS produced an empty ${format} file for voice ${voice}`);\n }\n return { buffer, outputFormat: format, ext };\n } finally {\n try {\n rmSync(tempDir, { recursive: true, force: true });\n } catch (cleanupError) {\n log.warn({ err: cleanupError, tempDir }, 'Failed to cleanup Edge TTS temp directory');\n }\n }\n}\n\nexport const edgeSpeechProvider: SpeechProviderPlugin = {\n id: 'edge',\n autoSelectOrder: 100,\n\n resolveConfig: (ctx: SpeechProviderResolveConfigContext) => normalizeConfig(ctx.rawConfig),\n\n isConfigured: (ctx: SpeechProviderConfiguredContext) => readProviderConfig(ctx.providerConfig).enabled,\n\n parseDirectiveToken: parseDirectiveTokenInternal,\n\n // Edge has hundreds of voices; we don't enumerate them statically. UI should\n // call upstream Microsoft endpoint for the full catalog.\n listVoices: async () => [{ id: DEFAULT_VOICE, name: DEFAULT_VOICE, locale: DEFAULT_LANG }],\n\n synthesize: async (req: SpeechSynthesisRequest): Promise<SpeechSynthesisResult> => {\n const config = readProviderConfig(req.providerConfig);\n if (!config.enabled) {\n throw new Error('Edge TTS is disabled in config (messages.tts.providers.edge.enabled = false)');\n }\n const overrides = req.providerOverrides ?? {};\n const voiceOverride = trimToUndefined(overrides.voice ?? overrides.voiceId);\n const { buffer, outputFormat, ext } = await synthesizeToBuffer(\n req.text,\n config,\n voiceOverride,\n req.timeoutMs,\n );\n return {\n audioBuffer: buffer,\n outputFormat,\n fileExtension: ext,\n voiceCompatible: outputFormat === 'opus' || outputFormat === 'ogg',\n };\n },\n\n // True streaming would require a node-edge-tts upstream change. We expose a\n // \"fake stream\" (single chunk) so callers don't fall through to speak-core's\n // wrapBufferAsStream branch and can treat all providers uniformly.\n synthesizeStream: async (req: SpeechSynthesisStreamRequest): Promise<SpeechSynthesisStreamResult> => {\n const config = readProviderConfig(req.providerConfig);\n if (!config.enabled) {\n throw new Error('Edge TTS is disabled in config (messages.tts.providers.edge.enabled = false)');\n }\n const overrides = req.providerOverrides ?? {};\n const voiceOverride = trimToUndefined(overrides.voice ?? overrides.voiceId);\n const { buffer, outputFormat, ext } = await synthesizeToBuffer(\n req.text,\n config,\n voiceOverride,\n req.timeoutMs,\n );\n const audioStream = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(new Uint8Array(buffer));\n controller.close();\n },\n });\n return {\n audioStream,\n outputFormat,\n fileExtension: ext,\n voiceCompatible: outputFormat === 'opus' || outputFormat === 'ogg',\n };\n },\n};\n\nregisterSpeechProvider(edgeSpeechProvider);\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"minimax-speech.js","names":[],"sources":["../../../../../src/voice/tts/providers/minimax-speech.ts"],"sourcesContent":["/**\n * MiniMax TTS provider — async task model (submit → poll → download).\n *\n * MiniMax's t2a_async_v2 endpoint does not match the OpenAI POST /audio/speech\n * shape (it returns task_id, then we poll, then we fetch the file by file_id),\n * so we implement the contract directly rather than using\n * createOpenAiCompatibleSpeechProvider.\n *\n * Implementation notes (per docs/voice-rearchitecture.md §8.4.4):\n * - Default per-call timeout: 150s. Submit + poll + download can legitimately\n * take 60-120s on long inputs, so we enforce `Math.max(timeoutMs, 150000)`.\n * - `synthesizeStream` is intentionally not implemented. MiniMax has a\n * separate WebSocket streaming endpoint that does not match the\n * buffer-then-wrap pattern; speak-core falls back to wrapBufferAsStream.\n * - Poll interval = 2s, max 60 attempts (2 min cap). Aligns with MiniMax docs.\n * - `groupId` is read from config but not passed into the request body —\n * MiniMax embeds groupId in the API key for this account tier. Kept as a\n * forward-compat slot for the enterprise account tier.\n */\n\nimport { ProviderHttpError, fetchWithTimeoutGuarded } from '../../../media-shared/http/index.js';\nimport { createLogger } from '../../../utils/logger.js';\nimport { registerSpeechProvider } from '../speech-registry.js';\nimport type {\n SpeechDirectiveTokenParseContext,\n SpeechDirectiveTokenParseResult,\n SpeechProviderConfig,\n SpeechProviderConfiguredContext,\n SpeechProviderPlugin,\n SpeechProviderResolveConfigContext,\n SpeechSynthesisRequest,\n SpeechSynthesisResult,\n} from '../speech-provider-types.js';\n\nconst log = createLogger('SpeechProvider:MiniMax');\n\nconst DEFAULT_BASE_URL = 'https://api.minimaxi.com/v1';\nconst DEFAULT_MODEL = 'speech-2.8-hd';\nconst DEFAULT_VOICE = 'male-qn-qingse';\nconst ENV_KEY = 'MINIMAX_API_KEY';\nconst POLL_INTERVAL_MS = 2000;\nconst MAX_POLL_ATTEMPTS = 60;\nconst DEFAULT_TIMEOUT_MS = 150_000;\n\nexport const MINIMAX_TTS_MODELS = [\n 'speech-2.8-hd',\n 'speech-2.8-turbo',\n 'speech-2.6-hd',\n 'speech-2.6-turbo',\n 'speech-02-hd',\n 'speech-02-turbo',\n] as const;\n\nexport const MINIMAX_TTS_VOICES = [\n 'male-qn-qingse',\n 'male-qn-jingying',\n 'male-qn-badao',\n 'male-qn-daxuesheng',\n 'female-shaonv',\n 'female-yujie',\n 'female-chengshu',\n 'female-tianmei',\n 'audiobook_male_1',\n 'audiobook_male_2',\n 'audiobook_female_1',\n 'audiobook_female_2',\n 'presenter_male',\n 'presenter_female',\n] as const;\n\ninterface MinimaxTtsConfig extends Record<string, unknown> {\n apiKey?: string;\n baseUrl: string;\n model: string;\n voice: string;\n groupId?: string;\n}\n\ninterface MiniMaxBaseResp {\n status_code?: number;\n status_msg?: string;\n}\n\ninterface SubmitResponse {\n task_id?: string;\n base_resp?: MiniMaxBaseResp;\n}\n\ninterface QueryResponse {\n status?: string;\n file_id?: string;\n base_resp?: MiniMaxBaseResp;\n}\n\nfunction trimToUndefined(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction normalizeConfig(rawConfig: Record<string, unknown>): MinimaxTtsConfig {\n const raw = asObject(rawConfig.minimax) ?? rawConfig;\n return {\n apiKey: trimToUndefined(raw.apiKey),\n baseUrl: (trimToUndefined(raw.baseUrl) ?? DEFAULT_BASE_URL).replace(/\\/+$/u, ''),\n model: trimToUndefined(raw.model ?? raw.modelId) ?? DEFAULT_MODEL,\n voice: trimToUndefined(raw.voice ?? raw.voiceId) ?? DEFAULT_VOICE,\n groupId: trimToUndefined(raw.groupId),\n };\n}\n\nfunction readProviderConfig(config: SpeechProviderConfig): MinimaxTtsConfig {\n return {\n apiKey: trimToUndefined(config.apiKey),\n baseUrl: (trimToUndefined(config.baseUrl) ?? DEFAULT_BASE_URL).replace(/\\/+$/u, ''),\n model: trimToUndefined(config.model ?? config.modelId) ?? DEFAULT_MODEL,\n voice: trimToUndefined(config.voice ?? config.voiceId) ?? DEFAULT_VOICE,\n groupId: trimToUndefined(config.groupId),\n };\n}\n\nfunction resolveApiKey(config: MinimaxTtsConfig): string | undefined {\n return config.apiKey ?? trimToUndefined(process.env[ENV_KEY]);\n}\n\nfunction abortError(): Error {\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n return err;\n}\n\nfunction sleep(ms: number, signal: AbortSignal | undefined): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(abortError());\n return;\n }\n const id = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(id);\n signal?.removeEventListener('abort', onAbort);\n reject(abortError());\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nasync function submitTask(params: {\n baseUrl: string;\n apiKey: string;\n model: string;\n voiceId: string;\n text: string;\n timeoutMs: number;\n signal?: AbortSignal;\n}): Promise<string> {\n const response = await fetchWithTimeoutGuarded(`${params.baseUrl}/t2a_async_v2`, {\n timeoutMs: params.timeoutMs,\n label: 'MiniMax TTS submit',\n signal: params.signal,\n init: {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${params.apiKey}`,\n 'content-type': 'application/json',\n },\n body: JSON.stringify({\n model: params.model,\n text: params.text,\n voice_setting: { voice_id: params.voiceId, speed: 1, vol: 10, pitch: 0 },\n audio_setting: {\n audio_sample_rate: 32000,\n bitrate: 128000,\n format: 'mp3',\n channel: 1,\n },\n }),\n },\n });\n\n const raw = await response.text();\n if (!response.ok) {\n throw new ProviderHttpError({\n label: 'MiniMax TTS submit',\n status: response.status,\n detail: raw.slice(0, 220) || response.statusText,\n });\n }\n let data: SubmitResponse;\n try {\n data = JSON.parse(raw) as SubmitResponse;\n } catch {\n throw new Error(`MiniMax TTS submit returned non-JSON: ${raw.slice(0, 240)}`);\n }\n const code = data.base_resp?.status_code;\n if (code !== undefined && code !== 0) {\n throw new Error(\n `MiniMax TTS submit error: ${code} ${data.base_resp?.status_msg ?? ''}`.trim(),\n );\n }\n const taskId = data.task_id?.trim();\n if (!taskId) {\n throw new Error('MiniMax TTS submit returned no task_id');\n }\n return taskId;\n}\n\nasync function pollTask(params: {\n baseUrl: string;\n apiKey: string;\n taskId: string;\n timeoutMs: number;\n signal?: AbortSignal;\n}): Promise<string> {\n for (let attempt = 0; attempt < MAX_POLL_ATTEMPTS; attempt++) {\n if (params.signal?.aborted) {\n throw abortError();\n }\n const url = `${params.baseUrl}/query/t2a_async_query_v2?task_id=${encodeURIComponent(params.taskId)}`;\n const response = await fetchWithTimeoutGuarded(url, {\n timeoutMs: params.timeoutMs,\n label: 'MiniMax TTS query',\n signal: params.signal,\n init: {\n method: 'GET',\n headers: { Authorization: `Bearer ${params.apiKey}` },\n },\n });\n const raw = await response.text();\n if (!response.ok) {\n throw new ProviderHttpError({\n label: 'MiniMax TTS query',\n status: response.status,\n detail: raw.slice(0, 220) || response.statusText,\n });\n }\n let data: QueryResponse;\n try {\n data = JSON.parse(raw) as QueryResponse;\n } catch {\n throw new Error(`MiniMax TTS query returned non-JSON: ${raw.slice(0, 240)}`);\n }\n const code = data.base_resp?.status_code;\n if (code !== undefined && code !== 0) {\n throw new Error(\n `MiniMax TTS query error: ${code} ${data.base_resp?.status_msg ?? ''}`.trim(),\n );\n }\n const status = (data.status || '').trim();\n if (status === 'Success') {\n const fileId = data.file_id?.trim();\n if (!fileId) {\n throw new Error('MiniMax TTS completed but file_id is missing');\n }\n return fileId;\n }\n if (status === 'Failed' || status === 'Fail') {\n throw new Error('MiniMax TTS task failed');\n }\n await sleep(POLL_INTERVAL_MS, params.signal);\n }\n throw new Error(`MiniMax TTS timed out after ${MAX_POLL_ATTEMPTS} polls`);\n}\n\nasync function downloadAudio(params: {\n baseUrl: string;\n apiKey: string;\n fileId: string;\n timeoutMs: number;\n signal?: AbortSignal;\n}): Promise<Buffer> {\n const url = `${params.baseUrl}/files/retrieve_content?file_id=${encodeURIComponent(params.fileId)}`;\n const response = await fetchWithTimeoutGuarded(url, {\n timeoutMs: params.timeoutMs,\n label: 'MiniMax TTS download',\n signal: params.signal,\n init: {\n method: 'GET',\n headers: { Authorization: `Bearer ${params.apiKey}` },\n },\n });\n if (!response.ok) {\n const detail = await response.text().catch(() => '');\n throw new ProviderHttpError({\n label: 'MiniMax TTS download',\n status: response.status,\n detail: detail.slice(0, 220) || response.statusText,\n });\n }\n return Buffer.from(await response.arrayBuffer());\n}\n\nfunction parseDirectiveTokenInternal(\n ctx: SpeechDirectiveTokenParseContext,\n): SpeechDirectiveTokenParseResult {\n switch (ctx.key) {\n case 'voice':\n case 'voice_id':\n case 'voiceid':\n case 'minimax_voice':\n case 'minimaxvoice':\n if (!ctx.policy.allowVoice) return { handled: true };\n return { handled: true, overrides: { voice: ctx.value } };\n case 'model':\n case 'model_id':\n case 'modelid':\n case 'minimax_model':\n case 'minimaxmodel':\n if (!ctx.policy.allowModelId) return { handled: true };\n return { handled: true, overrides: { model: ctx.value } };\n default:\n return { handled: false };\n }\n}\n\nexport const minimaxSpeechProvider: SpeechProviderPlugin = {\n id: 'minimax',\n autoSelectOrder: 40,\n\n resolveConfig: (ctx: SpeechProviderResolveConfigContext) => normalizeConfig(ctx.rawConfig),\n\n isConfigured: (ctx: SpeechProviderConfiguredContext) =>\n Boolean(resolveApiKey(readProviderConfig(ctx.providerConfig))),\n\n parseDirectiveToken: parseDirectiveTokenInternal,\n\n listVoices: async () => MINIMAX_TTS_VOICES.map((id) => ({ id, name: id })),\n\n synthesize: async (req: SpeechSynthesisRequest): Promise<SpeechSynthesisResult> => {\n const config = readProviderConfig(req.providerConfig);\n const apiKey = resolveApiKey(config);\n if (!apiKey) {\n throw new Error(\n `MiniMax TTS API key missing (set ${ENV_KEY} or messages.tts.providers.minimax.apiKey)`,\n );\n }\n const overrides = req.providerOverrides ?? {};\n const model = trimToUndefined(overrides.model ?? overrides.modelId) ?? config.model;\n const voice = trimToUndefined(overrides.voice ?? overrides.voiceId) ?? config.voice;\n const callTimeoutMs = Math.max(req.timeoutMs, DEFAULT_TIMEOUT_MS);\n\n log.debug({ model, voice, textLength: req.text.length }, 'MiniMax TTS submit');\n // SpeechSynthesisRequest carries no AbortSignal — orchestrator controls\n // timeouts via timeoutMs. If user cancellation is required later, expose\n // it through fetchWithTimeoutGuarded's `signal` option.\n const taskId = await submitTask({\n baseUrl: config.baseUrl,\n apiKey,\n model,\n voiceId: voice,\n text: req.text,\n timeoutMs: callTimeoutMs,\n });\n const fileId = await pollTask({\n baseUrl: config.baseUrl,\n apiKey,\n taskId,\n timeoutMs: callTimeoutMs,\n });\n const audioBuffer = await downloadAudio({\n baseUrl: config.baseUrl,\n apiKey,\n fileId,\n timeoutMs: callTimeoutMs,\n });\n log.debug({ size: audioBuffer.length, taskId }, 'MiniMax TTS completed');\n return {\n audioBuffer,\n outputFormat: 'mp3',\n fileExtension: 'mp3',\n voiceCompatible: false, // mp3 → ffmpeg compresses to opus downstream\n };\n },\n\n // synthesizeStream intentionally omitted — see file-level DECISION.\n};\n\nregisterSpeechProvider(minimaxSpeechProvider);\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-speech.js","names":[],"sources":["../../../../../src/voice/tts/providers/openai-speech.ts"],"sourcesContent":["/**\n * OpenAI TTS provider — built via createOpenAiCompatibleSpeechProvider factory.\n *\n * Env: OPENAI_API_KEY, OPENAI_TTS_BASE_URL (optional override).\n *\n * `OPENAI_TTS_MODELS` / `OPENAI_TTS_VOICES` are exported because the gateway\n * console imports them for UI dropdowns. The factory's `models` / `voices`\n * arrays are used only for `listVoices` discovery; runtime calls accept any\n * string so custom OpenAI-compatible endpoints work without enumeration.\n *\n * Resolution priority for base URL: providerConfig > OPENAI_TTS_BASE_URL env >\n * https://api.openai.com/v1 (env is read at module load time below).\n */\n\nimport { createOpenAiCompatibleSpeechProvider } from '../openai-compatible-speech.js';\nimport { registerSpeechProvider } from '../speech-registry.js';\n\nexport const OPENAI_TTS_MODELS = [\n 'gpt-4o-mini-tts',\n 'tts-1',\n 'tts-1-hd',\n] as const;\n\nexport const OPENAI_TTS_VOICES = [\n 'alloy',\n 'ash',\n 'ballad',\n 'cedar',\n 'coral',\n 'echo',\n 'fable',\n 'juniper',\n 'marin',\n 'onyx',\n 'nova',\n 'sage',\n 'shimmer',\n 'verse',\n] as const;\n\nconst DEFAULT_BASE_URL =\n process.env.OPENAI_TTS_BASE_URL?.trim().replace(/\\/+$/, '') ?? 'https://api.openai.com/v1';\n\nexport const openAiSpeechProvider = createOpenAiCompatibleSpeechProvider({\n id: 'openai',\n label: 'OpenAI',\n autoSelectOrder: 10,\n models: OPENAI_TTS_MODELS,\n voices: OPENAI_TTS_VOICES,\n defaultModel: 'tts-1',\n defaultVoice: 'alloy',\n defaultBaseUrl: DEFAULT_BASE_URL,\n envKey: 'OPENAI_API_KEY',\n responseFormats: ['opus', 'mp3', 'aac', 'flac', 'wav', 'pcm'],\n defaultResponseFormat: 'opus',\n voiceCompatibleResponseFormats: ['opus'],\n apiErrorLabel: 'OpenAI TTS error',\n missingApiKeyError: 'OpenAI TTS API key missing (set OPENAI_API_KEY or providers.openai.apiKey)',\n});\n\n// Self-register at module load so the registry is populated when this file is\n// imported via providers/index.ts (side-effect aggregator).\nregisterSpeechProvider(openAiSpeechProvider);\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,MAAa,oBAAoB;CAC/B;CACA;CACA;CACD;AAED,MAAa,oBAAoB;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAKD,MAAa,uBAAuB,qCAAqC;CACvE,IAAI;CACJ,OAAO;CACP,iBAAiB;CACjB,QAAQ;CACR,QAAQ;CACR,cAAc;CACd,cAAc;CACd,gBAVA,QAAQ,IAAI,qBAAqB,MAAM,CAAC,QAAQ,QAAQ,GAAG,IAAI;CAW/D,QAAQ;CACR,iBAAiB;EAAC;EAAQ;EAAO;EAAO;EAAQ;EAAO;EAAM;CAC7D,uBAAuB;CACvB,gCAAgC,CAAC,OAAO;CACxC,eAAe;CACf,oBAAoB;CACrB,CAAC;AAIF,uBAAuB,qBAAqB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"sentence-boundary.js","names":[],"sources":["../../../../src/voice/tts/sentence-boundary.ts"],"sourcesContent":["/**\n * Truncate text at a sentence or word boundary (TTS-friendly).\n */\nexport function truncateAtSentenceBoundary(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n\n const truncated = text.slice(0, maxLength);\n const sentenceEndRegex = /[.!?。!?]\\s*/g;\n let lastSentenceEnd = -1;\n let match: RegExpExecArray | null;\n\n while ((match = sentenceEndRegex.exec(truncated)) !== null) {\n lastSentenceEnd = match.index + match[0].length;\n }\n\n if (lastSentenceEnd > maxLength * 0.6) {\n return truncated.slice(0, lastSentenceEnd).trim();\n }\n\n const lastSpace = truncated.lastIndexOf(' ');\n if (lastSpace > maxLength * 0.8) {\n return `${truncated.slice(0, lastSpace).trim()}...`;\n }\n\n return `${truncated.trim()}...`;\n}\n"],"mappings":";;;;AAGA,SAAgB,2BAA2B,MAAc,WAA2B;AAClF,KAAI,KAAK,UAAU,UAAW,QAAO;CAErC,MAAM,YAAY,KAAK,MAAM,GAAG,UAAU;CAC1C,MAAM,mBAAmB;CACzB,IAAI,kBAAkB;CACtB,IAAI;AAEJ,SAAQ,QAAQ,iBAAiB,KAAK,UAAU,MAAM,KACpD,mBAAkB,MAAM,QAAQ,MAAM,GAAG;AAG3C,KAAI,kBAAkB,YAAY,GAChC,QAAO,UAAU,MAAM,GAAG,gBAAgB,CAAC,MAAM;CAGnD,MAAM,YAAY,UAAU,YAAY,IAAI;AAC5C,KAAI,YAAY,YAAY,GAC1B,QAAO,GAAG,UAAU,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;AAGjD,QAAO,GAAG,UAAU,MAAM,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"service.js","names":[],"sources":["../../../../src/voice/tts/service.ts"],"sourcesContent":["import type { TTSConfig, TTSAutoMode, TTSResultWithTracking } from './types.js';\n\nexport interface ChannelAudioFormat {\n format: string;\n voiceCompatible: boolean;\n}\n\n/** Per-channel encoding for outbound TTS. Only ids that xopc actually delivers on are listed; anything else uses `default`. */\nconst CHANNEL_OUTPUT_FORMATS: Record<string, ChannelAudioFormat> = {\n telegram: { format: 'opus', voiceCompatible: true },\n /** Weixin ilink: VoiceItem encode_type 7 = MP3 per API types. */\n weixin: { format: 'mp3', voiceCompatible: true },\n webchat: { format: 'mp3', voiceCompatible: false },\n cli: { format: 'mp3', voiceCompatible: false },\n default: { format: 'mp3', voiceCompatible: false },\n};\n\nexport function getChannelOutputFormat(channel?: string): ChannelAudioFormat {\n if (!channel) return CHANNEL_OUTPUT_FORMATS.default;\n return CHANNEL_OUTPUT_FORMATS[channel.toLowerCase()] || CHANNEL_OUTPUT_FORMATS.default;\n}\n\nexport function getSupportedChannels(): string[] {\n return Object.keys(CHANNEL_OUTPUT_FORMATS).filter((k) => k !== 'default');\n}\n\nexport function isVoiceCompatibleChannel(channel: string): boolean {\n return getChannelOutputFormat(channel).voiceCompatible;\n}\n\nexport interface TTSContext {\n channel?: string;\n chatId?: string;\n}\n\nexport interface TTSDecision {\n useTTS: boolean;\n reason: string;\n}\n\nexport function shouldUseTTS(config: TTSConfig | undefined, inboundAudio?: boolean): TTSDecision {\n if (!config?.enabled) {\n return { useTTS: false, reason: 'TTS disabled' };\n }\n\n const trigger = (config.trigger ?? 'off') as string;\n\n switch (trigger) {\n case 'off':\n return { useTTS: false, reason: 'trigger=off' };\n case 'always':\n return { useTTS: true, reason: 'trigger=always' };\n case 'inbound':\n return inboundAudio === true\n ? { useTTS: true, reason: 'trigger=inbound + inboundAudio=true' }\n : { useTTS: false, reason: 'trigger=inbound but no inbound audio' };\n case 'tagged':\n return { useTTS: false, reason: 'trigger=tagged (directive check in TTS module)' };\n default:\n return { useTTS: false, reason: `unknown trigger=${trigger}` };\n }\n}\n\nexport class TTSService {\n constructor(private config: TTSConfig) {}\n\n isEnabled(): boolean {\n return this.config.enabled;\n }\n\n getTriggerMode(): TTSAutoMode {\n return this.config.trigger;\n }\n\n async speak(text: string, context?: TTSContext): Promise<TTSResultWithTracking> {\n // Direct dynamic import of `./speak-core.js` — going through `./index.js`\n // pulls the full barrel, which re-exports this file and forms a cycle.\n const { speak } = await import('./speak-core.js');\n return speak(text, this.config, {\n tts: {\n format: getChannelOutputFormat(context?.channel).format as 'opus' | 'mp3' | 'wav',\n },\n });\n }\n}\n"],"mappings":";;AAQA,MAAM,yBAA6D;CACjE,UAAU;EAAE,QAAQ;EAAQ,iBAAiB;EAAM;;CAEnD,QAAQ;EAAE,QAAQ;EAAO,iBAAiB;EAAM;CAChD,SAAS;EAAE,QAAQ;EAAO,iBAAiB;EAAO;CAClD,KAAK;EAAE,QAAQ;EAAO,iBAAiB;EAAO;CAC9C,SAAS;EAAE,QAAQ;EAAO,iBAAiB;EAAO;CACnD;AAED,SAAgB,uBAAuB,SAAsC;AAC3E,KAAI,CAAC,QAAS,QAAO,uBAAuB;AAC5C,QAAO,uBAAuB,QAAQ,aAAa,KAAK,uBAAuB;;AAGjF,SAAgB,uBAAiC;AAC/C,QAAO,OAAO,KAAK,uBAAuB,CAAC,QAAQ,MAAM,MAAM,UAAU;;AAG3E,SAAgB,yBAAyB,SAA0B;AACjE,QAAO,uBAAuB,QAAQ,CAAC;;AAazC,SAAgB,aAAa,QAA+B,cAAqC;AAC/F,KAAI,CAAC,QAAQ,QACX,QAAO;EAAE,QAAQ;EAAO,QAAQ;EAAgB;CAGlD,MAAM,UAAW,OAAO,WAAW;AAEnC,SAAQ,SAAR;EACE,KAAK,MACH,QAAO;GAAE,QAAQ;GAAO,QAAQ;GAAe;EACjD,KAAK,SACH,QAAO;GAAE,QAAQ;GAAM,QAAQ;GAAkB;EACnD,KAAK,UACH,QAAO,iBAAiB,OACpB;GAAE,QAAQ;GAAM,QAAQ;GAAuC,GAC/D;GAAE,QAAQ;GAAO,QAAQ;GAAwC;EACvE,KAAK,SACH,QAAO;GAAE,QAAQ;GAAO,QAAQ;GAAkD;EACpF,QACE,QAAO;GAAE,QAAQ;GAAO,QAAQ,mBAAmB;GAAW;;;AAIpE,IAAa,aAAb,MAAwB;CACtB,YAAY,QAA2B;AAAnB,OAAA,SAAA;;CAEpB,YAAqB;AACnB,SAAO,KAAK,OAAO;;CAGrB,iBAA8B;AAC5B,SAAO,KAAK,OAAO;;CAGrB,MAAM,MAAM,MAAc,SAAsD;EAG9E,MAAM,EAAE,UAAU,MAAM,OAAO;AAC/B,SAAO,MAAM,MAAM,KAAK,QAAQ,EAC9B,KAAK,EACH,QAAQ,uBAAuB,SAAS,QAAQ,CAAC,QAClD,EACF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"speak-core.js","names":[],"sources":["../../../../src/voice/tts/speak-core.ts"],"sourcesContent":["/**\n * speak-core — orchestrates per-call TTS synthesis through the SpeechProviderPlugin chain.\n *\n * Provider invocation goes through `plugin.synthesize` / `plugin.synthesizeStream`.\n * Streaming consumers (Telegram draft etc.) use `speakStream`; providers without\n * `synthesizeStream` automatically fall back to `synthesize` wrapped as a\n * single-chunk ReadableStream (see wrapBufferAsStream).\n *\n * Directive overrides are routed via per-provider buckets (`overrides.openai`,\n * `overrides.minimax`, …). The bucket whose key matches the currently active\n * provider id wins; cross-provider keys are ignored.\n *\n * `cfg: Config` is threaded through `SpeakOptions.appConfig`. The orchestrator\n * does NOT auto-summarize / preprocess for `speakStream` beyond the same path\n * as `speak`; streaming is a transport optimization, not a different semantic.\n */\n\nimport type { Config } from '../../config/schema.js';\nimport { createLogger } from '../../utils/logger.js';\n\nimport { parseTtsDirectives } from './directives.js';\nimport { resolveSpeechProviderChain, resolveSpeechProvider, type ResolvedSpeechProvider } from './factory.js';\nimport { preprocessText, type PreprocessOptions, type PreprocessResult } from './preprocess.js';\nimport type {\n SpeechProviderOverrides,\n SpeechSynthesisRequest,\n SpeechSynthesisResult,\n SpeechSynthesisStreamRequest,\n SpeechSynthesisStreamResult,\n} from './speech-provider-types.js';\nimport { summarizeForTts } from './summarize.js';\nimport type {\n ProviderAttempt,\n ProviderFailureReason,\n TTSConfig,\n TTSModelOverrideConfig,\n TTSOptions,\n TTSProvider,\n TTSResultWithTracking,\n TtsDirectiveOverrides,\n} from './types.js';\n\nconst log = createLogger('TTS');\n\nexport interface SpeakOptions {\n tts?: TTSOptions;\n preprocess?: PreprocessOptions;\n parseDirectives?: boolean;\n modelOverrides?: TTSModelOverrideConfig;\n appConfig?: Config;\n /** Optional caller-supplied AbortSignal (currently passed through to providers via timeoutMs guard only). */\n signal?: AbortSignal;\n}\n\n/** Pulls the override bucket for a given provider id from the directive overrides. */\nfunction pickProviderOverrides(\n overrides: TtsDirectiveOverrides | undefined,\n providerId: TTSProvider,\n): SpeechProviderOverrides | undefined {\n if (!overrides) return undefined;\n const bucket = (overrides as Record<string, unknown>)[providerId];\n if (bucket && typeof bucket === 'object') {\n return bucket as SpeechProviderOverrides;\n }\n return undefined;\n}\n\n/** Merges TTSOptions (caller-supplied) with directive bucket. Directive wins on overlap. */\nfunction mergeOverrides(\n ttsOptions: TTSOptions | undefined,\n directiveBucket: SpeechProviderOverrides | undefined,\n): SpeechProviderOverrides | undefined {\n const merged: Record<string, unknown> = {};\n if (ttsOptions?.voice) merged.voice = ttsOptions.voice;\n if (ttsOptions?.model) merged.model = ttsOptions.model;\n if (ttsOptions?.speed) merged.speed = ttsOptions.speed;\n if (directiveBucket) {\n Object.assign(merged, directiveBucket);\n }\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction classifyError(error: unknown): ProviderFailureReason {\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n if (message.includes('not configured') || message.includes('api key')) {\n return 'not_configured';\n }\n if (message.includes('timeout') || message.includes('timed out') || message.includes('aborted')) {\n return 'timeout';\n }\n if (message.includes('too long') || message.includes('text length') || message.includes('exceeds')) {\n return 'text_too_long';\n }\n return 'provider_error';\n }\n return 'unknown';\n}\n\n/** Common pre-flight: directive parse → preprocess → optional summarize. */\nasync function prepareTextForSynthesis(\n text: string,\n config: TTSConfig,\n options: SpeakOptions | undefined,\n): Promise<{\n text: string;\n wasPreprocessed: boolean;\n wasSummarized: boolean;\n ttsOptions: TTSOptions | undefined;\n directiveOverrides: TtsDirectiveOverrides | undefined;\n selectedProvider: TTSProvider;\n}> {\n let ttsText = text;\n let ttsOptions = options?.tts;\n let directiveOverrides: TtsDirectiveOverrides | undefined;\n let selectedProvider: TTSProvider = config.provider;\n\n if (options?.parseDirectives !== false && config.modelOverrides?.enabled) {\n const directiveResult = parseTtsDirectives(text, config.modelOverrides);\n ttsText = directiveResult.ttsText || directiveResult.cleanedText;\n directiveOverrides = directiveResult.overrides;\n if (directiveResult.overrides?.provider) {\n selectedProvider = directiveResult.overrides.provider;\n }\n }\n\n const maxLength = config.maxTextLength || 4096;\n const preprocessOptions: PreprocessOptions = {\n maxLength,\n stripMarkdown: true,\n normalizeWhitespace: true,\n ...options?.preprocess,\n };\n\n let preprocessResult: PreprocessResult = preprocessText(ttsText, preprocessOptions);\n const wasPreprocessed =\n preprocessResult.wasTruncated || preprocessResult.originalLength !== preprocessResult.finalLength;\n\n let wasSummarized = false;\n const sumCfg = config.summarization;\n const threshold = sumCfg?.threshold ?? maxLength;\n if (sumCfg?.enabled !== false && preprocessResult.text.length > threshold) {\n const summarizeResult = await summarizeForTts({\n text: preprocessResult.text,\n targetLength: sumCfg?.targetLength ?? maxLength,\n config: options?.appConfig,\n modelRef: sumCfg?.model,\n });\n if (summarizeResult.wasSummarized) {\n preprocessResult = {\n ...preprocessResult,\n text: summarizeResult.summary,\n finalLength: summarizeResult.summaryLength,\n wasTruncated: false,\n };\n wasSummarized = true;\n log.info(\n {\n originalLength: summarizeResult.originalLength,\n summaryLength: summarizeResult.summaryLength,\n },\n 'Text summarized before TTS',\n );\n }\n }\n\n return {\n text: preprocessResult.text,\n wasPreprocessed,\n wasSummarized,\n ttsOptions,\n directiveOverrides,\n selectedProvider,\n };\n}\n\n/** Build the SpeechSynthesisRequest from a resolved provider + prepared text. */\nfunction buildSynthesisRequest(\n resolved: ResolvedSpeechProvider,\n preparedText: string,\n ttsOptions: TTSOptions | undefined,\n directiveOverrides: TtsDirectiveOverrides | undefined,\n appConfig: Config | undefined,\n target: 'audio-file' | 'voice-note',\n): SpeechSynthesisRequest {\n const directiveBucket = pickProviderOverrides(directiveOverrides, resolved.providerId);\n const providerOverrides = mergeOverrides(ttsOptions, directiveBucket);\n const callTimeoutMs = ttsOptions?.timeoutMs ?? resolved.timeoutMs;\n return {\n text: preparedText,\n cfg: appConfig as Config,\n providerConfig: resolved.providerConfig,\n target,\n timeoutMs: callTimeoutMs,\n ...(providerOverrides ? { providerOverrides } : {}),\n };\n}\n\n/** Convert SpeechSynthesisResult → TTSResult shape (audio/format/provider). */\nfunction toTtsResult(\n resolved: ResolvedSpeechProvider,\n result: SpeechSynthesisResult,\n durationSeconds: number | undefined,\n): { audio: Buffer; format: string; provider: string; duration?: number } {\n return {\n audio: result.audioBuffer,\n format: result.outputFormat,\n provider: resolved.providerId,\n ...(durationSeconds !== undefined ? { duration: durationSeconds } : {}),\n };\n}\n\n// ---- Public API ---------------------------------------------------------\n\n/**\n * Run the TTS chain (primary → fallback) and return the first successful result.\n */\nexport async function speak(\n text: string,\n config: TTSConfig,\n options?: SpeakOptions,\n): Promise<TTSResultWithTracking> {\n if (!config.enabled) {\n throw new Error('TTS is not enabled');\n }\n if (config.trigger === 'tagged' && !/\\[\\[tts/.test(text)) {\n throw new Error('TTS trigger is tagged but no [[tts]] directive found');\n }\n\n const prepared = await prepareTextForSynthesis(text, config, options);\n const chain = resolveSpeechProviderChain(config);\n\n // Reorder so the directive-selected provider (if registered + configured) goes first.\n const orderedChain = (() => {\n const idx = chain.findIndex((c) => c.providerId === prepared.selectedProvider);\n if (idx <= 0) return chain;\n const reordered = [...chain];\n const [picked] = reordered.splice(idx, 1);\n if (picked) {\n reordered.unshift(picked);\n }\n return reordered;\n })();\n\n const attempts: ProviderAttempt[] = [];\n const attemptedProviders: string[] = [];\n let lastError: Error | undefined;\n\n for (const resolved of orderedChain) {\n const startTime = Date.now();\n attemptedProviders.push(resolved.providerId);\n\n if (typeof resolved.plugin.synthesize !== 'function') {\n attempts.push({\n provider: resolved.providerId,\n outcome: 'skipped',\n reasonCode: 'not_configured',\n latencyMs: Date.now() - startTime,\n error: `Provider \"${resolved.providerId}\" does not implement synthesize()`,\n });\n continue;\n }\n\n try {\n log.debug(\n { textLength: prepared.text.length, provider: resolved.providerId },\n 'Converting text to speech',\n );\n const request = buildSynthesisRequest(\n resolved,\n prepared.text,\n prepared.ttsOptions,\n prepared.directiveOverrides,\n options?.appConfig,\n 'audio-file',\n );\n const result = await resolved.plugin.synthesize(request);\n const durationSeconds = (Date.now() - startTime) / 1000;\n attempts.push({\n provider: resolved.providerId,\n outcome: 'success',\n reasonCode: 'success',\n latencyMs: Date.now() - startTime,\n });\n\n const primaryProvider = orderedChain[0]!.providerId;\n const fallbackFrom = resolved.providerId !== primaryProvider ? primaryProvider : undefined;\n if (fallbackFrom) {\n log.info(\n { primaryProvider: fallbackFrom, actualProvider: resolved.providerId, attempts },\n 'TTS used fallback provider',\n );\n } else {\n log.info(\n { provider: resolved.providerId, format: result.outputFormat, size: result.audioBuffer.length },\n 'TTS succeeded',\n );\n }\n\n return {\n ...toTtsResult(resolved, result, durationSeconds),\n attempts,\n ...(fallbackFrom ? { fallbackFrom } : {}),\n attemptedProviders,\n wasPreprocessed: prepared.wasPreprocessed,\n ttsText: prepared.text,\n wasSummarized: prepared.wasSummarized,\n };\n } catch (error) {\n const latencyMs = Date.now() - startTime;\n const reasonCode = classifyError(error);\n const errorMsg = error instanceof Error ? error.message : String(error);\n attempts.push({\n provider: resolved.providerId,\n outcome: 'failed',\n reasonCode,\n latencyMs,\n error: errorMsg,\n });\n lastError = error instanceof Error ? error : new Error(String(error));\n log.warn(\n { provider: resolved.providerId, errorMessage: errorMsg, reasonCode, latencyMs },\n 'TTS provider failed, trying next',\n );\n }\n }\n\n log.error({ attempts, attemptedProviders }, 'All TTS providers failed');\n throw (\n lastError ?? new Error(`All TTS providers failed: ${attempts.map((a) => a.error).join('; ')}`)\n );\n}\n\n/** Single-provider variant; bypasses the fallback chain. */\nexport async function speakWithProvider(\n text: string,\n config: TTSConfig,\n providerName: TTSProvider,\n options?: SpeakOptions,\n): Promise<TTSResultWithTracking> {\n if (!config.enabled) {\n throw new Error('TTS is not enabled');\n }\n const resolved = resolveSpeechProvider(providerName, config);\n if (!resolved) {\n throw new Error(`Provider '${providerName}' is not available`);\n }\n if (typeof resolved.plugin.synthesize !== 'function') {\n throw new Error(`Provider '${providerName}' does not implement synthesize()`);\n }\n\n const prepared = await prepareTextForSynthesis(text, config, options);\n const startTime = Date.now();\n const request = buildSynthesisRequest(\n resolved,\n prepared.text,\n prepared.ttsOptions,\n prepared.directiveOverrides,\n options?.appConfig,\n 'audio-file',\n );\n const result = await resolved.plugin.synthesize(request);\n const durationSeconds = (Date.now() - startTime) / 1000;\n\n return {\n ...toTtsResult(resolved, result, durationSeconds),\n attempts: [\n {\n provider: providerName,\n outcome: 'success',\n reasonCode: 'success',\n latencyMs: Date.now() - startTime,\n },\n ],\n attemptedProviders: [providerName],\n wasPreprocessed: prepared.wasPreprocessed,\n ttsText: prepared.text,\n wasSummarized: prepared.wasSummarized,\n };\n}\n\n// ---- Streaming surface --------------------------------------------------\n\nexport interface SpeakStreamResult {\n /** Audio chunks. Caller is responsible for consuming the stream. */\n audioStream: ReadableStream<Uint8Array>;\n outputFormat: string;\n fileExtension: string;\n voiceCompatible: boolean;\n /** Provider id that produced this stream. */\n provider: TTSProvider;\n /** Cleanup hook (close sockets etc.). Always defined; no-op when nothing to release. */\n release: () => Promise<void>;\n /** Pre-flight metadata (after directive parse / preprocess / summarize). */\n ttsText: string;\n wasPreprocessed: boolean;\n wasSummarized: boolean;\n}\n\n/**\n * Streaming TTS — tries the chain and returns the first provider's stream.\n * Providers without `synthesizeStream` are wrapped via wrapBufferAsStream.\n */\nexport async function speakStream(\n text: string,\n config: TTSConfig,\n options?: SpeakOptions,\n): Promise<SpeakStreamResult> {\n if (!config.enabled) {\n throw new Error('TTS is not enabled');\n }\n if (config.trigger === 'tagged' && !/\\[\\[tts/.test(text)) {\n throw new Error('TTS trigger is tagged but no [[tts]] directive found');\n }\n\n const prepared = await prepareTextForSynthesis(text, config, options);\n const chain = resolveSpeechProviderChain(config);\n\n let lastError: Error | undefined;\n for (const resolved of chain) {\n try {\n const baseRequest: SpeechSynthesisStreamRequest = buildSynthesisRequest(\n resolved,\n prepared.text,\n prepared.ttsOptions,\n prepared.directiveOverrides,\n options?.appConfig,\n 'voice-note',\n );\n\n let streamResult: SpeechSynthesisStreamResult;\n if (typeof resolved.plugin.synthesizeStream === 'function') {\n streamResult = await resolved.plugin.synthesizeStream(baseRequest);\n } else if (typeof resolved.plugin.synthesize === 'function') {\n // Fallback: buffer-then-wrap. Documented behavior: callers see a\n // single-chunk stream with the same outputFormat.\n const bufferResult = await resolved.plugin.synthesize(baseRequest);\n streamResult = wrapBufferAsStream(bufferResult);\n } else {\n throw new Error(\n `Provider \"${resolved.providerId}\" implements neither synthesize nor synthesizeStream`,\n );\n }\n\n log.info(\n {\n provider: resolved.providerId,\n outputFormat: streamResult.outputFormat,\n voiceCompatible: streamResult.voiceCompatible,\n streamed: typeof resolved.plugin.synthesizeStream === 'function',\n },\n 'TTS stream ready',\n );\n\n const release = streamResult.release ?? (async () => {});\n return {\n audioStream: streamResult.audioStream,\n outputFormat: streamResult.outputFormat,\n fileExtension: streamResult.fileExtension,\n voiceCompatible: streamResult.voiceCompatible,\n provider: resolved.providerId,\n release,\n ttsText: prepared.text,\n wasPreprocessed: prepared.wasPreprocessed,\n wasSummarized: prepared.wasSummarized,\n };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n log.warn(\n { err: lastError, provider: resolved.providerId },\n `TTS stream provider \"${resolved.providerId}\" failed, trying next`,\n );\n }\n }\n throw lastError ?? new Error('All TTS providers failed (streaming)');\n}\n\n/** Wrap a one-shot synthesis result into a single-chunk stream (no-op release). */\nfunction wrapBufferAsStream(result: SpeechSynthesisResult): SpeechSynthesisStreamResult {\n const { audioBuffer } = result;\n const audioStream = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(new Uint8Array(audioBuffer));\n controller.close();\n },\n });\n return {\n audioStream,\n outputFormat: result.outputFormat,\n fileExtension: result.fileExtension,\n voiceCompatible: result.voiceCompatible,\n };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"speech-registry.js","names":[],"sources":["../../../../src/voice/tts/speech-registry.ts"],"sourcesContent":["/**\n * SpeechProviderRegistry — central lookup for SpeechProviderPlugin instances.\n *\n * Per docs/voice-rearchitecture.md §11:\n * - Bundled providers (openai/alibaba/edge/minimax/local-cli) self-register at\n * module load time via `registerSpeechProvider()`.\n * - Extension-loaded providers register through `extensions/sdk/speech.ts`\n * re-exports of the same registration call.\n * - Lookup is case-insensitive on `id` and `aliases`.\n * - Re-registering the same id LOGS a warning and OVERWRITES (later registration\n * wins — used by user extensions to override bundled defaults).\n *\n * DECISION: We do NOT separate \"loaded vs configured\" the way openclaw does\n * (their `listLoadedSpeechProviders` vs `listSpeechProviders`). xopc's extension\n * model is much simpler — extensions either load successfully or they don't.\n * If a provider is in the registry, it's loaded; whether it's configured is a\n * runtime question answered by `provider.isConfigured(ctx)`.\n */\n\nimport { createLogger } from '../../utils/logger.js';\n\nimport type { SpeechProviderId, SpeechProviderPlugin } from './speech-provider-types.js';\n\nconst log = createLogger('SpeechRegistry');\n\nconst registry = new Map<string, SpeechProviderPlugin>();\n\nfunction normalizeId(id: string): string {\n return id.trim().toLowerCase();\n}\n\nfunction indexProvider(provider: SpeechProviderPlugin): string[] {\n const keys = [normalizeId(provider.id)];\n for (const alias of provider.aliases ?? []) {\n keys.push(normalizeId(alias));\n }\n return keys;\n}\n\n/**\n * Register a speech provider. Safe to call multiple times during boot — later\n * registrations overwrite earlier ones for the same id (with a warn log).\n *\n * Returns an unregister function for tests / hot-reload scenarios.\n */\nexport function registerSpeechProvider(provider: SpeechProviderPlugin): () => void {\n const keys = indexProvider(provider);\n const conflicts: string[] = [];\n for (const key of keys) {\n if (registry.has(key)) {\n conflicts.push(key);\n }\n }\n if (conflicts.length > 0) {\n log.warn(\n { providerId: provider.id, conflicts },\n `Speech provider \"${provider.id}\" overrides existing registration(s): ${conflicts.join(', ')}`,\n );\n }\n for (const key of keys) {\n registry.set(key, provider);\n }\n return () => {\n for (const key of keys) {\n const current = registry.get(key);\n if (current === provider) {\n registry.delete(key);\n }\n }\n };\n}\n\n/**\n * Look up a provider by id or alias (case-insensitive). Returns undefined when\n * no provider matches — callers must NOT throw here; the orchestrator decides\n * whether the absence is fatal or means \"skip and try next provider\".\n */\nexport function getSpeechProvider(id: SpeechProviderId): SpeechProviderPlugin | undefined {\n return registry.get(normalizeId(id));\n}\n\n/**\n * Resolve the canonical id for a provider lookup key (id or alias).\n * Useful for normalizing config strings before persistence.\n */\nexport function canonicalizeSpeechProviderId(id: SpeechProviderId): SpeechProviderId | undefined {\n return registry.get(normalizeId(id))?.id;\n}\n\n/**\n * List all registered providers. Order is registration order (Map preserves\n * insertion order, and we de-dup by id at registration time).\n */\nexport function listSpeechProviders(): SpeechProviderPlugin[] {\n const seen = new Set<SpeechProviderPlugin>();\n const result: SpeechProviderPlugin[] = [];\n for (const provider of registry.values()) {\n if (!seen.has(provider)) {\n seen.add(provider);\n result.push(provider);\n }\n }\n return result;\n}\n\n/** Test-only: clear the registry. Not exported from the public barrel. */\nexport function _clearSpeechRegistryForTests(): void {\n registry.clear();\n}\n"],"mappings":";;;aAmBqD;AAIrD,MAAM,MAAM,aAAa,iBAAiB;AAE1C,MAAM,2BAAW,IAAI,KAAmC;AAExD,SAAS,YAAY,IAAoB;AACvC,QAAO,GAAG,MAAM,CAAC,aAAa;;AAGhC,SAAS,cAAc,UAA0C;CAC/D,MAAM,OAAO,CAAC,YAAY,SAAS,GAAG,CAAC;AACvC,MAAK,MAAM,SAAS,SAAS,WAAW,EAAE,CACxC,MAAK,KAAK,YAAY,MAAM,CAAC;AAE/B,QAAO;;;;;;;;AAST,SAAgB,uBAAuB,UAA4C;CACjF,MAAM,OAAO,cAAc,SAAS;CACpC,MAAM,YAAsB,EAAE;AAC9B,MAAK,MAAM,OAAO,KAChB,KAAI,SAAS,IAAI,IAAI,CACnB,WAAU,KAAK,IAAI;AAGvB,KAAI,UAAU,SAAS,EACrB,KAAI,KACF;EAAE,YAAY,SAAS;EAAI;EAAW,EACtC,oBAAoB,SAAS,GAAG,wCAAwC,UAAU,KAAK,KAAK,GAC7F;AAEH,MAAK,MAAM,OAAO,KAChB,UAAS,IAAI,KAAK,SAAS;AAE7B,cAAa;AACX,OAAK,MAAM,OAAO,KAEhB,KADgB,SAAS,IAAI,IAClB,KAAK,SACd,UAAS,OAAO,IAAI;;;;;;;;AAW5B,SAAgB,kBAAkB,IAAwD;AACxF,QAAO,SAAS,IAAI,YAAY,GAAG,CAAC;;;;;;AAOtC,SAAgB,6BAA6B,IAAoD;AAC/F,QAAO,SAAS,IAAI,YAAY,GAAG,CAAC,EAAE;;;;;;AAOxC,SAAgB,sBAA8C;CAC5D,MAAM,uBAAO,IAAI,KAA2B;CAC5C,MAAM,SAAiC,EAAE;AACzC,MAAK,MAAM,YAAY,SAAS,QAAQ,CACtC,KAAI,CAAC,KAAK,IAAI,SAAS,EAAE;AACvB,OAAK,IAAI,SAAS;AAClB,SAAO,KAAK,SAAS;;AAGzB,QAAO;;;AAIT,SAAgB,+BAAqC;AACnD,UAAS,OAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"status-tracker.js","names":[],"sources":["../../../../src/voice/tts/status-tracker.ts"],"sourcesContent":["import type { TtsRuntimeStatus, TtsStatusEntry } from './types.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('TTS:StatusTracker');\n\nconst MAX_RECENT_ENTRIES = 20;\n\nclass TtsStatusTrackerImpl {\n private recentEntries: TtsStatusEntry[] = [];\n private totalCalls = 0;\n private totalSuccesses = 0;\n private totalFailures = 0;\n\n recordAttempt(entry: TtsStatusEntry): void {\n this.recentEntries.push(entry);\n this.totalCalls += 1;\n\n if (entry.success) {\n this.totalSuccesses += 1;\n } else {\n this.totalFailures += 1;\n }\n\n if (this.recentEntries.length > MAX_RECENT_ENTRIES) {\n this.recentEntries.shift();\n }\n\n log.debug(\n {\n success: entry.success,\n provider: entry.provider,\n latencyMs: entry.latencyMs,\n totalCalls: this.totalCalls,\n },\n 'TTS attempt recorded',\n );\n }\n\n getStatus(): TtsRuntimeStatus {\n const recentSuccesses = this.recentEntries.filter((e) => e.success).length;\n const recentTotal = this.recentEntries.length;\n\n return {\n lastAttempt:\n this.recentEntries.length > 0\n ? this.recentEntries[this.recentEntries.length - 1]\n : undefined,\n recentSuccessRate: recentTotal > 0 ? recentSuccesses / recentTotal : undefined,\n totalCalls: this.totalCalls,\n totalSuccesses: this.totalSuccesses,\n totalFailures: this.totalFailures,\n };\n }\n\n getRecentEntries(count?: number): TtsStatusEntry[] {\n const limit = count ?? MAX_RECENT_ENTRIES;\n return this.recentEntries.slice(-limit);\n }\n\n reset(): void {\n this.recentEntries = [];\n this.totalCalls = 0;\n this.totalSuccesses = 0;\n this.totalFailures = 0;\n }\n}\n\nexport const ttsStatusTracker = new TtsStatusTrackerImpl();\n\nexport function recordTtsSuccess(params: {\n provider: string;\n latencyMs: number;\n textLength: number;\n audioSize: number;\n audioFormat: string;\n usedFallback?: boolean;\n wasSummarized?: boolean;\n}): void {\n ttsStatusTracker.recordAttempt({\n timestamp: Date.now(),\n success: true,\n ...params,\n });\n}\n\nexport function recordTtsFailure(params: {\n provider?: string;\n latencyMs: number;\n textLength: number;\n error: string;\n}): void {\n ttsStatusTracker.recordAttempt({\n timestamp: Date.now(),\n success: false,\n ...params,\n });\n}\n"],"mappings":";;;aACqD;AAErD,MAAM,MAAM,aAAa,oBAAoB;AAE7C,MAAM,qBAAqB;AAE3B,IAAM,uBAAN,MAA2B;CACzB,gBAA0C,EAAE;CAC5C,aAAqB;CACrB,iBAAyB;CACzB,gBAAwB;CAExB,cAAc,OAA6B;AACzC,OAAK,cAAc,KAAK,MAAM;AAC9B,OAAK,cAAc;AAEnB,MAAI,MAAM,QACR,MAAK,kBAAkB;MAEvB,MAAK,iBAAiB;AAGxB,MAAI,KAAK,cAAc,SAAS,mBAC9B,MAAK,cAAc,OAAO;AAG5B,MAAI,MACF;GACE,SAAS,MAAM;GACf,UAAU,MAAM;GAChB,WAAW,MAAM;GACjB,YAAY,KAAK;GAClB,EACD,uBACD;;CAGH,YAA8B;EAC5B,MAAM,kBAAkB,KAAK,cAAc,QAAQ,MAAM,EAAE,QAAQ,CAAC;EACpE,MAAM,cAAc,KAAK,cAAc;AAEvC,SAAO;GACL,aACE,KAAK,cAAc,SAAS,IACxB,KAAK,cAAc,KAAK,cAAc,SAAS,KAC/C,KAAA;GACN,mBAAmB,cAAc,IAAI,kBAAkB,cAAc,KAAA;GACrE,YAAY,KAAK;GACjB,gBAAgB,KAAK;GACrB,eAAe,KAAK;GACrB;;CAGH,iBAAiB,OAAkC;EACjD,MAAM,QAAQ,SAAS;AACvB,SAAO,KAAK,cAAc,MAAM,CAAC,MAAM;;CAGzC,QAAc;AACZ,OAAK,gBAAgB,EAAE;AACvB,OAAK,aAAa;AAClB,OAAK,iBAAiB;AACtB,OAAK,gBAAgB;;;AAIzB,MAAa,mBAAmB,IAAI,sBAAsB;AAE1D,SAAgB,iBAAiB,QAQxB;AACP,kBAAiB,cAAc;EAC7B,WAAW,KAAK,KAAK;EACrB,SAAS;EACT,GAAG;EACJ,CAAC;;AAGJ,SAAgB,iBAAiB,QAKxB;AACP,kBAAiB,cAAc;EAC7B,WAAW,KAAK,KAAK;EACrB,SAAS;EACT,GAAG;EACJ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"summarize.js","names":[],"sources":["../../../../src/voice/tts/summarize.ts"],"sourcesContent":["import { type UserMessage } from '@earendil-works/pi-ai/compat';\nimport type { Api, Model } from '@earendil-works/pi-ai';\n\nimport type { Config } from '../../config/schema.js';\nimport { getDefaultModelSync, resolveModel } from '../../providers/index.js';\nimport { completeWithResolvedCredentials } from '../../providers/model-call.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { truncateAtSentenceBoundary } from './sentence-boundary.js';\n\nconst log = createLogger('TTS:Summarize');\n\nconst SUMMARIZE_TIMEOUT_MS = 45_000;\n\nconst SUMMARIZE_SYSTEM_PROMPT = `You are a text summarizer for a text-to-speech system.\nYour task is to condense the given text while preserving the key information and meaning.\n\nRules:\n1. Output ONLY the summarized text, no explanations or meta-commentary\n2. Keep the summary in the same language as the input\n3. Preserve key facts, numbers, names, and conclusions\n4. Use natural, spoken language suitable for audio playback\n5. Remove code blocks, URLs, markdown formatting, and technical syntax where possible\n6. Keep the summary under the specified character limit\n7. End with a complete sentence, never mid-sentence`;\n\nexport interface SummarizeForTtsOptions {\n text: string;\n targetLength: number;\n config?: Config;\n modelRef?: string;\n signal?: AbortSignal;\n}\n\nexport interface SummarizeResult {\n summary: string;\n originalLength: number;\n summaryLength: number;\n wasSummarized: boolean;\n}\n\nfunction resolveSummarizeModel(config: Config | undefined, modelRef?: string): Model<Api> {\n const envRef = process.env.XOPC_TTS_SUMMARIZE_MODEL?.trim();\n const ref = modelRef?.trim() || envRef;\n if (ref) {\n try {\n return resolveModel(ref);\n } catch {\n /* fall through */\n }\n }\n for (const candidate of ['openai/gpt-5.6-luna', 'google/gemini-3.5-flash']) {\n try {\n return resolveModel(candidate);\n } catch {\n /* next */\n }\n }\n return resolveModel(getDefaultModelSync(config));\n}\n\nfunction fallbackTruncate(text: string, maxLength: number): SummarizeResult {\n const truncated = truncateAtSentenceBoundary(text, maxLength);\n return {\n summary: truncated,\n originalLength: text.length,\n summaryLength: truncated.length,\n wasSummarized: false,\n };\n}\n\n/**\n * Condense text for TTS using a small LLM pass; falls back to sentence-boundary truncation.\n */\nexport async function summarizeForTts(options: SummarizeForTtsOptions): Promise<SummarizeResult> {\n const { text, targetLength, config, modelRef, signal } = options;\n\n if (text.length <= targetLength) {\n return {\n summary: text,\n originalLength: text.length,\n summaryLength: text.length,\n wasSummarized: false,\n };\n }\n\n const startTime = Date.now();\n\n try {\n const model = resolveSummarizeModel(config, modelRef);\n const userPrompt = [\n `Summarize the following text to fit within ${targetLength} characters.`,\n `The summary will be read aloud by a text-to-speech system, so use natural spoken language.`,\n '',\n '---',\n '',\n text,\n ].join('\\n');\n\n const userMsg: UserMessage = {\n role: 'user',\n content: `${SUMMARIZE_SYSTEM_PROMPT}\\n\\n---\\n\\n${userPrompt}`,\n timestamp: Date.now(),\n };\n\n const timeoutSignal =\n typeof AbortSignal !== 'undefined' && typeof AbortSignal.timeout === 'function'\n ? AbortSignal.timeout(SUMMARIZE_TIMEOUT_MS)\n : undefined;\n const mergedSignal =\n signal && timeoutSignal && typeof AbortSignal.any === 'function'\n ? AbortSignal.any([signal, timeoutSignal])\n : signal ?? timeoutSignal;\n\n const result = await completeWithResolvedCredentials(\n model,\n { messages: [userMsg] },\n {\n maxTokens: Math.min(Math.ceil(targetLength / 2), 4096),\n temperature: 0.3,\n signal: mergedSignal as AbortSignal,\n },\n );\n\n let out = '';\n if (Array.isArray(result.content)) {\n for (const c of result.content) {\n if (c && typeof c === 'object' && (c as { type?: string }).type === 'text') {\n out += String((c as { text?: string }).text || '');\n }\n }\n }\n\n const summary = out.trim();\n if (!summary) {\n log.warn('Empty summary returned, falling back to truncation');\n return fallbackTruncate(text, targetLength);\n }\n\n const finalSummary =\n summary.length > targetLength ? truncateAtSentenceBoundary(summary, targetLength) : summary;\n\n log.info(\n {\n originalLength: text.length,\n summaryLength: finalSummary.length,\n durationMs: Date.now() - startTime,\n },\n 'Text summarized for TTS',\n );\n\n return {\n summary: finalSummary,\n originalLength: text.length,\n summaryLength: finalSummary.length,\n wasSummarized: true,\n };\n } catch (error) {\n const em = error instanceof Error ? error.message : String(error);\n log.warn({ errorMessage: em }, 'Summarization failed, falling back to truncation');\n return fallbackTruncate(text, targetLength);\n }\n}\n"],"mappings":";;;;;;gBAI6E;aAExB;AAGrD,MAAM,MAAM,aAAa,gBAAgB;AAEzC,MAAM,uBAAuB;AAE7B,MAAM,0BAA0B;;;;;;;;;;;AA2BhC,SAAS,sBAAsB,QAA4B,UAA+B;CACxF,MAAM,SAAS,QAAQ,IAAI,0BAA0B,MAAM;CAC3D,MAAM,MAAM,UAAU,MAAM,IAAI;AAChC,KAAI,IACF,KAAI;AACF,SAAO,aAAa,IAAI;SAClB;AAIV,MAAK,MAAM,aAAa,CAAC,uBAAuB,0BAA0B,CACxE,KAAI;AACF,SAAO,aAAa,UAAU;SACxB;AAIV,QAAO,aAAa,oBAAoB,OAAO,CAAC;;AAGlD,SAAS,iBAAiB,MAAc,WAAoC;CAC1E,MAAM,YAAY,2BAA2B,MAAM,UAAU;AAC7D,QAAO;EACL,SAAS;EACT,gBAAgB,KAAK;EACrB,eAAe,UAAU;EACzB,eAAe;EAChB;;;;;AAMH,eAAsB,gBAAgB,SAA2D;CAC/F,MAAM,EAAE,MAAM,cAAc,QAAQ,UAAU,WAAW;AAEzD,KAAI,KAAK,UAAU,aACjB,QAAO;EACL,SAAS;EACT,gBAAgB,KAAK;EACrB,eAAe,KAAK;EACpB,eAAe;EAChB;CAGH,MAAM,YAAY,KAAK,KAAK;AAE5B,KAAI;EACF,MAAM,QAAQ,sBAAsB,QAAQ,SAAS;EAUrD,MAAM,UAAuB;GAC3B,MAAM;GACN,SAAS,GAAG,wBAAwB,aAXnB;IACjB,8CAA8C,aAAa;IAC3D;IACA;IACA;IACA;IACA;IACD,CAAC,KAAK,KAIsD;GAC3D,WAAW,KAAK,KAAK;GACtB;EAED,MAAM,gBACJ,OAAO,gBAAgB,eAAe,OAAO,YAAY,YAAY,aACjE,YAAY,QAAQ,qBAAqB,GACzC,KAAA;EACN,MAAM,eACJ,UAAU,iBAAiB,OAAO,YAAY,QAAQ,aAClD,YAAY,IAAI,CAAC,QAAQ,cAAc,CAAC,GACxC,UAAU;EAEhB,MAAM,SAAS,MAAM,gCACnB,OACA,EAAE,UAAU,CAAC,QAAQ,EAAE,EACvB;GACE,WAAW,KAAK,IAAI,KAAK,KAAK,eAAe,EAAE,EAAE,KAAK;GACtD,aAAa;GACb,QAAQ;GACT,CACF;EAED,IAAI,MAAM;AACV,MAAI,MAAM,QAAQ,OAAO,QAAQ;QAC1B,MAAM,KAAK,OAAO,QACrB,KAAI,KAAK,OAAO,MAAM,YAAa,EAAwB,SAAS,OAClE,QAAO,OAAQ,EAAwB,QAAQ,GAAG;;EAKxD,MAAM,UAAU,IAAI,MAAM;AAC1B,MAAI,CAAC,SAAS;AACZ,OAAI,KAAK,qDAAqD;AAC9D,UAAO,iBAAiB,MAAM,aAAa;;EAG7C,MAAM,eACJ,QAAQ,SAAS,eAAe,2BAA2B,SAAS,aAAa,GAAG;AAEtF,MAAI,KACF;GACE,gBAAgB,KAAK;GACrB,eAAe,aAAa;GAC5B,YAAY,KAAK,KAAK,GAAG;GAC1B,EACD,0BACD;AAED,SAAO;GACL,SAAS;GACT,gBAAgB,KAAK;GACrB,eAAe,aAAa;GAC5B,eAAe;GAChB;UACM,OAAO;EACd,MAAM,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACjE,MAAI,KAAK,EAAE,cAAc,IAAI,EAAE,mDAAmD;AAClF,SAAO,iBAAiB,MAAM,aAAa"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../../src/voice/tts/types.ts"],"sourcesContent":["/**\n * TTS (Text-to-Speech) Types\n */\n\n/** Built-in provider ids shipped in core. Extensions add more at runtime. */\nexport type BuiltinTTSProvider = 'openai' | 'alibaba' | 'edge' | 'minimax' | 'tts-local-cli';\n\n/** Any registered SpeechProviderPlugin id (built-in or extension). */\nexport type TTSProvider = string;\n\nexport type TTSAutoMode = 'off' | 'always' | 'inbound' | 'tagged';\n\nexport interface TTSOptions {\n /** Voice ID */\n voice?: string;\n /** Speed (0.25 - 4.0) */\n speed?: number;\n /** Output format */\n format?: 'opus' | 'mp3' | 'wav';\n /** Model ID (for provider-specific model selection) */\n model?: string;\n /** Request timeout in milliseconds */\n timeoutMs?: number;\n}\n\nexport interface TTSResult {\n /** Audio buffer */\n audio: Buffer;\n /** Format */\n format: string;\n /** Duration in seconds (if available) */\n duration?: number;\n /** Provider that generated the speech */\n provider: string;\n}\n\nexport interface TTSProviderInterface {\n /** Provider name */\n name: string;\n /** Convert text to speech */\n speak(text: string, options?: TTSOptions): Promise<TTSResult>;\n /** Check if provider is configured */\n isConfigured(): boolean;\n}\n\nexport interface TTSModelOverrideConfig {\n /** Enable model-provided overrides for TTS */\n enabled?: boolean;\n /** Allow model-provided TTS text blocks */\n allowText?: boolean;\n /** Allow model-provided provider override (default: false) */\n allowProvider?: boolean;\n /** Allow model-provided voice/voiceId override */\n allowVoice?: boolean;\n /** Allow model-provided modelId override */\n allowModelId?: boolean;\n /** Allow model-provided voice settings override */\n allowVoiceSettings?: boolean;\n /** Allow model-provided normalization or language overrides */\n allowNormalization?: boolean;\n /** Allow model-provided seed override */\n allowSeed?: boolean;\n}\n\nexport interface TTSConfig {\n enabled: boolean;\n provider: TTSProvider;\n /** Trigger mode: auto = reply with voice when user sends voice */\n trigger: TTSAutoMode;\n /** Fallback configuration */\n fallback?: {\n enabled: boolean;\n order: TTSProvider[];\n };\n /** Maximum text length for TTS */\n maxTextLength?: number;\n /** API request timeout (ms) */\n timeoutMs?: number;\n /** Long-text summarization before TTS */\n summarization?: TTSSummarizationConfig;\n /** Allow model to override TTS parameters */\n modelOverrides?: TTSModelOverrideConfig;\n /** Provider settings map (`messages.tts.providers.<id>`). */\n providers?: Record<string, Record<string, unknown>>;\n}\n\nexport interface TTSSummarizationConfig {\n /** When true (default), long text is summarized via LLM before TTS */\n enabled?: boolean;\n targetLength?: number;\n threshold?: number;\n model?: string;\n}\n\nexport const DEFAULT_TTS_CONFIG: TTSConfig = {\n enabled: true,\n provider: 'edge',\n trigger: 'inbound',\n fallback: {\n enabled: true,\n order: ['openai', 'alibaba', 'minimax', 'edge'],\n },\n maxTextLength: 512, // Conservative default to accommodate all providers (Alibaba limit is 512)\n timeoutMs: 60000,\n summarization: {\n enabled: true,\n },\n modelOverrides: {\n enabled: true,\n allowText: true,\n allowProvider: false,\n allowVoice: true,\n allowModelId: true,\n allowVoiceSettings: false,\n allowNormalization: false,\n allowSeed: false,\n },\n providers: {\n alibaba: { model: 'qwen-tts', voice: 'Cherry' },\n openai: { model: 'tts-1', voice: 'alloy' },\n edge: {\n enabled: true,\n voice: 'en-US-MichelleNeural',\n lang: 'en-US',\n outputFormat: 'audio-24khz-48kbitrate-mono-mp3',\n },\n minimax: { model: 'speech-2.8-hd', voice: 'male-qn-qingse' },\n },\n};\n\n/** TTS directive parse result */\nexport interface TtsDirectiveParseResult {\n cleanedText: string;\n ttsText?: string;\n hasDirective: boolean;\n overrides: TtsDirectiveOverrides;\n warnings: string[];\n}\n\n/** TTS directive overrides */\nexport interface TtsDirectiveOverrides {\n ttsText?: string;\n provider?: TTSProvider;\n openai?: {\n voice?: string;\n model?: string;\n };\n alibaba?: {\n voice?: string;\n model?: string;\n };\n edge?: {\n voice?: string;\n };\n minimax?: {\n voice?: string;\n model?: string;\n };\n}\n\n/** Provider attempt result (TTS fallback chain) */\nexport type ProviderAttemptOutcome = 'success' | 'skipped' | 'failed';\n\n/** Provider failure reason classification */\nexport type ProviderFailureReason =\n | 'success'\n | 'not_configured'\n | 'timeout'\n | 'provider_error'\n | 'text_too_long'\n | 'unknown';\n\n/** Single provider attempt in a TTS fallback chain */\nexport interface ProviderAttempt {\n provider: string;\n outcome: ProviderAttemptOutcome;\n reasonCode: ProviderFailureReason;\n latencyMs: number;\n error?: string;\n}\n\n/** TTS result including fallback / preprocessing metadata */\nexport interface TTSResultWithTracking extends TTSResult {\n attempts: ProviderAttempt[];\n fallbackFrom?: string;\n attemptedProviders: string[];\n wasPreprocessed?: boolean;\n ttsText?: string;\n wasSummarized?: boolean;\n}\n\n/** Last TTS call diagnostics (memory-only) */\nexport interface TtsStatusEntry {\n timestamp: number;\n success: boolean;\n provider?: string;\n latencyMs?: number;\n error?: string;\n textLength?: number;\n audioSize?: number;\n audioFormat?: string;\n usedFallback?: boolean;\n wasSummarized?: boolean;\n}\n\nexport interface TtsRuntimeStatus {\n lastAttempt?: TtsStatusEntry;\n recentSuccessRate?: number;\n totalCalls: number;\n totalSuccesses: number;\n totalFailures: number;\n}\n"],"mappings":";AA8FA,MAAa,qBAAgC;CAC3C,SAAS;CACT,UAAU;CACV,SAAS;CACT,UAAU;EACR,SAAS;EACT,OAAO;GAAC;GAAU;GAAW;GAAW;GAAO;EAChD;CACD,eAAe;CACf,WAAW;CACX,eAAe,EACb,SAAS,MACV;CACD,gBAAgB;EACd,SAAS;EACT,WAAW;EACX,eAAe;EACf,YAAY;EACZ,cAAc;EACd,oBAAoB;EACpB,oBAAoB;EACpB,WAAW;EACZ;CACD,WAAW;EACT,SAAS;GAAE,OAAO;GAAY,OAAO;GAAU;EAC/C,QAAQ;GAAE,OAAO;GAAS,OAAO;GAAS;EAC1C,MAAM;GACJ,SAAS;GACT,OAAO;GACP,MAAM;GACN,cAAc;GACf;EACD,SAAS;GAAE,OAAO;GAAiB,OAAO;GAAkB;EAC7D;CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"analyzer.js","names":[],"sources":["../../../src/work-discovery/analyzer.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { UserMessage } from '@earendil-works/pi-ai/compat';\n\nimport type { Config } from '../config/schema.js';\nimport { getAgentDefaultModelRef } from '../config/schema.js';\nimport { completeWithResolvedCredentials } from '../providers/model-call.js';\nimport { resolveModel } from '../providers/index.js';\n\nimport type {\n WorkContextSnapshot,\n WorkDiscoveryResult,\n WorkDiscoverySuggestion,\n} from './types.js';\n\nconst MAX_MODEL_CONTEXT_CHARS = 120_000;\n\nfunction extractText(content: unknown): string {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n return content.map((part) => {\n if (!part || typeof part !== 'object') return '';\n const value = part as { type?: unknown; text?: unknown };\n return value.type === 'text' && typeof value.text === 'string' ? value.text : '';\n }).join('');\n}\n\nfunction parseJson(raw: string): Record<string, unknown> | null {\n const fenced = /```(?:json)?\\s*([\\s\\S]*?)```/i.exec(raw)?.[1];\n const start = raw.indexOf('{');\n const end = raw.lastIndexOf('}');\n const candidate = fenced ?? (start >= 0 && end > start ? raw.slice(start, end + 1) : raw);\n try {\n const value = JSON.parse(candidate) as unknown;\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : null;\n } catch {\n return null;\n }\n}\n\nfunction strings(value: unknown, max: number): string[] {\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string' && item.trim().length > 0)\n .slice(0, max)\n .map((item) => item.trim())\n : [];\n}\n\nfunction validateSuggestion(value: unknown, allowedPaths: Set<string>): WorkDiscoverySuggestion | null {\n if (!value || typeof value !== 'object') return null;\n const item = value as Record<string, unknown>;\n if (typeof item.title !== 'string' || !item.title.trim()) return null;\n if (typeof item.rationale !== 'string' || !item.rationale.trim()) return null;\n if (typeof item.actionPrompt !== 'string' || !item.actionPrompt.trim()) return null;\n const confidence = item.confidence === 'high' || item.confidence === 'medium' || item.confidence === 'low'\n ? item.confidence\n : 'medium';\n const actionType = item.actionType === 'summarize_recent_work'\n || item.actionType === 'inspect_related_tests'\n || item.actionType === 'plan_next_step'\n ? item.actionType\n : 'plan_next_step';\n const risk = item.risk === 'command' || item.risk === 'file_write' ? item.risk : 'analysis';\n const estimatedMinutes = typeof item.estimatedMinutes === 'number' && Number.isFinite(item.estimatedMinutes)\n ? Math.max(1, Math.min(30, Math.round(item.estimatedMinutes)))\n : 3;\n const expectedOutcome = typeof item.expectedOutcome === 'string' && item.expectedOutcome.trim()\n ? item.expectedOutcome.trim().slice(0, 500)\n : item.title.trim().slice(0, 120);\n const evidence = Array.isArray(item.evidence)\n ? item.evidence.flatMap((raw) => {\n if (!raw || typeof raw !== 'object') return [];\n const candidate = raw as Record<string, unknown>;\n if (typeof candidate.observation !== 'string' || !candidate.observation.trim()) return [];\n const path = typeof candidate.path === 'string' && allowedPaths.has(candidate.path)\n ? candidate.path\n : undefined;\n return [{ ...(path ? { path } : {}), observation: candidate.observation.trim().slice(0, 500) }];\n }).slice(0, 4)\n : [];\n if (evidence.length === 0) return null;\n return {\n id: randomUUID(),\n actionType,\n title: item.title.trim().slice(0, 120),\n rationale: item.rationale.trim().slice(0, 600),\n evidence,\n actionPrompt: item.actionPrompt.trim().slice(0, 2_000),\n confidence,\n expectedOutcome,\n estimatedMinutes,\n risk,\n verification: strings(item.verification, 4).map((entry) => entry.slice(0, 300)),\n };\n}\n\nfunction suggestionScore(suggestion: WorkDiscoverySuggestion): number {\n const confidence = suggestion.confidence === 'high' ? 3 : suggestion.confidence === 'medium' ? 2 : 1;\n const safety = suggestion.risk === 'analysis' ? 3 : suggestion.risk === 'command' ? 2 : 1;\n return confidence * 4 + safety * 2 - Math.min(suggestion.estimatedMinutes, 10) / 10;\n}\n\nfunction snapshotForModel(snapshot: WorkContextSnapshot): WorkContextSnapshot {\n let remaining = MAX_MODEL_CONTEXT_CHARS;\n return {\n ...snapshot,\n structure: {\n ...snapshot.structure,\n sampledPaths: snapshot.structure.sampledPaths.slice(0, 200),\n metadataOnlyFiles: snapshot.structure.metadataOnlyFiles.slice(0, 200),\n },\n documents: snapshot.documents.flatMap((document) => {\n if (remaining <= 0) return [];\n const excerpt = document.excerpt.slice(0, remaining);\n remaining -= excerpt.length;\n return [{ ...document, excerpt, truncated: document.truncated || excerpt.length < document.excerpt.length }];\n }),\n };\n}\n\nfunction lowConfidenceResult(snapshot: WorkContextSnapshot, question?: string): WorkDiscoveryResult {\n return {\n projectSummary: snapshot.root.projectKind === 'coding'\n ? `${snapshot.root.displayName} appears to be a software project.`\n : `${snapshot.root.displayName} is a local work folder.`,\n currentState: snapshot.git?.changedPaths.length\n ? `${snapshot.git.changedPaths.length} changed paths were detected, but there was not enough reliable context to recommend work.`\n : 'There was not enough recent, readable context to determine the current objective.',\n uncertainties: ['The current objective is not explicit in the selected files.'],\n suggestions: [],\n lowConfidence: true,\n contextQuestion: question ?? 'What are you trying to move forward in this folder?',\n };\n}\n\nexport async function analyzeWorkContext(input: {\n config: Config;\n snapshot: WorkContextSnapshot;\n signal?: AbortSignal;\n}): Promise<{ modelRef: string; result: WorkDiscoveryResult }> {\n const modelRef = getAgentDefaultModelRef(input.config);\n if (!modelRef) throw new Error('No default model configured');\n if (input.snapshot.documents.length === 0 && !input.snapshot.git?.changedPaths.length) {\n return { modelRef, result: lowConfidenceResult(input.snapshot) };\n }\n\n const model = resolveModel(modelRef);\n const compactSnapshot = snapshotForModel(input.snapshot);\n const prompt = [\n 'You help a user resume real work in one explicitly selected local folder.',\n 'Analyze only the supplied bounded snapshot. Never claim that you ran commands, tests, or inspected anything absent from it.',\n 'Return only one JSON object with projectSummary, currentState, uncertainties, suggestions, lowConfidence, and contextQuestion.',\n 'For a normal result, suggestions must contain exactly 3 materially different next steps.',\n 'Each suggestion must include actionType, title, rationale, evidence, actionPrompt, confidence, expectedOutcome, estimatedMinutes, risk, and verification.',\n 'actionType must be summarize_recent_work, inspect_related_tests, or plan_next_step.',\n 'risk must be analysis, command, or file_write. estimatedMinutes is an integer from 1 to 30.',\n 'verification is a short array describing how the user can tell the outcome is real.',\n 'Each evidence item contains an optional exact relative path from the snapshot and one concrete observation.',\n 'actionPrompt asks the assistant to investigate or continue the step; it does not silently authorize file changes.',\n 'If the current objective is unclear or fewer than three credible suggestions exist, set lowConfidence=true, return suggestions=[], and ask one concise contextQuestion.',\n 'Use Simplified Chinese for every user-facing string when the visible snapshot documents are mainly Chinese; otherwise use English.',\n '',\n JSON.stringify(compactSnapshot),\n ].join('\\n');\n const message: UserMessage = { role: 'user', content: prompt, timestamp: Date.now() };\n const response = await completeWithResolvedCredentials(model, { messages: [message] }, {\n maxTokens: 2_500,\n temperature: 0.1,\n signal: input.signal,\n });\n const parsed = parseJson(extractText(response.content));\n if (!parsed) throw new Error('Analysis did not return valid JSON');\n\n const lowConfidence = parsed.lowConfidence === true;\n if (lowConfidence) {\n return {\n modelRef,\n result: lowConfidenceResult(\n input.snapshot,\n typeof parsed.contextQuestion === 'string' ? parsed.contextQuestion.trim().slice(0, 500) : undefined,\n ),\n };\n }\n\n const allowedPaths = new Set([\n ...input.snapshot.structure.sampledPaths,\n ...input.snapshot.documents.map((document) => document.relativePath),\n ...(input.snapshot.git?.changedPaths ?? []),\n ]);\n const suggestions = Array.isArray(parsed.suggestions)\n ? parsed.suggestions.map((value) => validateSuggestion(value, allowedPaths)).filter((value): value is WorkDiscoverySuggestion => Boolean(value))\n : [];\n if (suggestions.length !== 3) return { modelRef, result: lowConfidenceResult(input.snapshot) };\n const primarySuggestion = [...suggestions].sort((a, b) => suggestionScore(b) - suggestionScore(a))[0];\n const projectSummary = typeof parsed.projectSummary === 'string' ? parsed.projectSummary.trim() : '';\n const currentState = typeof parsed.currentState === 'string' ? parsed.currentState.trim() : '';\n if (!projectSummary || !currentState) throw new Error('Analysis result is missing its summary');\n return {\n modelRef,\n result: {\n projectSummary: projectSummary.slice(0, 1_200),\n currentState: currentState.slice(0, 1_200),\n uncertainties: strings(parsed.uncertainties, 6).map((value) => value.slice(0, 500)),\n suggestions,\n ...(primarySuggestion ? { primarySuggestionId: primarySuggestion.id } : {}),\n },\n };\n}\n\nexport function workDiscoveryResultMarkdown(result: WorkDiscoveryResult): string {\n const lines = [`## What I found`, '', result.projectSummary, '', result.currentState];\n if (result.lowConfidence) {\n if (result.contextQuestion) lines.push('', `**${result.contextQuestion}**`);\n return lines.join('\\n');\n }\n lines.push('', '## Suggested next steps');\n for (const [index, suggestion] of result.suggestions.entries()) {\n lines.push('', `### ${index + 1}. ${suggestion.title}`, '', suggestion.rationale, '', `Expected outcome: ${suggestion.expectedOutcome}`, '');\n for (const evidence of suggestion.evidence) {\n lines.push(`- ${evidence.path ? `\\`${evidence.path}\\`: ` : ''}${evidence.observation}`);\n }\n }\n return lines.join('\\n');\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"probe.js","names":["fsConstants"],"sources":["../../../src/work-discovery/probe.ts"],"sourcesContent":["import { execFile } from 'node:child_process';\nimport { constants as fsConstants } from 'node:fs';\nimport { access, lstat, readFile, readdir, realpath, stat } from 'node:fs/promises';\nimport { basename, extname, isAbsolute, relative, resolve, sep } from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { inferProjectKind } from '../projects/index.js';\n\nimport type { WorkContextSnapshot, WorkContextSnapshotSummary } from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport const WORK_DISCOVERY_SCAN_POLICY_VERSION = 1;\n\nconst MAX_DEPTH = 4;\nconst MAX_CANDIDATE_FILES = 2_000;\nconst MAX_CONTENT_FILES = 30;\nconst MAX_FILE_BYTES = 64 * 1024;\nconst MAX_TOTAL_BYTES = 512 * 1024;\n\nconst EXCLUDED_DIRECTORY_NAMES = new Set([\n '.git', '.hg', '.svn', 'node_modules', 'vendor', 'dist', 'build', 'coverage', '.coverage',\n '.cache', '.next', '.nuxt', '.turbo', '.vite', '.pnpm-store', '__pycache__', '.venv', 'venv',\n 'target', 'out', 'Pods', 'DerivedData',\n]);\n\nconst BINARY_EXTENSIONS = new Set([\n '.7z', '.a', '.avi', '.bin', '.class', '.db', '.dmg', '.dll', '.eot', '.exe', '.gz', '.jar',\n '.lockb', '.mov', '.mp3', '.mp4', '.o', '.otf', '.pyc', '.rar', '.so', '.sqlite', '.sqlite3',\n '.tar', '.ttf', '.wav', '.webm', '.woff', '.woff2', '.zip',\n]);\n\nconst METADATA_ONLY_EXTENSIONS = new Map<string, 'document' | 'pdf' | 'image'>([\n ['.doc', 'document'], ['.docx', 'document'], ['.ppt', 'document'], ['.pptx', 'document'],\n ['.xls', 'document'], ['.xlsx', 'document'], ['.pdf', 'pdf'],\n ['.bmp', 'image'], ['.gif', 'image'], ['.ico', 'image'], ['.jpeg', 'image'], ['.jpg', 'image'],\n ['.png', 'image'], ['.webp', 'image'],\n]);\n\nconst SECRET_FILE_PATTERNS = [\n /^\\.env(?:\\.|$)/i,\n /(?:^|[-_.])(credentials?|secrets?|tokens?|api[-_]?keys?|auth)(?:[-_.]|$)/i,\n /\\.(?:pem|key|p12|pfx|crt|cer)$/i,\n /^(?:id_rsa|id_ed25519)(?:\\.pub)?$/i,\n];\n\nconst HIGH_VALUE_NAMES = [\n /^AGENTS\\.md$/i,\n /^CONTEXT\\.md$/i,\n /^README(?:\\..+)?$/i,\n /^TODO(?:\\..+)?$/i,\n /^ROADMAP(?:\\..+)?$/i,\n /^CHANGELOG(?:\\..+)?$/i,\n /^package\\.json$/i,\n /^pyproject\\.toml$/i,\n /^Cargo\\.toml$/i,\n /^go\\.mod$/i,\n];\n\nfunction abortIfNeeded(signal?: AbortSignal): void {\n if (signal?.aborted) throw new DOMException('Work discovery canceled', 'AbortError');\n}\n\nfunction isSecretFile(name: string): boolean {\n return SECRET_FILE_PATTERNS.some((pattern) => pattern.test(name));\n}\n\nfunction isExcludedDirectory(name: string): boolean {\n return EXCLUDED_DIRECTORY_NAMES.has(name) || name.startsWith('.');\n}\n\nfunction isLikelyBinary(path: string): boolean {\n return BINARY_EXTENSIONS.has(extname(path).toLowerCase());\n}\n\nfunction isInsideRoot(root: string, candidate: string): boolean {\n return candidate === root || candidate.startsWith(`${root}${sep}`);\n}\n\nfunction selectionPriority(path: string, modifiedAt: number): number {\n const name = basename(path);\n const highValueIndex = HIGH_VALUE_NAMES.findIndex((pattern) => pattern.test(name));\n if (highValueIndex >= 0) return 10_000 - highValueIndex * 100;\n return Math.floor(modifiedAt / 1_000_000);\n}\n\nasync function gitInfo(root: string, signal?: AbortSignal): Promise<WorkContextSnapshot['git'] | undefined> {\n abortIfNeeded(signal);\n try {\n const [{ stdout: statusOutput }, { stdout: logOutput }] = await Promise.all([\n execFileAsync('git', ['-C', root, 'status', '--short', '--branch', '--untracked-files=no'], {\n timeout: 4_000,\n maxBuffer: 256 * 1024,\n signal,\n }),\n execFileAsync('git', ['-C', root, 'log', '-10', '--format=%ct%x09%s'], {\n timeout: 4_000,\n maxBuffer: 256 * 1024,\n signal,\n }),\n ]);\n const statusLines = statusOutput.split('\\n').filter(Boolean);\n const branch = statusLines[0]?.startsWith('## ')\n ? statusLines[0].slice(3).split('...')[0]?.trim()\n : undefined;\n const changedPaths = statusLines.slice(1, 101).map((line) => line.slice(3).trim()).filter(Boolean);\n const recentCommits = logOutput.split('\\n').filter(Boolean).slice(0, 10).map((line) => {\n const [timestamp, ...subjectParts] = line.split('\\t');\n const committedAt = Number(timestamp) * 1000;\n return {\n subject: subjectParts.join('\\t').slice(0, 240),\n ...(Number.isFinite(committedAt) ? { committedAt } : {}),\n };\n });\n return { ...(branch ? { branch } : {}), changedPaths, recentCommits };\n } catch {\n return undefined;\n }\n}\n\nexport async function canonicalWorkDiscoveryRoot(input: string): Promise<string> {\n const trimmed = input.trim();\n if (!trimmed || !isAbsolute(trimmed)) throw new Error('An absolute folder path is required');\n const canonical = await realpath(trimmed);\n const info = await stat(canonical);\n if (!info.isDirectory()) throw new Error('Selected path is not a directory');\n await access(canonical, fsConstants.R_OK);\n return canonical;\n}\n\nexport async function previewWorkDiscoveryRoot(rootPath: string) {\n const canonicalRootPath = await canonicalWorkDiscoveryRoot(rootPath);\n const inference = inferProjectKind({ workspaceRoot: canonicalRootPath });\n const git = await gitInfo(canonicalRootPath);\n const recentAreas = Array.from(new Set((git?.changedPaths ?? []).map((path) => {\n const normalized = path.replaceAll('\\\\', '/');\n const [first, second] = normalized.split('/');\n return second ? `${first}/${second}` : first;\n }).filter((area): area is string => Boolean(area)))).slice(0, 5);\n return {\n canonicalRootPath,\n displayName: basename(canonicalRootPath),\n projectKind: inference.kind,\n projectKindConfidence: inference.confidence,\n markerReasons: inference.reasons,\n fingerprint: {\n ...(git?.branch ? { branch: git.branch } : {}),\n changedFileCount: git?.changedPaths.length ?? 0,\n recentAreas,\n generatedAt: Date.now(),\n },\n };\n}\n\nexport async function probeWorkDiscoveryRoot(\n rootPath: string,\n signal?: AbortSignal,\n): Promise<WorkContextSnapshot> {\n const root = await canonicalWorkDiscoveryRoot(rootPath);\n const inference = inferProjectKind({ workspaceRoot: root });\n const candidates: Array<{ absolutePath: string; relativePath: string; modifiedAt: number; size: number }> = [];\n const metadataOnlyFiles: WorkContextSnapshot['structure']['metadataOnlyFiles'] = [];\n let omittedPathCount = 0;\n let traversalTruncated = false;\n\n const walk = async (directory: string, depth: number): Promise<void> => {\n abortIfNeeded(signal);\n if (candidates.length >= MAX_CANDIDATE_FILES) {\n traversalTruncated = true;\n return;\n }\n let entries;\n try {\n entries = await readdir(directory, { withFileTypes: true });\n } catch {\n return;\n }\n entries.sort((a, b) => a.name.localeCompare(b.name));\n for (const entry of entries) {\n abortIfNeeded(signal);\n if (candidates.length >= MAX_CANDIDATE_FILES) {\n traversalTruncated = true;\n omittedPathCount += 1;\n continue;\n }\n if (entry.isDirectory()) {\n if (depth >= MAX_DEPTH || isExcludedDirectory(entry.name)) {\n omittedPathCount += 1;\n continue;\n }\n await walk(resolve(directory, entry.name), depth + 1);\n continue;\n }\n if (!entry.isFile() || isSecretFile(entry.name)) {\n omittedPathCount += 1;\n continue;\n }\n const absolutePath = resolve(directory, entry.name);\n try {\n const resolvedPath = await realpath(absolutePath);\n if (!isInsideRoot(root, resolvedPath)) {\n omittedPathCount += 1;\n continue;\n }\n const info = await lstat(resolvedPath);\n if (!info.isFile()) {\n omittedPathCount += 1;\n continue;\n }\n const relativePath = relative(root, resolvedPath);\n const metadataKind = METADATA_ONLY_EXTENSIONS.get(extname(entry.name).toLowerCase());\n if (metadataKind) {\n if (metadataOnlyFiles.length < 200) {\n metadataOnlyFiles.push({ relativePath, modifiedAt: info.mtimeMs, size: info.size, kind: metadataKind });\n } else {\n omittedPathCount += 1;\n }\n continue;\n }\n if (isLikelyBinary(entry.name) || info.size > MAX_FILE_BYTES * 4) {\n omittedPathCount += 1;\n continue;\n }\n candidates.push({\n absolutePath: resolvedPath,\n relativePath,\n modifiedAt: info.mtimeMs,\n size: info.size,\n });\n } catch {\n omittedPathCount += 1;\n }\n }\n };\n\n await walk(root, 0);\n const git = await gitInfo(root, signal);\n const changed = new Set(git?.changedPaths ?? []);\n candidates.sort((a, b) => {\n const aScore = selectionPriority(a.relativePath, a.modifiedAt) + (changed.has(a.relativePath) ? 20_000 : 0);\n const bScore = selectionPriority(b.relativePath, b.modifiedAt) + (changed.has(b.relativePath) ? 20_000 : 0);\n return bScore - aScore || a.relativePath.localeCompare(b.relativePath);\n });\n\n const documents: WorkContextSnapshot['documents'] = [];\n let contentBytes = 0;\n for (const candidate of candidates) {\n abortIfNeeded(signal);\n if (documents.length >= MAX_CONTENT_FILES || contentBytes >= MAX_TOTAL_BYTES) break;\n const remaining = MAX_TOTAL_BYTES - contentBytes;\n const limit = Math.min(MAX_FILE_BYTES, remaining);\n try {\n const buffer = await readFile(candidate.absolutePath);\n const slice = buffer.subarray(0, limit);\n if (slice.includes(0)) continue;\n const excerpt = slice.toString('utf8').trim();\n if (!excerpt) continue;\n const highValue = HIGH_VALUE_NAMES.some((pattern) => pattern.test(basename(candidate.relativePath)));\n documents.push({\n relativePath: candidate.relativePath,\n modifiedAt: candidate.modifiedAt,\n excerpt,\n truncated: buffer.length > slice.length,\n selectionReason: changed.has(candidate.relativePath)\n ? 'git_change'\n : highValue\n ? 'project_context'\n : 'recently_modified',\n });\n contentBytes += slice.length;\n } catch {\n // Continue with the remaining readable files.\n }\n }\n\n return {\n root: {\n displayName: basename(root),\n projectKind: inference.kind,\n markerReasons: inference.reasons,\n },\n structure: {\n sampledPaths: [\n ...candidates.map((candidate) => candidate.relativePath),\n ...metadataOnlyFiles.map((file) => file.relativePath),\n ].slice(0, 200),\n metadataOnlyFiles,\n omittedPathCount,\n },\n ...(git ? { git } : {}),\n documents,\n limits: {\n policyVersion: WORK_DISCOVERY_SCAN_POLICY_VERSION,\n fileCount: candidates.length,\n contentBytes,\n truncated: traversalTruncated || candidates.length > 200 || documents.some((document) => document.truncated),\n },\n };\n}\n\nexport function summarizeWorkContextSnapshot(snapshot: WorkContextSnapshot): WorkContextSnapshotSummary {\n return {\n projectKind: snapshot.root.projectKind,\n sampledPathCount: snapshot.structure.sampledPaths.length,\n omittedPathCount: snapshot.structure.omittedPathCount,\n documentCount: snapshot.documents.length,\n contentBytes: snapshot.limits.contentBytes,\n changedPathCount: snapshot.git?.changedPaths.length ?? 0,\n truncated: snapshot.limits.truncated,\n };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"repository.js","names":[],"sources":["../../../src/work-discovery/repository.ts"],"sourcesContent":["import type { DatabaseSync } from 'node:sqlite';\n\nimport { requireXopcDatabase } from '../storage/sqlite/connection.js';\nimport { runSqliteWriteTransaction } from '../storage/sqlite/transaction.js';\n\nimport type {\n WorkDiscoveryOnboardingState,\n WorkDiscoveryOnboardingStatus,\n WorkDiscoveryFeedback,\n WorkDiscoveryRecognitionDecision,\n WorkDiscoveryRun,\n} from './types.js';\n\ntype OnboardingRow = {\n status: string;\n active_run_id: string | null;\n completed_at: number | null;\n dismissed_at: number | null;\n updated_at: number;\n};\n\ntype RunRow = {\n id: string;\n idempotency_key: string;\n source: string;\n status: string;\n stage: string | null;\n root_path: string;\n project_id: string;\n session_key: string;\n agent_id: string;\n model_ref: string;\n scan_policy_version: number;\n snapshot_summary_json: string | null;\n result_json: string | null;\n error_code: string | null;\n error_message: string | null;\n created_at: number;\n started_at: number | null;\n completed_at: number | null;\n canceled_at: number | null;\n};\n\ntype FeedbackRow = {\n run_id: string;\n recognition_decision: string;\n corrected_intent: string | null;\n created_at: number;\n updated_at: number;\n};\n\nfunction parseJson<T>(value: string | null): T | undefined {\n if (!value) return undefined;\n try {\n return JSON.parse(value) as T;\n } catch {\n return undefined;\n }\n}\n\nfunction onboardingFromRow(row: OnboardingRow): WorkDiscoveryOnboardingState {\n return {\n status: row.status as WorkDiscoveryOnboardingStatus,\n ...(row.active_run_id ? { activeRunId: row.active_run_id } : {}),\n ...(row.completed_at != null ? { completedAt: row.completed_at } : {}),\n ...(row.dismissed_at != null ? { dismissedAt: row.dismissed_at } : {}),\n updatedAt: row.updated_at,\n };\n}\n\nfunction runFromRow(row: RunRow): WorkDiscoveryRun {\n return {\n id: row.id,\n idempotencyKey: row.idempotency_key,\n source: row.source as WorkDiscoveryRun['source'],\n status: row.status as WorkDiscoveryRun['status'],\n ...(row.stage ? { stage: row.stage as WorkDiscoveryRun['stage'] } : {}),\n rootPath: row.root_path,\n projectId: row.project_id,\n sessionKey: row.session_key,\n agentId: row.agent_id,\n modelRef: row.model_ref,\n scanPolicyVersion: row.scan_policy_version,\n ...(parseJson<WorkDiscoveryRun['snapshot']>(row.snapshot_summary_json)\n ? { snapshot: parseJson<WorkDiscoveryRun['snapshot']>(row.snapshot_summary_json) }\n : {}),\n ...(parseJson<WorkDiscoveryRun['result']>(row.result_json)\n ? { result: parseJson<WorkDiscoveryRun['result']>(row.result_json) }\n : {}),\n ...(row.error_code ? { errorCode: row.error_code as WorkDiscoveryRun['errorCode'] } : {}),\n ...(row.error_message ? { errorMessage: row.error_message } : {}),\n createdAt: row.created_at,\n ...(row.started_at != null ? { startedAt: row.started_at } : {}),\n ...(row.completed_at != null ? { completedAt: row.completed_at } : {}),\n ...(row.canceled_at != null ? { canceledAt: row.canceled_at } : {}),\n };\n}\n\nfunction readRun(db: DatabaseSync, clause: string, value: string): WorkDiscoveryRun | null {\n const row = db.prepare(`SELECT * FROM work_discovery_runs WHERE ${clause} = ?`).get(value) as RunRow | undefined;\n if (!row) return null;\n const run = runFromRow(row);\n const feedback = getWorkDiscoveryFeedbackFromDb(db, run.id);\n return feedback ? { ...run, feedback } : run;\n}\n\nfunction feedbackFromRow(row: FeedbackRow): WorkDiscoveryFeedback {\n return {\n runId: row.run_id,\n recognitionDecision: row.recognition_decision as WorkDiscoveryRecognitionDecision,\n ...(row.corrected_intent ? { correctedIntent: row.corrected_intent } : {}),\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nfunction getWorkDiscoveryFeedbackFromDb(db: DatabaseSync, runId: string): WorkDiscoveryFeedback | null {\n const row = db.prepare('SELECT * FROM work_discovery_feedback WHERE run_id = ?').get(runId) as FeedbackRow | undefined;\n return row ? feedbackFromRow(row) : null;\n}\n\nexport function getWorkDiscoveryOnboardingState(): WorkDiscoveryOnboardingState {\n const { db } = requireXopcDatabase();\n const row = db.prepare('SELECT * FROM work_discovery_onboarding WHERE singleton_id = 1').get() as OnboardingRow;\n return onboardingFromRow(row);\n}\n\nexport function setWorkDiscoveryOnboardingState(input: {\n status: WorkDiscoveryOnboardingStatus;\n activeRunId?: string | null;\n nowMs?: number;\n}): WorkDiscoveryOnboardingState {\n const now = input.nowMs ?? Date.now();\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `UPDATE work_discovery_onboarding\n SET status = ?, active_run_id = ?,\n completed_at = CASE WHEN ? = 'completed' THEN ? ELSE completed_at END,\n dismissed_at = CASE WHEN ? = 'dismissed' THEN ? ELSE dismissed_at END,\n updated_at = ?\n WHERE singleton_id = 1`,\n ).run(input.status, input.activeRunId ?? null, input.status, now, input.status, now, now);\n });\n return getWorkDiscoveryOnboardingState();\n}\n\nexport function createWorkDiscoveryRun(run: WorkDiscoveryRun): WorkDiscoveryRun {\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO work_discovery_runs (\n id, idempotency_key, source, status, stage, root_path, project_id, session_key,\n agent_id, model_ref, scan_policy_version, snapshot_summary_json, result_json,\n error_code, error_message, created_at, started_at, completed_at, canceled_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n run.id,\n run.idempotencyKey,\n run.source,\n run.status,\n run.stage ?? null,\n run.rootPath,\n run.projectId,\n run.sessionKey,\n run.agentId,\n run.modelRef,\n run.scanPolicyVersion,\n run.snapshot ? JSON.stringify(run.snapshot) : null,\n run.result ? JSON.stringify(run.result) : null,\n run.errorCode ?? null,\n run.errorMessage ?? null,\n run.createdAt,\n run.startedAt ?? null,\n run.completedAt ?? null,\n run.canceledAt ?? null,\n );\n });\n return getWorkDiscoveryRun(run.id)!;\n}\n\nexport function getWorkDiscoveryRun(id: string): WorkDiscoveryRun | null {\n const { db } = requireXopcDatabase();\n return readRun(db, 'id', id);\n}\n\nexport function getWorkDiscoveryRunByIdempotencyKey(key: string): WorkDiscoveryRun | null {\n const { db } = requireXopcDatabase();\n return readRun(db, 'idempotency_key', key);\n}\n\nexport function setWorkDiscoveryFeedback(input: {\n runId: string;\n recognitionDecision: WorkDiscoveryRecognitionDecision;\n correctedIntent?: string;\n nowMs?: number;\n}): WorkDiscoveryFeedback {\n const now = input.nowMs ?? Date.now();\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO work_discovery_feedback (\n run_id, recognition_decision, corrected_intent, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(run_id) DO UPDATE SET\n recognition_decision = excluded.recognition_decision,\n corrected_intent = excluded.corrected_intent,\n updated_at = excluded.updated_at`,\n ).run(\n input.runId,\n input.recognitionDecision,\n input.correctedIntent ?? null,\n now,\n now,\n );\n });\n const { db } = requireXopcDatabase();\n return getWorkDiscoveryFeedbackFromDb(db, input.runId)!;\n}\n\nexport function updateWorkDiscoveryRun(\n id: string,\n patch: Partial<Pick<\n WorkDiscoveryRun,\n | 'status'\n | 'stage'\n | 'snapshot'\n | 'result'\n | 'errorCode'\n | 'errorMessage'\n | 'startedAt'\n | 'completedAt'\n | 'canceledAt'\n >>,\n): WorkDiscoveryRun | null {\n const existing = getWorkDiscoveryRun(id);\n if (!existing) return null;\n const next = { ...existing, ...patch };\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `UPDATE work_discovery_runs SET\n status = ?, stage = ?, snapshot_summary_json = ?, result_json = ?,\n error_code = ?, error_message = ?, started_at = ?, completed_at = ?, canceled_at = ?\n WHERE id = ?`,\n ).run(\n next.status,\n next.stage ?? null,\n next.snapshot ? JSON.stringify(next.snapshot) : null,\n next.result ? JSON.stringify(next.result) : null,\n next.errorCode ?? null,\n next.errorMessage ?? null,\n next.startedAt ?? null,\n next.completedAt ?? null,\n next.canceledAt ?? null,\n id,\n );\n });\n return getWorkDiscoveryRun(id);\n}\n"],"mappings":"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"}