@xopcai/xopc 0.0.116 → 0.0.118
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 +44 -28
- package/README.zh-CN.md +63 -45
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/demo-memory/src/index.d.ts +6 -0
- package/dist/extensions/demo-memory/src/index.js +132 -0
- package/dist/extensions/demo-memory/src/index.js.map +1 -0
- package/dist/extensions/demo-memory/xopc.extension.json +15 -0
- package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
- package/dist/extensions/feishu/src/schema/config-schema.d.ts +3 -3
- package/dist/extensions/feishu/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
- package/dist/extensions/telegram/src/command-handler.js +1 -2
- package/dist/extensions/telegram/src/command-handler.js.map +1 -1
- package/dist/extensions/telegram/src/config-schema.d.ts +8 -8
- package/dist/extensions/telegram/src/inbound-processor.js +1 -1
- package/dist/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/src/update-offset-store.js +1 -1
- package/dist/extensions/telegram/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +2 -2
- package/dist/extensions/weixin/src/auth/accounts.js +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
- package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CWM1UU5P.js → agent-avatar-dicebear-dzUrQoeZ.js} +1 -1
- package/dist/gateway/static/root/assets/agents-BCxZbkOw.js +2 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-yXSXY_bu.js → app-management-settings-panel-bxYJVJpx.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-DjY1P_ug.js → appearance-settings-BCIykXlI.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page--wMEL00f.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-CytE5j-e.js → archive-plugin-Cki4SfU2.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-BvvrN6rF.js → attachment-load-D-KnS2Do.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-IBWSitnj.js → binary-plugins-D2sgvJja.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-C-wDpsf-.js → block-editor-DIq-4Gvb.js} +27 -27
- package/dist/gateway/static/root/assets/browser-settings-page-DRhKdn81.js +8 -0
- package/dist/gateway/static/root/assets/capability-presets-api-CorhiHlg.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-qFx9Jtce.js +1 -0
- package/dist/gateway/static/root/assets/channels-settings-BAwAkqIA.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-BQLcfitM.js +2 -0
- package/dist/gateway/static/root/assets/cron-api-qGwmL-24.js +1 -0
- package/dist/gateway/static/root/assets/cron-page-BBWMAj8-.js +3 -0
- package/dist/gateway/static/root/assets/dreaming-settings-Dw89Obml.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-BAIyjDlq.js → extension-debug-page-DYu1KaFQ.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-DEhv2GpC.js → extension-page-B3W6QwlZ.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DOuAxTDW.js → extension-settings-page-D7VQ-cxE.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-CTsREQIe.js → fetch-B7xDPu-R.js} +1 -1
- package/dist/gateway/static/root/assets/{format-interval-label-D35Bfhtx.js → format-interval-label-BzxafKxR.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-config-api-BTBLSeUu.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-Cmwy58rS.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-C1KAHrd2.js → gateway-startup-retry-CYj9FWCp.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-l7mu5GWX.js +1 -0
- package/dist/gateway/static/root/assets/{goals-config-api-KnLGpu6h.js → goals-config-api-CQQgzPr3.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-BHitvJAv.js +2 -0
- package/dist/gateway/static/root/assets/{goals-settings-DtPtqZi8.js → goals-settings-CYVY4NGp.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-uKw1f0IG.js → heartbeat-config-api-DriO_CN9.js} +1 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-CUQTKxg7.js +1 -0
- package/dist/gateway/static/root/assets/index-C17Tsd_b.css +1 -0
- package/dist/gateway/static/root/assets/index-Cc41r16l.js +191 -0
- package/dist/gateway/static/root/assets/{interval-presets-Dq0FXJ65.js → interval-presets-DFPCKW_W.js} +1 -1
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-C9_t4m7t.js → keyboard-shortcuts-settings-CcVcqstx.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-SNkWzidV.js → logs-page-C2Uqvae9.js} +2 -2
- package/dist/gateway/static/root/assets/{markdown-split-Ca87W8-h.js → markdown-split-BwOFrJ2E.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-BAcUjPRJ.js → media-plugins-Cnz6Q5G6.js} +1 -1
- package/dist/gateway/static/root/assets/messages-B1iSKjiw.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-BfLfcta8.js +2 -0
- package/dist/gateway/static/root/assets/note-detail-page-BjwOQBfT.js +2 -0
- package/dist/gateway/static/root/assets/{note-image-lightbox-hnSX5SSn.js → note-image-lightbox-B-Svpmza.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-DktdBiwB.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-CNgM20H5.js → preview-open-alternatives-Bss4TiwP.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-rfVx96fq.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-CcdjGcfT.js → save-bar-controls-BRNjdgKq.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-CYr39z76.js → schedule-field-CUCKODde.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-BRAJgZQ2.js → schema-form-Dub9sy8r.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-DbtMFuuH.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-5re5gAnP.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-BhzjeGWi.js → settings-collapsible-section-BeFLavGi.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-Cz3Pcr9b.js → settings-form-section-dmyaPOTG.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-D-WMyLlj.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-Cl-DEJAU.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-DL4y9K5e.js → share-preview-page-C8glrdqe.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-CyPVvbLt.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-CleTH1oz.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-Ck8hdXqR.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-FD2jxRZ3.js → system-settings-panel-DI-LN_8G.js} +1 -1
- package/dist/gateway/static/root/assets/typed-models-lib-kX9duch4.js +1 -0
- package/dist/gateway/static/root/assets/{use-channel-catalog-BInPrfR5.js → use-channel-catalog-DqlWTsDb.js} +1 -1
- package/dist/gateway/static/root/assets/user-profile-settings-panel-B-UFPMXy.js +1 -0
- package/dist/gateway/static/root/assets/utils-Dm0hKalR.js +1 -0
- package/dist/gateway/static/root/assets/voice-api-key-field-C73IVZeC.js +1 -0
- package/dist/gateway/static/root/assets/{voice-player-store-1U3vFppm.js → voice-player-store-C_ArLJPM.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-BtFGp2y_.js +18 -0
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +1 -1
- package/dist/src/agent/agent-manager.js +14 -14
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/agent-scope.js +5 -9
- package/dist/src/agent/agent-scope.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/prompts.d.ts +2 -2
- package/dist/src/agent/background-review/prompts.js +2 -2
- package/dist/src/agent/background-review/prompts.js.map +1 -1
- package/dist/src/agent/background-review/run-background-review.d.ts +0 -2
- package/dist/src/agent/background-review/run-background-review.js +2 -4
- package/dist/src/agent/background-review/run-background-review.js.map +1 -1
- package/dist/src/agent/background-review/settings.d.ts +1 -1
- package/dist/src/agent/background-review/settings.js +8 -8
- package/dist/src/agent/background-review/settings.js.map +1 -1
- package/dist/src/agent/bootstrap/bootstrap-cache.d.ts +1 -0
- package/dist/src/agent/bootstrap/bootstrap-cache.js +4 -3
- package/dist/src/agent/bootstrap/bootstrap-cache.js.map +1 -1
- package/dist/src/agent/bootstrap/bootstrap-context.d.ts +2 -2
- package/dist/src/agent/bootstrap/bootstrap-context.js +4 -4
- package/dist/src/agent/bootstrap/bootstrap-context.js.map +1 -1
- package/dist/src/agent/bootstrap/bootstrap-files.d.ts +4 -0
- package/dist/src/agent/bootstrap/bootstrap-files.js +4 -3
- package/dist/src/agent/bootstrap/bootstrap-files.js.map +1 -1
- package/dist/src/agent/bootstrap/filter-bootstrap-files.js +4 -2
- package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +1 -1
- package/dist/src/agent/bootstrap/load-bootstrap-files.d.ts +2 -1
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +18 -17
- package/dist/src/agent/bootstrap/load-bootstrap-files.js.map +1 -1
- package/dist/src/agent/bootstrap/project-agents-context.js +1 -1
- package/dist/src/agent/bootstrap/types.d.ts +1 -1
- package/dist/src/agent/context/workspace-seed.js +3 -3
- package/dist/src/agent/context/workspace-state.js +1 -1
- package/dist/src/agent/context/workspace-templates/AGENTS.md +1 -1
- package/dist/src/agent/context/workspace.d.ts +4 -2
- package/dist/src/agent/context/workspace.js +6 -5
- package/dist/src/agent/context/workspace.js.map +1 -1
- package/dist/src/agent/embedded/run-for-session.js +4 -1
- package/dist/src/agent/embedded/run-for-session.js.map +1 -1
- package/dist/src/agent/fallback/candidates.js +11 -9
- package/dist/src/agent/fallback/candidates.js.map +1 -1
- package/dist/src/agent/goals/goal-locale.js +2 -2
- package/dist/src/agent/goals/post-turn.js +3 -3
- package/dist/src/agent/image/generation/runtime-types.d.ts +2 -0
- package/dist/src/agent/image/generation/runtime.js +1 -1
- package/dist/src/agent/image/generation/runtime.js.map +1 -1
- package/dist/src/agent/image/image-helpers.d.ts +1 -1
- package/dist/src/agent/image/image-helpers.js +4 -17
- package/dist/src/agent/image/image-helpers.js.map +1 -1
- package/dist/src/agent/image/image-model-fallback.js +1 -1
- package/dist/src/agent/image/image-model-fallback.js.map +1 -1
- package/dist/src/agent/image/inbound-image-handling.js +1 -1
- package/dist/src/agent/image/inbound-image-handling.js.map +1 -1
- package/dist/src/agent/image/load-image-media.js +2 -2
- package/dist/src/agent/image/tool-model-config.d.ts +1 -1
- package/dist/src/agent/image/tool-model-config.js +2 -2
- package/dist/src/agent/image/tool-model-config.js.map +1 -1
- package/dist/src/agent/ipc/inbox.js +3 -3
- package/dist/src/agent/ipc/socket.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
- package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +1 -1
- package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js +1 -1
- package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js.map +1 -1
- package/dist/src/agent/media-generation/runtime-shared.d.ts +5 -2
- package/dist/src/agent/media-generation/runtime-shared.js +1 -1
- package/dist/src/agent/media-generation/runtime-shared.js.map +1 -1
- package/dist/src/agent/memory/builtin-memory-store.d.ts +6 -2
- package/dist/src/agent/memory/builtin-memory-store.js +15 -6
- package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
- package/dist/src/agent/memory/builtin-provider.d.ts +31 -9
- package/dist/src/agent/memory/builtin-provider.js +290 -11
- package/dist/src/agent/memory/builtin-provider.js.map +1 -1
- package/dist/src/agent/memory/candidate-extractor.d.ts +6 -0
- package/dist/src/agent/memory/candidate-extractor.js +60 -0
- package/dist/src/agent/memory/candidate-extractor.js.map +1 -0
- package/dist/src/agent/memory/context-assembler.d.ts +10 -0
- package/dist/src/agent/memory/context-assembler.js +26 -0
- package/dist/src/agent/memory/context-assembler.js.map +1 -0
- package/dist/src/agent/memory/create-memory-manager.js +25 -7
- package/dist/src/agent/memory/create-memory-manager.js.map +1 -1
- package/dist/src/agent/memory/dreaming/config.d.ts +1 -6
- package/dist/src/agent/memory/dreaming/config.js +8 -8
- package/dist/src/agent/memory/dreaming/config.js.map +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.d.ts +2 -0
- package/dist/src/agent/memory/dreaming/deep-promotion.js +25 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.js.map +1 -1
- package/dist/src/agent/memory/dreaming/events.js +1 -1
- package/dist/src/agent/memory/dreaming/last-run.js +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
- package/dist/src/agent/memory/dreaming/preview.js +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.js +1 -1
- package/dist/src/agent/memory/index.d.ts +1 -0
- package/dist/src/agent/memory/index.js +4 -3
- package/dist/src/agent/memory/inject-prefetch.js +6 -2
- package/dist/src/agent/memory/inject-prefetch.js.map +1 -1
- package/dist/src/agent/memory/manager.d.ts +39 -2
- package/dist/src/agent/memory/manager.js +355 -39
- package/dist/src/agent/memory/manager.js.map +1 -1
- package/dist/src/agent/memory/memory-config.js +15 -15
- package/dist/src/agent/memory/memory-config.js.map +1 -1
- package/dist/src/agent/memory/memory-flush.js +1 -1
- package/dist/src/agent/memory/plugin-discovery.d.ts +19 -5
- package/dist/src/agent/memory/plugin-discovery.js +97 -31
- package/dist/src/agent/memory/plugin-discovery.js.map +1 -1
- package/dist/src/agent/memory/prefetch-coordinator.js.map +1 -1
- package/dist/src/agent/memory/provider.d.ts +20 -15
- package/dist/src/agent/memory/stub-memory-provider.d.ts +17 -2
- package/dist/src/agent/memory/stub-memory-provider.js +20 -3
- package/dist/src/agent/memory/stub-memory-provider.js.map +1 -1
- package/dist/src/agent/memory/types.d.ts +162 -3
- package/dist/src/agent/models/manager.d.ts +1 -1
- package/dist/src/agent/models/manager.js +2 -2
- package/dist/src/agent/models/manager.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.d.ts +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +2 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +2 -2
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.d.ts +2 -6
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +2 -8
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js.map +1 -1
- package/dist/src/agent/prompt/memory/index.d.ts +4 -2
- package/dist/src/agent/prompt/memory/index.js +19 -13
- package/dist/src/agent/prompt/memory/index.js.map +1 -1
- package/dist/src/agent/prompt/sections/memory-skills.js +1 -1
- package/dist/src/agent/prompt/sections/memory-skills.js.map +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +5 -20
- package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
- package/dist/src/agent/reply/post-compaction-context.js +10 -7
- package/dist/src/agent/reply/post-compaction-context.js.map +1 -1
- package/dist/src/agent/reply/startup-context.js +7 -12
- package/dist/src/agent/reply/startup-context.js.map +1 -1
- package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
- package/dist/src/agent/sandbox/path-policy.js +2 -2
- package/dist/src/agent/service/process-direct-streaming.js +1 -4
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/session-context-report.js +1 -1
- package/dist/src/agent/service/session-context-report.js.map +1 -1
- package/dist/src/agent/service.d.ts +3 -3
- package/dist/src/agent/service.js +30 -35
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +1 -2
- package/dist/src/agent/session/session-hydrator.js +1 -2
- package/dist/src/agent/session/session-hydrator.js.map +1 -1
- package/dist/src/agent/session/session-inspector.d.ts +1 -1
- package/dist/src/agent/session/session-inspector.js +10 -15
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/skills/config.js +2 -2
- package/dist/src/agent/skills/filesystem-watcher.js +1 -1
- package/dist/src/agent/skills/hub-hash.js +2 -2
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +3 -3
- package/dist/src/agent/skills/index.js +2 -2
- package/dist/src/agent/skills/installer.js +2 -2
- package/dist/src/agent/skills/managed-store.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +1 -1
- package/dist/src/agent/skills/skill-manager.js +1 -1
- package/dist/src/agent/skills/skill-view-path.js +1 -1
- package/dist/src/agent/skills/test-framework.js +1 -1
- package/dist/src/agent/starter-agents.d.ts +1 -3
- package/dist/src/agent/starter-agents.js +14 -22
- package/dist/src/agent/starter-agents.js.map +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -2
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/curated-memory-tool.d.ts +2 -5
- package/dist/src/agent/tools/curated-memory-tool.js +77 -18
- package/dist/src/agent/tools/curated-memory-tool.js.map +1 -1
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/factory.d.ts +0 -4
- package/dist/src/agent/tools/factory.js +19 -58
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/find.js +1 -1
- package/dist/src/agent/tools/grep.js +1 -1
- package/dist/src/agent/tools/image-generate-tool.d.ts +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +20 -15
- package/dist/src/agent/tools/image-generate-tool.js.map +1 -1
- package/dist/src/agent/tools/image-tool.js +1 -3
- package/dist/src/agent/tools/image-tool.js.map +1 -1
- package/dist/src/agent/tools/memory-tool.d.ts +2 -2
- package/dist/src/agent/tools/memory-tool.js +39 -14
- package/dist/src/agent/tools/memory-tool.js.map +1 -1
- package/dist/src/agent/tools/session-search-tool.js +1 -3
- package/dist/src/agent/tools/session-search-tool.js.map +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +1 -1
- package/dist/src/agent/tools/web-extract.js +8 -9
- package/dist/src/agent/tools/web-extract.js.map +1 -1
- package/dist/src/agent/tools/workflow-tool.js +1 -1
- package/dist/src/agent/workflow/catalog.js +1 -1
- package/dist/src/agent/workflow/subagent-runner.js +1 -3
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- package/dist/src/agent-manifest/index.d.ts +4 -0
- package/dist/src/agent-manifest/index.js +10 -0
- package/dist/src/agent-manifest/index.js.map +1 -0
- package/dist/src/agent-manifest/prompt.d.ts +2 -0
- package/dist/src/agent-manifest/prompt.js +57 -0
- package/dist/src/agent-manifest/prompt.js.map +1 -0
- package/dist/src/agent-manifest/resolver.d.ts +12 -0
- package/dist/src/agent-manifest/resolver.js +95 -0
- package/dist/src/agent-manifest/resolver.js.map +1 -0
- package/dist/src/agent-manifest/schema.d.ts +1010 -0
- package/dist/src/agent-manifest/schema.js +269 -0
- package/dist/src/agent-manifest/schema.js.map +1 -0
- package/dist/src/agent-manifest/validator.d.ts +25 -0
- package/dist/src/agent-manifest/validator.js +88 -0
- package/dist/src/agent-manifest/validator.js.map +1 -0
- package/dist/src/agent-runtime/boundary-guard.d.ts +12 -0
- package/dist/src/agent-runtime/boundary-guard.js +23 -0
- package/dist/src/agent-runtime/boundary-guard.js.map +1 -0
- package/dist/src/agent-runtime/index.d.ts +7 -0
- package/dist/src/agent-runtime/index.js +8 -0
- package/dist/src/agent-runtime/memory-runtime.d.ts +21 -0
- package/dist/src/agent-runtime/memory-runtime.js +50 -0
- package/dist/src/agent-runtime/memory-runtime.js.map +1 -0
- package/dist/src/agent-runtime/model-router.d.ts +11 -0
- package/dist/src/agent-runtime/model-router.js +16 -0
- package/dist/src/agent-runtime/model-router.js.map +1 -0
- package/dist/src/agent-runtime/run-trace.d.ts +27 -0
- package/dist/src/agent-runtime/run-trace.js +53 -0
- package/dist/src/agent-runtime/run-trace.js.map +1 -0
- package/dist/src/agent-runtime/runtime-profile.d.ts +24 -0
- package/dist/src/agent-runtime/runtime-profile.js +44 -0
- package/dist/src/agent-runtime/runtime-profile.js.map +1 -0
- package/dist/src/agent-runtime/tool-registry.d.ts +28 -0
- package/dist/src/agent-runtime/tool-registry.js +52 -0
- package/dist/src/agent-runtime/tool-registry.js.map +1 -0
- package/dist/src/agent-runtime/workflow-runtime.d.ts +31 -0
- package/dist/src/agent-runtime/workflow-runtime.js +34 -0
- package/dist/src/agent-runtime/workflow-runtime.js.map +1 -0
- package/dist/src/ai-assist/text-assist.js +1 -1
- package/dist/src/auth/credentials.js +2 -2
- package/dist/src/auth/profiles/store.js +2 -2
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
- package/dist/src/browser/actions/extension-registry-bridge.js.map +1 -1
- package/dist/src/browser/actions/registry.js +5 -8
- package/dist/src/browser/actions/registry.js.map +1 -1
- package/dist/src/browser/backend-from-config.d.ts +1 -1
- package/dist/src/browser/backend-from-config.js +50 -71
- package/dist/src/browser/backend-from-config.js.map +1 -1
- package/dist/src/browser/browser-command-timeout.d.ts +0 -1
- package/dist/src/browser/browser-command-timeout.js +3 -7
- package/dist/src/browser/browser-command-timeout.js.map +1 -1
- package/dist/src/browser/cache-dir-policy.js +1 -1
- package/dist/src/browser/cdp-local-launcher.js +2 -2
- package/dist/src/browser/pipeline/source.js +1 -1
- package/dist/src/browser/providers/browser-ext-install.d.ts +2 -12
- package/dist/src/browser/providers/browser-ext-install.js +7 -12
- package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
- package/dist/src/browser/providers/cloakbrowser.js +5 -5
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/readiness.js +16 -16
- package/dist/src/browser/readiness.js.map +1 -1
- package/dist/src/browser/schemas.js +1 -1
- package/dist/src/browser/schemas.js.map +1 -1
- package/dist/src/browser/stealth.js +1 -1
- package/dist/src/channels/catalog/channel-catalog-service.js +1 -1
- package/dist/src/channels/outbound/persist-store.js +1 -1
- package/dist/src/channels/pairing/allow-from-file.js +1 -1
- package/dist/src/channels/pairing/pairing-store.js +2 -2
- package/dist/src/channels/pipeline.d.ts +1 -1
- package/dist/src/channels/pipeline.js.map +1 -1
- package/dist/src/chat-commands/agent-edit.js +2 -3
- package/dist/src/chat-commands/agent-edit.js.map +1 -1
- package/dist/src/chat-commands/builtins/config.js +6 -6
- package/dist/src/chat-commands/builtins/config.js.map +1 -1
- package/dist/src/chat-commands/builtins/model.js +2 -2
- package/dist/src/chat-commands/builtins/model.js.map +1 -1
- package/dist/src/chat-commands/builtins/thinking.js +16 -42
- package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
- package/dist/src/chat-commands/config-paths.js +1 -1
- package/dist/src/chat-commands/config-paths.js.map +1 -1
- package/dist/src/chat-commands/context.js +3 -4
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/cli/command-manifest.d.ts +1 -1
- package/dist/src/cli/command-manifest.js +2 -2
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/agent.js +3 -1
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/agents.js +3 -6
- package/dist/src/cli/commands/agents.js.map +1 -1
- package/dist/src/cli/commands/browser-cli-helpers.js +9 -11
- package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
- package/dist/src/cli/commands/config.js +6 -6
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +3 -18
- package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -2
- package/dist/src/cli/commands/doctor/checks/workspace-status.js.map +1 -1
- package/dist/src/cli/commands/extension-create.js +1 -1
- package/dist/src/cli/commands/extension-dev.js +2 -2
- package/dist/src/cli/commands/extension-marketplace.js +2 -2
- package/dist/src/cli/commands/extension-pack.js +2 -2
- package/dist/src/cli/commands/extension.js +3 -3
- package/dist/src/cli/commands/gateway/logs.js +1 -1
- package/dist/src/cli/commands/goal.js +1 -1
- package/dist/src/cli/commands/image.js +13 -372
- package/dist/src/cli/commands/image.js.map +1 -1
- package/dist/src/cli/commands/init.js +7 -6
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/models.js +14 -16
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
- package/dist/src/cli/commands/onboard/model.js +28 -23
- package/dist/src/cli/commands/onboard/model.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +3 -3
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/skills-test.js +1 -1
- package/dist/src/cli/commands/tui.js +2 -2
- package/dist/src/cli/commands/tui.js.map +1 -1
- package/dist/src/cli/index.d.ts +1 -0
- package/dist/src/cli/index.js +10 -5
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/registry.js +1 -1
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/cli/templates.d.ts +1 -1
- package/dist/src/cli/templates.js +2 -12
- package/dist/src/cli/templates.js.map +1 -1
- package/dist/src/cli/utils/gateway-client.js +1 -1
- package/dist/src/cli/utils/init-workspace-core.d.ts +1 -4
- package/dist/src/cli/utils/init-workspace-core.js +9 -8
- package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
- package/dist/src/commands/agents.config.d.ts +0 -1
- package/dist/src/commands/agents.config.js +59 -13
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/agent-profile.d.ts +5 -17
- package/dist/src/config/agent-profile.js +32 -64
- package/dist/src/config/agent-profile.js.map +1 -1
- package/dist/src/config/agent-typed-models.d.ts +1 -1
- package/dist/src/config/agent-typed-models.js +3 -6
- package/dist/src/config/agent-typed-models.js.map +1 -1
- package/dist/src/config/gateway-bind.js +1 -1
- package/dist/src/config/index.js +9 -9
- package/dist/src/config/integration.d.ts +1 -1
- package/dist/src/config/loader.js +4 -4
- package/dist/src/config/models-json.js +2 -2
- package/dist/src/config/paths-state.js +1 -1
- package/dist/src/config/paths.d.ts +8 -1
- package/dist/src/config/paths.js +17 -4
- package/dist/src/config/paths.js.map +1 -1
- package/dist/src/config/profile.js +1 -1
- package/dist/src/config/reload.js +2 -2
- package/dist/src/config/reload.js.map +1 -1
- package/dist/src/config/rules.js +6 -56
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/config/schema.d.ts +916 -779
- package/dist/src/config/schema.js +174 -423
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/workspace-path.js +1 -1
- package/dist/src/connectors/composio-triggers.js +1 -1
- package/dist/src/cron/executor.js +1 -1
- package/dist/src/cron/index.js +1 -1
- package/dist/src/cron/service.js +2 -2
- package/dist/src/cron/validation.d.ts +3 -3
- package/dist/src/daemon/constants.js +1 -1
- package/dist/src/daemon/install-plan.js +2 -2
- package/dist/src/daemon/launchd.js +2 -2
- package/dist/src/daemon/schtasks.js +2 -2
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/extensions/activation-context.js +13 -7
- package/dist/src/extensions/activation-context.js.map +1 -1
- package/dist/src/extensions/bundle-mcp.js +1 -1
- package/dist/src/extensions/discover-extensions.js +2 -2
- package/dist/src/extensions/health.js +1 -1
- package/dist/src/extensions/install.js +2 -2
- package/dist/src/extensions/loader.js +2 -2
- package/dist/src/extensions/lockfile.js +3 -3
- package/dist/src/extensions/security.js +1 -1
- package/dist/src/extensions/update.js +2 -2
- package/dist/src/gateway/agents-admin.d.ts +24 -18
- package/dist/src/gateway/agents-admin.js +158 -92
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/capability-presets-admin.d.ts +56 -0
- package/dist/src/gateway/capability-presets-admin.js +214 -0
- package/dist/src/gateway/capability-presets-admin.js.map +1 -0
- package/dist/src/gateway/chat-stream/mapper.js +9 -2
- package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
- package/dist/src/gateway/file-path-classifier.js +2 -2
- package/dist/src/gateway/global-defaults-admin.d.ts +36 -0
- package/dist/src/gateway/global-defaults-admin.js +146 -0
- package/dist/src/gateway/global-defaults-admin.js.map +1 -0
- package/dist/src/gateway/hono/lib/agent-model.d.ts +1 -1
- package/dist/src/gateway/hono/lib/agent-model.js +1 -1
- package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +234 -127
- package/dist/src/gateway/hono/lib/config-payload.js +14 -38
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +2 -2
- package/dist/src/gateway/hono/lib/static-ui.js +2 -2
- package/dist/src/gateway/hono/routes/agents.js +88 -33
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/browser.js +8 -15
- package/dist/src/gateway/hono/routes/browser.js.map +1 -1
- package/dist/src/gateway/hono/routes/capability-presets.d.ts +3 -0
- package/dist/src/gateway/hono/routes/capability-presets.js +145 -0
- package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -0
- package/dist/src/gateway/hono/routes/commands-skills.js +4 -5
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +1 -17
- package/dist/src/gateway/hono/routes/config-patch/agents.js +2 -443
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +7 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
- package/dist/src/gateway/hono/routes/config.js +1 -1
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +8 -1
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/global-defaults.d.ts +3 -0
- package/dist/src/gateway/hono/routes/global-defaults.js +61 -0
- package/dist/src/gateway/hono/routes/global-defaults.js.map +1 -0
- package/dist/src/gateway/hono/routes/host-fs.js +2 -2
- package/dist/src/gateway/hono/routes/index.js +2 -0
- package/dist/src/gateway/hono/routes/index.js.map +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +17 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/memory.d.ts +3 -0
- package/dist/src/gateway/hono/routes/memory.js +361 -0
- package/dist/src/gateway/hono/routes/memory.js.map +1 -0
- package/dist/src/gateway/hono/routes/models.js +2 -2
- package/dist/src/gateway/hono/routes/shares.js +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +2 -2
- package/dist/src/gateway/lock.js +3 -3
- package/dist/src/gateway/ports.js +1 -1
- package/dist/src/gateway/service/config-coordinator.js +1 -1
- package/dist/src/gateway/service/marketplace-service.d.ts +4 -4
- package/dist/src/gateway/service/marketplace-service.js +13 -9
- package/dist/src/gateway/service/marketplace-service.js.map +1 -1
- package/dist/src/gateway/service.d.ts +1 -1
- package/dist/src/gateway/service.js +15 -16
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/workspace-fs-file-list.js +1 -1
- package/dist/src/goals/goal-workflow-judge.js +2 -2
- package/dist/src/i18n/goals-bundle.js +1 -1
- package/dist/src/i18n/index.js +1 -1
- package/dist/src/i18n/share-tool-bundle.js +2 -2
- package/dist/src/infra/brew.js +1 -1
- package/dist/src/infra/package-json.js +1 -1
- package/dist/src/infra/package-update-steps.js +1 -1
- package/dist/src/infra/path-env.js +2 -2
- package/dist/src/infra/restart.js +1 -1
- package/dist/src/infra/stable-node-path.js +1 -1
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-global.js +1 -1
- package/dist/src/infra/update-lock.js +2 -2
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/infra/update-startup.js +1 -1
- package/dist/src/infra/write-file-atomic.js +2 -2
- package/dist/src/media/store.js +1 -1
- package/dist/src/notes/agent-context.js +3 -3
- package/dist/src/notes/service.js +4 -2
- package/dist/src/notes/service.js.map +1 -1
- package/dist/src/notes/store.js +2 -2
- package/dist/src/project-trust/trust-store.js +2 -2
- package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
- package/dist/src/providers/index.d.ts +5 -6
- package/dist/src/providers/index.js +26 -30
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/providers/model-registry.js +4 -4
- package/dist/src/session/index.js +1 -1
- package/dist/src/session/init-session-turn.js +1 -1
- package/dist/src/session/resolve-session.js +1 -1
- package/dist/src/session/session-title.js +2 -2
- package/dist/src/session/store.js +1 -1
- package/dist/src/session/thinking-resolve.d.ts +1 -1
- package/dist/src/session/thinking-resolve.js +1 -1
- package/dist/src/session/thinking-resolve.js.map +1 -1
- package/dist/src/share/share-auto.js +2 -2
- package/dist/src/share/share-store.js +3 -3
- package/dist/src/share/share-thumbnail.js +2 -2
- package/dist/src/share/share-zip.js +1 -1
- package/dist/src/share/site-share-store.js +3 -3
- package/dist/src/share/site-static-serve.js +1 -1
- package/dist/src/storage/sqlite/connection.js +2 -2
- package/dist/src/storage/sqlite/index.d.ts +1 -0
- package/dist/src/storage/sqlite/index.js +2 -1
- package/dist/src/storage/sqlite/memory-index-repository.d.ts +1 -0
- package/dist/src/storage/sqlite/memory-index-repository.js +17 -16
- package/dist/src/storage/sqlite/memory-index-repository.js.map +1 -1
- package/dist/src/storage/sqlite/memory-records-repository.d.ts +144 -0
- package/dist/src/storage/sqlite/memory-records-repository.js +453 -0
- package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -0
- package/dist/src/storage/sqlite/migrations/012_memory_records.sql +63 -0
- package/dist/src/storage/sqlite/migrations/013_memory_trace_events.sql +21 -0
- package/dist/src/storage/sqlite/migrations/014_memory_record_governance.sql +10 -0
- package/dist/src/storage/sqlite/migrations/015_memory_trace_feedback.sql +4 -0
- package/dist/src/storage/sqlite/migrations/discover.js +1 -1
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +4 -4
- 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 +2 -2
- package/dist/src/storage/sqlite/schema.sql +86 -0
- package/dist/src/tui/backends/embedded-backend.d.ts +3 -0
- package/dist/src/tui/backends/embedded-backend.js +43 -24
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +1 -0
- package/dist/src/tui/backends/gateway-sse-backend.js +16 -3
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/clipboard-image.js +3 -3
- package/dist/src/tui/components/tui-header.d.ts +0 -1
- package/dist/src/tui/components/tui-header.js +3 -8
- package/dist/src/tui/components/tui-header.js.map +1 -1
- package/dist/src/tui/extension-host/load-extensions.js +1 -1
- package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
- package/dist/src/tui/theme-manager.js +1 -1
- package/dist/src/tui/tui-command-formatters.js +4 -4
- package/dist/src/tui/tui-commands.js +2 -2
- package/dist/src/tui/tui-keybindings-file.js +1 -1
- package/dist/src/tui/tui-scoped-models.js +2 -2
- package/dist/src/tui/tui-settings.js +1 -1
- package/dist/src/tui/tui-startup-resources.js +2 -1
- package/dist/src/tui/tui-startup-resources.js.map +1 -1
- package/dist/src/tui/tui-startup-text.js +12 -12
- package/dist/src/tui/tui-startup-text.js.map +1 -1
- package/dist/src/tui/tui.js +10 -7
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/tunnel/frpc-binary.js +4 -4
- package/dist/src/tunnel/frpc-config.js +1 -1
- package/dist/src/tunnel/frpc-extract.js +1 -1
- package/dist/src/tunnel/tunnel-state.js +1 -1
- package/dist/src/utils/logger/audit.js +1 -1
- package/dist/src/utils/logger/log-store.js +1 -1
- package/dist/src/utils/logger/rotation.js +1 -1
- package/dist/src/utils/logger/streams.js +1 -1
- package/dist/src/voice/tts/audio.js +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +2 -2
- package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +4 -5
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
- package/dist/src/workflows/store/event-store.js +1 -1
- package/dist/src/workflows/store/run-store.js +1 -1
- package/package.json +3 -2
- package/dist/gateway/static/root/assets/agent-browser-settings-page-D1SyFYeh.js +0 -6
- package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-C9YxgvuI.js +0 -1
- package/dist/gateway/static/root/assets/agents-CteVs3UO.js +0 -71
- package/dist/gateway/static/root/assets/apps-page-CVQ1M8Ax.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-Cd3JbeQ1.js +0 -1
- package/dist/gateway/static/root/assets/config-api-C4RAtTKW.js +0 -3
- package/dist/gateway/static/root/assets/connectors-page-MsMa5qBr.js +0 -2
- package/dist/gateway/static/root/assets/cron-api-sJNMqB6P.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-D30CSwkn.js +0 -3
- package/dist/gateway/static/root/assets/dreaming-settings-6fCUWRQf.js +0 -1
- package/dist/gateway/static/root/assets/gateway-config-api-C6989a-W.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-BpF26t91.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-DOjhmRyf.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-Xl9_wrFc.js +0 -2
- package/dist/gateway/static/root/assets/heartbeat-settings-DN9vEj9P.js +0 -1
- package/dist/gateway/static/root/assets/index-C8ytlAF2.js +0 -122
- package/dist/gateway/static/root/assets/index-CVpJW2NS.css +0 -1
- package/dist/gateway/static/root/assets/messages-BqzIDrlr.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-BO4o-GmO.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-page-DLV_XDmT.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-ycsDlkFA.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-DQpnE8K9.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BZui7iAY.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DEfzZ1ax.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-CLuSsu1-.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Cq4qpXLi.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-B9F3HyYQ.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-Bp9UPPwm.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-BIoBsfSV.js +0 -2
- package/dist/gateway/static/root/assets/use-agent-defaults-form-Cz2_pPzu.js +0 -1
- package/dist/gateway/static/root/assets/use-settings-tab-guard-nuHMmZQv.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-BUIrKb8s.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-qE3SexnO.js +0 -18
- package/dist/src/agent/context/workspace-templates/USER.md +0 -24
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","names":[],"sources":["../../../../../src/gateway/hono/routes/browser.ts"],"sourcesContent":["/**\n * Browser/extension settings routes: `/api/browser/*` except for the\n * long-running install streams under `/api/browser/{playwright,cloakbrowser}/install/stream`\n * (those live in `browser-install.ts` so the SSE pump doesn't have to load\n * with the rest of settings).\n *\n * Four backend families:\n * - **Extension WS bridge** — pair Chrome via the xopc browser extension.\n * Owns a module-scoped manual handle so the bridge can outlive a config\n * save (UI flow: Start → pair → Save).\n * - **CloakBrowser** — install / launch / probe runtime status.\n * - **Playwright Chromium** — doctor + on-demand install of bundled browser.\n * - **Local CDP** — launch / list / stop user-driven debug Chrome instances.\n * - **Cloud providers** (browserbase / browser-use) — connection test.\n *\n * Extracted from `config.ts` (which was 2237 lines and 80% browser routes).\n */\nimport type { Hono } from 'hono';\nimport net from 'node:net';\n\nimport type { Config } from '../../../config/schema.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nconst DEFAULT_EXTENSION_PORT = 19820;\nconst DEFAULT_EXTENSION_HOST = '127.0.0.1';\n\n/**\n * Optional manual hold on the extension WS server kept alive from the UI so\n * users can pair the extension before saving config / running a browser tool.\n * Module-scoped so repeat Start calls are idempotent and the bridge survives\n * config patches.\n */\ntype ManualHandle = { release: () => Promise<void>; host: string; port: number };\nlet manualExtensionHandle: ManualHandle | null = null;\n\nfunction loopbackHostnameFromUrl(input: string): string | null {\n let parsed: URL;\n try {\n parsed = new URL(input);\n } catch {\n return null;\n }\n const proto = parsed.protocol;\n if (proto !== 'ws:' && proto !== 'wss:' && proto !== 'http:' && proto !== 'https:') {\n return null;\n }\n const host = parsed.hostname.toLowerCase();\n if (host === '127.0.0.1' || host === 'localhost' || host === '::1') return host;\n return null;\n}\n\nfunction isLoopbackHost(host: string): boolean {\n const h = host.trim().toLowerCase();\n return h === '127.0.0.1' || h === 'localhost' || h === '::1' || h === '[::1]';\n}\n\nfunction parseExtensionProbePort(raw: string | undefined): number | undefined {\n if (!raw) return undefined;\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n < 1024 || n > 65_535) return undefined;\n return n;\n}\n\nfunction isLoopbackPortOpen(host: string, port: number, timeoutMs = 500): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = net.connect({ host, port });\n const finish = (open: boolean) => {\n socket.removeAllListeners();\n try {\n socket.destroy();\n } catch {\n /* */\n }\n resolve(open);\n };\n socket.setTimeout(timeoutMs);\n socket.once('connect', () => finish(true));\n socket.once('timeout', () => finish(false));\n socket.once('error', () => finish(false));\n });\n}\n\nasync function readExtensionBridgeSnapshot() {\n const { getExtensionBrowserServerSnapshot } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n return getExtensionBrowserServerSnapshot();\n}\n\nasync function stopExtensionBridgeFromSettings(service: AuthenticatedRouteDeps['service']): Promise<{\n forcedShutdown: boolean;\n}> {\n if (manualExtensionHandle) {\n try {\n await manualExtensionHandle.release();\n } catch {\n /* refcount underflow should not surface */\n }\n manualExtensionHandle = null;\n }\n await service.releaseBrowserExtensionBridge();\n const { forceShutdownExtensionBrowserServer } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n const forcedShutdown = await forceShutdownExtensionBrowserServer();\n return { forcedShutdown };\n}\n\nfunction resolveExtensionStatusTarget(\n browser: Record<string, unknown> | undefined,\n query: { probe?: string; host?: string; port?: string },\n): { host: string; port: number; backend: string } | null {\n const backend = typeof browser?.backend === 'string' ? browser.backend : 'extension';\n const probe = query.probe === '1' || query.probe === 'true';\n if (!probe && backend !== 'extension') {\n return null;\n }\n\n const ext = browser?.extension as Record<string, unknown> | undefined;\n const configPort =\n typeof ext?.port === 'number' && ext.port >= 1024 && ext.port <= 65_535\n ? Math.floor(ext.port)\n : DEFAULT_EXTENSION_PORT;\n const configHost =\n typeof ext?.host === 'string' && ext.host.trim() ? ext.host.trim() : DEFAULT_EXTENSION_HOST;\n\n const port = parseExtensionProbePort(query.port) ?? configPort;\n const host =\n typeof query.host === 'string' && query.host.trim() ? query.host.trim() : configHost;\n if (!isLoopbackHost(host)) {\n return null;\n }\n\n return { host, port, backend: probe && backend !== 'extension' ? 'extension' : backend };\n}\n\nexport function registerBrowserRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n // Browser extension bridge status — gateway-side check so frontend doesn't cross-origin fetch.\n authenticated.get('/api/browser/extension-status', async (c) => {\n const config: Config = service.currentConfig as Config;\n const browser = config?.agents?.defaults?.browser as Record<string, unknown> | undefined;\n const target = resolveExtensionStatusTarget(browser, {\n probe: c.req.query('probe'),\n host: c.req.query('host'),\n port: c.req.query('port'),\n });\n\n let artifacts: Record<string, unknown> | undefined;\n try {\n const { browserExtDoctor } = await import('../../../browser/providers/browser-ext-install.js');\n const doctor = await browserExtDoctor();\n artifacts = {\n installed: doctor.installed,\n extensionDir: doctor.extensionDir,\n xopcVersion: doctor.xopcVersion,\n installedVersion: doctor.installedVersion,\n needsRefresh: doctor.needsRefresh,\n needsChromeReload: doctor.needsChromeReload,\n };\n } catch {\n /* optional */\n }\n\n if (!target) {\n const backend = typeof browser?.backend === 'string' ? browser.backend : 'extension';\n return c.json({ running: false, connected: false, backend, artifacts });\n }\n const snapshot = await readExtensionBridgeSnapshot();\n let probeRunning = false;\n let probeConnected = false;\n try {\n const res = await fetch(`http://${target.host}:${target.port}/`, { signal: AbortSignal.timeout(2000) });\n const data = (await res.json()) as { ok?: boolean; connected?: boolean };\n probeRunning = Boolean(data.ok);\n probeConnected = Boolean(data.connected);\n } catch {\n /* probe failed — fall through to snapshot / port check */\n }\n const running = probeRunning || snapshot.active;\n const portConflict =\n !running && !snapshot.active\n ? await isLoopbackPortOpen(target.host, target.port)\n : false;\n return c.json({\n running,\n connected: probeConnected,\n backend: target.backend,\n artifacts,\n bridgeHeld: snapshot.active,\n refCount: snapshot.refCount,\n manualBridge: manualExtensionHandle !== null,\n portConflict,\n });\n });\n\n authenticated.get('/api/browser/extension/doctor', async (c) => {\n const cacheDirRaw = c.req.query('cacheDir');\n try {\n const { browserExtDoctor } = await import('../../../browser/providers/browser-ext-install.js');\n const status = await browserExtDoctor({\n cacheDir: cacheDirRaw && cacheDirRaw.trim() ? cacheDirRaw.trim() : undefined,\n });\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 400);\n }\n });\n\n authenticated.post('/api/browser/extension/install', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cacheDir = typeof input.cacheDir === 'string' && input.cacheDir.trim()\n ? input.cacheDir.trim()\n : undefined;\n const force = input.force === true;\n\n try {\n const { ensureBrowserExtensionArtifacts, browserExtDoctor } = await import(\n '../../../browser/providers/browser-ext-install.js'\n );\n const result = await ensureBrowserExtensionArtifacts({ cacheDir, force });\n const doctor = await browserExtDoctor({ cacheDir });\n return c.json({ ok: true, payload: { ...result, doctor } });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n authenticated.post('/api/browser/extension/open', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cacheDir = typeof input.cacheDir === 'string' && input.cacheDir.trim()\n ? input.cacheDir.trim()\n : undefined;\n const actionRaw = typeof input.action === 'string' ? input.action.trim() : 'both';\n const action =\n actionRaw === 'chrome' || actionRaw === 'folder' || actionRaw === 'both' ? actionRaw : 'both';\n\n try {\n const { openBrowserExtensionInstallUi } = await import(\n '../../../browser/providers/browser-ext-install.js'\n );\n const result = await openBrowserExtensionInstallUi({ action, cacheDir });\n return c.json({ ok: true, payload: result });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n // Start the extension WS bridge eagerly so the user can pair the extension\n // before saving config / running any tool. Idempotent (returns current state\n // if already running).\n authenticated.post('/api/browser/extension/start', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const port =\n typeof input.port === 'number' && input.port >= 1024 && input.port <= 65535\n ? Math.floor(input.port)\n : DEFAULT_EXTENSION_PORT;\n const hostRaw = typeof input.host === 'string' && input.host.trim() ? input.host.trim() : DEFAULT_EXTENSION_HOST;\n if (!isLoopbackHost(hostRaw)) {\n return c.json({ ok: false, error: 'extension bridge host must be loopback' }, 400);\n }\n\n try {\n if (manualExtensionHandle && (manualExtensionHandle.host !== hostRaw || manualExtensionHandle.port !== port)) {\n await manualExtensionHandle.release();\n manualExtensionHandle = null;\n }\n if (!manualExtensionHandle) {\n const { acquireExtensionBrowserServer } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n const { release } = await acquireExtensionBrowserServer({ host: hostRaw, port });\n manualExtensionHandle = { release, host: hostRaw, port };\n }\n return c.json({ ok: true, payload: { running: true, host: hostRaw, port } });\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : String(e) }, 500);\n }\n });\n\n authenticated.post('/api/browser/extension/stop', strictRateLimitMiddleware, async (c) => {\n try {\n const { forcedShutdown } = await stopExtensionBridgeFromSettings(service);\n return c.json({\n ok: true,\n payload: { running: false, forcedShutdown },\n });\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : String(e) }, 500);\n }\n });\n\n authenticated.post('/api/browser/extension/disconnect', strictRateLimitMiddleware, async (c) => {\n try {\n const { getExtensionBrowserProvider } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n const provider = getExtensionBrowserProvider();\n if (!provider?.isConnected()) {\n return c.json({\n ok: true,\n payload: { connected: false, alreadyDisconnected: true },\n });\n }\n provider.disconnectClient();\n return c.json({ ok: true, payload: { connected: false } });\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : String(e) }, 500);\n }\n });\n\n // Doctor: does Playwright have a runnable Chromium on disk?\n authenticated.get('/api/browser/playwright/doctor', async (c) => {\n try {\n const { playwrightChromiumDoctor } = await import('../../../browser/providers/playwright-doctor.js');\n const payload = await playwrightChromiumDoctor();\n return c.json({ ok: true, payload });\n } catch (e) {\n return c.json(\n { ok: false, error: e instanceof Error ? e.message : String(e) },\n 500,\n );\n }\n });\n\n // Doctor: CloakBrowser installed?\n authenticated.get('/api/browser/cloakbrowser/doctor', async (c) => {\n const cacheDirRaw = c.req.query('cacheDir');\n const binaryPathRaw = c.req.query('binaryPath');\n try {\n const { cloakBrowserDoctor } = await import('../../../browser/providers/cloakbrowser.js');\n const status = await cloakBrowserDoctor({\n cacheDir: cacheDirRaw && cacheDirRaw.trim() ? cacheDirRaw.trim() : undefined,\n binaryPath: binaryPathRaw && binaryPathRaw.trim() ? binaryPathRaw.trim() : undefined,\n });\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 400);\n }\n });\n\n // Runtime status for CloakBrowser (CDP port + profile dir from saved agent defaults).\n authenticated.get('/api/browser/cloakbrowser/status', async (c) => {\n try {\n const { cloakBrowserConfigFromAgentDefaults } = await import('../../../browser/backend-from-config.js');\n const { probeCloakBrowserRuntime } = await import('../../../browser/providers/cloakbrowser.js');\n const config = cloakBrowserConfigFromAgentDefaults(service.currentConfig as Config);\n const status = await probeCloakBrowserRuntime(config);\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n // Open CloakBrowser with the same profile/settings agents use (saved config, headed).\n authenticated.post('/api/browser/cloakbrowser/launch', strictRateLimitMiddleware, async (c) => {\n try {\n const { cloakBrowserConfigFromAgentDefaults } = await import('../../../browser/backend-from-config.js');\n const { launchCloakBrowser } = await import('../../../browser/providers/cloakbrowser.js');\n const config = cloakBrowserConfigFromAgentDefaults(service.currentConfig as Config);\n const result = await launchCloakBrowser({\n ...config,\n skipPlaywrightConnect: true,\n });\n return c.json({\n ok: true,\n payload: {\n running: true,\n reused: result.reused,\n port: result.cdpPort,\n pid: result.pid,\n userDataDir: result.userDataDir,\n temporaryProfile: config.temporaryProfile === true,\n },\n });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n // Ping a user-supplied CDP endpoint — loopback only (SSRF guard).\n authenticated.post('/api/browser/cdp/ping', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ ok: false, error: 'invalid JSON body' }, 400);\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cdpUrl = typeof input.cdpUrl === 'string' ? input.cdpUrl.trim() : '';\n if (!cdpUrl) return c.json({ ok: false, error: 'cdpUrl is required' }, 400);\n\n const loopback = loopbackHostnameFromUrl(cdpUrl);\n if (!loopback) {\n return c.json(\n { ok: false, error: 'CDP ping only allowed for loopback hosts (127.0.0.1 / localhost / ::1)' },\n 403,\n );\n }\n let httpBase: URL;\n try {\n httpBase = new URL(cdpUrl);\n httpBase.protocol = httpBase.protocol === 'wss:' ? 'https:' : 'http:';\n httpBase.pathname = '/json/version';\n httpBase.search = '';\n httpBase.hash = '';\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : 'invalid cdpUrl' }, 400);\n }\n try {\n const res = await fetch(httpBase.toString(), { signal: AbortSignal.timeout(2000) });\n if (!res.ok) {\n return c.json({ ok: true, payload: { reachable: false, status: res.status } });\n }\n const data = (await res.json()) as { Browser?: string; 'Protocol-Version'?: string; webSocketDebuggerUrl?: string };\n return c.json({\n ok: true,\n payload: {\n reachable: true,\n browser: data.Browser ?? null,\n protocolVersion: data['Protocol-Version'] ?? null,\n webSocketDebuggerUrl: data.webSocketDebuggerUrl ?? null,\n },\n });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: true, payload: { reachable: false, error: message } });\n }\n });\n\n // Spawn a local debuggable Chrome and return its WS endpoint.\n authenticated.post('/api/browser/cdp/launch', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const executablePath =\n typeof input.executablePath === 'string' && input.executablePath.trim()\n ? input.executablePath.trim()\n : undefined;\n try {\n const { launchLocalCdpChrome } = await import('../../../browser/cdp-local-launcher.js');\n const result = await launchLocalCdpChrome({ executablePath });\n return c.json({ ok: true, payload: result });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n authenticated.post('/api/browser/cdp/stop', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ ok: false, error: 'invalid JSON body' }, 400);\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const port = typeof input.port === 'number' && Number.isInteger(input.port) ? input.port : NaN;\n if (!Number.isFinite(port) || port < 1024 || port > 65535) {\n return c.json({ ok: false, error: 'port must be an integer in [1024, 65535]' }, 400);\n }\n const { stopLocalCdpChrome } = await import('../../../browser/cdp-local-launcher.js');\n const stopped = await stopLocalCdpChrome(port);\n return c.json({ ok: true, payload: { stopped } });\n });\n\n authenticated.get('/api/browser/cdp/instances', async (c) => {\n const { listLocalCdpInstances } = await import('../../../browser/cdp-local-launcher.js');\n return c.json({ ok: true, payload: { instances: listLocalCdpInstances() } });\n });\n\n // Cloud provider connection test.\n authenticated.post('/api/browser/cloud/test-connection', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ ok: false, error: 'invalid JSON body' }, 400);\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const provider = input.provider;\n const apiKeyRaw = typeof input.apiKey === 'string' ? input.apiKey.trim() : '';\n\n // The masked sentinel means \"use the stored config key\".\n let apiKey = apiKeyRaw;\n if (apiKey === '***' || apiKey === '••••••••••••') {\n const stored =\n (service.currentConfig as Config)?.agents?.defaults?.browser?.cloud?.apiKey;\n apiKey = typeof stored === 'string' ? stored.trim() : '';\n }\n if (!apiKey) {\n if (provider === 'browserbase') apiKey = process.env.BROWSERBASE_API_KEY ?? '';\n else if (provider === 'browser-use') apiKey = process.env.BROWSER_USE_API_KEY ?? '';\n }\n if (!apiKey) {\n return c.json({ ok: true, payload: { reachable: false, error: 'No API key configured' } });\n }\n\n try {\n if (provider === 'browserbase') {\n const res = await fetch('https://api.browserbase.com/v1/projects', {\n headers: { 'x-bb-api-key': apiKey },\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) {\n return c.json({\n ok: true,\n payload: { reachable: false, status: res.status, error: await res.text().catch(() => '') },\n });\n }\n const data = (await res.json().catch(() => null)) as unknown;\n const projects = Array.isArray(data) ? data : Array.isArray((data as { data?: unknown[] })?.data) ? (data as { data: unknown[] }).data : [];\n return c.json({ ok: true, payload: { reachable: true, projectCount: projects.length } });\n }\n if (provider === 'browser-use') {\n const res = await fetch('https://api.browser-use.com/api/v1/users/me', {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) {\n return c.json({\n ok: true,\n payload: { reachable: false, status: res.status, error: await res.text().catch(() => '') },\n });\n }\n return c.json({ ok: true, payload: { reachable: true } });\n }\n return c.json({ ok: false, error: 'provider must be browserbase or browser-use' }, 400);\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: true, payload: { reachable: false, error: message } });\n }\n });\n\n authenticated.post('/api/browser/playwright/install', strictRateLimitMiddleware, async (c) => {\n try {\n const { installPlaywrightChromium } = await import('../../../browser/providers/playwright-install.js');\n const payload = await installPlaywrightChromium();\n return c.json({ ok: true, payload });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message || 'Failed to install Playwright Chromium' }, 500);\n }\n });\n\n authenticated.post('/api/browser/cloakbrowser/install', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cacheDir = typeof input.cacheDir === 'string' && input.cacheDir.trim()\n ? input.cacheDir.trim()\n : undefined;\n const binaryPath = typeof input.binaryPath === 'string' && input.binaryPath.trim()\n ? input.binaryPath.trim()\n : undefined;\n\n try {\n const { installCloakBrowser } = await import('../../../browser/providers/cloakbrowser.js');\n const status = await installCloakBrowser({ cacheDir, binaryPath });\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browser.js","names":[],"sources":["../../../../../src/gateway/hono/routes/browser.ts"],"sourcesContent":["/**\n * Browser/extension settings routes: `/api/browser/*` except for the\n * long-running install streams under `/api/browser/{playwright,cloakbrowser}/install/stream`\n * (those live in `browser-install.ts` so the SSE pump doesn't have to load\n * with the rest of settings).\n *\n * Four backend families:\n * - **Extension WS bridge** — pair Chrome via the xopc browser extension.\n * Owns a module-scoped manual handle so the bridge can outlive a config\n * save (UI flow: Start → pair → Save).\n * - **CloakBrowser** — install / launch / probe runtime status.\n * - **Playwright Chromium** — doctor + on-demand install of bundled browser.\n * - **Local CDP** — launch / list / stop user-driven debug Chrome instances.\n * - **Cloud providers** (browserbase / browser-use) — connection test.\n *\n * Extracted from `config.ts` (which was 2237 lines and 80% browser routes).\n */\nimport type { Hono } from 'hono';\nimport net from 'node:net';\n\nimport type { Config } from '../../../config/schema.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nconst DEFAULT_EXTENSION_PORT = 19820;\nconst DEFAULT_EXTENSION_HOST = '127.0.0.1';\n\n/**\n * Optional manual hold on the extension WS server kept alive from the UI so\n * users can pair the extension before saving config / running a browser tool.\n * Module-scoped so repeat Start calls are idempotent and the bridge survives\n * config patches.\n */\ntype ManualHandle = { release: () => Promise<void>; host: string; port: number };\nlet manualExtensionHandle: ManualHandle | null = null;\n\nfunction loopbackHostnameFromUrl(input: string): string | null {\n let parsed: URL;\n try {\n parsed = new URL(input);\n } catch {\n return null;\n }\n const proto = parsed.protocol;\n if (proto !== 'ws:' && proto !== 'wss:' && proto !== 'http:' && proto !== 'https:') {\n return null;\n }\n const host = parsed.hostname.toLowerCase();\n if (host === '127.0.0.1' || host === 'localhost' || host === '::1') return host;\n return null;\n}\n\nfunction isLoopbackHost(host: string): boolean {\n const h = host.trim().toLowerCase();\n return h === '127.0.0.1' || h === 'localhost' || h === '::1' || h === '[::1]';\n}\n\nfunction parseExtensionProbePort(raw: string | undefined): number | undefined {\n if (!raw) return undefined;\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n < 1024 || n > 65_535) return undefined;\n return n;\n}\n\nfunction isLoopbackPortOpen(host: string, port: number, timeoutMs = 500): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = net.connect({ host, port });\n const finish = (open: boolean) => {\n socket.removeAllListeners();\n try {\n socket.destroy();\n } catch {\n /* */\n }\n resolve(open);\n };\n socket.setTimeout(timeoutMs);\n socket.once('connect', () => finish(true));\n socket.once('timeout', () => finish(false));\n socket.once('error', () => finish(false));\n });\n}\n\nasync function readExtensionBridgeSnapshot() {\n const { getExtensionBrowserServerSnapshot } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n return getExtensionBrowserServerSnapshot();\n}\n\nasync function stopExtensionBridgeFromSettings(service: AuthenticatedRouteDeps['service']): Promise<{\n forcedShutdown: boolean;\n}> {\n if (manualExtensionHandle) {\n try {\n await manualExtensionHandle.release();\n } catch {\n /* refcount underflow should not surface */\n }\n manualExtensionHandle = null;\n }\n await service.releaseBrowserExtensionBridge();\n const { forceShutdownExtensionBrowserServer } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n const forcedShutdown = await forceShutdownExtensionBrowserServer();\n return { forcedShutdown };\n}\n\nfunction resolveExtensionStatusTarget(\n browser: Record<string, unknown> | undefined,\n query: { probe?: string; host?: string; port?: string },\n): { host: string; port: number; backend: string } | null {\n const backend = typeof browser?.backend === 'string' ? browser.backend : 'extension';\n const probe = query.probe === '1' || query.probe === 'true';\n if (!probe && backend !== 'extension') {\n return null;\n }\n\n const ext = browser?.extension as Record<string, unknown> | undefined;\n const configPort =\n typeof ext?.port === 'number' && ext.port >= 1024 && ext.port <= 65_535\n ? Math.floor(ext.port)\n : DEFAULT_EXTENSION_PORT;\n const configHost =\n typeof ext?.host === 'string' && ext.host.trim() ? ext.host.trim() : DEFAULT_EXTENSION_HOST;\n\n const port = parseExtensionProbePort(query.port) ?? configPort;\n const host =\n typeof query.host === 'string' && query.host.trim() ? query.host.trim() : configHost;\n if (!isLoopbackHost(host)) {\n return null;\n }\n\n return { host, port, backend: probe && backend !== 'extension' ? 'extension' : backend };\n}\n\nexport function registerBrowserRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n // Browser extension bridge status — gateway-side check so frontend doesn't cross-origin fetch.\n authenticated.get('/api/browser/extension-status', async (c) => {\n const target = resolveExtensionStatusTarget(undefined, {\n probe: c.req.query('probe'),\n host: c.req.query('host'),\n port: c.req.query('port'),\n });\n\n let artifacts: Record<string, unknown> | undefined;\n try {\n const { browserExtDoctor } = await import('../../../browser/providers/browser-ext-install.js');\n const doctor = await browserExtDoctor();\n artifacts = {\n installed: doctor.installed,\n extensionDir: doctor.extensionDir,\n xopcVersion: doctor.xopcVersion,\n installedVersion: doctor.installedVersion,\n needsRefresh: doctor.needsRefresh,\n needsChromeReload: doctor.needsChromeReload,\n };\n } catch {\n /* optional */\n }\n\n if (!target) {\n const backend = 'extension';\n return c.json({ running: false, connected: false, backend, artifacts });\n }\n const snapshot = await readExtensionBridgeSnapshot();\n let probeRunning = false;\n let probeConnected = false;\n try {\n const res = await fetch(`http://${target.host}:${target.port}/`, { signal: AbortSignal.timeout(2000) });\n const data = (await res.json()) as { ok?: boolean; connected?: boolean };\n probeRunning = Boolean(data.ok);\n probeConnected = Boolean(data.connected);\n } catch {\n /* probe failed — fall through to snapshot / port check */\n }\n const running = probeRunning || snapshot.active;\n const portConflict =\n !running && !snapshot.active\n ? await isLoopbackPortOpen(target.host, target.port)\n : false;\n return c.json({\n running,\n connected: probeConnected,\n backend: target.backend,\n artifacts,\n bridgeHeld: snapshot.active,\n refCount: snapshot.refCount,\n manualBridge: manualExtensionHandle !== null,\n portConflict,\n });\n });\n\n authenticated.get('/api/browser/extension/doctor', async (c) => {\n const cacheDirRaw = c.req.query('cacheDir');\n try {\n const { browserExtDoctor } = await import('../../../browser/providers/browser-ext-install.js');\n const status = await browserExtDoctor({\n cacheDir: cacheDirRaw && cacheDirRaw.trim() ? cacheDirRaw.trim() : undefined,\n });\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 400);\n }\n });\n\n authenticated.post('/api/browser/extension/install', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cacheDir = typeof input.cacheDir === 'string' && input.cacheDir.trim()\n ? input.cacheDir.trim()\n : undefined;\n const force = input.force === true;\n\n try {\n const { ensureBrowserExtensionArtifacts, browserExtDoctor } = await import(\n '../../../browser/providers/browser-ext-install.js'\n );\n const result = await ensureBrowserExtensionArtifacts({ cacheDir, force });\n const doctor = await browserExtDoctor({ cacheDir });\n return c.json({ ok: true, payload: { ...result, doctor } });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n authenticated.post('/api/browser/extension/open', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cacheDir = typeof input.cacheDir === 'string' && input.cacheDir.trim()\n ? input.cacheDir.trim()\n : undefined;\n const actionRaw = typeof input.action === 'string' ? input.action.trim() : 'both';\n const action =\n actionRaw === 'chrome' || actionRaw === 'folder' || actionRaw === 'both' ? actionRaw : 'both';\n\n try {\n const { openBrowserExtensionInstallUi } = await import(\n '../../../browser/providers/browser-ext-install.js'\n );\n const result = await openBrowserExtensionInstallUi({ action, cacheDir });\n return c.json({ ok: true, payload: result });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n // Start the extension WS bridge eagerly so the user can pair the extension\n // before saving config / running any tool. Idempotent (returns current state\n // if already running).\n authenticated.post('/api/browser/extension/start', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const port =\n typeof input.port === 'number' && input.port >= 1024 && input.port <= 65535\n ? Math.floor(input.port)\n : DEFAULT_EXTENSION_PORT;\n const hostRaw = typeof input.host === 'string' && input.host.trim() ? input.host.trim() : DEFAULT_EXTENSION_HOST;\n if (!isLoopbackHost(hostRaw)) {\n return c.json({ ok: false, error: 'extension bridge host must be loopback' }, 400);\n }\n\n try {\n if (manualExtensionHandle && (manualExtensionHandle.host !== hostRaw || manualExtensionHandle.port !== port)) {\n await manualExtensionHandle.release();\n manualExtensionHandle = null;\n }\n if (!manualExtensionHandle) {\n const { acquireExtensionBrowserServer } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n const { release } = await acquireExtensionBrowserServer({ host: hostRaw, port });\n manualExtensionHandle = { release, host: hostRaw, port };\n }\n return c.json({ ok: true, payload: { running: true, host: hostRaw, port } });\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : String(e) }, 500);\n }\n });\n\n authenticated.post('/api/browser/extension/stop', strictRateLimitMiddleware, async (c) => {\n try {\n const { forcedShutdown } = await stopExtensionBridgeFromSettings(service);\n return c.json({\n ok: true,\n payload: { running: false, forcedShutdown },\n });\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : String(e) }, 500);\n }\n });\n\n authenticated.post('/api/browser/extension/disconnect', strictRateLimitMiddleware, async (c) => {\n try {\n const { getExtensionBrowserProvider } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n const provider = getExtensionBrowserProvider();\n if (!provider?.isConnected()) {\n return c.json({\n ok: true,\n payload: { connected: false, alreadyDisconnected: true },\n });\n }\n provider.disconnectClient();\n return c.json({ ok: true, payload: { connected: false } });\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : String(e) }, 500);\n }\n });\n\n // Doctor: does Playwright have a runnable Chromium on disk?\n authenticated.get('/api/browser/playwright/doctor', async (c) => {\n try {\n const { playwrightChromiumDoctor } = await import('../../../browser/providers/playwright-doctor.js');\n const payload = await playwrightChromiumDoctor();\n return c.json({ ok: true, payload });\n } catch (e) {\n return c.json(\n { ok: false, error: e instanceof Error ? e.message : String(e) },\n 500,\n );\n }\n });\n\n // Doctor: CloakBrowser installed?\n authenticated.get('/api/browser/cloakbrowser/doctor', async (c) => {\n const cacheDirRaw = c.req.query('cacheDir');\n const binaryPathRaw = c.req.query('binaryPath');\n try {\n const { cloakBrowserDoctor } = await import('../../../browser/providers/cloakbrowser.js');\n const status = await cloakBrowserDoctor({\n cacheDir: cacheDirRaw && cacheDirRaw.trim() ? cacheDirRaw.trim() : undefined,\n binaryPath: binaryPathRaw && binaryPathRaw.trim() ? binaryPathRaw.trim() : undefined,\n });\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 400);\n }\n });\n\n // Runtime status for CloakBrowser (CDP port + profile dir from saved agent defaults).\n authenticated.get('/api/browser/cloakbrowser/status', async (c) => {\n try {\n const { cloakBrowserConfigFromAgentDefaults } = await import('../../../browser/backend-from-config.js');\n const { probeCloakBrowserRuntime } = await import('../../../browser/providers/cloakbrowser.js');\n const config = cloakBrowserConfigFromAgentDefaults(service.currentConfig as Config);\n const status = await probeCloakBrowserRuntime(config);\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n // Open CloakBrowser with the same profile/settings agents use (saved config, headed).\n authenticated.post('/api/browser/cloakbrowser/launch', strictRateLimitMiddleware, async (c) => {\n try {\n const { cloakBrowserConfigFromAgentDefaults } = await import('../../../browser/backend-from-config.js');\n const { launchCloakBrowser } = await import('../../../browser/providers/cloakbrowser.js');\n const config = cloakBrowserConfigFromAgentDefaults(service.currentConfig as Config);\n const result = await launchCloakBrowser({\n ...config,\n skipPlaywrightConnect: true,\n });\n return c.json({\n ok: true,\n payload: {\n running: true,\n reused: result.reused,\n port: result.cdpPort,\n pid: result.pid,\n userDataDir: result.userDataDir,\n temporaryProfile: config.temporaryProfile === true,\n },\n });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n // Ping a user-supplied CDP endpoint — loopback only (SSRF guard).\n authenticated.post('/api/browser/cdp/ping', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ ok: false, error: 'invalid JSON body' }, 400);\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cdpUrl = typeof input.cdpUrl === 'string' ? input.cdpUrl.trim() : '';\n if (!cdpUrl) return c.json({ ok: false, error: 'cdpUrl is required' }, 400);\n\n const loopback = loopbackHostnameFromUrl(cdpUrl);\n if (!loopback) {\n return c.json(\n { ok: false, error: 'CDP ping only allowed for loopback hosts (127.0.0.1 / localhost / ::1)' },\n 403,\n );\n }\n let httpBase: URL;\n try {\n httpBase = new URL(cdpUrl);\n httpBase.protocol = httpBase.protocol === 'wss:' ? 'https:' : 'http:';\n httpBase.pathname = '/json/version';\n httpBase.search = '';\n httpBase.hash = '';\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : 'invalid cdpUrl' }, 400);\n }\n try {\n const res = await fetch(httpBase.toString(), { signal: AbortSignal.timeout(2000) });\n if (!res.ok) {\n return c.json({ ok: true, payload: { reachable: false, status: res.status } });\n }\n const data = (await res.json()) as { Browser?: string; 'Protocol-Version'?: string; webSocketDebuggerUrl?: string };\n return c.json({\n ok: true,\n payload: {\n reachable: true,\n browser: data.Browser ?? null,\n protocolVersion: data['Protocol-Version'] ?? null,\n webSocketDebuggerUrl: data.webSocketDebuggerUrl ?? null,\n },\n });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: true, payload: { reachable: false, error: message } });\n }\n });\n\n // Spawn a local debuggable Chrome and return its WS endpoint.\n authenticated.post('/api/browser/cdp/launch', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const executablePath =\n typeof input.executablePath === 'string' && input.executablePath.trim()\n ? input.executablePath.trim()\n : undefined;\n try {\n const { launchLocalCdpChrome } = await import('../../../browser/cdp-local-launcher.js');\n const result = await launchLocalCdpChrome({ executablePath });\n return c.json({ ok: true, payload: result });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n authenticated.post('/api/browser/cdp/stop', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ ok: false, error: 'invalid JSON body' }, 400);\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const port = typeof input.port === 'number' && Number.isInteger(input.port) ? input.port : NaN;\n if (!Number.isFinite(port) || port < 1024 || port > 65535) {\n return c.json({ ok: false, error: 'port must be an integer in [1024, 65535]' }, 400);\n }\n const { stopLocalCdpChrome } = await import('../../../browser/cdp-local-launcher.js');\n const stopped = await stopLocalCdpChrome(port);\n return c.json({ ok: true, payload: { stopped } });\n });\n\n authenticated.get('/api/browser/cdp/instances', async (c) => {\n const { listLocalCdpInstances } = await import('../../../browser/cdp-local-launcher.js');\n return c.json({ ok: true, payload: { instances: listLocalCdpInstances() } });\n });\n\n // Cloud provider connection test.\n authenticated.post('/api/browser/cloud/test-connection', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ ok: false, error: 'invalid JSON body' }, 400);\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const provider = input.provider;\n const apiKeyRaw = typeof input.apiKey === 'string' ? input.apiKey.trim() : '';\n\n // The masked sentinel means \"use the stored config key\".\n let apiKey = apiKeyRaw;\n if (apiKey === '***' || apiKey === '••••••••••••') {\n apiKey = '';\n }\n if (!apiKey) {\n if (provider === 'browserbase') apiKey = process.env.BROWSERBASE_API_KEY ?? '';\n else if (provider === 'browser-use') apiKey = process.env.BROWSER_USE_API_KEY ?? '';\n }\n if (!apiKey) {\n return c.json({ ok: true, payload: { reachable: false, error: 'No API key configured' } });\n }\n\n try {\n if (provider === 'browserbase') {\n const res = await fetch('https://api.browserbase.com/v1/projects', {\n headers: { 'x-bb-api-key': apiKey },\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) {\n return c.json({\n ok: true,\n payload: { reachable: false, status: res.status, error: await res.text().catch(() => '') },\n });\n }\n const data = (await res.json().catch(() => null)) as unknown;\n const projects = Array.isArray(data) ? data : Array.isArray((data as { data?: unknown[] })?.data) ? (data as { data: unknown[] }).data : [];\n return c.json({ ok: true, payload: { reachable: true, projectCount: projects.length } });\n }\n if (provider === 'browser-use') {\n const res = await fetch('https://api.browser-use.com/api/v1/users/me', {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) {\n return c.json({\n ok: true,\n payload: { reachable: false, status: res.status, error: await res.text().catch(() => '') },\n });\n }\n return c.json({ ok: true, payload: { reachable: true } });\n }\n return c.json({ ok: false, error: 'provider must be browserbase or browser-use' }, 400);\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: true, payload: { reachable: false, error: message } });\n }\n });\n\n authenticated.post('/api/browser/playwright/install', strictRateLimitMiddleware, async (c) => {\n try {\n const { installPlaywrightChromium } = await import('../../../browser/providers/playwright-install.js');\n const payload = await installPlaywrightChromium();\n return c.json({ ok: true, payload });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message || 'Failed to install Playwright Chromium' }, 500);\n }\n });\n\n authenticated.post('/api/browser/cloakbrowser/install', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cacheDir = typeof input.cacheDir === 'string' && input.cacheDir.trim()\n ? input.cacheDir.trim()\n : undefined;\n const binaryPath = typeof input.binaryPath === 'string' && input.binaryPath.trim()\n ? input.binaryPath.trim()\n : undefined;\n\n try {\n const { installCloakBrowser } = await import('../../../browser/providers/cloakbrowser.js');\n const status = await installCloakBrowser({ cacheDir, binaryPath });\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n}\n"],"mappings":";;AAuBA,MAAM,yBAAyB;AAC/B,MAAM,yBAAyB;AAS/B,IAAI,wBAA6C;AAEjD,SAAS,wBAAwB,OAA8B;CAC7D,IAAI;AACJ,KAAI;AACF,WAAS,IAAI,IAAI,MAAM;SACjB;AACN,SAAO;;CAET,MAAM,QAAQ,OAAO;AACrB,KAAI,UAAU,SAAS,UAAU,UAAU,UAAU,WAAW,UAAU,SACxE,QAAO;CAET,MAAM,OAAO,OAAO,SAAS,aAAa;AAC1C,KAAI,SAAS,eAAe,SAAS,eAAe,SAAS,MAAO,QAAO;AAC3E,QAAO;;AAGT,SAAS,eAAe,MAAuB;CAC7C,MAAM,IAAI,KAAK,MAAM,CAAC,aAAa;AACnC,QAAO,MAAM,eAAe,MAAM,eAAe,MAAM,SAAS,MAAM;;AAGxE,SAAS,wBAAwB,KAA6C;AAC5E,KAAI,CAAC,IAAK,QAAO,KAAA;CACjB,MAAM,IAAI,OAAO,SAAS,KAAK,GAAG;AAClC,KAAI,CAAC,OAAO,SAAS,EAAE,IAAI,IAAI,QAAQ,IAAI,MAAQ,QAAO,KAAA;AAC1D,QAAO;;AAGT,SAAS,mBAAmB,MAAc,MAAc,YAAY,KAAuB;AACzF,QAAO,IAAI,SAAS,YAAY;EAC9B,MAAM,SAAS,IAAI,QAAQ;GAAE;GAAM;GAAM,CAAC;EAC1C,MAAM,UAAU,SAAkB;AAChC,UAAO,oBAAoB;AAC3B,OAAI;AACF,WAAO,SAAS;WACV;AAGR,WAAQ,KAAK;;AAEf,SAAO,WAAW,UAAU;AAC5B,SAAO,KAAK,iBAAiB,OAAO,KAAK,CAAC;AAC1C,SAAO,KAAK,iBAAiB,OAAO,MAAM,CAAC;AAC3C,SAAO,KAAK,eAAe,OAAO,MAAM,CAAC;GACzC;;AAGJ,eAAe,8BAA8B;CAC3C,MAAM,EAAE,sCAAsC,MAAM,OAClD;AAEF,QAAO,mCAAmC;;AAG5C,eAAe,gCAAgC,SAE5C;AACD,KAAI,uBAAuB;AACzB,MAAI;AACF,SAAM,sBAAsB,SAAS;UAC/B;AAGR,0BAAwB;;AAE1B,OAAM,QAAQ,+BAA+B;CAC7C,MAAM,EAAE,wCAAwC,MAAM,OACpD;AAGF,QAAO,EAAE,gBAAA,MADoB,qCAAqC,EACzC;;AAG3B,SAAS,6BACP,SACA,OACwD;CACxD,MAAM,UAAU,OAAO,SAAS,YAAY,WAAW,QAAQ,UAAU;CACzE,MAAM,QAAQ,MAAM,UAAU,OAAO,MAAM,UAAU;AACrD,KAAI,CAAC,SAAS,YAAY,YACxB,QAAO;CAGT,MAAM,MAAM,SAAS;CACrB,MAAM,aACJ,OAAO,KAAK,SAAS,YAAY,IAAI,QAAQ,QAAQ,IAAI,QAAQ,QAC7D,KAAK,MAAM,IAAI,KAAK,GACpB;CACN,MAAM,aACJ,OAAO,KAAK,SAAS,YAAY,IAAI,KAAK,MAAM,GAAG,IAAI,KAAK,MAAM,GAAG;CAEvE,MAAM,OAAO,wBAAwB,MAAM,KAAK,IAAI;CACpD,MAAM,OACJ,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,MAAM,GAAG,MAAM,KAAK,MAAM,GAAG;AAC5E,KAAI,CAAC,eAAe,KAAK,CACvB,QAAO;AAGT,QAAO;EAAE;EAAM;EAAM,SAAS,SAAS,YAAY,cAAc,cAAc;EAAS;;AAG1F,SAAgB,sBAAsB,eAAqB,MAAoC;CAC7F,MAAM,EAAE,SAAS,8BAA8B;AAG/C,eAAc,IAAI,iCAAiC,OAAO,MAAM;EAC9D,MAAM,SAAS,6BAA6B,KAAA,GAAW;GACrD,OAAO,EAAE,IAAI,MAAM,QAAQ;GAC3B,MAAM,EAAE,IAAI,MAAM,OAAO;GACzB,MAAM,EAAE,IAAI,MAAM,OAAO;GAC1B,CAAC;EAEF,IAAI;AACJ,MAAI;GACF,MAAM,EAAE,qBAAqB,MAAM,OAAO;GAC1C,MAAM,SAAS,MAAM,kBAAkB;AACvC,eAAY;IACV,WAAW,OAAO;IAClB,cAAc,OAAO;IACrB,aAAa,OAAO;IACpB,kBAAkB,OAAO;IACzB,cAAc,OAAO;IACrB,mBAAmB,OAAO;IAC3B;UACK;AAIR,MAAI,CAAC,OAEH,QAAO,EAAE,KAAK;GAAE,SAAS;GAAO,WAAW;GAAO,SAAA;GAAS;GAAW,CAAC;EAEzE,MAAM,WAAW,MAAM,6BAA6B;EACpD,IAAI,eAAe;EACnB,IAAI,iBAAiB;AACrB,MAAI;GAEF,MAAM,OAAQ,OAAM,MADF,MAAM,UAAU,OAAO,KAAK,GAAG,OAAO,KAAK,IAAI,EAAE,QAAQ,YAAY,QAAQ,IAAK,EAAE,CAAC,EAC/E,MAAM;AAC9B,kBAAe,QAAQ,KAAK,GAAG;AAC/B,oBAAiB,QAAQ,KAAK,UAAU;UAClC;EAGR,MAAM,UAAU,gBAAgB,SAAS;EACzC,MAAM,eACJ,CAAC,WAAW,CAAC,SAAS,SAClB,MAAM,mBAAmB,OAAO,MAAM,OAAO,KAAK,GAClD;AACN,SAAO,EAAE,KAAK;GACZ;GACA,WAAW;GACX,SAAS,OAAO;GAChB;GACA,YAAY,SAAS;GACrB,UAAU,SAAS;GACnB,cAAc,0BAA0B;GACxC;GACD,CAAC;GACF;AAEF,eAAc,IAAI,iCAAiC,OAAO,MAAM;EAC9D,MAAM,cAAc,EAAE,IAAI,MAAM,WAAW;AAC3C,MAAI;GACF,MAAM,EAAE,qBAAqB,MAAM,OAAO;GAC1C,MAAM,SAAS,MAAM,iBAAiB,EACpC,UAAU,eAAe,YAAY,MAAM,GAAG,YAAY,MAAM,GAAG,KAAA,GACpE,CAAC;AACF,UAAO,EAAE,KAAK;IAAE,IAAI;IAAM,SAAS;IAAQ,CAAC;WACrC,GAAG;GACV,MAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AAC1D,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO;IAAS,EAAE,IAAI;;GAEnD;AAEF,eAAc,KAAK,kCAAkC,2BAA2B,OAAO,MAAM;EAC3F,IAAI;AACJ,MAAI;AACF,UAAO,MAAM,EAAE,IAAI,MAAM;UACnB;AACN,UAAO,EAAE;;EAEX,MAAM,QAAQ,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,KAAK,GACjE,OACD,EAAE;EACN,MAAM,WAAW,OAAO,MAAM,aAAa,YAAY,MAAM,SAAS,MAAM,GACxE,MAAM,SAAS,MAAM,GACrB,KAAA;EACJ,MAAM,QAAQ,MAAM,UAAU;AAE9B,MAAI;GACF,MAAM,EAAE,iCAAiC,qBAAqB,MAAM,OAClE;GAEF,MAAM,SAAS,MAAM,gCAAgC;IAAE;IAAU;IAAO,CAAC;GACzE,MAAM,SAAS,MAAM,iBAAiB,EAAE,UAAU,CAAC;AACnD,UAAO,EAAE,KAAK;IAAE,IAAI;IAAM,SAAS;KAAE,GAAG;KAAQ;KAAQ;IAAE,CAAC;WACpD,GAAG;GACV,MAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AAC1D,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO;IAAS,EAAE,IAAI;;GAEnD;AAEF,eAAc,KAAK,+BAA+B,2BAA2B,OAAO,MAAM;EACxF,IAAI;AACJ,MAAI;AACF,UAAO,MAAM,EAAE,IAAI,MAAM;UACnB;AACN,UAAO,EAAE;;EAEX,MAAM,QAAQ,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,KAAK,GACjE,OACD,EAAE;EACN,MAAM,WAAW,OAAO,MAAM,aAAa,YAAY,MAAM,SAAS,MAAM,GACxE,MAAM,SAAS,MAAM,GACrB,KAAA;EACJ,MAAM,YAAY,OAAO,MAAM,WAAW,WAAW,MAAM,OAAO,MAAM,GAAG;EAC3E,MAAM,SACJ,cAAc,YAAY,cAAc,YAAY,cAAc,SAAS,YAAY;AAEzF,MAAI;GACF,MAAM,EAAE,kCAAkC,MAAM,OAC9C;GAEF,MAAM,SAAS,MAAM,8BAA8B;IAAE;IAAQ;IAAU,CAAC;AACxE,UAAO,EAAE,KAAK;IAAE,IAAI;IAAM,SAAS;IAAQ,CAAC;WACrC,GAAG;GACV,MAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AAC1D,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO;IAAS,EAAE,IAAI;;GAEnD;AAKF,eAAc,KAAK,gCAAgC,2BAA2B,OAAO,MAAM;EACzF,IAAI;AACJ,MAAI;AACF,UAAO,MAAM,EAAE,IAAI,MAAM;UACnB;AACN,UAAO,EAAE;;EAEX,MAAM,QAAQ,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,KAAK,GACjE,OACD,EAAE;EACN,MAAM,OACJ,OAAO,MAAM,SAAS,YAAY,MAAM,QAAQ,QAAQ,MAAM,QAAQ,QAClE,KAAK,MAAM,MAAM,KAAK,GACtB;EACN,MAAM,UAAU,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,MAAM,GAAG,MAAM,KAAK,MAAM,GAAG;AAC1F,MAAI,CAAC,eAAe,QAAQ,CAC1B,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO;GAA0C,EAAE,IAAI;AAGpF,MAAI;AACF,OAAI,0BAA0B,sBAAsB,SAAS,WAAW,sBAAsB,SAAS,OAAO;AAC5G,UAAM,sBAAsB,SAAS;AACrC,4BAAwB;;AAE1B,OAAI,CAAC,uBAAuB;IAC1B,MAAM,EAAE,kCAAkC,MAAM,OAC9C;IAEF,MAAM,EAAE,YAAY,MAAM,8BAA8B;KAAE,MAAM;KAAS;KAAM,CAAC;AAChF,4BAAwB;KAAE;KAAS,MAAM;KAAS;KAAM;;AAE1D,UAAO,EAAE,KAAK;IAAE,IAAI;IAAM,SAAS;KAAE,SAAS;KAAM,MAAM;KAAS;KAAM;IAAE,CAAC;WACrE,GAAG;AACV,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;IAAE,EAAE,IAAI;;GAEtF;AAEF,eAAc,KAAK,+BAA+B,2BAA2B,OAAO,MAAM;AACxF,MAAI;GACF,MAAM,EAAE,mBAAmB,MAAM,gCAAgC,QAAQ;AACzE,UAAO,EAAE,KAAK;IACZ,IAAI;IACJ,SAAS;KAAE,SAAS;KAAO;KAAgB;IAC5C,CAAC;WACK,GAAG;AACV,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;IAAE,EAAE,IAAI;;GAEtF;AAEF,eAAc,KAAK,qCAAqC,2BAA2B,OAAO,MAAM;AAC9F,MAAI;GACF,MAAM,EAAE,gCAAgC,MAAM,OAC5C;GAEF,MAAM,WAAW,6BAA6B;AAC9C,OAAI,CAAC,UAAU,aAAa,CAC1B,QAAO,EAAE,KAAK;IACZ,IAAI;IACJ,SAAS;KAAE,WAAW;KAAO,qBAAqB;KAAM;IACzD,CAAC;AAEJ,YAAS,kBAAkB;AAC3B,UAAO,EAAE,KAAK;IAAE,IAAI;IAAM,SAAS,EAAE,WAAW,OAAO;IAAE,CAAC;WACnD,GAAG;AACV,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;IAAE,EAAE,IAAI;;GAEtF;AAGF,eAAc,IAAI,kCAAkC,OAAO,MAAM;AAC/D,MAAI;GACF,MAAM,EAAE,6BAA6B,MAAM,OAAO;GAClD,MAAM,UAAU,MAAM,0BAA0B;AAChD,UAAO,EAAE,KAAK;IAAE,IAAI;IAAM;IAAS,CAAC;WAC7B,GAAG;AACV,UAAO,EAAE,KACP;IAAE,IAAI;IAAO,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;IAAE,EAChE,IACD;;GAEH;AAGF,eAAc,IAAI,oCAAoC,OAAO,MAAM;EACjE,MAAM,cAAc,EAAE,IAAI,MAAM,WAAW;EAC3C,MAAM,gBAAgB,EAAE,IAAI,MAAM,aAAa;AAC/C,MAAI;GACF,MAAM,EAAE,uBAAuB,MAAM,OAAO;GAC5C,MAAM,SAAS,MAAM,mBAAmB;IACtC,UAAU,eAAe,YAAY,MAAM,GAAG,YAAY,MAAM,GAAG,KAAA;IACnE,YAAY,iBAAiB,cAAc,MAAM,GAAG,cAAc,MAAM,GAAG,KAAA;IAC5E,CAAC;AACF,UAAO,EAAE,KAAK;IAAE,IAAI;IAAM,SAAS;IAAQ,CAAC;WACrC,GAAG;GACV,MAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AAC1D,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO;IAAS,EAAE,IAAI;;GAEnD;AAGF,eAAc,IAAI,oCAAoC,OAAO,MAAM;AACjE,MAAI;GACF,MAAM,EAAE,wCAAwC,MAAM,OAAO;GAC7D,MAAM,EAAE,6BAA6B,MAAM,OAAO;GAElD,MAAM,SAAS,MAAM,yBADN,oCAAoC,QAAQ,cACP,CAAC;AACrD,UAAO,EAAE,KAAK;IAAE,IAAI;IAAM,SAAS;IAAQ,CAAC;WACrC,GAAG;GACV,MAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AAC1D,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO;IAAS,EAAE,IAAI;;GAEnD;AAGF,eAAc,KAAK,oCAAoC,2BAA2B,OAAO,MAAM;AAC7F,MAAI;GACF,MAAM,EAAE,wCAAwC,MAAM,OAAO;GAC7D,MAAM,EAAE,uBAAuB,MAAM,OAAO;GAC5C,MAAM,SAAS,oCAAoC,QAAQ,cAAwB;GACnF,MAAM,SAAS,MAAM,mBAAmB;IACtC,GAAG;IACH,uBAAuB;IACxB,CAAC;AACF,UAAO,EAAE,KAAK;IACZ,IAAI;IACJ,SAAS;KACP,SAAS;KACT,QAAQ,OAAO;KACf,MAAM,OAAO;KACb,KAAK,OAAO;KACZ,aAAa,OAAO;KACpB,kBAAkB,OAAO,qBAAqB;KAC/C;IACF,CAAC;WACK,GAAG;GACV,MAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AAC1D,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO;IAAS,EAAE,IAAI;;GAEnD;AAGF,eAAc,KAAK,yBAAyB,2BAA2B,OAAO,MAAM;EAClF,IAAI;AACJ,MAAI;AACF,UAAO,MAAM,EAAE,IAAI,MAAM;UACnB;AACN,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO;IAAqB,EAAE,IAAI;;EAE/D,MAAM,QAAQ,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,KAAK,GACjE,OACD,EAAE;EACN,MAAM,SAAS,OAAO,MAAM,WAAW,WAAW,MAAM,OAAO,MAAM,GAAG;AACxE,MAAI,CAAC,OAAQ,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO;GAAsB,EAAE,IAAI;AAG3E,MAAI,CADa,wBAAwB,OAC5B,CACX,QAAO,EAAE,KACP;GAAE,IAAI;GAAO,OAAO;GAA0E,EAC9F,IACD;EAEH,IAAI;AACJ,MAAI;AACF,cAAW,IAAI,IAAI,OAAO;AAC1B,YAAS,WAAW,SAAS,aAAa,SAAS,WAAW;AAC9D,YAAS,WAAW;AACpB,YAAS,SAAS;AAClB,YAAS,OAAO;WACT,GAAG;AACV,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,aAAa,QAAQ,EAAE,UAAU;IAAkB,EAAE,IAAI;;AAE7F,MAAI;GACF,MAAM,MAAM,MAAM,MAAM,SAAS,UAAU,EAAE,EAAE,QAAQ,YAAY,QAAQ,IAAK,EAAE,CAAC;AACnF,OAAI,CAAC,IAAI,GACP,QAAO,EAAE,KAAK;IAAE,IAAI;IAAM,SAAS;KAAE,WAAW;KAAO,QAAQ,IAAI;KAAQ;IAAE,CAAC;GAEhF,MAAM,OAAQ,MAAM,IAAI,MAAM;AAC9B,UAAO,EAAE,KAAK;IACZ,IAAI;IACJ,SAAS;KACP,WAAW;KACX,SAAS,KAAK,WAAW;KACzB,iBAAiB,KAAK,uBAAuB;KAC7C,sBAAsB,KAAK,wBAAwB;KACpD;IACF,CAAC;WACK,GAAG;GACV,MAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AAC1D,UAAO,EAAE,KAAK;IAAE,IAAI;IAAM,SAAS;KAAE,WAAW;KAAO,OAAO;KAAS;IAAE,CAAC;;GAE5E;AAGF,eAAc,KAAK,2BAA2B,2BAA2B,OAAO,MAAM;EACpF,IAAI;AACJ,MAAI;AACF,UAAO,MAAM,EAAE,IAAI,MAAM;UACnB;AACN,UAAO,EAAE;;EAEX,MAAM,QAAQ,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,KAAK,GACjE,OACD,EAAE;EACN,MAAM,iBACJ,OAAO,MAAM,mBAAmB,YAAY,MAAM,eAAe,MAAM,GACnE,MAAM,eAAe,MAAM,GAC3B,KAAA;AACN,MAAI;GACF,MAAM,EAAE,yBAAyB,MAAM,OAAO;GAC9C,MAAM,SAAS,MAAM,qBAAqB,EAAE,gBAAgB,CAAC;AAC7D,UAAO,EAAE,KAAK;IAAE,IAAI;IAAM,SAAS;IAAQ,CAAC;WACrC,GAAG;GACV,MAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AAC1D,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO;IAAS,EAAE,IAAI;;GAEnD;AAEF,eAAc,KAAK,yBAAyB,2BAA2B,OAAO,MAAM;EAClF,IAAI;AACJ,MAAI;AACF,UAAO,MAAM,EAAE,IAAI,MAAM;UACnB;AACN,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO;IAAqB,EAAE,IAAI;;EAE/D,MAAM,QAAQ,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,KAAK,GACjE,OACD,EAAE;EACN,MAAM,OAAO,OAAO,MAAM,SAAS,YAAY,OAAO,UAAU,MAAM,KAAK,GAAG,MAAM,OAAO;AAC3F,MAAI,CAAC,OAAO,SAAS,KAAK,IAAI,OAAO,QAAQ,OAAO,MAClD,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO;GAA4C,EAAE,IAAI;EAEtF,MAAM,EAAE,uBAAuB,MAAM,OAAO;EAC5C,MAAM,UAAU,MAAM,mBAAmB,KAAK;AAC9C,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,EAAE,SAAS;GAAE,CAAC;GACjD;AAEF,eAAc,IAAI,8BAA8B,OAAO,MAAM;EAC3D,MAAM,EAAE,0BAA0B,MAAM,OAAO;AAC/C,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,EAAE,WAAW,uBAAuB,EAAE;GAAE,CAAC;GAC5E;AAGF,eAAc,KAAK,sCAAsC,2BAA2B,OAAO,MAAM;EAC/F,IAAI;AACJ,MAAI;AACF,UAAO,MAAM,EAAE,IAAI,MAAM;UACnB;AACN,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO;IAAqB,EAAE,IAAI;;EAE/D,MAAM,QAAQ,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,KAAK,GACjE,OACD,EAAE;EACN,MAAM,WAAW,MAAM;EAIvB,IAAI,SAHc,OAAO,MAAM,WAAW,WAAW,MAAM,OAAO,MAAM,GAAG;AAI3E,MAAI,WAAW,SAAS,WAAW,eACjC,UAAS;AAEX,MAAI,CAAC;OACC,aAAa,cAAe,UAAS,QAAQ,IAAI,uBAAuB;YACnE,aAAa,cAAe,UAAS,QAAQ,IAAI,uBAAuB;;AAEnF,MAAI,CAAC,OACH,QAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS;IAAE,WAAW;IAAO,OAAO;IAAyB;GAAE,CAAC;AAG5F,MAAI;AACF,OAAI,aAAa,eAAe;IAC9B,MAAM,MAAM,MAAM,MAAM,2CAA2C;KACjE,SAAS,EAAE,gBAAgB,QAAQ;KACnC,QAAQ,YAAY,QAAQ,IAAK;KAClC,CAAC;AACF,QAAI,CAAC,IAAI,GACP,QAAO,EAAE,KAAK;KACZ,IAAI;KACJ,SAAS;MAAE,WAAW;MAAO,QAAQ,IAAI;MAAQ,OAAO,MAAM,IAAI,MAAM,CAAC,YAAY,GAAG;MAAE;KAC3F,CAAC;IAEJ,MAAM,OAAQ,MAAM,IAAI,MAAM,CAAC,YAAY,KAAK;IAChD,MAAM,WAAW,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM,QAAS,MAA+B,KAAK,GAAI,KAA6B,OAAO,EAAE;AAC3I,WAAO,EAAE,KAAK;KAAE,IAAI;KAAM,SAAS;MAAE,WAAW;MAAM,cAAc,SAAS;MAAQ;KAAE,CAAC;;AAE1F,OAAI,aAAa,eAAe;IAC9B,MAAM,MAAM,MAAM,MAAM,+CAA+C;KACrE,SAAS,EAAE,eAAe,UAAU,UAAU;KAC9C,QAAQ,YAAY,QAAQ,IAAK;KAClC,CAAC;AACF,QAAI,CAAC,IAAI,GACP,QAAO,EAAE,KAAK;KACZ,IAAI;KACJ,SAAS;MAAE,WAAW;MAAO,QAAQ,IAAI;MAAQ,OAAO,MAAM,IAAI,MAAM,CAAC,YAAY,GAAG;MAAE;KAC3F,CAAC;AAEJ,WAAO,EAAE,KAAK;KAAE,IAAI;KAAM,SAAS,EAAE,WAAW,MAAM;KAAE,CAAC;;AAE3D,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO;IAA+C,EAAE,IAAI;WAChF,GAAG;GACV,MAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AAC1D,UAAO,EAAE,KAAK;IAAE,IAAI;IAAM,SAAS;KAAE,WAAW;KAAO,OAAO;KAAS;IAAE,CAAC;;GAE5E;AAEF,eAAc,KAAK,mCAAmC,2BAA2B,OAAO,MAAM;AAC5F,MAAI;GACF,MAAM,EAAE,8BAA8B,MAAM,OAAO;GACnD,MAAM,UAAU,MAAM,2BAA2B;AACjD,UAAO,EAAE,KAAK;IAAE,IAAI;IAAM;IAAS,CAAC;WAC7B,GAAG;GACV,MAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AAC1D,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO,WAAW;IAAyC,EAAE,IAAI;;GAE9F;AAEF,eAAc,KAAK,qCAAqC,2BAA2B,OAAO,MAAM;EAC9F,IAAI;AACJ,MAAI;AACF,UAAO,MAAM,EAAE,IAAI,MAAM;UACnB;AACN,UAAO,EAAE;;EAEX,MAAM,QAAQ,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,KAAK,GACjE,OACD,EAAE;EACN,MAAM,WAAW,OAAO,MAAM,aAAa,YAAY,MAAM,SAAS,MAAM,GACxE,MAAM,SAAS,MAAM,GACrB,KAAA;EACJ,MAAM,aAAa,OAAO,MAAM,eAAe,YAAY,MAAM,WAAW,MAAM,GAC9E,MAAM,WAAW,MAAM,GACvB,KAAA;AAEJ,MAAI;GACF,MAAM,EAAE,wBAAwB,MAAM,OAAO;GAC7C,MAAM,SAAS,MAAM,oBAAoB;IAAE;IAAU;IAAY,CAAC;AAClE,UAAO,EAAE,KAAK;IAAE,IAAI;IAAM,SAAS;IAAQ,CAAC;WACrC,GAAG;GACV,MAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AAC1D,UAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO;IAAS,EAAE,IAAI;;GAEnD"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { CapabilityPresetSchema, init_schema } from "../../../agent-manifest/schema.js";
|
|
2
|
+
import { init_agent_scope, normalizeAgentId } from "../../../agent/agent-scope.js";
|
|
3
|
+
import { listCapabilityPresets, prepareCreateCapabilityPreset, prepareDeleteCapabilityPreset, prepareUpdateCapabilityPreset } from "../../capability-presets-admin.js";
|
|
4
|
+
//#region src/gateway/hono/routes/capability-presets.ts
|
|
5
|
+
init_schema();
|
|
6
|
+
init_agent_scope();
|
|
7
|
+
function parseJsonObject(raw) {
|
|
8
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw)) return { error: "body must be an object" };
|
|
9
|
+
return raw;
|
|
10
|
+
}
|
|
11
|
+
function isParseError(value) {
|
|
12
|
+
return typeof value === "object" && value !== null && "error" in value && typeof value.error === "string";
|
|
13
|
+
}
|
|
14
|
+
function parseCreateBody(raw) {
|
|
15
|
+
const body = parseJsonObject(raw);
|
|
16
|
+
if (isParseError(body)) return body;
|
|
17
|
+
return {
|
|
18
|
+
id: typeof body.id === "string" ? body.id : void 0,
|
|
19
|
+
name: typeof body.name === "string" ? body.name : void 0,
|
|
20
|
+
description: typeof body.description === "string" ? body.description : void 0
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function parseUpdateBody(raw) {
|
|
24
|
+
const body = parseJsonObject(raw);
|
|
25
|
+
if (isParseError(body)) return body;
|
|
26
|
+
const out = {};
|
|
27
|
+
if (Object.hasOwn(body, "name")) out.name = String(body.name ?? "");
|
|
28
|
+
if (Object.hasOwn(body, "description")) out.description = body.description === null ? null : String(body.description ?? "");
|
|
29
|
+
if (Object.hasOwn(body, "version")) out.version = Number(body.version);
|
|
30
|
+
for (const key of [
|
|
31
|
+
"extends",
|
|
32
|
+
"models",
|
|
33
|
+
"tools",
|
|
34
|
+
"skills",
|
|
35
|
+
"memory",
|
|
36
|
+
"workflows",
|
|
37
|
+
"boundaries",
|
|
38
|
+
"runtime",
|
|
39
|
+
"locks"
|
|
40
|
+
]) {
|
|
41
|
+
if (!Object.hasOwn(body, key)) continue;
|
|
42
|
+
if (body[key] === null) {
|
|
43
|
+
out[key] = null;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const parsed = CapabilityPresetSchema.pick({ [key]: true }).safeParse({ [key]: body[key] });
|
|
47
|
+
if (!parsed.success) return { error: `${key} ${parsed.error.issues[0]?.message ?? "is invalid"}` };
|
|
48
|
+
out[key] = parsed.data[key];
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
function registerCapabilityPresetsRoutes(authenticated, deps) {
|
|
53
|
+
const { service, strictRateLimitMiddleware } = deps;
|
|
54
|
+
authenticated.get("/api/capability-presets", async (c) => {
|
|
55
|
+
return c.json({
|
|
56
|
+
ok: true,
|
|
57
|
+
payload: listCapabilityPresets(service.currentConfig)
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
authenticated.post("/api/capability-presets", strictRateLimitMiddleware, async (c) => {
|
|
61
|
+
let raw;
|
|
62
|
+
try {
|
|
63
|
+
raw = await c.req.json();
|
|
64
|
+
} catch {
|
|
65
|
+
return c.json({
|
|
66
|
+
ok: false,
|
|
67
|
+
error: { message: "Invalid JSON" }
|
|
68
|
+
}, 400);
|
|
69
|
+
}
|
|
70
|
+
const body = parseCreateBody(raw);
|
|
71
|
+
if (isParseError(body)) return c.json({
|
|
72
|
+
ok: false,
|
|
73
|
+
error: { message: body.error }
|
|
74
|
+
}, 400);
|
|
75
|
+
const prep = prepareCreateCapabilityPreset(service.currentConfig, body);
|
|
76
|
+
if (prep.ok === false) return c.json({
|
|
77
|
+
ok: false,
|
|
78
|
+
error: { message: prep.error }
|
|
79
|
+
}, prep.status ?? 400);
|
|
80
|
+
const save = await service.saveConfig(prep.data.nextConfig);
|
|
81
|
+
if (!save.saved) return c.json({
|
|
82
|
+
ok: false,
|
|
83
|
+
error: { message: save.error ?? "save failed" }
|
|
84
|
+
}, 500);
|
|
85
|
+
return c.json({
|
|
86
|
+
ok: true,
|
|
87
|
+
payload: {
|
|
88
|
+
presetId: prep.data.presetId,
|
|
89
|
+
presets: listCapabilityPresets(service.currentConfig)
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
authenticated.patch("/api/capability-presets/:id", strictRateLimitMiddleware, async (c) => {
|
|
94
|
+
const id = normalizeAgentId(c.req.param("id") ?? "");
|
|
95
|
+
let raw;
|
|
96
|
+
try {
|
|
97
|
+
raw = await c.req.json();
|
|
98
|
+
} catch {
|
|
99
|
+
return c.json({
|
|
100
|
+
ok: false,
|
|
101
|
+
error: { message: "Invalid JSON" }
|
|
102
|
+
}, 400);
|
|
103
|
+
}
|
|
104
|
+
const body = parseUpdateBody(raw);
|
|
105
|
+
if (isParseError(body)) return c.json({
|
|
106
|
+
ok: false,
|
|
107
|
+
error: { message: body.error }
|
|
108
|
+
}, 400);
|
|
109
|
+
const prep = prepareUpdateCapabilityPreset(service.currentConfig, id, body);
|
|
110
|
+
if (prep.ok === false) return c.json({
|
|
111
|
+
ok: false,
|
|
112
|
+
error: { message: prep.error }
|
|
113
|
+
}, prep.status ?? 400);
|
|
114
|
+
const save = await service.saveConfig(prep.data.nextConfig);
|
|
115
|
+
if (!save.saved) return c.json({
|
|
116
|
+
ok: false,
|
|
117
|
+
error: { message: save.error ?? "save failed" }
|
|
118
|
+
}, 500);
|
|
119
|
+
return c.json({
|
|
120
|
+
ok: true,
|
|
121
|
+
payload: listCapabilityPresets(service.currentConfig)
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
authenticated.delete("/api/capability-presets/:id", strictRateLimitMiddleware, async (c) => {
|
|
125
|
+
const id = normalizeAgentId(c.req.param("id") ?? "");
|
|
126
|
+
const prep = prepareDeleteCapabilityPreset(service.currentConfig, id);
|
|
127
|
+
if (prep.ok === false) return c.json({
|
|
128
|
+
ok: false,
|
|
129
|
+
error: { message: prep.error }
|
|
130
|
+
}, prep.status ?? 400);
|
|
131
|
+
const save = await service.saveConfig(prep.data.nextConfig);
|
|
132
|
+
if (!save.saved) return c.json({
|
|
133
|
+
ok: false,
|
|
134
|
+
error: { message: save.error ?? "save failed" }
|
|
135
|
+
}, 500);
|
|
136
|
+
return c.json({
|
|
137
|
+
ok: true,
|
|
138
|
+
payload: listCapabilityPresets(service.currentConfig)
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
//#endregion
|
|
143
|
+
export { registerCapabilityPresetsRoutes };
|
|
144
|
+
|
|
145
|
+
//# sourceMappingURL=capability-presets.js.map
|
|
@@ -0,0 +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 return {\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}\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":"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"}
|
|
@@ -141,17 +141,16 @@ function registerCommandsSkillsRoutes(authenticated, deps) {
|
|
|
141
141
|
}, 502);
|
|
142
142
|
}
|
|
143
143
|
});
|
|
144
|
-
authenticated.get("/api/skills/marketplace/provider", (c) => {
|
|
145
|
-
const info = service.marketplace.getSkillsProvider();
|
|
144
|
+
authenticated.get("/api/skills/marketplace/provider", async (c) => {
|
|
145
|
+
const info = await service.marketplace.getSkillsProvider();
|
|
146
146
|
return c.json({
|
|
147
147
|
ok: true,
|
|
148
148
|
payload: info
|
|
149
149
|
});
|
|
150
150
|
});
|
|
151
151
|
/** All registered marketplace providers (built-in + extension-contributed). */
|
|
152
|
-
authenticated.get("/api/skills/marketplace/providers", (c) => {
|
|
153
|
-
const providers = service.marketplace.getSkillsProviders();
|
|
154
|
-
const current = service.marketplace.getSkillsProvider();
|
|
152
|
+
authenticated.get("/api/skills/marketplace/providers", async (c) => {
|
|
153
|
+
const [providers, current] = await Promise.all([service.marketplace.getSkillsProviders(), service.marketplace.getSkillsProvider()]);
|
|
155
154
|
return c.json({
|
|
156
155
|
ok: true,
|
|
157
156
|
payload: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands-skills.js","names":[],"sources":["../../../../../src/gateway/hono/routes/commands-skills.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { commandRegistry } from '../../../chat-commands/index.js';\nimport { isRegisteredProvider } from '../../../agent/skills/skills-marketplace.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction parseMarketplaceProviderQuery(raw: string | undefined): string | undefined {\n const v = raw?.trim().toLowerCase();\n if (v && isRegisteredProvider(v)) return v;\n return undefined;\n}\n\nexport function registerCommandsSkillsRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service } = deps;\n\n // ========== Chat slash commands (CommandRegistry) ==========\n\n authenticated.get('/api/commands', (c) => {\n const all = commandRegistry.list();\n const commands = all\n .filter((cmd) => cmd.scope.includes('global') || cmd.scope.includes('private'))\n .map((cmd) => ({\n id: cmd.id,\n name: cmd.name,\n aliases: cmd.aliases ?? [],\n description: cmd.description,\n category: cmd.category,\n scope: cmd.scope,\n acceptsArgs: cmd.acceptsArgs ?? false,\n examples: cmd.examples ?? [],\n }));\n const extensionCommands = all\n .filter((cmd) => cmd.category === 'extension')\n .map((cmd) => ({\n id: cmd.id,\n name: cmd.name,\n description: cmd.description,\n extensionId: cmd.id.startsWith('ext.') ? cmd.id.split('.')[1] : undefined,\n }));\n return c.json({ ok: true, payload: { commands, extensionCommands } });\n });\n\n // ========== Skills (managed global skills under ~/.xopc/skills) ==========\n\n authenticated.get('/api/chat/skills', (c) => {\n const agentId = c.req.query('agentId')?.trim() || service.getConfig().agents?.default || 'main';\n const payload = service.marketplace.getAgentSkillsApi(agentId);\n return c.json({ ok: true, payload });\n });\n\n authenticated.get('/api/skills', (c) => {\n const payload = service.marketplace.getSkillsApi();\n return c.json({ ok: true, payload });\n });\n\n authenticated.get('/api/skills/status', (c) => {\n const payload = service.marketplace.getSkillsStatusApi();\n return c.json({ ok: true, payload });\n });\n\n authenticated.get('/api/skills/:skillName/content', (c) => {\n const raw = c.req.param('skillName');\n if (!raw) {\n return c.json({ ok: false, error: 'Missing skill name' }, 400);\n }\n let skillName: string;\n try {\n skillName = decodeURIComponent(raw);\n } catch {\n return c.json({ ok: false, error: 'Invalid skill name' }, 400);\n }\n const data = service.marketplace.getSkillMarkdownSource(skillName);\n if (!data) {\n return c.json({ ok: false, error: 'Skill not found' }, 404);\n }\n return c.json({ ok: true, payload: data });\n });\n\n authenticated.post('/api/skills/reload', (c) => {\n service.marketplace.reloadSkills();\n return c.json({ ok: true });\n });\n\n authenticated.patch('/api/skills/enabled', async (c) => {\n let body: { skillName?: unknown; enabled?: unknown };\n try {\n body = (await c.req.json()) as { skillName?: unknown; enabled?: unknown };\n } catch {\n return c.json({ ok: false, error: 'Invalid JSON' }, 400);\n }\n const skillName = typeof body.skillName === 'string' ? body.skillName.trim() : '';\n const enabled = body.enabled;\n if (!skillName || typeof enabled !== 'boolean') {\n return c.json({ ok: false, error: 'Expected { skillName: string, enabled: boolean }' }, 400);\n }\n try {\n service.marketplace.patchSkillEnabled(skillName, enabled);\n return c.json({ ok: true });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Update failed' },\n 400,\n );\n }\n });\n\n authenticated.get('/api/skills/marketplace', async (c) => {\n const q = c.req.query('q')?.trim() ?? '';\n const pageRaw = c.req.query('page');\n const pageSizeRaw = c.req.query('pageSize');\n const sortRaw = c.req.query('sort');\n const page = pageRaw != null && pageRaw !== '' ? Math.max(1, Number(pageRaw) || 1) : undefined;\n const pageSize =\n pageSizeRaw != null && pageSizeRaw !== ''\n ? Math.min(50, Math.max(1, Number(pageSizeRaw) || 20))\n : undefined;\n const sort =\n sortRaw === 'newest' || sortRaw === 'downloads' ? sortRaw : undefined;\n const category = c.req.query('category')?.trim() ?? '';\n const provider = parseMarketplaceProviderQuery(c.req.query('provider'));\n try {\n const payload = await service.marketplace.fetchSkillsCatalog(\n {\n q: q || undefined,\n page,\n pageSize,\n sort,\n category: category || undefined,\n },\n provider,\n );\n return c.json({ ok: true, payload });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Marketplace request failed' },\n 502,\n );\n }\n });\n\n authenticated.get('/api/skills/marketplace/provider', (c) => {\n const info = service.marketplace.getSkillsProvider();\n return c.json({ ok: true, payload: info });\n });\n\n /** All registered marketplace providers (built-in + extension-contributed). */\n authenticated.get('/api/skills/marketplace/providers', (c) => {\n const providers = service.marketplace.getSkillsProviders();\n const current = service.marketplace.getSkillsProvider();\n return c.json({ ok: true, payload: { providers, current: current.provider } });\n });\n\n authenticated.get('/api/skills/marketplace/categories', async (c) => {\n const provider = parseMarketplaceProviderQuery(c.req.query('provider'));\n try {\n const payload = await service.marketplace.fetchSkillsCategories(provider);\n return c.json({ ok: true, payload });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Marketplace categories failed' },\n 502,\n );\n }\n });\n\n authenticated.get('/api/skills/marketplace/packages/:pkgName', async (c) => {\n const raw = c.req.param('pkgName');\n if (!raw) {\n return c.json({ ok: false, error: 'Missing package name' }, 400);\n }\n let pkgName: string;\n try {\n pkgName = decodeURIComponent(raw);\n } catch {\n return c.json({ ok: false, error: 'Invalid package name' }, 400);\n }\n try {\n const provider = parseMarketplaceProviderQuery(c.req.query('provider'));\n const payload = await service.marketplace.fetchSkillsPackageDetail(pkgName, provider);\n return c.json({ ok: true, payload });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Marketplace request failed' },\n 502,\n );\n }\n });\n\n authenticated.post('/api/skills/marketplace/install', async (c) => {\n let body: { name?: unknown; version?: unknown; overwrite?: unknown; provider?: unknown };\n try {\n body = (await c.req.json()) as typeof body;\n } catch {\n return c.json({ ok: false, error: 'Invalid JSON' }, 400);\n }\n const name = typeof body.name === 'string' ? body.name.trim() : '';\n const version = typeof body.version === 'string' ? body.version.trim() : undefined;\n const overwrite =\n body.overwrite === true ||\n body.overwrite === 'true' ||\n body.overwrite === '1';\n const provider = parseMarketplaceProviderQuery(\n typeof body.provider === 'string' ? body.provider : undefined,\n );\n if (!name) {\n return c.json({ ok: false, error: 'Expected { name: string, version?: string, overwrite?: boolean }' }, 400);\n }\n try {\n const payload = await service.marketplace.installSkill({ name, version, overwrite, provider });\n return c.json({ ok: true, payload });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Install failed' },\n 400,\n );\n }\n });\n\n authenticated.post('/api/skills/upload', async (c) => {\n let body: Record<string, unknown>;\n try {\n body = await c.req.parseBody({ all: true });\n } catch {\n return c.json({ ok: false, error: 'Invalid multipart body' }, 400);\n }\n const file = body['file'];\n if (!file || typeof file !== 'object') {\n return c.json({ ok: false, error: 'Missing file field' }, 400);\n }\n let buf: Buffer;\n if (file instanceof File) {\n buf = Buffer.from(await file.arrayBuffer());\n } else if (typeof (file as Blob).arrayBuffer === 'function') {\n buf = Buffer.from(await (file as Blob).arrayBuffer());\n } else {\n return c.json({ ok: false, error: 'Invalid file upload' }, 400);\n }\n const skillIdRaw = body['skillId'];\n const overwriteRaw = body['overwrite'];\n const skillId = typeof skillIdRaw === 'string' && skillIdRaw.trim() ? skillIdRaw.trim() : undefined;\n const overwrite =\n overwriteRaw === 'true' ||\n overwriteRaw === true ||\n overwriteRaw === '1';\n\n try {\n const result = service.marketplace.installSkillZip(buf, { skillId, overwrite });\n return c.json({ ok: true, payload: result });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Install failed' },\n 400,\n );\n }\n });\n\n authenticated.delete('/api/skills/:id', (c) => {\n const id = c.req.param('id');\n if (!id) {\n return c.json({ ok: false, error: 'Missing id' }, 400);\n }\n try {\n service.marketplace.deleteSkill(id);\n return c.json({ ok: true });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Delete failed' },\n 400,\n );\n }\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"commands-skills.js","names":[],"sources":["../../../../../src/gateway/hono/routes/commands-skills.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { commandRegistry } from '../../../chat-commands/index.js';\nimport { isRegisteredProvider } from '../../../agent/skills/skills-marketplace.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction parseMarketplaceProviderQuery(raw: string | undefined): string | undefined {\n const v = raw?.trim().toLowerCase();\n if (v && isRegisteredProvider(v)) return v;\n return undefined;\n}\n\nexport function registerCommandsSkillsRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service } = deps;\n\n // ========== Chat slash commands (CommandRegistry) ==========\n\n authenticated.get('/api/commands', (c) => {\n const all = commandRegistry.list();\n const commands = all\n .filter((cmd) => cmd.scope.includes('global') || cmd.scope.includes('private'))\n .map((cmd) => ({\n id: cmd.id,\n name: cmd.name,\n aliases: cmd.aliases ?? [],\n description: cmd.description,\n category: cmd.category,\n scope: cmd.scope,\n acceptsArgs: cmd.acceptsArgs ?? false,\n examples: cmd.examples ?? [],\n }));\n const extensionCommands = all\n .filter((cmd) => cmd.category === 'extension')\n .map((cmd) => ({\n id: cmd.id,\n name: cmd.name,\n description: cmd.description,\n extensionId: cmd.id.startsWith('ext.') ? cmd.id.split('.')[1] : undefined,\n }));\n return c.json({ ok: true, payload: { commands, extensionCommands } });\n });\n\n // ========== Skills (managed global skills under ~/.xopc/skills) ==========\n\n authenticated.get('/api/chat/skills', (c) => {\n const agentId = c.req.query('agentId')?.trim() || service.getConfig().agents?.default || 'main';\n const payload = service.marketplace.getAgentSkillsApi(agentId);\n return c.json({ ok: true, payload });\n });\n\n authenticated.get('/api/skills', (c) => {\n const payload = service.marketplace.getSkillsApi();\n return c.json({ ok: true, payload });\n });\n\n authenticated.get('/api/skills/status', (c) => {\n const payload = service.marketplace.getSkillsStatusApi();\n return c.json({ ok: true, payload });\n });\n\n authenticated.get('/api/skills/:skillName/content', (c) => {\n const raw = c.req.param('skillName');\n if (!raw) {\n return c.json({ ok: false, error: 'Missing skill name' }, 400);\n }\n let skillName: string;\n try {\n skillName = decodeURIComponent(raw);\n } catch {\n return c.json({ ok: false, error: 'Invalid skill name' }, 400);\n }\n const data = service.marketplace.getSkillMarkdownSource(skillName);\n if (!data) {\n return c.json({ ok: false, error: 'Skill not found' }, 404);\n }\n return c.json({ ok: true, payload: data });\n });\n\n authenticated.post('/api/skills/reload', (c) => {\n service.marketplace.reloadSkills();\n return c.json({ ok: true });\n });\n\n authenticated.patch('/api/skills/enabled', async (c) => {\n let body: { skillName?: unknown; enabled?: unknown };\n try {\n body = (await c.req.json()) as { skillName?: unknown; enabled?: unknown };\n } catch {\n return c.json({ ok: false, error: 'Invalid JSON' }, 400);\n }\n const skillName = typeof body.skillName === 'string' ? body.skillName.trim() : '';\n const enabled = body.enabled;\n if (!skillName || typeof enabled !== 'boolean') {\n return c.json({ ok: false, error: 'Expected { skillName: string, enabled: boolean }' }, 400);\n }\n try {\n service.marketplace.patchSkillEnabled(skillName, enabled);\n return c.json({ ok: true });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Update failed' },\n 400,\n );\n }\n });\n\n authenticated.get('/api/skills/marketplace', async (c) => {\n const q = c.req.query('q')?.trim() ?? '';\n const pageRaw = c.req.query('page');\n const pageSizeRaw = c.req.query('pageSize');\n const sortRaw = c.req.query('sort');\n const page = pageRaw != null && pageRaw !== '' ? Math.max(1, Number(pageRaw) || 1) : undefined;\n const pageSize =\n pageSizeRaw != null && pageSizeRaw !== ''\n ? Math.min(50, Math.max(1, Number(pageSizeRaw) || 20))\n : undefined;\n const sort =\n sortRaw === 'newest' || sortRaw === 'downloads' ? sortRaw : undefined;\n const category = c.req.query('category')?.trim() ?? '';\n const provider = parseMarketplaceProviderQuery(c.req.query('provider'));\n try {\n const payload = await service.marketplace.fetchSkillsCatalog(\n {\n q: q || undefined,\n page,\n pageSize,\n sort,\n category: category || undefined,\n },\n provider,\n );\n return c.json({ ok: true, payload });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Marketplace request failed' },\n 502,\n );\n }\n });\n\n authenticated.get('/api/skills/marketplace/provider', async (c) => {\n const info = await service.marketplace.getSkillsProvider();\n return c.json({ ok: true, payload: info });\n });\n\n /** All registered marketplace providers (built-in + extension-contributed). */\n authenticated.get('/api/skills/marketplace/providers', async (c) => {\n const [providers, current] = await Promise.all([\n service.marketplace.getSkillsProviders(),\n service.marketplace.getSkillsProvider(),\n ]);\n return c.json({ ok: true, payload: { providers, current: current.provider } });\n });\n\n authenticated.get('/api/skills/marketplace/categories', async (c) => {\n const provider = parseMarketplaceProviderQuery(c.req.query('provider'));\n try {\n const payload = await service.marketplace.fetchSkillsCategories(provider);\n return c.json({ ok: true, payload });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Marketplace categories failed' },\n 502,\n );\n }\n });\n\n authenticated.get('/api/skills/marketplace/packages/:pkgName', async (c) => {\n const raw = c.req.param('pkgName');\n if (!raw) {\n return c.json({ ok: false, error: 'Missing package name' }, 400);\n }\n let pkgName: string;\n try {\n pkgName = decodeURIComponent(raw);\n } catch {\n return c.json({ ok: false, error: 'Invalid package name' }, 400);\n }\n try {\n const provider = parseMarketplaceProviderQuery(c.req.query('provider'));\n const payload = await service.marketplace.fetchSkillsPackageDetail(pkgName, provider);\n return c.json({ ok: true, payload });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Marketplace request failed' },\n 502,\n );\n }\n });\n\n authenticated.post('/api/skills/marketplace/install', async (c) => {\n let body: { name?: unknown; version?: unknown; overwrite?: unknown; provider?: unknown };\n try {\n body = (await c.req.json()) as typeof body;\n } catch {\n return c.json({ ok: false, error: 'Invalid JSON' }, 400);\n }\n const name = typeof body.name === 'string' ? body.name.trim() : '';\n const version = typeof body.version === 'string' ? body.version.trim() : undefined;\n const overwrite =\n body.overwrite === true ||\n body.overwrite === 'true' ||\n body.overwrite === '1';\n const provider = parseMarketplaceProviderQuery(\n typeof body.provider === 'string' ? body.provider : undefined,\n );\n if (!name) {\n return c.json({ ok: false, error: 'Expected { name: string, version?: string, overwrite?: boolean }' }, 400);\n }\n try {\n const payload = await service.marketplace.installSkill({ name, version, overwrite, provider });\n return c.json({ ok: true, payload });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Install failed' },\n 400,\n );\n }\n });\n\n authenticated.post('/api/skills/upload', async (c) => {\n let body: Record<string, unknown>;\n try {\n body = await c.req.parseBody({ all: true });\n } catch {\n return c.json({ ok: false, error: 'Invalid multipart body' }, 400);\n }\n const file = body['file'];\n if (!file || typeof file !== 'object') {\n return c.json({ ok: false, error: 'Missing file field' }, 400);\n }\n let buf: Buffer;\n if (file instanceof File) {\n buf = Buffer.from(await file.arrayBuffer());\n } else if (typeof (file as Blob).arrayBuffer === 'function') {\n buf = Buffer.from(await (file as Blob).arrayBuffer());\n } else {\n return c.json({ ok: false, error: 'Invalid file upload' }, 400);\n }\n const skillIdRaw = body['skillId'];\n const overwriteRaw = body['overwrite'];\n const skillId = typeof skillIdRaw === 'string' && skillIdRaw.trim() ? skillIdRaw.trim() : undefined;\n const overwrite =\n overwriteRaw === 'true' ||\n overwriteRaw === true ||\n overwriteRaw === '1';\n\n try {\n const result = service.marketplace.installSkillZip(buf, { skillId, overwrite });\n return c.json({ ok: true, payload: result });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Install failed' },\n 400,\n );\n }\n });\n\n authenticated.delete('/api/skills/:id', (c) => {\n const id = c.req.param('id');\n if (!id) {\n return c.json({ ok: false, error: 'Missing id' }, 400);\n }\n try {\n service.marketplace.deleteSkill(id);\n return c.json({ ok: true });\n } catch (err) {\n return c.json(\n { ok: false, error: err instanceof Error ? err.message : 'Delete failed' },\n 400,\n );\n }\n });\n}\n"],"mappings":"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"}
|
|
@@ -1,18 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `PATCH /api/config` — `body.agents.defaults.*` section.
|
|
3
|
-
*
|
|
4
|
-
* Mutates `config.agents.defaults` in place to match the patch body. All
|
|
5
|
-
* branches are field-by-field "if undefined skip, if null delete, else
|
|
6
|
-
* coerce/validate then assign" so the web UI can clear individual settings
|
|
7
|
-
* with `{ field: null }` without rewriting the rest.
|
|
8
|
-
*
|
|
9
|
-
* Was 660 lines inlined in `config.ts` (40% of the route handler) — extracted
|
|
10
|
-
* so the dispatcher can chain section patchers instead of being a single 1600
|
|
11
|
-
* -line if-else cascade.
|
|
12
|
-
*
|
|
13
|
-
* **No early returns / errors.** This section never rejects the patch; out-of
|
|
14
|
-
* -range numbers and unrecognized strings are silently dropped (preserves
|
|
15
|
-
* pre-extraction behavior so the route stays a "best-effort merge").
|
|
16
|
-
*/
|
|
17
1
|
import type { Config } from '../../../../config/schema.js';
|
|
18
|
-
export declare function applyAgentsPatch(
|
|
2
|
+
export declare function applyAgentsPatch(_config: Config, body: any): void;
|