@xopcai/xopc 0.0.235 → 0.0.239

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 (307) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  3. package/dist/extensions/feishu/src/schema/config-schema.d.ts +8 -8
  4. package/dist/extensions/telegram/src/config-schema.d.ts +8 -8
  5. package/dist/extensions/telegram/xopc.extension.json +1 -1
  6. package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
  7. package/dist/gateway/static/root/assets/{activity-store-BzswYHcj.js → activity-store-DLfkwJzZ.js} +1 -1
  8. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-dvh9aEm6.js → agent-avatar-dicebear-C1rtpjd7.js} +1 -1
  9. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-oW6wFuP9.js +1 -0
  10. package/dist/gateway/static/root/assets/agents-V-nDPOk2.js +1 -0
  11. package/dist/gateway/static/root/assets/{api-7zOtMbaE.js → api-IUm57Zse.js} +1 -1
  12. package/dist/gateway/static/root/assets/app-management-settings-panel-CRDnRN4G.js +1 -0
  13. package/dist/gateway/static/root/assets/appearance-settings-BCYZIKqQ.js +1 -0
  14. package/dist/gateway/static/root/assets/apps-page-dcvQDCvy.js +1 -0
  15. package/dist/gateway/static/root/assets/{archive-plugin-DawToDU8.js → archive-plugin-Bha1jUhj.js} +1 -1
  16. package/dist/gateway/static/root/assets/{attachment-load-DmBAKvsi.js → attachment-load-Bgfh7Ag2.js} +1 -1
  17. package/dist/gateway/static/root/assets/{automations-page-BGkF6XNH.js → automations-page-BdH131M0.js} +1 -1
  18. package/dist/gateway/static/root/assets/automations-workspace-BtwzQZAR.js +6 -0
  19. package/dist/gateway/static/root/assets/{binary-plugins-B-6Ski7l.js → binary-plugins-BwXg9na-.js} +1 -1
  20. package/dist/gateway/static/root/assets/{block-editor-BgeKQN1F.js → block-editor-BngtUSNv.js} +56 -56
  21. package/dist/gateway/static/root/assets/browser-settings-page-kfNOKQ2x.js +8 -0
  22. package/dist/gateway/static/root/assets/{browser-workflow-inputs-4ooVX-Tx.js → browser-workflow-inputs-CHHw7Ula.js} +1 -1
  23. package/dist/gateway/static/root/assets/{browser-workflows-page-D92g81lS.js → browser-workflows-page-Ael9sxrp.js} +2 -2
  24. package/dist/gateway/static/root/assets/capabilities-settings-panel-DOymgkUM.js +7 -0
  25. package/dist/gateway/static/root/assets/channels-settings-YscUvFub.js +1 -0
  26. package/dist/gateway/static/root/assets/{channels-status-swr-BDJvMnA_.js → channels-status-swr-CwUSKmeY.js} +1 -1
  27. package/dist/gateway/static/root/assets/chat-terminal-dock-DI0lYVKk.js +36 -0
  28. package/dist/gateway/static/root/assets/connectors-page-BtzCRQGz.js +2 -0
  29. package/dist/gateway/static/root/assets/{cron-expression-BYmr5ZuN.js → cron-expression-CLuvPZ3b.js} +1 -1
  30. package/dist/gateway/static/root/assets/{date-picker-FKL_b_S0.js → date-picker-D4QS8Zzn.js} +1 -1
  31. package/dist/gateway/static/root/assets/dependency-picker-DZn-RhEm.js +1 -0
  32. package/dist/gateway/static/root/assets/{desktop-pet-DOXjRTqK.js → desktop-pet-C6KqTQas.js} +1 -1
  33. package/dist/gateway/static/root/assets/desktop-pet-settings-Bov3XuPO.js +1 -0
  34. package/dist/gateway/static/root/assets/{extension-debug-page-BeJ1-5ID.js → extension-debug-page-DpeeYAjX.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-page-CncDndLS.js → extension-page-Cescx_be.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-settings-page-BxxL0HqU.js → extension-settings-page-C_ubW61U.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-config-api-Dc6A6HyJ.js → gateway-config-api-BM79X1jC.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-config-swr-R702lNJR.js → gateway-config-swr-DfMY-MLf.js} +1 -1
  39. package/dist/gateway/static/root/assets/gateway-settings-GV5KAj-l.js +1 -0
  40. package/dist/gateway/static/root/assets/{gateway-startup-retry-2rVSUvyw.js → gateway-startup-retry-S6aB0hVI.js} +1 -1
  41. package/dist/gateway/static/root/assets/heartbeat-settings-CZ1KeXXU.js +1 -0
  42. package/dist/gateway/static/root/assets/home-page-YdVal_8I.js +1 -0
  43. package/dist/gateway/static/root/assets/{image-generation-api-B28USRCK.js → image-generation-api-DOX5uq-R.js} +1 -1
  44. package/dist/gateway/static/root/assets/index-7GLgmvAm.css +2 -0
  45. package/dist/gateway/static/root/assets/index-DKP23eMn.js +70 -0
  46. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-Cwinks_5.js → keyboard-shortcuts-settings-Tn7xSeVT.js} +1 -1
  47. package/dist/gateway/static/root/assets/local-app-workbench-page-DCt7cbvK.js +2 -0
  48. package/dist/gateway/static/root/assets/local-apps-page-Co5_qKEQ.js +1 -0
  49. package/dist/gateway/static/root/assets/{locale-store-8k4mvYGL.js → locale-store-XDFAPNNu.js} +1 -1
  50. package/dist/gateway/static/root/assets/logs-page-ChfSQQSV.js +2 -0
  51. package/dist/gateway/static/root/assets/management-settings-DE0o5c7Y.js +1 -0
  52. package/dist/gateway/static/root/assets/{markdown-split-B6wQhwLV.js → markdown-split-CADkGbQi.js} +1 -1
  53. package/dist/gateway/static/root/assets/markdown-view-Y68dCxuc.css +1 -0
  54. package/dist/gateway/static/root/assets/markdown-view-v-O3cOpk.js +201 -0
  55. package/dist/gateway/static/root/assets/{media-plugins-BSEPuO76.js → media-plugins-mHodPaFz.js} +1 -1
  56. package/dist/gateway/static/root/assets/messages-B1HDp_j8.js +3 -0
  57. package/dist/gateway/static/root/assets/mobile-pairing-wizard-43FyMswX.js +1 -0
  58. package/dist/gateway/static/root/assets/models-hub-cache-Bngs8o1m.js +1 -0
  59. package/dist/gateway/static/root/assets/{notes-api-p2Pncp2B.js → notes-api-BMhFpRmW.js} +1 -1
  60. package/dist/gateway/static/root/assets/{notes-page-CPgbeO1u.js → notes-page-BMUyJStB.js} +1 -1
  61. package/dist/gateway/static/root/assets/notes-workbench-DjHIQneE.js +4 -0
  62. package/dist/gateway/static/root/assets/{oauth-api-DpLONwfK.js → oauth-api-B_pcOUfT.js} +1 -1
  63. package/dist/gateway/static/root/assets/popover-select-DBrVS3tZ.js +1 -0
  64. package/dist/gateway/static/root/assets/{product-delivery-tRr-7IxY.js → product-delivery-dUJgmBQZ.js} +1 -1
  65. package/dist/gateway/static/root/assets/product-open-page-B8cjLdm4.js +1 -0
  66. package/dist/gateway/static/root/assets/project-detail-page-CXD2pVgQ.js +1 -0
  67. package/dist/gateway/static/root/assets/projects-page-cqKqkTwG.js +1 -0
  68. package/dist/gateway/static/root/assets/{registry-api-B7b0LJgI.js → registry-api-DeVvBsl4.js} +1 -1
  69. package/dist/gateway/static/root/assets/remote-access-hub-UEinEd7d.js +1 -0
  70. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-D3TCJGy3.js → runtime-tools-settings-panel-ClCEmwPY.js} +1 -1
  71. package/dist/gateway/static/root/assets/{schema-form-DUAlwNoO.js → schema-form-0vcUqeqa.js} +1 -1
  72. package/dist/gateway/static/root/assets/sessions-page-Cc6ve-qc.js +1 -0
  73. package/dist/gateway/static/root/assets/settings-advanced-gate-_J5FSEYX.js +1 -0
  74. package/dist/gateway/static/root/assets/{settings-form-section-D7nQ3Lfu.js → settings-form-section-BkdLf_sS.js} +1 -1
  75. package/dist/gateway/static/root/assets/settings-loading-skeleton-CAmWMaOT.js +1 -0
  76. package/dist/gateway/static/root/assets/{settings-page-CMAkMc3I.js → settings-page-QBTaBpBn.js} +1 -1
  77. package/dist/gateway/static/root/assets/setup-status-panel-bQcSMkVr.js +1 -0
  78. package/dist/gateway/static/root/assets/share-preview-page-D_OuXnah.js +2 -0
  79. package/dist/gateway/static/root/assets/shares-settings-DJfcpok3.js +1 -0
  80. package/dist/gateway/static/root/assets/skeleton-BwbyijEw.js +1 -0
  81. package/dist/gateway/static/root/assets/skill-reload-api-Bbqp5HaH.js +1 -0
  82. package/dist/gateway/static/root/assets/{skills-page-DJRr5HFw.js → skills-page-BNcnmaTg.js} +1 -1
  83. package/dist/gateway/static/root/assets/{skills-page.utils-DcrBe39q.js → skills-page.utils-BWWcFShl.js} +1 -1
  84. package/dist/gateway/static/root/assets/system-settings-panel-BsH7b3B4.js +1 -0
  85. package/dist/gateway/static/root/assets/task-detail-page-CcAhyw2Z.js +1 -0
  86. package/dist/gateway/static/root/assets/{theme-store-CpcBI73Q.js → theme-store-5-XHH7F0.js} +1 -1
  87. package/dist/gateway/static/root/assets/tunnel-api-D5-Hggt3.js +1 -0
  88. package/dist/gateway/static/root/assets/{use-autosave-DDEypreQ.js → use-autosave-Dp1ycDa8.js} +1 -1
  89. package/dist/gateway/static/root/assets/user-context-page-Dd_oMNie.js +1 -0
  90. package/dist/gateway/static/root/assets/{voice-api-key-field-BLa_vdXE.js → voice-api-key-field-DhrQXH3c.js} +1 -1
  91. package/dist/gateway/static/root/assets/{voice-config-api-ynE-vY6I.js → voice-config-api-Bk_bVeGX.js} +1 -1
  92. package/dist/gateway/static/root/assets/{work-discovery-overlay-DS3w1Fyq.js → work-discovery-overlay-B7zKAPrb.js} +1 -1
  93. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-jQl_wmYC.js → workflow-run-setup-panel-Cek9K48F.js} +2 -2
  94. package/dist/gateway/static/root/assets/workflows-page-T2q2Mx6H.js +5 -0
  95. package/dist/gateway/static/root/index.html +18 -17
  96. package/dist/package.js +1 -1
  97. package/dist/packages/gateway-contract/src/device-pairing.js +39 -0
  98. package/dist/packages/gateway-contract/src/model-selection.js +7 -0
  99. package/dist/packages/gateway-contract/src/new-session.js +9 -2
  100. package/dist/packages/gateway-contract/src/turn-outcome.js +27 -2
  101. package/dist/src/agent/agent-manager.js +4 -4
  102. package/dist/src/agent/background-review/run-background-review.js +1 -1
  103. package/dist/src/agent/embedded/model-runtime.js +1 -1
  104. package/dist/src/agent/embedded/run-for-session.js +1 -1
  105. package/dist/src/agent/embedded/run-turn.js +5 -0
  106. package/dist/src/agent/image/tool-model-config.js +1 -1
  107. package/dist/src/agent/ipc/inbox.js +1 -1
  108. package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +1 -1
  109. package/dist/src/agent/models/manager.d.ts +3 -0
  110. package/dist/src/agent/models/manager.js +9 -0
  111. package/dist/src/agent/prompt/sections/tooling.js +1 -0
  112. package/dist/src/agent/service.js +2 -2
  113. package/dist/src/agent/session/session-config-service.d.ts +6 -2
  114. package/dist/src/agent/session/session-config-service.js +78 -17
  115. package/dist/src/agent/session/session-hydrator.d.ts +3 -4
  116. package/dist/src/agent/session/session-hydrator.js +19 -8
  117. package/dist/src/agent/session/session-inspector.d.ts +3 -1
  118. package/dist/src/agent/session/session-inspector.js +8 -4
  119. package/dist/src/agent/skills/hub-lock.js +1 -1
  120. package/dist/src/agent/tasks/task-judge-service.js +3 -3
  121. package/dist/src/agent/tools/exec-command.js +1 -0
  122. package/dist/src/agent/tools/publish-artifacts.d.ts +1 -0
  123. package/dist/src/agent/tools/publish-artifacts.js +15 -4
  124. package/dist/src/agent/tools/xopc-use-tool.js +4 -4
  125. package/dist/src/agent/transcript/thinking-types.d.ts +1 -1
  126. package/dist/src/agent/transcript/thinking-types.js +2 -0
  127. package/dist/src/agent-config/schema.d.ts +16 -16
  128. package/dist/src/ai-assist/text-assist.js +1 -1
  129. package/dist/src/auth/credentials.js +2 -2
  130. package/dist/src/auth/profiles/store.js +1 -1
  131. package/dist/src/auth/sync-provider-auth.js +2 -2
  132. package/dist/src/automations/domain/validation.d.ts +62 -62
  133. package/dist/src/automations/draft/automation-draft-validator.d.ts +10 -10
  134. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  135. package/dist/src/chat-commands/builtins/thinking.js +1 -0
  136. package/dist/src/cli/commands/channels.js +1 -1
  137. package/dist/src/cli/commands/connectors.js +1 -1
  138. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  139. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  140. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  141. package/dist/src/cli/commands/models.js +2 -2
  142. package/dist/src/cli/commands/onboard.js +1 -1
  143. package/dist/src/config/index.js +4 -4
  144. package/dist/src/config/loader.js +1 -1
  145. package/dist/src/config/models-json.d.ts +137 -11
  146. package/dist/src/config/models-json.js +29 -2
  147. package/dist/src/config/schema.d.ts +15 -15
  148. package/dist/src/execution-environments/git.d.ts +27 -0
  149. package/dist/src/execution-environments/git.js +125 -0
  150. package/dist/src/execution-environments/index.d.ts +7 -0
  151. package/dist/src/execution-environments/index.js +8 -0
  152. package/dist/src/execution-environments/local-worktree-manager.d.ts +37 -0
  153. package/dist/src/execution-environments/local-worktree-manager.js +322 -0
  154. package/dist/src/execution-environments/paths.d.ts +2 -0
  155. package/dist/src/execution-environments/paths.js +18 -0
  156. package/dist/src/execution-environments/session-environment-service.d.ts +22 -0
  157. package/dist/src/execution-environments/session-environment-service.js +73 -0
  158. package/dist/src/execution-environments/store.d.ts +13 -0
  159. package/dist/src/execution-environments/store.js +183 -0
  160. package/dist/src/execution-environments/subject.d.ts +2 -0
  161. package/dist/src/execution-environments/subject.js +12 -0
  162. package/dist/src/execution-environments/types.d.ts +74 -0
  163. package/dist/src/execution-environments/types.js +54 -0
  164. package/dist/src/extensions/lockfile.js +1 -1
  165. package/dist/src/extensions/sdk/index.js +1 -1
  166. package/dist/src/extensions/update.js +1 -1
  167. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  168. package/dist/src/gateway/agents-admin.js +1 -1
  169. package/dist/src/gateway/custom-image-providers.d.ts +1 -1
  170. package/dist/src/gateway/file-path-classifier.js +1 -1
  171. package/dist/src/gateway/heartbeat/service.js +1 -1
  172. package/dist/src/gateway/hono/lib/config-payload.d.ts +4 -4
  173. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  174. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  175. package/dist/src/gateway/hono/routes/chat-model-config.d.ts +34 -0
  176. package/dist/src/gateway/hono/routes/chat-model-config.js +42 -0
  177. package/dist/src/gateway/hono/routes/device-pairing-approval.d.ts +3 -0
  178. package/dist/src/gateway/hono/routes/device-pairing-approval.js +100 -0
  179. package/dist/src/gateway/hono/routes/devices.js +15 -8
  180. package/dist/src/gateway/hono/routes/execution-environments.d.ts +3 -0
  181. package/dist/src/gateway/hono/routes/execution-environments.js +136 -0
  182. package/dist/src/gateway/hono/routes/index.js +4 -0
  183. package/dist/src/gateway/hono/routes/mobile-privacy.d.ts +3 -0
  184. package/dist/src/gateway/hono/routes/mobile-privacy.js +13 -0
  185. package/dist/src/gateway/hono/routes/models.js +10 -1
  186. package/dist/src/gateway/hono/routes/projects.js +43 -4
  187. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +15 -1
  188. package/dist/src/gateway/hono/routes/session-input-handler.js +122 -52
  189. package/dist/src/gateway/hono/routes/sessions.js +105 -22
  190. package/dist/src/gateway/hono/routes/tasks.js +4 -12
  191. package/dist/src/gateway/mobile-privacy.d.ts +7 -0
  192. package/dist/src/gateway/mobile-privacy.js +102 -0
  193. package/dist/src/gateway/security/gateway-scopes.js +1 -0
  194. package/dist/src/gateway/service/agent-runner.d.ts +1 -1
  195. package/dist/src/gateway/service/config-coordinator.js +2 -2
  196. package/dist/src/gateway/service/session-input-coordinator.d.ts +2 -1
  197. package/dist/src/gateway/service/session-input-coordinator.js +14 -5
  198. package/dist/src/gateway/service/sessions-api.d.ts +4 -12
  199. package/dist/src/gateway/service/sessions-api.js +13 -0
  200. package/dist/src/gateway/service.d.ts +1 -1
  201. package/dist/src/gateway/service.js +8 -8
  202. package/dist/src/gateway/session-context-summary.d.ts +5 -0
  203. package/dist/src/gateway/session-context-summary.js +151 -0
  204. package/dist/src/heartbeat/index.js +1 -1
  205. package/dist/src/i18n/response-language.d.ts +1 -1
  206. package/dist/src/infra/update-runner.js +1 -1
  207. package/dist/src/projects/index.js +3 -3
  208. package/dist/src/projects/project-kind.d.ts +7 -0
  209. package/dist/src/projects/project-kind.js +6 -1
  210. package/dist/src/projects/project-service.js +10 -2
  211. package/dist/src/projects/project-store.d.ts +1 -0
  212. package/dist/src/projects/project-store.js +10 -7
  213. package/dist/src/projects/types.d.ts +4 -0
  214. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
  215. package/dist/src/providers/index.js +2 -2
  216. package/dist/src/providers/model-registry.js +3 -1
  217. package/dist/src/providers/model-thinking.d.ts +4 -0
  218. package/dist/src/providers/model-thinking.js +41 -0
  219. package/dist/src/providers/register-runtime-providers.js +1 -1
  220. package/dist/src/session/config-types.d.ts +1 -0
  221. package/dist/src/session/index.js +1 -1
  222. package/dist/src/session/model-config-lock.d.ts +2 -0
  223. package/dist/src/session/model-config-lock.js +14 -0
  224. package/dist/src/session/session-workspace.d.ts +2 -1
  225. package/dist/src/session/session-workspace.js +5 -1
  226. package/dist/src/session/store.js +1 -1
  227. package/dist/src/session/turn-outcome-projector.js +9 -9
  228. package/dist/src/share/hosted-session-share.js +1 -1
  229. package/dist/src/storage/sqlite/config-repository.js +6 -5
  230. package/dist/src/storage/sqlite/device-access-repository.d.ts +2 -0
  231. package/dist/src/storage/sqlite/device-access-repository.js +12 -2
  232. package/dist/src/storage/sqlite/device-pairing-approval.d.ts +19 -0
  233. package/dist/src/storage/sqlite/device-pairing-approval.js +154 -0
  234. package/dist/src/storage/sqlite/device-pairing-repository.d.ts +1 -1
  235. package/dist/src/storage/sqlite/device-pairing-repository.js +11 -4
  236. package/dist/src/storage/sqlite/index.js +2 -2
  237. package/dist/src/storage/sqlite/migrations/141_device_pairing_approval.sql +17 -0
  238. package/dist/src/storage/sqlite/migrations/142_session_input_instance.sql +1 -0
  239. package/dist/src/storage/sqlite/migrations/143_fixed_session_model.sql +1 -0
  240. package/dist/src/storage/sqlite/migrations/144_execution_environments.sql +59 -0
  241. package/dist/src/storage/sqlite/migrations/145_project_execution_mode.sql +5 -0
  242. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  243. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  244. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  245. package/dist/src/storage/sqlite/row-mappers.d.ts +1 -0
  246. package/dist/src/storage/sqlite/row-mappers.js +3 -2
  247. package/dist/src/storage/sqlite/schema.js +1 -1
  248. package/dist/src/storage/sqlite/session-input-repository.d.ts +5 -0
  249. package/dist/src/storage/sqlite/session-input-repository.js +15 -4
  250. package/dist/src/storage/sqlite/session-repository.js +1 -1
  251. package/dist/src/tasks/execution-context.d.ts +3 -1
  252. package/dist/src/tasks/execution-context.js +7 -2
  253. package/dist/src/tasks/home-query-service.js +2 -2
  254. package/dist/src/tui/backends/embedded-backend.js +2 -2
  255. package/dist/src/tui/components/thinking-selector.js +1 -0
  256. package/dist/src/tui/tui-settings.js +1 -1
  257. package/dist/src/tui/tui-startup-resources.js +1 -1
  258. package/dist/src/tui/tui.js +1 -1
  259. package/dist/src/user-context/config.d.ts +9 -9
  260. package/dist/src/work-discovery/service.d.ts +1 -1
  261. package/dist/src/workflows/service/workflow-run-service.js +2 -2
  262. package/package.json +3 -3
  263. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-B9tkmkUj.js +0 -1
  264. package/dist/gateway/static/root/assets/agents-DTXYo-7z.js +0 -1
  265. package/dist/gateway/static/root/assets/app-management-settings-panel-DXFTk7x6.js +0 -1
  266. package/dist/gateway/static/root/assets/appearance-settings-D-FD5SOq.js +0 -1
  267. package/dist/gateway/static/root/assets/apps-page-BT102W58.js +0 -1
  268. package/dist/gateway/static/root/assets/automations-workspace-BRb45-_R.js +0 -6
  269. package/dist/gateway/static/root/assets/browser-settings-page-BkRWxC7D.js +0 -8
  270. package/dist/gateway/static/root/assets/capabilities-settings-panel-DfT-vWTA.js +0 -7
  271. package/dist/gateway/static/root/assets/channels-settings-C9oGpLR0.js +0 -1
  272. package/dist/gateway/static/root/assets/chat-terminal-dock-C_9LUs7G.js +0 -36
  273. package/dist/gateway/static/root/assets/connectors-page-SJKV6SHT.js +0 -2
  274. package/dist/gateway/static/root/assets/dependency-picker-BP68vqBI.js +0 -1
  275. package/dist/gateway/static/root/assets/desktop-pet-settings-CuG2qYoY.js +0 -1
  276. package/dist/gateway/static/root/assets/gateway-settings-C2XcazGD.js +0 -1
  277. package/dist/gateway/static/root/assets/heartbeat-settings-BjUEqkkC.js +0 -1
  278. package/dist/gateway/static/root/assets/home-page-DTSjwfAQ.js +0 -1
  279. package/dist/gateway/static/root/assets/index-BTUuTnc9.css +0 -2
  280. package/dist/gateway/static/root/assets/index-DFfvY8IN.js +0 -70
  281. package/dist/gateway/static/root/assets/local-app-workbench-page-0wntj9mK.js +0 -2
  282. package/dist/gateway/static/root/assets/local-apps-page-WeKm5vZ0.js +0 -1
  283. package/dist/gateway/static/root/assets/logs-page-DFgJr7Zx.js +0 -2
  284. package/dist/gateway/static/root/assets/management-settings-8bEvKO0R.js +0 -1
  285. package/dist/gateway/static/root/assets/markdown-view-B1bGSQqt.css +0 -1
  286. package/dist/gateway/static/root/assets/markdown-view-D02mJdoU.js +0 -201
  287. package/dist/gateway/static/root/assets/messages-CoovNoMn.js +0 -3
  288. package/dist/gateway/static/root/assets/mobile-device-api-CvjVB_TB.js +0 -1
  289. package/dist/gateway/static/root/assets/models-hub-cache-CYr6LzvY.js +0 -1
  290. package/dist/gateway/static/root/assets/notes-workbench-DIXCtwhs.js +0 -4
  291. package/dist/gateway/static/root/assets/popover-select-3E24E65N.js +0 -1
  292. package/dist/gateway/static/root/assets/product-open-page-DNHWn_26.js +0 -1
  293. package/dist/gateway/static/root/assets/project-detail-page-6jgRJg4w.js +0 -1
  294. package/dist/gateway/static/root/assets/projects-page-Bd4nXs4y.js +0 -1
  295. package/dist/gateway/static/root/assets/remote-access-hub-C_5-u9U-.js +0 -1
  296. package/dist/gateway/static/root/assets/sessions-page-BqYAR86S.js +0 -1
  297. package/dist/gateway/static/root/assets/settings-advanced-gate-a146I0uZ.js +0 -1
  298. package/dist/gateway/static/root/assets/settings-loading-skeleton-CwGM9zKH.js +0 -1
  299. package/dist/gateway/static/root/assets/setup-status-panel-rhaERxAL.js +0 -1
  300. package/dist/gateway/static/root/assets/share-preview-page-BzkXvuH6.js +0 -2
  301. package/dist/gateway/static/root/assets/shares-settings-BvsM3Im5.js +0 -1
  302. package/dist/gateway/static/root/assets/skill-reload-api-u7E0gqFo.js +0 -1
  303. package/dist/gateway/static/root/assets/system-settings-panel-BUsykmjx.js +0 -1
  304. package/dist/gateway/static/root/assets/task-detail-page-C9QgWfYG.js +0 -1
  305. package/dist/gateway/static/root/assets/user-context-page-Ch0cfQfI.js +0 -1
  306. package/dist/gateway/static/root/assets/workflows-page-DyTwkdzs.js +0 -5
  307. /package/dist/gateway/static/root/assets/{dist-DqPZM2MH2.js → dist-DqPZM2MH.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-DFfvY8IN.js"></script>
14
+ <script type="module" crossorigin src="/assets/index-DKP23eMn.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">
@@ -25,19 +25,20 @@
25
25
  <link rel="modulepreload" crossorigin href="/assets/download-Dk-ZjtO6.js">
26
26
  <link rel="modulepreload" crossorigin href="/assets/plus-Q2yW6OE7.js">
27
27
  <link rel="modulepreload" crossorigin href="/assets/x-B_N4OPjy.js">
28
- <link rel="modulepreload" crossorigin href="/assets/messages-CoovNoMn.js">
29
- <link rel="modulepreload" crossorigin href="/assets/locale-store-8k4mvYGL.js">
28
+ <link rel="modulepreload" crossorigin href="/assets/messages-B1HDp_j8.js">
29
+ <link rel="modulepreload" crossorigin href="/assets/locale-store-XDFAPNNu.js">
30
30
  <link rel="modulepreload" crossorigin href="/assets/cn-JdwAhgNB.js">
31
31
  <link rel="modulepreload" crossorigin href="/assets/schemas-zIBW3wiV.js">
32
- <link rel="modulepreload" crossorigin href="/assets/product-delivery-tRr-7IxY.js">
32
+ <link rel="modulepreload" crossorigin href="/assets/product-delivery-dUJgmBQZ.js">
33
33
  <link rel="modulepreload" crossorigin href="/assets/copy-to-clipboard-HOJ79TWv.js">
34
- <link rel="modulepreload" crossorigin href="/assets/markdown-view-D02mJdoU.js">
35
- <link rel="modulepreload" crossorigin href="/assets/dist-DqPZM2MH2.js">
34
+ <link rel="modulepreload" crossorigin href="/assets/markdown-view-v-O3cOpk.js">
35
+ <link rel="modulepreload" crossorigin href="/assets/dist-DqPZM2MH.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
+ <link rel="modulepreload" crossorigin href="/assets/skeleton-BwbyijEw.js">
38
39
  <link rel="modulepreload" crossorigin href="/assets/settings-shell-dialog-layer-BU3UuiJr.js">
39
40
  <link rel="modulepreload" crossorigin href="/assets/settings-shell-layer-context-DCp6ykjQ.js">
40
- <link rel="modulepreload" crossorigin href="/assets/popover-select-3E24E65N.js">
41
+ <link rel="modulepreload" crossorigin href="/assets/popover-select-DBrVS3tZ.js">
41
42
  <link rel="modulepreload" crossorigin href="/assets/circle-check-C23XjkUj.js">
42
43
  <link rel="modulepreload" crossorigin href="/assets/cloud-C4-yfnnk.js">
43
44
  <link rel="modulepreload" crossorigin href="/assets/copy-Dv6d4Dvw.js">
@@ -46,7 +47,7 @@
46
47
  <link rel="modulepreload" crossorigin href="/assets/eye-off-DEAzt3g1.js">
47
48
  <link rel="modulepreload" crossorigin href="/assets/eye-CABVeTq0.js">
48
49
  <link rel="modulepreload" crossorigin href="/assets/globe-DSSGFWFn.js">
49
- <link rel="modulepreload" crossorigin href="/assets/notes-api-p2Pncp2B.js">
50
+ <link rel="modulepreload" crossorigin href="/assets/notes-api-BMhFpRmW.js">
50
51
  <link rel="modulepreload" crossorigin href="/assets/loader-circle-CifKLtgG.js">
51
52
  <link rel="modulepreload" crossorigin href="/assets/rotate-cw-LIg3Am9S.js">
52
53
  <link rel="modulepreload" crossorigin href="/assets/search-DA7gz22f.js">
@@ -54,20 +55,20 @@
54
55
  <link rel="modulepreload" crossorigin href="/assets/files-DQjhZjr2.js">
55
56
  <link rel="modulepreload" crossorigin href="/assets/tool-activity-R8V9l6nk.js">
56
57
  <link rel="modulepreload" crossorigin href="/assets/button-CSEbl4zT.js">
57
- <link rel="modulepreload" crossorigin href="/assets/gateway-startup-retry-2rVSUvyw.js">
58
- <link rel="modulepreload" crossorigin href="/assets/registry-api-B7b0LJgI.js">
58
+ <link rel="modulepreload" crossorigin href="/assets/gateway-startup-retry-S6aB0hVI.js">
59
+ <link rel="modulepreload" crossorigin href="/assets/registry-api-DeVvBsl4.js">
59
60
  <link rel="modulepreload" crossorigin href="/assets/config-reload-event-Bjh2zoKp.js">
60
- <link rel="modulepreload" crossorigin href="/assets/gateway-config-swr-R702lNJR.js">
61
- <link rel="modulepreload" crossorigin href="/assets/models-hub-cache-CYr6LzvY.js">
61
+ <link rel="modulepreload" crossorigin href="/assets/gateway-config-swr-DfMY-MLf.js">
62
+ <link rel="modulepreload" crossorigin href="/assets/models-hub-cache-Bngs8o1m.js">
62
63
  <link rel="modulepreload" crossorigin href="/assets/electron-env-DH5wF8X8.js">
63
- <link rel="modulepreload" crossorigin href="/assets/oauth-api-DpLONwfK.js">
64
+ <link rel="modulepreload" crossorigin href="/assets/oauth-api-B_pcOUfT.js">
64
65
  <link rel="modulepreload" crossorigin href="/assets/form-field-width-DJw_jULe.js">
65
66
  <link rel="modulepreload" crossorigin href="/assets/interaction-BmQogeqz.js">
66
67
  <link rel="modulepreload" crossorigin href="/assets/is-masked-secret-DOkL5b_X.js">
67
- <link rel="modulepreload" crossorigin href="/assets/activity-store-BzswYHcj.js">
68
- <link rel="modulepreload" crossorigin href="/assets/theme-store-CpcBI73Q.js">
69
- <link rel="stylesheet" crossorigin href="/assets/markdown-view-B1bGSQqt.css">
70
- <link rel="stylesheet" crossorigin href="/assets/index-BTUuTnc9.css">
68
+ <link rel="modulepreload" crossorigin href="/assets/activity-store-DLfkwJzZ.js">
69
+ <link rel="modulepreload" crossorigin href="/assets/theme-store-5-XHH7F0.js">
70
+ <link rel="stylesheet" crossorigin href="/assets/markdown-view-Y68dCxuc.css">
71
+ <link rel="stylesheet" crossorigin href="/assets/index-7GLgmvAm.css">
71
72
  </head>
72
73
  <body>
73
74
  <div id="root"></div>
package/dist/package.js CHANGED
@@ -1,4 +1,4 @@
1
1
  //#region package.json
2
- var version = "0.0.235";
2
+ var version = "0.0.239";
3
3
  //#endregion
4
4
  export { version };
@@ -0,0 +1,39 @@
1
+ import { z } from "zod";
2
+ //#region packages/gateway-contract/src/device-pairing.ts
3
+ const devicePairingKeySchema = z.strictObject({
4
+ kty: z.literal("EC"),
5
+ crv: z.literal("P-256"),
6
+ x: z.string().regex(/^[A-Za-z0-9_-]{43}$/),
7
+ y: z.string().regex(/^[A-Za-z0-9_-]{43}$/)
8
+ });
9
+ const devicePairingDeviceSchema = z.strictObject({
10
+ displayName: z.string().trim().min(1).max(80),
11
+ platform: z.enum(["ios", "android"]),
12
+ publicKeyJwk: devicePairingKeySchema
13
+ });
14
+ const initialDeviceRefreshTokenSchema = z.string().regex(/^xopc_rt_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}_[A-Za-z0-9_-]{43}$/i);
15
+ const devicePairingProofSchema = z.strictObject({
16
+ gatewayId: z.string().uuid(),
17
+ requestId: z.string().uuid(),
18
+ pairingToken: z.string().min(1).max(256),
19
+ timestamp: z.number().int().positive(),
20
+ nonce: z.string().regex(/^[A-Za-z0-9_-]{24,128}$/),
21
+ signature: z.string().regex(/^[A-Za-z0-9_-]{86}$/)
22
+ });
23
+ const devicePairingRequestSchema = devicePairingProofSchema.extend({ device: devicePairingDeviceSchema });
24
+ const devicePairingCompleteSchema = devicePairingProofSchema.extend({
25
+ idempotencyKey: z.string().uuid(),
26
+ initialRefreshToken: initialDeviceRefreshTokenSchema
27
+ });
28
+ function canonical(value) {
29
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
30
+ if (value !== null && typeof value === "object") return `{${Object.entries(value).filter(([, v]) => v !== void 0).sort(([a], [b]) => a.localeCompare(b, "en")).map(([k, v]) => `${JSON.stringify(k)}:${canonical(v)}`).join(",")}}`;
31
+ return JSON.stringify(value);
32
+ }
33
+ /** Identical domain-separated proof input on the phone and Gateway. */
34
+ function buildDevicePairingProof(action, body) {
35
+ const { signature: _signature, ...payload } = body;
36
+ return `xopc-device-pairing-v3\nPOST\n${action}\n${canonical(payload)}`;
37
+ }
38
+ //#endregion
39
+ export { buildDevicePairingProof, devicePairingCompleteSchema, devicePairingDeviceSchema, devicePairingProofSchema, devicePairingRequestSchema, initialDeviceRefreshTokenSchema };
@@ -0,0 +1,7 @@
1
+ //#region packages/gateway-contract/src/model-selection.ts
2
+ function chooseModelThinking(capabilities, current, remembered) {
3
+ for (const value of [remembered, current]) if (capabilities.options.includes(value)) return value;
4
+ return capabilities.initialValue;
5
+ }
6
+ //#endregion
7
+ export { chooseModelThinking };
@@ -37,7 +37,8 @@ function parseModelPreferences(value) {
37
37
  const thinkingLevel = typeof record.thinkingLevel === "string" ? normalized(record.thinkingLevel) : void 0;
38
38
  result[agentId] = {
39
39
  modelRef,
40
- ...thinkingLevel ? { thinkingLevel } : {}
40
+ ...thinkingLevel ? { thinkingLevel } : {},
41
+ ...record.thinkingByModel && typeof record.thinkingByModel === "object" ? { thinkingByModel: Object.fromEntries(Object.entries(record.thinkingByModel).filter((entry) => typeof entry[1] === "string")) } : {}
41
42
  };
42
43
  }
43
44
  return result;
@@ -71,9 +72,15 @@ function withAgentModelPreference(preferences, agentId, preference) {
71
72
  if (!preference || !modelRef) delete modelByAgent[normalizedId];
72
73
  else {
73
74
  const thinkingLevel = normalized(preference.thinkingLevel);
75
+ const thinkingByModel = {
76
+ ...modelByAgent[normalizedId]?.thinkingByModel,
77
+ ...modelByAgent[normalizedId]?.thinkingLevel ? { [modelByAgent[normalizedId].modelRef]: modelByAgent[normalizedId].thinkingLevel } : {},
78
+ ...thinkingLevel ? { [modelRef]: thinkingLevel } : {}
79
+ };
74
80
  modelByAgent[normalizedId] = {
75
81
  modelRef,
76
- ...thinkingLevel ? { thinkingLevel } : {}
82
+ ...thinkingLevel ? { thinkingLevel } : {},
83
+ ...Object.keys(thinkingByModel).length ? { thinkingByModel } : {}
77
84
  };
78
85
  }
79
86
  return {
@@ -35,6 +35,7 @@ const TurnOutcomeArtifactCapabilitySchema = z.enum([
35
35
  ]);
36
36
  const TurnOutcomeDeliverableSchema = z.object({
37
37
  artifactId: z.string().min(1),
38
+ sourceFileId: z.string().min(1).optional(),
38
39
  title: z.string().min(1),
39
40
  kind: TurnOutcomeDeliverableKindSchema,
40
41
  mimeType: z.string().optional(),
@@ -110,6 +111,14 @@ const FILE_RESOURCE_ARTIFACT_URI_PREFIX = "xopc-file:";
110
111
  function fileResourceArtifactUri(fileResourceId) {
111
112
  return `${FILE_RESOURCE_ARTIFACT_URI_PREFIX}${encodeURIComponent(fileResourceId)}`;
112
113
  }
114
+ function parseFileResourceArtifactUri(uri) {
115
+ if (!uri.startsWith(FILE_RESOURCE_ARTIFACT_URI_PREFIX)) return null;
116
+ try {
117
+ return decodeURIComponent(uri.slice(10)).trim() || null;
118
+ } catch {
119
+ return null;
120
+ }
121
+ }
113
122
  function turnOutcomeKindFromFileName(fileName) {
114
123
  const extension = fileName.toLowerCase().split(".").pop() ?? "";
115
124
  if (extension === "xlsx" || extension === "xls" || extension === "csv" || extension === "tsv") return "spreadsheet";
@@ -182,9 +191,25 @@ function turnOutcomeMimeTypeFromFileName(fileName) {
182
191
  zip: "application/zip"
183
192
  }[fileName.toLowerCase().split(".").pop() ?? ""];
184
193
  }
194
+ /** Merge file representations within one turn, preferring the latest available snapshot. */
195
+ function mergeTurnOutcomeDeliverables(items) {
196
+ const byId = new Map(items.map((item) => [item.artifactId, item]));
197
+ const bySource = /* @__PURE__ */ new Map();
198
+ const priority = (item) => item.availability === "available" ? item.location === "artifact_store" ? 2 : 1 : 0;
199
+ for (const item of byId.values()) {
200
+ const sourceFileId = item.sourceFileId ?? parseFileResourceArtifactUri(item.uri ?? "");
201
+ const key = sourceFileId ? `source:${sourceFileId}` : `artifact:${item.artifactId}`;
202
+ const previous = bySource.get(key);
203
+ if (!previous || priority(item) >= priority(previous)) bySource.set(key, item);
204
+ }
205
+ return [...bySource.values()];
206
+ }
185
207
  function parseTurnOutcome(value) {
186
208
  const parsed = TurnOutcomeSchema.safeParse(value);
187
- return parsed.success ? parsed.data : null;
209
+ return parsed.success ? {
210
+ ...parsed.data,
211
+ deliverables: mergeTurnOutcomeDeliverables(parsed.data.deliverables)
212
+ } : null;
188
213
  }
189
214
  //#endregion
190
- export { TurnOutcomeDeliverableSchema, fileResourceArtifactUri, parseTurnOutcome, turnOutcomeKindFromFileName, turnOutcomeMimeTypeFromFileName };
215
+ export { TurnOutcomeDeliverableSchema, fileResourceArtifactUri, mergeTurnOutcomeDeliverables, parseTurnOutcome, turnOutcomeKindFromFileName, turnOutcomeMimeTypeFromFileName };
@@ -5,16 +5,16 @@ import { getSessionMetadata } from "../storage/sqlite/session-repository.js";
5
5
  import { getSessionConfig } from "../storage/sqlite/config-repository.js";
6
6
  import "../storage/sqlite/index.js";
7
7
  import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
8
+ import { applyConfigOverrides } from "../config/runtime-overrides.js";
8
9
  import { expandWorkspacePathString, init_workspace_path } from "../config/workspace-path.js";
9
10
  import { init_agent_scope, resolveAgentProfileDir } from "./agent-scope.js";
10
- import { init_paths, resolveBundledSkillsDir } from "../config/paths.js";
11
- import { CredentialResolver, init_credentials } from "../auth/credentials.js";
12
11
  import { init_session_key, parseSessionKey } from "../routing/session-key.js";
12
+ import { resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
13
+ import { init_paths, resolveBundledSkillsDir } from "../config/paths.js";
13
14
  import { init_sync_provider_auth, resolveProviderApiKeySync } from "../auth/sync-provider-auth.js";
15
+ import { CredentialResolver, init_credentials } from "../auth/credentials.js";
14
16
  import { getApiKeySync, getDefaultModelSync, init_providers, resolveModel } from "../providers/index.js";
15
17
  import { createExtensionAwareStreamFn } from "../providers/extension-stream-bridge.js";
16
- import { applyConfigOverrides } from "../config/runtime-overrides.js";
17
- import { resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
18
18
  import { extractTextContent } from "./context/workspace.js";
19
19
  import { buildExecutionScopeContextForPrompt } from "./context/execution-scope.js";
20
20
  import { clearBootstrapSnapshot } from "./bootstrap/bootstrap-cache.js";
@@ -4,10 +4,10 @@ import { finishContextExtractionRun } from "../../storage/sqlite/context-extract
4
4
  import { getTurnPersonalization } from "../../storage/sqlite/user-context-repository.js";
5
5
  import { loadCompactionSourceSnapshot } from "../../storage/sqlite/transcript-repository.js";
6
6
  import "../../storage/sqlite/index.js";
7
+ import { extractProfileAgentId } from "../../config/agent-profile.js";
7
8
  import { init_sync_provider_auth, resolveProviderApiKeySync } from "../../auth/sync-provider-auth.js";
8
9
  import { getApiKeySync, init_providers, resolveModel } from "../../providers/index.js";
9
10
  import { createExtensionAwareStreamFn } from "../../providers/extension-stream-bridge.js";
10
- import { extractProfileAgentId } from "../../config/agent-profile.js";
11
11
  import { extractTextContent } from "../context/workspace.js";
12
12
  import { readAgentMessageContent } from "../memory/agent-message-access.js";
13
13
  import { resolveAgentTurnTimeoutMs, runAgentTurnWithTimeout } from "../orchestration/run-agent-turn-with-timeout.js";
@@ -1,6 +1,6 @@
1
1
  import { init_paths, resolveModelsJsonPath } from "../../config/paths.js";
2
- import { CredentialResolver, init_credentials } from "../../auth/credentials.js";
3
2
  import { init_sync_provider_auth, resolveProviderApiKeySync } from "../../auth/sync-provider-auth.js";
3
+ import { CredentialResolver, init_credentials } from "../../auth/credentials.js";
4
4
  import { XopcModelCredentialStore, init_model_credential_store } from "../../auth/model-credential-store.js";
5
5
  import { init_register_bundled_oauth_flows, registerBundledOAuthFlows } from "../../providers/register-bundled-oauth-flows.js";
6
6
  import { init_register_runtime_providers, registerRuntimeProviders } from "../../providers/register-runtime-providers.js";
@@ -1,8 +1,8 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { init_providers, resolveModel } from "../../providers/index.js";
4
3
  import { parseTurnOutcome } from "../../../packages/gateway-contract/src/turn-outcome.js";
5
4
  import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
5
+ import { init_providers, resolveModel } from "../../providers/index.js";
6
6
  import { resolveAgentTurnTimeoutMs } from "../orchestration/run-agent-turn-with-timeout.js";
7
7
  import { resolvePromptCachePolicy } from "../../providers/prompt-cache-plan.js";
8
8
  import { evaluateContextBudget } from "../memory/context-budget.js";
@@ -267,6 +267,11 @@ async function runXopcEmbeddedTurn(params) {
267
267
  errorMessage: getAssistantTurnErrorMessage(session.agent) ?? "Assistant turn failed",
268
268
  lastAssistantText: lastAssistantPlainText(session)
269
269
  };
270
+ runner.piSm.appendCustomEntry("xopc.model-selection", {
271
+ runId,
272
+ model: `${session.agent.state.model?.provider ?? resolvedModel.provider}/${session.agent.state.model?.id ?? resolvedModel.id}`,
273
+ thinkingLevel: session.agent.state.thinkingLevel
274
+ });
270
275
  return {
271
276
  ok: true,
272
277
  lastAssistantText: lastAssistantPlainText(session)
@@ -1,7 +1,7 @@
1
1
  import { getAgentDefaultImageModelConfig, getAgentDefaultModelRef, init_schema, parseModelRef } from "../../config/schema.js";
2
2
  import { init_agent_scope, resolveDefaultAgentId } from "../agent-scope.js";
3
- import { getDefaultModelSync, getModelsByProvider, init_providers, isProviderConfiguredSync, resolveModel } from "../../providers/index.js";
4
3
  import { resolveEffectiveAgentConfigForAgent } from "../../config/agent-profile.js";
4
+ import { getDefaultModelSync, getModelsByProvider, init_providers, isProviderConfiguredSync, resolveModel } from "../../providers/index.js";
5
5
  import { resolveAgentModelFallbackValues, resolveAgentModelPrimaryValue } from "../../config/model-input.js";
6
6
  import { buildCapabilityPlansForConfig } from "../../capabilities/readiness/from-config.js";
7
7
  import "../../capabilities/readiness/index.js";
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
4
3
  import { init_paths, resolveAgentDir } from "../../config/paths.js";
4
+ import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
5
5
  import { join } from "path";
6
6
  import { existsSync, watch } from "fs";
7
7
  import { mkdir, readFile, readdir, rename } from "fs/promises";
@@ -1,5 +1,5 @@
1
- import { init_write_file_atomic, writeTextAtomic } from "../../../infra/write-file-atomic.js";
2
1
  import { init_paths, resolveMcpOAuthPath } from "../../../config/paths.js";
2
+ import { init_write_file_atomic, writeTextAtomic } from "../../../infra/write-file-atomic.js";
3
3
  import { createHash } from "node:crypto";
4
4
  import { readFile, rm } from "node:fs/promises";
5
5
  //#region src/agent/mcp/oauth/mcp-oauth-store.ts
@@ -18,6 +18,7 @@ export declare class ModelManager {
18
18
  private currentModelName;
19
19
  private currentProvider;
20
20
  private sessionModels;
21
+ private fixedSessionModels;
21
22
  /** Baseline model from `agents.list` / defaults merge when the session agent is created. */
22
23
  private sessionProfileDefaults;
23
24
  private sessionProfileFallbacks;
@@ -49,6 +50,8 @@ export declare class ModelManager {
49
50
  * Switch model for a specific session
50
51
  */
51
52
  switchModelForSession(sessionKey: string, modelId: string): Promise<boolean>;
53
+ /** Restore persisted identity even if its provider is temporarily unavailable. */
54
+ restoreSessionModel(sessionKey: string, modelRef: string, fixed: boolean): void;
52
55
  /** Drop in-memory session override so the global default is used again. */
53
56
  clearSessionModelOverride(sessionKey: string): void;
54
57
  /**
@@ -15,6 +15,7 @@ var ModelManager = class {
15
15
  currentModelName;
16
16
  currentProvider;
17
17
  sessionModels = /* @__PURE__ */ new Map();
18
+ fixedSessionModels = /* @__PURE__ */ new Set();
18
19
  /** Baseline model from `agents.list` / defaults merge when the session agent is created. */
19
20
  sessionProfileDefaults = /* @__PURE__ */ new Map();
20
21
  sessionProfileFallbacks = /* @__PURE__ */ new Map();
@@ -89,9 +90,16 @@ var ModelManager = class {
89
90
  return false;
90
91
  }
91
92
  }
93
+ /** Restore persisted identity even if its provider is temporarily unavailable. */
94
+ restoreSessionModel(sessionKey, modelRef, fixed) {
95
+ this.sessionModels.set(sessionKey, modelRef);
96
+ if (fixed) this.fixedSessionModels.add(sessionKey);
97
+ else this.fixedSessionModels.delete(sessionKey);
98
+ }
92
99
  /** Drop in-memory session override so the global default is used again. */
93
100
  clearSessionModelOverride(sessionKey) {
94
101
  this.sessionModels.delete(sessionKey);
102
+ this.fixedSessionModels.delete(sessionKey);
95
103
  }
96
104
  /**
97
105
  * Resolved pi-ai model for session (for transcript policy, tools, etc.)
@@ -145,6 +153,7 @@ var ModelManager = class {
145
153
  getFallbackCandidatesForSession(sessionKey) {
146
154
  const parsed = parseModelRef(this.getModelForSession(sessionKey));
147
155
  if (!parsed) return [];
156
+ if (this.fixedSessionModels.has(sessionKey)) return [parsed];
148
157
  return resolveFallbackCandidates({
149
158
  cfg: this.config,
150
159
  provider: parsed.provider,
@@ -127,6 +127,7 @@ function buildToolingSection(params) {
127
127
  "## Tooling",
128
128
  "Tool availability (filtered by policy):",
129
129
  "Tool names are case-sensitive. Call tools exactly as listed.",
130
+ "When a tool returns an xopc product link, reuse its exact URL in a Markdown link with a short descriptive label in the user's language (for example, [打开会话](url)). Do not invent link parameters, escape the link brackets/parentheses, or wrap a navigation link in a code span. Avoid repeating raw URLs or internal object metadata unless requested.",
130
131
  toolLines.length > 0 ? toolLines.join("\n") : "- No tools are registered for this session.",
131
132
  `For long waits, avoid rapid poll loops: use \`${execToolName}\` with a sufficient timeout or poll in reasonable intervals.`,
132
133
  hasRead ? `Use \`${readToolName}\` for targeted file inspection before editing; do not rely on filenames alone.` : "",
@@ -3,10 +3,10 @@ import { init_logger } from "../utils/logger.js";
3
3
  import { getUserProfile } from "../storage/sqlite/user-context-repository.js";
4
4
  import { parseNoteAttachmentTarget } from "../notes/attachment-ref.js";
5
5
  import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
6
- import { init_agent_scope, resolveAgentHomeDir, resolveDefaultAgentId } from "./agent-scope.js";
7
- import { init_providers, resolveModel } from "../providers/index.js";
8
6
  import { applyConfigOverrides } from "../config/runtime-overrides.js";
7
+ import { init_agent_scope, resolveAgentHomeDir, resolveDefaultAgentId } from "./agent-scope.js";
9
8
  import { extractProfileAgentId } from "../config/agent-profile.js";
9
+ 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";
@@ -27,6 +27,8 @@ export interface SessionConfigServiceOptions {
27
27
  }
28
28
  export interface PatchSessionAgentConfigInput {
29
29
  thinkingLevel?: string;
30
+ fixedModel?: boolean;
31
+ configVersion?: number;
30
32
  model?: string | null;
31
33
  /** Preferred activity-detail field. `null` clears the session override. */
32
34
  activityDetailLevel?: string | null;
@@ -40,6 +42,7 @@ export interface PatchSessionAgentConfigInput {
40
42
  export interface PatchSessionAgentConfigResult {
41
43
  ok: boolean;
42
44
  error?: string;
45
+ code?: 'CONFIG_CHANGED' | 'INVALID_MODEL' | 'INVALID_THINKING';
43
46
  }
44
47
  export declare class SessionConfigService {
45
48
  private readonly opts;
@@ -47,10 +50,11 @@ export declare class SessionConfigService {
47
50
  /**
48
51
  * Apply a partial patch (model / thinking / reasoning / working directory) to
49
52
  * a session's persisted config. Returns `{ ok: false, error }` on the first
50
- * invalid field earlier fields that succeeded are NOT rolled back, matching
51
- * the previous behaviour.
53
+ * invalid field. Model and thinking are validated together and committed in one write.
52
54
  */
53
55
  patch(sessionKey: string, partial: PatchSessionAgentConfigInput): Promise<PatchSessionAgentConfigResult>;
56
+ /** Materialize a restored/new chat choice; unavailable identities stay visible for repair. */
57
+ initializeModelSelection(sessionKey: string, modelRef: string, thinkingLevel?: string, configVersion?: number): Promise<PatchSessionAgentConfigResult>;
54
58
  /**
55
59
  * Sync persisted session working directory for an automation run. Runs may
56
60
  * change when the automation is edited; an empty/missing input clears the
@@ -1,10 +1,12 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { chooseModelThinking } from "../../../packages/gateway-contract/src/model-selection.js";
3
4
  import { ResponseLanguageSchema, init_response_language } from "../../i18n/response-language.js";
4
5
  import { normalizeWorkingDirectoryInput } from "../../session/session-workspace.js";
5
6
  import { getProjectWorkspacePathForSession } from "../../projects/workspace.js";
6
7
  import { normalizeReasoningLevel, normalizeThinkLevel, normalizeVerboseLevel } from "../transcript/thinking-types.js";
7
8
  import "../../session/index.js";
9
+ import { getModelThinking } from "../../providers/model-thinking.js";
8
10
  import { mkdir } from "node:fs/promises";
9
11
  //#region src/agent/session/session-config-service.ts
10
12
  /**
@@ -33,27 +35,58 @@ var SessionConfigService = class {
33
35
  /**
34
36
  * Apply a partial patch (model / thinking / reasoning / working directory) to
35
37
  * a session's persisted config. Returns `{ ok: false, error }` on the first
36
- * invalid field earlier fields that succeeded are NOT rolled back, matching
37
- * the previous behaviour.
38
+ * invalid field. Model and thinking are validated together and committed in one write.
38
39
  */
39
40
  async patch(sessionKey, partial) {
40
- if (partial.model !== void 0) if (partial.model === null || partial.model === "") await this.clearModelOverride(sessionKey);
41
- else {
42
- if (!await this.opts.modelManager.switchModelForSession(sessionKey, partial.model)) return {
43
- ok: false,
44
- error: "Invalid model"
45
- };
46
- await this.opts.sessionConfigStore.update(sessionKey, { modelOverride: partial.model });
47
- this.opts.agentManager.setModelForSession(sessionKey, partial.model);
48
- }
49
- if (partial.thinkingLevel !== void 0) {
50
- const normalized = normalizeThinkLevel(partial.thinkingLevel);
51
- if (!normalized) return {
41
+ if (partial.model !== void 0 || partial.thinkingLevel !== void 0 || partial.fixedModel) {
42
+ const existing = await this.opts.sessionConfigStore.get(sessionKey);
43
+ if (partial.configVersion !== void 0 && partial.configVersion !== (existing?.updatedAt ?? 0)) return {
52
44
  ok: false,
53
- error: "Invalid thinking level"
45
+ code: "CONFIG_CHANGED",
46
+ error: "Model configuration changed. Refresh and try again."
54
47
  };
55
- await this.opts.sessionConfigStore.update(sessionKey, { thinkingLevel: normalized });
56
- this.opts.agentManager.setThinkingLevel(sessionKey, normalized);
48
+ if (partial.model === null || partial.model === "") {
49
+ if (partial.fixedModel || existing?.fixedModel) return {
50
+ ok: false,
51
+ code: "INVALID_MODEL",
52
+ error: "Select a specific model"
53
+ };
54
+ await this.clearModelOverride(sessionKey);
55
+ } else {
56
+ const ref = partial.model ?? existing?.modelOverride ?? this.opts.modelManager.getModelForSession(sessionKey);
57
+ const model = this.opts.modelManager.findByRef(ref);
58
+ if (!model) return {
59
+ ok: false,
60
+ code: "INVALID_MODEL",
61
+ error: `Model unavailable: ${ref}`
62
+ };
63
+ const capabilities = getModelThinking(model);
64
+ const requested = partial.thinkingLevel === void 0 ? void 0 : normalizeThinkLevel(partial.thinkingLevel);
65
+ if (partial.thinkingLevel !== void 0 && (!requested || !capabilities.options.includes(requested))) return {
66
+ ok: false,
67
+ code: "INVALID_THINKING",
68
+ error: "This thinking level is not supported by the selected model"
69
+ };
70
+ const thinkingLevel = requested ?? chooseModelThinking(capabilities, existing?.thinkingLevel);
71
+ const modelRef = `${model.provider}/${model.id}`;
72
+ const updated = await this.opts.sessionConfigStore.update(sessionKey, {
73
+ modelOverride: modelRef,
74
+ thinkingLevel,
75
+ fixedModel: partial.fixedModel ?? existing?.fixedModel ?? false
76
+ });
77
+ this.opts.modelManager.restoreSessionModel(sessionKey, modelRef, updated.fixedModel === true);
78
+ try {
79
+ this.opts.agentManager.setModelForSession(sessionKey, modelRef);
80
+ this.opts.agentManager.setThinkingLevel(sessionKey, thinkingLevel);
81
+ } catch (err) {
82
+ this.opts.agentManager.removeAgent(sessionKey);
83
+ log.warn({
84
+ err,
85
+ sessionKey,
86
+ modelRef
87
+ }, "Saved model configuration; runtime will reload before the next turn");
88
+ }
89
+ }
57
90
  }
58
91
  const activityDetailLevel = partial.activityDetailLevel !== void 0 ? partial.activityDetailLevel : partial.reasoningLevel;
59
92
  if (activityDetailLevel !== void 0) if (activityDetailLevel === null) await this.opts.sessionConfigStore.update(sessionKey, { reasoningLevel: void 0 });
@@ -110,6 +143,34 @@ var SessionConfigService = class {
110
143
  }
111
144
  return { ok: true };
112
145
  }
146
+ /** Materialize a restored/new chat choice; unavailable identities stay visible for repair. */
147
+ async initializeModelSelection(sessionKey, modelRef, thinkingLevel, configVersion) {
148
+ const existing = await this.opts.sessionConfigStore.get(sessionKey);
149
+ if (configVersion !== void 0 && configVersion !== (existing?.updatedAt ?? 0)) return {
150
+ ok: false,
151
+ code: "CONFIG_CHANGED",
152
+ error: "Model configuration changed. Refresh and try again."
153
+ };
154
+ const model = this.opts.modelManager.findByRef(modelRef);
155
+ if (model) return this.patch(sessionKey, {
156
+ model: `${model.provider}/${model.id}`,
157
+ thinkingLevel: chooseModelThinking(getModelThinking(model), thinkingLevel ?? existing?.thinkingLevel),
158
+ fixedModel: true,
159
+ configVersion
160
+ });
161
+ if (!modelRef.trim() || !modelRef.includes("/")) return {
162
+ ok: false,
163
+ code: "INVALID_MODEL",
164
+ error: "Select a specific model"
165
+ };
166
+ await this.opts.sessionConfigStore.update(sessionKey, {
167
+ modelOverride: modelRef,
168
+ fixedModel: true,
169
+ thinkingLevel: normalizeThinkLevel(thinkingLevel) ?? existing?.thinkingLevel ?? "off"
170
+ });
171
+ this.opts.modelManager.restoreSessionModel(sessionKey, modelRef, true);
172
+ return { ok: true };
173
+ }
113
174
  /**
114
175
  * Sync persisted session working directory for an automation run. Runs may
115
176
  * change when the automation is edited; an empty/missing input clears the
@@ -7,8 +7,7 @@
7
7
  * {@link SessionConfigService} — the latter writes user choices into the
8
8
  * config store, this hydrator reads them back out before a turn runs.
9
9
  *
10
- * - `workspace()` — apply persisted `workingDirectoryOverride` to AgentManager
11
- * and ensure the directory exists on disk
10
+ * - `workspace()` — resolve the execution workspace and apply it to AgentManager
12
11
  * - `model()` — apply persisted `modelOverride` via ModelManager
13
12
  * - `thinking()` — resolve effective thinking level (request override >
14
13
  * per-session override > agent default) and apply
@@ -28,8 +27,8 @@ export declare class SessionHydrator {
28
27
  private readonly opts;
29
28
  constructor(opts: SessionHydratorOptions);
30
29
  /**
31
- * Load persisted workingDirectory override into AgentManager and `mkdir -p`
32
- * the effective workspace path. Safe to call before `getOrCreateAgent`.
30
+ * Load the effective workspace into AgentManager. Managed environment roots
31
+ * must already exist; ordinary project and agent workspaces may be created.
33
32
  */
34
33
  workspace(sessionKey: string): Promise<void>;
35
34
  /** Apply persisted `modelOverride` to ModelManager (no-op when none stored). */