@xopcai/xopc 0.0.234 → 0.0.238

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 (320) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/schema/config-schema.d.ts +8 -8
  3. package/dist/extensions/telegram/src/config-schema.d.ts +8 -8
  4. package/dist/extensions/telegram/xopc.extension.json +1 -1
  5. package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
  6. package/dist/gateway/static/root/assets/{activity-store-BzswYHcj.js → activity-store-DLfkwJzZ.js} +1 -1
  7. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CztNAQyE.js → agent-avatar-dicebear-BCZ6T3y8.js} +1 -1
  8. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-KPtQudPf.js +1 -0
  9. package/dist/gateway/static/root/assets/agents-DKQZKGCB.js +1 -0
  10. package/dist/gateway/static/root/assets/{api-7zOtMbaE.js → api-IUm57Zse.js} +1 -1
  11. package/dist/gateway/static/root/assets/app-management-settings-panel-B_h6HVgw.js +1 -0
  12. package/dist/gateway/static/root/assets/appearance-settings-D07Ew40N.js +1 -0
  13. package/dist/gateway/static/root/assets/apps-page-_toby2SK.js +1 -0
  14. package/dist/gateway/static/root/assets/{archive-plugin-DawToDU8.js → archive-plugin-Bha1jUhj.js} +1 -1
  15. package/dist/gateway/static/root/assets/{attachment-load-BpCKsdiO.js → attachment-load-C2Ac3q6g.js} +1 -1
  16. package/dist/gateway/static/root/assets/{automations-page-a6_hTplT.js → automations-page-Bc4Is3z0.js} +1 -1
  17. package/dist/gateway/static/root/assets/automations-workspace-DH-QeQ0O.js +6 -0
  18. package/dist/gateway/static/root/assets/{binary-plugins-OqUf-uET.js → binary-plugins-yMQJYHIQ.js} +1 -1
  19. package/dist/gateway/static/root/assets/{block-editor-9OAYqVKF.js → block-editor-DrNzI_0p.js} +56 -56
  20. package/dist/gateway/static/root/assets/browser-settings-page-Bv8GclZd.js +8 -0
  21. package/dist/gateway/static/root/assets/{browser-workflow-inputs-4ooVX-Tx.js → browser-workflow-inputs-CHHw7Ula.js} +1 -1
  22. package/dist/gateway/static/root/assets/{browser-workflows-page-CUgwXXsi.js → browser-workflows-page-D_EOs50E.js} +2 -2
  23. package/dist/gateway/static/root/assets/capabilities-settings-panel-gKLN0aaW.js +7 -0
  24. package/dist/gateway/static/root/assets/channels-settings-Bh7BqWsN.js +1 -0
  25. package/dist/gateway/static/root/assets/{channels-status-swr-BDJvMnA_.js → channels-status-swr-CwUSKmeY.js} +1 -1
  26. package/dist/gateway/static/root/assets/chat-terminal-dock-B7agEwma.js +36 -0
  27. package/dist/gateway/static/root/assets/connectors-page-DifO0WX4.js +2 -0
  28. package/dist/gateway/static/root/assets/{cron-expression-a9Jyianb.js → cron-expression-bjxQQFdv.js} +1 -1
  29. package/dist/gateway/static/root/assets/{date-picker-B_l2CHWO.js → date-picker-C7ujLHll.js} +1 -1
  30. package/dist/gateway/static/root/assets/dependency-picker-rl8E7nXp.js +1 -0
  31. package/dist/gateway/static/root/assets/{desktop-pet-ZCBsj8Je.js → desktop-pet-D4GbYBcD.js} +1 -1
  32. package/dist/gateway/static/root/assets/desktop-pet-settings-Bo34tFlD.js +1 -0
  33. package/dist/gateway/static/root/assets/{extension-debug-page-CMXbAkx-.js → extension-debug-page-DuPa1bVQ.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-page-WWePedpo.js → extension-page-CB9xF3qo.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-settings-page-DjIhNJVI.js → extension-settings-page-CovEdmGD.js} +1 -1
  36. package/dist/gateway/static/root/assets/{files-Dp8_uGTO.js → files-DQjhZjr2.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-config-api-BNj6srhV.js → gateway-config-api-CAaoukkR.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-CesXGTe3.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-Bu5cIcNb.js +1 -0
  42. package/dist/gateway/static/root/assets/home-page-sQfx98tH.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-C73V7tJP.js +70 -0
  45. package/dist/gateway/static/root/assets/index-C9rUND9-.css +2 -0
  46. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-d12AAEaC.js → keyboard-shortcuts-settings-CpZxPmd0.js} +1 -1
  47. package/dist/gateway/static/root/assets/local-app-workbench-page-DjvHSI0e.js +2 -0
  48. package/dist/gateway/static/root/assets/local-apps-page-5KTZwLbX.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-frYgoe2x.js +2 -0
  51. package/dist/gateway/static/root/assets/management-settings-9iZjSpHe.js +1 -0
  52. package/dist/gateway/static/root/assets/{markdown-split-7rTfQCN_.js → markdown-split-C4-0M8mu.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-BIfKo5Ow.js → media-plugins-CjMa9GMF.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-DikJ7HCm.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-dOvbZBOQ.js → notes-page-CC45W2KR.js} +1 -1
  61. package/dist/gateway/static/root/assets/notes-workbench-BFreGbmY.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-53z9nB5L.js +1 -0
  67. package/dist/gateway/static/root/assets/projects-page-DR7OvyAl.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-BkSGDDbn.js +1 -0
  70. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-D3PS55Yg.js → runtime-tools-settings-panel-DLv-QsQo.js} +1 -1
  71. package/dist/gateway/static/root/assets/{schema-form-H-aeWTzM.js → schema-form-DDW7aJWa.js} +1 -1
  72. package/dist/gateway/static/root/assets/sessions-page-C-yaSuuQ.js +1 -0
  73. package/dist/gateway/static/root/assets/settings-advanced-gate-CelrRPXt.js +1 -0
  74. package/dist/gateway/static/root/assets/{settings-form-section-B9oF8Rhw.js → settings-form-section-5NTg906_.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-C6pmQNzY.js → settings-page-DgTYtrmh.js} +1 -1
  77. package/dist/gateway/static/root/assets/setup-status-panel-Dm_gdAfm.js +1 -0
  78. package/dist/gateway/static/root/assets/share-preview-page-BX2Ev7-I.js +2 -0
  79. package/dist/gateway/static/root/assets/shares-settings-D2Zd9l04.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-BvND7xsL.js +1 -0
  82. package/dist/gateway/static/root/assets/{skills-page-CfNV6kgb.js → skills-page-Cmqu9f_n.js} +1 -1
  83. package/dist/gateway/static/root/assets/{skills-page.utils-DgxGb7v7.js → skills-page.utils-KOxLvm84.js} +1 -1
  84. package/dist/gateway/static/root/assets/system-settings-panel-CS7cDwv2.js +1 -0
  85. package/dist/gateway/static/root/assets/task-detail-page-COpgFG6K.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-D3h311_s.js +1 -0
  88. package/dist/gateway/static/root/assets/{use-autosave-DR7YWBzR.js → use-autosave-DvATIVb_.js} +1 -1
  89. package/dist/gateway/static/root/assets/user-context-page-PKrbPu4w.js +1 -0
  90. package/dist/gateway/static/root/assets/{voice-api-key-field-BZhqoxBR.js → voice-api-key-field-C3BgRKG2.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-CouKiK45.js → work-discovery-overlay-DHcQSZZD.js} +1 -1
  93. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CUqAESrr.js → workflow-run-setup-panel-Nx6xmy_N.js} +2 -2
  94. package/dist/gateway/static/root/assets/workflows-page-DBkP6B4E.js +5 -0
  95. package/dist/gateway/static/root/index.html +19 -18
  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 +2 -2
  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/create-share-tool.js +1 -1
  122. package/dist/src/agent/tools/exec-command.js +1 -0
  123. package/dist/src/agent/tools/publish-artifacts.d.ts +1 -0
  124. package/dist/src/agent/tools/publish-artifacts.js +16 -5
  125. package/dist/src/agent/tools/send-media.js +1 -1
  126. package/dist/src/agent/tools/workflow-tool.js +1 -1
  127. package/dist/src/agent/tools/write.js +1 -1
  128. package/dist/src/agent/tools/xopc-use-tool.js +2 -2
  129. package/dist/src/agent/transcript/thinking-types.d.ts +1 -1
  130. package/dist/src/agent/transcript/thinking-types.js +2 -0
  131. package/dist/src/agent-config/schema.d.ts +16 -16
  132. package/dist/src/ai-assist/text-assist.js +1 -1
  133. package/dist/src/auth/credentials.js +2 -2
  134. package/dist/src/auth/profiles/store.js +1 -1
  135. package/dist/src/auth/sync-provider-auth.js +2 -2
  136. package/dist/src/automations/domain/validation.d.ts +62 -62
  137. package/dist/src/automations/draft/automation-draft-validator.d.ts +10 -10
  138. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  139. package/dist/src/chat-commands/builtins/thinking.js +1 -0
  140. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  141. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  142. package/dist/src/cli/commands/models.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/files/file-service.d.ts +10 -2
  166. package/dist/src/files/file-service.js +33 -12
  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.d.ts +30 -0
  171. package/dist/src/gateway/file-path-classifier.js +105 -0
  172. package/dist/src/gateway/file-reference-errors.d.ts +6 -0
  173. package/dist/src/gateway/file-reference-errors.js +21 -0
  174. package/dist/src/gateway/file-reference-registry.d.ts +34 -0
  175. package/dist/src/gateway/file-reference-registry.js +45 -0
  176. package/dist/src/gateway/file-space-service.d.ts +4 -0
  177. package/dist/src/gateway/file-space-service.js +19 -0
  178. package/dist/src/gateway/hono/app.js +3 -1
  179. package/dist/src/gateway/hono/lib/config-payload.d.ts +4 -4
  180. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  181. package/dist/src/gateway/hono/routes/chat-model-config.d.ts +34 -0
  182. package/dist/src/gateway/hono/routes/chat-model-config.js +42 -0
  183. package/dist/src/gateway/hono/routes/device-pairing-approval.d.ts +3 -0
  184. package/dist/src/gateway/hono/routes/device-pairing-approval.js +100 -0
  185. package/dist/src/gateway/hono/routes/devices.js +15 -8
  186. package/dist/src/gateway/hono/routes/execution-environments.d.ts +3 -0
  187. package/dist/src/gateway/hono/routes/execution-environments.js +136 -0
  188. package/dist/src/gateway/hono/routes/file-references.d.ts +4 -0
  189. package/dist/src/gateway/hono/routes/file-references.js +98 -0
  190. package/dist/src/gateway/hono/routes/files.js +39 -17
  191. package/dist/src/gateway/hono/routes/html-preview.d.ts +4 -0
  192. package/dist/src/gateway/hono/routes/html-preview.js +45 -0
  193. package/dist/src/gateway/hono/routes/index.js +4 -0
  194. package/dist/src/gateway/hono/routes/mobile-privacy.d.ts +3 -0
  195. package/dist/src/gateway/hono/routes/mobile-privacy.js +13 -0
  196. package/dist/src/gateway/hono/routes/models.js +10 -1
  197. package/dist/src/gateway/hono/routes/projects.js +43 -4
  198. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +15 -1
  199. package/dist/src/gateway/hono/routes/session-input-handler.js +122 -52
  200. package/dist/src/gateway/hono/routes/sessions.js +105 -22
  201. package/dist/src/gateway/hono/routes/shares.js +18 -10
  202. package/dist/src/gateway/hono/routes/tasks.js +7 -15
  203. package/dist/src/gateway/mobile-privacy.d.ts +7 -0
  204. package/dist/src/gateway/mobile-privacy.js +102 -0
  205. package/dist/src/gateway/security/csp.d.ts +1 -1
  206. package/dist/src/gateway/security/csp.js +2 -2
  207. package/dist/src/gateway/security/gateway-scopes.js +1 -0
  208. package/dist/src/gateway/service/agent-runner.d.ts +1 -1
  209. package/dist/src/gateway/service/config-coordinator.js +1 -1
  210. package/dist/src/gateway/service/session-input-coordinator.d.ts +2 -1
  211. package/dist/src/gateway/service/session-input-coordinator.js +14 -5
  212. package/dist/src/gateway/service/sessions-api.d.ts +4 -12
  213. package/dist/src/gateway/service/sessions-api.js +13 -0
  214. package/dist/src/gateway/service.d.ts +1 -1
  215. package/dist/src/gateway/service.js +3 -3
  216. package/dist/src/gateway/session-context-summary.d.ts +5 -0
  217. package/dist/src/gateway/session-context-summary.js +151 -0
  218. package/dist/src/i18n/response-language.d.ts +1 -1
  219. package/dist/src/projects/index.js +3 -3
  220. package/dist/src/projects/project-kind.d.ts +7 -0
  221. package/dist/src/projects/project-kind.js +6 -1
  222. package/dist/src/projects/project-service.js +10 -2
  223. package/dist/src/projects/project-store.d.ts +1 -0
  224. package/dist/src/projects/project-store.js +10 -7
  225. package/dist/src/projects/types.d.ts +4 -0
  226. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
  227. package/dist/src/providers/index.js +2 -2
  228. package/dist/src/providers/model-registry.js +3 -1
  229. package/dist/src/providers/model-thinking.d.ts +4 -0
  230. package/dist/src/providers/model-thinking.js +41 -0
  231. package/dist/src/providers/register-runtime-providers.js +1 -1
  232. package/dist/src/session/config-types.d.ts +1 -0
  233. package/dist/src/session/index.js +1 -1
  234. package/dist/src/session/model-config-lock.d.ts +2 -0
  235. package/dist/src/session/model-config-lock.js +14 -0
  236. package/dist/src/session/session-workspace.d.ts +2 -1
  237. package/dist/src/session/session-workspace.js +5 -1
  238. package/dist/src/session/store.js +1 -1
  239. package/dist/src/session/turn-outcome-projector.js +9 -9
  240. package/dist/src/share/hosted-session-share.js +1 -1
  241. package/dist/src/storage/sqlite/config-repository.d.ts +5 -0
  242. package/dist/src/storage/sqlite/config-repository.js +14 -6
  243. package/dist/src/storage/sqlite/device-access-repository.d.ts +2 -0
  244. package/dist/src/storage/sqlite/device-access-repository.js +12 -2
  245. package/dist/src/storage/sqlite/device-pairing-approval.d.ts +19 -0
  246. package/dist/src/storage/sqlite/device-pairing-approval.js +154 -0
  247. package/dist/src/storage/sqlite/device-pairing-repository.d.ts +1 -1
  248. package/dist/src/storage/sqlite/device-pairing-repository.js +11 -4
  249. package/dist/src/storage/sqlite/index.js +2 -2
  250. package/dist/src/storage/sqlite/migrations/141_device_pairing_approval.sql +17 -0
  251. package/dist/src/storage/sqlite/migrations/142_session_input_instance.sql +1 -0
  252. package/dist/src/storage/sqlite/migrations/143_fixed_session_model.sql +1 -0
  253. package/dist/src/storage/sqlite/migrations/144_execution_environments.sql +59 -0
  254. package/dist/src/storage/sqlite/migrations/145_project_execution_mode.sql +5 -0
  255. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  256. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  257. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  258. package/dist/src/storage/sqlite/row-mappers.d.ts +1 -0
  259. package/dist/src/storage/sqlite/row-mappers.js +3 -2
  260. package/dist/src/storage/sqlite/schema.js +1 -1
  261. package/dist/src/storage/sqlite/session-input-repository.d.ts +5 -0
  262. package/dist/src/storage/sqlite/session-input-repository.js +15 -4
  263. package/dist/src/storage/sqlite/session-repository.js +1 -1
  264. package/dist/src/tasks/execution-context.d.ts +3 -1
  265. package/dist/src/tasks/execution-context.js +7 -2
  266. package/dist/src/tasks/task-signal-service.js +1 -1
  267. package/dist/src/tui/backends/embedded-backend.js +1 -1
  268. package/dist/src/tui/components/thinking-selector.js +1 -0
  269. package/dist/src/tui/tui-settings.js +1 -1
  270. package/dist/src/tui/tui-startup-resources.js +1 -1
  271. package/dist/src/tui/tui.js +1 -1
  272. package/dist/src/user-context/config.d.ts +9 -9
  273. package/dist/src/work-discovery/service.d.ts +1 -1
  274. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  275. package/package.json +3 -3
  276. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-BHeLVAW5.js +0 -1
  277. package/dist/gateway/static/root/assets/agents-B8c0U7Ze.js +0 -1
  278. package/dist/gateway/static/root/assets/app-management-settings-panel-BxBMAdWc.js +0 -1
  279. package/dist/gateway/static/root/assets/appearance-settings-DVAxCOPL.js +0 -1
  280. package/dist/gateway/static/root/assets/apps-page-BtzXxSYK.js +0 -1
  281. package/dist/gateway/static/root/assets/automations-workspace-C7ZwZl04.js +0 -6
  282. package/dist/gateway/static/root/assets/browser-settings-page-CEHhbDj0.js +0 -8
  283. package/dist/gateway/static/root/assets/capabilities-settings-panel-CAbI9beX.js +0 -7
  284. package/dist/gateway/static/root/assets/channels-settings-BksDnAyv.js +0 -1
  285. package/dist/gateway/static/root/assets/chat-terminal-dock-DB9zi_dy.js +0 -36
  286. package/dist/gateway/static/root/assets/connectors-page-CnY8lcGJ.js +0 -2
  287. package/dist/gateway/static/root/assets/dependency-picker-DjcEIzVJ.js +0 -1
  288. package/dist/gateway/static/root/assets/desktop-pet-settings-DJJf0EvL.js +0 -1
  289. package/dist/gateway/static/root/assets/gateway-settings-DvlFDxhZ.js +0 -1
  290. package/dist/gateway/static/root/assets/heartbeat-settings-Dlahslof.js +0 -1
  291. package/dist/gateway/static/root/assets/home-page-DJhUd30b.js +0 -1
  292. package/dist/gateway/static/root/assets/index-BTUuTnc9.css +0 -2
  293. package/dist/gateway/static/root/assets/index-CXGQihfj.js +0 -70
  294. package/dist/gateway/static/root/assets/local-app-workbench-page-DUP0UiFY.js +0 -2
  295. package/dist/gateway/static/root/assets/local-apps-page-_z2o0cD1.js +0 -1
  296. package/dist/gateway/static/root/assets/logs-page-CPUaLcGH.js +0 -2
  297. package/dist/gateway/static/root/assets/management-settings-eTBfNgXU.js +0 -1
  298. package/dist/gateway/static/root/assets/markdown-view-B1bGSQqt.css +0 -1
  299. package/dist/gateway/static/root/assets/markdown-view-D02mJdoU.js +0 -201
  300. package/dist/gateway/static/root/assets/messages-CoovNoMn.js +0 -3
  301. package/dist/gateway/static/root/assets/mobile-device-api-CvjVB_TB.js +0 -1
  302. package/dist/gateway/static/root/assets/models-hub-cache-CYr6LzvY.js +0 -1
  303. package/dist/gateway/static/root/assets/notes-workbench-DQMUpDc9.js +0 -4
  304. package/dist/gateway/static/root/assets/popover-select-3E24E65N.js +0 -1
  305. package/dist/gateway/static/root/assets/product-open-page-CgZhadZQ.js +0 -1
  306. package/dist/gateway/static/root/assets/project-detail-page-D1HidxgT.js +0 -1
  307. package/dist/gateway/static/root/assets/projects-page-CxwNbbud.js +0 -1
  308. package/dist/gateway/static/root/assets/remote-access-hub-CK59rSc_.js +0 -1
  309. package/dist/gateway/static/root/assets/sessions-page-C2tP7363.js +0 -1
  310. package/dist/gateway/static/root/assets/settings-advanced-gate-DlYBA2N-.js +0 -1
  311. package/dist/gateway/static/root/assets/settings-loading-skeleton-CazDM3n5.js +0 -1
  312. package/dist/gateway/static/root/assets/setup-status-panel-Cn2E0G2o.js +0 -1
  313. package/dist/gateway/static/root/assets/share-preview-page-XgxvE8cx.js +0 -2
  314. package/dist/gateway/static/root/assets/shares-settings-Czph0_fM.js +0 -1
  315. package/dist/gateway/static/root/assets/skill-reload-api-DDq_QEqd.js +0 -1
  316. package/dist/gateway/static/root/assets/system-settings-panel-B4W--Ukh.js +0 -1
  317. package/dist/gateway/static/root/assets/task-detail-page-UY5kNWoR.js +0 -1
  318. package/dist/gateway/static/root/assets/user-context-page-DnUL8kJU.js +0 -1
  319. package/dist/gateway/static/root/assets/workflows-page-B8dJRjMJ.js +0 -5
  320. /package/dist/gateway/static/root/assets/{dist-DqPZM2MH2.js → dist-DqPZM2MH.js} +0 -0
@@ -0,0 +1,5 @@
1
+ import type { SessionContextSummary } from '@xopcai/gateway-contract';
2
+ import type { Config } from '../config/schema.js';
3
+ import { type GatewayScope } from './security/gateway-scopes.js';
4
+ /** A bounded metadata-only query. It never prepares Note context or starts an agent. */
5
+ export declare function getSessionContextSummary(config: Config, sessionKey: string, scopes: readonly GatewayScope[]): Promise<SessionContextSummary | null>;
@@ -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,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,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";
@@ -1,5 +1,10 @@
1
1
  import type { SessionAgentConfig } from '../../session/config-types.js';
2
2
  export declare function getSessionConfig(sessionKey: string): SessionAgentConfig | null;
3
+ /** Persisted file locations must be discoverable before a session runs again. */
4
+ export declare function listSessionWorkspaceOverrides(): Array<{
5
+ sessionKey: string;
6
+ workingDirectoryOverride: string;
7
+ }>;
3
8
  export declare function setSessionConfig(sessionKey: string, config: SessionAgentConfig, cwd: string): SessionAgentConfig;
4
9
  export declare function updateSessionConfig(sessionKey: string, partial: Partial<SessionAgentConfig>, cwd: string): SessionAgentConfig;
5
10
  export declare function deleteSessionConfig(sessionKey: string): void;