@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
@@ -0,0 +1,151 @@
1
+ import { createLogger } from "../utils/logger/index.js";
2
+ import { init_logger } from "../utils/logger.js";
3
+ import { getSqliteDatabase } from "../storage/sqlite/transaction.js";
4
+ import { hasGatewayScope } from "./security/gateway-scopes.js";
5
+ import { getSessionMetadata } from "../storage/sqlite/session-repository.js";
6
+ import { getSessionConfig } from "../storage/sqlite/config-repository.js";
7
+ import { TaskRepository } from "../tasks/task-repository.js";
8
+ import { TaskConversationRepository } from "../tasks/task-conversation-repository.js";
9
+ import { getExecutionEnvironmentForSession } from "../execution-environments/subject.js";
10
+ import { effectiveWorkspacePathForSession } from "../session/session-workspace.js";
11
+ import { ProjectStore } from "../projects/project-store.js";
12
+ import { runExec } from "../infra/exec.js";
13
+ import { isSessionSourceBinding } from "../agent/source-context/types.js";
14
+ import { realpath, stat } from "node:fs/promises";
15
+ //#region src/gateway/session-context-summary.ts
16
+ init_logger();
17
+ const log = createLogger("SessionContextSummary");
18
+ const SOURCE_LIMIT = 20;
19
+ async function readEnvironment(config, sessionKey, projectId) {
20
+ const bound = getExecutionEnvironmentForSession(sessionKey);
21
+ const project = projectId ? new ProjectStore().get(projectId) : void 0;
22
+ const rootPath = bound?.rootPath ?? effectiveWorkspacePathForSession(config, sessionKey, getSessionConfig(sessionKey), project);
23
+ const available = (!bound || bound.status === "ready") && await stat(rootPath).then((info) => info.isDirectory(), () => false);
24
+ const environment = {
25
+ kind: bound?.kind ?? "local_checkout",
26
+ rootPath,
27
+ available
28
+ };
29
+ if (!available) return environment;
30
+ const git = (args) => runExec("git", args, {
31
+ cwd: rootPath,
32
+ timeoutMs: 2e3,
33
+ maxBuffer: 16384
34
+ }).then((result) => result.stdout.trim());
35
+ const [branch, head] = await Promise.allSettled([git([
36
+ "symbolic-ref",
37
+ "--quiet",
38
+ "--short",
39
+ "HEAD"
40
+ ]), git([
41
+ "rev-parse",
42
+ "--verify",
43
+ "HEAD^{commit}"
44
+ ])]);
45
+ if (branch.status === "fulfilled" && branch.value) environment.branch = branch.value;
46
+ if (head.status === "fulfilled" && head.value) {
47
+ environment.headSha = head.value;
48
+ environment.detached = branch.status === "rejected" && branch.reason?.code === 1;
49
+ }
50
+ if (bound?.kind === "managed_worktree") {
51
+ const repositoryRoot = await git(["rev-parse", "--show-toplevel"]).catch(() => void 0);
52
+ environment.available = Boolean(environment.headSha && repositoryRoot && repositoryRoot === await realpath(rootPath));
53
+ if (!environment.available) {
54
+ delete environment.branch;
55
+ delete environment.headSha;
56
+ delete environment.detached;
57
+ }
58
+ }
59
+ return environment;
60
+ }
61
+ /** A bounded metadata-only query. It never prepares Note context or starts an agent. */
62
+ async function getSessionContextSummary(config, sessionKey, scopes) {
63
+ const metadata = getSessionMetadata(sessionKey);
64
+ if (!metadata) return null;
65
+ const summary = {
66
+ sessionKey,
67
+ observedAt: (/* @__PURE__ */ new Date()).toISOString(),
68
+ work: {},
69
+ sources: [],
70
+ sourcesHasMore: false,
71
+ unavailableSections: []
72
+ };
73
+ const canReadWorkspace = hasGatewayScope(scopes, "workspace.read");
74
+ const canReadTasks = hasGatewayScope(scopes, "tasks.read");
75
+ const unavailable = (section, err) => {
76
+ if (!summary.unavailableSections.includes(section)) summary.unavailableSections.push(section);
77
+ if (err) log.warn({
78
+ err,
79
+ sessionKey,
80
+ section
81
+ }, "Context summary section unavailable");
82
+ };
83
+ if (canReadWorkspace) try {
84
+ const project = metadata.projectId ? new ProjectStore().get(metadata.projectId) : void 0;
85
+ if (project) summary.work.project = {
86
+ id: project.id,
87
+ title: project.name.slice(0, 240)
88
+ };
89
+ else if (metadata.projectId) unavailable("work");
90
+ } catch (err) {
91
+ unavailable("work", err);
92
+ }
93
+ else unavailable("work");
94
+ if (canReadTasks) try {
95
+ const taskId = new TaskConversationRepository().resolveActiveExecutionSession(sessionKey)?.taskId;
96
+ const task = taskId ? new TaskRepository().get(taskId) : void 0;
97
+ if (task) summary.work.task = {
98
+ id: task.id,
99
+ title: task.title.slice(0, 240),
100
+ phase: task.phase
101
+ };
102
+ else if (taskId) unavailable("work");
103
+ } catch (err) {
104
+ unavailable("work", err);
105
+ }
106
+ else unavailable("work");
107
+ if (canReadWorkspace) {
108
+ try {
109
+ const binding = metadata.customData?.sourceBinding;
110
+ const source = isSessionSourceBinding(binding) ? binding : void 0;
111
+ const rows = getSqliteDatabase().prepare(`
112
+ WITH refs AS (
113
+ SELECT ? AS note_id, 1 AS from_session, 0 AS from_task WHERE ? IS NOT NULL
114
+ UNION ALL
115
+ SELECT target_id, 0, 1 FROM context_edges
116
+ WHERE owner_kind = 'task' AND owner_id = ? AND target_kind = 'note'
117
+ ), grouped AS (
118
+ SELECT note_id, MAX(from_session) AS from_session, MAX(from_task) AS from_task
119
+ FROM refs GROUP BY note_id
120
+ )
121
+ SELECT g.*, n.note_id AS found_id, substr(n.title, 1, 240) AS title
122
+ FROM grouped g LEFT JOIN notes n ON n.note_id = g.note_id AND n.status != 'trashed'
123
+ ORDER BY g.from_session DESC, g.note_id LIMIT ?
124
+ `).all(source?.sourceId ?? null, source?.sourceId ?? null, summary.work.task?.id ?? null, SOURCE_LIMIT + 1);
125
+ summary.sourcesHasMore = rows.length > SOURCE_LIMIT;
126
+ summary.sources = rows.slice(0, SOURCE_LIMIT).map((row) => ({
127
+ kind: "note",
128
+ id: row.note_id,
129
+ ...row.found_id ? { title: row.title ?? void 0 } : { unavailable: true },
130
+ origins: [...row.from_session ? [{
131
+ kind: "session",
132
+ version: source?.version
133
+ }] : [], ...row.from_task ? [{ kind: "task" }] : []]
134
+ }));
135
+ } catch (err) {
136
+ unavailable("sources", err);
137
+ }
138
+ try {
139
+ summary.environment = await readEnvironment(config, sessionKey, metadata.projectId);
140
+ } catch (err) {
141
+ unavailable("environment", err);
142
+ }
143
+ } else {
144
+ unavailable("sources");
145
+ unavailable("environment");
146
+ }
147
+ summary.observedAt = (/* @__PURE__ */ new Date()).toISOString();
148
+ return summary;
149
+ }
150
+ //#endregion
151
+ export { getSessionContextSummary };
@@ -1,6 +1,6 @@
1
1
  import { DEFAULT_ACK_MAX_CHARS, HEARTBEAT_OK, NO_REPLY, shouldSilence, stripHeartbeatToken } from "./tokens.js";
2
+ import { appendCronEventLines } from "./event-prompt.js";
2
3
  import { isWithinActiveHours } from "./active-hours.js";
3
4
  import { isHeartbeatContentEmpty } from "./content-check.js";
4
- import { appendCronEventLines } from "./event-prompt.js";
5
5
  import { createHeartbeatWake } from "./wake.js";
6
6
  export { DEFAULT_ACK_MAX_CHARS, HEARTBEAT_OK, NO_REPLY, appendCronEventLines, createHeartbeatWake, isHeartbeatContentEmpty, isWithinActiveHours, shouldSilence, stripHeartbeatToken };
@@ -1,8 +1,8 @@
1
1
  import { z } from 'zod';
2
2
  export declare const ResponseLanguageSchema: z.ZodEnum<{
3
+ en: "en";
3
4
  auto: "auto";
4
5
  "zh-CN": "zh-CN";
5
- en: "en";
6
6
  }>;
7
7
  export type ResponseLanguage = z.infer<typeof ResponseLanguageSchema>;
8
8
  export declare function resolveResponseLanguage(userPreference: ResponseLanguage, sessionPreference?: ResponseLanguage): ResponseLanguage;
@@ -1,6 +1,6 @@
1
- import { runPostUpdateExtensionSync } from "../extensions/update.js";
2
1
  import "./update-channels.js";
3
2
  import { compareSemver, resolveNpmChannelTag } from "./update-check.js";
3
+ import { runPostUpdateExtensionSync } from "../extensions/update.js";
4
4
  import { readPackageName, readPackageVersion } from "./package-json.js";
5
5
  import { createDefaultCommandRunner, runCommandWithTimeout } from "./run-command.js";
6
6
  import { XOPC_PACKAGE_NAME, cleanupGlobalRenameDirs, createGlobalInstallEnv, detectGlobalInstallManagerForRoot, resolveGlobalInstallSpec, resolveGlobalInstallTarget } from "./update-global.js";
@@ -1,14 +1,14 @@
1
1
  import { ProjectStore, slugifyProjectName } from "./project-store.js";
2
2
  import { getProjectForSession, getProjectWorkspacePathForSession, resolveProjectWorkspacePath } from "./workspace.js";
3
- import { bindSessionToProject, bindSessionsToProject, listProjectSessionKeys, moveSessionToProject, unbindSessionFromProject } from "./session-bind.js";
4
3
  import { ProjectWorkspaceConflictError, ProjectWorkspaceMissingError, canonicalWorkspacePath, ensureWorkspaceDirectory, inferProjectNameFromWorkspaceRoot, isPathSameOrInsideWorkspace, isSafeAutoCreateWorkspaceRoot, resolveWorkspaceProjectRoot, workspaceDirectoryExists } from "./workspace-project.js";
4
+ import { inferProjectExecutionMode, inferProjectKind } from "./project-kind.js";
5
+ import { bindSessionToProject, bindSessionsToProject, listProjectSessionKeys, moveSessionToProject, unbindSessionFromProject } from "./session-bind.js";
5
6
  import { ProjectService } from "./project-service.js";
6
7
  import { ProjectSkillError, ProjectSkillService } from "./project-skill-service.js";
7
8
  import { isValidProjectAgentId, normalizeProjectAgentId, resolveProjectAgentId } from "./project-agent.js";
8
- import { inferProjectKind } from "./project-kind.js";
9
9
  import { CODING_PROJECT_AGENT_ID, inferSuggestedProjectDefaultAgentId, suggestProjectDefaultAgentId } from "./project-agent-suggestion.js";
10
10
  import { buildProjectLoopOverview } from "./project-loop.js";
11
11
  import { bindWorkflowRunToProject } from "./workflow-bind.js";
12
12
  import { bindAutomationToProject } from "./automation-bind.js";
13
13
  import { bindMemoryRecordToProject } from "./memory-bind.js";
14
- export { CODING_PROJECT_AGENT_ID, ProjectService, ProjectSkillError, ProjectSkillService, ProjectStore, ProjectWorkspaceConflictError, ProjectWorkspaceMissingError, bindAutomationToProject, bindMemoryRecordToProject, bindSessionToProject, bindSessionsToProject, bindWorkflowRunToProject, buildProjectLoopOverview, canonicalWorkspacePath, ensureWorkspaceDirectory, getProjectForSession, getProjectWorkspacePathForSession, inferProjectKind, inferProjectNameFromWorkspaceRoot, inferSuggestedProjectDefaultAgentId, isPathSameOrInsideWorkspace, isSafeAutoCreateWorkspaceRoot, isValidProjectAgentId, listProjectSessionKeys, moveSessionToProject, normalizeProjectAgentId, resolveProjectAgentId, resolveProjectWorkspacePath, resolveWorkspaceProjectRoot, slugifyProjectName, suggestProjectDefaultAgentId, unbindSessionFromProject, workspaceDirectoryExists };
14
+ export { CODING_PROJECT_AGENT_ID, ProjectService, ProjectSkillError, ProjectSkillService, ProjectStore, ProjectWorkspaceConflictError, ProjectWorkspaceMissingError, bindAutomationToProject, bindMemoryRecordToProject, bindSessionToProject, bindSessionsToProject, bindWorkflowRunToProject, buildProjectLoopOverview, canonicalWorkspacePath, ensureWorkspaceDirectory, getProjectForSession, getProjectWorkspacePathForSession, inferProjectExecutionMode, inferProjectKind, inferProjectNameFromWorkspaceRoot, inferSuggestedProjectDefaultAgentId, isPathSameOrInsideWorkspace, isSafeAutoCreateWorkspaceRoot, isValidProjectAgentId, listProjectSessionKeys, moveSessionToProject, normalizeProjectAgentId, resolveProjectAgentId, resolveProjectWorkspacePath, resolveWorkspaceProjectRoot, slugifyProjectName, suggestProjectDefaultAgentId, unbindSessionFromProject, workspaceDirectoryExists };
@@ -1,3 +1,4 @@
1
+ import type { ProjectExecutionMode } from './types.js';
1
2
  export type ProjectKind = 'coding' | 'general' | 'unknown';
2
3
  export type ProjectKindOverride = 'auto' | 'coding' | 'general';
3
4
  export type ProjectKindInference = {
@@ -11,3 +12,9 @@ export declare function inferProjectKind(input: {
11
12
  workspaceRoot?: string | null;
12
13
  projectKind?: string | null;
13
14
  }): ProjectKindInference;
15
+ export declare function inferProjectExecutionMode(input: {
16
+ name?: string | null;
17
+ description?: string | null;
18
+ workspaceRoot?: string | null;
19
+ projectKind?: string | null;
20
+ }): ProjectExecutionMode;
@@ -140,5 +140,10 @@ function inferProjectKind(input) {
140
140
  reasons
141
141
  };
142
142
  }
143
+ function inferProjectExecutionMode(input) {
144
+ const workspaceRoot = canonicalWorkspacePath(input.workspaceRoot);
145
+ if (!workspaceRoot || !existsSync(join(workspaceRoot, ".git"))) return "local_checkout";
146
+ return inferProjectKind(input).kind === "coding" ? "managed_worktree" : "local_checkout";
147
+ }
143
148
  //#endregion
144
- export { inferProjectKind };
149
+ export { inferProjectExecutionMode, inferProjectKind };
@@ -3,8 +3,9 @@ import { getSessionMetadata } from "../storage/sqlite/session-repository.js";
3
3
  import "../storage/sqlite/index.js";
4
4
  import { changedFieldsFromPatch, emitActivity, systemActivityActor, systemActivitySource } from "../activity/emitter.js";
5
5
  import { ProjectStore } from "./project-store.js";
6
- import { bindSessionToProject, listProjectSessionKeys, unbindSessionFromProject } from "./session-bind.js";
7
6
  import { ProjectWorkspaceConflictError, ProjectWorkspaceMissingError, canonicalWorkspacePath, ensureWorkspaceDirectory, inferProjectNameFromWorkspaceRoot, isPathSameOrInsideWorkspace, isSafeAutoCreateWorkspaceRoot, resolveWorkspaceProjectRoot, workspaceDirectoryExists } from "./workspace-project.js";
7
+ import { inferProjectExecutionMode } from "./project-kind.js";
8
+ import { bindSessionToProject, listProjectSessionKeys, unbindSessionFromProject } from "./session-bind.js";
8
9
  import { createHash } from "node:crypto";
9
10
  //#region src/projects/project-service.ts
10
11
  var ProjectService = class {
@@ -39,11 +40,18 @@ var ProjectService = class {
39
40
  }
40
41
  const name = input.name?.trim() || inferProjectNameFromWorkspaceRoot(workspaceRoot) || "";
41
42
  const slug = input.slug?.trim() || this.store.generateSlug(name);
43
+ const executionMode = input.executionMode ?? inferProjectExecutionMode({
44
+ name,
45
+ description: input.description,
46
+ workspaceRoot,
47
+ projectKind: input.projectKind
48
+ });
42
49
  const project = this.store.create({
43
50
  ...input,
44
51
  name,
45
52
  slug,
46
- workspaceRoot
53
+ workspaceRoot,
54
+ executionMode
47
55
  });
48
56
  emitActivity({
49
57
  type: "project.created",
@@ -7,6 +7,7 @@ export type ProjectRow = {
7
7
  status: string;
8
8
  default_agent_id: string | null;
9
9
  workspace_root: string | null;
10
+ execution_mode: Project['executionMode'];
10
11
  brief: string | null;
11
12
  instructions: string | null;
12
13
  outcome: string | null;
@@ -19,6 +19,7 @@ function projectFromRow(row) {
19
19
  status: row.status,
20
20
  defaultAgentId: row.default_agent_id ?? void 0,
21
21
  workspaceRoot: row.workspace_root ?? void 0,
22
+ executionMode: row.execution_mode,
22
23
  brief: row.brief ?? void 0,
23
24
  instructions: row.instructions ?? void 0,
24
25
  outcome: row.outcome ?? void 0,
@@ -156,6 +157,7 @@ var ProjectStore = class {
156
157
  status: "active",
157
158
  defaultAgentId: trimOptional(input.defaultAgentId),
158
159
  workspaceRoot: trimOptional(input.workspaceRoot),
160
+ executionMode: input.executionMode ?? "local_checkout",
159
161
  brief: trimOptional(input.brief),
160
162
  instructions: trimOptional(input.instructions),
161
163
  outcome: trimOptional(input.outcome),
@@ -173,11 +175,11 @@ var ProjectStore = class {
173
175
  };
174
176
  runSqliteWriteTransaction((db) => {
175
177
  db.prepare(`INSERT INTO projects (
176
- project_id, name, slug, description, status, default_agent_id, workspace_root,
178
+ project_id, name, slug, description, status, default_agent_id, workspace_root, execution_mode,
177
179
  brief, instructions, outcome, success_criteria_json, scope_json, non_goals_json,
178
180
  health, owner_id, target_at, version,
179
181
  created_at, updated_at, last_active_at, pinned_at
180
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(project.id, project.name, project.slug, project.description ?? null, project.status, project.defaultAgentId ?? null, project.workspaceRoot ?? null, project.brief ?? null, project.instructions ?? null, project.outcome ?? null, JSON.stringify(project.successCriteria), JSON.stringify(project.scope), JSON.stringify(project.nonGoals), project.health, project.ownerId ?? null, project.targetAt ?? null, project.version, project.createdAt, project.updatedAt, project.lastActiveAt ?? null, project.pinnedAt ?? null);
182
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(project.id, project.name, project.slug, project.description ?? null, project.status, project.defaultAgentId ?? null, project.workspaceRoot ?? null, project.executionMode, project.brief ?? null, project.instructions ?? null, project.outcome ?? null, JSON.stringify(project.successCriteria), JSON.stringify(project.scope), JSON.stringify(project.nonGoals), project.health, project.ownerId ?? null, project.targetAt ?? null, project.version, project.createdAt, project.updatedAt, project.lastActiveAt ?? null, project.pinnedAt ?? null);
181
183
  syncProjectFts(db, project);
182
184
  });
183
185
  return project;
@@ -249,7 +251,7 @@ var ProjectStore = class {
249
251
  JOIN sessions s ON s.project_id = p.project_id
250
252
  ${where}`).get(...params).total;
251
253
  return {
252
- items: db.prepare(`SELECT p.*, MAX(s.updated_at) AS latest_session_at
254
+ items: db.prepare(`SELECT p.*
253
255
  FROM projects p
254
256
  JOIN sessions s ON s.project_id = p.project_id
255
257
  ${where}
@@ -257,8 +259,8 @@ var ProjectStore = class {
257
259
  ORDER BY
258
260
  CASE WHEN p.pinned_at IS NULL THEN 1 ELSE 0 END ASC,
259
261
  p.pinned_at DESC,
260
- latest_session_at DESC,
261
- p.updated_at DESC
262
+ p.created_at DESC,
263
+ p.project_id ASC
262
264
  LIMIT ? OFFSET ?`).all(...params, limit, offset).map(projectFromRow),
263
265
  total,
264
266
  limit,
@@ -276,6 +278,7 @@ var ProjectStore = class {
276
278
  ...input.status !== void 0 ? { status: input.status } : {},
277
279
  ...input.defaultAgentId !== void 0 ? { defaultAgentId: nullableText(input.defaultAgentId) ?? void 0 } : {},
278
280
  ...input.workspaceRoot !== void 0 ? { workspaceRoot: nullableText(input.workspaceRoot) ?? void 0 } : {},
281
+ ...input.executionMode !== void 0 ? { executionMode: input.executionMode } : {},
279
282
  ...input.brief !== void 0 ? { brief: nullableText(input.brief) ?? void 0 } : {},
280
283
  ...input.instructions !== void 0 ? { instructions: nullableText(input.instructions) ?? void 0 } : {},
281
284
  ...input.outcome !== void 0 ? { outcome: nullableText(input.outcome) ?? void 0 } : {},
@@ -291,10 +294,10 @@ var ProjectStore = class {
291
294
  };
292
295
  runSqliteWriteTransaction((db) => {
293
296
  if (db.prepare(`UPDATE projects SET
294
- name = ?, description = ?, status = ?, default_agent_id = ?, workspace_root = ?, brief = ?, instructions = ?,
297
+ name = ?, description = ?, status = ?, default_agent_id = ?, workspace_root = ?, execution_mode = ?, brief = ?, instructions = ?,
295
298
  outcome = ?, success_criteria_json = ?, scope_json = ?, non_goals_json = ?, health = ?, owner_id = ?, target_at = ?,
296
299
  pinned_at = ?, updated_at = ?, version = ?
297
- WHERE project_id = ? AND version = ?`).run(next.name, next.description ?? null, next.status, next.defaultAgentId ?? null, next.workspaceRoot ?? null, next.brief ?? null, next.instructions ?? null, next.outcome ?? null, JSON.stringify(next.successCriteria), JSON.stringify(next.scope), JSON.stringify(next.nonGoals), next.health, next.ownerId ?? null, next.targetAt ?? null, next.pinnedAt ?? null, next.updatedAt, next.version, id, before.version).changes !== 1) throw new Error(`Project update conflict: ${id}`);
300
+ WHERE project_id = ? AND version = ?`).run(next.name, next.description ?? null, next.status, next.defaultAgentId ?? null, next.workspaceRoot ?? null, next.executionMode, next.brief ?? null, next.instructions ?? null, next.outcome ?? null, JSON.stringify(next.successCriteria), JSON.stringify(next.scope), JSON.stringify(next.nonGoals), next.health, next.ownerId ?? null, next.targetAt ?? null, next.pinnedAt ?? null, next.updatedAt, next.version, id, before.version).changes !== 1) throw new Error(`Project update conflict: ${id}`);
298
301
  syncProjectFts(db, next);
299
302
  });
300
303
  return this.get(id);
@@ -1,6 +1,7 @@
1
1
  import type { PaginatedResult } from '../session/types.js';
2
2
  export type ProjectStatus = 'planned' | 'active' | 'paused' | 'completed' | 'cancelled' | 'archived';
3
3
  export type ProjectHealth = 'unknown' | 'on_track' | 'at_risk' | 'off_track';
4
+ export type ProjectExecutionMode = 'local_checkout' | 'managed_worktree';
4
5
  export interface Project {
5
6
  id: string;
6
7
  name: string;
@@ -11,6 +12,7 @@ export interface Project {
11
12
  workspaceRoot?: string;
12
13
  workspaceMode?: 'followAgent' | 'fixed';
13
14
  effectiveWorkspaceRoot?: string;
15
+ executionMode: ProjectExecutionMode;
14
16
  brief?: string;
15
17
  instructions?: string;
16
18
  outcome?: string;
@@ -69,6 +71,7 @@ export interface CreateProjectInput {
69
71
  workspaceRoot?: string;
70
72
  createWorkspaceRoot?: boolean;
71
73
  projectKind?: string;
74
+ executionMode?: ProjectExecutionMode;
72
75
  brief?: string;
73
76
  instructions?: string;
74
77
  outcome?: string;
@@ -86,6 +89,7 @@ export interface UpdateProjectInput {
86
89
  status?: ProjectStatus;
87
90
  workspaceRoot?: string | null;
88
91
  createWorkspaceRoot?: boolean;
92
+ executionMode?: ProjectExecutionMode;
89
93
  brief?: string | null;
90
94
  instructions?: string | null;
91
95
  pinnedAt?: number | null;
@@ -1,5 +1,5 @@
1
- import { getApiKeyFromEnv, init_env_keys } from "../env-keys.js";
2
1
  import { init_sync_provider_auth, resolveProviderApiKeyForAgentSync } from "../../auth/sync-provider-auth.js";
2
+ import { getApiKeyFromEnv, init_env_keys } from "../env-keys.js";
3
3
  import { getDefaultAuthProfileStore } from "./auth-profile-store.js";
4
4
  //#region src/providers/auth-runtime/resolve-auth.ts
5
5
  init_env_keys();
@@ -1,11 +1,11 @@
1
1
  import { __esmMin, __exportAll } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
3
+ import { getModelOAuthProviderIds, init_registry } from "../auth/oauth/registry.js";
4
+ import { hasProviderAuthOnDiskSync, init_sync_provider_auth } from "../auth/sync-provider-auth.js";
3
5
  import { PROVIDER_ENV_MAP, getApiKeyFromEnv, init_env_keys } from "./env-keys.js";
4
6
  import { init_model_ref, splitProviderModelRef } from "./model-ref.js";
5
7
  import { ModelRegistry, getModelRegistry, init_model_registry, prewarmModelRegistry, resetModelRegistry } from "./model-registry.js";
6
- import { getModelOAuthProviderIds, init_registry } from "../auth/oauth/registry.js";
7
8
  import { CredentialResolver, hasCredentials, init_credentials } from "../auth/credentials.js";
8
- import { hasProviderAuthOnDiskSync, init_sync_provider_auth } from "../auth/sync-provider-auth.js";
9
9
  import { EXTENSION_PROVIDER_BASE_URL, init_constants } from "./constants.js";
10
10
  import { applyOfficialModelMetadataCorrections, getSupplementalModels, init_model_supplements } from "./model-supplements.js";
11
11
  import { getProviderRegistry, init_plugin_registry } from "./plugin-registry.js";
@@ -1,8 +1,8 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { createLogger } from "../utils/logger/index.js";
3
3
  import { init_logger } from "../utils/logger.js";
4
- import { init_resolve_config_value, resolveConfigValue, resolveHeaders } from "../config/resolve-config-value.js";
5
4
  import { resolveModelsJsonPath } from "../config/paths.js";
5
+ import { init_resolve_config_value, resolveConfigValue, resolveHeaders } from "../config/resolve-config-value.js";
6
6
  import { getDefaultModelValues, init_models_json, validateModelsConfig } from "../config/models-json.js";
7
7
  import { getApiKeyFromEnv, init_env_keys } from "./env-keys.js";
8
8
  import { getModelCatalogStore, init_model_catalog_store } from "./model-catalog-store.js";
@@ -60,6 +60,7 @@ function applyModelOverride(model, override) {
60
60
  const result = { ...model };
61
61
  if (override.name !== void 0) result.name = override.name;
62
62
  if (override.reasoning !== void 0) result.reasoning = override.reasoning;
63
+ if (override.thinkingLevelMap !== void 0) result.thinkingLevelMap = override.thinkingLevelMap;
63
64
  if (override.input !== void 0) result.input = override.input;
64
65
  if (override.contextWindow !== void 0) result.contextWindow = override.contextWindow;
65
66
  if (override.maxTokens !== void 0) result.maxTokens = override.maxTokens;
@@ -368,6 +369,7 @@ var init_model_registry = __esmMin((() => {
368
369
  provider: providerName,
369
370
  baseUrl: providerConfig.baseUrl,
370
371
  reasoning: modelDef.reasoning ?? false,
372
+ thinkingLevelMap: modelDef.thinkingLevelMap,
371
373
  input: modelDef.input ?? defaults.input,
372
374
  cost: modelDef.cost ?? defaults.cost,
373
375
  contextWindow: modelDef.contextWindow ?? defaults.contextWindow,
@@ -0,0 +1,4 @@
1
+ import { type Api, type Model } from '@earendil-works/pi-ai';
2
+ import type { ModelThinkingCapabilities } from '@xopcai/gateway-contract';
3
+ /** Use the same capability metadata as the provider runtime. */
4
+ export declare function getModelThinking(model: Model<Api>): ModelThinkingCapabilities;
@@ -0,0 +1,41 @@
1
+ import { getSupportedThinkingLevels } from "@earendil-works/pi-ai";
2
+ //#region src/providers/model-thinking.ts
3
+ /** Use the same capability metadata as the provider runtime. */
4
+ function getModelThinking(model) {
5
+ const base = { supportsAdaptive: false };
6
+ if (!model.reasoning) return {
7
+ ...base,
8
+ mode: "none",
9
+ options: ["off"],
10
+ initialValue: "off"
11
+ };
12
+ const compat = model.compat;
13
+ const binaryFormat = [
14
+ "zai",
15
+ "qwen",
16
+ "qwen-chat-template",
17
+ "chat-template"
18
+ ].includes(compat?.thinkingFormat ?? "");
19
+ const binaryProvider = model.provider === "zai" || model.provider === "z.ai";
20
+ if ((binaryFormat || binaryProvider) && compat?.supportsReasoningEffort !== true) return {
21
+ ...base,
22
+ mode: "toggle",
23
+ options: ["off", "high"],
24
+ initialValue: "high"
25
+ };
26
+ if (compat?.supportsReasoningEffort === false) return {
27
+ ...base,
28
+ mode: "unknown",
29
+ options: ["off"],
30
+ initialValue: "off"
31
+ };
32
+ const options = getSupportedThinkingLevels(model);
33
+ return {
34
+ ...base,
35
+ mode: options.length > 1 ? "levels" : "none",
36
+ options,
37
+ initialValue: options.includes("medium") ? "medium" : options[0] ?? "off"
38
+ };
39
+ }
40
+ //#endregion
41
+ export { getModelThinking };
@@ -1,6 +1,6 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { getModelCatalogStore, init_model_catalog_store } from "./model-catalog-store.js";
3
2
  import { getOAuthProviderDefinition, init_registry } from "../auth/oauth/registry.js";
3
+ import { getModelCatalogStore, init_model_catalog_store } from "./model-catalog-store.js";
4
4
  import { XOPC_CLOUD_PROVIDER_ID, init_xopc_cloud_config, resolveXopcModelRouterUrl } from "./xopc-cloud-config.js";
5
5
  //#region src/providers/register-runtime-providers.ts
6
6
  function registerRuntimeProvider(modelRuntime, source) {
@@ -10,6 +10,7 @@ export interface SessionAgentConfig {
10
10
  verboseLevel?: VerboseLevel;
11
11
  elevatedMode?: ElevatedMode;
12
12
  modelOverride?: string;
13
+ fixedModel?: boolean;
13
14
  providerOverride?: string;
14
15
  workingDirectoryOverride?: string;
15
16
  responseLanguage?: ResponseLanguage;
@@ -1,5 +1,5 @@
1
- import { buildSessionContextForLlm, isTranscriptContextEntry, mergeLlmMessagesPreservingContextRows, transcriptRowsFromJsonArray } from "./session-context-for-llm.js";
2
1
  import { SessionStatus } from "./types.js";
2
+ import { buildSessionContextForLlm, isTranscriptContextEntry, mergeLlmMessagesPreservingContextRows, transcriptRowsFromJsonArray } from "./session-context-for-llm.js";
3
3
  import { effectiveWorkspacePathForSession, normalizeWorkingDirectoryInput, projectWorkspacePath } from "./session-workspace.js";
4
4
  import { emitSessionTranscriptUpdate, onSessionTranscriptUpdate } from "./transcript-events.js";
5
5
  import { fallbackTitleFromMessages, generateSessionTitleFromMessages, getSessionTitleSource, isWebchatSessionKey, maybeRefineSessionTitleWithLlm, maybeSetProvisionalSessionTitle, provisionalTitleFromUserText, sanitizeGeneratedSessionTitle, sanitizeSessionTitle, shouldAutoTitleSessionKey, shouldRefineSessionTitleWithLlm } from "./session-title.js";
@@ -0,0 +1,2 @@
1
+ /** Serialize configuration changes with input acceptance for one conversation. */
2
+ export declare function withModelConfigLock<T>(sessionKey: string, operation: () => Promise<T>): Promise<T>;
@@ -0,0 +1,14 @@
1
+ //#region src/session/model-config-lock.ts
2
+ const pending = /* @__PURE__ */ new Map();
3
+ /** Serialize configuration changes with input acceptance for one conversation. */
4
+ async function withModelConfigLock(sessionKey, operation) {
5
+ const next = (pending.get(sessionKey) ?? Promise.resolve()).catch(() => void 0).then(operation);
6
+ pending.set(sessionKey, next);
7
+ try {
8
+ return await next;
9
+ } finally {
10
+ if (pending.get(sessionKey) === next) pending.delete(sessionKey);
11
+ }
12
+ }
13
+ //#endregion
14
+ export { withModelConfigLock };
@@ -16,6 +16,7 @@ export declare function normalizeWorkingDirectoryInput(raw: string): {
16
16
  };
17
17
  export declare function projectWorkspacePath(project: Pick<Project, 'workspaceRoot'> | null | undefined): string | null;
18
18
  /**
19
- * Resolved markdown workspace for tools/shell: project workspace, session override, or merged agent profile default.
19
+ * Resolved workspace for tools/shell: bound execution environment, project workspace,
20
+ * session override, or merged agent profile default.
20
21
  */
21
22
  export declare function effectiveWorkspacePathForSession(cfg: Config, sessionKey: string, sessionAgentConfig: SessionAgentConfig | null | undefined, project?: Pick<Project, 'workspaceRoot'> | null): string;
@@ -1,6 +1,7 @@
1
1
  import { init_workspace_path, normalizeWorkspaceDir } from "../config/workspace-path.js";
2
2
  import { init_agent_scope, resolveUserPath } from "../agent/agent-scope.js";
3
3
  import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
4
+ import { getExecutionEnvironmentForSession } from "../execution-environments/subject.js";
4
5
  //#region src/session/session-workspace.ts
5
6
  init_agent_scope();
6
7
  init_workspace_path();
@@ -29,10 +30,13 @@ function projectWorkspacePath(project) {
29
30
  return normalizeWorkspaceDir(resolveUserPath(raw));
30
31
  }
31
32
  /**
32
- * Resolved markdown workspace for tools/shell: project workspace, session override, or merged agent profile default.
33
+ * Resolved workspace for tools/shell: bound execution environment, project workspace,
34
+ * session override, or merged agent profile default.
33
35
  */
34
36
  function effectiveWorkspacePathForSession(cfg, sessionKey, sessionAgentConfig, project) {
35
37
  const base = resolveEffectiveAgentProfileForSession(cfg, sessionKey).resolvedWorkspacePath;
38
+ const environment = getExecutionEnvironmentForSession(sessionKey);
39
+ if (environment) return environment.rootPath;
36
40
  const projectWorkspace = projectWorkspacePath(project);
37
41
  if (projectWorkspace) return projectWorkspace;
38
42
  const o = sessionAgentConfig?.workingDirectoryOverride?.trim();
@@ -3,8 +3,8 @@ import { createLogger } from "../utils/logger/index.js";
3
3
  import { init_logger } from "../utils/logger.js";
4
4
  import { requireXopcDatabase } from "../storage/sqlite/connection.js";
5
5
  import { runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
6
- import { buildSessionContextForLlm, buildSessionDisplayMessages, isRuntimeOnlyTranscriptMessage, isTranscriptCompactionEntry, mergeLlmMessagesPreservingContextRows, transcriptRowsFromJsonArray } from "./session-context-for-llm.js";
7
6
  import "./types.js";
7
+ import { buildSessionContextForLlm, buildSessionDisplayMessages, isRuntimeOnlyTranscriptMessage, isTranscriptCompactionEntry, mergeLlmMessagesPreservingContextRows, transcriptRowsFromJsonArray } from "./session-context-for-llm.js";
8
8
  import { init_agent_session_key, resolveAgentIdFromSessionKey } from "../routing/agent-session-key.js";
9
9
  import { estimateTokensFromMessages } from "../storage/sqlite/row-mappers.js";
10
10
  import { deleteSessionRecord, ensureSessionRecord, findSessionKeyBySessionId, getGlobalSessionStats, getSessionMetadata, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord } from "../storage/sqlite/session-repository.js";
@@ -1,4 +1,4 @@
1
- import { TurnOutcomeDeliverableSchema, fileResourceArtifactUri, parseTurnOutcome, turnOutcomeKindFromFileName, turnOutcomeMimeTypeFromFileName } from "../../packages/gateway-contract/src/turn-outcome.js";
1
+ import { TurnOutcomeDeliverableSchema, fileResourceArtifactUri, mergeTurnOutcomeDeliverables, parseTurnOutcome, turnOutcomeKindFromFileName, turnOutcomeMimeTypeFromFileName } from "../../packages/gateway-contract/src/turn-outcome.js";
2
2
  import { parseProductDeliveryEnvelope } from "../../packages/gateway-contract/src/product-delivery.js";
3
3
  import { parseFileResourceId } from "../files/file-service.js";
4
4
  //#region src/session/turn-outcome-projector.ts
@@ -28,6 +28,7 @@ function fileDeliverable(reference, failed) {
28
28
  const available = !failed && managedFile;
29
29
  return {
30
30
  artifactId: reference.id,
31
+ ...managedFile ? { sourceFileId: reference.id } : {},
31
32
  title: reference.title,
32
33
  kind: turnOutcomeKindFromFileName(reference.title),
33
34
  ...mimeType ? { mimeType } : {},
@@ -124,8 +125,9 @@ function projectTurnOutcome(params) {
124
125
  }
125
126
  }
126
127
  const evidenceItems = [...evidence.values()];
127
- const artifactItems = [...deliverables.values()];
128
- const partial = failedToolCount > 0 || evidenceItems.some((item) => item.status === "failed") || artifactItems.some((item) => item.availability !== "available");
128
+ const collectedArtifacts = [...deliverables.values()];
129
+ const artifactItems = mergeTurnOutcomeDeliverables(collectedArtifacts);
130
+ const partial = failedToolCount > 0 || evidenceItems.some((item) => item.status === "failed") || collectedArtifacts.some((item) => item.availability !== "available");
129
131
  const diff = diffs.join("\n");
130
132
  const diffTruncated = diff.length > MAX_OUTCOME_DIFF_CHARS;
131
133
  const createdAt = new Date(createdAtMs || Date.now()).toISOString();
@@ -169,23 +171,21 @@ function backfillStructuredTurnOutcomes(rows) {
169
171
  });
170
172
  if (outcome.deliverables.length > 0) projected.set(turnId, outcome);
171
173
  }
172
- if (projected.size === 0) return [...rows];
174
+ if (projected.size === 0 && existing.size === 0) return [...rows];
173
175
  const result = [];
174
176
  for (const [index, source] of rows.entries()) {
175
177
  const row = source;
176
178
  if (row.type === "custom" && row.customType === "turn_outcome") {
177
179
  const outcome = parseTurnOutcome(row.data);
178
180
  const candidate = outcome ? projected.get(outcome.turnId) : void 0;
179
- if (outcome && candidate) {
180
- const merged = new Map(outcome.deliverables.map((item) => [item.artifactId, item]));
181
- for (const item of candidate.deliverables) merged.set(item.artifactId, item);
182
- const deliverables = [...merged.values()];
181
+ if (outcome) {
182
+ const deliverables = mergeTurnOutcomeDeliverables([...outcome.deliverables, ...candidate?.deliverables ?? []]);
183
183
  result.push({
184
184
  ...row,
185
185
  data: {
186
186
  ...outcome,
187
187
  deliverables,
188
- status: outcome.status === "failed" ? "failed" : deliverables.some((item) => item.availability !== "available") ? "partial" : outcome.status
188
+ status: outcome.status === "failed" ? "failed" : candidate?.status === "partial" || deliverables.some((item) => item.availability !== "available") ? "partial" : outcome.status
189
189
  }
190
190
  });
191
191
  continue;
@@ -1,6 +1,6 @@
1
1
  import { resolveStateDir } from "../config/paths-state.js";
2
- import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
3
2
  import { init_paths } from "../config/paths.js";
3
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
4
4
  import { CredentialResolver, init_credentials } from "../auth/credentials.js";
5
5
  import { resolveMediaReference } from "../media/media-reference.js";
6
6
  import { projectSessionShare } from "./session-share-projector.js";