@xopcai/xopc 0.0.145 → 0.0.147
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/README.md +2 -2
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/demo-memory/src/index.js +6 -4
- package/dist/extensions/demo-memory/src/index.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/Combination-14nmIgxH.js +41 -0
- package/dist/gateway/static/root/assets/activity-store-DXeSSlw1.js +1 -0
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BEUxdhZx.js → agent-avatar-dicebear-CFdJKSjY.js} +1 -1
- package/dist/gateway/static/root/assets/agents-DKjbRpbA.js +2 -0
- package/dist/gateway/static/root/assets/api-Bs69B5zA.js +1 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-CRHSZJWi.js → app-management-settings-panel-ag1ViXT_.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-BunADYJb.js → appearance-settings-C6iMpwOM.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-CpX3lBFF.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-B6vTkH2A.js → archive-plugin-Dwi3mIBy.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-BjZXzaNv.js → attachment-load-BaCDoq40.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-suggestion-card-ZDA-Stg1.js → automation-suggestion-card-CwqtFgnw.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-DlupOxFQ.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-DYZfLvPz.js → binary-plugins-DoAYhsxa.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-C3MUlYC9.js → block-editor-Bw72pO7S.js} +31 -31
- package/dist/gateway/static/root/assets/browser-settings-page-BwLoUBcZ.js +8 -0
- package/dist/gateway/static/root/assets/capability-presets-api-vdbAR65Q.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-BAsKbJgm.js +2 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-fTlTnWB4.js → channel-recipient-api-rTG26jpV.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-CxFWy0cE.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-OKlqTtKJ.js +1 -0
- package/dist/gateway/static/root/assets/{connector-logo-BVFNT2zW.js → connector-logo-DIMP4NWY.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-BjQQwX62.js +2 -0
- package/dist/gateway/static/root/assets/{desktop-pet-_jUmoXd3.js → desktop-pet-kQq2e0BN.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-DwGOy4AQ.js → desktop-pet-settings-B6vtozMY.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-akvF0F-u.js → directory-picker-path-field-Dn5-e3v4.js} +1 -1
- package/dist/gateway/static/root/assets/dist-C230izr8.js +1 -0
- package/dist/gateway/static/root/assets/dist-CxGUk8J-.js +1 -0
- package/dist/gateway/static/root/assets/dreaming-settings-BzwIujPG.js +3 -0
- package/dist/gateway/static/root/assets/extension-debug-page-D_e_hsEy.js +1 -0
- package/dist/gateway/static/root/assets/{extension-page-CwWktRNz.js → extension-page-D15CWHBd.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-CuggWOIl.js → extension-settings-page-D4P0n1om.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-B7sxIbza.js → gateway-config-api-B4qZctjG.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-DIv0eKMf.js → gateway-settings-BvndV7TP.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-DtoLihQE.js → gateway-startup-retry-BpgMunEb.js} +1 -1
- package/dist/gateway/static/root/assets/{goal-create-dialog-C4Kw0mfS.js → goal-create-dialog-DrVHKXHq.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-PHlCwv68.js +4 -0
- package/dist/gateway/static/root/assets/{goals-config-api-B0jm5JaA.js → goals-config-api-B6YJB_ct.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-Hg9uyO6e.js +2 -0
- package/dist/gateway/static/root/assets/{goals-settings-N5_iL7es.js → goals-settings-BROWCIcL.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-XzH3lbRR.js → heartbeat-settings-CoCwIOIg.js} +1 -1
- package/dist/gateway/static/root/assets/index-CxkNzw3e.js +259 -0
- package/dist/gateway/static/root/assets/index-DjCSOyaN.css +1 -0
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-Bm_AIYQ7.js +1 -0
- package/dist/gateway/static/root/assets/local-app-workbench-page-BJWFcxwG.js +2 -0
- package/dist/gateway/static/root/assets/local-apps-page-BsiZMrEf.js +1 -0
- package/dist/gateway/static/root/assets/{locale-store-CiM-D9jA.js → locale-store-Bp8joZck.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-DOmK61ey.js +7 -0
- package/dist/gateway/static/root/assets/{markdown-split-5rJx5flj.js → markdown-split-Dy7QpaAz.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-DYXccwAd.js → media-plugins-3Lxliy9D.js} +1 -1
- package/dist/gateway/static/root/assets/messages-CQGpD-dC.js +5 -0
- package/dist/gateway/static/root/assets/models-hub-panel-DGCZom4o.js +2 -0
- package/dist/gateway/static/root/assets/{notes-page-BgLyndCO.js → notes-page-BJtT4vSf.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-B_bN7cOR.js +4 -0
- package/dist/gateway/static/root/assets/{page-tabs-6Al9_sGz.js → page-tabs-DKB6RDre.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-Cm3G72Hv.js → preview-open-alternatives-Br_YhYHp.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-Dq8JouJj.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-DvfL7fSe.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-DqwMXSXP.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-BYtfzu_F.js → save-bar-controls-BgIE9BBh.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-CvIRc6yK.js → schedule-field-BXDP-oMz.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-CQuKx0n7.js → schema-form-Dhv-SmjG.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-B_mOZkQk.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BHGmH6YS.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-CF3HHM-t.js → settings-collapsible-section-CUTExnlK.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-CwWjoRN6.js → settings-form-section-CmnDhsf0.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-aUFmJa13.js → settings-loading-skeleton-B79dq-XY.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-B2UUU9TF.js → settings-page-Db8uAv3X.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-DqpbTWqI.js → settings-page-layout-DaFwstQw.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-BUSEj0KK.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-BOhlPsS1.js → share-preview-page-Bi00uXzV.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-DzsTYfuX.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DSsdU081.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-DeB1tQZL.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-CWxSvuwD.js → system-settings-panel-Cxaph7hW.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-C9Dxcppm.js → theme-store-eCTN1RpG.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-qROAvqTw.js → typed-models-lib-CcZ_tyFY.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-DE9cpn4G.js → use-channel-catalog-C4PWbNoi.js} +1 -1
- package/dist/gateway/static/root/assets/user-context-page-QTVMx_hG.js +1 -0
- package/dist/gateway/static/root/assets/{user-profile-fields-editor-CWxc0ghP.js → user-profile-fields-editor-CPOO9Jz5.js} +1 -1
- package/dist/gateway/static/root/assets/{user-profile-settings-panel-DW-Up6vt.js → user-profile-settings-panel-C8cgtSF7.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-D53uRXVr.js → utils-CiZK2KwH.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-b-YZtvUu.js +1 -0
- package/dist/gateway/static/root/assets/work-discovery-page-4zVDOl2G.js +1 -0
- package/dist/gateway/static/root/assets/work-item-detail-page-CHe2tfkc.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-D_x9ELJp.js → workflow-run-setup-panel-8SLCYeXE.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-DEOFqiWn.js +11 -0
- package/dist/gateway/static/root/index.html +10 -9
- package/dist/package.js +1 -1
- package/dist/src/activity/types.d.ts +1 -1
- package/dist/src/agent/agent-instance-gateway.d.ts +1 -1
- package/dist/src/agent/agent-manager.d.ts +1 -1
- package/dist/src/agent/agent-manager.js +5 -4
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/background-review/coordinator.js +0 -1
- package/dist/src/agent/background-review/coordinator.js.map +1 -1
- package/dist/src/agent/background-review/settings.d.ts +1 -1
- package/dist/src/agent/background-review/settings.js +10 -17
- package/dist/src/agent/background-review/settings.js.map +1 -1
- package/dist/src/agent/bootstrap/filter-bootstrap-files.d.ts +1 -1
- package/dist/src/agent/bootstrap/filter-bootstrap-files.js +1 -1
- package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +1 -1
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +2 -3
- package/dist/src/agent/bootstrap/load-bootstrap-files.js.map +1 -1
- package/dist/src/agent/code-intelligence/binary.js +1 -1
- package/dist/src/agent/context/project-context.d.ts +14 -0
- package/dist/src/agent/context/project-context.js +23 -1
- package/dist/src/agent/context/project-context.js.map +1 -1
- package/dist/src/agent/context/workspace-templates/AGENTS.md +1 -1
- package/dist/src/agent/context/workspace.d.ts +1 -2
- package/dist/src/agent/context/workspace.js +2 -4
- package/dist/src/agent/context/workspace.js.map +1 -1
- package/dist/src/agent/embedded/run-for-session.js +1 -2
- package/dist/src/agent/embedded/run-for-session.js.map +1 -1
- package/dist/src/agent/embedded/run-turn.js +6 -1
- package/dist/src/agent/embedded/run-turn.js.map +1 -1
- package/dist/src/agent/embedded/types.d.ts +17 -0
- package/dist/src/agent/memory/builtin-memory-store.d.ts +2 -2
- package/dist/src/agent/memory/builtin-memory-store.js +2 -2
- package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
- package/dist/src/agent/memory/builtin-provider.d.ts +1 -3
- package/dist/src/agent/memory/builtin-provider.js +21 -48
- package/dist/src/agent/memory/builtin-provider.js.map +1 -1
- package/dist/src/agent/memory/context/planner.js +48 -9
- package/dist/src/agent/memory/context/planner.js.map +1 -1
- package/dist/src/agent/memory/context/types.d.ts +7 -1
- package/dist/src/agent/memory/context-fence.js +1 -1
- package/dist/src/agent/memory/context-fence.js.map +1 -1
- package/dist/src/agent/memory/create-memory-manager.js +2 -9
- package/dist/src/agent/memory/create-memory-manager.js.map +1 -1
- package/dist/src/agent/memory/dreaming/config.js +5 -10
- package/dist/src/agent/memory/dreaming/config.js.map +1 -1
- package/dist/src/agent/memory/dreaming/promotion-lifecycle.js +2 -2
- package/dist/src/agent/memory/dreaming/promotion-lifecycle.js.map +1 -1
- package/dist/src/agent/memory/dreaming/scope.d.ts +2 -3
- package/dist/src/agent/memory/dreaming/scope.js +8 -8
- package/dist/src/agent/memory/dreaming/scope.js.map +1 -1
- package/dist/src/agent/memory/manager.d.ts +1 -5
- package/dist/src/agent/memory/manager.js +2 -23
- package/dist/src/agent/memory/manager.js.map +1 -1
- package/dist/src/agent/memory/memory-config.d.ts +3 -3
- package/dist/src/agent/memory/memory-config.js +9 -14
- package/dist/src/agent/memory/memory-config.js.map +1 -1
- package/dist/src/agent/memory/types.d.ts +9 -5
- package/dist/src/agent/memory/understanding/service.js +21 -8
- package/dist/src/agent/memory/understanding/service.js.map +1 -1
- package/dist/src/agent/memory/understanding/types.d.ts +5 -0
- package/dist/src/agent/memory/user-context-coordinator.d.ts +1 -1
- package/dist/src/agent/memory/user-context-coordinator.js +6 -2
- package/dist/src/agent/memory/user-context-coordinator.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +2 -2
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/prompt/memory/index.d.ts +1 -2
- package/dist/src/agent/prompt/memory/index.js +6 -7
- package/dist/src/agent/prompt/memory/index.js.map +1 -1
- package/dist/src/agent/prompt/sections/tooling.js +1 -1
- package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
- package/dist/src/agent/service/direct-turn-helpers.js +13 -2
- package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
- package/dist/src/agent/tools/curated-memory-tool.js +4 -4
- package/dist/src/agent/tools/curated-memory-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +1 -1
- package/dist/src/agent/tools/factory.js +2 -2
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/memory-tool.js +1 -1
- package/dist/src/agent/tools/memory-tool.js.map +1 -1
- package/dist/src/agent/workflow/workflow-child-tools.js +2 -3
- package/dist/src/agent/workflow/workflow-child-tools.js.map +1 -1
- package/dist/src/agent/workspace-runtime/registry.d.ts +5 -5
- package/dist/src/agent/workspace-runtime/registry.js +6 -11
- package/dist/src/agent/workspace-runtime/registry.js.map +1 -1
- package/dist/src/agent-manifest/index.js +2 -2
- package/dist/src/agent-manifest/prompt.js +1 -7
- package/dist/src/agent-manifest/prompt.js.map +1 -1
- package/dist/src/agent-manifest/schema.d.ts +0 -598
- package/dist/src/agent-manifest/schema.js +2 -143
- package/dist/src/agent-manifest/schema.js.map +1 -1
- package/dist/src/agent-manifest/validator.js +0 -12
- package/dist/src/agent-manifest/validator.js.map +1 -1
- package/dist/src/agent-runtime/index.js +1 -1
- package/dist/src/agent-runtime/memory-runtime.d.ts +2 -2
- package/dist/src/agent-runtime/memory-runtime.js +8 -7
- package/dist/src/agent-runtime/memory-runtime.js.map +1 -1
- package/dist/src/agent-runtime/runtime-profile.d.ts +2 -0
- package/dist/src/agent-runtime/runtime-profile.js +2 -2
- package/dist/src/agent-runtime/runtime-profile.js.map +1 -1
- package/dist/src/chat-commands/agent-edit.js +1 -2
- package/dist/src/chat-commands/agent-edit.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/init.js +0 -22
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/templates.d.ts +1 -1
- package/dist/src/cli/templates.js +1 -16
- package/dist/src/cli/templates.js.map +1 -1
- package/dist/src/commands/agents.config.js +0 -10
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/index.js +2 -2
- package/dist/src/config/paths.d.ts +0 -1
- package/dist/src/config/paths.js +1 -2
- package/dist/src/config/paths.js.map +1 -1
- package/dist/src/config/schema.d.ts +118 -532
- package/dist/src/config/schema.js +32 -26
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/extensions/loader.js +2 -1
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/gateway/agents-admin.d.ts +0 -2
- package/dist/src/gateway/agents-admin.js +1 -7
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/capability-presets-admin.d.ts +0 -2
- package/dist/src/gateway/capability-presets-admin.js.map +1 -1
- package/dist/src/gateway/chat-stream/mapper.js +26 -0
- package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
- package/dist/src/gateway/chat-stream/protocol.d.ts +16 -1
- package/dist/src/gateway/dreaming-automation-reconciler.d.ts +0 -1
- package/dist/src/gateway/dreaming-automation-reconciler.js +41 -63
- package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -1
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/app.js +3 -1
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +0 -130
- package/dist/src/gateway/hono/lib/config-payload.js +0 -1
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js +6 -12
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +6 -0
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
- package/dist/src/gateway/hono/routes/capability-presets.js +2 -2
- package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +9 -20
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/index.js +4 -0
- package/dist/src/gateway/hono/routes/index.js.map +1 -1
- package/dist/src/gateway/hono/routes/local-apps.d.ts +5 -0
- package/dist/src/gateway/hono/routes/local-apps.js +99 -0
- package/dist/src/gateway/hono/routes/local-apps.js.map +1 -0
- package/dist/src/gateway/hono/routes/memory.js +48 -65
- package/dist/src/gateway/hono/routes/memory.js.map +1 -1
- package/dist/src/gateway/hono/routes/projects.js +2 -2
- package/dist/src/gateway/hono/routes/projects.js.map +1 -1
- package/dist/src/gateway/hono/routes/work-discovery.d.ts +3 -0
- package/dist/src/gateway/hono/routes/work-discovery.js +150 -0
- package/dist/src/gateway/hono/routes/work-discovery.js.map +1 -0
- package/dist/src/gateway/hono/routes/you.d.ts +3 -0
- package/dist/src/gateway/hono/routes/you.js +358 -91
- package/dist/src/gateway/hono/routes/you.js.map +1 -1
- package/dist/src/gateway/service.d.ts +3 -0
- package/dist/src/gateway/service.js +12 -0
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/knowledge/connected-knowledge-pipeline.js +9 -5
- package/dist/src/knowledge/connected-knowledge-pipeline.js.map +1 -1
- package/dist/src/local-apps/acceptance.d.ts +30 -0
- package/dist/src/local-apps/acceptance.js +93 -0
- package/dist/src/local-apps/acceptance.js.map +1 -0
- package/dist/src/local-apps/index.d.ts +5 -0
- package/dist/src/local-apps/index.js +4 -0
- package/dist/src/local-apps/preview-runtime-bridge.d.ts +4 -0
- package/dist/src/local-apps/preview-runtime-bridge.js +171 -0
- package/dist/src/local-apps/preview-runtime-bridge.js.map +1 -0
- package/dist/src/local-apps/runtime-entry.d.ts +8 -0
- package/dist/src/local-apps/runtime-entry.js +25 -0
- package/dist/src/local-apps/runtime-entry.js.map +1 -0
- package/dist/src/local-apps/scaffold.d.ts +8 -0
- package/dist/src/local-apps/scaffold.js +122 -0
- package/dist/src/local-apps/scaffold.js.map +1 -0
- package/dist/src/local-apps/service.d.ts +37 -0
- package/dist/src/local-apps/service.js +553 -0
- package/dist/src/local-apps/service.js.map +1 -0
- package/dist/src/local-apps/store.d.ts +44 -0
- package/dist/src/local-apps/store.js +195 -0
- package/dist/src/local-apps/store.js.map +1 -0
- package/dist/src/local-apps/types.d.ts +105 -0
- package/dist/src/local-apps/types.js +1 -0
- package/dist/src/storage/sqlite/index.d.ts +3 -2
- package/dist/src/storage/sqlite/index.js +4 -3
- package/dist/src/storage/sqlite/memory-index-repository.d.ts +2 -3
- package/dist/src/storage/sqlite/memory-index-repository.js +16 -20
- package/dist/src/storage/sqlite/memory-index-repository.js.map +1 -1
- package/dist/src/storage/sqlite/memory-records-repository.d.ts +18 -10
- package/dist/src/storage/sqlite/memory-records-repository.js +79 -34
- package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -1
- package/dist/src/storage/sqlite/memory-reference-consent-repository.d.ts +27 -0
- package/dist/src/storage/sqlite/memory-reference-consent-repository.js +109 -0
- package/dist/src/storage/sqlite/memory-reference-consent-repository.js.map +1 -0
- package/dist/src/storage/sqlite/migrations/038_user_owned_memory.sql +68 -0
- package/dist/src/storage/sqlite/migrations/039_memory_reference_consents.sql +19 -0
- package/dist/src/storage/sqlite/migrations/040_local_apps.sql +32 -0
- package/dist/src/storage/sqlite/migrations/041_local_app_release_lifecycle.sql +17 -0
- package/dist/src/storage/sqlite/migrations/042_work_discovery.sql +41 -0
- package/dist/src/storage/sqlite/migrations/043_local_app_acceptance_runs.sql +16 -0
- package/dist/src/storage/sqlite/migrations/044_repair_work_discovery_foreign_keys.sql +75 -0
- package/dist/src/storage/sqlite/migrations/045_extension_ui_grants.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.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/schema.sql +20 -0
- package/dist/src/user-context/config.d.ts +227 -0
- package/dist/src/user-context/config.js +158 -0
- package/dist/src/user-context/config.js.map +1 -0
- package/dist/src/user-context/import.d.ts +1 -1
- package/dist/src/user-context/import.js +6 -1
- package/dist/src/user-context/import.js.map +1 -1
- package/dist/src/user-context/owner.d.ts +5 -0
- package/dist/src/user-context/owner.js +9 -0
- package/dist/src/user-context/owner.js.map +1 -0
- package/dist/src/user-context/projection.d.ts +11 -9
- package/dist/src/user-context/projection.js +74 -47
- package/dist/src/user-context/projection.js.map +1 -1
- package/dist/src/user-context/runtime.d.ts +13 -0
- package/dist/src/user-context/runtime.js +36 -0
- package/dist/src/user-context/runtime.js.map +1 -0
- package/dist/src/work-discovery/analyzer.d.ts +11 -0
- package/dist/src/work-discovery/analyzer.js +171 -0
- package/dist/src/work-discovery/analyzer.js.map +1 -0
- package/dist/src/work-discovery/index.d.ts +5 -0
- package/dist/src/work-discovery/index.js +5 -0
- package/dist/src/work-discovery/probe.d.ts +12 -0
- package/dist/src/work-discovery/probe.js +335 -0
- package/dist/src/work-discovery/probe.js.map +1 -0
- package/dist/src/work-discovery/repository.d.ts +11 -0
- package/dist/src/work-discovery/repository.js +100 -0
- package/dist/src/work-discovery/repository.js.map +1 -0
- package/dist/src/work-discovery/service.d.ts +30 -0
- package/dist/src/work-discovery/service.js +387 -0
- package/dist/src/work-discovery/service.js.map +1 -0
- package/dist/src/work-discovery/types.d.ts +114 -0
- package/dist/src/work-discovery/types.js +1 -0
- package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/package.json +5 -3
- package/skills/engineering/build-xopc-local-app/SKILL.md +45 -0
- package/skills/engineering/build-xopc-local-app/references/app-contract.md +33 -0
- package/skills/engineering/build-xopc-local-app/scripts/validate-local-app.mjs +72 -0
- package/dist/gateway/static/root/assets/Combination-DolwnuKi.js +0 -41
- package/dist/gateway/static/root/assets/activity-center-store-3l9ahUqb.js +0 -1
- package/dist/gateway/static/root/assets/agents-1bpT0xRO.js +0 -2
- package/dist/gateway/static/root/assets/apps-page-Cc4JgVUQ.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-mb0fdVpq.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-Bb0xhaMN.js +0 -8
- package/dist/gateway/static/root/assets/capability-presets-api-BV76yN9a.js +0 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-CUcGKZqC.js +0 -2
- package/dist/gateway/static/root/assets/channels-settings-BlSDMGdy.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-CJauF1CW.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-CMgAFGvb.js +0 -2
- package/dist/gateway/static/root/assets/dist-C99RGfAH.js +0 -1
- package/dist/gateway/static/root/assets/dreaming-settings-BLetQiYY.js +0 -3
- package/dist/gateway/static/root/assets/extension-debug-page-Cof2ncxE.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-BMmzYpZL.js +0 -4
- package/dist/gateway/static/root/assets/goals-page-CGeT77PC.js +0 -2
- package/dist/gateway/static/root/assets/index-CSLF84-Q.css +0 -1
- package/dist/gateway/static/root/assets/index-I-ZCenVw.js +0 -259
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-x_v0nrIi.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-BSh1t8cD.js +0 -7
- package/dist/gateway/static/root/assets/messages-Cb1VMeqP.js +0 -5
- package/dist/gateway/static/root/assets/models-hub-panel-BNpTenAI.js +0 -2
- package/dist/gateway/static/root/assets/notes-workbench-teklkhcE.js +0 -4
- package/dist/gateway/static/root/assets/project-detail-page-CCB_dKoh.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-VOAFAHYj.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-USYu64Ru.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-oGC8O5h_.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-D4rP66R1.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Ck9keROI.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-BYLsCuqj.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-BNHUyVML.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-CpXbQH4n.js +0 -2
- package/dist/gateway/static/root/assets/user-context-page-DbNEK4Yp.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-Cs7MOrg0.js +0 -1
- package/dist/gateway/static/root/assets/work-item-detail-page-D1ziG1Pp.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-DHGV_n6i.js +0 -11
- package/dist/src/agent/context/workspace-templates/MEMORY.md +0 -33
- package/dist/src/agent/memory/access-policy.d.ts +0 -12
- package/dist/src/agent/memory/access-policy.js +0 -44
- package/dist/src/agent/memory/access-policy.js.map +0 -1
|
@@ -20,12 +20,12 @@ function parseCreateBody(raw) {
|
|
|
20
20
|
description: typeof body.description === "string" ? body.description : void 0
|
|
21
21
|
};
|
|
22
22
|
if (Object.hasOwn(body, "version")) out.version = Number(body.version);
|
|
23
|
+
if (Object.hasOwn(body, "memory")) return { error: "memory is not a capability preset field" };
|
|
23
24
|
for (const key of [
|
|
24
25
|
"extends",
|
|
25
26
|
"models",
|
|
26
27
|
"tools",
|
|
27
28
|
"skills",
|
|
28
|
-
"memory",
|
|
29
29
|
"workflows",
|
|
30
30
|
"boundaries",
|
|
31
31
|
"runtime",
|
|
@@ -45,12 +45,12 @@ function parseUpdateBody(raw) {
|
|
|
45
45
|
if (Object.hasOwn(body, "name")) out.name = String(body.name ?? "");
|
|
46
46
|
if (Object.hasOwn(body, "description")) out.description = body.description === null ? null : String(body.description ?? "");
|
|
47
47
|
if (Object.hasOwn(body, "version")) out.version = Number(body.version);
|
|
48
|
+
if (Object.hasOwn(body, "memory")) return { error: "memory is not a capability preset field" };
|
|
48
49
|
for (const key of [
|
|
49
50
|
"extends",
|
|
50
51
|
"models",
|
|
51
52
|
"tools",
|
|
52
53
|
"skills",
|
|
53
|
-
"memory",
|
|
54
54
|
"workflows",
|
|
55
55
|
"boundaries",
|
|
56
56
|
"runtime",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability-presets.js","names":[],"sources":["../../../../../src/gateway/hono/routes/capability-presets.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { CapabilityPresetSchema } from '../../../agent-manifest/schema.js';\nimport type { Config } from '../../../config/schema.js';\nimport {\n listCapabilityPresets,\n prepareCreateCapabilityPreset,\n prepareDeleteCapabilityPreset,\n prepareUpdateCapabilityPreset,\n type CreateCapabilityPresetBody,\n type UpdateCapabilityPresetBody,\n} from '../../capability-presets-admin.js';\nimport { normalizeAgentId } from '../../../agent/agent-scope.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction parseJsonObject(raw: unknown): Record<string, unknown> | { error: string } {\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n return { error: 'body must be an object' };\n }\n return raw as Record<string, unknown>;\n}\n\nfunction isParseError(value: unknown): value is { error: string } {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'error' in value &&\n typeof (value as { error: string }).error === 'string'\n );\n}\n\nfunction parseCreateBody(raw: unknown): CreateCapabilityPresetBody | { error: string } {\n const body = parseJsonObject(raw);\n if (isParseError(body)) return body;\n const out: CreateCapabilityPresetBody = {\n id: typeof body.id === 'string' ? body.id : undefined,\n name: typeof body.name === 'string' ? body.name : undefined,\n description: typeof body.description === 'string' ? body.description : undefined,\n };\n if (Object.hasOwn(body, 'version')) out.version = Number(body.version);\n for (const key of ['extends', 'models', 'tools', 'skills', 'memory', 'workflows', 'boundaries', 'runtime', 'locks'] as const) {\n if (!Object.hasOwn(body, key)) continue;\n const parsed = CapabilityPresetSchema.pick({ [key]: true } as Record<typeof key, true>).safeParse({\n [key]: body[key],\n });\n if (!parsed.success) {\n return { error: `${key} ${parsed.error.issues[0]?.message ?? 'is invalid'}` };\n }\n out[key] = parsed.data[key] as never;\n }\n return out;\n}\n\nfunction parseUpdateBody(raw: unknown): UpdateCapabilityPresetBody | { error: string } {\n const body = parseJsonObject(raw);\n if (isParseError(body)) return body;\n const out: UpdateCapabilityPresetBody = {};\n if (Object.hasOwn(body, 'name')) out.name = String(body.name ?? '');\n if (Object.hasOwn(body, 'description')) {\n out.description = body.description === null ? null : String(body.description ?? '');\n }\n if (Object.hasOwn(body, 'version')) out.version = Number(body.version);\n for (const key of ['extends', 'models', 'tools', 'skills', 'memory', 'workflows', 'boundaries', 'runtime', 'locks'] as const) {\n if (!Object.hasOwn(body, key)) continue;\n if (body[key] === null) {\n out[key] = null as never;\n continue;\n }\n const parsed = CapabilityPresetSchema.pick({ [key]: true } as Record<typeof key, true>).safeParse({\n [key]: body[key],\n });\n if (!parsed.success) {\n return { error: `${key} ${parsed.error.issues[0]?.message ?? 'is invalid'}` };\n }\n out[key] = parsed.data[key] as never;\n }\n return out;\n}\n\nexport function registerCapabilityPresetsRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n authenticated.get('/api/capability-presets', async (c) => {\n return c.json({ ok: true, payload: listCapabilityPresets(service.currentConfig as Config) });\n });\n\n authenticated.post('/api/capability-presets', strictRateLimitMiddleware, async (c) => {\n let raw: unknown;\n try {\n raw = await c.req.json();\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const body = parseCreateBody(raw);\n if (isParseError(body)) {\n return c.json({ ok: false, error: { message: body.error } }, 400);\n }\n const prep = prepareCreateCapabilityPreset(service.currentConfig as Config, body);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const save = await service.saveConfig(prep.data.nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n return c.json({\n ok: true,\n payload: {\n presetId: prep.data.presetId,\n presets: listCapabilityPresets(service.currentConfig as Config),\n },\n });\n });\n\n authenticated.patch('/api/capability-presets/:id', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n let raw: unknown;\n try {\n raw = await c.req.json();\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const body = parseUpdateBody(raw);\n if (isParseError(body)) {\n return c.json({ ok: false, error: { message: body.error } }, 400);\n }\n const prep = prepareUpdateCapabilityPreset(service.currentConfig as Config, id, body);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const save = await service.saveConfig(prep.data.nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n return c.json({ ok: true, payload: listCapabilityPresets(service.currentConfig as Config) });\n });\n\n authenticated.delete('/api/capability-presets/:id', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const prep = prepareDeleteCapabilityPreset(service.currentConfig as Config, id);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const save = await service.saveConfig(prep.data.nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n return c.json({ ok: true, payload: listCapabilityPresets(service.currentConfig as Config) });\n });\n}\n"],"mappings":";;;;aAE2E;kBAUV;AAGjE,SAAS,gBAAgB,KAA2D;AAClF,KAAI,QAAQ,QAAQ,OAAO,QAAQ,YAAY,MAAM,QAAQ,IAAI,CAC/D,QAAO,EAAE,OAAO,0BAA0B;AAE5C,QAAO;;AAGT,SAAS,aAAa,OAA4C;AAChE,QACE,OAAO,UAAU,YACjB,UAAU,QACV,WAAW,SACX,OAAQ,MAA4B,UAAU;;AAIlD,SAAS,gBAAgB,KAA8D;CACrF,MAAM,OAAO,gBAAgB,IAAI;AACjC,KAAI,aAAa,KAAK,CAAE,QAAO;CAC/B,MAAM,MAAkC;EACtC,IAAI,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK,KAAA;EAC5C,MAAM,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO,KAAA;EAClD,aAAa,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc,KAAA;EACxE;AACD,KAAI,OAAO,OAAO,MAAM,UAAU,CAAE,KAAI,UAAU,OAAO,KAAK,QAAQ;AACtE,MAAK,MAAM,OAAO;EAAC;EAAW;EAAU;EAAS;EAAU;EAAU;EAAa;EAAc;EAAW;EAAQ,EAAW;AAC5H,MAAI,CAAC,OAAO,OAAO,MAAM,IAAI,CAAE;EAC/B,MAAM,SAAS,uBAAuB,KAAK,GAAG,MAAM,MAAM,CAA6B,CAAC,UAAU,GAC/F,MAAM,KAAK,MACb,CAAC;AACF,MAAI,CAAC,OAAO,QACV,QAAO,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,MAAM,OAAO,IAAI,WAAW,gBAAgB;AAE/E,MAAI,OAAO,OAAO,KAAK;;AAEzB,QAAO;;AAGT,SAAS,gBAAgB,KAA8D;CACrF,MAAM,OAAO,gBAAgB,IAAI;AACjC,KAAI,aAAa,KAAK,CAAE,QAAO;CAC/B,MAAM,MAAkC,EAAE;AAC1C,KAAI,OAAO,OAAO,MAAM,OAAO,CAAE,KAAI,OAAO,OAAO,KAAK,QAAQ,GAAG;AACnE,KAAI,OAAO,OAAO,MAAM,cAAc,CACpC,KAAI,cAAc,KAAK,gBAAgB,OAAO,OAAO,OAAO,KAAK,eAAe,GAAG;AAErF,KAAI,OAAO,OAAO,MAAM,UAAU,CAAE,KAAI,UAAU,OAAO,KAAK,QAAQ;AACtE,MAAK,MAAM,OAAO;EAAC;EAAW;EAAU;EAAS;EAAU;EAAU;EAAa;EAAc;EAAW;EAAQ,EAAW;AAC5H,MAAI,CAAC,OAAO,OAAO,MAAM,IAAI,CAAE;AAC/B,MAAI,KAAK,SAAS,MAAM;AACtB,OAAI,OAAO;AACX;;EAEF,MAAM,SAAS,uBAAuB,KAAK,GAAG,MAAM,MAAM,CAA6B,CAAC,UAAU,GAC/F,MAAM,KAAK,MACb,CAAC;AACF,MAAI,CAAC,OAAO,QACV,QAAO,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,MAAM,OAAO,IAAI,WAAW,gBAAgB;AAE/E,MAAI,OAAO,OAAO,KAAK;;AAEzB,QAAO;;AAGT,SAAgB,gCAAgC,eAAqB,MAAoC;CACvG,MAAM,EAAE,SAAS,8BAA8B;AAE/C,eAAc,IAAI,2BAA2B,OAAO,MAAM;AACxD,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,sBAAsB,QAAQ,cAAwB;GAAE,CAAC;GAC5F;AAEF,eAAc,KAAK,2BAA2B,2BAA2B,OAAO,MAAM;EACpF,IAAI;AACJ,MAAI;AACF,SAAM,MAAM,EAAE,IAAI,MAAM;UAClB;AACN,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,EAAE,SAAS,gBAAgB;IAAE,EAAE,IAAI;;EAEvE,MAAM,OAAO,gBAAgB,IAAI;AACjC,MAAI,aAAa,KAAK,CACpB,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,KAAK,OAAO;GAAE,EAAE,IAAI;EAEnE,MAAM,OAAO,8BAA8B,QAAQ,eAAyB,KAAK;AACjF,MAAI,KAAK,OAAO,MACd,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,KAAK,OAAO;GAAE,EAAE,KAAK,UAAU,IAAI;EAElF,MAAM,OAAO,MAAM,QAAQ,WAAW,KAAK,KAAK,WAAW;AAC3D,MAAI,CAAC,KAAK,MACR,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,KAAK,SAAS,eAAe;GAAE,EAAE,IAAI;AAEpF,SAAO,EAAE,KAAK;GACZ,IAAI;GACJ,SAAS;IACP,UAAU,KAAK,KAAK;IACpB,SAAS,sBAAsB,QAAQ,cAAwB;IAChE;GACF,CAAC;GACF;AAEF,eAAc,MAAM,+BAA+B,2BAA2B,OAAO,MAAM;EACzF,MAAM,KAAK,iBAAiB,EAAE,IAAI,MAAM,KAAK,IAAI,GAAG;EACpD,IAAI;AACJ,MAAI;AACF,SAAM,MAAM,EAAE,IAAI,MAAM;UAClB;AACN,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,EAAE,SAAS,gBAAgB;IAAE,EAAE,IAAI;;EAEvE,MAAM,OAAO,gBAAgB,IAAI;AACjC,MAAI,aAAa,KAAK,CACpB,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,KAAK,OAAO;GAAE,EAAE,IAAI;EAEnE,MAAM,OAAO,8BAA8B,QAAQ,eAAyB,IAAI,KAAK;AACrF,MAAI,KAAK,OAAO,MACd,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,KAAK,OAAO;GAAE,EAAE,KAAK,UAAU,IAAI;EAElF,MAAM,OAAO,MAAM,QAAQ,WAAW,KAAK,KAAK,WAAW;AAC3D,MAAI,CAAC,KAAK,MACR,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,KAAK,SAAS,eAAe;GAAE,EAAE,IAAI;AAEpF,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,sBAAsB,QAAQ,cAAwB;GAAE,CAAC;GAC5F;AAEF,eAAc,OAAO,+BAA+B,2BAA2B,OAAO,MAAM;EAC1F,MAAM,KAAK,iBAAiB,EAAE,IAAI,MAAM,KAAK,IAAI,GAAG;EACpD,MAAM,OAAO,8BAA8B,QAAQ,eAAyB,GAAG;AAC/E,MAAI,KAAK,OAAO,MACd,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,KAAK,OAAO;GAAE,EAAE,KAAK,UAAU,IAAI;EAElF,MAAM,OAAO,MAAM,QAAQ,WAAW,KAAK,KAAK,WAAW;AAC3D,MAAI,CAAC,KAAK,MACR,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,EAAE,SAAS,KAAK,SAAS,eAAe;GAAE,EAAE,IAAI;AAEpF,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,sBAAsB,QAAQ,cAAwB;GAAE,CAAC;GAC5F"}
|
|
1
|
+
{"version":3,"file":"capability-presets.js","names":[],"sources":["../../../../../src/gateway/hono/routes/capability-presets.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { CapabilityPresetSchema } from '../../../agent-manifest/schema.js';\nimport type { Config } from '../../../config/schema.js';\nimport {\n listCapabilityPresets,\n prepareCreateCapabilityPreset,\n prepareDeleteCapabilityPreset,\n prepareUpdateCapabilityPreset,\n type CreateCapabilityPresetBody,\n type UpdateCapabilityPresetBody,\n} from '../../capability-presets-admin.js';\nimport { normalizeAgentId } from '../../../agent/agent-scope.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction parseJsonObject(raw: unknown): Record<string, unknown> | { error: string } {\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n return { error: 'body must be an object' };\n }\n return raw as Record<string, unknown>;\n}\n\nfunction isParseError(value: unknown): value is { error: string } {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'error' in value &&\n typeof (value as { error: string }).error === 'string'\n );\n}\n\nfunction parseCreateBody(raw: unknown): CreateCapabilityPresetBody | { error: string } {\n const body = parseJsonObject(raw);\n if (isParseError(body)) return body;\n const out: CreateCapabilityPresetBody = {\n id: typeof body.id === 'string' ? body.id : undefined,\n name: typeof body.name === 'string' ? body.name : undefined,\n description: typeof body.description === 'string' ? body.description : undefined,\n };\n if (Object.hasOwn(body, 'version')) out.version = Number(body.version);\n if (Object.hasOwn(body, 'memory')) return { error: 'memory is not a capability preset field' };\n for (const key of ['extends', 'models', 'tools', 'skills', 'workflows', 'boundaries', 'runtime', 'locks'] as const) {\n if (!Object.hasOwn(body, key)) continue;\n const parsed = CapabilityPresetSchema.pick({ [key]: true } as Record<typeof key, true>).safeParse({\n [key]: body[key],\n });\n if (!parsed.success) {\n return { error: `${key} ${parsed.error.issues[0]?.message ?? 'is invalid'}` };\n }\n out[key] = parsed.data[key] as never;\n }\n return out;\n}\n\nfunction parseUpdateBody(raw: unknown): UpdateCapabilityPresetBody | { error: string } {\n const body = parseJsonObject(raw);\n if (isParseError(body)) return body;\n const out: UpdateCapabilityPresetBody = {};\n if (Object.hasOwn(body, 'name')) out.name = String(body.name ?? '');\n if (Object.hasOwn(body, 'description')) {\n out.description = body.description === null ? null : String(body.description ?? '');\n }\n if (Object.hasOwn(body, 'version')) out.version = Number(body.version);\n if (Object.hasOwn(body, 'memory')) return { error: 'memory is not a capability preset field' };\n for (const key of ['extends', 'models', 'tools', 'skills', 'workflows', 'boundaries', 'runtime', 'locks'] as const) {\n if (!Object.hasOwn(body, key)) continue;\n if (body[key] === null) {\n out[key] = null as never;\n continue;\n }\n const parsed = CapabilityPresetSchema.pick({ [key]: true } as Record<typeof key, true>).safeParse({\n [key]: body[key],\n });\n if (!parsed.success) {\n return { error: `${key} ${parsed.error.issues[0]?.message ?? 'is invalid'}` };\n }\n out[key] = parsed.data[key] as never;\n }\n return out;\n}\n\nexport function registerCapabilityPresetsRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n authenticated.get('/api/capability-presets', async (c) => {\n return c.json({ ok: true, payload: listCapabilityPresets(service.currentConfig as Config) });\n });\n\n authenticated.post('/api/capability-presets', strictRateLimitMiddleware, async (c) => {\n let raw: unknown;\n try {\n raw = await c.req.json();\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const body = parseCreateBody(raw);\n if (isParseError(body)) {\n return c.json({ ok: false, error: { message: body.error } }, 400);\n }\n const prep = prepareCreateCapabilityPreset(service.currentConfig as Config, body);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const save = await service.saveConfig(prep.data.nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n return c.json({\n ok: true,\n payload: {\n presetId: prep.data.presetId,\n presets: listCapabilityPresets(service.currentConfig as Config),\n },\n });\n });\n\n authenticated.patch('/api/capability-presets/:id', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n let raw: unknown;\n try {\n raw = await c.req.json();\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const body = parseUpdateBody(raw);\n if (isParseError(body)) {\n return c.json({ ok: false, error: { message: body.error } }, 400);\n }\n const prep = prepareUpdateCapabilityPreset(service.currentConfig as Config, id, body);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const save = await service.saveConfig(prep.data.nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n return c.json({ ok: true, payload: listCapabilityPresets(service.currentConfig as Config) });\n });\n\n authenticated.delete('/api/capability-presets/:id', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const prep = prepareDeleteCapabilityPreset(service.currentConfig as Config, id);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const save = await service.saveConfig(prep.data.nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n return c.json({ ok: true, payload: listCapabilityPresets(service.currentConfig as Config) });\n });\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { init_agent_scope, normalizeAgentId, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
|
|
2
1
|
import { DREAMING_DIR_RELATIVE, DREAMING_LAST_RUN_RELATIVE, SHORT_TERM_PROMOTION_LOCK_RELATIVE, SHORT_TERM_RECALL_STORE_RELATIVE } from "../../../agent/memory/dreaming/constants.js";
|
|
3
2
|
import { clearStaleDreamingLock, loadDreamingStore, resetDreamingStore } from "../../../agent/memory/dreaming/short-term-store.js";
|
|
4
3
|
import { resolveDreamingAgentScope } from "../../../agent/memory/dreaming/scope.js";
|
|
@@ -11,21 +10,11 @@ import { previewDreamingDeepPromotion } from "../../../agent/memory/dreaming/pre
|
|
|
11
10
|
import path from "node:path";
|
|
12
11
|
import fs from "node:fs/promises";
|
|
13
12
|
//#region src/gateway/hono/routes/dreaming.ts
|
|
14
|
-
init_agent_scope();
|
|
15
13
|
function isRecord(v) {
|
|
16
14
|
return v !== null && typeof v === "object" && !Array.isArray(v);
|
|
17
15
|
}
|
|
18
|
-
function
|
|
19
|
-
return (
|
|
20
|
-
}
|
|
21
|
-
function hasEnabledAgent(cfg, agentId) {
|
|
22
|
-
const normalized = normalizeAgentId(agentId);
|
|
23
|
-
return cfg.agents.list.some((agent) => agent.enabled !== false && normalizeAgentId(agent.id) === normalized);
|
|
24
|
-
}
|
|
25
|
-
function resolveRouteScope(cfg, requestedAgentId) {
|
|
26
|
-
const agentId = normalizeAgentId(requestedAgentId || resolveDefaultAgentId(cfg));
|
|
27
|
-
if (!hasEnabledAgent(cfg, agentId)) throw new Error(`Agent not found: ${agentId}`);
|
|
28
|
-
return resolveDreamingAgentScope(cfg, agentId);
|
|
16
|
+
function resolveRouteScope(cfg) {
|
|
17
|
+
return resolveDreamingAgentScope(cfg);
|
|
29
18
|
}
|
|
30
19
|
async function readLockInfo(dreamingRoot) {
|
|
31
20
|
const lockPath = path.join(dreamingRoot, SHORT_TERM_PROMOTION_LOCK_RELATIVE);
|
|
@@ -115,7 +104,7 @@ function registerDreamingRoutes(authenticated, deps) {
|
|
|
115
104
|
const cfg = service.currentConfig;
|
|
116
105
|
let scope;
|
|
117
106
|
try {
|
|
118
|
-
scope = resolveRouteScope(cfg
|
|
107
|
+
scope = resolveRouteScope(cfg);
|
|
119
108
|
} catch (err) {
|
|
120
109
|
const message = err instanceof Error ? err.message : String(err);
|
|
121
110
|
return c.json({
|
|
@@ -151,7 +140,7 @@ function registerDreamingRoutes(authenticated, deps) {
|
|
|
151
140
|
const cfg = service.currentConfig;
|
|
152
141
|
let scope;
|
|
153
142
|
try {
|
|
154
|
-
scope = resolveRouteScope(cfg
|
|
143
|
+
scope = resolveRouteScope(cfg);
|
|
155
144
|
} catch (err) {
|
|
156
145
|
const message = err instanceof Error ? err.message : String(err);
|
|
157
146
|
return c.json({
|
|
@@ -187,7 +176,7 @@ function registerDreamingRoutes(authenticated, deps) {
|
|
|
187
176
|
const cfg = service.currentConfig;
|
|
188
177
|
let scope;
|
|
189
178
|
try {
|
|
190
|
-
scope = resolveRouteScope(cfg
|
|
179
|
+
scope = resolveRouteScope(cfg);
|
|
191
180
|
} catch (err) {
|
|
192
181
|
const message = err instanceof Error ? err.message : String(err);
|
|
193
182
|
return c.json({
|
|
@@ -215,14 +204,14 @@ function registerDreamingRoutes(authenticated, deps) {
|
|
|
215
204
|
workspaceDir: scope.workspaceDir,
|
|
216
205
|
dreamingRoot: scope.memoriesDir,
|
|
217
206
|
config: dreaming.phases.rem,
|
|
218
|
-
sensitiveWritePolicy:
|
|
207
|
+
sensitiveWritePolicy: cfg.userContext.privacy.sensitiveWritePolicy,
|
|
219
208
|
promotionWritePolicy: dreaming.promotionWritePolicy.decision
|
|
220
209
|
}) : await runDreamingDeepPromotion({
|
|
221
210
|
agentId: scope.agentId,
|
|
222
211
|
workspaceDir: scope.workspaceDir,
|
|
223
212
|
dreamingRoot: scope.memoriesDir,
|
|
224
213
|
config: dreaming.phases.deep,
|
|
225
|
-
sensitiveWritePolicy:
|
|
214
|
+
sensitiveWritePolicy: cfg.userContext.privacy.sensitiveWritePolicy
|
|
226
215
|
});
|
|
227
216
|
service.emit("dreaming.phase.end", {
|
|
228
217
|
agentId: scope.agentId,
|
|
@@ -264,7 +253,7 @@ function registerDreamingRoutes(authenticated, deps) {
|
|
|
264
253
|
const action = isRecord(body) && typeof body.action === "string" ? body.action.trim() : "";
|
|
265
254
|
let scope;
|
|
266
255
|
try {
|
|
267
|
-
scope = resolveRouteScope(cfg
|
|
256
|
+
scope = resolveRouteScope(cfg);
|
|
268
257
|
} catch (err) {
|
|
269
258
|
const message = err instanceof Error ? err.message : String(err);
|
|
270
259
|
return c.json({
|
|
@@ -310,7 +299,7 @@ function registerDreamingRoutes(authenticated, deps) {
|
|
|
310
299
|
const cfg = service.currentConfig;
|
|
311
300
|
let scope;
|
|
312
301
|
try {
|
|
313
|
-
scope = resolveRouteScope(cfg
|
|
302
|
+
scope = resolveRouteScope(cfg);
|
|
314
303
|
} catch (err) {
|
|
315
304
|
const message = err instanceof Error ? err.message : String(err);
|
|
316
305
|
return c.json({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dreaming.js","names":[],"sources":["../../../../../src/gateway/hono/routes/dreaming.ts"],"sourcesContent":["import type { Hono } from 'hono';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { type Config } from '../../../config/schema.js';\nimport { normalizeAgentId, resolveDefaultAgentId } from '../../../agent/agent-scope.js';\nimport {\n DREAMING_DIR_RELATIVE,\n DREAMING_LAST_RUN_RELATIVE,\n SHORT_TERM_PROMOTION_LOCK_RELATIVE,\n SHORT_TERM_RECALL_STORE_RELATIVE,\n type DreamingPhaseId,\n} from '../../../agent/memory/dreaming/constants.js';\nimport { readDreamingEvents } from '../../../agent/memory/dreaming/events.js';\nimport { previewDreamingDeepPromotion } from '../../../agent/memory/dreaming/preview.js';\nimport { runLightSweep } from '../../../agent/memory/dreaming/light-sweep.js';\nimport { runDreamingDeepPromotion } from '../../../agent/memory/dreaming/deep-promotion.js';\nimport { runRemPatterns } from '../../../agent/memory/dreaming/rem-patterns.js';\nimport { parseDreamingLastRunFile, type DreamingDeepLastRun } from '../../../agent/memory/dreaming/last-run.js';\nimport { resolveDreamingAgentScope, type DreamingAgentScope } from '../../../agent/memory/dreaming/scope.js';\nimport {\n clearStaleDreamingLock,\n loadDreamingStore,\n resetDreamingStore,\n type DreamingStore,\n} from '../../../agent/memory/dreaming/short-term-store.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nfunction requestedAgentIdFrom(c: { req: { query(name: string): string | undefined } }, body?: unknown): string | undefined {\n const fromBody = isRecord(body) && typeof body.agentId === 'string' ? body.agentId : undefined;\n return fromBody ?? c.req.query('agentId');\n}\n\nfunction hasEnabledAgent(cfg: Config, agentId: string): boolean {\n const normalized = normalizeAgentId(agentId);\n return cfg.agents.list.some((agent) => agent.enabled !== false && normalizeAgentId(agent.id) === normalized);\n}\n\nfunction resolveRouteScope(cfg: Config, requestedAgentId?: string): DreamingAgentScope {\n const agentId = normalizeAgentId(requestedAgentId || resolveDefaultAgentId(cfg));\n if (!hasEnabledAgent(cfg, agentId)) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n return resolveDreamingAgentScope(cfg, agentId);\n}\n\nasync function readLockInfo(dreamingRoot: string): Promise<\n | { locked: false }\n | { locked: true; path: string; content: string; mtimeMs?: number }\n> {\n const lockPath = path.join(dreamingRoot, SHORT_TERM_PROMOTION_LOCK_RELATIVE);\n try {\n const [content, st] = await Promise.all([fs.readFile(lockPath, 'utf-8'), fs.stat(lockPath)]);\n return {\n locked: true,\n path: SHORT_TERM_PROMOTION_LOCK_RELATIVE,\n content: content.trim(),\n mtimeMs: st.mtimeMs,\n };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { locked: false };\n return { locked: true, path: SHORT_TERM_PROMOTION_LOCK_RELATIVE, content: 'unknown', mtimeMs: undefined };\n }\n}\n\nasync function readLastRun(\n dreamingRoot: string,\n): Promise<\n | { exists: false }\n | {\n exists: true;\n path: string;\n raw: unknown;\n record: DreamingDeepLastRun | null;\n parseError: string | null;\n }\n> {\n const fullPath = path.join(dreamingRoot, DREAMING_LAST_RUN_RELATIVE);\n try {\n const text = await fs.readFile(fullPath, 'utf-8');\n let raw: unknown;\n try {\n raw = JSON.parse(text) as unknown;\n } catch (parseErr) {\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw: null,\n record: null,\n parseError: parseErr instanceof Error ? parseErr.message : String(parseErr),\n };\n }\n const record = parseDreamingLastRunFile(raw);\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw,\n record,\n parseError: record ? null : 'Invalid or unsupported last-run.json (expected v2 deep record).',\n };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { exists: false };\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw: null,\n record: null,\n parseError: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nasync function readPhaseLastRun(\n dreamingRoot: string,\n filename: string,\n): Promise<{ exists: false } | { exists: true; path: string; raw: unknown }> {\n const relPath = path.join(DREAMING_DIR_RELATIVE, filename);\n const fullPath = path.join(dreamingRoot, relPath);\n try {\n const text = await fs.readFile(fullPath, 'utf-8');\n const raw = JSON.parse(text) as unknown;\n return { exists: true, path: relPath, raw };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { exists: false };\n return { exists: false };\n }\n}\n\nfunction storeStats(store: DreamingStore): {\n version: number;\n updatedAt: string;\n entryCount: number;\n promotedCount: number;\n lastPromotedAt: string | null;\n} {\n const entries = Object.values(store.entries ?? {});\n const promoted = entries.filter((e) => typeof e.promotedAt === 'string' && e.promotedAt.trim());\n const lastPromotedAt = promoted\n .map((e) => e.promotedAt!)\n .sort((a, b) => (a < b ? 1 : a > b ? -1 : 0))[0];\n return {\n version: store.version,\n updatedAt: store.updatedAt,\n entryCount: entries.length,\n promotedCount: promoted.length,\n lastPromotedAt: lastPromotedAt ?? null,\n };\n}\n\nexport function registerDreamingRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service } = deps;\n\n authenticated.get('/api/dreaming', async (c) => {\n const cfg = service.currentConfig as Config;\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg, c.req.query('agentId'));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n const { store } = await loadDreamingStore({ dreamingRoot: scope.memoriesDir });\n const lock = await readLockInfo(scope.memoriesDir);\n\n // Read all three phase last-run files in parallel.\n const [lastRun, lightLastRun, remLastRun] = await Promise.all([\n readLastRun(scope.memoriesDir),\n readPhaseLastRun(scope.memoriesDir, 'last-run-light.json'),\n readPhaseLastRun(scope.memoriesDir, 'last-run-rem.json'),\n ]);\n\n return c.json({\n ok: true,\n payload: {\n agentId: scope.agentId,\n memory: scope.memory,\n workspaceDir: scope.workspaceDir,\n memoriesDir: scope.memoriesDir,\n config: scope.config,\n storePath: path.join(scope.memoriesDir, SHORT_TERM_RECALL_STORE_RELATIVE),\n store: storeStats(store),\n lock,\n lastRun,\n lightLastRun,\n remLastRun,\n },\n });\n });\n\n authenticated.get('/api/dreaming/preview', async (c) => {\n const cfg = service.currentConfig as Config;\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg, c.req.query('agentId'));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n\n const rawLimit = c.req.query('limit');\n const limit = rawLimit ? Number(rawLimit) : 20;\n\n const preview = await previewDreamingDeepPromotion({\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: scope.config.deep,\n limit: Number.isFinite(limit) ? limit : 20,\n });\n\n return c.json({ ok: true, payload: preview });\n });\n\n authenticated.post('/api/dreaming/run', async (c) => {\n let body: unknown;\n try { body = await c.req.json(); } catch { body = {}; }\n const requestedPhase: DreamingPhaseId =\n isRecord(body) && typeof body.phase === 'string' && ['light', 'deep', 'rem'].includes(body.phase)\n ? (body.phase as DreamingPhaseId)\n : 'deep';\n\n const cfg = service.currentConfig as Config;\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg, requestedAgentIdFrom(c, body));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n const dreaming = scope.config;\n if (!dreaming.enabled || !dreaming.phases[requestedPhase].enabled) {\n return c.json({\n ok: false,\n error: { message: `Dreaming ${requestedPhase} phase is disabled in config. Enable it first.` },\n }, 400);\n }\n\n try {\n service.emit('dreaming.phase.start', {\n agentId: scope.agentId,\n phase: requestedPhase,\n timestamp: new Date().toISOString(),\n });\n\n const result =\n requestedPhase === 'light'\n ? await runLightSweep({\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: dreaming.phases.light,\n })\n : requestedPhase === 'rem'\n ? await runRemPatterns({\n agentId: scope.agentId,\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: dreaming.phases.rem,\n sensitiveWritePolicy: scope.memory.privacy?.sensitiveWritePolicy,\n promotionWritePolicy: dreaming.promotionWritePolicy.decision,\n })\n : await runDreamingDeepPromotion({\n agentId: scope.agentId,\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: dreaming.phases.deep,\n sensitiveWritePolicy: scope.memory.privacy?.sensitiveWritePolicy,\n });\n\n service.emit('dreaming.phase.end', {\n agentId: scope.agentId,\n phase: requestedPhase,\n ok: true,\n timestamp: new Date().toISOString(),\n });\n\n return c.json({ ok: true, payload: { agentId: scope.agentId, phase: requestedPhase, result } });\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n service.emit('dreaming.phase.end', {\n agentId: scope.agentId,\n phase: requestedPhase,\n ok: false,\n error: em,\n timestamp: new Date().toISOString(),\n });\n return c.json({ ok: false, error: { message: em || 'Failed to trigger job' } }, 400);\n }\n });\n\n authenticated.post('/api/dreaming/action', async (c) => {\n const cfg = service.currentConfig as Config;\n\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const action = isRecord(body) && typeof body.action === 'string' ? body.action.trim() : '';\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg, requestedAgentIdFrom(c, body));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n\n if (action !== 'reset_store' && action !== 'clear_lock') {\n return c.json({ ok: false, error: { message: 'Invalid action' } }, 400);\n }\n\n if (action === 'reset_store') {\n await resetDreamingStore({ dreamingRoot: scope.memoriesDir });\n return c.json({\n ok: true,\n payload: { agentId: scope.agentId, reset: true, storePath: path.join(scope.memoriesDir, SHORT_TERM_RECALL_STORE_RELATIVE) },\n });\n }\n\n const lockPath = path.join(scope.memoriesDir, SHORT_TERM_PROMOTION_LOCK_RELATIVE);\n try {\n const cleared = await clearStaleDreamingLock(scope.memoriesDir);\n return c.json({\n ok: true,\n payload: { agentId: scope.agentId, cleared, lockPath },\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 409);\n }\n });\n\n authenticated.get('/api/dreaming/events', async (c) => {\n const cfg = service.currentConfig as Config;\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg, c.req.query('agentId'));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n\n const rawLimit = c.req.query('limit');\n const limit = rawLimit ? Math.min(Math.max(Number(rawLimit) || 50, 1), 200) : 50;\n\n const events = await readDreamingEvents(scope.memoriesDir, limit);\n return c.json({ ok: true, payload: { agentId: scope.agentId, events } });\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dreaming.js","names":[],"sources":["../../../../../src/gateway/hono/routes/dreaming.ts"],"sourcesContent":["import type { Hono } from 'hono';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { type Config } from '../../../config/schema.js';\nimport {\n DREAMING_DIR_RELATIVE,\n DREAMING_LAST_RUN_RELATIVE,\n SHORT_TERM_PROMOTION_LOCK_RELATIVE,\n SHORT_TERM_RECALL_STORE_RELATIVE,\n type DreamingPhaseId,\n} from '../../../agent/memory/dreaming/constants.js';\nimport { readDreamingEvents } from '../../../agent/memory/dreaming/events.js';\nimport { previewDreamingDeepPromotion } from '../../../agent/memory/dreaming/preview.js';\nimport { runLightSweep } from '../../../agent/memory/dreaming/light-sweep.js';\nimport { runDreamingDeepPromotion } from '../../../agent/memory/dreaming/deep-promotion.js';\nimport { runRemPatterns } from '../../../agent/memory/dreaming/rem-patterns.js';\nimport { parseDreamingLastRunFile, type DreamingDeepLastRun } from '../../../agent/memory/dreaming/last-run.js';\nimport { resolveDreamingAgentScope, type DreamingAgentScope } from '../../../agent/memory/dreaming/scope.js';\nimport {\n clearStaleDreamingLock,\n loadDreamingStore,\n resetDreamingStore,\n type DreamingStore,\n} from '../../../agent/memory/dreaming/short-term-store.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nfunction resolveRouteScope(cfg: Config): DreamingAgentScope {\n return resolveDreamingAgentScope(cfg);\n}\n\nasync function readLockInfo(dreamingRoot: string): Promise<\n | { locked: false }\n | { locked: true; path: string; content: string; mtimeMs?: number }\n> {\n const lockPath = path.join(dreamingRoot, SHORT_TERM_PROMOTION_LOCK_RELATIVE);\n try {\n const [content, st] = await Promise.all([fs.readFile(lockPath, 'utf-8'), fs.stat(lockPath)]);\n return {\n locked: true,\n path: SHORT_TERM_PROMOTION_LOCK_RELATIVE,\n content: content.trim(),\n mtimeMs: st.mtimeMs,\n };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { locked: false };\n return { locked: true, path: SHORT_TERM_PROMOTION_LOCK_RELATIVE, content: 'unknown', mtimeMs: undefined };\n }\n}\n\nasync function readLastRun(\n dreamingRoot: string,\n): Promise<\n | { exists: false }\n | {\n exists: true;\n path: string;\n raw: unknown;\n record: DreamingDeepLastRun | null;\n parseError: string | null;\n }\n> {\n const fullPath = path.join(dreamingRoot, DREAMING_LAST_RUN_RELATIVE);\n try {\n const text = await fs.readFile(fullPath, 'utf-8');\n let raw: unknown;\n try {\n raw = JSON.parse(text) as unknown;\n } catch (parseErr) {\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw: null,\n record: null,\n parseError: parseErr instanceof Error ? parseErr.message : String(parseErr),\n };\n }\n const record = parseDreamingLastRunFile(raw);\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw,\n record,\n parseError: record ? null : 'Invalid or unsupported last-run.json (expected v2 deep record).',\n };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { exists: false };\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw: null,\n record: null,\n parseError: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nasync function readPhaseLastRun(\n dreamingRoot: string,\n filename: string,\n): Promise<{ exists: false } | { exists: true; path: string; raw: unknown }> {\n const relPath = path.join(DREAMING_DIR_RELATIVE, filename);\n const fullPath = path.join(dreamingRoot, relPath);\n try {\n const text = await fs.readFile(fullPath, 'utf-8');\n const raw = JSON.parse(text) as unknown;\n return { exists: true, path: relPath, raw };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { exists: false };\n return { exists: false };\n }\n}\n\nfunction storeStats(store: DreamingStore): {\n version: number;\n updatedAt: string;\n entryCount: number;\n promotedCount: number;\n lastPromotedAt: string | null;\n} {\n const entries = Object.values(store.entries ?? {});\n const promoted = entries.filter((e) => typeof e.promotedAt === 'string' && e.promotedAt.trim());\n const lastPromotedAt = promoted\n .map((e) => e.promotedAt!)\n .sort((a, b) => (a < b ? 1 : a > b ? -1 : 0))[0];\n return {\n version: store.version,\n updatedAt: store.updatedAt,\n entryCount: entries.length,\n promotedCount: promoted.length,\n lastPromotedAt: lastPromotedAt ?? null,\n };\n}\n\nexport function registerDreamingRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service } = deps;\n\n authenticated.get('/api/dreaming', async (c) => {\n const cfg = service.currentConfig as Config;\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n const { store } = await loadDreamingStore({ dreamingRoot: scope.memoriesDir });\n const lock = await readLockInfo(scope.memoriesDir);\n\n // Read all three phase last-run files in parallel.\n const [lastRun, lightLastRun, remLastRun] = await Promise.all([\n readLastRun(scope.memoriesDir),\n readPhaseLastRun(scope.memoriesDir, 'last-run-light.json'),\n readPhaseLastRun(scope.memoriesDir, 'last-run-rem.json'),\n ]);\n\n return c.json({\n ok: true,\n payload: {\n agentId: scope.agentId,\n memory: scope.memory,\n workspaceDir: scope.workspaceDir,\n memoriesDir: scope.memoriesDir,\n config: scope.config,\n storePath: path.join(scope.memoriesDir, SHORT_TERM_RECALL_STORE_RELATIVE),\n store: storeStats(store),\n lock,\n lastRun,\n lightLastRun,\n remLastRun,\n },\n });\n });\n\n authenticated.get('/api/dreaming/preview', async (c) => {\n const cfg = service.currentConfig as Config;\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n\n const rawLimit = c.req.query('limit');\n const limit = rawLimit ? Number(rawLimit) : 20;\n\n const preview = await previewDreamingDeepPromotion({\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: scope.config.deep,\n limit: Number.isFinite(limit) ? limit : 20,\n });\n\n return c.json({ ok: true, payload: preview });\n });\n\n authenticated.post('/api/dreaming/run', async (c) => {\n let body: unknown;\n try { body = await c.req.json(); } catch { body = {}; }\n const requestedPhase: DreamingPhaseId =\n isRecord(body) && typeof body.phase === 'string' && ['light', 'deep', 'rem'].includes(body.phase)\n ? (body.phase as DreamingPhaseId)\n : 'deep';\n\n const cfg = service.currentConfig as Config;\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n const dreaming = scope.config;\n if (!dreaming.enabled || !dreaming.phases[requestedPhase].enabled) {\n return c.json({\n ok: false,\n error: { message: `Dreaming ${requestedPhase} phase is disabled in config. Enable it first.` },\n }, 400);\n }\n\n try {\n service.emit('dreaming.phase.start', {\n agentId: scope.agentId,\n phase: requestedPhase,\n timestamp: new Date().toISOString(),\n });\n\n const result =\n requestedPhase === 'light'\n ? await runLightSweep({\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: dreaming.phases.light,\n })\n : requestedPhase === 'rem'\n ? await runRemPatterns({\n agentId: scope.agentId,\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: dreaming.phases.rem,\n sensitiveWritePolicy: cfg.userContext.privacy.sensitiveWritePolicy,\n promotionWritePolicy: dreaming.promotionWritePolicy.decision,\n })\n : await runDreamingDeepPromotion({\n agentId: scope.agentId,\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: dreaming.phases.deep,\n sensitiveWritePolicy: cfg.userContext.privacy.sensitiveWritePolicy,\n });\n\n service.emit('dreaming.phase.end', {\n agentId: scope.agentId,\n phase: requestedPhase,\n ok: true,\n timestamp: new Date().toISOString(),\n });\n\n return c.json({ ok: true, payload: { agentId: scope.agentId, phase: requestedPhase, result } });\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n service.emit('dreaming.phase.end', {\n agentId: scope.agentId,\n phase: requestedPhase,\n ok: false,\n error: em,\n timestamp: new Date().toISOString(),\n });\n return c.json({ ok: false, error: { message: em || 'Failed to trigger job' } }, 400);\n }\n });\n\n authenticated.post('/api/dreaming/action', async (c) => {\n const cfg = service.currentConfig as Config;\n\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const action = isRecord(body) && typeof body.action === 'string' ? body.action.trim() : '';\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n\n if (action !== 'reset_store' && action !== 'clear_lock') {\n return c.json({ ok: false, error: { message: 'Invalid action' } }, 400);\n }\n\n if (action === 'reset_store') {\n await resetDreamingStore({ dreamingRoot: scope.memoriesDir });\n return c.json({\n ok: true,\n payload: { agentId: scope.agentId, reset: true, storePath: path.join(scope.memoriesDir, SHORT_TERM_RECALL_STORE_RELATIVE) },\n });\n }\n\n const lockPath = path.join(scope.memoriesDir, SHORT_TERM_PROMOTION_LOCK_RELATIVE);\n try {\n const cleared = await clearStaleDreamingLock(scope.memoriesDir);\n return c.json({\n ok: true,\n payload: { agentId: scope.agentId, cleared, lockPath },\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 409);\n }\n });\n\n authenticated.get('/api/dreaming/events', async (c) => {\n const cfg = service.currentConfig as Config;\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n\n const rawLimit = c.req.query('limit');\n const limit = rawLimit ? Math.min(Math.max(Number(rawLimit) || 50, 1), 200) : 50;\n\n const events = await readDreamingEvents(scope.memoriesDir, limit);\n return c.json({ ok: true, payload: { agentId: scope.agentId, events } });\n });\n}\n"],"mappings":"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"}
|
|
@@ -6,6 +6,8 @@ import { registerMemoryRoutes } from "./memory.js";
|
|
|
6
6
|
import { registerProjectsRoutes } from "./projects.js";
|
|
7
7
|
import { registerSearchRoutes } from "./search.js";
|
|
8
8
|
import { registerMobileRoutes } from "./mobile.js";
|
|
9
|
+
import { registerLocalAppsRoutes } from "./local-apps.js";
|
|
10
|
+
import { registerWorkDiscoveryRoutes } from "./work-discovery.js";
|
|
9
11
|
import { mountAppLazyRoutePrefixes, registerAuthenticatedLazyRouteFallback } from "./lazy-fallback.js";
|
|
10
12
|
//#region src/gateway/hono/routes/index.ts
|
|
11
13
|
function registerCoreAuthenticatedRoutes(authenticated, deps) {
|
|
@@ -15,6 +17,8 @@ function registerCoreAuthenticatedRoutes(authenticated, deps) {
|
|
|
15
17
|
registerMemoryRoutes(authenticated, deps);
|
|
16
18
|
registerActivityRoutes(authenticated, deps);
|
|
17
19
|
registerProjectsRoutes(authenticated, deps);
|
|
20
|
+
registerLocalAppsRoutes(authenticated, deps);
|
|
21
|
+
registerWorkDiscoveryRoutes(authenticated, deps);
|
|
18
22
|
registerSearchRoutes(authenticated, deps);
|
|
19
23
|
registerMobileRoutes(authenticated, deps);
|
|
20
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../../src/gateway/hono/routes/index.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { registerActivityRoutes } from './activity.js';\nimport { registerAgentStreamRoutes } from './agent-stream.js';\nimport { registerSessionsRoutes } from './sessions.js';\nimport { registerStatusRoutes } from './status.js';\nimport { registerMemoryRoutes } from './memory.js';\nimport { registerProjectsRoutes } from './projects.js';\nimport { registerSearchRoutes } from './search.js';\nimport { registerMobileRoutes } from './mobile.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport {\n mountAppLazyRoutePrefixes,\n registerAuthenticatedLazyRouteFallback,\n} from './lazy-fallback.js';\n\nexport function registerCoreAuthenticatedRoutes(\n authenticated: Hono,\n deps: AuthenticatedRouteDeps,\n): void {\n registerStatusRoutes(authenticated, deps);\n registerAgentStreamRoutes(authenticated, deps);\n registerSessionsRoutes(authenticated, deps);\n registerMemoryRoutes(authenticated, deps);\n registerActivityRoutes(authenticated, deps);\n registerProjectsRoutes(authenticated, deps);\n registerSearchRoutes(authenticated, deps);\n registerMobileRoutes(authenticated, deps);\n}\n\nexport function registerAuthenticatedRoutes(app: Hono, authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n registerCoreAuthenticatedRoutes(authenticated, deps);\n registerAuthenticatedLazyRouteFallback(authenticated, deps);\n mountAppLazyRoutePrefixes(app, { service: deps.service, deps });\n}\n\nexport type { AuthenticatedRouteDeps } from './deps.js';\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../../src/gateway/hono/routes/index.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { registerActivityRoutes } from './activity.js';\nimport { registerAgentStreamRoutes } from './agent-stream.js';\nimport { registerSessionsRoutes } from './sessions.js';\nimport { registerStatusRoutes } from './status.js';\nimport { registerMemoryRoutes } from './memory.js';\nimport { registerProjectsRoutes } from './projects.js';\nimport { registerSearchRoutes } from './search.js';\nimport { registerMobileRoutes } from './mobile.js';\nimport { registerLocalAppsRoutes } from './local-apps.js';\nimport { registerWorkDiscoveryRoutes } from './work-discovery.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport {\n mountAppLazyRoutePrefixes,\n registerAuthenticatedLazyRouteFallback,\n} from './lazy-fallback.js';\n\nexport function registerCoreAuthenticatedRoutes(\n authenticated: Hono,\n deps: AuthenticatedRouteDeps,\n): void {\n registerStatusRoutes(authenticated, deps);\n registerAgentStreamRoutes(authenticated, deps);\n registerSessionsRoutes(authenticated, deps);\n registerMemoryRoutes(authenticated, deps);\n registerActivityRoutes(authenticated, deps);\n registerProjectsRoutes(authenticated, deps);\n registerLocalAppsRoutes(authenticated, deps);\n registerWorkDiscoveryRoutes(authenticated, deps);\n registerSearchRoutes(authenticated, deps);\n registerMobileRoutes(authenticated, deps);\n}\n\nexport function registerAuthenticatedRoutes(app: Hono, authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n registerCoreAuthenticatedRoutes(authenticated, deps);\n registerAuthenticatedLazyRouteFallback(authenticated, deps);\n mountAppLazyRoutePrefixes(app, { service: deps.service, deps });\n}\n\nexport type { AuthenticatedRouteDeps } from './deps.js';\n"],"mappings":";;;;;;;;;;;;AAkBA,SAAgB,gCACd,eACA,MACM;AACN,sBAAqB,eAAe,KAAK;AACzC,2BAA0B,eAAe,KAAK;AAC9C,wBAAuB,eAAe,KAAK;AAC3C,sBAAqB,eAAe,KAAK;AACzC,wBAAuB,eAAe,KAAK;AAC3C,wBAAuB,eAAe,KAAK;AAC3C,yBAAwB,eAAe,KAAK;AAC5C,6BAA4B,eAAe,KAAK;AAChD,sBAAqB,eAAe,KAAK;AACzC,sBAAqB,eAAe,KAAK;;AAG3C,SAAgB,4BAA4B,KAAW,eAAqB,MAAoC;AAC9G,iCAAgC,eAAe,KAAK;AACpD,wCAAuC,eAAe,KAAK;AAC3D,2BAA0B,KAAK;EAAE,SAAS,KAAK;EAAS;EAAM,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Hono } from 'hono';
|
|
2
|
+
import type { AuthenticatedRouteDeps } from './deps.js';
|
|
3
|
+
import type { GatewayService } from '../../service.js';
|
|
4
|
+
export declare function registerPublicLocalAppPreviewRoutes(app: Hono, service: GatewayService): void;
|
|
5
|
+
export declare function registerLocalAppsRoutes(app: Hono, deps: AuthenticatedRouteDeps): void;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { readLocalAppAcceptanceConfig } from "../../../local-apps/acceptance.js";
|
|
2
|
+
import { extensionAssetMimeType } from "../lib/extension-assets.js";
|
|
3
|
+
import { LOCAL_APP_RUNTIME_BRIDGE_HASH, injectLocalAppRuntimeBridge } from "../../../local-apps/preview-runtime-bridge.js";
|
|
4
|
+
import { relative, resolve } from "node:path";
|
|
5
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
6
|
+
//#region src/gateway/hono/routes/local-apps.ts
|
|
7
|
+
const LOCAL_APP_PREVIEW_CSP = `default-src 'self'; script-src 'self' 'sha256-${LOCAL_APP_RUNTIME_BRIDGE_HASH}'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; connect-src 'none'; frame-ancestors 'self'; frame-src 'none'; base-uri 'none'; object-src 'none'; form-action 'none'`;
|
|
8
|
+
function registerPublicLocalAppPreviewRoutes(app, service) {
|
|
9
|
+
app.get("/api/local-apps/preview/:token/*", (c) => {
|
|
10
|
+
const origin = c.req.header("origin");
|
|
11
|
+
const cors = { "Access-Control-Allow-Origin": origin === "null" ? "null" : origin || "*" };
|
|
12
|
+
const preview = service.localApps.resolvePreview(c.req.param("token"));
|
|
13
|
+
if (!preview) return c.json({ error: "Preview not found" }, 404, cors);
|
|
14
|
+
const prefix = `/api/local-apps/preview/${preview.previewToken}/`;
|
|
15
|
+
let assetPath = c.req.path.startsWith(prefix) ? c.req.path.slice(prefix.length) : "";
|
|
16
|
+
try {
|
|
17
|
+
assetPath = decodeURIComponent(assetPath);
|
|
18
|
+
} catch {
|
|
19
|
+
return c.json({ error: "Invalid asset path" }, 400, cors);
|
|
20
|
+
}
|
|
21
|
+
if (!assetPath || assetPath.includes("..")) return c.json({ error: "Invalid asset path" }, 400, cors);
|
|
22
|
+
const root = resolve(preview.uiRoot);
|
|
23
|
+
const fullPath = resolve(root, assetPath);
|
|
24
|
+
const rel = relative(root, fullPath);
|
|
25
|
+
if (rel.startsWith("..") || rel === "") return c.json({ error: "Path traversal denied" }, 403, cors);
|
|
26
|
+
if (!existsSync(fullPath) || !statSync(fullPath).isFile()) return c.json({ error: "Not found" }, 404, cors);
|
|
27
|
+
const mimeType = extensionAssetMimeType(assetPath);
|
|
28
|
+
const content = readFileSync(fullPath);
|
|
29
|
+
let textContent = null;
|
|
30
|
+
if (mimeType.startsWith("text/html")) {
|
|
31
|
+
let acceptance;
|
|
32
|
+
try {
|
|
33
|
+
acceptance = readLocalAppAcceptanceConfig(preview.uiRoot);
|
|
34
|
+
} catch {
|
|
35
|
+
acceptance = {
|
|
36
|
+
schemaVersion: 1,
|
|
37
|
+
scenarios: []
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
textContent = injectLocalAppRuntimeBridge(content.toString("utf8"), acceptance);
|
|
41
|
+
} else if (mimeType.startsWith("text/")) textContent = content.toString("utf8");
|
|
42
|
+
return new Response(textContent ?? new Uint8Array(content), { headers: {
|
|
43
|
+
"Content-Type": mimeType,
|
|
44
|
+
"Content-Security-Policy": LOCAL_APP_PREVIEW_CSP,
|
|
45
|
+
"Cache-Control": "no-store",
|
|
46
|
+
"X-Content-Type-Options": "nosniff",
|
|
47
|
+
...cors
|
|
48
|
+
} });
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function registerLocalAppsRoutes(app, deps) {
|
|
52
|
+
app.get("/api/local-apps", (c) => c.json({ apps: deps.service.localApps.list() }));
|
|
53
|
+
app.post("/api/local-apps", async (c) => {
|
|
54
|
+
const body = await c.req.json();
|
|
55
|
+
if (typeof body.name !== "string" || typeof body.idea !== "string") return c.json({ error: "name and idea are required" }, 400);
|
|
56
|
+
const appDetail = deps.service.localApps.create({
|
|
57
|
+
name: body.name,
|
|
58
|
+
idea: body.idea,
|
|
59
|
+
description: typeof body.description === "string" ? body.description : void 0
|
|
60
|
+
});
|
|
61
|
+
return c.json({ app: appDetail }, 201);
|
|
62
|
+
});
|
|
63
|
+
app.get("/api/local-apps/:id", (c) => {
|
|
64
|
+
const appDetail = deps.service.localApps.get(c.req.param("id"));
|
|
65
|
+
return appDetail ? c.json({ app: appDetail }) : c.json({ error: "Local app not found" }, 404);
|
|
66
|
+
});
|
|
67
|
+
app.post("/api/local-apps/:id/validate", (c) => {
|
|
68
|
+
return c.json({ validation: deps.service.localApps.validate(c.req.param("id")) });
|
|
69
|
+
});
|
|
70
|
+
app.post("/api/local-apps/:id/acceptance-runs", async (c) => {
|
|
71
|
+
const body = await c.req.json();
|
|
72
|
+
const acceptance = deps.service.localApps.recordAcceptance(c.req.param("id"), body);
|
|
73
|
+
return c.json({ acceptance }, 201);
|
|
74
|
+
});
|
|
75
|
+
app.post("/api/local-apps/:id/install", async (c) => {
|
|
76
|
+
const appDetail = await deps.service.localApps.install(c.req.param("id"));
|
|
77
|
+
return c.json({ app: appDetail });
|
|
78
|
+
});
|
|
79
|
+
app.post("/api/local-apps/:id/releases/:releaseId/rollback", async (c) => {
|
|
80
|
+
const appDetail = await deps.service.localApps.rollback(c.req.param("id"), c.req.param("releaseId"));
|
|
81
|
+
return c.json({ app: appDetail });
|
|
82
|
+
});
|
|
83
|
+
app.post("/api/local-apps/:id/enable", async (c) => {
|
|
84
|
+
const appDetail = await deps.service.localApps.setEnabled(c.req.param("id"), true);
|
|
85
|
+
return c.json({ app: appDetail });
|
|
86
|
+
});
|
|
87
|
+
app.post("/api/local-apps/:id/disable", async (c) => {
|
|
88
|
+
const appDetail = await deps.service.localApps.setEnabled(c.req.param("id"), false);
|
|
89
|
+
return c.json({ app: appDetail });
|
|
90
|
+
});
|
|
91
|
+
app.delete("/api/local-apps/:id/install", async (c) => {
|
|
92
|
+
const appDetail = await deps.service.localApps.uninstall(c.req.param("id"));
|
|
93
|
+
return c.json({ app: appDetail });
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
//#endregion
|
|
97
|
+
export { registerLocalAppsRoutes, registerPublicLocalAppPreviewRoutes };
|
|
98
|
+
|
|
99
|
+
//# sourceMappingURL=local-apps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-apps.js","names":[],"sources":["../../../../../src/gateway/hono/routes/local-apps.ts"],"sourcesContent":["import { existsSync, readFileSync, statSync } from 'node:fs';\nimport { relative, resolve } from 'node:path';\n\nimport type { Hono } from 'hono';\n\nimport { extensionAssetMimeType } from '../lib/extension-assets.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport type { GatewayService } from '../../service.js';\nimport {\n injectLocalAppRuntimeBridge,\n LOCAL_APP_RUNTIME_BRIDGE_HASH,\n} from '../../../local-apps/preview-runtime-bridge.js';\nimport { readLocalAppAcceptanceConfig } from '../../../local-apps/acceptance.js';\nimport type { RecordLocalAppAcceptanceInput } from '../../../local-apps/types.js';\n\nconst LOCAL_APP_PREVIEW_CSP =\n \"default-src 'self'; \" +\n `script-src 'self' 'sha256-${LOCAL_APP_RUNTIME_BRIDGE_HASH}'; ` +\n \"style-src 'self' 'unsafe-inline'; \" +\n \"img-src 'self' data: blob:; \" +\n \"connect-src 'none'; \" +\n \"frame-ancestors 'self'; \" +\n \"frame-src 'none'; \" +\n \"base-uri 'none'; \" +\n \"object-src 'none'; \" +\n \"form-action 'none'\";\n\nexport function registerPublicLocalAppPreviewRoutes(app: Hono, service: GatewayService): void {\n app.get('/api/local-apps/preview/:token/*', (c) => {\n const origin = c.req.header('origin');\n const cors = { 'Access-Control-Allow-Origin': origin === 'null' ? 'null' : origin || '*' } as const;\n const preview = service.localApps.resolvePreview(c.req.param('token'));\n if (!preview) return c.json({ error: 'Preview not found' }, 404, cors);\n const prefix = `/api/local-apps/preview/${preview.previewToken}/`;\n let assetPath = c.req.path.startsWith(prefix) ? c.req.path.slice(prefix.length) : '';\n try {\n assetPath = decodeURIComponent(assetPath);\n } catch {\n return c.json({ error: 'Invalid asset path' }, 400, cors);\n }\n if (!assetPath || assetPath.includes('..')) return c.json({ error: 'Invalid asset path' }, 400, cors);\n const root = resolve(preview.uiRoot);\n const fullPath = resolve(root, assetPath);\n const rel = relative(root, fullPath);\n if (rel.startsWith('..') || rel === '') return c.json({ error: 'Path traversal denied' }, 403, cors);\n if (!existsSync(fullPath) || !statSync(fullPath).isFile()) return c.json({ error: 'Not found' }, 404, cors);\n const mimeType = extensionAssetMimeType(assetPath);\n const content = readFileSync(fullPath);\n let textContent: string | null = null;\n if (mimeType.startsWith('text/html')) {\n let acceptance;\n try {\n acceptance = readLocalAppAcceptanceConfig(preview.uiRoot);\n } catch {\n acceptance = { schemaVersion: 1 as const, scenarios: [] };\n }\n textContent = injectLocalAppRuntimeBridge(content.toString('utf8'), acceptance);\n } else if (mimeType.startsWith('text/')) {\n textContent = content.toString('utf8');\n }\n return new Response(textContent ?? new Uint8Array(content), {\n headers: {\n 'Content-Type': mimeType,\n 'Content-Security-Policy': LOCAL_APP_PREVIEW_CSP,\n 'Cache-Control': 'no-store',\n 'X-Content-Type-Options': 'nosniff',\n ...cors,\n },\n });\n });\n}\n\nexport function registerLocalAppsRoutes(app: Hono, deps: AuthenticatedRouteDeps): void {\n app.get('/api/local-apps', (c) => c.json({ apps: deps.service.localApps.list() }));\n\n app.post('/api/local-apps', async (c) => {\n const body = await c.req.json<Record<string, unknown>>();\n if (typeof body.name !== 'string' || typeof body.idea !== 'string') {\n return c.json({ error: 'name and idea are required' }, 400);\n }\n const appDetail = deps.service.localApps.create({\n name: body.name,\n idea: body.idea,\n description: typeof body.description === 'string' ? body.description : undefined,\n });\n return c.json({ app: appDetail }, 201);\n });\n\n app.get('/api/local-apps/:id', (c) => {\n const appDetail = deps.service.localApps.get(c.req.param('id'));\n return appDetail ? c.json({ app: appDetail }) : c.json({ error: 'Local app not found' }, 404);\n });\n\n app.post('/api/local-apps/:id/validate', (c) => {\n return c.json({ validation: deps.service.localApps.validate(c.req.param('id')) });\n });\n\n app.post('/api/local-apps/:id/acceptance-runs', async (c) => {\n const body = await c.req.json<Record<string, unknown>>();\n const acceptance = deps.service.localApps.recordAcceptance(\n c.req.param('id'),\n body as unknown as RecordLocalAppAcceptanceInput,\n );\n return c.json({ acceptance }, 201);\n });\n\n app.post('/api/local-apps/:id/install', async (c) => {\n const appDetail = await deps.service.localApps.install(c.req.param('id'));\n return c.json({ app: appDetail });\n });\n\n app.post('/api/local-apps/:id/releases/:releaseId/rollback', async (c) => {\n const appDetail = await deps.service.localApps.rollback(\n c.req.param('id'),\n c.req.param('releaseId'),\n );\n return c.json({ app: appDetail });\n });\n\n app.post('/api/local-apps/:id/enable', async (c) => {\n const appDetail = await deps.service.localApps.setEnabled(c.req.param('id'), true);\n return c.json({ app: appDetail });\n });\n\n app.post('/api/local-apps/:id/disable', async (c) => {\n const appDetail = await deps.service.localApps.setEnabled(c.req.param('id'), false);\n return c.json({ app: appDetail });\n });\n\n app.delete('/api/local-apps/:id/install', async (c) => {\n const appDetail = await deps.service.localApps.uninstall(c.req.param('id'));\n return c.json({ app: appDetail });\n });\n}\n"],"mappings":"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"}
|