@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.
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
- package/dist/extensions/feishu/src/schema/config-schema.d.ts +8 -8
- package/dist/extensions/telegram/src/config-schema.d.ts +8 -8
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
- package/dist/gateway/static/root/assets/{activity-store-BzswYHcj.js → activity-store-DLfkwJzZ.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-dvh9aEm6.js → agent-avatar-dicebear-C1rtpjd7.js} +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-oW6wFuP9.js +1 -0
- package/dist/gateway/static/root/assets/agents-V-nDPOk2.js +1 -0
- package/dist/gateway/static/root/assets/{api-7zOtMbaE.js → api-IUm57Zse.js} +1 -1
- package/dist/gateway/static/root/assets/app-management-settings-panel-CRDnRN4G.js +1 -0
- package/dist/gateway/static/root/assets/appearance-settings-BCYZIKqQ.js +1 -0
- package/dist/gateway/static/root/assets/apps-page-dcvQDCvy.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-DawToDU8.js → archive-plugin-Bha1jUhj.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-DmBAKvsi.js → attachment-load-Bgfh7Ag2.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-BGkF6XNH.js → automations-page-BdH131M0.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-BtwzQZAR.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-B-6Ski7l.js → binary-plugins-BwXg9na-.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-BgeKQN1F.js → block-editor-BngtUSNv.js} +56 -56
- package/dist/gateway/static/root/assets/browser-settings-page-kfNOKQ2x.js +8 -0
- package/dist/gateway/static/root/assets/{browser-workflow-inputs-4ooVX-Tx.js → browser-workflow-inputs-CHHw7Ula.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-workflows-page-D92g81lS.js → browser-workflows-page-Ael9sxrp.js} +2 -2
- package/dist/gateway/static/root/assets/capabilities-settings-panel-DOymgkUM.js +7 -0
- package/dist/gateway/static/root/assets/channels-settings-YscUvFub.js +1 -0
- package/dist/gateway/static/root/assets/{channels-status-swr-BDJvMnA_.js → channels-status-swr-CwUSKmeY.js} +1 -1
- package/dist/gateway/static/root/assets/chat-terminal-dock-DI0lYVKk.js +36 -0
- package/dist/gateway/static/root/assets/connectors-page-BtzCRQGz.js +2 -0
- package/dist/gateway/static/root/assets/{cron-expression-BYmr5ZuN.js → cron-expression-CLuvPZ3b.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-FKL_b_S0.js → date-picker-D4QS8Zzn.js} +1 -1
- package/dist/gateway/static/root/assets/dependency-picker-DZn-RhEm.js +1 -0
- package/dist/gateway/static/root/assets/{desktop-pet-DOXjRTqK.js → desktop-pet-C6KqTQas.js} +1 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-Bov3XuPO.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-BeJ1-5ID.js → extension-debug-page-DpeeYAjX.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CncDndLS.js → extension-page-Cescx_be.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-BxxL0HqU.js → extension-settings-page-C_ubW61U.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-Dc6A6HyJ.js → gateway-config-api-BM79X1jC.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-R702lNJR.js → gateway-config-swr-DfMY-MLf.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-GV5KAj-l.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-2rVSUvyw.js → gateway-startup-retry-S6aB0hVI.js} +1 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-CZ1KeXXU.js +1 -0
- package/dist/gateway/static/root/assets/home-page-YdVal_8I.js +1 -0
- package/dist/gateway/static/root/assets/{image-generation-api-B28USRCK.js → image-generation-api-DOX5uq-R.js} +1 -1
- package/dist/gateway/static/root/assets/index-7GLgmvAm.css +2 -0
- package/dist/gateway/static/root/assets/index-DKP23eMn.js +70 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-Cwinks_5.js → keyboard-shortcuts-settings-Tn7xSeVT.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-DCt7cbvK.js +2 -0
- package/dist/gateway/static/root/assets/local-apps-page-Co5_qKEQ.js +1 -0
- package/dist/gateway/static/root/assets/{locale-store-8k4mvYGL.js → locale-store-XDFAPNNu.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-ChfSQQSV.js +2 -0
- package/dist/gateway/static/root/assets/management-settings-DE0o5c7Y.js +1 -0
- package/dist/gateway/static/root/assets/{markdown-split-B6wQhwLV.js → markdown-split-CADkGbQi.js} +1 -1
- package/dist/gateway/static/root/assets/markdown-view-Y68dCxuc.css +1 -0
- package/dist/gateway/static/root/assets/markdown-view-v-O3cOpk.js +201 -0
- package/dist/gateway/static/root/assets/{media-plugins-BSEPuO76.js → media-plugins-mHodPaFz.js} +1 -1
- package/dist/gateway/static/root/assets/messages-B1HDp_j8.js +3 -0
- package/dist/gateway/static/root/assets/mobile-pairing-wizard-43FyMswX.js +1 -0
- package/dist/gateway/static/root/assets/models-hub-cache-Bngs8o1m.js +1 -0
- package/dist/gateway/static/root/assets/{notes-api-p2Pncp2B.js → notes-api-BMhFpRmW.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-CPgbeO1u.js → notes-page-BMUyJStB.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-DjHIQneE.js +4 -0
- package/dist/gateway/static/root/assets/{oauth-api-DpLONwfK.js → oauth-api-B_pcOUfT.js} +1 -1
- package/dist/gateway/static/root/assets/popover-select-DBrVS3tZ.js +1 -0
- package/dist/gateway/static/root/assets/{product-delivery-tRr-7IxY.js → product-delivery-dUJgmBQZ.js} +1 -1
- package/dist/gateway/static/root/assets/product-open-page-B8cjLdm4.js +1 -0
- package/dist/gateway/static/root/assets/project-detail-page-CXD2pVgQ.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-cqKqkTwG.js +1 -0
- package/dist/gateway/static/root/assets/{registry-api-B7b0LJgI.js → registry-api-DeVvBsl4.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-UEinEd7d.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-D3TCJGy3.js → runtime-tools-settings-panel-ClCEmwPY.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-DUAlwNoO.js → schema-form-0vcUqeqa.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-Cc6ve-qc.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-_J5FSEYX.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-D7nQ3Lfu.js → settings-form-section-BkdLf_sS.js} +1 -1
- package/dist/gateway/static/root/assets/settings-loading-skeleton-CAmWMaOT.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-CMAkMc3I.js → settings-page-QBTaBpBn.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-bQcSMkVr.js +1 -0
- package/dist/gateway/static/root/assets/share-preview-page-D_OuXnah.js +2 -0
- package/dist/gateway/static/root/assets/shares-settings-DJfcpok3.js +1 -0
- package/dist/gateway/static/root/assets/skeleton-BwbyijEw.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-Bbqp5HaH.js +1 -0
- package/dist/gateway/static/root/assets/{skills-page-DJRr5HFw.js → skills-page-BNcnmaTg.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page.utils-DcrBe39q.js → skills-page.utils-BWWcFShl.js} +1 -1
- package/dist/gateway/static/root/assets/system-settings-panel-BsH7b3B4.js +1 -0
- package/dist/gateway/static/root/assets/task-detail-page-CcAhyw2Z.js +1 -0
- package/dist/gateway/static/root/assets/{theme-store-CpcBI73Q.js → theme-store-5-XHH7F0.js} +1 -1
- package/dist/gateway/static/root/assets/tunnel-api-D5-Hggt3.js +1 -0
- package/dist/gateway/static/root/assets/{use-autosave-DDEypreQ.js → use-autosave-Dp1ycDa8.js} +1 -1
- package/dist/gateway/static/root/assets/user-context-page-Dd_oMNie.js +1 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-BLa_vdXE.js → voice-api-key-field-DhrQXH3c.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-ynE-vY6I.js → voice-config-api-Bk_bVeGX.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-DS3w1Fyq.js → work-discovery-overlay-B7zKAPrb.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-jQl_wmYC.js → workflow-run-setup-panel-Cek9K48F.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-T2q2Mx6H.js +5 -0
- package/dist/gateway/static/root/index.html +18 -17
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/device-pairing.js +39 -0
- package/dist/packages/gateway-contract/src/model-selection.js +7 -0
- package/dist/packages/gateway-contract/src/new-session.js +9 -2
- package/dist/packages/gateway-contract/src/turn-outcome.js +27 -2
- package/dist/src/agent/agent-manager.js +4 -4
- package/dist/src/agent/background-review/run-background-review.js +1 -1
- package/dist/src/agent/embedded/model-runtime.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js +1 -1
- package/dist/src/agent/embedded/run-turn.js +5 -0
- package/dist/src/agent/image/tool-model-config.js +1 -1
- package/dist/src/agent/ipc/inbox.js +1 -1
- package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +1 -1
- package/dist/src/agent/models/manager.d.ts +3 -0
- package/dist/src/agent/models/manager.js +9 -0
- package/dist/src/agent/prompt/sections/tooling.js +1 -0
- package/dist/src/agent/service.js +2 -2
- package/dist/src/agent/session/session-config-service.d.ts +6 -2
- package/dist/src/agent/session/session-config-service.js +78 -17
- package/dist/src/agent/session/session-hydrator.d.ts +3 -4
- package/dist/src/agent/session/session-hydrator.js +19 -8
- package/dist/src/agent/session/session-inspector.d.ts +3 -1
- package/dist/src/agent/session/session-inspector.js +8 -4
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/tasks/task-judge-service.js +3 -3
- package/dist/src/agent/tools/exec-command.js +1 -0
- package/dist/src/agent/tools/publish-artifacts.d.ts +1 -0
- package/dist/src/agent/tools/publish-artifacts.js +15 -4
- package/dist/src/agent/tools/xopc-use-tool.js +4 -4
- package/dist/src/agent/transcript/thinking-types.d.ts +1 -1
- package/dist/src/agent/transcript/thinking-types.js +2 -0
- package/dist/src/agent-config/schema.d.ts +16 -16
- package/dist/src/ai-assist/text-assist.js +1 -1
- package/dist/src/auth/credentials.js +2 -2
- package/dist/src/auth/profiles/store.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +2 -2
- package/dist/src/automations/domain/validation.d.ts +62 -62
- package/dist/src/automations/draft/automation-draft-validator.d.ts +10 -10
- package/dist/src/browser/providers/browser-ext-install.js +1 -1
- package/dist/src/chat-commands/builtins/thinking.js +1 -0
- package/dist/src/cli/commands/channels.js +1 -1
- package/dist/src/cli/commands/connectors.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +2 -2
- package/dist/src/cli/commands/models.js +2 -2
- package/dist/src/cli/commands/onboard.js +1 -1
- package/dist/src/config/index.js +4 -4
- package/dist/src/config/loader.js +1 -1
- package/dist/src/config/models-json.d.ts +137 -11
- package/dist/src/config/models-json.js +29 -2
- package/dist/src/config/schema.d.ts +15 -15
- package/dist/src/execution-environments/git.d.ts +27 -0
- package/dist/src/execution-environments/git.js +125 -0
- package/dist/src/execution-environments/index.d.ts +7 -0
- package/dist/src/execution-environments/index.js +8 -0
- package/dist/src/execution-environments/local-worktree-manager.d.ts +37 -0
- package/dist/src/execution-environments/local-worktree-manager.js +322 -0
- package/dist/src/execution-environments/paths.d.ts +2 -0
- package/dist/src/execution-environments/paths.js +18 -0
- package/dist/src/execution-environments/session-environment-service.d.ts +22 -0
- package/dist/src/execution-environments/session-environment-service.js +73 -0
- package/dist/src/execution-environments/store.d.ts +13 -0
- package/dist/src/execution-environments/store.js +183 -0
- package/dist/src/execution-environments/subject.d.ts +2 -0
- package/dist/src/execution-environments/subject.js +12 -0
- package/dist/src/execution-environments/types.d.ts +74 -0
- package/dist/src/execution-environments/types.js +54 -0
- package/dist/src/extensions/lockfile.js +1 -1
- package/dist/src/extensions/sdk/index.js +1 -1
- package/dist/src/extensions/update.js +1 -1
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/custom-image-providers.d.ts +1 -1
- package/dist/src/gateway/file-path-classifier.js +1 -1
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +4 -4
- package/dist/src/gateway/hono/lib/config-payload.js +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/chat-model-config.d.ts +34 -0
- package/dist/src/gateway/hono/routes/chat-model-config.js +42 -0
- package/dist/src/gateway/hono/routes/device-pairing-approval.d.ts +3 -0
- package/dist/src/gateway/hono/routes/device-pairing-approval.js +100 -0
- package/dist/src/gateway/hono/routes/devices.js +15 -8
- package/dist/src/gateway/hono/routes/execution-environments.d.ts +3 -0
- package/dist/src/gateway/hono/routes/execution-environments.js +136 -0
- package/dist/src/gateway/hono/routes/index.js +4 -0
- package/dist/src/gateway/hono/routes/mobile-privacy.d.ts +3 -0
- package/dist/src/gateway/hono/routes/mobile-privacy.js +13 -0
- package/dist/src/gateway/hono/routes/models.js +10 -1
- package/dist/src/gateway/hono/routes/projects.js +43 -4
- package/dist/src/gateway/hono/routes/session-input-handler.d.ts +15 -1
- package/dist/src/gateway/hono/routes/session-input-handler.js +122 -52
- package/dist/src/gateway/hono/routes/sessions.js +105 -22
- package/dist/src/gateway/hono/routes/tasks.js +4 -12
- package/dist/src/gateway/mobile-privacy.d.ts +7 -0
- package/dist/src/gateway/mobile-privacy.js +102 -0
- package/dist/src/gateway/security/gateway-scopes.js +1 -0
- package/dist/src/gateway/service/agent-runner.d.ts +1 -1
- package/dist/src/gateway/service/config-coordinator.js +2 -2
- package/dist/src/gateway/service/session-input-coordinator.d.ts +2 -1
- package/dist/src/gateway/service/session-input-coordinator.js +14 -5
- package/dist/src/gateway/service/sessions-api.d.ts +4 -12
- package/dist/src/gateway/service/sessions-api.js +13 -0
- package/dist/src/gateway/service.d.ts +1 -1
- package/dist/src/gateway/service.js +8 -8
- package/dist/src/gateway/session-context-summary.d.ts +5 -0
- package/dist/src/gateway/session-context-summary.js +151 -0
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/i18n/response-language.d.ts +1 -1
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/projects/index.js +3 -3
- package/dist/src/projects/project-kind.d.ts +7 -0
- package/dist/src/projects/project-kind.js +6 -1
- package/dist/src/projects/project-service.js +10 -2
- package/dist/src/projects/project-store.d.ts +1 -0
- package/dist/src/projects/project-store.js +10 -7
- package/dist/src/projects/types.d.ts +4 -0
- package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
- package/dist/src/providers/index.js +2 -2
- package/dist/src/providers/model-registry.js +3 -1
- package/dist/src/providers/model-thinking.d.ts +4 -0
- package/dist/src/providers/model-thinking.js +41 -0
- package/dist/src/providers/register-runtime-providers.js +1 -1
- package/dist/src/session/config-types.d.ts +1 -0
- package/dist/src/session/index.js +1 -1
- package/dist/src/session/model-config-lock.d.ts +2 -0
- package/dist/src/session/model-config-lock.js +14 -0
- package/dist/src/session/session-workspace.d.ts +2 -1
- package/dist/src/session/session-workspace.js +5 -1
- package/dist/src/session/store.js +1 -1
- package/dist/src/session/turn-outcome-projector.js +9 -9
- package/dist/src/share/hosted-session-share.js +1 -1
- package/dist/src/storage/sqlite/config-repository.js +6 -5
- package/dist/src/storage/sqlite/device-access-repository.d.ts +2 -0
- package/dist/src/storage/sqlite/device-access-repository.js +12 -2
- package/dist/src/storage/sqlite/device-pairing-approval.d.ts +19 -0
- package/dist/src/storage/sqlite/device-pairing-approval.js +154 -0
- package/dist/src/storage/sqlite/device-pairing-repository.d.ts +1 -1
- package/dist/src/storage/sqlite/device-pairing-repository.js +11 -4
- package/dist/src/storage/sqlite/index.js +2 -2
- package/dist/src/storage/sqlite/migrations/141_device_pairing_approval.sql +17 -0
- package/dist/src/storage/sqlite/migrations/142_session_input_instance.sql +1 -0
- package/dist/src/storage/sqlite/migrations/143_fixed_session_model.sql +1 -0
- package/dist/src/storage/sqlite/migrations/144_execution_environments.sql +59 -0
- package/dist/src/storage/sqlite/migrations/145_project_execution_mode.sql +5 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/row-mappers.d.ts +1 -0
- package/dist/src/storage/sqlite/row-mappers.js +3 -2
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/session-input-repository.d.ts +5 -0
- package/dist/src/storage/sqlite/session-input-repository.js +15 -4
- package/dist/src/storage/sqlite/session-repository.js +1 -1
- package/dist/src/tasks/execution-context.d.ts +3 -1
- package/dist/src/tasks/execution-context.js +7 -2
- package/dist/src/tasks/home-query-service.js +2 -2
- package/dist/src/tui/backends/embedded-backend.js +2 -2
- package/dist/src/tui/components/thinking-selector.js +1 -0
- package/dist/src/tui/tui-settings.js +1 -1
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/tui/tui.js +1 -1
- package/dist/src/user-context/config.d.ts +9 -9
- package/dist/src/work-discovery/service.d.ts +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +2 -2
- package/package.json +3 -3
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-B9tkmkUj.js +0 -1
- package/dist/gateway/static/root/assets/agents-DTXYo-7z.js +0 -1
- package/dist/gateway/static/root/assets/app-management-settings-panel-DXFTk7x6.js +0 -1
- package/dist/gateway/static/root/assets/appearance-settings-D-FD5SOq.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-BT102W58.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-BRb45-_R.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-BkRWxC7D.js +0 -8
- package/dist/gateway/static/root/assets/capabilities-settings-panel-DfT-vWTA.js +0 -7
- package/dist/gateway/static/root/assets/channels-settings-C9oGpLR0.js +0 -1
- package/dist/gateway/static/root/assets/chat-terminal-dock-C_9LUs7G.js +0 -36
- package/dist/gateway/static/root/assets/connectors-page-SJKV6SHT.js +0 -2
- package/dist/gateway/static/root/assets/dependency-picker-BP68vqBI.js +0 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-CuG2qYoY.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-C2XcazGD.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-BjUEqkkC.js +0 -1
- package/dist/gateway/static/root/assets/home-page-DTSjwfAQ.js +0 -1
- package/dist/gateway/static/root/assets/index-BTUuTnc9.css +0 -2
- package/dist/gateway/static/root/assets/index-DFfvY8IN.js +0 -70
- package/dist/gateway/static/root/assets/local-app-workbench-page-0wntj9mK.js +0 -2
- package/dist/gateway/static/root/assets/local-apps-page-WeKm5vZ0.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-DFgJr7Zx.js +0 -2
- package/dist/gateway/static/root/assets/management-settings-8bEvKO0R.js +0 -1
- package/dist/gateway/static/root/assets/markdown-view-B1bGSQqt.css +0 -1
- package/dist/gateway/static/root/assets/markdown-view-D02mJdoU.js +0 -201
- package/dist/gateway/static/root/assets/messages-CoovNoMn.js +0 -3
- package/dist/gateway/static/root/assets/mobile-device-api-CvjVB_TB.js +0 -1
- package/dist/gateway/static/root/assets/models-hub-cache-CYr6LzvY.js +0 -1
- package/dist/gateway/static/root/assets/notes-workbench-DIXCtwhs.js +0 -4
- package/dist/gateway/static/root/assets/popover-select-3E24E65N.js +0 -1
- package/dist/gateway/static/root/assets/product-open-page-DNHWn_26.js +0 -1
- package/dist/gateway/static/root/assets/project-detail-page-6jgRJg4w.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-Bd4nXs4y.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-C_5-u9U-.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BqYAR86S.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-a146I0uZ.js +0 -1
- package/dist/gateway/static/root/assets/settings-loading-skeleton-CwGM9zKH.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-rhaERxAL.js +0 -1
- package/dist/gateway/static/root/assets/share-preview-page-BzkXvuH6.js +0 -2
- package/dist/gateway/static/root/assets/shares-settings-BvsM3Im5.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-u7E0gqFo.js +0 -1
- package/dist/gateway/static/root/assets/system-settings-panel-BUsykmjx.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-C9QgWfYG.js +0 -1
- package/dist/gateway/static/root/assets/user-context-page-Ch0cfQfI.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-DyTwkdzs.js +0 -5
- /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",
|
|
@@ -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
|
|
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
|
-
|
|
261
|
-
p.
|
|
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) {
|
|
@@ -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,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
|
|
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
|
|
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
|
|
128
|
-
const
|
|
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
|
|
180
|
-
const
|
|
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";
|