@xopcai/xopc 0.0.230 → 0.0.232

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 (384) hide show
  1. package/README.md +1 -0
  2. package/README.zh-CN.md +1 -0
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/feishu/src/schema/config-schema.d.ts +3 -3
  5. package/dist/extensions/telegram/src/config-schema.d.ts +4 -4
  6. package/dist/extensions/telegram/xopc.extension.json +1 -1
  7. package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
  8. package/dist/gateway/static/root/assets/{activity-store-M0nAY5XB.js → activity-store-VXCWz43N.js} +1 -1
  9. package/dist/gateway/static/root/assets/agent-avatar-dicebear-BXRaZYW8.js +1 -0
  10. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-dR7HMaRX.js +1 -0
  11. package/dist/gateway/static/root/assets/agents-Bileycwe.js +1 -0
  12. package/dist/gateway/static/root/assets/api-wGPgL8xY.js +1 -0
  13. package/dist/gateway/static/root/assets/{app-management-settings-panel-CwAPK4Jm.js → app-management-settings-panel-BJfClfPx.js} +1 -1
  14. package/dist/gateway/static/root/assets/{appearance-settings-DsGLvqTb.js → appearance-settings-C_R0vUAu.js} +1 -1
  15. package/dist/gateway/static/root/assets/{apps-page-Ee9qOQEx.js → apps-page-CBow8pBI.js} +1 -1
  16. package/dist/gateway/static/root/assets/{archive-plugin-7_DXaMTP.js → archive-plugin-DnFHkSHE.js} +1 -1
  17. package/dist/gateway/static/root/assets/{attachment-load-B4qqigAQ.js → attachment-load-DZrEwytM.js} +1 -1
  18. package/dist/gateway/static/root/assets/{automations-page-B8ImehSW.js → automations-page-DpkKajui.js} +1 -1
  19. package/dist/gateway/static/root/assets/automations-workspace-BBntVWgv.js +6 -0
  20. package/dist/gateway/static/root/assets/{binary-plugins-DaJbyYc2.js → binary-plugins-Ckc_Csue.js} +1 -1
  21. package/dist/gateway/static/root/assets/{block-editor-Kl25XWJc.js → block-editor-DAC6w-iV.js} +4 -4
  22. package/dist/gateway/static/root/assets/browser-settings-page-DrsMd-Po.js +8 -0
  23. package/dist/gateway/static/root/assets/browser-workflow-inputs-BGd7R8GO.js +1 -0
  24. package/dist/gateway/static/root/assets/{browser-workflows-page-DjMxs33B.js → browser-workflows-page-DUfj7ntM.js} +2 -2
  25. package/dist/gateway/static/root/assets/capabilities-settings-panel-97gkGeSV.js +7 -0
  26. package/dist/gateway/static/root/assets/channels-settings-CuBsz8UI.js +1 -0
  27. package/dist/gateway/static/root/assets/{channel-recipient-api-C5ABr73b.js → channels-status-swr-CfboECLt.js} +1 -1
  28. package/dist/gateway/static/root/assets/{chat-terminal-dock-BiU_4Rq6.js → chat-terminal-dock-CA9fndbZ.js} +2 -2
  29. package/dist/gateway/static/root/assets/cloud-C4-yfnnk.js +1 -0
  30. package/dist/gateway/static/root/assets/{code-editor-dFzqyDXS.js → code-editor-D4_k-6QN.js} +1 -1
  31. package/dist/gateway/static/root/assets/connectors-page-SuL7td7Z.js +2 -0
  32. package/dist/gateway/static/root/assets/cron-expression-CqPu7HYJ.js +2 -0
  33. package/dist/gateway/static/root/assets/date-picker-C8dJsCgk.js +1 -0
  34. package/dist/gateway/static/root/assets/dependency-picker-Iz2wYimy.js +1 -0
  35. package/dist/gateway/static/root/assets/{desktop-pet-ux9DxchT.js → desktop-pet-C3h40FmG.js} +1 -1
  36. package/dist/gateway/static/root/assets/{desktop-pet-settings-BVVCBgYK.js → desktop-pet-settings-YfeVVzLe.js} +1 -1
  37. package/dist/gateway/static/root/assets/dist-DqPZM2MH2.js +1 -0
  38. package/dist/gateway/static/root/assets/{extension-debug-page-Dh6DDuvQ.js → extension-debug-page-CChgztz_.js} +1 -1
  39. package/dist/gateway/static/root/assets/{extension-page-8OKQDEat.js → extension-page-DF6ct6_y.js} +1 -1
  40. package/dist/gateway/static/root/assets/extension-settings-page-jgBsjn0F.js +1 -0
  41. package/dist/gateway/static/root/assets/files-Dp8_uGTO.js +1 -0
  42. package/dist/gateway/static/root/assets/{gateway-config-api-Dlc6eaTG.js → gateway-config-api-CVajuIGL.js} +1 -1
  43. package/dist/gateway/static/root/assets/gateway-config-swr-BGQn8duh.js +1 -0
  44. package/dist/gateway/static/root/assets/{gateway-settings-DqQgiAUv.js → gateway-settings-BbssNGid.js} +1 -1
  45. package/dist/gateway/static/root/assets/{gateway-startup-retry-B_zrtccP.js → gateway-startup-retry-D2Rnh9fX.js} +1 -1
  46. package/dist/gateway/static/root/assets/heartbeat-settings-CJtXu8iD.js +1 -0
  47. package/dist/gateway/static/root/assets/home-page-Be1o1AXQ.js +1 -0
  48. package/dist/gateway/static/root/assets/html-workspace-editor-C3DKAkMc.js +1 -0
  49. package/dist/gateway/static/root/assets/{image-generation-api-YKP2me5Z.js → image-generation-api-D7W2p5_8.js} +1 -1
  50. package/dist/gateway/static/root/assets/index-B2OJSXX9.js +70 -0
  51. package/dist/gateway/static/root/assets/index-rHjAElxG.css +2 -0
  52. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BSFNqxzY.js → keyboard-shortcuts-settings-BvHYyNus.js} +1 -1
  53. package/dist/gateway/static/root/assets/local-app-workbench-page-COfelgk7.js +2 -0
  54. package/dist/gateway/static/root/assets/{local-apps-page-DzU6yZ9-.js → local-apps-page-Cb8t2wWM.js} +1 -1
  55. package/dist/gateway/static/root/assets/locale-store-DLwVxS3V.js +1 -0
  56. package/dist/gateway/static/root/assets/logs-page-DA8oDjeB.js +2 -0
  57. package/dist/gateway/static/root/assets/management-settings-B8Jie4-J.js +1 -0
  58. package/dist/gateway/static/root/assets/markdown-editor-nDLmA_LF.js +2 -0
  59. package/dist/gateway/static/root/assets/markdown-split-BD1r4o2i.js +1 -0
  60. package/dist/gateway/static/root/assets/{markdown-view-DvM5PWEH.js → markdown-view-B-BHEcNd.js} +1 -1
  61. package/dist/gateway/static/root/assets/markdown-view-B1bGSQqt.css +1 -0
  62. package/dist/gateway/static/root/assets/{media-plugins-B8vMe5VX.js → media-plugins-BCev8fkW.js} +1 -1
  63. package/dist/gateway/static/root/assets/messages-Dp1OxSKt.js +3 -0
  64. package/dist/gateway/static/root/assets/mobile-device-api-DACoHhhk.js +1 -0
  65. package/dist/gateway/static/root/assets/models-hub-cache-C8zjqmIv.js +1 -0
  66. package/dist/gateway/static/root/assets/{notes-api-BFsOGYkd.js → notes-api-DEdNKw0I.js} +1 -1
  67. package/dist/gateway/static/root/assets/{notes-page-B-YZ7iuK.js → notes-page-BBTLjJwa.js} +1 -1
  68. package/dist/gateway/static/root/assets/notes-workbench-DICgUGPv.js +4 -0
  69. package/dist/gateway/static/root/assets/oauth-api-BNCO2YK5.js +1 -0
  70. package/dist/gateway/static/root/assets/popover-select-3E24E65N.js +1 -0
  71. package/dist/gateway/static/root/assets/{product-open-page-DkWcyki5.js → product-open-page-fEBbRekH.js} +1 -1
  72. package/dist/gateway/static/root/assets/project-detail-page-CqdkznYJ.js +1 -0
  73. package/dist/gateway/static/root/assets/projects-page-dHDXpMCg.js +1 -0
  74. package/dist/gateway/static/root/assets/{registry-api-BFZrVYfy.js → registry-api-Cvr4Qm7N.js} +1 -1
  75. package/dist/gateway/static/root/assets/remote-access-hub-2feZudJw.js +1 -0
  76. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-Bq_ETeal.js → runtime-tools-settings-panel-BT5B74IH.js} +2 -2
  77. package/dist/gateway/static/root/assets/{schema-form-BogTlrsP.js → schema-form-C4tB34S5.js} +1 -1
  78. package/dist/gateway/static/root/assets/sessions-page-CO2JCFdy.js +1 -0
  79. package/dist/gateway/static/root/assets/settings-advanced-gate-DxMVaqdn.js +1 -0
  80. package/dist/gateway/static/root/assets/{settings-form-section-Coy1Cbp6.js → settings-form-section-D1oXhkgI.js} +1 -1
  81. package/dist/gateway/static/root/assets/settings-loading-skeleton-CldfX6FJ.js +1 -0
  82. package/dist/gateway/static/root/assets/settings-page-c3LJnbvE.js +1 -0
  83. package/dist/gateway/static/root/assets/settings-shell-layer-context-DCp6ykjQ.js +1 -0
  84. package/dist/gateway/static/root/assets/setup-status-panel-DZNHb6A5.js +1 -0
  85. package/dist/gateway/static/root/assets/share-preview-page-DptCK_mk.js +2 -0
  86. package/dist/gateway/static/root/assets/shares-settings-DakZ2AGN.js +1 -0
  87. package/dist/gateway/static/root/assets/skill-reload-api-BOiNkWJC.js +1 -0
  88. package/dist/gateway/static/root/assets/{skills-page-Brxb6QnW.js → skills-page-OHBeBtSg.js} +1 -1
  89. package/dist/gateway/static/root/assets/{skills-page.utils-FB5LtEGm.js → skills-page.utils-B9WZbOLC.js} +1 -1
  90. package/dist/gateway/static/root/assets/{system-settings-panel-ChosWt8n.js → system-settings-panel-Dj_DpOGw.js} +1 -1
  91. package/dist/gateway/static/root/assets/task-detail-page-D5Nbe3C8.js +1 -0
  92. package/dist/gateway/static/root/assets/theme-store-Cpd3Gd5R.js +1 -0
  93. package/dist/gateway/static/root/assets/{use-autosave-2SqnmSKD.js → use-autosave-DCl5Yq7N.js} +1 -1
  94. package/dist/gateway/static/root/assets/user-context-page-CAPSUK8B.js +1 -0
  95. package/dist/gateway/static/root/assets/{vendor-codemirror-DRr7hFaD.js → vendor-codemirror--gTq3YAI.js} +16 -16
  96. package/dist/gateway/static/root/assets/voice-api-key-field-BB_ZQV8F.js +1 -0
  97. package/dist/gateway/static/root/assets/voice-config-api-BNiYmpl5.js +1 -0
  98. package/dist/gateway/static/root/assets/{work-discovery-overlay-CK3aZDdE.js → work-discovery-overlay-BrIdtdum.js} +1 -1
  99. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BjOuddkX.js → workflow-run-setup-panel-hKh-uCLo.js} +2 -2
  100. package/dist/gateway/static/root/assets/workflows-page-ahDvypGO.js +5 -0
  101. package/dist/gateway/static/root/index.html +19 -15
  102. package/dist/package.js +1 -1
  103. package/dist/src/agent/agent-manager.d.ts +1 -2
  104. package/dist/src/agent/agent-manager.js +29 -44
  105. package/dist/src/agent/background-review/run-background-review.js +10 -15
  106. package/dist/src/agent/embedded/run-for-session.js +1 -1
  107. package/dist/src/agent/external-tools/mcp-provider.js +3 -13
  108. package/dist/src/agent/image/generation/runtime.js +1 -1
  109. package/dist/src/agent/image/tool-model-config.js +13 -14
  110. package/dist/src/agent/mcp/bundle-mcp-policy.d.ts +0 -9
  111. package/dist/src/agent/mcp/bundle-mcp-policy.js +1 -13
  112. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  113. package/dist/src/agent/mcp/index.js +2 -2
  114. package/dist/src/agent/media-generation/runtime-shared.d.ts +1 -1
  115. package/dist/src/agent/media-generation/runtime-shared.js +1 -1
  116. package/dist/src/agent/memory/create-memory-manager.js +1 -1
  117. package/dist/src/agent/memory/manager.d.ts +1 -1
  118. package/dist/src/{agent-runtime/memory-runtime.d.ts → agent/memory/runtime.d.ts} +1 -1
  119. package/dist/src/{agent-runtime/memory-runtime.js → agent/memory/runtime.js} +2 -3
  120. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +0 -3
  121. package/dist/src/agent/orchestration/agent-orchestrator.js +1 -3
  122. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +2 -2
  123. package/dist/src/agent/service.d.ts +1 -0
  124. package/dist/src/agent/service.js +5 -3
  125. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  126. package/dist/src/agent/starter-agents.js +1 -8
  127. package/dist/src/agent/tools/executor.d.ts +1 -1
  128. package/dist/src/agent/tools/workflow-tool.js +1 -5
  129. package/dist/src/agent/tools/write.js +9 -12
  130. package/dist/src/agent/tools/xopc-use-tool.js +2 -2
  131. package/dist/src/agent-config/index.d.ts +2 -0
  132. package/dist/src/agent-config/index.js +11 -0
  133. package/dist/src/agent-config/resolver.d.ts +11 -0
  134. package/dist/src/agent-config/resolver.js +113 -0
  135. package/dist/src/agent-config/schema.d.ts +491 -0
  136. package/dist/src/agent-config/schema.js +172 -0
  137. package/dist/src/auth/oauth/index.js +2 -2
  138. package/dist/src/auth/oauth/registry.d.ts +1 -1
  139. package/dist/src/auth/oauth/registry.js +5 -1
  140. package/dist/src/auth/oauth/xopc-cloud.d.ts +1 -0
  141. package/dist/src/auth/oauth/xopc-cloud.js +8 -2
  142. package/dist/src/chat-commands/builtins/config.js +2 -2
  143. package/dist/src/chat-commands/builtins/review.js +1 -1
  144. package/dist/src/chat-commands/config-paths.js +1 -1
  145. package/dist/src/cli/commands/agents.js +2 -1
  146. package/dist/src/cli/commands/config.js +1 -1
  147. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  148. package/dist/src/cli/commands/doctor/checks/provider-auth.js +12 -4
  149. package/dist/src/cli/commands/image.js +3 -4
  150. package/dist/src/cli/commands/models.js +9 -3
  151. package/dist/src/cli/commands/onboard/model.js +12 -11
  152. package/dist/src/cli/commands/onboard.js +1 -1
  153. package/dist/src/cli/commands/tunnel.js +3 -18
  154. package/dist/src/cli/utils/init-workspace-core.d.ts +1 -1
  155. package/dist/src/cli/utils/init-workspace-core.js +1 -1
  156. package/dist/src/commands/agents.config.d.ts +1 -3
  157. package/dist/src/commands/agents.config.js +9 -26
  158. package/dist/src/config/agent-model-intents.d.ts +10 -0
  159. package/dist/src/config/agent-model-intents.js +39 -0
  160. package/dist/src/config/agent-profile.d.ts +7 -9
  161. package/dist/src/config/agent-profile.js +30 -28
  162. package/dist/src/config/default-model.d.ts +1 -11
  163. package/dist/src/config/default-model.js +3 -11
  164. package/dist/src/config/index.js +3 -3
  165. package/dist/src/config/integration.d.ts +1 -1
  166. package/dist/src/config/reload.js +1 -1
  167. package/dist/src/config/rules.js +3 -3
  168. package/dist/src/config/schema.d.ts +187 -452
  169. package/dist/src/config/schema.js +53 -131
  170. package/dist/src/extensions/activation-context.js +7 -11
  171. package/dist/src/files/file-service.d.ts +36 -0
  172. package/dist/src/files/file-service.js +282 -0
  173. package/dist/src/gateway/agent-builtin-tools.d.ts +250 -6
  174. package/dist/src/gateway/agent-builtin-tools.js +284 -46
  175. package/dist/src/gateway/agents-admin.d.ts +20 -62
  176. package/dist/src/gateway/agents-admin.js +36 -228
  177. package/dist/src/gateway/device-routes.d.ts +3 -0
  178. package/dist/src/gateway/device-routes.js +47 -0
  179. package/dist/src/gateway/global-defaults-admin.d.ts +6 -20
  180. package/dist/src/gateway/global-defaults-admin.js +20 -120
  181. package/dist/src/gateway/heartbeat/service.js +1 -1
  182. package/dist/src/gateway/hono/app.js +6 -4
  183. package/dist/src/gateway/hono/lib/config-payload.d.ts +54 -137
  184. package/dist/src/gateway/hono/lib/config-payload.js +2 -4
  185. package/dist/src/gateway/hono/middleware/auth.js +33 -1
  186. package/dist/src/gateway/hono/middleware/scopes.d.ts +2 -12
  187. package/dist/src/gateway/hono/middleware/scopes.js +9 -18
  188. package/dist/src/gateway/hono/routes/agents.js +64 -100
  189. package/dist/src/gateway/hono/routes/connectors.js +1 -1
  190. package/dist/src/gateway/hono/routes/device-push.d.ts +2 -0
  191. package/dist/src/gateway/hono/routes/{mobile.js → device-push.js} +40 -18
  192. package/dist/src/gateway/hono/routes/devices.d.ts +4 -0
  193. package/dist/src/gateway/hono/routes/devices.js +214 -0
  194. package/dist/src/gateway/hono/routes/files.d.ts +3 -0
  195. package/dist/src/gateway/hono/routes/files.js +176 -0
  196. package/dist/src/gateway/hono/routes/global-defaults.js +5 -9
  197. package/dist/src/gateway/hono/routes/index.js +4 -2
  198. package/dist/src/gateway/hono/routes/lazy-bundles.js +12 -20
  199. package/dist/src/gateway/hono/routes/models.js +2 -2
  200. package/dist/src/gateway/hono/routes/projects.js +0 -508
  201. package/dist/src/gateway/hono/routes/realtime.js +8 -1
  202. package/dist/src/gateway/hono/routes/shares.js +410 -21
  203. package/dist/src/gateway/hono/routes/status.js +9 -16
  204. package/dist/src/gateway/hono/routes/tunnel.d.ts +0 -2
  205. package/dist/src/gateway/hono/routes/tunnel.js +10 -199
  206. package/dist/src/gateway/hono/routes/voice.js +1 -1
  207. package/dist/src/gateway/hono/routes/workspace.js +15 -974
  208. package/dist/src/gateway/image-generation-setup.d.ts +2 -2
  209. package/dist/src/gateway/image-generation-setup.js +8 -7
  210. package/dist/src/gateway/public-url.d.ts +1 -1
  211. package/dist/src/gateway/security/gateway-principal.d.ts +11 -0
  212. package/dist/src/gateway/security/gateway-principal.js +12 -0
  213. package/dist/src/gateway/security/gateway-scopes.d.ts +7 -0
  214. package/dist/src/gateway/security/gateway-scopes.js +66 -0
  215. package/dist/src/gateway/security/index.d.ts +2 -1
  216. package/dist/src/gateway/security/index.js +3 -2
  217. package/dist/src/gateway/service.js +4 -4
  218. package/dist/src/gateway/xopc-cloud-capability-setup.js +19 -21
  219. package/dist/src/heartbeat/index.js +1 -1
  220. package/dist/src/migrations/index.d.ts +0 -1
  221. package/dist/src/migrations/index.js +1 -2
  222. package/dist/src/migrations/runner.js +1 -2
  223. package/dist/src/notifications/device-store.d.ts +1 -1
  224. package/dist/src/notifications/device-store.js +11 -11
  225. package/dist/src/notifications/store.js +3 -3
  226. package/dist/src/providers/index.js +1 -1
  227. package/dist/src/providers/model-reference-auditor.js +14 -9
  228. package/dist/src/realtime/runtime.d.ts +2 -0
  229. package/dist/src/realtime/runtime.js +27 -3
  230. package/dist/src/realtime/tickets.d.ts +6 -1
  231. package/dist/src/realtime/tickets.js +2 -1
  232. package/dist/src/remote-access/exposure-manager.js +3 -3
  233. package/dist/src/share/hosted-session-share.d.ts +104 -0
  234. package/dist/src/share/hosted-session-share.js +276 -0
  235. package/dist/src/share/note-share-service.js +4 -24
  236. package/dist/src/share/session-share-projector.d.ts +31 -0
  237. package/dist/src/share/session-share-projector.js +79 -0
  238. package/dist/src/share/session-share-service.d.ts +89 -0
  239. package/dist/src/share/session-share-service.js +325 -0
  240. package/dist/src/share/share-asset-ticket.d.ts +7 -0
  241. package/dist/src/share/share-asset-ticket.js +30 -0
  242. package/dist/src/share/share-landing.d.ts +4 -3
  243. package/dist/src/share/share-landing.js +5 -5
  244. package/dist/src/share/share-store.d.ts +27 -2
  245. package/dist/src/share/share-store.js +71 -8
  246. package/dist/src/share/share-types.d.ts +17 -2
  247. package/dist/src/share/share-url.js +2 -2
  248. package/dist/src/storage/sqlite/device-access-repository.d.ts +54 -0
  249. package/dist/src/storage/sqlite/device-access-repository.js +194 -0
  250. package/dist/src/storage/sqlite/device-pairing-repository.d.ts +22 -0
  251. package/dist/src/storage/sqlite/device-pairing-repository.js +86 -0
  252. package/dist/src/storage/sqlite/gateway-identity-repository.d.ts +10 -0
  253. package/dist/src/storage/sqlite/gateway-identity-repository.js +50 -0
  254. package/dist/src/storage/sqlite/index.d.ts +3 -0
  255. package/dist/src/storage/sqlite/index.js +4 -1
  256. package/dist/src/storage/sqlite/migrations/138_device_access.sql +96 -0
  257. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  258. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  259. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  260. package/dist/src/storage/sqlite/schema.js +1 -1
  261. package/dist/src/tui/backends/embedded-backend.js +1 -1
  262. package/dist/src/tui/backends/gateway-realtime-backend.js +11 -3
  263. package/dist/src/tunnel/consent.d.ts +1 -1
  264. package/dist/src/tunnel/consent.js +1 -1
  265. package/dist/src/tunnel/gateway-lifecycle.js +1 -1
  266. package/dist/src/tunnel/index.d.ts +1 -4
  267. package/dist/src/tunnel/index.js +3 -5
  268. package/dist/src/tunnel/tunnel-audit.d.ts +1 -1
  269. package/dist/src/tunnel/tunnel-config.js +1 -1
  270. package/dist/src/tunnel/tunnel-service.d.ts +2 -3
  271. package/dist/src/tunnel/tunnel-service.js +1 -20
  272. package/dist/src/tunnel/tunnel-types.d.ts +0 -6
  273. package/dist/src/workflows/draft/workflow-draft-service.js +2 -2
  274. package/dist/src/workflows/service/workflow-run-service.js +3 -3
  275. package/package.json +3 -3
  276. package/dist/gateway/static/root/assets/agent-avatar-dicebear-Bp_wmuGW.js +0 -1
  277. package/dist/gateway/static/root/assets/agents-CKG93dlc.js +0 -68
  278. package/dist/gateway/static/root/assets/api-BywYxpaS.js +0 -1
  279. package/dist/gateway/static/root/assets/automations-workspace-BNFAfNwC.js +0 -6
  280. package/dist/gateway/static/root/assets/browser-settings-page-Cg6NgwE_.js +0 -8
  281. package/dist/gateway/static/root/assets/browser-workflow-inputs-8NC2qDRF.js +0 -1
  282. package/dist/gateway/static/root/assets/capabilities-settings-panel-NvJKgF1u.js +0 -7
  283. package/dist/gateway/static/root/assets/capability-presets-api-o0y9WgAI.js +0 -1
  284. package/dist/gateway/static/root/assets/capability-presets-settings-panel-C2uBdALe.js +0 -3
  285. package/dist/gateway/static/root/assets/channels-settings-CIcYKMEs.js +0 -1
  286. package/dist/gateway/static/root/assets/channels-status-swr-38FsOnR0.js +0 -1
  287. package/dist/gateway/static/root/assets/connectors-page-CEEcmUiP.js +0 -2
  288. package/dist/gateway/static/root/assets/cron-expression-Cs_5pUPT.js +0 -2
  289. package/dist/gateway/static/root/assets/date-picker-y1kWrFVU.js +0 -1
  290. package/dist/gateway/static/root/assets/dependency-picker-skc62zrn.js +0 -1
  291. package/dist/gateway/static/root/assets/directory-picker-path-field-V8vZP0Dy.js +0 -1
  292. package/dist/gateway/static/root/assets/dist-J_ySZvz0.js +0 -1
  293. package/dist/gateway/static/root/assets/extension-settings-page-BgSV0Nny.js +0 -1
  294. package/dist/gateway/static/root/assets/file-code-corner-byQA1VfD.js +0 -1
  295. package/dist/gateway/static/root/assets/gateway-config-swr-BWGjnmDl.js +0 -1
  296. package/dist/gateway/static/root/assets/heartbeat-settings-Pxqk5GFH.js +0 -1
  297. package/dist/gateway/static/root/assets/home-page-1xjo6wE4.js +0 -1
  298. package/dist/gateway/static/root/assets/html-workspace-editor-bXK5tq64.js +0 -1
  299. package/dist/gateway/static/root/assets/index-Bbd_dXui.js +0 -70
  300. package/dist/gateway/static/root/assets/index-D_hrEKXM.css +0 -2
  301. package/dist/gateway/static/root/assets/local-app-workbench-page-heQ4-PJ7.js +0 -2
  302. package/dist/gateway/static/root/assets/locale-store-CXhjfe4q.js +0 -1
  303. package/dist/gateway/static/root/assets/logs-page-BblnS6Jy.js +0 -2
  304. package/dist/gateway/static/root/assets/management-settings-B8hM56HS.js +0 -1
  305. package/dist/gateway/static/root/assets/markdown-editor-TWGaF7Xa.js +0 -2
  306. package/dist/gateway/static/root/assets/markdown-split-DRbZjxMK.js +0 -1
  307. package/dist/gateway/static/root/assets/markdown-view-CLzTdVLW.css +0 -1
  308. package/dist/gateway/static/root/assets/messages-BMdD0LWk.js +0 -3
  309. package/dist/gateway/static/root/assets/notes-workbench-CAM09C8b.js +0 -4
  310. package/dist/gateway/static/root/assets/popover-select-CccGri5Y.js +0 -1
  311. package/dist/gateway/static/root/assets/project-detail-page-BIPIwgU2.js +0 -1
  312. package/dist/gateway/static/root/assets/projects-page-B_kzTn1K.js +0 -1
  313. package/dist/gateway/static/root/assets/remote-access-hub-CtD8DsD-.js +0 -1
  314. package/dist/gateway/static/root/assets/sessions-page-B8n9HI1y.js +0 -1
  315. package/dist/gateway/static/root/assets/settings-advanced-gate-xlhdRTME.js +0 -1
  316. package/dist/gateway/static/root/assets/settings-loading-skeleton-B5GU7iCG.js +0 -1
  317. package/dist/gateway/static/root/assets/settings-page-Dd-BRu12.js +0 -1
  318. package/dist/gateway/static/root/assets/setup-status-panel-CwEFAVWx.js +0 -1
  319. package/dist/gateway/static/root/assets/share-preview-page-DzXw9UQJ.js +0 -2
  320. package/dist/gateway/static/root/assets/shares-settings-Bk6UQOwS.js +0 -1
  321. package/dist/gateway/static/root/assets/skill-reload-api-DrmQZ3Au.js +0 -1
  322. package/dist/gateway/static/root/assets/task-detail-page-CW2sJbdc.js +0 -1
  323. package/dist/gateway/static/root/assets/theme-store-DOdCjyuw.js +0 -1
  324. package/dist/gateway/static/root/assets/typed-models-lib-q5-Vfqd8.js +0 -1
  325. package/dist/gateway/static/root/assets/user-context-page-Bq9KB-Oj.js +0 -1
  326. package/dist/gateway/static/root/assets/voice-api-key-field-DtTIF6M8.js +0 -1
  327. package/dist/gateway/static/root/assets/workflows-page-CcbGEQol.js +0 -5
  328. package/dist/src/agent-manifest/index.d.ts +0 -5
  329. package/dist/src/agent-manifest/index.js +0 -10
  330. package/dist/src/agent-manifest/preset-chain.d.ts +0 -10
  331. package/dist/src/agent-manifest/preset-chain.js +0 -30
  332. package/dist/src/agent-manifest/prompt.d.ts +0 -2
  333. package/dist/src/agent-manifest/prompt.js +0 -49
  334. package/dist/src/agent-manifest/resolver.d.ts +0 -32
  335. package/dist/src/agent-manifest/resolver.js +0 -114
  336. package/dist/src/agent-manifest/schema.d.ts +0 -695
  337. package/dist/src/agent-manifest/schema.js +0 -226
  338. package/dist/src/agent-manifest/validator.d.ts +0 -25
  339. package/dist/src/agent-manifest/validator.js +0 -74
  340. package/dist/src/agent-runtime/boundary-guard.d.ts +0 -12
  341. package/dist/src/agent-runtime/boundary-guard.js +0 -21
  342. package/dist/src/agent-runtime/index.d.ts +0 -7
  343. package/dist/src/agent-runtime/index.js +0 -8
  344. package/dist/src/agent-runtime/model-router.d.ts +0 -11
  345. package/dist/src/agent-runtime/model-router.js +0 -14
  346. package/dist/src/agent-runtime/run-trace.d.ts +0 -27
  347. package/dist/src/agent-runtime/run-trace.js +0 -51
  348. package/dist/src/agent-runtime/runtime-profile.d.ts +0 -26
  349. package/dist/src/agent-runtime/runtime-profile.js +0 -42
  350. package/dist/src/agent-runtime/tool-registry.d.ts +0 -28
  351. package/dist/src/agent-runtime/tool-registry.js +0 -50
  352. package/dist/src/agent-runtime/workflow-runtime.d.ts +0 -31
  353. package/dist/src/agent-runtime/workflow-runtime.js +0 -32
  354. package/dist/src/config/agent-typed-models.d.ts +0 -13
  355. package/dist/src/config/agent-typed-models.js +0 -48
  356. package/dist/src/gateway/capability-presets-admin.d.ts +0 -88
  357. package/dist/src/gateway/capability-presets-admin.js +0 -303
  358. package/dist/src/gateway/file-path-classifier.d.ts +0 -30
  359. package/dist/src/gateway/file-path-classifier.js +0 -105
  360. package/dist/src/gateway/file-reference-errors.d.ts +0 -6
  361. package/dist/src/gateway/file-reference-errors.js +0 -21
  362. package/dist/src/gateway/file-reference-registry.d.ts +0 -34
  363. package/dist/src/gateway/file-reference-registry.js +0 -45
  364. package/dist/src/gateway/hono/lib/agent-model.d.ts +0 -35
  365. package/dist/src/gateway/hono/lib/agent-model.js +0 -97
  366. package/dist/src/gateway/hono/routes/capability-presets.d.ts +0 -3
  367. package/dist/src/gateway/hono/routes/capability-presets.js +0 -187
  368. package/dist/src/gateway/hono/routes/mobile.d.ts +0 -3
  369. package/dist/src/gateway/security/operator-scopes.d.ts +0 -37
  370. package/dist/src/gateway/security/operator-scopes.js +0 -147
  371. package/dist/src/migrations/config/default-capability-preset.d.ts +0 -10
  372. package/dist/src/migrations/config/default-capability-preset.js +0 -133
  373. package/dist/src/tunnel/enable-lan-pairing.d.ts +0 -8
  374. package/dist/src/tunnel/enable-lan-pairing.js +0 -41
  375. package/dist/src/tunnel/pair-context.d.ts +0 -36
  376. package/dist/src/tunnel/pair-context.js +0 -77
  377. package/dist/src/tunnel/pair-url.d.ts +0 -43
  378. package/dist/src/tunnel/pair-url.js +0 -117
  379. package/dist/src/tunnel/pairing-rate-limit.d.ts +0 -12
  380. package/dist/src/tunnel/pairing-rate-limit.js +0 -28
  381. package/dist/src/tunnel/pairing.d.ts +0 -21
  382. package/dist/src/tunnel/pairing.js +0 -103
  383. package/dist/src/tunnel/tunnel-qr.d.ts +0 -9
  384. package/dist/src/tunnel/tunnel-qr.js +0 -29
@@ -0,0 +1,104 @@
1
+ import { CredentialResolver } from '../auth/credentials.js';
2
+ import { type SessionShareMessage, type SessionShareToolActivity } from './session-share-projector.js';
3
+ import { type SessionShareSource } from './session-share-service.js';
4
+ export interface HostedSessionShareManifest {
5
+ schemaVersion: 1;
6
+ title: string;
7
+ snapshotAt: string;
8
+ description?: string;
9
+ messages: SessionShareMessage[];
10
+ toolActivities: SessionShareToolActivity[];
11
+ attachments: Array<{
12
+ id: string;
13
+ messageId: string;
14
+ fileName: string;
15
+ mimeType: string;
16
+ size: number;
17
+ sha256: string;
18
+ }>;
19
+ }
20
+ export interface HostedSessionShareSnapshot {
21
+ sessionId: string;
22
+ cutoffSeq: number;
23
+ manifest: HostedSessionShareManifest;
24
+ assets: Array<{
25
+ id: string;
26
+ path: string;
27
+ size: number;
28
+ }>;
29
+ }
30
+ export interface BuildHostedSessionShareInput {
31
+ expectedSessionId: string;
32
+ expectedCutoffSeq: number;
33
+ expectedMetadataUpdatedAt: string;
34
+ description?: string;
35
+ includeToolActivities?: boolean;
36
+ attachmentIds?: string[];
37
+ }
38
+ export declare class HostedSessionShareBuilder {
39
+ private readonly source;
40
+ constructor(source: SessionShareSource);
41
+ build(sessionKey: string, input: BuildHostedSessionShareInput): Promise<HostedSessionShareSnapshot>;
42
+ private loadExpectedSource;
43
+ }
44
+ export interface HostedShareResult {
45
+ id: string;
46
+ shareUrl: string;
47
+ expiresAt: string;
48
+ maxViews: number | null;
49
+ viewCount: number;
50
+ snapshotRevision: number;
51
+ }
52
+ type OwnerShare = {
53
+ id: string;
54
+ title: string;
55
+ description: string | null;
56
+ status: 'staging' | 'active' | 'revoked';
57
+ revision: number | null;
58
+ expiresAt: string;
59
+ maxViews: number | null;
60
+ viewCount: number;
61
+ createdAt: string;
62
+ updatedAt: string;
63
+ };
64
+ export declare class HostedSessionSharePublisher {
65
+ private readonly credentials;
66
+ private readonly fetchImpl;
67
+ private readonly baseUrl;
68
+ constructor(baseUrl?: string, credentials?: CredentialResolver, fetchImpl?: typeof fetch);
69
+ create(snapshot: HostedSessionShareSnapshot, lifecycle: {
70
+ ttlMs: number;
71
+ maxViews: number | null;
72
+ }): Promise<HostedShareResult>;
73
+ refresh(shareId: string, expectedRevision: number, publicUrl: string, snapshot: HostedSessionShareSnapshot): Promise<HostedShareResult>;
74
+ list(): Promise<OwnerShare[]>;
75
+ revoke(shareId: string): Promise<void>;
76
+ private uploadAssets;
77
+ private request;
78
+ }
79
+ export declare class HostedShareAuthorizationError extends Error {
80
+ constructor();
81
+ }
82
+ export interface HostedShareBinding extends HostedShareResult {
83
+ sessionId: string;
84
+ cutoffSeq: number;
85
+ title: string;
86
+ description: string | null;
87
+ messageCount: number;
88
+ attachmentCount: number;
89
+ includeToolActivities: boolean;
90
+ attachmentIds: string[];
91
+ createdAt: string;
92
+ updatedAt: string;
93
+ revoked: boolean;
94
+ }
95
+ export declare class HostedShareBindingStore {
96
+ private readonly path;
97
+ private pending;
98
+ list(sessionId: string): Promise<HostedShareBinding[]>;
99
+ upsert(binding: HostedShareBinding): Promise<void>;
100
+ reconcile(remote: OwnerShare[]): Promise<void>;
101
+ private mutate;
102
+ private read;
103
+ }
104
+ export {};
@@ -0,0 +1,276 @@
1
+ import { resolveStateDir } from "../config/paths-state.js";
2
+ import { init_paths } from "../config/paths.js";
3
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
4
+ import { CredentialResolver, init_credentials } from "../auth/credentials.js";
5
+ import { resolveMediaReference } from "../media/media-reference.js";
6
+ import { projectSessionShare } from "./session-share-projector.js";
7
+ import { SessionShareSnapshotConflictError } from "./session-share-service.js";
8
+ import { basename, dirname, join } from "node:path";
9
+ import { createReadStream } from "node:fs";
10
+ import { createHash, randomBytes, randomUUID } from "node:crypto";
11
+ import { mkdir, readFile, stat } from "node:fs/promises";
12
+ //#region src/share/hosted-session-share.ts
13
+ init_credentials();
14
+ init_paths();
15
+ init_write_file_atomic();
16
+ const DEFAULT_SHARE_URL = "https://share.xopc.ai";
17
+ const MAX_MESSAGES = 1e4;
18
+ const MAX_ATTACHMENTS = 20;
19
+ const MAX_ATTACHMENT_BYTES = 32 * 1024 * 1024;
20
+ const MAX_TOTAL_ATTACHMENT_BYTES = 100 * 1024 * 1024;
21
+ const ALLOWED_MIME_TYPES = new Set([
22
+ "image/png",
23
+ "image/jpeg",
24
+ "image/gif",
25
+ "image/webp",
26
+ "audio/mpeg",
27
+ "audio/mp4",
28
+ "audio/wav",
29
+ "audio/ogg",
30
+ "audio/webm",
31
+ "video/mp4",
32
+ "video/webm",
33
+ "video/quicktime",
34
+ "application/pdf",
35
+ "text/plain",
36
+ "text/markdown"
37
+ ]);
38
+ var HostedSessionShareBuilder = class {
39
+ constructor(source) {
40
+ this.source = source;
41
+ }
42
+ async build(sessionKey, input) {
43
+ const source = await this.loadExpectedSource(sessionKey, input);
44
+ const projection = projectSessionShare(source.snapshot.entries);
45
+ if (projection.messages.length === 0) throw new Error("Session has no shareable messages");
46
+ if (projection.messages.length > MAX_MESSAGES) throw new Error(`Session has more than ${MAX_MESSAGES} shareable messages`);
47
+ const selected = [...new Set(input.attachmentIds ?? [])];
48
+ if (selected.length > MAX_ATTACHMENTS) throw new Error(`Select at most ${MAX_ATTACHMENTS} attachments`);
49
+ const candidates = new Map(projection.attachmentCandidates.map((candidate) => [candidate.id, candidate]));
50
+ const attachments = [];
51
+ const assets = [];
52
+ let totalSize = 0;
53
+ for (const id of selected) {
54
+ const candidate = candidates.get(id);
55
+ const uri = projection.attachmentUris.get(id);
56
+ if (!candidate || !uri) throw new Error(`Attachment is not part of this session snapshot: ${id}`);
57
+ const mimeType = normalizeMimeType(candidate.mimeType);
58
+ if (!ALLOWED_MIME_TYPES.has(mimeType)) throw new Error(`Attachment type is not supported for hosted sharing: ${candidate.fileName}`);
59
+ const resolved = await resolveMediaReference(uri);
60
+ const sourceStat = await stat(resolved.path);
61
+ if (!sourceStat.isFile()) throw new Error(`Attachment is not a file: ${candidate.fileName}`);
62
+ if (sourceStat.size > MAX_ATTACHMENT_BYTES) throw new Error(`Attachment is too large: ${candidate.fileName}`);
63
+ totalSize += sourceStat.size;
64
+ if (totalSize > MAX_TOTAL_ATTACHMENT_BYTES) throw new Error("Selected attachments are too large");
65
+ attachments.push({
66
+ id,
67
+ messageId: candidate.messageId,
68
+ fileName: publicFileName(candidate.fileName),
69
+ mimeType,
70
+ size: sourceStat.size,
71
+ sha256: await checksumFile(resolved.path)
72
+ });
73
+ assets.push({
74
+ id,
75
+ path: resolved.path,
76
+ size: sourceStat.size
77
+ });
78
+ }
79
+ const selectedIds = new Set(selected);
80
+ return {
81
+ sessionId: source.snapshot.sessionId,
82
+ cutoffSeq: source.snapshot.lastSeq,
83
+ manifest: {
84
+ schemaVersion: 1,
85
+ title: (source.metadata.name?.trim() || "Shared conversation").slice(0, 200),
86
+ snapshotAt: (/* @__PURE__ */ new Date()).toISOString(),
87
+ ...input.description?.trim() ? { description: input.description.trim().slice(0, 1e3) } : {},
88
+ messages: projection.messages.map((message) => ({
89
+ ...message,
90
+ attachmentIds: message.attachmentIds.filter((id) => selectedIds.has(id))
91
+ })),
92
+ toolActivities: input.includeToolActivities ? projection.toolActivities : [],
93
+ attachments
94
+ },
95
+ assets
96
+ };
97
+ }
98
+ async loadExpectedSource(sessionKey, expected) {
99
+ const [metadata, snapshot] = await Promise.all([this.source.getMetadata(sessionKey), this.source.getSnapshot(sessionKey)]);
100
+ if (!metadata || !snapshot || !metadata.sessionId || metadata.sessionId !== snapshot.sessionId) throw new Error("Session not found");
101
+ if (snapshot.sessionId !== expected.expectedSessionId || snapshot.lastSeq !== expected.expectedCutoffSeq || metadata.updatedAt !== expected.expectedMetadataUpdatedAt) throw new SessionShareSnapshotConflictError();
102
+ return {
103
+ metadata,
104
+ snapshot
105
+ };
106
+ }
107
+ };
108
+ var HostedSessionSharePublisher = class {
109
+ baseUrl;
110
+ constructor(baseUrl = process.env.XOPC_SHARE_URL ?? DEFAULT_SHARE_URL, credentials = new CredentialResolver(), fetchImpl = fetch) {
111
+ this.credentials = credentials;
112
+ this.fetchImpl = fetchImpl;
113
+ this.baseUrl = baseUrl.replace(/\/+$/, "");
114
+ }
115
+ async create(snapshot, lifecycle) {
116
+ const publicToken = randomBytes(32).toString("base64url");
117
+ const draft = await this.request("/api/v1/session-shares", {
118
+ method: "POST",
119
+ headers: { "Idempotency-Key": `xopc-${randomUUID()}` },
120
+ body: JSON.stringify({
121
+ publicToken,
122
+ manifest: snapshot.manifest,
123
+ ...lifecycle
124
+ })
125
+ });
126
+ await this.uploadAssets(draft, snapshot.assets);
127
+ const finalized = await this.request(`/api/v1/session-shares/${encodeURIComponent(draft.shareId)}/uploads/${encodeURIComponent(draft.uploadId)}/finalize`, { method: "POST" });
128
+ if (!draft.publicUrl) throw new Error("Hosted Share did not return a public URL");
129
+ return toResult(finalized.item, draft.publicUrl);
130
+ }
131
+ async refresh(shareId, expectedRevision, publicUrl, snapshot) {
132
+ const draft = await this.request(`/api/v1/session-shares/${encodeURIComponent(shareId)}/revisions`, {
133
+ method: "POST",
134
+ headers: { "Idempotency-Key": `xopc-${randomUUID()}` },
135
+ body: JSON.stringify({
136
+ expectedRevision,
137
+ manifest: snapshot.manifest
138
+ })
139
+ });
140
+ await this.uploadAssets(draft, snapshot.assets);
141
+ return toResult((await this.request(`/api/v1/session-shares/${encodeURIComponent(shareId)}/uploads/${encodeURIComponent(draft.uploadId)}/finalize`, { method: "POST" })).item, publicUrl);
142
+ }
143
+ async list() {
144
+ return (await this.request("/api/v1/session-shares")).items;
145
+ }
146
+ async revoke(shareId) {
147
+ await this.request(`/api/v1/session-shares/${encodeURIComponent(shareId)}`, { method: "DELETE" });
148
+ }
149
+ async uploadAssets(draft, assets) {
150
+ const uploads = new Map(draft.assetUploads.map((upload) => [upload.assetId, upload.uploadUrl]));
151
+ for (const asset of assets) {
152
+ const uploadUrl = uploads.get(asset.id);
153
+ if (!uploadUrl) throw new Error(`Hosted Share did not accept attachment: ${asset.id}`);
154
+ const bytes = await readFile(asset.path);
155
+ if (bytes.byteLength !== asset.size) throw new Error(`Attachment changed during upload: ${asset.id}`);
156
+ await this.request(uploadUrl, {
157
+ method: "PUT",
158
+ headers: {
159
+ "Content-Length": String(bytes.byteLength),
160
+ "Content-Type": "application/octet-stream"
161
+ },
162
+ body: bytes
163
+ });
164
+ }
165
+ }
166
+ async request(path, init = {}) {
167
+ const token = await this.credentials.loadOAuthToken("xopc-share");
168
+ if (!token) throw new HostedShareAuthorizationError();
169
+ const url = new URL(path, `${this.baseUrl}/`);
170
+ if (url.origin !== new URL(this.baseUrl).origin) throw new Error("Hosted Share returned an invalid upload URL");
171
+ const response = await this.fetchImpl(url, {
172
+ ...init,
173
+ headers: {
174
+ Accept: "application/json",
175
+ ...init.body && !init.headers?.["Content-Type"] ? { "Content-Type": "application/json" } : {},
176
+ ...init.headers,
177
+ Authorization: `Bearer ${token.access}`
178
+ },
179
+ signal: init.signal ?? AbortSignal.timeout(12e4)
180
+ });
181
+ const body = await response.json().catch(() => ({}));
182
+ if (response.status === 401) throw new HostedShareAuthorizationError();
183
+ if (!response.ok) throw new Error(body.error?.message || `Hosted Share request failed (${response.status})`);
184
+ return body;
185
+ }
186
+ };
187
+ var HostedShareAuthorizationError = class extends Error {
188
+ constructor() {
189
+ super("Connect XOPC Hosted Share before publishing");
190
+ this.name = "HostedShareAuthorizationError";
191
+ }
192
+ };
193
+ var HostedShareBindingStore = class {
194
+ path = join(resolveStateDir(), "hosted-share-bindings.json");
195
+ pending = Promise.resolve();
196
+ async list(sessionId) {
197
+ return (await this.read()).items.filter((item) => item.sessionId === sessionId).sort((a, b) => b.createdAt.localeCompare(a.createdAt));
198
+ }
199
+ async upsert(binding) {
200
+ await this.mutate((file) => {
201
+ const index = file.items.findIndex((item) => item.id === binding.id);
202
+ if (index === -1) file.items.push(binding);
203
+ else file.items[index] = binding;
204
+ });
205
+ }
206
+ async reconcile(remote) {
207
+ const byId = new Map(remote.map((item) => [item.id, item]));
208
+ await this.mutate((file) => {
209
+ file.items = file.items.map((binding) => {
210
+ const item = byId.get(binding.id);
211
+ return item ? {
212
+ ...binding,
213
+ expiresAt: item.expiresAt,
214
+ maxViews: item.maxViews,
215
+ viewCount: item.viewCount,
216
+ snapshotRevision: item.revision ?? binding.snapshotRevision,
217
+ title: item.title,
218
+ description: item.description,
219
+ updatedAt: item.updatedAt,
220
+ revoked: item.status === "revoked"
221
+ } : binding;
222
+ });
223
+ });
224
+ }
225
+ async mutate(update) {
226
+ const operation = this.pending.then(async () => {
227
+ const file = await this.read();
228
+ update(file);
229
+ await mkdir(dirname(this.path), { recursive: true });
230
+ await writeTextAtomic(this.path, `${JSON.stringify(file, null, 2)}\n`);
231
+ });
232
+ this.pending = operation.catch(() => void 0);
233
+ await operation;
234
+ }
235
+ async read() {
236
+ try {
237
+ const parsed = JSON.parse(await readFile(this.path, "utf8"));
238
+ return parsed.version === 1 && Array.isArray(parsed.items) ? {
239
+ version: 1,
240
+ items: parsed.items
241
+ } : {
242
+ version: 1,
243
+ items: []
244
+ };
245
+ } catch {
246
+ return {
247
+ version: 1,
248
+ items: []
249
+ };
250
+ }
251
+ }
252
+ };
253
+ function toResult(item, shareUrl) {
254
+ if (!item.revision) throw new Error("Hosted Share revision was not activated");
255
+ return {
256
+ id: item.id,
257
+ shareUrl,
258
+ expiresAt: item.expiresAt,
259
+ maxViews: item.maxViews,
260
+ viewCount: item.viewCount,
261
+ snapshotRevision: item.revision
262
+ };
263
+ }
264
+ function normalizeMimeType(value) {
265
+ return value.split(";")[0]?.trim().toLowerCase() ?? "";
266
+ }
267
+ function publicFileName(value) {
268
+ return basename(value.replaceAll("\\", "/")).replace(/[\u0000-\u001f\u007f]/g, "_").trim().slice(0, 200) || "attachment";
269
+ }
270
+ async function checksumFile(path) {
271
+ const hash = createHash("sha256");
272
+ for await (const chunk of createReadStream(path)) hash.update(chunk);
273
+ return hash.digest("hex");
274
+ }
275
+ //#endregion
276
+ export { HostedSessionShareBuilder, HostedSessionSharePublisher, HostedShareAuthorizationError, HostedShareBindingStore };
@@ -3,8 +3,9 @@ import { createLogger } from "../utils/logger/index.js";
3
3
  import { init_logger } from "../utils/logger.js";
4
4
  import { init_paths } from "../config/paths.js";
5
5
  import { collectReferencedAttachmentIds } from "../notes/note-attachment-sync.js";
6
+ import { issueShareAssetTicket, verifyShareAssetTicket } from "./share-asset-ticket.js";
6
7
  import { dirname, join } from "node:path";
7
- import { createHash, createHmac, randomUUID, timingSafeEqual } from "node:crypto";
8
+ import { createHash, randomUUID } from "node:crypto";
8
9
  import { copyFile, mkdir, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
9
10
  //#region src/share/note-share-service.ts
10
11
  init_paths();
@@ -113,31 +114,10 @@ var NoteShareService = class {
113
114
  return manifest;
114
115
  }
115
116
  issueAssetTicket(record) {
116
- const expiresAt = Date.now() + this.store.getConfig().note.assetTicketTtlMs;
117
- const payload = Buffer.from(JSON.stringify({
118
- shareId: record.id,
119
- revision: record.snapshotRevision,
120
- expiresAt
121
- })).toString("base64url");
122
- return `${payload}.${createHmac("sha256", record.assetTicketSecret).update(payload).digest("base64url")}`;
117
+ return issueShareAssetTicket(record, this.store.getConfig().note.assetTicketTtlMs);
123
118
  }
124
119
  verifyAssetTicket(record, ticket) {
125
- const [payload, signature] = ticket.split(".");
126
- if (!payload || !signature) return false;
127
- const expected = createHmac("sha256", record.assetTicketSecret).update(payload).digest();
128
- let actual;
129
- try {
130
- actual = Buffer.from(signature, "base64url");
131
- } catch {
132
- return false;
133
- }
134
- if (actual.length !== expected.length || !timingSafeEqual(actual, expected)) return false;
135
- try {
136
- const value = JSON.parse(Buffer.from(payload, "base64url").toString("utf8"));
137
- return value.shareId === record.id && value.revision === record.snapshotRevision && typeof value.expiresAt === "number" && Date.now() < value.expiresAt;
138
- } catch {
139
- return false;
140
- }
120
+ return verifyShareAssetTicket(record, ticket);
141
121
  }
142
122
  async resolveAsset(record, attachmentId) {
143
123
  const attachment = (await this.readManifest(record)).attachments.find((item) => item.id === attachmentId);
@@ -0,0 +1,31 @@
1
+ import type { TranscriptSourceEntry } from '../storage/sqlite/index.js';
2
+ export interface SessionShareMessage {
3
+ id: string;
4
+ role: 'user' | 'assistant';
5
+ markdown: string;
6
+ createdAt: string;
7
+ attachmentIds: string[];
8
+ }
9
+ export interface SessionShareToolActivity {
10
+ id: string;
11
+ messageId?: string;
12
+ toolName: string;
13
+ status: 'completed' | 'failed';
14
+ createdAt: string;
15
+ }
16
+ export interface SessionShareAttachmentCandidate {
17
+ id: string;
18
+ messageId: string;
19
+ fileName: string;
20
+ mimeType: string;
21
+ size: number;
22
+ }
23
+ export interface SessionShareProjection {
24
+ messages: SessionShareMessage[];
25
+ toolActivities: SessionShareToolActivity[];
26
+ attachmentCandidates: SessionShareAttachmentCandidate[];
27
+ /** Internal lookup used only while copying explicitly selected media. */
28
+ attachmentUris: Map<string, string>;
29
+ }
30
+ /** Closed public projection. Tool arguments/results and raw media references never leave this boundary. */
31
+ export declare function projectSessionShare(entries: TranscriptSourceEntry[]): SessionShareProjection;
@@ -0,0 +1,79 @@
1
+ import { transcriptRowsToClientHistory } from "../session/client-history.js";
2
+ import { createHash } from "node:crypto";
3
+ //#region src/share/session-share-projector.ts
4
+ /** Closed public projection. Tool arguments/results and raw media references never leave this boundary. */
5
+ function projectSessionShare(entries) {
6
+ const history = transcriptRowsToClientHistory(entries.map((entry) => entry.row));
7
+ const messages = [];
8
+ const toolActivities = [];
9
+ const attachmentCandidates = [];
10
+ const attachmentUris = /* @__PURE__ */ new Map();
11
+ for (const item of history) {
12
+ const rowNumber = parseRowNumber(item.id);
13
+ const source = rowNumber === null ? void 0 : entries[rowNumber - 1];
14
+ const createdAt = new Date(source?.createdAt ?? item.timestamp ?? Date.now()).toISOString();
15
+ if (item.kind === "bash") {
16
+ if (item.bash?.exitCode === void 0) continue;
17
+ toolActivities.push({
18
+ id: `activity-${toolActivities.length + 1}`,
19
+ toolName: "shell",
20
+ status: item.bash?.exitCode === 0 ? "completed" : "failed",
21
+ createdAt
22
+ });
23
+ continue;
24
+ }
25
+ if (item.kind !== "message" || item.role !== "user" && item.role !== "assistant") continue;
26
+ const messageId = `message-${messages.length + 1}`;
27
+ const messageAttachmentIds = [];
28
+ for (const media of item.media ?? []) {
29
+ const uri = typeof media.uri === "string" ? media.uri.trim() : "";
30
+ if (!uri) continue;
31
+ const id = attachmentId(messageId, uri);
32
+ messageAttachmentIds.push(id);
33
+ if (attachmentUris.has(id)) continue;
34
+ attachmentUris.set(id, uri);
35
+ attachmentCandidates.push({
36
+ id,
37
+ messageId,
38
+ fileName: media.name?.trim() || "attachment",
39
+ mimeType: media.mimeType?.trim() || "application/octet-stream",
40
+ size: Number.isFinite(media.size) && media.size >= 0 ? media.size : 0
41
+ });
42
+ }
43
+ const hasMessage = Boolean(item.content.trim()) || messageAttachmentIds.length > 0;
44
+ if (hasMessage) messages.push({
45
+ id: messageId,
46
+ role: item.role,
47
+ markdown: item.content,
48
+ createdAt,
49
+ attachmentIds: messageAttachmentIds
50
+ });
51
+ if (item.role === "assistant") for (const tool of item.toolCalls ?? []) {
52
+ if (tool.result === void 0 && tool.isError === void 0) continue;
53
+ toolActivities.push({
54
+ id: `activity-${toolActivities.length + 1}`,
55
+ ...hasMessage ? { messageId } : {},
56
+ toolName: tool.name.trim().slice(0, 100) || "tool",
57
+ status: tool.isError ? "failed" : "completed",
58
+ createdAt
59
+ });
60
+ }
61
+ }
62
+ return {
63
+ messages,
64
+ toolActivities,
65
+ attachmentCandidates,
66
+ attachmentUris
67
+ };
68
+ }
69
+ function attachmentId(messageId, uri) {
70
+ return `attachment-${createHash("sha256").update(messageId).update("\0").update(uri).digest("hex").slice(0, 24)}`;
71
+ }
72
+ function parseRowNumber(id) {
73
+ const match = /^row-(\d+)$/.exec(id ?? "");
74
+ if (!match) return null;
75
+ const value = Number(match[1]);
76
+ return Number.isSafeInteger(value) && value > 0 ? value : null;
77
+ }
78
+ //#endregion
79
+ export { projectSessionShare };
@@ -0,0 +1,89 @@
1
+ import type { SessionMetadata } from '../session/types.js';
2
+ import type { CompactionSourceSnapshot } from '../storage/sqlite/index.js';
3
+ import { type SessionShareAttachmentCandidate, type SessionShareMessage, type SessionShareToolActivity } from './session-share-projector.js';
4
+ import type { ShareStore } from './share-store.js';
5
+ import type { SessionShareRecord } from './share-types.js';
6
+ export interface SessionShareManifestAttachment {
7
+ id: string;
8
+ messageId: string;
9
+ mimeType: string;
10
+ fileName: string;
11
+ size: number;
12
+ artifactFileName: string;
13
+ checksum: string;
14
+ }
15
+ export interface SessionShareManifest {
16
+ schemaVersion: 1;
17
+ shareId: string;
18
+ source: {
19
+ sessionId: string;
20
+ cutoffSeq: number;
21
+ };
22
+ title: string;
23
+ snapshotAt: string;
24
+ messages: SessionShareMessage[];
25
+ toolActivities: SessionShareToolActivity[];
26
+ attachments: SessionShareManifestAttachment[];
27
+ }
28
+ export interface SessionShareSource {
29
+ getMetadata(sessionKey: string): Promise<SessionMetadata | null>;
30
+ getSnapshot(sessionKey: string): Promise<CompactionSourceSnapshot | null>;
31
+ }
32
+ export interface SessionSharePreview {
33
+ sessionId: string;
34
+ cutoffSeq: number;
35
+ metadataUpdatedAt: string;
36
+ title: string;
37
+ snapshotAt: string;
38
+ messageCount: number;
39
+ messages: SessionShareMessage[];
40
+ toolActivities: SessionShareToolActivity[];
41
+ attachmentCandidates: SessionShareAttachmentCandidate[];
42
+ }
43
+ export interface CreateSessionShareInput {
44
+ expectedSessionId: string;
45
+ expectedCutoffSeq: number;
46
+ expectedMetadataUpdatedAt: string;
47
+ includeToolActivities?: boolean;
48
+ attachmentIds?: string[];
49
+ ttlMs?: number;
50
+ maxViews?: number | null;
51
+ description?: string;
52
+ gatewayTokenHash: string;
53
+ }
54
+ export interface RefreshSessionShareInput {
55
+ expectedSessionId: string;
56
+ expectedCutoffSeq: number;
57
+ expectedMetadataUpdatedAt: string;
58
+ includeToolActivities?: boolean;
59
+ attachmentIds?: string[];
60
+ }
61
+ export declare class SessionShareSnapshotConflictError extends Error {
62
+ constructor();
63
+ }
64
+ export declare class SessionShareService {
65
+ private readonly store;
66
+ private readonly source;
67
+ constructor(store: ShareStore, source: SessionShareSource);
68
+ preview(sessionKey: string): Promise<SessionSharePreview>;
69
+ create(sessionKey: string, input: CreateSessionShareInput): Promise<SessionShareRecord>;
70
+ refresh(sessionKey: string, shareId: string, input: RefreshSessionShareInput): Promise<SessionShareRecord>;
71
+ list(sessionId: string): SessionShareRecord[];
72
+ readManifest(record: SessionShareRecord): Promise<SessionShareManifest>;
73
+ issueAssetTicket(record: SessionShareRecord): string;
74
+ verifyAssetTicket(record: SessionShareRecord, ticket: string): boolean;
75
+ resolveAsset(record: SessionShareRecord, attachmentId: string): Promise<{
76
+ path: string;
77
+ attachment: SessionShareManifestAttachment;
78
+ } | null>;
79
+ removeArtifact(shareId: string): Promise<void>;
80
+ private loadExpectedSource;
81
+ private loadSource;
82
+ private buildManifestBase;
83
+ private createArtifact;
84
+ private writeArtifact;
85
+ private artifactRelativePath;
86
+ private artifactDir;
87
+ private validateMessages;
88
+ private validateManifestRelations;
89
+ }