@xopcai/xopc 0.0.229 → 0.0.231

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 (155) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CsFAJTIN.js → agent-avatar-dicebear-CBqUnlvL.js} +1 -1
  4. package/dist/gateway/static/root/assets/agents-7YO6znTT.js +68 -0
  5. package/dist/gateway/static/root/assets/{app-management-settings-panel-7KcMWuah.js → app-management-settings-panel-DP7YVRPn.js} +1 -1
  6. package/dist/gateway/static/root/assets/{appearance-settings-Cqlw7Fif.js → appearance-settings-CVQ5n7y6.js} +1 -1
  7. package/dist/gateway/static/root/assets/{apps-page-CsnhdGZ2.js → apps-page-DSCia0DT.js} +1 -1
  8. package/dist/gateway/static/root/assets/{attachment-load-q4pDpqkF.js → attachment-load-mmr_mHRr.js} +1 -1
  9. package/dist/gateway/static/root/assets/{automations-page-BuTqjKGX.js → automations-page-DfY-T6Ga.js} +1 -1
  10. package/dist/gateway/static/root/assets/automations-workspace-BpvD54D6.js +6 -0
  11. package/dist/gateway/static/root/assets/{binary-plugins-DUce1Bsc.js → binary-plugins-CO9QMEh2.js} +1 -1
  12. package/dist/gateway/static/root/assets/{block-editor-D8Ejp-QR.js → block-editor-CE14CVOy.js} +3 -3
  13. package/dist/gateway/static/root/assets/browser-settings-page-CeESA4Oj.js +8 -0
  14. package/dist/gateway/static/root/assets/{browser-workflows-page-BDvZbR9v.js → browser-workflows-page-1wgXyoSO.js} +2 -2
  15. package/dist/gateway/static/root/assets/capabilities-settings-panel-B_OXTojB.js +7 -0
  16. package/dist/gateway/static/root/assets/capability-presets-settings-panel-D5nZecxV.js +3 -0
  17. package/dist/gateway/static/root/assets/channels-settings-BzmnWx6X.js +1 -0
  18. package/dist/gateway/static/root/assets/{chat-terminal-dock-h1CKexNz.js → chat-terminal-dock-CdRW6Euc.js} +2 -2
  19. package/dist/gateway/static/root/assets/cloud-C4-yfnnk.js +1 -0
  20. package/dist/gateway/static/root/assets/connectors-page-DX6OkwFQ.js +2 -0
  21. package/dist/gateway/static/root/assets/{cron-expression-DlaQQOId.js → cron-expression-DYSMZsms.js} +1 -1
  22. package/dist/gateway/static/root/assets/{date-picker-8R1sXJKb.js → date-picker-DGCfX4tK.js} +1 -1
  23. package/dist/gateway/static/root/assets/{dependency-picker-CWur0821.js → dependency-picker-DHDa4ht1.js} +1 -1
  24. package/dist/gateway/static/root/assets/{desktop-pet-Knl-zNDU.js → desktop-pet-CMO-J3cG.js} +1 -1
  25. package/dist/gateway/static/root/assets/{desktop-pet-settings-CAQMLVtd.js → desktop-pet-settings-MmOR4A3u.js} +1 -1
  26. package/dist/gateway/static/root/assets/{directory-picker-path-field-Caaz4Rw5.js → directory-picker-path-field-B9qoxDcn.js} +1 -1
  27. package/dist/gateway/static/root/assets/{extension-debug-page-B965Mc15.js → extension-debug-page-DdH0dG2_.js} +1 -1
  28. package/dist/gateway/static/root/assets/{extension-page-C0UnkBi5.js → extension-page-Clg-KktN.js} +1 -1
  29. package/dist/gateway/static/root/assets/{extension-settings-page-BUSIAZCR.js → extension-settings-page-eP3fJ2M6.js} +1 -1
  30. package/dist/gateway/static/root/assets/files-Dp8_uGTO.js +1 -0
  31. package/dist/gateway/static/root/assets/{gateway-config-api-DkH0eEgy.js → gateway-config-api-DEHnF4Wm.js} +1 -1
  32. package/dist/gateway/static/root/assets/{gateway-settings-BBgLDm6I.js → gateway-settings-DKkEXXj9.js} +1 -1
  33. package/dist/gateway/static/root/assets/{heartbeat-settings-BtEHVXWD.js → heartbeat-settings-DlBPNubY.js} +1 -1
  34. package/dist/gateway/static/root/assets/home-page-BnOrLRfs.js +1 -0
  35. package/dist/gateway/static/root/assets/index-0xQO5B_Q.js +70 -0
  36. package/dist/gateway/static/root/assets/index-CCyIdGuQ.css +2 -0
  37. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CsRz8NrS.js → keyboard-shortcuts-settings-BvpEeHnm.js} +1 -1
  38. package/dist/gateway/static/root/assets/local-app-workbench-page-Ch1rdUo8.js +2 -0
  39. package/dist/gateway/static/root/assets/{local-apps-page-CTBNUG4a.js → local-apps-page-Bzvn99eH.js} +1 -1
  40. package/dist/gateway/static/root/assets/logs-page-zxx2ExlY.js +2 -0
  41. package/dist/gateway/static/root/assets/{management-settings-YqUAEwQo.js → management-settings-BQaeyOYm.js} +1 -1
  42. package/dist/gateway/static/root/assets/{markdown-split-dxpSCXb8.js → markdown-split-D9tmIiEm.js} +1 -1
  43. package/dist/gateway/static/root/assets/markdown-view-B1bGSQqt.css +1 -0
  44. package/dist/gateway/static/root/assets/{media-plugins-CJ00i1Lg.js → media-plugins-D8I7OGnT.js} +1 -1
  45. package/dist/gateway/static/root/assets/models-hub-cache-0RjEwafI.js +1 -0
  46. package/dist/gateway/static/root/assets/{notes-api-BFsOGYkd.js → notes-api-EpgG-OQc.js} +1 -1
  47. package/dist/gateway/static/root/assets/{notes-page-DEnbnkIt.js → notes-page-CCvjGMhN.js} +1 -1
  48. package/dist/gateway/static/root/assets/notes-workbench-9cgh77VH.js +4 -0
  49. package/dist/gateway/static/root/assets/oauth-api-BwNLwbI8.js +1 -0
  50. package/dist/gateway/static/root/assets/{product-open-page-BHxo9U95.js → product-open-page-MmMswmOU.js} +1 -1
  51. package/dist/gateway/static/root/assets/project-detail-page-hf6pmH4p.js +1 -0
  52. package/dist/gateway/static/root/assets/projects-page-By2U-Wdh.js +1 -0
  53. package/dist/gateway/static/root/assets/remote-access-hub-CUcpp7CQ.js +1 -0
  54. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-BpQ2GI-0.js → runtime-tools-settings-panel-Dx6o7sLu.js} +1 -1
  55. package/dist/gateway/static/root/assets/{schema-form-HE1G26Lx.js → schema-form-Cdd9c4vt.js} +1 -1
  56. package/dist/gateway/static/root/assets/sessions-page-ByI82xS1.js +1 -0
  57. package/dist/gateway/static/root/assets/settings-advanced-gate-BCoI5IJ8.js +1 -0
  58. package/dist/gateway/static/root/assets/{settings-form-section-CXAn0Xhy.js → settings-form-section-D0YxMnhm.js} +1 -1
  59. package/dist/gateway/static/root/assets/{settings-loading-skeleton-DsFu7Bcv.js → settings-loading-skeleton-y53gEKsF.js} +1 -1
  60. package/dist/gateway/static/root/assets/{settings-page-C4iib9nO.js → settings-page-BoE_tToG.js} +1 -1
  61. package/dist/gateway/static/root/assets/{setup-status-panel-BA83Wr1d.js → setup-status-panel-BQmyb5KC.js} +1 -1
  62. package/dist/gateway/static/root/assets/share-preview-page-DiqBn-oE.js +2 -0
  63. package/dist/gateway/static/root/assets/shares-settings-Bf3VpZ-R.js +1 -0
  64. package/dist/gateway/static/root/assets/skill-reload-api-CXHlbuGS.js +1 -0
  65. package/dist/gateway/static/root/assets/{skills-page-CdaFtNw9.js → skills-page-CZwhWiRl.js} +1 -1
  66. package/dist/gateway/static/root/assets/{skills-page.utils-DYaAddUL.js → skills-page.utils-kBGr8opZ.js} +1 -1
  67. package/dist/gateway/static/root/assets/{system-settings-panel-Co7gilRd.js → system-settings-panel-CPBs6lWi.js} +1 -1
  68. package/dist/gateway/static/root/assets/task-detail-page-Bo0KSZ2v.js +1 -0
  69. package/dist/gateway/static/root/assets/theme-store-Qgvo0Ga7.js +1 -0
  70. package/dist/gateway/static/root/assets/{use-autosave-DnnZtMpA.js → use-autosave-C4YcEiP9.js} +1 -1
  71. package/dist/gateway/static/root/assets/user-context-page-Cnj7gMX2.js +1 -0
  72. package/dist/gateway/static/root/assets/{voice-api-key-field-wetUpi3i.js → voice-api-key-field-BML8zCwZ.js} +1 -1
  73. package/dist/gateway/static/root/assets/{work-discovery-overlay-tbTWASJJ.js → work-discovery-overlay-CKIdPEen.js} +1 -1
  74. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-Dy0fDs8w.js → workflow-run-setup-panel-BK44Vm5W.js} +2 -2
  75. package/dist/gateway/static/root/assets/workflows-page-CB98MTwG.js +5 -0
  76. package/dist/gateway/static/root/index.html +10 -6
  77. package/dist/package.js +1 -1
  78. package/dist/src/agent/inbound/turn-dispatcher.js +1 -1
  79. package/dist/src/agent/service/process-direct-streaming.js +4 -1
  80. package/dist/src/agent/service/webchat-tts.d.ts +2 -0
  81. package/dist/src/agent/service/webchat-tts.js +15 -2
  82. package/dist/src/agent/service.d.ts +1 -0
  83. package/dist/src/agent/service.js +5 -2
  84. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  85. package/dist/src/agent/tools/tts-tool.js +19 -13
  86. package/dist/src/agent/tools/write.js +9 -12
  87. package/dist/src/agent/tools/xopc-use-tool.js +2 -2
  88. package/dist/src/auth/oauth/index.js +2 -2
  89. package/dist/src/auth/oauth/registry.d.ts +1 -1
  90. package/dist/src/auth/oauth/registry.js +5 -1
  91. package/dist/src/auth/oauth/xopc-cloud.d.ts +1 -0
  92. package/dist/src/auth/oauth/xopc-cloud.js +8 -2
  93. package/dist/src/files/file-service.d.ts +36 -0
  94. package/dist/src/files/file-service.js +282 -0
  95. package/dist/src/gateway/chat-stream/mapper.js +11 -0
  96. package/dist/src/gateway/heartbeat/service.js +1 -1
  97. package/dist/src/gateway/hono/app.js +2 -2
  98. package/dist/src/gateway/hono/routes/files.d.ts +3 -0
  99. package/dist/src/gateway/hono/routes/files.js +172 -0
  100. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  101. package/dist/src/gateway/hono/routes/projects.js +0 -508
  102. package/dist/src/gateway/hono/routes/shares.js +410 -21
  103. package/dist/src/gateway/hono/routes/workspace.js +15 -974
  104. package/dist/src/gateway/service.js +9 -9
  105. package/dist/src/heartbeat/index.js +1 -1
  106. package/dist/src/share/hosted-session-share.d.ts +104 -0
  107. package/dist/src/share/hosted-session-share.js +276 -0
  108. package/dist/src/share/note-share-service.js +4 -24
  109. package/dist/src/share/session-share-projector.d.ts +31 -0
  110. package/dist/src/share/session-share-projector.js +79 -0
  111. package/dist/src/share/session-share-service.d.ts +89 -0
  112. package/dist/src/share/session-share-service.js +325 -0
  113. package/dist/src/share/share-asset-ticket.d.ts +7 -0
  114. package/dist/src/share/share-asset-ticket.js +30 -0
  115. package/dist/src/share/share-landing.d.ts +4 -3
  116. package/dist/src/share/share-landing.js +5 -5
  117. package/dist/src/share/share-store.d.ts +27 -2
  118. package/dist/src/share/share-store.js +71 -8
  119. package/dist/src/share/share-types.d.ts +17 -2
  120. package/dist/src/tui/backends/embedded-backend.js +1 -1
  121. package/dist/src/tui/backends/gateway-realtime-backend.js +11 -3
  122. package/package.json +1 -1
  123. package/dist/gateway/static/root/assets/agents-DA4b6_0C.js +0 -68
  124. package/dist/gateway/static/root/assets/automations-workspace-CD0E2ThS.js +0 -6
  125. package/dist/gateway/static/root/assets/browser-settings-page-CY1k3MMd.js +0 -8
  126. package/dist/gateway/static/root/assets/capabilities-settings-panel-D1VfotHQ.js +0 -7
  127. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DXHqRLpU.js +0 -3
  128. package/dist/gateway/static/root/assets/channels-settings-DrFL57M_.js +0 -1
  129. package/dist/gateway/static/root/assets/connectors-page-DUAyfFCF.js +0 -2
  130. package/dist/gateway/static/root/assets/home-page-5SU2TNJj.js +0 -1
  131. package/dist/gateway/static/root/assets/index-BNWhgmjs.js +0 -70
  132. package/dist/gateway/static/root/assets/index-D_hrEKXM.css +0 -2
  133. package/dist/gateway/static/root/assets/local-app-workbench-page-DYPEUgpP.js +0 -2
  134. package/dist/gateway/static/root/assets/logs-page-B0P7rG2B.js +0 -2
  135. package/dist/gateway/static/root/assets/markdown-view-CLzTdVLW.css +0 -1
  136. package/dist/gateway/static/root/assets/notes-workbench-DmVYu_Oc.js +0 -4
  137. package/dist/gateway/static/root/assets/project-detail-page-DV2nGmsq.js +0 -1
  138. package/dist/gateway/static/root/assets/projects-page-BNIFwFfc.js +0 -1
  139. package/dist/gateway/static/root/assets/remote-access-hub-DLXqKiA_.js +0 -1
  140. package/dist/gateway/static/root/assets/sessions-page-DWaXf_25.js +0 -1
  141. package/dist/gateway/static/root/assets/settings-advanced-gate-JFCbnCL2.js +0 -1
  142. package/dist/gateway/static/root/assets/share-preview-page-BOGl3s6M.js +0 -2
  143. package/dist/gateway/static/root/assets/shares-settings-Q2MdGaBi.js +0 -1
  144. package/dist/gateway/static/root/assets/skill-reload-api-cFtfVeFU.js +0 -1
  145. package/dist/gateway/static/root/assets/task-detail-page-5B1pswu8.js +0 -1
  146. package/dist/gateway/static/root/assets/theme-store-DOdCjyuw.js +0 -1
  147. package/dist/gateway/static/root/assets/user-context-page-Dr1FKjXv.js +0 -1
  148. package/dist/gateway/static/root/assets/workflows-page-IVP3GSkI.js +0 -5
  149. package/dist/src/gateway/file-path-classifier.d.ts +0 -30
  150. package/dist/src/gateway/file-path-classifier.js +0 -105
  151. package/dist/src/gateway/file-reference-errors.d.ts +0 -6
  152. package/dist/src/gateway/file-reference-errors.js +0 -21
  153. package/dist/src/gateway/file-reference-registry.d.ts +0 -34
  154. package/dist/src/gateway/file-reference-registry.js +0 -45
  155. /package/dist/gateway/static/root/assets/{markdown-view-DvM5PWEH.js → markdown-view-RxNHwlNo.js} +0 -0
@@ -11,7 +11,7 @@
11
11
  <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png?v=20260713-1" />
12
12
  <link rel="manifest" href="/site.webmanifest?v=20260713-1" />
13
13
  <title>XOPC — Keep what matters moving.</title>
14
- <script type="module" crossorigin src="/assets/index-BNWhgmjs.js"></script>
14
+ <script type="module" crossorigin src="/assets/index-0xQO5B_Q.js"></script>
15
15
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-aKtaBQYM.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-zJ_50EbN.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/vendor-react-BOUWij0V.js">
@@ -31,13 +31,14 @@
31
31
  <link rel="modulepreload" crossorigin href="/assets/schemas-zIBW3wiV.js">
32
32
  <link rel="modulepreload" crossorigin href="/assets/product-delivery-tRr-7IxY.js">
33
33
  <link rel="modulepreload" crossorigin href="/assets/copy-to-clipboard-HOJ79TWv.js">
34
- <link rel="modulepreload" crossorigin href="/assets/markdown-view-DvM5PWEH.js">
34
+ <link rel="modulepreload" crossorigin href="/assets/markdown-view-RxNHwlNo.js">
35
35
  <link rel="modulepreload" crossorigin href="/assets/dist-J_ySZvz0.js">
36
36
  <link rel="modulepreload" crossorigin href="/assets/vendor-swr-BIWyz7Rc.js">
37
37
  <link rel="modulepreload" crossorigin href="/assets/check-DUBLcKHA.js">
38
38
  <link rel="modulepreload" crossorigin href="/assets/settings-shell-dialog-layer-BU3UuiJr.js">
39
39
  <link rel="modulepreload" crossorigin href="/assets/popover-select-CccGri5Y.js">
40
40
  <link rel="modulepreload" crossorigin href="/assets/circle-check-C23XjkUj.js">
41
+ <link rel="modulepreload" crossorigin href="/assets/cloud-C4-yfnnk.js">
41
42
  <link rel="modulepreload" crossorigin href="/assets/copy-Dv6d4Dvw.js">
42
43
  <link rel="modulepreload" crossorigin href="/assets/ellipsis-0k4rZLoy.js">
43
44
  <link rel="modulepreload" crossorigin href="/assets/external-link-DjqjBmc3.js">
@@ -45,25 +46,28 @@
45
46
  <link rel="modulepreload" crossorigin href="/assets/eye-CABVeTq0.js">
46
47
  <link rel="modulepreload" crossorigin href="/assets/file-code-corner-byQA1VfD.js">
47
48
  <link rel="modulepreload" crossorigin href="/assets/globe-DSSGFWFn.js">
48
- <link rel="modulepreload" crossorigin href="/assets/notes-api-BFsOGYkd.js">
49
+ <link rel="modulepreload" crossorigin href="/assets/notes-api-EpgG-OQc.js">
49
50
  <link rel="modulepreload" crossorigin href="/assets/loader-circle-CifKLtgG.js">
50
51
  <link rel="modulepreload" crossorigin href="/assets/rotate-cw-LIg3Am9S.js">
51
52
  <link rel="modulepreload" crossorigin href="/assets/search-DA7gz22f.js">
52
53
  <link rel="modulepreload" crossorigin href="/assets/middleware-Pd0e8Igk.js">
54
+ <link rel="modulepreload" crossorigin href="/assets/files-Dp8_uGTO.js">
53
55
  <link rel="modulepreload" crossorigin href="/assets/tool-activity-R8V9l6nk.js">
54
56
  <link rel="modulepreload" crossorigin href="/assets/button-CSEbl4zT.js">
55
57
  <link rel="modulepreload" crossorigin href="/assets/gateway-startup-retry-B_zrtccP.js">
56
58
  <link rel="modulepreload" crossorigin href="/assets/registry-api-BFZrVYfy.js">
57
59
  <link rel="modulepreload" crossorigin href="/assets/config-reload-event-Bjh2zoKp.js">
58
60
  <link rel="modulepreload" crossorigin href="/assets/gateway-config-swr-BWGjnmDl.js">
61
+ <link rel="modulepreload" crossorigin href="/assets/models-hub-cache-0RjEwafI.js">
59
62
  <link rel="modulepreload" crossorigin href="/assets/electron-env-DH5wF8X8.js">
63
+ <link rel="modulepreload" crossorigin href="/assets/oauth-api-BwNLwbI8.js">
60
64
  <link rel="modulepreload" crossorigin href="/assets/form-field-width-DJw_jULe.js">
61
65
  <link rel="modulepreload" crossorigin href="/assets/interaction-BmQogeqz.js">
62
66
  <link rel="modulepreload" crossorigin href="/assets/is-masked-secret-DOkL5b_X.js">
63
67
  <link rel="modulepreload" crossorigin href="/assets/activity-store-M0nAY5XB.js">
64
- <link rel="modulepreload" crossorigin href="/assets/theme-store-DOdCjyuw.js">
65
- <link rel="stylesheet" crossorigin href="/assets/markdown-view-CLzTdVLW.css">
66
- <link rel="stylesheet" crossorigin href="/assets/index-D_hrEKXM.css">
68
+ <link rel="modulepreload" crossorigin href="/assets/theme-store-Qgvo0Ga7.js">
69
+ <link rel="stylesheet" crossorigin href="/assets/markdown-view-B1bGSQqt.css">
70
+ <link rel="stylesheet" crossorigin href="/assets/index-CCyIdGuQ.css">
67
71
  </head>
68
72
  <body>
69
73
  <div id="root"></div>
package/dist/package.js CHANGED
@@ -1,4 +1,4 @@
1
1
  //#region package.json
2
- var version = "0.0.229";
2
+ var version = "0.0.231";
3
3
  //#endregion
4
4
  export { version };
@@ -1,8 +1,8 @@
1
1
  import { queueEmbeddedSteer } from "../embedded/runs.js";
2
2
  import { buildDirectUserMessageContent } from "../service/build-direct-message-content.js";
3
+ import { maybeEmitWebchatTts } from "../service/webchat-tts.js";
3
4
  import { runProcessDirectStreaming } from "../service/process-direct-streaming.js";
4
5
  import { runProcessDirect } from "../service/process-direct-one-shot.js";
5
- import { maybeEmitWebchatTts } from "../service/webchat-tts.js";
6
6
  //#region src/agent/inbound/turn-dispatcher.ts
7
7
  var TurnDispatcher = class {
8
8
  cfg;
@@ -13,6 +13,7 @@ import { isSessionSourceBinding, summarizeSourceContext } from "../source-contex
13
13
  import { injectSourceContextsIntoUserMessage } from "../source-context/injector.js";
14
14
  import { AsyncQueue, AsyncQueueOverflowError } from "./async-queue.js";
15
15
  import { hydratePerTurnState, runDirectAgentTurn, tryRunSlashCommand } from "./direct-turn-helpers.js";
16
+ import { isSuccessfulWebchatTtsToolEvent } from "./webchat-tts.js";
16
17
  //#region src/agent/service/process-direct-streaming.ts
17
18
  const MAX_BUFFERED_STREAM_EVENTS = 512;
18
19
  const LOSSY_STREAM_EVENT_TYPES = new Set([
@@ -151,6 +152,7 @@ async function* runProcessDirectStreaming(deps, input) {
151
152
  let userAborted = false;
152
153
  let abortHandled = false;
153
154
  let inboundVoice = false;
155
+ let explicitTtsEmitted = false;
154
156
  let ranSlashCommand = false;
155
157
  let mergedUserText = input.content;
156
158
  let webchatSlashReceipt;
@@ -299,6 +301,7 @@ async function* runProcessDirectStreaming(deps, input) {
299
301
  runId: input.runId,
300
302
  onEvent: (embeddedEvent) => {
301
303
  const event = { ...embeddedEvent };
304
+ if (isSuccessfulWebchatTtsToolEvent(event)) explicitTtsEmitted = true;
302
305
  if (event.type === "error" && typeof event.content === "string") event.content = formatStreamError(event.content);
303
306
  pushVisible(event);
304
307
  }
@@ -329,7 +332,7 @@ async function* runProcessDirectStreaming(deps, input) {
329
332
  sessionKey,
330
333
  droppedEvents: queue.droppedCount
331
334
  }, "Coalesced stream progress events because the consumer fell behind");
332
- if (!userAborted && !streamOverflowed && channel === "webchat") try {
335
+ if (!userAborted && !streamOverflowed && channel === "webchat" && !explicitTtsEmitted) try {
333
336
  const ttsAudioEvent = await deps.maybeEmitWebchatTts(sessionKey, inboundVoice);
334
337
  if (ttsAudioEvent) queue.push(ttsAudioEvent);
335
338
  } catch (ttsErr) {
@@ -15,6 +15,8 @@ export type WebchatTtsDeps = {
15
15
  warn: (obj: Record<string, unknown>, msg: string) => void;
16
16
  };
17
17
  };
18
+ /** True when the explicit TTS tool already produced durable Webchat audio. */
19
+ export declare function isSuccessfulWebchatTtsToolEvent(event: unknown): boolean;
18
20
  /**
19
21
  * Generate TTS for webchat when config allows; persist under `{stateDir}/media/tts/`.
20
22
  */
@@ -3,9 +3,22 @@ import { speak } from "../../voice/tts/speak-core.js";
3
3
  import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
4
4
  import { getChannelOutputFormat, shouldUseTTS } from "../../voice/tts/service.js";
5
5
  import { compressAudio } from "../../voice/tts/audio.js";
6
- import "../../voice/tts/index.js";
7
6
  import { persistOutboundTtsAudio } from "../../channels/attachments/outbound-tts-persist.js";
7
+ import "../../voice/tts/index.js";
8
8
  //#region src/agent/service/webchat-tts.ts
9
+ /** True when the explicit TTS tool already produced durable Webchat audio. */
10
+ function isSuccessfulWebchatTtsToolEvent(event) {
11
+ if (!event || typeof event !== "object" || Array.isArray(event)) return false;
12
+ const row = event;
13
+ if (row.type !== "tool_execution_end" || row.toolName !== "text_to_speech" || row.isError === true) return false;
14
+ const result = row.result && typeof row.result === "object" && !Array.isArray(row.result) ? row.result : null;
15
+ const details = result?.details && typeof result.details === "object" && !Array.isArray(result.details) ? result.details : null;
16
+ return Array.isArray(details?.media) && details.media.some((item) => {
17
+ if (!item || typeof item !== "object" || Array.isArray(item)) return false;
18
+ const media = item;
19
+ return typeof media.uri === "string" && media.uri.trim().length > 0;
20
+ });
21
+ }
9
22
  /**
10
23
  * Generate TTS for webchat when config allows; persist under `{stateDir}/media/tts/`.
11
24
  */
@@ -57,4 +70,4 @@ async function appendMediaToLastAssistant(sessionStore, sessionKey, ref) {
57
70
  }
58
71
  }
59
72
  //#endregion
60
- export { appendMediaToLastAssistant, maybeEmitWebchatTts };
73
+ export { appendMediaToLastAssistant, isSuccessfulWebchatTtsToolEvent, maybeEmitWebchatTts };
@@ -108,6 +108,7 @@ export declare class AgentService {
108
108
  getAgentSkillAvailability(agentId: string): AgentSkillAvailabilityPayload;
109
109
  getSessionSkillAvailability(sessionKey: string): Promise<AgentSkillAvailabilityPayload>;
110
110
  getSessionWorkspaceTrust(sessionKey: string): Promise<WorkspaceTrustState>;
111
+ getResolvedWorkspaceForSession(sessionKey: string): string;
111
112
  setSessionWorkspaceTrust(sessionKey: string, trusted: boolean): Promise<WorkspaceTrustState>;
112
113
  getWorkspaceTrust(workspacePath: string): WorkspaceTrustState;
113
114
  setWorkspaceTrust(workspacePath: string, trusted: boolean): WorkspaceTrustState;
@@ -10,12 +10,12 @@ import { init_providers, resolveModel } from "../providers/index.js";
10
10
  import { extractTextContent } from "./context/workspace.js";
11
11
  import { effectiveWorkspacePathForSession } from "../session/session-workspace.js";
12
12
  import { getProjectForSession } from "../projects/workspace.js";
13
- import { resolveAgentTurnTimeoutMs } from "./orchestration/run-agent-turn-with-timeout.js";
14
- import { resolveResponseLanguageForSession } from "./prompt/response-language.js";
15
13
  import { resolveWorkspaceSkillsDir, resolveWorkspaceSkillsLockPath } from "./skills/workspace-skills-dir.js";
16
14
  import { removeSkillsLockEntry } from "./skills/hub-lock.js";
17
15
  import { installSkillFromZip } from "./skills/managed-store.js";
18
16
  import { pullSkillFromSource } from "./skills/hub-pull.js";
17
+ import { resolveAgentTurnTimeoutMs } from "./orchestration/run-agent-turn-with-timeout.js";
18
+ import { resolveResponseLanguageForSession } from "./prompt/response-language.js";
19
19
  import { normalizeSkillInstallTarget } from "./skills/install-target.js";
20
20
  import { onSessionTranscriptUpdate } from "../session/transcript-events.js";
21
21
  import { persistInboundAttachments } from "../channels/attachments/inbound-persist.js";
@@ -509,6 +509,9 @@ var AgentService = class {
509
509
  await this.sessionHydrator.workspace(sessionKey);
510
510
  return this.agentManager.getSessionWorkspaceTrust(sessionKey);
511
511
  }
512
+ getResolvedWorkspaceForSession(sessionKey) {
513
+ return this.agentManager.getResolvedWorkspaceForSession(sessionKey);
514
+ }
512
515
  async setSessionWorkspaceTrust(sessionKey, trusted) {
513
516
  await this.sessionHydrator.workspace(sessionKey);
514
517
  return this.agentManager.setSessionWorkspaceTrust(sessionKey, trusted);
@@ -1,8 +1,8 @@
1
1
  import { init_paths, resolveSkillsDir } from "../../config/paths.js";
2
2
  import { parseFrontmatter } from "../../markdown/frontmatter.js";
3
- import { fuzzyFindText, normalizeForFuzzyMatch, normalizeToLF, restoreLineEndings } from "../tools/edit-diff.js";
4
3
  import { resolveWorkspaceSkillsDir } from "./workspace-skills-dir.js";
5
4
  import { formatScanSummary, scanSkillDirectory } from "./scanner.js";
5
+ import { fuzzyFindText, normalizeForFuzzyMatch, normalizeToLF, restoreLineEndings } from "../tools/edit-diff.js";
6
6
  import { join, resolve, sep } from "path";
7
7
  import { existsSync, realpathSync } from "fs";
8
8
  import { mkdir, writeFile } from "fs/promises";
@@ -4,6 +4,7 @@ import { speak } from "../../voice/tts/speak-core.js";
4
4
  import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
5
5
  import { getChannelOutputFormat } from "../../voice/tts/service.js";
6
6
  import { compressAudio } from "../../voice/tts/audio.js";
7
+ import { persistOutboundTtsAudio } from "../../channels/attachments/outbound-tts-persist.js";
7
8
  import { Type } from "@sinclair/typebox";
8
9
  //#region src/agent/tools/tts-tool.ts
9
10
  init_logger();
@@ -72,30 +73,35 @@ function createTextToSpeechTool(deps) {
72
73
  });
73
74
  const wavTarget = outFmt.format === "mp3" ? "mp3" : "opus";
74
75
  const { buffer: compressedAudio, format: compressedFormat } = await compressAudio(Buffer.from(result.audio), result.format, wavTarget);
75
- const dataUrl = `data:${compressedFormat === "opus" ? "audio/ogg" : compressedFormat === "mp3" || compressedFormat === "mpeg" ? "audio/mpeg" : `audio/${compressedFormat}`};base64,${compressedAudio.toString("base64")}`;
76
- const msg = {
77
- channel: ctx.channel,
78
- chat_id: ctx.chatId,
79
- content: "",
80
- mediaUrl: dataUrl,
81
- mediaType: "audio",
82
- audioAsVoice: outFmt.voiceCompatible
83
- };
84
- await deps.bus.publishOutbound(msg);
76
+ const mimeType = compressedFormat === "opus" ? "audio/ogg" : compressedFormat === "mp3" || compressedFormat === "mpeg" ? "audio/mpeg" : `audio/${compressedFormat}`;
77
+ const media = ctx.channel === "webchat" ? await persistOutboundTtsAudio(compressedAudio, compressedFormat) : void 0;
78
+ if (!media) {
79
+ const msg = {
80
+ channel: ctx.channel,
81
+ chat_id: ctx.chatId,
82
+ content: "",
83
+ mediaUrl: `data:${mimeType};base64,${compressedAudio.toString("base64")}`,
84
+ mediaType: "audio",
85
+ audioAsVoice: outFmt.voiceCompatible
86
+ };
87
+ await deps.bus.publishOutbound(msg);
88
+ }
85
89
  log.info({
86
90
  provider: result.provider,
87
91
  format: compressedFormat,
92
+ channel: ctx.channel,
88
93
  textLength: params.text.length,
89
94
  audioSize: compressedAudio.length
90
- }, "TTS tool sent audio");
95
+ }, ctx.channel === "webchat" ? "TTS tool attached audio" : "TTS tool sent audio");
91
96
  return {
92
97
  content: [{
93
98
  type: "text",
94
- text: `✅ Sent voice message (${result.provider}, ${compressedFormat}).`
99
+ text: ctx.channel === "webchat" ? `✅ Attached voice message (${result.provider}, ${compressedFormat}).` : `✅ Sent voice message (${result.provider}, ${compressedFormat}).`
95
100
  }],
96
101
  details: {
97
102
  provider: result.provider,
98
- format: compressedFormat
103
+ format: compressedFormat,
104
+ ...media ? { media: [media] } : {}
99
105
  }
100
106
  };
101
107
  } catch (error) {
@@ -1,9 +1,10 @@
1
1
  import { checkFileSafety } from "../prompt/safety.js";
2
2
  import { isBareProfileMarkdownFileName, resolvePathUnderWorkspace, resolveProfileMarkdownPathIfBareName } from "./tool-paths.js";
3
3
  import { appendProductDeliveryText } from "../../../packages/gateway-contract/src/product-delivery.js";
4
+ import { fileResourceId, fileSpaceId } from "../../files/file-service.js";
4
5
  import { evaluateFilePolicy } from "../sandbox/exec-policy.js";
5
- import { basename, dirname } from "path";
6
- import { mkdir, writeFile } from "fs/promises";
6
+ import { basename, dirname, relative, sep } from "path";
7
+ import { mkdir, realpath, writeFile } from "fs/promises";
7
8
  import { Type } from "@sinclair/typebox";
8
9
  //#region src/agent/tools/write.ts
9
10
  const MAX_FILE_SIZE = 10 * 1024 * 1024;
@@ -59,30 +60,26 @@ function createWriteFileTool(workspace, options) {
59
60
  const target = writesProfileFile ? resolveProfileMarkdownPathIfBareName(p.path, options.profileMarkdownRoot) : resolvePathUnderWorkspace(p.path, workspace);
60
61
  await mkdir(dirname(target), { recursive: true });
61
62
  await writeFile(target, p.content, "utf-8");
62
- const delivery = {
63
+ const delivery = writesProfileFile ? void 0 : await Promise.all([realpath(workspace), realpath(target)]).then(([root, canonicalTarget]) => ({
63
64
  version: 1,
64
65
  operation: "updated",
65
66
  primary: {
66
67
  kind: "file",
67
- id: target,
68
+ id: fileResourceId(fileSpaceId(root), relative(root, canonicalTarget).split(sep).join("/")),
68
69
  title: basename(target),
69
70
  summary: `${contentBytes} bytes written`,
70
- capabilities: [
71
- "preview",
72
- "reveal",
73
- "share"
74
- ]
71
+ capabilities: ["preview", "share"]
75
72
  }
76
- };
73
+ }));
77
74
  return {
78
75
  content: [{
79
76
  type: "text",
80
- text: appendProductDeliveryText(`File written: ${target}`, delivery)
77
+ text: delivery ? appendProductDeliveryText(`File written: ${target}`, delivery) : `File written: ${target}`
81
78
  }],
82
79
  details: {
83
80
  size: contentBytes,
84
81
  path: target,
85
- delivery
82
+ ...delivery ? { delivery } : {}
86
83
  }
87
84
  };
88
85
  } catch (error) {
@@ -11,10 +11,10 @@ import { TaskRunRepository } from "../../tasks/task-run-repository.js";
11
11
  import { TaskReadModelProjector } from "../../tasks/task-read-model-projector.js";
12
12
  import { TaskCommandSchema, TaskContextInputSchema } from "../../../packages/gateway-contract/src/tasks.js";
13
13
  import { appendProductDeliveryText } from "../../../packages/gateway-contract/src/product-delivery.js";
14
- import { CreateAutomationSchema, UpdateAutomationSchema } from "../../automations/domain/validation.js";
15
- import "../../automations/index.js";
16
14
  import { isValidProjectAgentId, normalizeProjectAgentId, resolveProjectAgentId } from "../../projects/project-agent.js";
17
15
  import "../../projects/index.js";
16
+ import { CreateAutomationSchema, UpdateAutomationSchema } from "../../automations/domain/validation.js";
17
+ import "../../automations/index.js";
18
18
  import { TaskContextRepository } from "../../tasks/task-context-repository.js";
19
19
  import { TaskDependencyError, TaskDependencyService } from "../../tasks/task-dependency-service.js";
20
20
  import { TaskApplicationService } from "../../tasks/task-application-service.js";
@@ -8,7 +8,7 @@ import { init_kimi_coding, kimiCodingOAuthProvider } from "./kimi-coding.js";
8
8
  import { init_minimax_cn, minimaxCnOAuthProvider } from "./minimax-cn.js";
9
9
  import { init_minimax, minimaxOAuthProvider } from "./minimax.js";
10
10
  import { init_openai_codex, loginOpenAICodex, openaiCodexOAuthProvider, refreshOpenAICodexToken } from "./openai-codex.js";
11
- import { init_xopc_cloud, xopcCloudOAuthProvider, xopcTunnelOAuthProvider } from "./xopc-cloud.js";
11
+ import { init_xopc_cloud, xopcCloudOAuthProvider, xopcShareOAuthProvider, xopcTunnelOAuthProvider } from "./xopc-cloud.js";
12
12
  import { OAUTH_PROVIDER_DEFINITIONS, getModelOAuthProviderIds, getOAuthProviderDefinition, getOAuthProviderIds, getOAuthProviderInterfaces, init_registry, isOAuthOnlyProvider } from "./registry.js";
13
13
  //#region src/auth/oauth/index.ts
14
14
  init_anthropic();
@@ -22,4 +22,4 @@ init_openai_codex();
22
22
  init_xopc_cloud();
23
23
  init_registry();
24
24
  //#endregion
25
- export { OAUTH_PROVIDER_DEFINITIONS, anthropicOAuthProvider, getModelOAuthProviderIds, getOAuthProviderDefinition, getOAuthProviderIds, getOAuthProviderInterfaces, githubCopilotOAuthProvider, antigravityOAuthProvider as googleAntigravityOAuthProvider, geminiCliOAuthProvider as googleGeminiCliOAuthProvider, isOAuthOnlyProvider, kimiCodingOAuthProvider, loginAnthropic, loginAntigravity, loginGeminiCli, loginOpenAICodex, minimaxCnOAuthProvider, minimaxOAuthProvider, openaiCodexOAuthProvider, refreshAnthropicToken, refreshAntigravityToken, refreshGoogleCloudToken, refreshOpenAICodexToken, xopcCloudOAuthProvider, xopcTunnelOAuthProvider };
25
+ export { OAUTH_PROVIDER_DEFINITIONS, anthropicOAuthProvider, getModelOAuthProviderIds, getOAuthProviderDefinition, getOAuthProviderIds, getOAuthProviderInterfaces, githubCopilotOAuthProvider, antigravityOAuthProvider as googleAntigravityOAuthProvider, geminiCliOAuthProvider as googleGeminiCliOAuthProvider, isOAuthOnlyProvider, kimiCodingOAuthProvider, loginAnthropic, loginAntigravity, loginGeminiCli, loginOpenAICodex, minimaxCnOAuthProvider, minimaxOAuthProvider, openaiCodexOAuthProvider, refreshAnthropicToken, refreshAntigravityToken, refreshGoogleCloudToken, refreshOpenAICodexToken, xopcCloudOAuthProvider, xopcShareOAuthProvider, xopcTunnelOAuthProvider };
@@ -2,7 +2,7 @@ import type { OAuthProviderInterface } from './types.js';
2
2
  export interface OAuthProviderDefinition {
3
3
  displayName: string;
4
4
  oauthOnly?: boolean;
5
- purpose: 'models' | 'tunnel';
5
+ purpose: 'models' | 'tunnel' | 'share';
6
6
  provider: OAuthProviderInterface;
7
7
  profileId: string;
8
8
  urlPrompt: string;
@@ -9,7 +9,7 @@ import { init_kimi_coding, kimiCodingOAuthProvider } from "./kimi-coding.js";
9
9
  import { init_minimax_cn, minimaxCnOAuthProvider } from "./minimax-cn.js";
10
10
  import { init_minimax, minimaxOAuthProvider } from "./minimax.js";
11
11
  import { init_openai_codex, openaiCodexOAuthProvider } from "./openai-codex.js";
12
- import { init_xopc_cloud, xopcCloudOAuthProvider, xopcTunnelOAuthProvider } from "./xopc-cloud.js";
12
+ import { init_xopc_cloud, xopcCloudOAuthProvider, xopcShareOAuthProvider, xopcTunnelOAuthProvider } from "./xopc-cloud.js";
13
13
  //#region src/auth/oauth/registry.ts
14
14
  function definition(provider, purpose, displayName = provider.name) {
15
15
  return {
@@ -55,6 +55,10 @@ var init_registry = __esmMin((() => {
55
55
  ...definition(xopcTunnelOAuthProvider, "tunnel"),
56
56
  oauthOnly: true
57
57
  },
58
+ "xopc-share": {
59
+ ...definition(xopcShareOAuthProvider, "share"),
60
+ oauthOnly: true
61
+ },
58
62
  anthropic: definition(anthropicOAuthProvider, "models", "Anthropic (Claude)"),
59
63
  minimax: definition(minimaxOAuthProvider, "models", "MiniMax (幂维智能)"),
60
64
  "minimax-cn": {
@@ -1,3 +1,4 @@
1
1
  import type { OAuthProviderInterface } from './types.js';
2
2
  export declare const xopcCloudOAuthProvider: OAuthProviderInterface;
3
3
  export declare const xopcTunnelOAuthProvider: OAuthProviderInterface;
4
+ export declare const xopcShareOAuthProvider: OAuthProviderInterface;
@@ -388,13 +388,14 @@ function createXopcOAuthProvider(options) {
388
388
  getApiKey: (value) => value.access
389
389
  };
390
390
  }
391
- var CLIENT_ID, DEFAULT_CONSOLE_URL, MODEL_SERVICE_SCOPE, TUNNEL_REGISTRATION_SCOPE, CALLBACK_PATH, AUTHORIZATION_TIMEOUT_MS, xopcCloudOAuthProvider, xopcTunnelOAuthProvider;
391
+ var CLIENT_ID, DEFAULT_CONSOLE_URL, MODEL_SERVICE_SCOPE, TUNNEL_REGISTRATION_SCOPE, HOSTED_SHARE_SCOPE, CALLBACK_PATH, AUTHORIZATION_TIMEOUT_MS, xopcCloudOAuthProvider, xopcTunnelOAuthProvider, xopcShareOAuthProvider;
392
392
  var init_xopc_cloud = __esmMin((() => {
393
393
  init_pkce();
394
394
  CLIENT_ID = "xopc-native";
395
395
  DEFAULT_CONSOLE_URL = "https://console.xopc.ai";
396
396
  MODEL_SERVICE_SCOPE = "models:read models:invoke account:usage connectors:read connectors:manage connectors:execute offline_access";
397
397
  TUNNEL_REGISTRATION_SCOPE = "tunnel:register";
398
+ HOSTED_SHARE_SCOPE = "shares:read shares:write offline_access";
398
399
  CALLBACK_PATH = "/oauth/callback";
399
400
  AUTHORIZATION_TIMEOUT_MS = 5 * 6e4;
400
401
  xopcCloudOAuthProvider = createXopcOAuthProvider({
@@ -407,7 +408,12 @@ var init_xopc_cloud = __esmMin((() => {
407
408
  name: "XOPC Public Tunnel",
408
409
  scope: TUNNEL_REGISTRATION_SCOPE
409
410
  });
411
+ xopcShareOAuthProvider = createXopcOAuthProvider({
412
+ id: "xopc-share",
413
+ name: "XOPC Hosted Share",
414
+ scope: HOSTED_SHARE_SCOPE
415
+ });
410
416
  }));
411
417
  //#endregion
412
418
  init_xopc_cloud();
413
- export { init_xopc_cloud, xopcCloudOAuthProvider, xopcTunnelOAuthProvider };
419
+ export { init_xopc_cloud, xopcCloudOAuthProvider, xopcShareOAuthProvider, xopcTunnelOAuthProvider };
@@ -0,0 +1,36 @@
1
+ import type { FileResource, FileSpace } from '@xopcai/gateway-contract';
2
+ import type { Config } from '../config/schema.js';
3
+ import { type ProjectService } from '../projects/index.js';
4
+ export type ResolvedFileSpace = FileSpace & {
5
+ root: string;
6
+ };
7
+ export declare function fileSpaceId(root: string): string;
8
+ export declare function fileResourceId(spaceId: string, relativePath: string): string;
9
+ export declare function parseFileResourceId(id: string): {
10
+ spaceId: string;
11
+ relativePath: string;
12
+ };
13
+ export declare function resolveFilePath(root: string, path: string, mustExist?: boolean): Promise<string>;
14
+ export declare class FileServiceError extends Error {
15
+ readonly status: 400 | 403 | 404 | 409;
16
+ constructor(status: 400 | 403 | 404 | 409, message: string);
17
+ }
18
+ export declare function fileResourceFromPath(space: ResolvedFileSpace, absolutePath: string): Promise<FileResource>;
19
+ export declare class FileSpaceService {
20
+ private readonly getConfig;
21
+ private readonly projects;
22
+ private readonly resolveSessionWorkspace;
23
+ private readonly dynamicSpaces;
24
+ private cache;
25
+ constructor(getConfig: () => Config, projects: ProjectService, resolveSessionWorkspace: (sessionKey: string) => string);
26
+ private createSpace;
27
+ list(): Promise<ResolvedFileSpace[]>;
28
+ forContext(kind: 'agent' | 'project' | 'session', id: string): Promise<ResolvedFileSpace>;
29
+ get(id: string): Promise<ResolvedFileSpace>;
30
+ resource(id: string): Promise<{
31
+ space: ResolvedFileSpace;
32
+ resource: FileResource;
33
+ absolutePath: string;
34
+ }>;
35
+ children(spaceId: string, path?: string): Promise<FileResource[]>;
36
+ }