@xopcai/xopc 0.0.196 → 0.0.199
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/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-BwmdJ5pv.js → activity-store-DYVN1hRp.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-B1oxPli_.js → agent-avatar-dicebear-Bt70bZjv.js} +1 -1
- package/dist/gateway/static/root/assets/agents-D19uNmJf.js +68 -0
- package/dist/gateway/static/root/assets/{api-BM1hNzjw.js → api-B8mzbAle.js} +1 -1
- package/dist/gateway/static/root/assets/app-management-settings-panel-B4x7JfL8.js +1 -0
- package/dist/gateway/static/root/assets/appearance-settings-Dwdagf-Q.js +1 -0
- package/dist/gateway/static/root/assets/apps-page-DkTiesxe.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-BdE4Mati.js → archive-plugin-Cv0VXKLm.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-CTzaQcLV.js → attachment-load-CgidKrXn.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-BR6qMOVr.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-B25zTNxl.js → binary-plugins-DN3CQgIq.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-Cdrf2awF.js → block-editor-BwkSl1F_.js} +46 -46
- package/dist/gateway/static/root/assets/browser-settings-page-CDFQWAxI.js +8 -0
- package/dist/gateway/static/root/assets/browser-workflow-inputs-_ndaecsf.js +1 -0
- package/dist/gateway/static/root/assets/{browser-workflows-page-Wx9FrbK-.js → browser-workflows-page-C_I31wLm.js} +2 -2
- package/dist/gateway/static/root/assets/button-CSEbl4zT.js +1 -0
- package/dist/gateway/static/root/assets/capabilities-settings-panel-D41mssOq.js +7 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-BoOzFotX.js → capability-presets-api-Dy1jZJKs.js} +1 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-BXgCyuu2.js +3 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-_8IiTxRB.js → channel-recipient-api-D-9qiuio.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-DV5BhAeu.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-B4Rbh3bM.js +1 -0
- package/dist/gateway/static/root/assets/connectors-api-5FEBYguL.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-C_qkEN0T.js +2 -0
- package/dist/gateway/static/root/assets/copy-Dv6d4Dvw.js +1 -0
- package/dist/gateway/static/root/assets/cron-expression-SEFx5rnr.js +2 -0
- package/dist/gateway/static/root/assets/date-picker-D4zCUQJL.js +1 -0
- package/dist/gateway/static/root/assets/dependency-picker-DpQAxS2k.js +1 -0
- package/dist/gateway/static/root/assets/{desktop-pet-BOb8sEhN.js → desktop-pet-B_5G3lQl.js} +1 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-ClEyoUJe.js +1 -0
- package/dist/gateway/static/root/assets/directory-picker-path-field-AsFWmOjG.js +1 -0
- package/dist/gateway/static/root/assets/dist-BPoKqzeH.js +1 -0
- package/dist/gateway/static/root/assets/dist-DY4Af0fY.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-p83TmZFd.js → extension-debug-page-C22Y2o5l.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-DMQ3ovxA.js → extension-page-C61Ikawk.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-WlWWcDFr.js +1 -0
- package/dist/gateway/static/root/assets/external-link-DjqjBmc3.js +1 -0
- package/dist/gateway/static/root/assets/form-field-width-DJw_jULe.js +1 -0
- package/dist/gateway/static/root/assets/gateway-config-api-ByIOMQdc.js +1 -0
- package/dist/gateway/static/root/assets/gateway-config-swr-jB0hAhWO.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-CzzS9A17.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry--2njcDpC.js → gateway-startup-retry-C-fRlHCL.js} +1 -1
- package/dist/gateway/static/root/assets/globe-DSSGFWFn.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-settings-B4A_CXUL.js +1 -0
- package/dist/gateway/static/root/assets/home-page-FVGYYPWo.js +3 -0
- package/dist/gateway/static/root/assets/index-CGbKTCST.js +152 -0
- package/dist/gateway/static/root/assets/index-CR233S0Q.css +1 -0
- package/dist/gateway/static/root/assets/interaction-BmQogeqz.js +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BQb06_jl.js → keyboard-shortcuts-settings-BD_TFz0_.js} +1 -1
- package/dist/gateway/static/root/assets/loader-circle-CifKLtgG.js +1 -0
- package/dist/gateway/static/root/assets/local-app-workbench-page-BNpkigNb.js +2 -0
- package/dist/gateway/static/root/assets/local-apps-page-BwbUeLfm.js +1 -0
- package/dist/gateway/static/root/assets/{locale-store-Bjvw7jtg.js → locale-store-xULEcFVs.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-DXP9OQQt.js +2 -0
- package/dist/gateway/static/root/assets/management-settings-CW2VpqtT.js +1 -0
- package/dist/gateway/static/root/assets/{markdown-split-Db-KrpOQ.js → markdown-split-B1M9KO16.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-CHN66qs0.js → media-plugins-B_QlNdqZ.js} +1 -1
- package/dist/gateway/static/root/assets/messages-3qRsLZuX.js +3 -0
- package/dist/gateway/static/root/assets/{notes-page-CJtKZM0P.js → notes-page-BTbD4GmH.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-JRiq7QDW.js +4 -0
- package/dist/gateway/static/root/assets/page-tabs-BaEQMYm_.js +1 -0
- package/dist/gateway/static/root/assets/popover-select-BzdnTy3h.js +1 -0
- package/dist/gateway/static/root/assets/preview-open-alternatives-CeqtArlZ.js +1 -0
- package/dist/gateway/static/root/assets/{product-open-page--RnCc9bb.js → product-open-page-DnalBZZs.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-CjWA13aE.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-jsCkScbG.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-CGPJTEkM.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-Bg1W2__k.js → runtime-tools-settings-panel-cGkBEfg4.js} +4 -4
- package/dist/gateway/static/root/assets/schema-form-CmsrLlxu.js +1 -0
- package/dist/gateway/static/root/assets/sessions-page-BBHzziMd.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-2cGg8-9h.js +1 -0
- package/dist/gateway/static/root/assets/settings-form-draft-Dy10ldo8.js +1 -0
- package/dist/gateway/static/root/assets/settings-form-section-DUWCbaMJ.js +1 -0
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-BS36Mjzz.js → settings-loading-skeleton-Bvy5rdMY.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-BDSd7F9Y.js → settings-page-cZSAwsRR.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-layout-BRQNel6r.js +1 -0
- package/dist/gateway/static/root/assets/settings-shell-dialog-layer-BU3UuiJr.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-Cf06b66-.js +1 -0
- package/dist/gateway/static/root/assets/share-preview-page-BzA2NCAH.js +2 -0
- package/dist/gateway/static/root/assets/shares-settings-xlNKydYY.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-C5Xu93c_.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-Bvde7_i5.js +2 -0
- package/dist/gateway/static/root/assets/{skills-page.utils-CnbJncdL.js → skills-page.utils-vXSqHR7g.js} +1 -1
- package/dist/gateway/static/root/assets/system-settings-panel-9cQGOGCK.js +1 -0
- package/dist/gateway/static/root/assets/task-detail-page-Bkno4tTe.js +1 -0
- package/dist/gateway/static/root/assets/{theme-store-DtxpMC5S.js → theme-store-CHQRiuCF.js} +1 -1
- package/dist/gateway/static/root/assets/tool-activity-R8V9l6nk.js +1 -0
- package/dist/gateway/static/root/assets/typed-models-lib-q5-Vfqd8.js +1 -0
- package/dist/gateway/static/root/assets/use-autosave-7XfKULPI.js +1 -0
- package/dist/gateway/static/root/assets/user-context-page-CZ9m9aC_.js +1 -0
- package/dist/gateway/static/root/assets/voice-api-key-field-DXr21v-3.js +1 -0
- package/dist/gateway/static/root/assets/work-discovery-overlay-CeG7g_DZ.js +1 -0
- package/dist/gateway/static/root/assets/work-discovery-page-CQWZD03N.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BEmugHfL.js → workflow-run-setup-panel-DSQQZP9T.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-Cs-MXFJ1.js +5 -0
- package/dist/gateway/static/root/assets/working-directory-picker-modal-D-IgcHPp.js +1 -0
- package/dist/gateway/static/root/index.html +23 -8
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/tasks.js +54 -2
- package/dist/src/agent/agent-manager.d.ts +1 -0
- package/dist/src/agent/agent-manager.js +1 -0
- package/dist/src/agent/embedded/execution-context.d.ts +2 -0
- package/dist/src/agent/embedded/execution-context.js +11 -0
- package/dist/src/agent/embedded/index.d.ts +3 -1
- package/dist/src/agent/embedded/index.js +5 -3
- package/dist/src/agent/embedded/run-turn.js +15 -9
- package/dist/src/agent/embedded/session-runner.d.ts +6 -11
- package/dist/src/agent/embedded/session-runner.js +25 -36
- package/dist/src/agent/embedded/transcript-runtime.d.ts +35 -0
- package/dist/src/agent/embedded/transcript-runtime.js +66 -0
- package/dist/src/agent/embedded/types.d.ts +3 -1
- package/dist/src/agent/service.d.ts +15 -0
- package/dist/src/agent/service.js +31 -0
- package/dist/src/agent/service.types.d.ts +1 -0
- package/dist/src/agent/tools/factory.d.ts +2 -0
- package/dist/src/agent/tools/factory.js +2 -1
- package/dist/src/agent/tools/xopc-use-tool.d.ts +1 -0
- package/dist/src/agent/tools/xopc-use-tool.js +56 -6
- package/dist/src/automations/domain/validation.d.ts +40 -0
- package/dist/src/automations/draft/automation-draft-validator.d.ts +4 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/rules.js +2 -2
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/hono/app.d.ts +2 -0
- package/dist/src/gateway/hono/app.js +10 -3
- package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js +8 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +2 -1
- package/dist/src/gateway/hono/routes/config.js +9 -0
- package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
- package/dist/src/gateway/hono/routes/home.d.ts +1 -1
- package/dist/src/gateway/hono/routes/home.js +2 -2
- package/dist/src/gateway/hono/routes/index.js +2 -0
- package/dist/src/gateway/hono/routes/projects.js +67 -1
- package/dist/src/gateway/hono/routes/side-chats.d.ts +3 -0
- package/dist/src/gateway/hono/routes/side-chats.js +173 -0
- package/dist/src/gateway/hono/routes/tasks.js +112 -19
- package/dist/src/gateway/host.d.ts +9 -1
- package/dist/src/gateway/host.js +22 -5
- package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
- package/dist/src/gateway/rate-limit/buckets.js +12 -0
- package/dist/src/gateway/runtime-config.js +6 -5
- package/dist/src/gateway/security/audit.js +0 -7
- package/dist/src/gateway/server.js +4 -1
- package/dist/src/gateway/service/agent-runner.d.ts +4 -0
- package/dist/src/gateway/service/agent-runner.js +15 -1
- package/dist/src/gateway/service/run-gateway-agent.js +1 -1
- package/dist/src/gateway/service.d.ts +5 -0
- package/dist/src/gateway/service.js +38 -8
- package/dist/src/gateway/side-chat/context-snapshot.d.ts +11 -0
- package/dist/src/gateway/side-chat/context-snapshot.js +108 -0
- package/dist/src/gateway/side-chat/index.d.ts +5 -0
- package/dist/src/gateway/side-chat/index.js +4 -0
- package/dist/src/gateway/side-chat/manager.d.ts +45 -0
- package/dist/src/gateway/side-chat/manager.js +198 -0
- package/dist/src/gateway/side-chat/run-service.d.ts +22 -0
- package/dist/src/gateway/side-chat/run-service.js +110 -0
- package/dist/src/gateway/side-chat/types.d.ts +61 -0
- package/dist/src/gateway/side-chat/types.js +1 -0
- package/dist/src/proactive/actions/service.d.ts +2 -0
- package/dist/src/proactive/actions/service.js +80 -0
- package/dist/src/proactive/execution/insight.js +20 -0
- package/dist/src/proactive/execution/repository.js +8 -2
- package/dist/src/proactive/execution/types.d.ts +14 -0
- package/dist/src/proactive/inbox/repository.js +59 -9
- package/dist/src/proactive/inbox/service.d.ts +2 -2
- package/dist/src/proactive/inbox/service.js +7 -2
- package/dist/src/proactive/inbox/types.d.ts +14 -0
- package/dist/src/proactive/inbox/worker.js +2 -0
- package/dist/src/proactive/scenarios/prompt-composer.js +2 -2
- package/dist/src/routing/session-key-utils.d.ts +0 -1
- package/dist/src/routing/session-key-utils.js +1 -6
- package/dist/src/routing/session-key.js +2 -2
- package/dist/src/storage/sqlite/migrations/118_task_board_rank.sql +6 -0
- package/dist/src/storage/sqlite/migrations/119_proactive_disposition.sql +13 -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/schema.js +1 -1
- package/dist/src/tasks/home-query-service.d.ts +29 -0
- package/dist/src/tasks/home-query-service.js +291 -7
- package/dist/src/tasks/index.d.ts +1 -0
- package/dist/src/tasks/index.js +5 -4
- package/dist/src/tasks/project-monitoring-service.d.ts +9 -0
- package/dist/src/tasks/project-monitoring-service.js +41 -3
- package/dist/src/tasks/project-operating-view-service.d.ts +2 -2
- package/dist/src/tasks/project-operating-view-service.js +47 -21
- package/dist/src/tasks/task-application-service.js +99 -6
- package/dist/src/tasks/task-change-events.d.ts +13 -0
- package/dist/src/tasks/task-change-events.js +29 -0
- package/dist/src/tasks/task-read-model-projector.js +2 -1
- package/dist/src/tasks/task-repository.d.ts +7 -0
- package/dist/src/tasks/task-repository.js +29 -6
- package/dist/src/tunnel/enable-lan-pairing.js +15 -26
- package/dist/src/tunnel/pair-context.js +1 -1
- package/dist/src/tunnel/pair-url.js +1 -1
- package/dist/src/tunnel/tunnel-qr.d.ts +0 -7
- package/dist/src/tunnel/tunnel-qr.js +2 -19
- package/package.json +4 -2
- package/dist/gateway/static/root/assets/agents-VoFNMGL3.js +0 -68
- package/dist/gateway/static/root/assets/app-management-settings-panel-vmuJ_Z6i.js +0 -1
- package/dist/gateway/static/root/assets/appearance-settings-BMlEoe-G.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-CsNB6mv_.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-CW1YWgiX.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-BMTmGMM6.js +0 -8
- package/dist/gateway/static/root/assets/browser-workflow-inputs-BsmHy0ks.js +0 -1
- package/dist/gateway/static/root/assets/capabilities-settings-panel-C5l85__e.js +0 -7
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-9T2KXAs1.js +0 -3
- package/dist/gateway/static/root/assets/channels-settings-DquD4BPQ.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-DPaJSYX_.js +0 -1
- package/dist/gateway/static/root/assets/connectors-api-BC-4ftOM.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-7zUxVHQg.js +0 -2
- package/dist/gateway/static/root/assets/cron-expression-BycQlU8Q.js +0 -2
- package/dist/gateway/static/root/assets/dependency-picker-BvYqHRz0.js +0 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-DStgPb82.js +0 -1
- package/dist/gateway/static/root/assets/directory-picker-path-field-DUUr9sq0.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-BcSKEU8s.js +0 -1
- package/dist/gateway/static/root/assets/gateway-config-api-C-MmtCc7.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-CuaRDWbg.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-Dm8TrfGa.js +0 -1
- package/dist/gateway/static/root/assets/home-page-BYhDbUvI.js +0 -3
- package/dist/gateway/static/root/assets/index-BzPwnXho.js +0 -150
- package/dist/gateway/static/root/assets/index-CFFYvilx.css +0 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-CHk4x0kR.js +0 -2
- package/dist/gateway/static/root/assets/local-apps-page-DQtsxjGs.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-CDqIY72S.js +0 -2
- package/dist/gateway/static/root/assets/management-settings-D7itDEHl.js +0 -1
- package/dist/gateway/static/root/assets/messages-DQ5X6cXp.js +0 -3
- package/dist/gateway/static/root/assets/notes-workbench-epHGeKd5.js +0 -4
- package/dist/gateway/static/root/assets/page-tabs-HXweXqYE.js +0 -1
- package/dist/gateway/static/root/assets/preview-open-alternatives-Dob6Oe2l.js +0 -1
- package/dist/gateway/static/root/assets/project-detail-page-BxOD5-zj.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-D-9AhrH5.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CSUNXLKM.js +0 -1
- package/dist/gateway/static/root/assets/schema-form-BI4rVt3u.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BxOUBMca.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DAvTIbgw.js +0 -1
- package/dist/gateway/static/root/assets/settings-form-section-C7rzhi7x.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-layout-CTMmZcwj.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-D1v-2Ci-.js +0 -1
- package/dist/gateway/static/root/assets/share-preview-page-BeCxg6eb.js +0 -2
- package/dist/gateway/static/root/assets/shares-settings-CXL1EldF.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-BxwkKgVw.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-CyfjEM4D.js +0 -2
- package/dist/gateway/static/root/assets/system-settings-panel-CAv0Yk0Y.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-DGTVJs_N.js +0 -1
- package/dist/gateway/static/root/assets/typed-models-lib-DomX3Szl.js +0 -1
- package/dist/gateway/static/root/assets/use-autosave-BLc4gfG0.js +0 -1
- package/dist/gateway/static/root/assets/user-context-page-C2kQENTK.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-BijmpPjb.js +0 -1
- package/dist/gateway/static/root/assets/work-discovery-overlay-D7w2JFFq.js +0 -1
- package/dist/gateway/static/root/assets/work-discovery-page-XtoPgPUS.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-D_K2xOWq.js +0 -5
- package/dist/src/gateway/ensure-network-cors.d.ts +0 -3
- package/dist/src/gateway/ensure-network-cors.js +0 -23
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { runWithActivityContext } from "../../activity/context.js";
|
|
2
|
+
import { runSqliteWriteTransaction } from "../../storage/sqlite/transaction.js";
|
|
2
3
|
import { getSessionMetadata } from "../../storage/sqlite/session-repository.js";
|
|
3
4
|
import "../../storage/sqlite/index.js";
|
|
4
5
|
import { ObjectLinkService } from "../../activity/service.js";
|
|
@@ -13,6 +14,7 @@ import "../../automations/index.js";
|
|
|
13
14
|
import { isValidProjectAgentId, normalizeProjectAgentId } from "../../projects/project-agent.js";
|
|
14
15
|
import "../../projects/index.js";
|
|
15
16
|
import { TaskContextRepository } from "../../tasks/task-context-repository.js";
|
|
17
|
+
import { enqueueTaskChangedEvent } from "../../tasks/task-change-events.js";
|
|
16
18
|
import { TaskDependencyError, TaskDependencyService } from "../../tasks/task-dependency-service.js";
|
|
17
19
|
import { TaskApplicationService } from "../../tasks/task-application-service.js";
|
|
18
20
|
import { defineTaskContract } from "../../tasks/task-contract-definition.js";
|
|
@@ -1241,6 +1243,7 @@ async function handleTask(command, args, deps, dryRun) {
|
|
|
1241
1243
|
...created
|
|
1242
1244
|
};
|
|
1243
1245
|
if (created.runId) deps.dispatchTaskRuns?.();
|
|
1246
|
+
else deps.dispatchTaskEvents?.();
|
|
1244
1247
|
return {
|
|
1245
1248
|
ok: true,
|
|
1246
1249
|
task: created.model.task,
|
|
@@ -1274,13 +1277,28 @@ async function handleTask(command, args, deps, dryRun) {
|
|
|
1274
1277
|
dependsOnTaskIds
|
|
1275
1278
|
};
|
|
1276
1279
|
try {
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
task: dependencies.replace({
|
|
1280
|
+
const task = runSqliteWriteTransaction((db) => {
|
|
1281
|
+
const changed = dependencies.replace({
|
|
1280
1282
|
taskId: id,
|
|
1281
1283
|
dependsOnTaskIds,
|
|
1282
1284
|
expectedVersion
|
|
1283
|
-
})
|
|
1285
|
+
});
|
|
1286
|
+
enqueueTaskChangedEvent(db, {
|
|
1287
|
+
taskId: changed.id,
|
|
1288
|
+
projectId: changed.projectId,
|
|
1289
|
+
version: changed.version,
|
|
1290
|
+
changedFields: ["dependencies"],
|
|
1291
|
+
actor: {
|
|
1292
|
+
kind: "agent",
|
|
1293
|
+
id: deps.getCurrentAgentId?.()
|
|
1294
|
+
}
|
|
1295
|
+
});
|
|
1296
|
+
return changed;
|
|
1297
|
+
});
|
|
1298
|
+
deps.dispatchTaskEvents?.();
|
|
1299
|
+
return {
|
|
1300
|
+
ok: true,
|
|
1301
|
+
task,
|
|
1284
1302
|
dependencies: dependencies.listDependencies(id),
|
|
1285
1303
|
dependents: dependencies.listDependents(id)
|
|
1286
1304
|
};
|
|
@@ -1330,9 +1348,22 @@ async function handleTask(command, args, deps, dryRun) {
|
|
|
1330
1348
|
action: "add_task_context",
|
|
1331
1349
|
input
|
|
1332
1350
|
};
|
|
1351
|
+
const task = tasks.require(id);
|
|
1352
|
+
const edge = runSqliteWriteTransaction((db) => {
|
|
1353
|
+
const created = context.add(input);
|
|
1354
|
+
enqueueTaskChangedEvent(db, {
|
|
1355
|
+
taskId: task.id,
|
|
1356
|
+
projectId: task.projectId,
|
|
1357
|
+
version: task.version,
|
|
1358
|
+
changedFields: ["context"],
|
|
1359
|
+
actor: input.createdBy
|
|
1360
|
+
});
|
|
1361
|
+
return created;
|
|
1362
|
+
});
|
|
1363
|
+
deps.dispatchTaskEvents?.();
|
|
1333
1364
|
return {
|
|
1334
1365
|
ok: true,
|
|
1335
|
-
edge
|
|
1366
|
+
edge,
|
|
1336
1367
|
context: context.list(id)
|
|
1337
1368
|
};
|
|
1338
1369
|
}
|
|
@@ -1354,7 +1385,24 @@ async function handleTask(command, args, deps, dryRun) {
|
|
|
1354
1385
|
taskId: id,
|
|
1355
1386
|
edgeId
|
|
1356
1387
|
};
|
|
1357
|
-
|
|
1388
|
+
const task = tasks.get(id);
|
|
1389
|
+
const actor = {
|
|
1390
|
+
kind: "agent",
|
|
1391
|
+
id: deps.getCurrentAgentId?.()
|
|
1392
|
+
};
|
|
1393
|
+
const removed = task ? runSqliteWriteTransaction((db) => {
|
|
1394
|
+
const didRemove = context.remove(id, edgeId);
|
|
1395
|
+
if (didRemove) enqueueTaskChangedEvent(db, {
|
|
1396
|
+
taskId: task.id,
|
|
1397
|
+
projectId: task.projectId,
|
|
1398
|
+
version: task.version,
|
|
1399
|
+
changedFields: ["context"],
|
|
1400
|
+
actor
|
|
1401
|
+
});
|
|
1402
|
+
return didRemove;
|
|
1403
|
+
}) : false;
|
|
1404
|
+
if (removed) deps.dispatchTaskEvents?.();
|
|
1405
|
+
return removed ? {
|
|
1358
1406
|
ok: true,
|
|
1359
1407
|
taskId: id,
|
|
1360
1408
|
edgeId,
|
|
@@ -1418,6 +1466,7 @@ async function handleTask(command, args, deps, dryRun) {
|
|
|
1418
1466
|
...result
|
|
1419
1467
|
};
|
|
1420
1468
|
if (result.runId) deps.dispatchTaskRuns?.();
|
|
1469
|
+
else deps.dispatchTaskEvents?.();
|
|
1421
1470
|
return {
|
|
1422
1471
|
ok: true,
|
|
1423
1472
|
task: result.model.task,
|
|
@@ -1527,6 +1576,7 @@ async function handleTaskRun(command, args, dryRun, deps) {
|
|
|
1527
1576
|
error: result.reason,
|
|
1528
1577
|
...result
|
|
1529
1578
|
};
|
|
1579
|
+
deps.dispatchTaskEvents?.();
|
|
1530
1580
|
return {
|
|
1531
1581
|
ok: true,
|
|
1532
1582
|
run: runs.get(runId),
|
|
@@ -67,6 +67,14 @@ export declare const AutomationActionSchema: z.ZodDiscriminatedUnion<[z.ZodObjec
|
|
|
67
67
|
kind: z.ZodLiteral<"task_command">;
|
|
68
68
|
taskId: z.ZodString;
|
|
69
69
|
command: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
70
|
+
type: z.ZodLiteral<"move">;
|
|
71
|
+
phase: z.ZodEnum<{
|
|
72
|
+
active: "active";
|
|
73
|
+
review: "review";
|
|
74
|
+
ready: "ready";
|
|
75
|
+
backlog: "backlog";
|
|
76
|
+
}>;
|
|
77
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
70
78
|
type: z.ZodLiteral<"mark_ready">;
|
|
71
79
|
}, z.core.$strip>, z.ZodObject<{
|
|
72
80
|
type: z.ZodLiteral<"start">;
|
|
@@ -101,7 +109,9 @@ export declare const AutomationActionSchema: z.ZodDiscriminatedUnion<[z.ZodObjec
|
|
|
101
109
|
type: z.ZodLiteral<"reopen">;
|
|
102
110
|
phase: z.ZodEnum<{
|
|
103
111
|
active: "active";
|
|
112
|
+
review: "review";
|
|
104
113
|
ready: "ready";
|
|
114
|
+
backlog: "backlog";
|
|
105
115
|
}>;
|
|
106
116
|
}, z.core.$strip>, z.ZodObject<{
|
|
107
117
|
type: z.ZodLiteral<"add_wait">;
|
|
@@ -245,6 +255,14 @@ export declare const AutomationSchema: z.ZodObject<{
|
|
|
245
255
|
kind: z.ZodLiteral<"task_command">;
|
|
246
256
|
taskId: z.ZodString;
|
|
247
257
|
command: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
258
|
+
type: z.ZodLiteral<"move">;
|
|
259
|
+
phase: z.ZodEnum<{
|
|
260
|
+
active: "active";
|
|
261
|
+
review: "review";
|
|
262
|
+
ready: "ready";
|
|
263
|
+
backlog: "backlog";
|
|
264
|
+
}>;
|
|
265
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
248
266
|
type: z.ZodLiteral<"mark_ready">;
|
|
249
267
|
}, z.core.$strip>, z.ZodObject<{
|
|
250
268
|
type: z.ZodLiteral<"start">;
|
|
@@ -279,7 +297,9 @@ export declare const AutomationSchema: z.ZodObject<{
|
|
|
279
297
|
type: z.ZodLiteral<"reopen">;
|
|
280
298
|
phase: z.ZodEnum<{
|
|
281
299
|
active: "active";
|
|
300
|
+
review: "review";
|
|
282
301
|
ready: "ready";
|
|
302
|
+
backlog: "backlog";
|
|
283
303
|
}>;
|
|
284
304
|
}, z.core.$strip>, z.ZodObject<{
|
|
285
305
|
type: z.ZodLiteral<"add_wait">;
|
|
@@ -398,6 +418,14 @@ export declare const CreateAutomationSchema: z.ZodObject<{
|
|
|
398
418
|
kind: z.ZodLiteral<"task_command">;
|
|
399
419
|
taskId: z.ZodString;
|
|
400
420
|
command: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
421
|
+
type: z.ZodLiteral<"move">;
|
|
422
|
+
phase: z.ZodEnum<{
|
|
423
|
+
active: "active";
|
|
424
|
+
review: "review";
|
|
425
|
+
ready: "ready";
|
|
426
|
+
backlog: "backlog";
|
|
427
|
+
}>;
|
|
428
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
401
429
|
type: z.ZodLiteral<"mark_ready">;
|
|
402
430
|
}, z.core.$strip>, z.ZodObject<{
|
|
403
431
|
type: z.ZodLiteral<"start">;
|
|
@@ -432,7 +460,9 @@ export declare const CreateAutomationSchema: z.ZodObject<{
|
|
|
432
460
|
type: z.ZodLiteral<"reopen">;
|
|
433
461
|
phase: z.ZodEnum<{
|
|
434
462
|
active: "active";
|
|
463
|
+
review: "review";
|
|
435
464
|
ready: "ready";
|
|
465
|
+
backlog: "backlog";
|
|
436
466
|
}>;
|
|
437
467
|
}, z.core.$strip>, z.ZodObject<{
|
|
438
468
|
type: z.ZodLiteral<"add_wait">;
|
|
@@ -578,6 +608,14 @@ export declare const UpdateAutomationSchema: z.ZodObject<{
|
|
|
578
608
|
kind: z.ZodLiteral<"task_command">;
|
|
579
609
|
taskId: z.ZodString;
|
|
580
610
|
command: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
611
|
+
type: z.ZodLiteral<"move">;
|
|
612
|
+
phase: z.ZodEnum<{
|
|
613
|
+
active: "active";
|
|
614
|
+
review: "review";
|
|
615
|
+
ready: "ready";
|
|
616
|
+
backlog: "backlog";
|
|
617
|
+
}>;
|
|
618
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
581
619
|
type: z.ZodLiteral<"mark_ready">;
|
|
582
620
|
}, z.core.$strip>, z.ZodObject<{
|
|
583
621
|
type: z.ZodLiteral<"start">;
|
|
@@ -612,7 +650,9 @@ export declare const UpdateAutomationSchema: z.ZodObject<{
|
|
|
612
650
|
type: z.ZodLiteral<"reopen">;
|
|
613
651
|
phase: z.ZodEnum<{
|
|
614
652
|
active: "active";
|
|
653
|
+
review: "review";
|
|
615
654
|
ready: "ready";
|
|
655
|
+
backlog: "backlog";
|
|
616
656
|
}>;
|
|
617
657
|
}, z.core.$strip>, z.ZodObject<{
|
|
618
658
|
type: z.ZodLiteral<"add_wait">;
|
|
@@ -43,6 +43,9 @@ export declare function buildAutomationDraftResponse(draft: GeneratedAutomationD
|
|
|
43
43
|
kind: "task_command";
|
|
44
44
|
taskId: string;
|
|
45
45
|
command?: {
|
|
46
|
+
type: "move";
|
|
47
|
+
phase: "active" | "review" | "ready" | "backlog";
|
|
48
|
+
} | {
|
|
46
49
|
type: "mark_ready";
|
|
47
50
|
} | {
|
|
48
51
|
type: "start";
|
|
@@ -70,7 +73,7 @@ export declare function buildAutomationDraftResponse(draft: GeneratedAutomationD
|
|
|
70
73
|
resolution: "cancelled" | "done" | "duplicate" | "wont_do";
|
|
71
74
|
} | {
|
|
72
75
|
type: "reopen";
|
|
73
|
-
phase: "active" | "ready";
|
|
76
|
+
phase: "active" | "review" | "ready" | "backlog";
|
|
74
77
|
} | {
|
|
75
78
|
type: "add_wait";
|
|
76
79
|
wait: {
|
|
@@ -52,7 +52,7 @@ async function checkDatabaseSchema(ctx) {
|
|
|
52
52
|
id: "database-schema",
|
|
53
53
|
label: "Database schema",
|
|
54
54
|
status: "pass",
|
|
55
|
-
message: `SQLite schema v${status.dbVersion} (current release
|
|
55
|
+
message: `SQLite schema v${status.dbVersion} (current release v119).`,
|
|
56
56
|
hints: []
|
|
57
57
|
};
|
|
58
58
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { init_agent_scope, normalizeAgentId, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
|
|
2
1
|
import { resolveEffectiveAgentManifest } from "../agent-manifest/resolver.js";
|
|
3
2
|
import "../agent-manifest/index.js";
|
|
3
|
+
import { init_agent_scope, normalizeAgentId, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
|
|
4
4
|
import { init_session_key, parseSessionKey } from "../routing/session-key.js";
|
|
5
5
|
import { agentExists, getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
|
|
6
6
|
//#region src/config/agent-profile.ts
|
package/dist/src/config/rules.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentDir, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, resolveUserPath, validateAgentIdForNewAgent } from "../agent/agent-scope.js";
|
|
2
1
|
import { resolveCapabilityPresetLayer, resolveEffectiveAgentManifest } from "../agent-manifest/resolver.js";
|
|
2
|
+
import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentDir, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, resolveUserPath, validateAgentIdForNewAgent } from "../agent/agent-scope.js";
|
|
3
3
|
import { resolveEffectiveAgentProfile } from "../config/agent-profile.js";
|
|
4
4
|
import { WORKSPACE_FILES, init_paths } from "../config/paths.js";
|
|
5
5
|
import { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES, REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET } from "../agent/context/workspace.js";
|
|
@@ -2,6 +2,8 @@ import { Hono } from 'hono';
|
|
|
2
2
|
import type { GatewayService } from '../service.js';
|
|
3
3
|
export interface HonoAppConfig {
|
|
4
4
|
service: GatewayService;
|
|
5
|
+
/** Actual host selected for this process; bind config changes take effect after restart. */
|
|
6
|
+
listenHost?: string;
|
|
5
7
|
}
|
|
6
8
|
/**
|
|
7
9
|
* Extension sandbox HTML under `/api/extensions/:id/assets/*` ships its own CSP
|
|
@@ -10,7 +10,7 @@ import { buildGatewayConsoleCspHeader } from "../security/csp.js";
|
|
|
10
10
|
import { checkBrowserOrigin } from "../security/origin-check.js";
|
|
11
11
|
import { auth } from "./middleware/auth.js";
|
|
12
12
|
import { operatorScopes } from "./middleware/scopes.js";
|
|
13
|
-
import { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createStrictRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware } from "./middleware/strict-rate-limit.js";
|
|
13
|
+
import { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createStrictRateLimitMiddleware, createTaskRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware } from "./middleware/strict-rate-limit.js";
|
|
14
14
|
import { logContextMiddleware } from "./middleware/log-context.js";
|
|
15
15
|
import { logger } from "./middleware/logger.js";
|
|
16
16
|
import { routeErrorMiddleware } from "./middleware/route-errors.js";
|
|
@@ -42,10 +42,11 @@ function createHonoApp(config) {
|
|
|
42
42
|
const { service } = config;
|
|
43
43
|
const app = new Hono();
|
|
44
44
|
const gatewayPort = resolveGatewayServiceListenPort(service);
|
|
45
|
+
const gatewayBindHost = config.listenHost ?? resolveGatewayEffectiveHost(service.currentConfig);
|
|
45
46
|
const resolveBrowserOrigins = () => resolveAllowedBrowserOrigins({
|
|
46
47
|
configuredOrigins: service.currentConfig.gateway.corsOrigins,
|
|
47
48
|
port: gatewayPort,
|
|
48
|
-
bindHost:
|
|
49
|
+
bindHost: gatewayBindHost,
|
|
49
50
|
tunnelPublicUrl: loadTunnelState()?.publicUrl,
|
|
50
51
|
reverseProxyPublicUrl: resolveReverseProxyPublicUrl(service.currentConfig)
|
|
51
52
|
});
|
|
@@ -153,6 +154,7 @@ function createHonoApp(config) {
|
|
|
153
154
|
if (/^\/api\/notes\/[^/]+\/media$/.test(path)) return true;
|
|
154
155
|
return path === "/api/notes" && contentType?.includes("multipart/form-data") === true;
|
|
155
156
|
};
|
|
157
|
+
const isProjectFileUploadRequest = (path, method, contentType) => method === "POST" && /^\/api\/projects\/[^/]+\/files\/upload$/.test(path) && contentType?.includes("multipart/form-data") === true;
|
|
156
158
|
const discussionUploadBodyMax = (path, method, contentType) => {
|
|
157
159
|
if (method !== "PUT" || contentType?.includes("multipart/form-data") !== true) return void 0;
|
|
158
160
|
if (/^\/api\/discussions\/[^/]+\/recording$/.test(path)) return NOTE_MEDIA_BODY_MAX;
|
|
@@ -173,7 +175,7 @@ function createHonoApp(config) {
|
|
|
173
175
|
}));
|
|
174
176
|
app.use("/api/*", async (c, next) => {
|
|
175
177
|
const contentType = c.req.header("content-type");
|
|
176
|
-
const maxSize = c.req.method === "POST" && c.req.path === "/api/tasks" || c.req.method === "POST" && /^\/api\/sessions\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "PATCH" && /^\/api\/sessions\/[^/]+\/inputs\/[^/]+$/.test(c.req.path) ? SESSION_INPUT_BODY_MAX : c.req.path === "/api/skills/upload" ? SKILL_UPLOAD_BODY_MAX : c.req.path === "/api/voice/transcribe" || c.req.path === "/api/voice/transcriptions" ? VOICE_TRANSCRIBE_BODY_MAX : isNoteMediaUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : discussionUploadBodyMax(c.req.path, c.req.method, contentType) ?? DEFAULT_API_BODY_MAX;
|
|
178
|
+
const maxSize = c.req.method === "POST" && c.req.path === "/api/tasks" || c.req.method === "POST" && /^\/api\/sessions\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "PATCH" && /^\/api\/sessions\/[^/]+\/inputs\/[^/]+$/.test(c.req.path) ? SESSION_INPUT_BODY_MAX : c.req.path === "/api/skills/upload" ? SKILL_UPLOAD_BODY_MAX : c.req.path === "/api/voice/transcribe" || c.req.path === "/api/voice/transcriptions" ? VOICE_TRANSCRIBE_BODY_MAX : isNoteMediaUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : isProjectFileUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : discussionUploadBodyMax(c.req.path, c.req.method, contentType) ?? DEFAULT_API_BODY_MAX;
|
|
177
179
|
const maxSizeMb = Math.ceil(maxSize / (1024 * 1024));
|
|
178
180
|
return bodyLimit({
|
|
179
181
|
maxSize,
|
|
@@ -211,6 +213,10 @@ function createHonoApp(config) {
|
|
|
211
213
|
trustedProxies: service.currentConfig.gateway?.trustedProxies,
|
|
212
214
|
allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true
|
|
213
215
|
}) });
|
|
216
|
+
const taskRateLimitMiddleware = createTaskRateLimitMiddleware({ getTrustedProxyContext: () => ({
|
|
217
|
+
trustedProxies: service.currentConfig.gateway?.trustedProxies,
|
|
218
|
+
allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true
|
|
219
|
+
}) });
|
|
214
220
|
const channelRateLimitMiddleware = createChannelRateLimitMiddleware({ getTrustedProxyContext: () => ({
|
|
215
221
|
trustedProxies: service.currentConfig.gateway?.trustedProxies,
|
|
216
222
|
allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true
|
|
@@ -219,6 +225,7 @@ function createHonoApp(config) {
|
|
|
219
225
|
service,
|
|
220
226
|
strictRateLimitMiddleware,
|
|
221
227
|
chatRateLimitMiddleware,
|
|
228
|
+
taskRateLimitMiddleware,
|
|
222
229
|
xopcCloudPollRateLimitMiddleware: createXopcCloudPollRateLimitMiddleware({ getTrustedProxyContext: () => ({
|
|
223
230
|
trustedProxies: service.currentConfig.gateway?.trustedProxies,
|
|
224
231
|
allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true
|
|
@@ -16,6 +16,10 @@ export declare function createChatRateLimitMiddleware(deps: StrictRateLimitDeps)
|
|
|
16
16
|
error: string;
|
|
17
17
|
code: string;
|
|
18
18
|
}, 429, "json">>;
|
|
19
|
+
export declare function createTaskRateLimitMiddleware(deps: StrictRateLimitDeps): import("hono").MiddlewareHandler<any, string, {}, Response & import("hono").TypedResponse<{
|
|
20
|
+
error: string;
|
|
21
|
+
code: string;
|
|
22
|
+
}, 429, "json">>;
|
|
19
23
|
export declare function createXopcCloudPollRateLimitMiddleware(deps: StrictRateLimitDeps): import("hono").MiddlewareHandler<any, string, {}, Response & import("hono").TypedResponse<{
|
|
20
24
|
error: string;
|
|
21
25
|
code: string;
|
|
@@ -70,6 +70,13 @@ function createChatRateLimitMiddleware(deps) {
|
|
|
70
70
|
reason: "chat_rate_limit_exceeded"
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
|
+
function createTaskRateLimitMiddleware(deps) {
|
|
74
|
+
return createClientRateLimitMiddleware(deps, {
|
|
75
|
+
limiter: () => buckets.taskApi(),
|
|
76
|
+
exceededMessage: "Task API rate limit exceeded",
|
|
77
|
+
reason: "task_rate_limit_exceeded"
|
|
78
|
+
});
|
|
79
|
+
}
|
|
73
80
|
function createXopcCloudPollRateLimitMiddleware(deps) {
|
|
74
81
|
return createClientRateLimitMiddleware(deps, {
|
|
75
82
|
limiter: () => buckets.xopcCloudPoll(),
|
|
@@ -85,4 +92,4 @@ function createChannelRateLimitMiddleware(deps) {
|
|
|
85
92
|
});
|
|
86
93
|
}
|
|
87
94
|
//#endregion
|
|
88
|
-
export { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createStrictRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware };
|
|
95
|
+
export { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createStrictRateLimitMiddleware, createTaskRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware };
|
|
@@ -176,12 +176,13 @@ async function applyMiscPatch(config, body) {
|
|
|
176
176
|
function validateGatewayAfterPatch(config, body) {
|
|
177
177
|
if (body.gateway === void 0) return PATCH_OK;
|
|
178
178
|
try {
|
|
179
|
+
const port = config.gateway?.port ?? 18790;
|
|
179
180
|
const auth = resolveGatewayAuth({ authConfig: config.gateway?.auth });
|
|
180
181
|
assertGatewayAuthConfigured(auth);
|
|
181
182
|
assertGatewayRuntimeConfig({
|
|
182
183
|
cfg: config,
|
|
183
184
|
auth,
|
|
184
|
-
port
|
|
185
|
+
port
|
|
185
186
|
});
|
|
186
187
|
} catch (err) {
|
|
187
188
|
return patchError(err instanceof Error ? err.message : String(err));
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { enumerateLanGatewayCandidates } from "../../host.js";
|
|
1
2
|
import { buildSafeWebConfigPayload } from "../lib/config-payload.js";
|
|
2
3
|
import { applyAgentsPatch } from "./config-patch/agents.js";
|
|
3
4
|
import { applyChannelsPatch } from "./config-patch/channels.js";
|
|
@@ -39,6 +40,14 @@ function registerConfigRoutes(authenticated, deps) {
|
|
|
39
40
|
payload: { config: safeConfig }
|
|
40
41
|
});
|
|
41
42
|
});
|
|
43
|
+
authenticated.get("/api/gateway/cors-origin-candidates", (c) => {
|
|
44
|
+
const requestedPort = Number(c.req.query("port"));
|
|
45
|
+
const port = Number.isInteger(requestedPort) && requestedPort >= 1 && requestedPort <= 65535 ? requestedPort : service.currentConfig.gateway?.port ?? 18790;
|
|
46
|
+
return c.json({
|
|
47
|
+
ok: true,
|
|
48
|
+
payload: { candidates: enumerateLanGatewayCandidates(port) }
|
|
49
|
+
});
|
|
50
|
+
});
|
|
42
51
|
authenticated.patch("/api/config", strictRateLimitMiddleware, async (c) => {
|
|
43
52
|
const body = await c.req.json();
|
|
44
53
|
const config = service.currentConfig;
|
|
@@ -4,6 +4,7 @@ export interface AuthenticatedRouteDeps {
|
|
|
4
4
|
service: GatewayService;
|
|
5
5
|
strictRateLimitMiddleware: MiddlewareHandler;
|
|
6
6
|
chatRateLimitMiddleware: MiddlewareHandler;
|
|
7
|
+
taskRateLimitMiddleware?: MiddlewareHandler;
|
|
7
8
|
xopcCloudPollRateLimitMiddleware: MiddlewareHandler;
|
|
8
9
|
channelRateLimitMiddleware?: MiddlewareHandler;
|
|
9
10
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Hono } from 'hono';
|
|
2
2
|
import type { AuthenticatedRouteDeps } from './deps.js';
|
|
3
|
-
export { buildHomeBriefing } from '../../../tasks/home-query-service.js';
|
|
3
|
+
export { buildHomeBriefing, buildHomeFocusItems } from '../../../tasks/home-query-service.js';
|
|
4
4
|
/** Register the unified work-home read model and its decision actions. */
|
|
5
5
|
export declare function registerHomeRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void;
|
|
@@ -2,7 +2,7 @@ import { acknowledgeHomeAttention } from "../../../storage/sqlite/home-attention
|
|
|
2
2
|
import { decideConnectorApproval } from "../../../storage/sqlite/connector-repository.js";
|
|
3
3
|
import "../../../storage/sqlite/index.js";
|
|
4
4
|
import { listGatewayAgents } from "../../agents-admin.js";
|
|
5
|
-
import { HomeQueryService, buildHomeBriefing } from "../../../tasks/home-query-service.js";
|
|
5
|
+
import { HomeQueryService, buildHomeBriefing, buildHomeFocusItems } from "../../../tasks/home-query-service.js";
|
|
6
6
|
//#region src/gateway/hono/routes/home.ts
|
|
7
7
|
/** Register the unified work-home read model and its decision actions. */
|
|
8
8
|
function registerHomeRoutes(authenticated, deps) {
|
|
@@ -90,4 +90,4 @@ function registerHomeRoutes(authenticated, deps) {
|
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
92
|
//#endregion
|
|
93
|
-
export { buildHomeBriefing, registerHomeRoutes };
|
|
93
|
+
export { buildHomeBriefing, buildHomeFocusItems, registerHomeRoutes };
|
|
@@ -2,6 +2,7 @@ import { registerActivityRoutes } from "./activity.js";
|
|
|
2
2
|
import { registerAgentStreamRoutes } from "./agent-stream.js";
|
|
3
3
|
import { registerDiscussionRoutes } from "./discussions.js";
|
|
4
4
|
import { registerSessionsRoutes } from "./sessions.js";
|
|
5
|
+
import { registerSideChatRoutes } from "./side-chats.js";
|
|
5
6
|
import { registerStatusRoutes } from "./status.js";
|
|
6
7
|
import { registerProjectsRoutes } from "./projects.js";
|
|
7
8
|
import { registerProjectSkillRoutes } from "./project-skills.js";
|
|
@@ -22,6 +23,7 @@ function registerCoreAuthenticatedRoutes(authenticated, deps) {
|
|
|
22
23
|
registerStatusRoutes(authenticated, deps);
|
|
23
24
|
registerAgentStreamRoutes(authenticated, deps);
|
|
24
25
|
registerSessionsRoutes(authenticated, deps);
|
|
26
|
+
registerSideChatRoutes(authenticated, deps);
|
|
25
27
|
registerActivityRoutes(authenticated, deps);
|
|
26
28
|
registerDiscussionRoutes(authenticated, deps);
|
|
27
29
|
registerProjectsRoutes(authenticated, deps);
|
|
@@ -16,6 +16,7 @@ import { buildProjectLoopOverview } from "../../../projects/project-loop.js";
|
|
|
16
16
|
import "../../../projects/index.js";
|
|
17
17
|
import { TaskApplicationService } from "../../../tasks/task-application-service.js";
|
|
18
18
|
import { defineTaskContract } from "../../../tasks/task-contract-definition.js";
|
|
19
|
+
import { ProjectOperatingViewService, summarizeProjectOperatingView } from "../../../tasks/project-operating-view-service.js";
|
|
19
20
|
import "../../../tasks/index.js";
|
|
20
21
|
import { classifyFileReferenceFsError } from "../../file-reference-errors.js";
|
|
21
22
|
import { createGatewayRouteLogger } from "../lib/route-logger.js";
|
|
@@ -313,6 +314,7 @@ function projectDigestMemoryRecordId(projectId) {
|
|
|
313
314
|
function registerProjectsRoutes(authenticated, deps) {
|
|
314
315
|
const { service } = deps;
|
|
315
316
|
const activity = new ActivityService();
|
|
317
|
+
const operatingViews = new ProjectOperatingViewService(service.projects);
|
|
316
318
|
authenticated.post("/api/projects", async (c) => {
|
|
317
319
|
const body = await c.req.json().catch(() => ({}));
|
|
318
320
|
const name = textField(body, "name")?.trim();
|
|
@@ -385,10 +387,19 @@ function registerProjectsRoutes(authenticated, deps) {
|
|
|
385
387
|
limit: parseLimit(c.req.query("limit")),
|
|
386
388
|
offset: c.req.query("offset") ? Math.max(0, Number.parseInt(c.req.query("offset"), 10) || 0) : void 0
|
|
387
389
|
});
|
|
390
|
+
const includeOperating = c.req.query("includeOperating") === "true";
|
|
388
391
|
return c.json({
|
|
389
392
|
ok: true,
|
|
390
393
|
...result,
|
|
391
|
-
items: result.items.map((project) =>
|
|
394
|
+
items: result.items.map((project) => {
|
|
395
|
+
const enriched = enrichProjectWorkspace(service, project);
|
|
396
|
+
if (!includeOperating) return enriched;
|
|
397
|
+
const view = operatingViews.get(project.id);
|
|
398
|
+
return {
|
|
399
|
+
...enriched,
|
|
400
|
+
operating: view ? summarizeProjectOperatingView(view) : void 0
|
|
401
|
+
};
|
|
402
|
+
})
|
|
392
403
|
});
|
|
393
404
|
});
|
|
394
405
|
authenticated.get("/api/projects/suggestions", async (c) => {
|
|
@@ -1117,6 +1128,61 @@ function registerProjectsRoutes(authenticated, deps) {
|
|
|
1117
1128
|
}, 500);
|
|
1118
1129
|
}
|
|
1119
1130
|
});
|
|
1131
|
+
authenticated.post("/api/projects/:id/files/upload", async (c) => {
|
|
1132
|
+
let body;
|
|
1133
|
+
try {
|
|
1134
|
+
body = await c.req.parseBody();
|
|
1135
|
+
} catch {
|
|
1136
|
+
return c.json({
|
|
1137
|
+
ok: false,
|
|
1138
|
+
error: { message: "Invalid multipart body" }
|
|
1139
|
+
}, 400);
|
|
1140
|
+
}
|
|
1141
|
+
const file = body.file;
|
|
1142
|
+
if (!(file instanceof File)) return c.json({
|
|
1143
|
+
ok: false,
|
|
1144
|
+
error: { message: "Missing file" }
|
|
1145
|
+
}, 400);
|
|
1146
|
+
const requestedPath = typeof body.path === "string" ? body.path.trim() : "";
|
|
1147
|
+
if (!requestedPath) return c.json({
|
|
1148
|
+
ok: false,
|
|
1149
|
+
error: { message: "Missing path" }
|
|
1150
|
+
}, 400);
|
|
1151
|
+
const resolved = await resolveProjectWorkspaceWritePath(service, c.req.param("id"), requestedPath);
|
|
1152
|
+
if (resolved.ok === false) return c.json({
|
|
1153
|
+
ok: false,
|
|
1154
|
+
error: { message: resolved.error }
|
|
1155
|
+
}, resolved.status);
|
|
1156
|
+
if (resolved.existingStat) return c.json({
|
|
1157
|
+
ok: false,
|
|
1158
|
+
error: { message: "File already exists" }
|
|
1159
|
+
}, 409);
|
|
1160
|
+
try {
|
|
1161
|
+
await writeFile(resolved.absolutePath, Buffer.from(await file.arrayBuffer()), { flag: "wx" });
|
|
1162
|
+
const entryStat = await stat(resolved.absolutePath);
|
|
1163
|
+
return c.json({
|
|
1164
|
+
ok: true,
|
|
1165
|
+
entry: {
|
|
1166
|
+
name: path$1.basename(resolved.relativePath),
|
|
1167
|
+
path: resolved.relativePath,
|
|
1168
|
+
absolutePath: resolved.absolutePath,
|
|
1169
|
+
type: "file",
|
|
1170
|
+
size: entryStat.size,
|
|
1171
|
+
updatedAt: entryStat.mtime.toISOString()
|
|
1172
|
+
}
|
|
1173
|
+
}, 201);
|
|
1174
|
+
} catch (err) {
|
|
1175
|
+
log.error({
|
|
1176
|
+
err,
|
|
1177
|
+
projectId: resolved.projectId,
|
|
1178
|
+
path: resolved.absolutePath
|
|
1179
|
+
}, "project file upload failed");
|
|
1180
|
+
return c.json({
|
|
1181
|
+
ok: false,
|
|
1182
|
+
error: { message: "Upload failed" }
|
|
1183
|
+
}, 500);
|
|
1184
|
+
}
|
|
1185
|
+
});
|
|
1120
1186
|
authenticated.post("/api/projects/:id/sessions/:sessionKey", async (c) => {
|
|
1121
1187
|
try {
|
|
1122
1188
|
service.projects.attachSession(c.req.param("sessionKey"), c.req.param("id"));
|