@xopcai/xopc 0.0.118 → 0.0.120
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/README.zh-CN.md +2 -1
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-dzUrQoeZ.js → agent-avatar-dicebear-APTlX9Sq.js} +1 -1
- package/dist/gateway/static/root/assets/agents-CFW_FS_V.js +2 -0
- package/dist/gateway/static/root/assets/app-management-settings-panel-DTKc5HHT.js +1 -0
- package/dist/gateway/static/root/assets/appearance-settings-BTciFrE9.js +1 -0
- package/dist/gateway/static/root/assets/{apps-page--wMEL00f.js → apps-page-DT52OrbM.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-Cki4SfU2.js → archive-plugin-CiHaUMII.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-D-KnS2Do.js → attachment-load-t4gSrNjL.js} +1 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-CtysjSoQ.js +1 -0
- package/dist/gateway/static/root/assets/automations-page-B2YvT3ES.js +1 -0
- package/dist/gateway/static/root/assets/{binary-plugins-D2sgvJja.js → binary-plugins-BAbSldW5.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-DIq-4Gvb.js → block-editor-BNr_82xl.js} +28 -28
- package/dist/gateway/static/root/assets/browser-settings-page-BQEXPhDU.js +8 -0
- package/dist/gateway/static/root/assets/capability-presets-api-tzD702Gg.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-AGhTueAc.js +1 -0
- package/dist/gateway/static/root/assets/channel-recipient-api-DL_KzwGE.js +1 -0
- package/dist/gateway/static/root/assets/channels-settings-DRTutLlN.js +1 -0
- package/dist/gateway/static/root/assets/cn-BQ_8x0bT.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-DneJVuge.js +2 -0
- package/dist/gateway/static/root/assets/cron-expression-B3B1eqnr.js +2 -0
- package/dist/gateway/static/root/assets/dreaming-settings-BEwWA1yf.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-DYu1KaFQ.js → extension-debug-page-Dl2kO0Sf.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-B3W6QwlZ.js → extension-page-DmbLPsx_.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-D7VQ-cxE.js → extension-settings-page-BS2rx40e.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-B7xDPu-R.js → fetch-B3ME5Eri.js} +1 -1
- package/dist/gateway/static/root/assets/format-cron-label-arqgGlVV.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-config-api-BTBLSeUu.js → gateway-config-api-DI9_BBTo.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-DAFI_T0W.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-CYj9FWCp.js → gateway-startup-retry-CSZQTz6K.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-DLuz4jC9.js +1 -0
- package/dist/gateway/static/root/assets/{goals-config-api-CQQgzPr3.js → goals-config-api-Bhzqrp2w.js} +1 -1
- package/dist/gateway/static/root/assets/{goals-page-BHitvJAv.js → goals-page-DTAfv9Ft.js} +2 -2
- package/dist/gateway/static/root/assets/goals-settings-CWN2iirQ.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-settings-CkkkHvOi.js +1 -0
- package/dist/gateway/static/root/assets/index-CnjzMw5i.js +191 -0
- package/dist/gateway/static/root/assets/index-E1QinYKp.css +1 -0
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-kMp08SlX.js +1 -0
- package/dist/gateway/static/root/assets/{locale-store-DjbfSsfA.js → locale-store-Ba72bFmP.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-C2Uqvae9.js → logs-page-CDXDlS_W.js} +2 -2
- package/dist/gateway/static/root/assets/{markdown-split-BwOFrJ2E.js → markdown-split-Bc0w40vz.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-Cnz6Q5G6.js → media-plugins-DJ_HvgIy.js} +1 -1
- package/dist/gateway/static/root/assets/messages-CISb1HLv.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-BTwxMIgZ.js +2 -0
- package/dist/gateway/static/root/assets/note-detail-page-BBfOeB0m.js +2 -0
- package/dist/gateway/static/root/assets/{note-image-lightbox-B-Svpmza.js → note-image-lightbox-4zntqpZq.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-VocWOjoK.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-Bss4TiwP.js → preview-open-alternatives-BbA7sRd_.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CXwjuD_Q.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-BRNjdgKq.js → save-bar-controls-Dividh61.js} +1 -1
- package/dist/gateway/static/root/assets/schedule-field-pRheF2CO.js +1 -0
- package/dist/gateway/static/root/assets/{schema-form-Dub9sy8r.js → schema-form-D6PiPxfr.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-CpcVySQK.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BVy_TawT.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-BeFLavGi.js → settings-collapsible-section-BMCOfuE_.js} +1 -1
- package/dist/gateway/static/root/assets/settings-form-section-DBkGwpIN.js +1 -0
- package/dist/gateway/static/root/assets/settings-page-CZpNyCWn.js +1 -0
- package/dist/gateway/static/root/assets/settings-page-layout-NxoW5Y57.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-MVHLLu_a.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-C8glrdqe.js → share-preview-page-B0suFCfj.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-C6DBbQGo.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-6hJmhwSn.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-Im1MA0Iw.js +2 -0
- package/dist/gateway/static/root/assets/system-settings-panel-CrmEnyX4.js +1 -0
- package/dist/gateway/static/root/assets/{theme-store-CD2wtgZV.js → theme-store-Bt6vAkSB.js} +1 -1
- package/dist/gateway/static/root/assets/typed-models-lib-BAsGn25g.js +1 -0
- package/dist/gateway/static/root/assets/{use-channel-catalog-DqlWTsDb.js → use-channel-catalog-C7vcAoGb.js} +1 -1
- package/dist/gateway/static/root/assets/user-profile-settings-panel-QAQWGelF.js +1 -0
- package/dist/gateway/static/root/assets/utils-Dl9efgnV.js +1 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-C73IVZeC.js → voice-api-key-field-D-6XueTv.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-player-store-C_ArLJPM.js → voice-player-store-CMC5NOJp.js} +1 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-DVPllR4k.js +3 -0
- package/dist/gateway/static/root/assets/workflows-page-B94WISTW.js +18 -0
- package/dist/gateway/static/root/index.html +8 -9
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +4 -5
- package/dist/src/agent/agent-manager.js +4 -8
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/context/workspace-templates/AGENTS.md +3 -2
- package/dist/src/agent/embedded/run-for-session.js +102 -14
- package/dist/src/agent/embedded/run-for-session.js.map +1 -1
- package/dist/src/agent/fallback/candidates.d.ts +0 -8
- package/dist/src/agent/fallback/candidates.js.map +1 -1
- package/dist/src/agent/index.js +1 -1
- package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -3
- package/dist/src/agent/lifecycle/handlers/compaction.js +1 -16
- package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
- package/dist/src/agent/lifecycle/progress.d.ts +0 -1
- package/dist/src/agent/lifecycle/progress.js +1 -6
- package/dist/src/agent/lifecycle/progress.js.map +1 -1
- package/dist/src/agent/lifecycle/timeout-wrapper.d.ts +1 -2
- package/dist/src/agent/lifecycle/timeout-wrapper.js +1 -7
- package/dist/src/agent/lifecycle/timeout-wrapper.js.map +1 -1
- package/dist/src/agent/memory/builtin-memory-store.d.ts +1 -1
- package/dist/src/agent/memory/builtin-memory-store.js +1 -1
- package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
- package/dist/src/agent/memory/builtin-provider.d.ts +2 -2
- package/dist/src/agent/memory/builtin-provider.js +2 -2
- package/dist/src/agent/memory/builtin-provider.js.map +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.d.ts +0 -7
- package/dist/src/agent/memory/dreaming/light-sweep.js +16 -277
- package/dist/src/agent/memory/dreaming/light-sweep.js.map +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.d.ts +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js.map +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.d.ts +3 -3
- package/dist/src/agent/memory/dreaming/short-term-store.js +5 -5
- package/dist/src/agent/memory/dreaming/short-term-store.js.map +1 -1
- package/dist/src/agent/memory/dreaming/utils.d.ts +2 -2
- package/dist/src/agent/memory/dreaming/utils.js +2 -2
- package/dist/src/agent/memory/dreaming/utils.js.map +1 -1
- package/dist/src/agent/memory/index.d.ts +0 -2
- package/dist/src/agent/memory/index.js +1 -2
- package/dist/src/agent/middleware/self-verify.d.ts +0 -1
- package/dist/src/agent/middleware/self-verify.js +0 -2
- package/dist/src/agent/middleware/self-verify.js.map +1 -1
- package/dist/src/agent/models/index.d.ts +1 -1
- package/dist/src/agent/models/manager.d.ts +4 -20
- package/dist/src/agent/models/manager.js +9 -126
- package/dist/src/agent/models/manager.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.d.ts +0 -4
- package/dist/src/agent/orchestration/agent-orchestrator.js +1 -9
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/prompt/sections/memory-skills.js +11 -10
- package/dist/src/agent/prompt/sections/memory-skills.js.map +1 -1
- package/dist/src/agent/prompt/sections/tooling.js +4 -4
- package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.d.ts +0 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +0 -12
- package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
- package/dist/src/agent/prompt/subagent-context.js +1 -1
- package/dist/src/agent/prompt/subagent-context.js.map +1 -1
- package/dist/src/agent/prompt/types.d.ts +1 -1
- package/dist/src/agent/reply/startup-context.js +6 -105
- package/dist/src/agent/reply/startup-context.js.map +1 -1
- package/dist/src/agent/service.d.ts +1 -12
- package/dist/src/agent/service.js +3 -81
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +2 -2
- package/dist/src/agent/session/session-config-service.d.ts +11 -11
- package/dist/src/agent/session/session-config-service.js +14 -14
- package/dist/src/agent/session/session-config-service.js.map +1 -1
- package/dist/src/agent/session/session-inspector.js +3 -2
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/starter-agents.js +12 -12
- package/dist/src/agent/starter-agents.js.map +1 -1
- package/dist/src/agent/tools/automation-tool.d.ts +14 -0
- package/dist/src/agent/tools/automation-tool.js +102 -0
- package/dist/src/agent/tools/automation-tool.js.map +1 -0
- package/dist/src/agent/tools/delegate-tool.js +1 -1
- package/dist/src/agent/tools/delegate-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +3 -3
- package/dist/src/agent/tools/factory.js +2 -2
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -1
- package/dist/src/agent/tools/index.js +2 -2
- package/dist/src/agent/tools/memory-tool.js +2 -2
- package/dist/src/agent/tools/memory-tool.js.map +1 -1
- package/dist/src/agent-manifest/resolver.d.ts +1 -0
- package/dist/src/agent-manifest/resolver.js +1 -0
- package/dist/src/agent-manifest/resolver.js.map +1 -1
- package/dist/src/agent-manifest/schema.d.ts +6 -0
- package/dist/src/agent-manifest/schema.js +12 -3
- package/dist/src/agent-manifest/schema.js.map +1 -1
- package/dist/src/ai-assist/text-assist.d.ts +1 -1
- package/dist/src/ai-assist/text-assist.js +56 -0
- package/dist/src/ai-assist/text-assist.js.map +1 -1
- package/dist/src/auth/profiles/store.js.map +1 -1
- package/dist/src/automations/api/routes.d.ts +3 -0
- package/dist/src/automations/api/routes.js +193 -0
- package/dist/src/automations/api/routes.js.map +1 -0
- package/dist/src/automations/domain/index.d.ts +3 -0
- package/dist/src/automations/domain/index.js +3 -0
- package/dist/src/automations/domain/schedule.d.ts +4 -0
- package/dist/src/automations/domain/schedule.js +37 -0
- package/dist/src/automations/domain/schedule.js.map +1 -0
- package/dist/src/automations/domain/types.d.ts +160 -0
- package/dist/src/automations/domain/validation.d.ts +370 -0
- package/dist/src/automations/domain/validation.js +149 -0
- package/dist/src/automations/domain/validation.js.map +1 -0
- package/dist/src/automations/draft/automation-draft-prompt.d.ts +26 -0
- package/dist/src/automations/draft/automation-draft-prompt.js +127 -0
- package/dist/src/automations/draft/automation-draft-prompt.js.map +1 -0
- package/dist/src/automations/draft/automation-draft-service.d.ts +12 -0
- package/dist/src/automations/draft/automation-draft-service.js +135 -0
- package/dist/src/automations/draft/automation-draft-service.js.map +1 -0
- package/dist/src/automations/draft/automation-draft-validator.d.ts +99 -0
- package/dist/src/automations/draft/automation-draft-validator.js +105 -0
- package/dist/src/automations/draft/automation-draft-validator.js.map +1 -0
- package/dist/src/automations/draft/automation-draft.types.d.ts +40 -0
- package/dist/src/automations/draft/index.d.ts +3 -0
- package/dist/src/automations/draft/index.js +3 -0
- package/dist/src/automations/index.d.ts +3 -0
- package/dist/src/automations/index.js +8 -0
- package/dist/src/automations/product-events.d.ts +5 -0
- package/dist/src/automations/product-events.js +21 -0
- package/dist/src/automations/product-events.js.map +1 -0
- package/dist/src/automations/service/action-executor.d.ts +9 -0
- package/dist/src/automations/service/action-executor.js +157 -0
- package/dist/src/automations/service/action-executor.js.map +1 -0
- package/dist/src/automations/service/automation-service.d.ts +54 -0
- package/dist/src/automations/service/automation-service.js +404 -0
- package/dist/src/automations/service/automation-service.js.map +1 -0
- package/dist/src/automations/service/index.d.ts +2 -0
- package/dist/src/automations/service/index.js +3 -0
- package/dist/src/automations/storage/automation-repository.d.ts +6 -0
- package/dist/src/automations/storage/automation-repository.js +61 -0
- package/dist/src/automations/storage/automation-repository.js.map +1 -0
- package/dist/src/automations/storage/automation-run-repository.d.ts +17 -0
- package/dist/src/automations/storage/automation-run-repository.js +130 -0
- package/dist/src/automations/storage/automation-run-repository.js.map +1 -0
- package/dist/src/automations/storage/index.d.ts +2 -0
- package/dist/src/automations/storage/index.js +3 -0
- package/dist/src/channels/plugin-types.d.ts +3 -0
- package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
- package/dist/src/cli/command-catalog.js +0 -39
- package/dist/src/cli/command-catalog.js.map +1 -1
- package/dist/src/cli/command-loaders.js +0 -1
- package/dist/src/cli/command-loaders.js.map +1 -1
- package/dist/src/cli/command-manifest.js +0 -4
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/agents.js +7 -6
- package/dist/src/cli/commands/agents.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/{cron-health.d.ts → migrations.d.ts} +1 -1
- package/dist/src/cli/commands/doctor/checks/migrations.js +40 -0
- package/dist/src/cli/commands/doctor/checks/migrations.js.map +1 -0
- package/dist/src/cli/commands/doctor/flow.js +2 -2
- package/dist/src/cli/commands/doctor/flow.js.map +1 -1
- package/dist/src/cli/commands/gateway/call.js +2 -2
- package/dist/src/cli/commands/gateway/call.js.map +1 -1
- package/dist/src/cli/commands/gateway/run-foreground.js +4 -2
- package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
- package/dist/src/cli/commands/init.js +27 -9
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/tui.js +24 -2
- package/dist/src/cli/commands/tui.js.map +1 -1
- package/dist/src/cli/templates.js +3 -2
- package/dist/src/cli/templates.js.map +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +2 -0
- package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
- package/dist/src/commands/agents.config.d.ts +9 -0
- package/dist/src/commands/agents.config.js +40 -2
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/agent-profile.js +4 -3
- package/dist/src/config/agent-profile.js.map +1 -1
- package/dist/src/config/agent-typed-models.js.map +1 -1
- package/dist/src/config/config-surface.d.ts +3 -0
- package/dist/src/config/index.d.ts +0 -1
- package/dist/src/config/index.js +3 -3
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/config/paths.d.ts +0 -9
- package/dist/src/config/paths.js +1 -14
- package/dist/src/config/paths.js.map +1 -1
- package/dist/src/config/profile.js +0 -1
- package/dist/src/config/profile.js.map +1 -1
- package/dist/src/config/rules.js +0 -5
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/config/schema.d.ts +13 -12
- package/dist/src/config/schema.js +22 -26
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/web-patch.d.ts +0 -12
- package/dist/src/config/web-patch.js +2 -29
- package/dist/src/config/web-patch.js.map +1 -1
- package/dist/src/extensions/api.d.ts +2 -0
- package/dist/src/extensions/api.js +10 -0
- package/dist/src/extensions/api.js.map +1 -1
- package/dist/src/extensions/extension-registry-impl.d.ts +4 -1
- package/dist/src/extensions/extension-registry-impl.js +8 -0
- package/dist/src/extensions/extension-registry-impl.js.map +1 -1
- package/dist/src/extensions/loader.d.ts +3 -3
- package/dist/src/extensions/loader.js +3 -3
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/extensions/sdk/testing.d.ts +2 -0
- package/dist/src/extensions/sdk/testing.js +7 -0
- package/dist/src/extensions/sdk/testing.js.map +1 -1
- package/dist/src/extensions/types/core.d.ts +10 -1
- package/dist/src/extensions/types/index.d.ts +1 -1
- package/dist/src/extensions/types/{phase4.d.ts → registration.d.ts} +2 -2
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/agent-builtin-tools.js +1 -1
- package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
- package/dist/src/gateway/agents-admin.d.ts +1 -0
- package/dist/src/gateway/agents-admin.js +13 -15
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/capability-presets-admin.d.ts +1 -0
- package/dist/src/gateway/capability-presets-admin.js +19 -10
- package/dist/src/gateway/capability-presets-admin.js.map +1 -1
- package/dist/src/gateway/dreaming-automation-reconciler.d.ts +11 -0
- package/dist/src/gateway/dreaming-automation-reconciler.js +105 -0
- package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -0
- package/dist/src/gateway/heartbeat/service.d.ts +0 -2
- package/dist/src/gateway/heartbeat/service.js +0 -7
- package/dist/src/gateway/heartbeat/service.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +5 -6
- package/dist/src/gateway/hono/lib/config-payload.js +2 -2
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +15 -6
- package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +27 -37
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/home.d.ts +2 -2
- package/dist/src/gateway/hono/routes/home.js +34 -25
- package/dist/src/gateway/hono/routes/home.js.map +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -6
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/migrations.d.ts +3 -0
- package/dist/src/gateway/hono/routes/migrations.js +35 -0
- package/dist/src/gateway/hono/routes/migrations.js.map +1 -0
- package/dist/src/gateway/hono/routes/public-gateway.js +2 -1
- package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +14 -0
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/run-loop.js +2 -0
- package/dist/src/gateway/run-loop.js.map +1 -1
- package/dist/src/gateway/security/operator-scopes.js +5 -1
- package/dist/src/gateway/security/operator-scopes.js.map +1 -1
- package/dist/src/gateway/service/config-coordinator.d.ts +4 -4
- package/dist/src/gateway/service/config-coordinator.js +14 -8
- package/dist/src/gateway/service/config-coordinator.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +2 -1
- package/dist/src/gateway/service/sessions-api.js +6 -1
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/gateway/service.d.ts +7 -3
- package/dist/src/gateway/service.js +61 -27
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/goals/goal-service.js +45 -4
- package/dist/src/goals/goal-service.js.map +1 -1
- package/dist/src/migrations/config/default-capability-preset.d.ts +10 -0
- package/dist/src/migrations/config/default-capability-preset.js +135 -0
- package/dist/src/migrations/config/default-capability-preset.js.map +1 -0
- package/dist/src/migrations/index.d.ts +4 -0
- package/dist/src/migrations/index.js +4 -0
- package/dist/src/migrations/registry.d.ts +8 -0
- package/dist/src/migrations/registry.js +18 -0
- package/dist/src/migrations/registry.js.map +1 -0
- package/dist/src/migrations/runner.d.ts +17 -0
- package/dist/src/migrations/runner.js +191 -0
- package/dist/src/migrations/runner.js.map +1 -0
- package/dist/src/migrations/types.d.ts +34 -0
- package/dist/src/notes/service.js +24 -1
- package/dist/src/notes/service.js.map +1 -1
- package/dist/src/providers/model-registry.d.ts +0 -1
- package/dist/src/providers/model-registry.js +0 -3
- package/dist/src/providers/model-registry.js.map +1 -1
- package/dist/src/routing/resolve-tui-session-key.d.ts +3 -0
- package/dist/src/routing/resolve-tui-session-key.js +14 -3
- package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
- package/dist/src/session/transcript-outline.d.ts +47 -0
- package/dist/src/session/transcript-outline.js +481 -0
- package/dist/src/session/transcript-outline.js.map +1 -0
- package/dist/src/storage/sqlite/index.d.ts +0 -2
- package/dist/src/storage/sqlite/index.js +1 -3
- package/dist/src/storage/sqlite/migrations/016_automations.sql +47 -0
- package/dist/src/storage/sqlite/migrations/017_automation_run_events.sql +14 -0
- package/dist/src/storage/sqlite/migrations/018_automation_safety.sql +1 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/row-mappers.js +3 -1
- package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/schema.sql +56 -46
- package/dist/src/tui/backends/embedded-backend.d.ts +6 -0
- package/dist/src/tui/backends/embedded-backend.js +19 -9
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +3 -0
- package/dist/src/tui/backends/gateway-sse-backend.js +14 -0
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/tui-backend.d.ts +4 -0
- package/dist/src/tui/tui-commands.d.ts +5 -0
- package/dist/src/tui/tui-commands.js +43 -0
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-transcript-tree.d.ts +1 -1
- package/dist/src/tui/tui-transcript-tree.js +17 -257
- package/dist/src/tui/tui-transcript-tree.js.map +1 -1
- package/dist/src/tui/tui-types.d.ts +2 -0
- package/dist/src/tui/tui-types.js.map +1 -1
- package/dist/src/tui/tui.js +7 -2
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/workflows/domain/index.js +1 -1
- package/dist/src/workflows/domain/run.d.ts +7 -7
- package/dist/src/workflows/domain/run.js.map +1 -1
- package/dist/src/workflows/index.js +2 -2
- package/dist/src/workflows/service/workflow-run-service.d.ts +2 -0
- package/dist/src/workflows/service/workflow-run-service.js +31 -9
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -1
- package/package.json +4 -2
- package/dist/gateway/static/root/assets/agents-BCxZbkOw.js +0 -2
- package/dist/gateway/static/root/assets/app-management-settings-panel-bxYJVJpx.js +0 -1
- package/dist/gateway/static/root/assets/appearance-settings-BCIykXlI.js +0 -1
- package/dist/gateway/static/root/assets/browser-settings-page-DRhKdn81.js +0 -8
- package/dist/gateway/static/root/assets/capability-presets-api-CorhiHlg.js +0 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-qFx9Jtce.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-BAwAkqIA.js +0 -1
- package/dist/gateway/static/root/assets/cn-JdwAhgNB.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-BQLcfitM.js +0 -2
- package/dist/gateway/static/root/assets/createLucideIcon-DPHK1VkS.js +0 -1
- package/dist/gateway/static/root/assets/cron-api-qGwmL-24.js +0 -1
- package/dist/gateway/static/root/assets/cron-dreaming-jobs-nCMWCf0p.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-BBWMAj8-.js +0 -3
- package/dist/gateway/static/root/assets/dreaming-settings-Dw89Obml.js +0 -1
- package/dist/gateway/static/root/assets/format-cron-label-BsotZDO5.js +0 -2
- package/dist/gateway/static/root/assets/format-interval-label-BzxafKxR.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-Cmwy58rS.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-l7mu5GWX.js +0 -1
- package/dist/gateway/static/root/assets/goals-settings-CYVY4NGp.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-config-api-DriO_CN9.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-CUQTKxg7.js +0 -1
- package/dist/gateway/static/root/assets/index-C17Tsd_b.css +0 -1
- package/dist/gateway/static/root/assets/index-Cc41r16l.js +0 -191
- package/dist/gateway/static/root/assets/interval-presets-DFPCKW_W.js +0 -1
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-CcVcqstx.js +0 -1
- package/dist/gateway/static/root/assets/messages-B1iSKjiw.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-BfLfcta8.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-page-BjwOQBfT.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-DktdBiwB.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-rfVx96fq.js +0 -1
- package/dist/gateway/static/root/assets/schedule-field-CUCKODde.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-DbtMFuuH.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-5re5gAnP.js +0 -1
- package/dist/gateway/static/root/assets/settings-form-section-dmyaPOTG.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-D-WMyLlj.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Cl-DEJAU.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-CyPVvbLt.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-CleTH1oz.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-Ck8hdXqR.js +0 -2
- package/dist/gateway/static/root/assets/system-settings-panel-DI-LN_8G.js +0 -1
- package/dist/gateway/static/root/assets/typed-models-lib-kX9duch4.js +0 -1
- package/dist/gateway/static/root/assets/user-profile-settings-panel-B-UFPMXy.js +0 -1
- package/dist/gateway/static/root/assets/utils-Dm0hKalR.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-BtFGp2y_.js +0 -18
- package/dist/src/agent/fallback/error.d.ts +0 -22
- package/dist/src/agent/fallback/error.js +0 -32
- package/dist/src/agent/fallback/error.js.map +0 -1
- package/dist/src/agent/fallback/index.d.ts +0 -5
- package/dist/src/agent/fallback/index.js +0 -9
- package/dist/src/agent/fallback/index.js.map +0 -1
- package/dist/src/agent/memory/memory-flush.d.ts +0 -27
- package/dist/src/agent/memory/memory-flush.js +0 -124
- package/dist/src/agent/memory/memory-flush.js.map +0 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +0 -29
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +0 -76
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +0 -1
- package/dist/src/agent/service/reconcile-dreaming-cron.d.ts +0 -6
- package/dist/src/agent/service/reconcile-dreaming-cron.js +0 -84
- package/dist/src/agent/service/reconcile-dreaming-cron.js.map +0 -1
- package/dist/src/agent/tools/cronjob-tool.d.ts +0 -29
- package/dist/src/agent/tools/cronjob-tool.js +0 -274
- package/dist/src/agent/tools/cronjob-tool.js.map +0 -1
- package/dist/src/cli/commands/cron-cli.d.ts +0 -2
- package/dist/src/cli/commands/cron-cli.js +0 -15
- package/dist/src/cli/commands/cron-cli.js.map +0 -1
- package/dist/src/cli/commands/cron.d.ts +0 -4
- package/dist/src/cli/commands/cron.js +0 -188
- package/dist/src/cli/commands/cron.js.map +0 -1
- package/dist/src/cli/commands/doctor/checks/cron-health.js +0 -35
- package/dist/src/cli/commands/doctor/checks/cron-health.js.map +0 -1
- package/dist/src/cron/execution-types.d.ts +0 -42
- package/dist/src/cron/executor.d.ts +0 -67
- package/dist/src/cron/executor.js +0 -669
- package/dist/src/cron/executor.js.map +0 -1
- package/dist/src/cron/index.d.ts +0 -7
- package/dist/src/cron/index.js +0 -7
- package/dist/src/cron/job-content.d.ts +0 -5
- package/dist/src/cron/job-content.js +0 -15
- package/dist/src/cron/job-content.js.map +0 -1
- package/dist/src/cron/run-log-store.d.ts +0 -12
- package/dist/src/cron/run-log-store.js +0 -58
- package/dist/src/cron/run-log-store.js.map +0 -1
- package/dist/src/cron/schedule.d.ts +0 -10
- package/dist/src/cron/schedule.js +0 -85
- package/dist/src/cron/schedule.js.map +0 -1
- package/dist/src/cron/service.d.ts +0 -58
- package/dist/src/cron/service.js +0 -419
- package/dist/src/cron/service.js.map +0 -1
- package/dist/src/cron/types.d.ts +0 -183
- package/dist/src/cron/validation.d.ts +0 -500
- package/dist/src/cron/validation.js +0 -192
- package/dist/src/cron/validation.js.map +0 -1
- package/dist/src/cron/workflow-run-completion.d.ts +0 -23
- package/dist/src/cron/workflow-run-completion.js +0 -72
- package/dist/src/cron/workflow-run-completion.js.map +0 -1
- package/dist/src/extensions/types/phase4.js +0 -1
- package/dist/src/gateway/hono/routes/cron.d.ts +0 -3
- package/dist/src/gateway/hono/routes/cron.js +0 -109
- package/dist/src/gateway/hono/routes/cron.js.map +0 -1
- package/dist/src/storage/sqlite/cron-job-repository.d.ts +0 -6
- package/dist/src/storage/sqlite/cron-job-repository.js +0 -70
- package/dist/src/storage/sqlite/cron-job-repository.js.map +0 -1
- package/dist/src/storage/sqlite/cron-run-repository.d.ts +0 -5
- package/dist/src/storage/sqlite/cron-run-repository.js +0 -96
- package/dist/src/storage/sqlite/cron-run-repository.js.map +0 -1
- /package/dist/src/{cron → automations/domain}/types.js +0 -0
- /package/dist/src/{config/defaults.d.ts → automations/draft/automation-draft.types.js} +0 -0
- /package/dist/src/{config/defaults.js → extensions/types/registration.js} +0 -0
- /package/dist/src/{cron/execution-types.js → migrations/types.js} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automation-service.js","names":[],"sources":["../../../../src/automations/service/automation-service.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport { createLogger } from '../../utils/logger.js';\nimport {\n computeNextAutomationRunAtMs,\n timerDelayUntil,\n} from '../domain/schedule.js';\nimport type {\n Automation,\n AutomationDeps,\n AutomationEvent,\n AutomationMetrics,\n AutomationProductEventRun,\n AutomationRun,\n AutomationRunEvent,\n AutomationRunEventType,\n AutomationRunStatus,\n} from '../domain/types.js';\nimport {\n CreateAutomationSchema,\n UpdateAutomationSchema,\n type CreateAutomationInput,\n type UpdateAutomationInput,\n AutomationSchema,\n} from '../domain/validation.js';\nimport {\n appendAutomationRunEvent,\n deleteAutomation,\n getAutomation,\n getAutomationRun,\n listAutomationRunEvents,\n listAutomationRuns,\n listAutomationRunsForProductEvent,\n listAutomations,\n saveAutomation,\n saveAutomationRun,\n saveAutomations,\n} from '../storage/index.js';\nimport { AutomationActionExecutor } from './action-executor.js';\n\nconst log = createLogger('AutomationService');\n\ntype TimerHandle = ReturnType<typeof setTimeout> & { unref?: () => void };\n\nconst DEFAULT_MAX_CONCURRENT_RUNS = 5;\nconst MISSED_RUN_STAGGER_MS = 5_000;\n\nexport class AutomationAlreadyRunningError extends Error {\n constructor(readonly automationId: string, readonly runningRunId?: string) {\n super(`Automation is already running: ${automationId}`);\n this.name = 'AutomationAlreadyRunningError';\n }\n}\n\nexport class AutomationService {\n private readonly executor = new AutomationActionExecutor();\n private timer: TimerHandle | null = null;\n private stopped = true;\n private runningScheduler = false;\n private deps: AutomationDeps = {};\n private maxConcurrentRuns = DEFAULT_MAX_CONCURRENT_RUNS;\n private readonly activeRuns = new Map<string, AbortController>();\n\n setDeps(deps: AutomationDeps): void {\n this.deps = { ...this.deps, ...deps };\n this.executor.setDeps(this.deps);\n }\n\n async initialize(options?: { maxConcurrentRuns?: number }): Promise<void> {\n this.maxConcurrentRuns = Math.max(1, Math.floor(options?.maxConcurrentRuns ?? DEFAULT_MAX_CONCURRENT_RUNS));\n this.stopped = false;\n await this.recomputeNextRuns({ catchUp: true });\n this.armTimer();\n log.info('Automation service initialized');\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n for (const controller of this.activeRuns.values()) {\n controller.abort();\n }\n log.info('Automation service stopped');\n }\n\n async create(input: CreateAutomationInput): Promise<Automation> {\n const parsed = CreateAutomationSchema.parse(input);\n const now = Date.now();\n const automation = AutomationSchema.parse({\n ...parsed,\n id: parsed.id?.trim() || randomUUID().slice(0, 12),\n enabled: parsed.enabled ?? true,\n safety: parsed.safety ?? { mode: 'auto_apply' },\n afterRun: parsed.afterRun ?? { kind: 'none' },\n state: parsed.state ?? {},\n createdAtMs: now,\n updatedAtMs: now,\n }) as Automation;\n automation.state.nextRunAtMs = computeNextAutomationRunAtMs(automation, now);\n saveAutomation(automation);\n this.armTimer();\n return automation;\n }\n\n async list(): Promise<Automation[]> {\n return listAutomations();\n }\n\n async get(id: string): Promise<Automation | null> {\n return getAutomation(id);\n }\n\n async update(id: string, patch: UpdateAutomationInput): Promise<Automation | null> {\n const parsed = UpdateAutomationSchema.parse(patch);\n const current = getAutomation(id);\n if (!current) return null;\n const now = Date.now();\n const next = AutomationSchema.parse({\n ...current,\n ...parsed,\n id: current.id,\n createdAtMs: current.createdAtMs,\n updatedAtMs: now,\n state: {\n ...current.state,\n ...(parsed.state ?? {}),\n },\n }) as Automation;\n if ('enabled' in parsed || 'trigger' in parsed) {\n next.state.nextRunAtMs = computeNextAutomationRunAtMs(next, now);\n }\n saveAutomation(next);\n this.armTimer();\n return next;\n }\n\n async remove(id: string): Promise<boolean> {\n const automation = getAutomation(id);\n if (automation?.state.runningRunId) {\n this.activeRuns.get(automation.state.runningRunId)?.abort();\n }\n const removed = deleteAutomation(id);\n if (removed) {\n this.armTimer();\n }\n return removed;\n }\n\n async pause(id: string): Promise<Automation | null> {\n return this.update(id, { enabled: false });\n }\n\n async resume(id: string): Promise<Automation | null> {\n return this.update(id, { enabled: true });\n }\n\n async runNow(id: string): Promise<AutomationRun> {\n const automation = getAutomation(id);\n if (!automation) throw new Error(`Automation not found: ${id}`);\n if (automation.state.runningRunId) {\n throw new AutomationAlreadyRunningError(id, automation.state.runningRunId);\n }\n return this.startRun(automation, { manual: true });\n }\n\n async rerunFromRun(runId: string): Promise<AutomationRun> {\n const previous = getAutomationRun(runId);\n if (!previous) throw new Error(`Automation run not found: ${runId}`);\n const automation = getAutomation(previous.automationId);\n if (!automation) throw new Error(`Automation not found: ${previous.automationId}`);\n if (automation.state.runningRunId) {\n throw new AutomationAlreadyRunningError(automation.id, automation.state.runningRunId);\n }\n const triggerEvent = listAutomationRunEvents(runId)\n .map((event) => readAutomationEventFromRunEvent(event))\n .find((event): event is AutomationEvent => event !== null);\n return this.startRun(automation, triggerEvent ? { manual: false, event: triggerEvent } : { manual: true });\n }\n\n async triggerEvent(event: AutomationEvent): Promise<AutomationRun[]> {\n const normalized: AutomationEvent = {\n ...event,\n occurredAtMs: event.occurredAtMs ?? Date.now(),\n };\n const automations = listAutomations().filter(\n (automation) =>\n automation.enabled &&\n automation.trigger.kind === 'event' &&\n !automation.state.runningRunId &&\n matchesAutomationEvent(automation.trigger, normalized),\n );\n const availableSlots = Math.max(0, this.maxConcurrentRuns - this.activeRuns.size);\n const started: AutomationRun[] = [];\n for (const automation of automations.slice(0, availableSlots)) {\n started.push(await this.startRun(automation, { manual: false, event: normalized }));\n }\n return started;\n }\n\n async listRuns(options?: { automationId?: string; limit?: number }): Promise<AutomationRun[]> {\n return listAutomationRuns(options);\n }\n\n async listRunsForProductEvent(options: {\n eventType: string;\n source?: string;\n payloadKey?: string;\n payloadValue?: string;\n limit?: number;\n }): Promise<AutomationProductEventRun[]> {\n return listAutomationRunsForProductEvent(options);\n }\n\n async getRun(runId: string): Promise<AutomationRun | null> {\n return getAutomationRun(runId);\n }\n\n async listRunEvents(runId: string): Promise<AutomationRunEvent[]> {\n return listAutomationRunEvents(runId);\n }\n\n async cancelRun(runId: string): Promise<boolean> {\n const controller = this.activeRuns.get(runId);\n if (!controller) return false;\n controller.abort();\n return true;\n }\n\n async getMetrics(): Promise<AutomationMetrics> {\n const automations = listAutomations();\n const enabled = automations.filter((automation) => automation.enabled);\n const next = enabled\n .filter((automation) => automation.state.nextRunAtMs != null)\n .toSorted((a, b) => (a.state.nextRunAtMs ?? 0) - (b.state.nextRunAtMs ?? 0))[0];\n const oneHourAgo = Date.now() - 60 * 60_000;\n return {\n totalAutomations: automations.length,\n enabledAutomations: enabled.length,\n runningRuns: this.activeRuns.size,\n failedLastHour: automations.filter(\n (automation) =>\n (automation.state.lastRunStatus === 'failed' || automation.state.lastRunStatus === 'timeout') &&\n (automation.state.lastRunAtMs ?? 0) >= oneHourAgo,\n ).length,\n nextRun: next?.state.nextRunAtMs\n ? {\n automationId: next.id,\n name: next.name,\n runAtMs: next.state.nextRunAtMs,\n }\n : undefined,\n };\n }\n\n private async recomputeNextRuns(options?: { catchUp?: boolean }): Promise<void> {\n const now = Date.now();\n const automations = listAutomations().map((automation, index) => {\n const next: Automation = {\n ...automation,\n state: { ...automation.state },\n };\n if (next.state.runningRunId) {\n next.state.lastRunStatus = 'failed';\n next.state.lastError = 'Interrupted by gateway restart';\n next.state.consecutiveFailures = (next.state.consecutiveFailures ?? 0) + 1;\n delete next.state.runningRunId;\n }\n const computed = computeNextAutomationRunAtMs(next, now);\n next.state.nextRunAtMs =\n options?.catchUp && computed != null && computed <= now\n ? now + index * MISSED_RUN_STAGGER_MS\n : computed;\n return next;\n });\n saveAutomations(automations);\n }\n\n private armTimer(): void {\n if (this.stopped) return;\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n const next = listAutomations()\n .filter((automation) => automation.enabled && automation.state.nextRunAtMs != null)\n .toSorted((a, b) => (a.state.nextRunAtMs ?? 0) - (b.state.nextRunAtMs ?? 0))[0];\n if (!next?.state.nextRunAtMs) return;\n this.timer = setTimeout(() => {\n void this.onTimer();\n }, timerDelayUntil(next.state.nextRunAtMs)) as TimerHandle;\n this.timer.unref?.();\n }\n\n private async onTimer(): Promise<void> {\n if (this.stopped) return;\n if (this.runningScheduler) {\n this.armTimer();\n return;\n }\n this.runningScheduler = true;\n try {\n const now = Date.now();\n const due = listAutomations()\n .filter(\n (automation) =>\n automation.enabled &&\n automation.trigger.kind === 'schedule' &&\n automation.state.nextRunAtMs != null &&\n automation.state.nextRunAtMs <= now &&\n !automation.state.runningRunId,\n )\n .slice(0, this.maxConcurrentRuns);\n await Promise.all(due.map((automation) => this.startRun(automation, { manual: false })));\n } finally {\n this.runningScheduler = false;\n this.armTimer();\n }\n }\n\n private async startRun(\n automation: Automation,\n opts: { manual: boolean; event?: AutomationEvent },\n ): Promise<AutomationRun> {\n const now = Date.now();\n const run: AutomationRun = {\n id: randomUUID(),\n automationId: automation.id,\n automationName: automation.name,\n status: 'queued',\n triggerSnapshot: automation.trigger,\n actionSnapshot: automation.action,\n manual: opts.manual,\n createdAtMs: now,\n };\n saveAutomationRun(run);\n this.appendRunEvent(\n run,\n 'run.queued',\n opts.event\n ? `Event ${opts.event.type} queued automation`\n : opts.manual\n ? 'Manual run queued'\n : 'Scheduled run queued',\n {\n trigger: automation.trigger,\n actionKind: automation.action.kind,\n safety: automation.safety ?? { mode: 'auto_apply' },\n event: opts.event,\n },\n );\n const nextAutomation: Automation = {\n ...automation,\n state: {\n ...automation.state,\n runningRunId: run.id,\n },\n };\n saveAutomation(nextAutomation);\n\n void this.executeRun(nextAutomation, run).catch((err) => {\n log.error(\n { err, automationId: automation.id, runId: run.id },\n `Automation run failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n });\n\n return run;\n }\n\n private async executeRun(automation: Automation, initialRun: AutomationRun): Promise<void> {\n const controller = new AbortController();\n this.activeRuns.set(initialRun.id, controller);\n const startedAtMs = Date.now();\n let run: AutomationRun = {\n ...initialRun,\n status: 'running',\n startedAtMs,\n };\n saveAutomationRun(run);\n this.appendRunEvent(run, 'run.started', 'Automation run started');\n\n let status: AutomationRunStatus = 'failed';\n let error: string | undefined;\n let activePhase: 'action' | 'after_run' = 'action';\n try {\n this.appendRunEvent(run, 'action.started', `Running ${automation.action.kind} action`, {\n actionKind: automation.action.kind,\n safety: automation.safety ?? { mode: 'auto_apply' },\n });\n const outcome = await this.executor.execute(automation, run, controller.signal);\n status = outcome.status;\n error = outcome.error;\n this.appendRunEvent(\n run,\n status === 'succeeded' ? 'action.completed' : 'action.failed',\n status === 'succeeded'\n ? `${automation.action.kind} action completed`\n : `${automation.action.kind} action ${status}`,\n {\n summary: outcome.summary,\n error: outcome.error,\n sessionKey: outcome.sessionKey,\n workflowRunId: outcome.workflowRunId,\n model: outcome.model,\n },\n );\n run = {\n ...run,\n status,\n summary: outcome.summary,\n error,\n sessionKey: outcome.sessionKey,\n workflowRunId: outcome.workflowRunId,\n model: outcome.model,\n };\n if ((automation.safety?.mode ?? 'auto_apply') !== 'auto_apply' && automation.afterRun?.kind === 'webhook') {\n this.appendRunEvent(run, 'after_run.completed', 'After-run webhook skipped by safety mode', {\n safety: automation.safety ?? { mode: 'auto_apply' },\n });\n } else if (automation.afterRun?.kind === 'webhook') {\n activePhase = 'after_run';\n this.appendRunEvent(run, 'after_run.started', 'Calling after-run webhook', {\n url: automation.afterRun.url,\n });\n await this.postAfterRunWebhook(automation.afterRun.url, run);\n this.appendRunEvent(run, 'after_run.completed', 'After-run webhook completed');\n }\n } catch (err) {\n error = err instanceof Error ? err.message : String(err);\n status = controller.signal.aborted ? 'cancelled' : 'failed';\n this.appendRunEvent(run, activePhase === 'after_run' ? 'after_run.failed' : 'action.failed', `Automation run ${status}`, {\n error,\n });\n run = { ...run, status, error };\n } finally {\n const endedAtMs = Date.now();\n run = {\n ...run,\n status,\n endedAtMs,\n durationMs: endedAtMs - startedAtMs,\n };\n saveAutomationRun(run);\n this.appendRunEvent(run, 'run.completed', `Automation run ${status}`, {\n status,\n durationMs: run.durationMs,\n error,\n });\n this.activeRuns.delete(initialRun.id);\n this.finishAutomationRun(automation.id, status, error, endedAtMs);\n }\n }\n\n private appendRunEvent(\n run: Pick<AutomationRun, 'id' | 'automationId'>,\n type: AutomationRunEventType,\n message: string,\n data?: unknown,\n ): void {\n appendAutomationRunEvent({\n id: randomUUID(),\n runId: run.id,\n automationId: run.automationId,\n type,\n message,\n data,\n createdAtMs: Date.now(),\n });\n }\n\n private finishAutomationRun(\n automationId: string,\n status: AutomationRunStatus,\n error: string | undefined,\n finishedAtMs: number,\n ): void {\n const current = getAutomation(automationId);\n if (!current) return;\n const failed = status === 'failed' || status === 'timeout';\n const consecutiveFailures = failed ? (current.state.consecutiveFailures ?? 0) + 1 : 0;\n const disableAfter = current.reliability?.disableAfterConsecutiveFailures;\n const shouldDisable = disableAfter != null && consecutiveFailures >= disableAfter;\n const next: Automation = {\n ...current,\n enabled: shouldDisable ? false : current.enabled,\n state: {\n ...current.state,\n lastRunAtMs: finishedAtMs,\n lastRunStatus: status,\n lastError: error,\n consecutiveFailures,\n },\n updatedAtMs: shouldDisable ? finishedAtMs : current.updatedAtMs,\n };\n delete next.state.runningRunId;\n next.state.nextRunAtMs = computeNextAutomationRunAtMs(next, finishedAtMs);\n saveAutomation(next);\n this.armTimer();\n }\n\n private async postAfterRunWebhook(url: string, run: AutomationRun): Promise<void> {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ run }),\n });\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(`Automation webhook failed: HTTP ${response.status}${text ? ` ${text.slice(0, 200)}` : ''}`);\n }\n }\n}\n\nfunction matchesAutomationEvent(\n trigger: Extract<Automation['trigger'], { kind: 'event' }>,\n event: AutomationEvent,\n): boolean {\n if (trigger.eventType !== event.type) return false;\n if (trigger.source && trigger.source !== event.source) return false;\n const payloadMatch = trigger.payloadMatch;\n if (!payloadMatch) return true;\n const payload = event.payload ?? {};\n return Object.entries(payloadMatch).every(([key, expected]) => Object.is(payload[key], expected));\n}\n\nfunction readAutomationEventFromRunEvent(event: AutomationRunEvent): AutomationEvent | null {\n if (!event.data || typeof event.data !== 'object' || Array.isArray(event.data)) return null;\n const raw = (event.data as { event?: unknown }).event;\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return null;\n const candidate = raw as Partial<AutomationEvent>;\n if (typeof candidate.type !== 'string' || !candidate.type.trim()) return null;\n return {\n type: candidate.type,\n source: typeof candidate.source === 'string' ? candidate.source : undefined,\n payload: candidate.payload && typeof candidate.payload === 'object' && !Array.isArray(candidate.payload)\n ? candidate.payload as Record<string, unknown>\n : undefined,\n occurredAtMs: typeof candidate.occurredAtMs === 'number' ? candidate.occurredAtMs : undefined,\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Automation } from '../domain/types.js';
|
|
2
|
+
export declare function listAutomations(): Automation[];
|
|
3
|
+
export declare function getAutomation(automationId: string): Automation | null;
|
|
4
|
+
export declare function saveAutomation(automation: Automation): void;
|
|
5
|
+
export declare function saveAutomations(automations: Automation[]): void;
|
|
6
|
+
export declare function deleteAutomation(automationId: string): boolean;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { getSqliteDatabase, runSqliteWriteTransaction } from "../../storage/sqlite/transaction.js";
|
|
2
|
+
import { AutomationSchema } from "../domain/validation.js";
|
|
3
|
+
//#region src/automations/storage/automation-repository.ts
|
|
4
|
+
function parseJson(value) {
|
|
5
|
+
if (!value) return void 0;
|
|
6
|
+
return JSON.parse(value);
|
|
7
|
+
}
|
|
8
|
+
function bindJson(value) {
|
|
9
|
+
return value === void 0 ? null : JSON.stringify(value);
|
|
10
|
+
}
|
|
11
|
+
function rowToAutomation(row) {
|
|
12
|
+
return AutomationSchema.parse({
|
|
13
|
+
id: row.automation_id,
|
|
14
|
+
name: row.name,
|
|
15
|
+
description: row.description ?? void 0,
|
|
16
|
+
enabled: row.enabled !== 0,
|
|
17
|
+
trigger: parseJson(row.trigger_json),
|
|
18
|
+
action: parseJson(row.action_json),
|
|
19
|
+
safety: parseJson(row.safety_json) ?? { mode: "auto_apply" },
|
|
20
|
+
afterRun: parseJson(row.after_run_json),
|
|
21
|
+
reliability: parseJson(row.reliability_json),
|
|
22
|
+
state: parseJson(row.state_json) ?? {},
|
|
23
|
+
createdAtMs: row.created_at_ms,
|
|
24
|
+
updatedAtMs: row.updated_at_ms
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function upsertAutomation(db, automation) {
|
|
28
|
+
db.prepare(`INSERT OR REPLACE INTO automations (
|
|
29
|
+
automation_id, name, description, enabled, trigger_json, action_json,
|
|
30
|
+
safety_json, after_run_json, reliability_json, state_json, created_at_ms, updated_at_ms
|
|
31
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(automation.id, automation.name, automation.description ?? null, automation.enabled ? 1 : 0, JSON.stringify(automation.trigger), JSON.stringify(automation.action), bindJson(automation.safety ?? { mode: "auto_apply" }), bindJson(automation.afterRun), bindJson(automation.reliability), JSON.stringify(automation.state ?? {}), automation.createdAtMs, automation.updatedAtMs);
|
|
32
|
+
}
|
|
33
|
+
const AUTOMATION_SELECT = `
|
|
34
|
+
SELECT automation_id, name, description, enabled, trigger_json, action_json,
|
|
35
|
+
safety_json, after_run_json, reliability_json, state_json, created_at_ms, updated_at_ms
|
|
36
|
+
FROM automations
|
|
37
|
+
`;
|
|
38
|
+
function listAutomations() {
|
|
39
|
+
return getSqliteDatabase().prepare(`${AUTOMATION_SELECT} ORDER BY created_at_ms DESC`).all().map(rowToAutomation);
|
|
40
|
+
}
|
|
41
|
+
function getAutomation(automationId) {
|
|
42
|
+
const row = getSqliteDatabase().prepare(`${AUTOMATION_SELECT} WHERE automation_id = ?`).get(automationId);
|
|
43
|
+
return row ? rowToAutomation(row) : null;
|
|
44
|
+
}
|
|
45
|
+
function saveAutomation(automation) {
|
|
46
|
+
runSqliteWriteTransaction((db) => upsertAutomation(db, automation));
|
|
47
|
+
}
|
|
48
|
+
function saveAutomations(automations) {
|
|
49
|
+
runSqliteWriteTransaction((db) => {
|
|
50
|
+
for (const automation of automations) upsertAutomation(db, automation);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function deleteAutomation(automationId) {
|
|
54
|
+
return runSqliteWriteTransaction((db) => {
|
|
55
|
+
return db.prepare(`DELETE FROM automations WHERE automation_id = ?`).run(automationId).changes > 0;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
export { deleteAutomation, getAutomation, listAutomations, saveAutomation, saveAutomations };
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=automation-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automation-repository.js","names":[],"sources":["../../../../src/automations/storage/automation-repository.ts"],"sourcesContent":["import type { Automation } from '../domain/types.js';\nimport { AutomationSchema } from '../domain/validation.js';\nimport { getSqliteDatabase, runSqliteWriteTransaction } from '../../storage/sqlite/transaction.js';\n\ntype AutomationRow = {\n automation_id: string;\n name: string;\n description: string | null;\n enabled: number;\n trigger_json: string;\n action_json: string;\n safety_json: string | null;\n after_run_json: string | null;\n reliability_json: string | null;\n state_json: string;\n created_at_ms: number;\n updated_at_ms: number;\n};\n\nfunction parseJson(value: string | null): unknown {\n if (!value) return undefined;\n return JSON.parse(value);\n}\n\nfunction bindJson(value: unknown): string | null {\n return value === undefined ? null : JSON.stringify(value);\n}\n\nfunction rowToAutomation(row: AutomationRow): Automation {\n return AutomationSchema.parse({\n id: row.automation_id,\n name: row.name,\n description: row.description ?? undefined,\n enabled: row.enabled !== 0,\n trigger: parseJson(row.trigger_json),\n action: parseJson(row.action_json),\n safety: parseJson(row.safety_json) ?? { mode: 'auto_apply' },\n afterRun: parseJson(row.after_run_json),\n reliability: parseJson(row.reliability_json),\n state: parseJson(row.state_json) ?? {},\n createdAtMs: row.created_at_ms,\n updatedAtMs: row.updated_at_ms,\n }) as Automation;\n}\n\nfunction upsertAutomation(db: ReturnType<typeof getSqliteDatabase>, automation: Automation): void {\n db.prepare(\n `INSERT OR REPLACE INTO automations (\n automation_id, name, description, enabled, trigger_json, action_json,\n safety_json, after_run_json, reliability_json, state_json, created_at_ms, updated_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n automation.id,\n automation.name,\n automation.description ?? null,\n automation.enabled ? 1 : 0,\n JSON.stringify(automation.trigger),\n JSON.stringify(automation.action),\n bindJson(automation.safety ?? { mode: 'auto_apply' }),\n bindJson(automation.afterRun),\n bindJson(automation.reliability),\n JSON.stringify(automation.state ?? {}),\n automation.createdAtMs,\n automation.updatedAtMs,\n );\n}\n\nconst AUTOMATION_SELECT = `\n SELECT automation_id, name, description, enabled, trigger_json, action_json,\n safety_json, after_run_json, reliability_json, state_json, created_at_ms, updated_at_ms\n FROM automations\n`;\n\nexport function listAutomations(): Automation[] {\n const rows = getSqliteDatabase()\n .prepare(`${AUTOMATION_SELECT} ORDER BY created_at_ms DESC`)\n .all() as AutomationRow[];\n return rows.map(rowToAutomation);\n}\n\nexport function getAutomation(automationId: string): Automation | null {\n const row = getSqliteDatabase()\n .prepare(`${AUTOMATION_SELECT} WHERE automation_id = ?`)\n .get(automationId) as AutomationRow | undefined;\n return row ? rowToAutomation(row) : null;\n}\n\nexport function saveAutomation(automation: Automation): void {\n runSqliteWriteTransaction((db) => upsertAutomation(db, automation));\n}\n\nexport function saveAutomations(automations: Automation[]): void {\n runSqliteWriteTransaction((db) => {\n for (const automation of automations) {\n upsertAutomation(db, automation);\n }\n });\n}\n\nexport function deleteAutomation(automationId: string): boolean {\n return runSqliteWriteTransaction((db) => {\n const result = db.prepare(`DELETE FROM automations WHERE automation_id = ?`).run(automationId);\n return result.changes > 0;\n });\n}\n"],"mappings":";;;AAmBA,SAAS,UAAU,OAA+B;AAChD,KAAI,CAAC,MAAO,QAAO,KAAA;AACnB,QAAO,KAAK,MAAM,MAAM;;AAG1B,SAAS,SAAS,OAA+B;AAC/C,QAAO,UAAU,KAAA,IAAY,OAAO,KAAK,UAAU,MAAM;;AAG3D,SAAS,gBAAgB,KAAgC;AACvD,QAAO,iBAAiB,MAAM;EAC5B,IAAI,IAAI;EACR,MAAM,IAAI;EACV,aAAa,IAAI,eAAe,KAAA;EAChC,SAAS,IAAI,YAAY;EACzB,SAAS,UAAU,IAAI,aAAa;EACpC,QAAQ,UAAU,IAAI,YAAY;EAClC,QAAQ,UAAU,IAAI,YAAY,IAAI,EAAE,MAAM,cAAc;EAC5D,UAAU,UAAU,IAAI,eAAe;EACvC,aAAa,UAAU,IAAI,iBAAiB;EAC5C,OAAO,UAAU,IAAI,WAAW,IAAI,EAAE;EACtC,aAAa,IAAI;EACjB,aAAa,IAAI;EAClB,CAAC;;AAGJ,SAAS,iBAAiB,IAA0C,YAA8B;AAChG,IAAG,QACD;;;mDAID,CAAC,IACA,WAAW,IACX,WAAW,MACX,WAAW,eAAe,MAC1B,WAAW,UAAU,IAAI,GACzB,KAAK,UAAU,WAAW,QAAQ,EAClC,KAAK,UAAU,WAAW,OAAO,EACjC,SAAS,WAAW,UAAU,EAAE,MAAM,cAAc,CAAC,EACrD,SAAS,WAAW,SAAS,EAC7B,SAAS,WAAW,YAAY,EAChC,KAAK,UAAU,WAAW,SAAS,EAAE,CAAC,EACtC,WAAW,aACX,WAAW,YACZ;;AAGH,MAAM,oBAAoB;;;;;AAM1B,SAAgB,kBAAgC;AAI9C,QAHa,mBAAmB,CAC7B,QAAQ,GAAG,kBAAkB,8BAA8B,CAC3D,KACQ,CAAC,IAAI,gBAAgB;;AAGlC,SAAgB,cAAc,cAAyC;CACrE,MAAM,MAAM,mBAAmB,CAC5B,QAAQ,GAAG,kBAAkB,0BAA0B,CACvD,IAAI,aAAa;AACpB,QAAO,MAAM,gBAAgB,IAAI,GAAG;;AAGtC,SAAgB,eAAe,YAA8B;AAC3D,4BAA2B,OAAO,iBAAiB,IAAI,WAAW,CAAC;;AAGrE,SAAgB,gBAAgB,aAAiC;AAC/D,4BAA2B,OAAO;AAChC,OAAK,MAAM,cAAc,YACvB,kBAAiB,IAAI,WAAW;GAElC;;AAGJ,SAAgB,iBAAiB,cAA+B;AAC9D,QAAO,2BAA2B,OAAO;AAEvC,SADe,GAAG,QAAQ,kDAAkD,CAAC,IAAI,aACpE,CAAC,UAAU;GACxB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AutomationProductEventRun, AutomationRun, AutomationRunEvent } from '../domain/types.js';
|
|
2
|
+
export declare function appendAutomationRunEvent(event: AutomationRunEvent): void;
|
|
3
|
+
export declare function saveAutomationRun(run: AutomationRun): void;
|
|
4
|
+
export declare function listAutomationRunEvents(runId: string): AutomationRunEvent[];
|
|
5
|
+
export declare function getAutomationRun(runId: string): AutomationRun | null;
|
|
6
|
+
export declare function listAutomationRuns(options?: {
|
|
7
|
+
automationId?: string;
|
|
8
|
+
limit?: number;
|
|
9
|
+
}): AutomationRun[];
|
|
10
|
+
export declare function listAutomationRunsForProductEvent(options: {
|
|
11
|
+
eventType: string;
|
|
12
|
+
source?: string;
|
|
13
|
+
payloadKey?: string;
|
|
14
|
+
payloadValue?: string;
|
|
15
|
+
limit?: number;
|
|
16
|
+
}): AutomationProductEventRun[];
|
|
17
|
+
export declare function deleteAutomationRunsForAutomation(automationId: string): void;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { getSqliteDatabase, runSqliteWriteTransaction } from "../../storage/sqlite/transaction.js";
|
|
2
|
+
//#region src/automations/storage/automation-run-repository.ts
|
|
3
|
+
const MAX_RUNS_PER_AUTOMATION = 2e3;
|
|
4
|
+
const TRIM_TO_RUNS = 1500;
|
|
5
|
+
function rowToRun(row) {
|
|
6
|
+
return {
|
|
7
|
+
id: row.run_id,
|
|
8
|
+
automationId: row.automation_id,
|
|
9
|
+
automationName: row.automation_name,
|
|
10
|
+
status: row.status,
|
|
11
|
+
triggerSnapshot: JSON.parse(row.trigger_snapshot_json),
|
|
12
|
+
actionSnapshot: JSON.parse(row.action_snapshot_json),
|
|
13
|
+
manual: row.manual !== 0,
|
|
14
|
+
createdAtMs: row.created_at_ms,
|
|
15
|
+
startedAtMs: row.started_at_ms ?? void 0,
|
|
16
|
+
endedAtMs: row.ended_at_ms ?? void 0,
|
|
17
|
+
durationMs: row.duration_ms ?? void 0,
|
|
18
|
+
summary: row.summary ?? void 0,
|
|
19
|
+
error: row.error ?? void 0,
|
|
20
|
+
sessionKey: row.session_key ?? void 0,
|
|
21
|
+
workflowRunId: row.workflow_run_id ?? void 0,
|
|
22
|
+
model: row.model ?? void 0
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function rowToEvent(row) {
|
|
26
|
+
return {
|
|
27
|
+
id: row.event_id,
|
|
28
|
+
runId: row.run_id,
|
|
29
|
+
automationId: row.automation_id,
|
|
30
|
+
type: row.type,
|
|
31
|
+
message: row.message,
|
|
32
|
+
data: row.data_json ? JSON.parse(row.data_json) : void 0,
|
|
33
|
+
createdAtMs: row.created_at_ms
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function trimRuns(db, automationId) {
|
|
37
|
+
const countRow = db.prepare(`SELECT COUNT(*) AS count FROM automation_runs WHERE automation_id = ?`).get(automationId);
|
|
38
|
+
if (countRow.count <= MAX_RUNS_PER_AUTOMATION) return;
|
|
39
|
+
const staleRunIds = db.prepare(`SELECT run_id FROM automation_runs WHERE automation_id = ?
|
|
40
|
+
ORDER BY created_at_ms ASC LIMIT ?`).all(automationId, countRow.count - TRIM_TO_RUNS);
|
|
41
|
+
for (const { run_id: runId } of staleRunIds) {
|
|
42
|
+
db.prepare(`DELETE FROM automation_run_events WHERE run_id = ?`).run(runId);
|
|
43
|
+
db.prepare(`DELETE FROM automation_runs WHERE run_id = ?`).run(runId);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function appendAutomationRunEvent(event) {
|
|
47
|
+
runSqliteWriteTransaction((db) => {
|
|
48
|
+
db.prepare(`INSERT INTO automation_run_events (
|
|
49
|
+
event_id, run_id, automation_id, type, message, data_json, created_at_ms
|
|
50
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?)`).run(event.id, event.runId, event.automationId, event.type, event.message, event.data === void 0 ? null : JSON.stringify(event.data), event.createdAtMs);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function saveAutomationRun(run) {
|
|
54
|
+
runSqliteWriteTransaction((db) => {
|
|
55
|
+
db.prepare(`INSERT OR REPLACE INTO automation_runs (
|
|
56
|
+
run_id, automation_id, automation_name, status, trigger_snapshot_json,
|
|
57
|
+
action_snapshot_json, manual, created_at_ms, started_at_ms, ended_at_ms,
|
|
58
|
+
duration_ms, summary, error, session_key, workflow_run_id, model
|
|
59
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(run.id, run.automationId, run.automationName, run.status, JSON.stringify(run.triggerSnapshot), JSON.stringify(run.actionSnapshot), run.manual ? 1 : 0, run.createdAtMs, run.startedAtMs ?? null, run.endedAtMs ?? null, run.durationMs ?? null, run.summary ?? null, run.error ?? null, run.sessionKey ?? null, run.workflowRunId ?? null, run.model ?? null);
|
|
60
|
+
trimRuns(db, run.automationId);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function listAutomationRunEvents(runId) {
|
|
64
|
+
return getSqliteDatabase().prepare(`SELECT event_id, run_id, automation_id, type, message, data_json, created_at_ms
|
|
65
|
+
FROM automation_run_events
|
|
66
|
+
WHERE run_id = ?
|
|
67
|
+
ORDER BY created_at_ms ASC`).all(runId).map(rowToEvent);
|
|
68
|
+
}
|
|
69
|
+
function getAutomationRun(runId) {
|
|
70
|
+
const row = getSqliteDatabase().prepare(`SELECT run_id, automation_id, automation_name, status, trigger_snapshot_json,
|
|
71
|
+
action_snapshot_json, manual, created_at_ms, started_at_ms, ended_at_ms,
|
|
72
|
+
duration_ms, summary, error, session_key, workflow_run_id, model
|
|
73
|
+
FROM automation_runs
|
|
74
|
+
WHERE run_id = ?`).get(runId);
|
|
75
|
+
return row ? rowToRun(row) : null;
|
|
76
|
+
}
|
|
77
|
+
function listAutomationRuns(options) {
|
|
78
|
+
const limit = Math.min(Math.max(options?.limit ?? 50, 1), 500);
|
|
79
|
+
const db = getSqliteDatabase();
|
|
80
|
+
const base = `SELECT run_id, automation_id, automation_name, status, trigger_snapshot_json,
|
|
81
|
+
action_snapshot_json, manual, created_at_ms, started_at_ms, ended_at_ms,
|
|
82
|
+
duration_ms, summary, error, session_key, workflow_run_id, model
|
|
83
|
+
FROM automation_runs`;
|
|
84
|
+
return (options?.automationId ? db.prepare(`${base} WHERE automation_id = ? ORDER BY created_at_ms DESC LIMIT ?`).all(options.automationId, limit) : db.prepare(`${base} ORDER BY created_at_ms DESC LIMIT ?`).all(limit)).map(rowToRun);
|
|
85
|
+
}
|
|
86
|
+
function listAutomationRunsForProductEvent(options) {
|
|
87
|
+
const limit = Math.min(Math.max(options.limit ?? 10, 1), 100);
|
|
88
|
+
const clauses = [`e.type = 'run.queued'`, `json_extract(e.data_json, '$.event.type') = ?`];
|
|
89
|
+
const params = [options.eventType, limit];
|
|
90
|
+
if (options.source) {
|
|
91
|
+
clauses.push(`json_extract(e.data_json, '$.event.source') = ?`);
|
|
92
|
+
params.splice(params.length - 1, 0, options.source);
|
|
93
|
+
}
|
|
94
|
+
if (options.payloadKey && options.payloadValue !== void 0) {
|
|
95
|
+
clauses.push(`json_extract(e.data_json, '$.event.payload.' || ?) = ?`);
|
|
96
|
+
params.splice(params.length - 1, 0, options.payloadKey, options.payloadValue);
|
|
97
|
+
}
|
|
98
|
+
return getSqliteDatabase().prepare(`SELECT r.run_id, r.automation_id, r.automation_name, r.status, r.trigger_snapshot_json,
|
|
99
|
+
r.action_snapshot_json, r.manual, r.created_at_ms, r.started_at_ms, r.ended_at_ms,
|
|
100
|
+
r.duration_ms, r.summary, r.error, r.session_key, r.workflow_run_id, r.model,
|
|
101
|
+
e.event_id, e.run_id AS event_run_id, e.automation_id AS event_automation_id,
|
|
102
|
+
e.type AS event_type, e.message AS event_message, e.data_json AS event_data_json,
|
|
103
|
+
e.created_at_ms AS event_created_at_ms
|
|
104
|
+
FROM automation_run_events e
|
|
105
|
+
JOIN automation_runs r ON r.run_id = e.run_id
|
|
106
|
+
WHERE ${clauses.join(" AND ")}
|
|
107
|
+
ORDER BY e.created_at_ms DESC
|
|
108
|
+
LIMIT ?`).all(...params).map((row) => ({
|
|
109
|
+
run: rowToRun(row),
|
|
110
|
+
triggerEvent: rowToEvent({
|
|
111
|
+
event_id: row.event_id,
|
|
112
|
+
run_id: row.event_run_id,
|
|
113
|
+
automation_id: row.event_automation_id,
|
|
114
|
+
type: row.event_type,
|
|
115
|
+
message: row.event_message,
|
|
116
|
+
data_json: row.event_data_json,
|
|
117
|
+
created_at_ms: row.event_created_at_ms
|
|
118
|
+
})
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
function deleteAutomationRunsForAutomation(automationId) {
|
|
122
|
+
runSqliteWriteTransaction((db) => {
|
|
123
|
+
db.prepare(`DELETE FROM automation_run_events WHERE automation_id = ?`).run(automationId);
|
|
124
|
+
db.prepare(`DELETE FROM automation_runs WHERE automation_id = ?`).run(automationId);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
//#endregion
|
|
128
|
+
export { appendAutomationRunEvent, deleteAutomationRunsForAutomation, getAutomationRun, listAutomationRunEvents, listAutomationRuns, listAutomationRunsForProductEvent, saveAutomationRun };
|
|
129
|
+
|
|
130
|
+
//# sourceMappingURL=automation-run-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automation-run-repository.js","names":[],"sources":["../../../../src/automations/storage/automation-run-repository.ts"],"sourcesContent":["import type { AutomationProductEventRun, AutomationRun, AutomationRunEvent } from '../domain/types.js';\nimport { getSqliteDatabase, runSqliteWriteTransaction } from '../../storage/sqlite/transaction.js';\n\nconst MAX_RUNS_PER_AUTOMATION = 2000;\nconst TRIM_TO_RUNS = 1500;\n\ntype AutomationRunRow = {\n run_id: string;\n automation_id: string;\n automation_name: string;\n status: string;\n trigger_snapshot_json: string;\n action_snapshot_json: string;\n manual: number;\n created_at_ms: number;\n started_at_ms: number | null;\n ended_at_ms: number | null;\n duration_ms: number | null;\n summary: string | null;\n error: string | null;\n session_key: string | null;\n workflow_run_id: string | null;\n model: string | null;\n};\n\ntype AutomationRunEventRow = {\n event_id: string;\n run_id: string;\n automation_id: string;\n type: string;\n message: string;\n data_json: string | null;\n created_at_ms: number;\n};\n\nfunction rowToRun(row: AutomationRunRow): AutomationRun {\n return {\n id: row.run_id,\n automationId: row.automation_id,\n automationName: row.automation_name,\n status: row.status as AutomationRun['status'],\n triggerSnapshot: JSON.parse(row.trigger_snapshot_json),\n actionSnapshot: JSON.parse(row.action_snapshot_json),\n manual: row.manual !== 0,\n createdAtMs: row.created_at_ms,\n startedAtMs: row.started_at_ms ?? undefined,\n endedAtMs: row.ended_at_ms ?? undefined,\n durationMs: row.duration_ms ?? undefined,\n summary: row.summary ?? undefined,\n error: row.error ?? undefined,\n sessionKey: row.session_key ?? undefined,\n workflowRunId: row.workflow_run_id ?? undefined,\n model: row.model ?? undefined,\n };\n}\n\nfunction rowToEvent(row: AutomationRunEventRow): AutomationRunEvent {\n return {\n id: row.event_id,\n runId: row.run_id,\n automationId: row.automation_id,\n type: row.type as AutomationRunEvent['type'],\n message: row.message,\n data: row.data_json ? JSON.parse(row.data_json) : undefined,\n createdAtMs: row.created_at_ms,\n };\n}\n\nfunction trimRuns(db: ReturnType<typeof getSqliteDatabase>, automationId: string): void {\n const countRow = db\n .prepare(`SELECT COUNT(*) AS count FROM automation_runs WHERE automation_id = ?`)\n .get(automationId) as { count: number };\n if (countRow.count <= MAX_RUNS_PER_AUTOMATION) return;\n const staleRunIds = db\n .prepare(\n `SELECT run_id FROM automation_runs WHERE automation_id = ?\n ORDER BY created_at_ms ASC LIMIT ?`,\n )\n .all(automationId, countRow.count - TRIM_TO_RUNS) as { run_id: string }[];\n for (const { run_id: runId } of staleRunIds) {\n db.prepare(`DELETE FROM automation_run_events WHERE run_id = ?`).run(runId);\n db.prepare(`DELETE FROM automation_runs WHERE run_id = ?`).run(runId);\n }\n}\n\nexport function appendAutomationRunEvent(event: AutomationRunEvent): void {\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO automation_run_events (\n event_id, run_id, automation_id, type, message, data_json, created_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n event.id,\n event.runId,\n event.automationId,\n event.type,\n event.message,\n event.data === undefined ? null : JSON.stringify(event.data),\n event.createdAtMs,\n );\n });\n}\n\nexport function saveAutomationRun(run: AutomationRun): void {\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT OR REPLACE INTO automation_runs (\n run_id, automation_id, automation_name, status, trigger_snapshot_json,\n action_snapshot_json, manual, created_at_ms, started_at_ms, ended_at_ms,\n duration_ms, summary, error, session_key, workflow_run_id, model\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n run.id,\n run.automationId,\n run.automationName,\n run.status,\n JSON.stringify(run.triggerSnapshot),\n JSON.stringify(run.actionSnapshot),\n run.manual ? 1 : 0,\n run.createdAtMs,\n run.startedAtMs ?? null,\n run.endedAtMs ?? null,\n run.durationMs ?? null,\n run.summary ?? null,\n run.error ?? null,\n run.sessionKey ?? null,\n run.workflowRunId ?? null,\n run.model ?? null,\n );\n trimRuns(db, run.automationId);\n });\n}\n\nexport function listAutomationRunEvents(runId: string): AutomationRunEvent[] {\n const rows = getSqliteDatabase()\n .prepare(\n `SELECT event_id, run_id, automation_id, type, message, data_json, created_at_ms\n FROM automation_run_events\n WHERE run_id = ?\n ORDER BY created_at_ms ASC`,\n )\n .all(runId) as AutomationRunEventRow[];\n return rows.map(rowToEvent);\n}\n\nexport function getAutomationRun(runId: string): AutomationRun | null {\n const row = getSqliteDatabase()\n .prepare(\n `SELECT run_id, automation_id, automation_name, status, trigger_snapshot_json,\n action_snapshot_json, manual, created_at_ms, started_at_ms, ended_at_ms,\n duration_ms, summary, error, session_key, workflow_run_id, model\n FROM automation_runs\n WHERE run_id = ?`,\n )\n .get(runId) as AutomationRunRow | undefined;\n return row ? rowToRun(row) : null;\n}\n\nexport function listAutomationRuns(options?: {\n automationId?: string;\n limit?: number;\n}): AutomationRun[] {\n const limit = Math.min(Math.max(options?.limit ?? 50, 1), 500);\n const db = getSqliteDatabase();\n const base = `SELECT run_id, automation_id, automation_name, status, trigger_snapshot_json,\n action_snapshot_json, manual, created_at_ms, started_at_ms, ended_at_ms,\n duration_ms, summary, error, session_key, workflow_run_id, model\n FROM automation_runs`;\n const rows = options?.automationId\n ? db.prepare(`${base} WHERE automation_id = ? ORDER BY created_at_ms DESC LIMIT ?`).all(options.automationId, limit)\n : db.prepare(`${base} ORDER BY created_at_ms DESC LIMIT ?`).all(limit);\n return (rows as AutomationRunRow[]).map(rowToRun);\n}\n\nexport function listAutomationRunsForProductEvent(options: {\n eventType: string;\n source?: string;\n payloadKey?: string;\n payloadValue?: string;\n limit?: number;\n}): AutomationProductEventRun[] {\n const limit = Math.min(Math.max(options.limit ?? 10, 1), 100);\n const clauses = [\n `e.type = 'run.queued'`,\n `json_extract(e.data_json, '$.event.type') = ?`,\n ];\n const params: Array<string | number> = [options.eventType, limit];\n\n if (options.source) {\n clauses.push(`json_extract(e.data_json, '$.event.source') = ?`);\n params.splice(params.length - 1, 0, options.source);\n }\n if (options.payloadKey && options.payloadValue !== undefined) {\n clauses.push(`json_extract(e.data_json, '$.event.payload.' || ?) = ?`);\n params.splice(params.length - 1, 0, options.payloadKey, options.payloadValue);\n }\n\n const rows = getSqliteDatabase()\n .prepare(\n `SELECT r.run_id, r.automation_id, r.automation_name, r.status, r.trigger_snapshot_json,\n r.action_snapshot_json, r.manual, r.created_at_ms, r.started_at_ms, r.ended_at_ms,\n r.duration_ms, r.summary, r.error, r.session_key, r.workflow_run_id, r.model,\n e.event_id, e.run_id AS event_run_id, e.automation_id AS event_automation_id,\n e.type AS event_type, e.message AS event_message, e.data_json AS event_data_json,\n e.created_at_ms AS event_created_at_ms\n FROM automation_run_events e\n JOIN automation_runs r ON r.run_id = e.run_id\n WHERE ${clauses.join(' AND ')}\n ORDER BY e.created_at_ms DESC\n LIMIT ?`,\n )\n .all(...params) as Array<AutomationRunRow & {\n event_id: string;\n event_run_id: string;\n event_automation_id: string;\n event_type: string;\n event_message: string;\n event_data_json: string | null;\n event_created_at_ms: number;\n }>;\n\n return rows.map((row) => ({\n run: rowToRun(row),\n triggerEvent: rowToEvent({\n event_id: row.event_id,\n run_id: row.event_run_id,\n automation_id: row.event_automation_id,\n type: row.event_type,\n message: row.event_message,\n data_json: row.event_data_json,\n created_at_ms: row.event_created_at_ms,\n }),\n }));\n}\n\nexport function deleteAutomationRunsForAutomation(automationId: string): void {\n runSqliteWriteTransaction((db) => {\n db.prepare(`DELETE FROM automation_run_events WHERE automation_id = ?`).run(automationId);\n db.prepare(`DELETE FROM automation_runs WHERE automation_id = ?`).run(automationId);\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { deleteAutomation, getAutomation, listAutomations, saveAutomation, saveAutomations } from "./automation-repository.js";
|
|
2
|
+
import { appendAutomationRunEvent, deleteAutomationRunsForAutomation, getAutomationRun, listAutomationRunEvents, listAutomationRuns, listAutomationRunsForProductEvent, saveAutomationRun } from "./automation-run-repository.js";
|
|
3
|
+
export { appendAutomationRunEvent, deleteAutomation, deleteAutomationRunsForAutomation, getAutomation, getAutomationRun, listAutomationRunEvents, listAutomationRuns, listAutomationRunsForProductEvent, listAutomations, saveAutomation, saveAutomationRun, saveAutomations };
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import type { Config } from '../config/schema.js';
|
|
5
5
|
import type { MessageBus } from '../infra/bus/index.js';
|
|
6
|
+
import type { Migration } from '../migrations/types.js';
|
|
6
7
|
import type { ChannelId, ChannelMeta, ChannelCapabilities } from './plugins/types.core.js';
|
|
7
8
|
import type { ChannelPairingAdapter, ChannelAllowlistAdapter, ChannelThreadingAdapter, ChannelLifecycleAdapter, ChannelHeartbeatAdapter, ChannelConfiguredBindingProvider, ChannelMessagingAdapter, ChannelDirectoryAdapter, ChannelResolverAdapter, ChannelAuthAdapter, ChannelElevatedAdapter, ChannelExecApprovalAdapter, ChannelAgentPromptAdapter, ChannelSetupWizard, ChannelCronDeliveryAdapter, ChannelCliLoginAdapter, ChannelConfigSurfaceAdapter, ChannelOnboardAdapter, ChannelRuntimeActionAdapter } from './plugins/types.adapters.js';
|
|
8
9
|
export type { ChannelId, ChatType, ChannelMeta, ChannelCapabilities } from './plugins/types.core.js';
|
|
@@ -131,6 +132,8 @@ export interface ChannelPlugin<ResolvedAccount = any> {
|
|
|
131
132
|
heartbeat?: ChannelHeartbeatAdapter;
|
|
132
133
|
agentPrompt?: ChannelAgentPromptAdapter;
|
|
133
134
|
agentTools?: ChannelAgentTool[];
|
|
135
|
+
/** Optional safe/manual migrations contributed by this channel plugin. */
|
|
136
|
+
migrations?: readonly Migration[];
|
|
134
137
|
/** Optional doctor health-check contributed by this channel plugin. */
|
|
135
138
|
doctor?: ChannelDoctorAdapter;
|
|
136
139
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinking.js","names":[],"sources":["../../../../src/chat-commands/builtins/thinking.ts"],"sourcesContent":["/**\n * Thinking Commands\n * \n * Built-in commands for thinking ability management:\n * - /think - Set thinking level\n * - /reasoning - Set reasoning visibility\n * - /verbose - Set verbose mode\n * - /status - Show current status (including thinking/reasoning/verbose)\n */\n\nimport type { CommandDefinition, CommandContext } from '../types.js';\nimport { commandRegistry } from '../registry.js';\nimport {\n normalizeThinkLevel,\n normalizeReasoningLevel,\n normalizeVerboseLevel,\n formatThinkingLevels,\n type ThinkLevel,\n type ReasoningLevel,\n type VerboseLevel,\n} from '../../agent/transcript/thinking-types.js';\nimport type { SessionConfigStore } from '../../session/index.js';\n\nasync function _stripSessionAgentFields(\n store: SessionConfigStore | undefined,\n sessionKey: string,\n fields: Array<'thinkingLevel' | 'reasoningLevel' | 'verboseLevel'>,\n): Promise<void> {\n if (!store) return;\n const existing = await store.get(sessionKey);\n if (!existing) return;\n const next = { ...existing };\n for (const f of fields) {\n delete next[f];\n }\n const restKeys = Object.keys(next).filter((k) => k !== 'updatedAt');\n if (restKeys.length === 0) {\n await store.delete(sessionKey);\n } else {\n await store.set(sessionKey, next);\n }\n}\n\nasync function setSessionAgentField<K extends 'thinkingLevel' | 'reasoningLevel' | 'verboseLevel'>(\n store: SessionConfigStore | undefined,\n sessionKey: string,\n field: K,\n value: K extends 'thinkingLevel' ? ThinkLevel : K extends 'reasoningLevel' ? ReasoningLevel : VerboseLevel,\n): Promise<void> {\n if (!store) return;\n const existing = (await store.get(sessionKey)) ?? {};\n await store.set(sessionKey, { ...existing, [field]: value });\n}\n\n// Think command\nconst thinkCommand: CommandDefinition = {\n id: 'agent.think',\n name: 'think',\n description: 'Set thinking level (usage: /think <level>)',\n category: 'model',\n scope: ['global', 'private', 'group'],\n acceptsArgs: true,\n examples: ['/think', '/think high', '/think off', '/think adaptive'],\n handler: async (ctx: CommandContext, args: string) => {\n await ctx.setTyping(true);\n\n if (!args.trim()) {\n // Show current thinking level\n const currentLevel = await ctx.getThinkingLevel?.();\n \n return {\n content: `🧠 *Thinking Level*\\n\\n` +\n `Current: *${currentLevel || 'default'}*\\n\\n` +\n `Available levels:\\n` +\n `• off - No thinking\\n` +\n `• minimal - Minimal thinking\\n` +\n `• low - Low thinking\\n` +\n `• medium - Medium thinking (default)\\n` +\n `• high - High thinking\\n` +\n `• xhigh - Extra high (certain models)\\n` +\n `• adaptive - Auto-adjust based on task\\n\\n` +\n `Usage: /think <level>\\n` +\n `Example: /think high`,\n success: true,\n };\n }\n \n // Parse and validate the level\n const level = normalizeThinkLevel(args.trim());\n if (!level) {\n const levels = formatThinkingLevels();\n return {\n content: `❌ Invalid thinking level: ${args}\\n\\n` +\n `Available levels: ${levels}\\n\\n` +\n `Usage: /think <level>\\n` +\n `Example: /think high`,\n success: false,\n };\n }\n \n await setSessionAgentField(ctx.getSessionConfigStore?.(), ctx.sessionKey, 'thinkingLevel', level);\n ctx.syncAgentThinkingLevel?.(level);\n\n const levelDescriptions: Record<ThinkLevel, string> = {\n off: 'No thinking',\n minimal: 'Minimal thinking effort',\n low: 'Low thinking effort',\n medium: 'Medium thinking effort',\n high: 'High thinking effort',\n xhigh: 'Extra high thinking effort',\n adaptive: 'Auto-adjust based on task complexity',\n };\n \n return {\n content: `🧠 *Thinking Level Set*\\n\\n` +\n `Level: *${level}*\\n` +\n `${levelDescriptions[level]}\\n\\n` +\n `Applies for this gateway process (until restart). Persists only if you use /config set.`,\n success: true,\n };\n },\n};\n\n// Reasoning command\nconst reasoningCommand: CommandDefinition = {\n id: 'agent.reasoning',\n name: 'reasoning',\n description: 'Set reasoning visibility (usage: /reasoning <mode>)',\n category: 'model',\n scope: ['global', 'private', 'group'],\n acceptsArgs: true,\n examples: ['/reasoning', '/reasoning on', '/reasoning stream', '/reasoning off'],\n handler: async (ctx: CommandContext, args: string) => {\n await ctx.setTyping(true);\n\n if (!args.trim()) {\n // Show current reasoning level\n const currentLevel = await ctx.getReasoningLevel?.();\n \n return {\n content: `💭 *Reasoning Visibility*\\n\\n` +\n `Current: *${currentLevel || 'default'}*\\n\\n` +\n `Available modes:\\n` +\n `• off - Hide reasoning\\n` +\n `• on - Show reasoning after completion\\n` +\n `• stream - Stream reasoning in real-time\\n\\n` +\n `Usage: /reasoning <mode>\\n` +\n `Example: /reasoning stream`,\n success: true,\n };\n }\n \n // Parse and validate the level\n const level = normalizeReasoningLevel(args.trim());\n if (!level) {\n return {\n content: `❌ Invalid reasoning mode: ${args}\\n\\n` +\n `Available modes: off, on, stream\\n\\n` +\n `Usage: /reasoning <mode>\\n` +\n `Example: /reasoning stream`,\n success: false,\n };\n }\n \n await setSessionAgentField(ctx.getSessionConfigStore?.(), ctx.sessionKey, 'reasoningLevel', level);\n\n const modeDescriptions: Record<ReasoningLevel, string> = {\n off: 'Hide reasoning from user',\n on: 'Show reasoning after completion',\n stream: 'Stream reasoning in real-time',\n };\n \n return {\n content: `💭 *Reasoning Visibility Set*\\n\\n` +\n `Mode: *${level}*\\n` +\n `${modeDescriptions[level]}\\n\\n` +\n `Applies for this gateway process (until restart). Persists only if you use /config set.`,\n success: true,\n };\n },\n};\n\n// Verbose command\nconst verboseCommand: CommandDefinition = {\n id: 'agent.verbose',\n name: 'verbose',\n description: 'Toggle verbose mode (usage: /verbose [on|off|full])',\n category: 'model',\n scope: ['global', 'private', 'group'],\n acceptsArgs: true,\n examples: ['/verbose', '/verbose on', '/verbose off', '/verbose full'],\n handler: async (ctx: CommandContext, args: string) => {\n await ctx.setTyping(true);\n\n if (!args.trim()) {\n // Toggle verbose mode\n const currentLevel = await ctx.getVerboseLevel?.();\n const newLevel: VerboseLevel = currentLevel === 'on' ? 'off' : 'on';\n\n await setSessionAgentField(ctx.getSessionConfigStore?.(), ctx.sessionKey, 'verboseLevel', newLevel);\n\n return {\n content: `📝 *Verbose Mode*\\n\\n` +\n `Mode: *${newLevel}*\\n\\n` +\n `${newLevel === 'on' ? 'Verbose output enabled (process lifetime).' : 'Verbose output disabled (process lifetime).'}`,\n success: true,\n };\n }\n \n // Parse and validate the level\n const level = normalizeVerboseLevel(args.trim());\n if (!level) {\n return {\n content: `❌ Invalid verbose mode: ${args}\\n\\n` +\n `Available modes: off, on, full\\n\\n` +\n `Usage: /verbose [mode]\\n` +\n `Example: /verbose on`,\n success: false,\n };\n }\n \n await setSessionAgentField(ctx.getSessionConfigStore?.(), ctx.sessionKey, 'verboseLevel', level);\n\n const modeDescriptions: Record<VerboseLevel, string> = {\n off: 'Minimal output',\n on: 'Normal verbose output',\n full: 'Full verbose output with all details',\n };\n\n return {\n content: `📝 *Verbose Mode Set*\\n\\n` +\n `Mode: *${level}*\\n` +\n `${modeDescriptions[level]}\\n\\n` +\n `Applies for this gateway process (until restart). Persists only if you use /config set.`,\n success: true,\n };\n },\n};\n\n// Status command - enhanced to show thinking/reasoning/verbose\nconst enhancedStatusCommand: CommandDefinition = {\n id: 'agent.status',\n name: 'status',\n description: 'Show current agent status including thinking settings',\n category: 'system',\n scope: ['global', 'private', 'group'],\n handler: async (ctx: CommandContext) => {\n await ctx.setTyping(true);\n\n const currentModel = ctx.getCurrentModel();\n const thinkingLevel = await ctx.getThinkingLevel?.();\n const reasoningLevel = await ctx.getReasoningLevel?.();\n const verboseLevel = await ctx.getVerboseLevel?.();\n const usage = await ctx.getUsage();\n \n // Build status message\n const lines = [\n '📊 *Agent Status*',\n '',\n `🤖 *Model:* \\`${currentModel}\\``,\n `🧠 *Thinking:* \\`${thinkingLevel || 'default'}\\``,\n `💭 *Reasoning:* \\`${reasoningLevel || 'default'}\\``,\n `📝 *Verbose:* \\`${verboseLevel || 'default'}\\``,\n '',\n '---',\n '',\n '📈 *Session Usage*',\n `💬 Messages: ${usage.messageCount}`,\n `📥 Prompt: ${usage.promptTokens.toLocaleString()} tokens`,\n `📤 Completion: ${usage.completionTokens.toLocaleString()} tokens`,\n `📊 Total: ${usage.totalTokens.toLocaleString()} tokens`,\n ];\n \n return {\n content: lines.join('\\n'),\n success: true,\n };\n },\n};\n\n// Register all thinking commands\nexport function registerThinkingCommands(): void {\n commandRegistry.register(thinkCommand);\n commandRegistry.register(reasoningCommand);\n commandRegistry.register(verboseCommand);\n commandRegistry.register(enhancedStatusCommand);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"thinking.js","names":[],"sources":["../../../../src/chat-commands/builtins/thinking.ts"],"sourcesContent":["/**\n * Thinking Commands\n * \n * Built-in commands for thinking ability management:\n * - /think - Set thinking level\n * - /reasoning - Set reasoning visibility\n * - /verbose - Set verbose mode\n * - /status - Show current status (including thinking/reasoning/verbose)\n */\n\nimport type { CommandDefinition, CommandContext } from '../types.js';\nimport { commandRegistry } from '../registry.js';\nimport {\n normalizeThinkLevel,\n normalizeReasoningLevel,\n normalizeVerboseLevel,\n formatThinkingLevels,\n type ThinkLevel,\n type ReasoningLevel,\n type VerboseLevel,\n} from '../../agent/transcript/thinking-types.js';\nimport type { SessionConfigStore } from '../../session/index.js';\n\nasync function setSessionAgentField<K extends 'thinkingLevel' | 'reasoningLevel' | 'verboseLevel'>(\n store: SessionConfigStore | undefined,\n sessionKey: string,\n field: K,\n value: K extends 'thinkingLevel' ? ThinkLevel : K extends 'reasoningLevel' ? ReasoningLevel : VerboseLevel,\n): Promise<void> {\n if (!store) return;\n const existing = (await store.get(sessionKey)) ?? {};\n await store.set(sessionKey, { ...existing, [field]: value });\n}\n\n// Think command\nconst thinkCommand: CommandDefinition = {\n id: 'agent.think',\n name: 'think',\n description: 'Set thinking level (usage: /think <level>)',\n category: 'model',\n scope: ['global', 'private', 'group'],\n acceptsArgs: true,\n examples: ['/think', '/think high', '/think off', '/think adaptive'],\n handler: async (ctx: CommandContext, args: string) => {\n await ctx.setTyping(true);\n\n if (!args.trim()) {\n // Show current thinking level\n const currentLevel = await ctx.getThinkingLevel?.();\n \n return {\n content: `🧠 *Thinking Level*\\n\\n` +\n `Current: *${currentLevel || 'default'}*\\n\\n` +\n `Available levels:\\n` +\n `• off - No thinking\\n` +\n `• minimal - Minimal thinking\\n` +\n `• low - Low thinking\\n` +\n `• medium - Medium thinking (default)\\n` +\n `• high - High thinking\\n` +\n `• xhigh - Extra high (certain models)\\n` +\n `• adaptive - Auto-adjust based on task\\n\\n` +\n `Usage: /think <level>\\n` +\n `Example: /think high`,\n success: true,\n };\n }\n \n // Parse and validate the level\n const level = normalizeThinkLevel(args.trim());\n if (!level) {\n const levels = formatThinkingLevels();\n return {\n content: `❌ Invalid thinking level: ${args}\\n\\n` +\n `Available levels: ${levels}\\n\\n` +\n `Usage: /think <level>\\n` +\n `Example: /think high`,\n success: false,\n };\n }\n \n await setSessionAgentField(ctx.getSessionConfigStore?.(), ctx.sessionKey, 'thinkingLevel', level);\n ctx.syncAgentThinkingLevel?.(level);\n\n const levelDescriptions: Record<ThinkLevel, string> = {\n off: 'No thinking',\n minimal: 'Minimal thinking effort',\n low: 'Low thinking effort',\n medium: 'Medium thinking effort',\n high: 'High thinking effort',\n xhigh: 'Extra high thinking effort',\n adaptive: 'Auto-adjust based on task complexity',\n };\n \n return {\n content: `🧠 *Thinking Level Set*\\n\\n` +\n `Level: *${level}*\\n` +\n `${levelDescriptions[level]}\\n\\n` +\n `Applies for this gateway process (until restart). Persists only if you use /config set.`,\n success: true,\n };\n },\n};\n\n// Reasoning command\nconst reasoningCommand: CommandDefinition = {\n id: 'agent.reasoning',\n name: 'reasoning',\n description: 'Set reasoning visibility (usage: /reasoning <mode>)',\n category: 'model',\n scope: ['global', 'private', 'group'],\n acceptsArgs: true,\n examples: ['/reasoning', '/reasoning on', '/reasoning stream', '/reasoning off'],\n handler: async (ctx: CommandContext, args: string) => {\n await ctx.setTyping(true);\n\n if (!args.trim()) {\n // Show current reasoning level\n const currentLevel = await ctx.getReasoningLevel?.();\n \n return {\n content: `💭 *Reasoning Visibility*\\n\\n` +\n `Current: *${currentLevel || 'default'}*\\n\\n` +\n `Available modes:\\n` +\n `• off - Hide reasoning\\n` +\n `• on - Show reasoning after completion\\n` +\n `• stream - Stream reasoning in real-time\\n\\n` +\n `Usage: /reasoning <mode>\\n` +\n `Example: /reasoning stream`,\n success: true,\n };\n }\n \n // Parse and validate the level\n const level = normalizeReasoningLevel(args.trim());\n if (!level) {\n return {\n content: `❌ Invalid reasoning mode: ${args}\\n\\n` +\n `Available modes: off, on, stream\\n\\n` +\n `Usage: /reasoning <mode>\\n` +\n `Example: /reasoning stream`,\n success: false,\n };\n }\n \n await setSessionAgentField(ctx.getSessionConfigStore?.(), ctx.sessionKey, 'reasoningLevel', level);\n\n const modeDescriptions: Record<ReasoningLevel, string> = {\n off: 'Hide reasoning from user',\n on: 'Show reasoning after completion',\n stream: 'Stream reasoning in real-time',\n };\n \n return {\n content: `💭 *Reasoning Visibility Set*\\n\\n` +\n `Mode: *${level}*\\n` +\n `${modeDescriptions[level]}\\n\\n` +\n `Applies for this gateway process (until restart). Persists only if you use /config set.`,\n success: true,\n };\n },\n};\n\n// Verbose command\nconst verboseCommand: CommandDefinition = {\n id: 'agent.verbose',\n name: 'verbose',\n description: 'Toggle verbose mode (usage: /verbose [on|off|full])',\n category: 'model',\n scope: ['global', 'private', 'group'],\n acceptsArgs: true,\n examples: ['/verbose', '/verbose on', '/verbose off', '/verbose full'],\n handler: async (ctx: CommandContext, args: string) => {\n await ctx.setTyping(true);\n\n if (!args.trim()) {\n // Toggle verbose mode\n const currentLevel = await ctx.getVerboseLevel?.();\n const newLevel: VerboseLevel = currentLevel === 'on' ? 'off' : 'on';\n\n await setSessionAgentField(ctx.getSessionConfigStore?.(), ctx.sessionKey, 'verboseLevel', newLevel);\n\n return {\n content: `📝 *Verbose Mode*\\n\\n` +\n `Mode: *${newLevel}*\\n\\n` +\n `${newLevel === 'on' ? 'Verbose output enabled (process lifetime).' : 'Verbose output disabled (process lifetime).'}`,\n success: true,\n };\n }\n \n // Parse and validate the level\n const level = normalizeVerboseLevel(args.trim());\n if (!level) {\n return {\n content: `❌ Invalid verbose mode: ${args}\\n\\n` +\n `Available modes: off, on, full\\n\\n` +\n `Usage: /verbose [mode]\\n` +\n `Example: /verbose on`,\n success: false,\n };\n }\n \n await setSessionAgentField(ctx.getSessionConfigStore?.(), ctx.sessionKey, 'verboseLevel', level);\n\n const modeDescriptions: Record<VerboseLevel, string> = {\n off: 'Minimal output',\n on: 'Normal verbose output',\n full: 'Full verbose output with all details',\n };\n\n return {\n content: `📝 *Verbose Mode Set*\\n\\n` +\n `Mode: *${level}*\\n` +\n `${modeDescriptions[level]}\\n\\n` +\n `Applies for this gateway process (until restart). Persists only if you use /config set.`,\n success: true,\n };\n },\n};\n\n// Status command - enhanced to show thinking/reasoning/verbose\nconst enhancedStatusCommand: CommandDefinition = {\n id: 'agent.status',\n name: 'status',\n description: 'Show current agent status including thinking settings',\n category: 'system',\n scope: ['global', 'private', 'group'],\n handler: async (ctx: CommandContext) => {\n await ctx.setTyping(true);\n\n const currentModel = ctx.getCurrentModel();\n const thinkingLevel = await ctx.getThinkingLevel?.();\n const reasoningLevel = await ctx.getReasoningLevel?.();\n const verboseLevel = await ctx.getVerboseLevel?.();\n const usage = await ctx.getUsage();\n \n // Build status message\n const lines = [\n '📊 *Agent Status*',\n '',\n `🤖 *Model:* \\`${currentModel}\\``,\n `🧠 *Thinking:* \\`${thinkingLevel || 'default'}\\``,\n `💭 *Reasoning:* \\`${reasoningLevel || 'default'}\\``,\n `📝 *Verbose:* \\`${verboseLevel || 'default'}\\``,\n '',\n '---',\n '',\n '📈 *Session Usage*',\n `💬 Messages: ${usage.messageCount}`,\n `📥 Prompt: ${usage.promptTokens.toLocaleString()} tokens`,\n `📤 Completion: ${usage.completionTokens.toLocaleString()} tokens`,\n `📊 Total: ${usage.totalTokens.toLocaleString()} tokens`,\n ];\n \n return {\n content: lines.join('\\n'),\n success: true,\n };\n },\n};\n\n// Register all thinking commands\nexport function registerThinkingCommands(): void {\n commandRegistry.register(thinkCommand);\n commandRegistry.register(reasoningCommand);\n commandRegistry.register(verboseCommand);\n commandRegistry.register(enhancedStatusCommand);\n}\n"],"mappings":"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"}
|
|
@@ -36,45 +36,6 @@ const cliCommandCatalog = [
|
|
|
36
36
|
commandPath: ["onboard"],
|
|
37
37
|
policy: { loadExtensions: "never" }
|
|
38
38
|
},
|
|
39
|
-
{
|
|
40
|
-
commandPath: ["cron"],
|
|
41
|
-
policy: { loadExtensions: "never" }
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
commandPath: ["cron", "list"],
|
|
45
|
-
exact: true,
|
|
46
|
-
policy: { loadExtensions: "never" }
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
commandPath: ["cron", "add"],
|
|
50
|
-
exact: true,
|
|
51
|
-
policy: { loadExtensions: "never" }
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
commandPath: ["cron", "remove"],
|
|
55
|
-
exact: true,
|
|
56
|
-
policy: { loadExtensions: "never" }
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
commandPath: ["cron", "enable"],
|
|
60
|
-
exact: true,
|
|
61
|
-
policy: { loadExtensions: "never" }
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
commandPath: ["cron", "disable"],
|
|
65
|
-
exact: true,
|
|
66
|
-
policy: { loadExtensions: "never" }
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
commandPath: ["cron", "run"],
|
|
70
|
-
exact: true,
|
|
71
|
-
policy: { loadExtensions: "never" }
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
commandPath: ["cron", "trigger"],
|
|
75
|
-
exact: true,
|
|
76
|
-
policy: { loadExtensions: "never" }
|
|
77
|
-
},
|
|
78
39
|
{
|
|
79
40
|
commandPath: ["goal"],
|
|
80
41
|
policy: { loadExtensions: "never" }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-catalog.js","names":[],"sources":["../../../src/cli/command-catalog.ts"],"sourcesContent":["export type CliExtensionLoadPolicy = 'never' | 'when-configured' | 'always';\nexport type CliGatewaySubcommandPolicy = 'lazy' | 'eager';\n\nexport type CliCommandPathPolicy = {\n loadExtensions: CliExtensionLoadPolicy;\n gatewaySubcommands: CliGatewaySubcommandPolicy;\n};\n\nexport type CliCommandCatalogEntry = {\n commandPath: readonly string[];\n exact?: boolean;\n policy?: Partial<CliCommandPathPolicy>;\n};\n\nexport const cliCommandCatalog: readonly CliCommandCatalogEntry[] = [\n { commandPath: ['init'], policy: { loadExtensions: 'never' } },\n { commandPath: ['profile'], policy: { loadExtensions: 'never' } },\n { commandPath: ['profile', 'list'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['profile', 'create'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['profile', 'delete'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['profile', 'switch'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['setup'], policy: { loadExtensions: 'never' } },\n { commandPath: ['onboard'], policy: { loadExtensions: 'never' } },\n { commandPath: ['cron'], policy: { loadExtensions: 'never' } },\n { commandPath: ['cron', 'list'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['cron', 'add'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['cron', 'remove'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['cron', 'enable'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['cron', 'disable'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['cron', 'run'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['cron', 'trigger'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal'], policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'list'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'new'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'show'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'pause'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'resume'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'archive'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'runs'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'checklist'], policy: { loadExtensions: 'never' } },\n { commandPath: ['config'], policy: { loadExtensions: 'never' } },\n { commandPath: ['doctor'], policy: { loadExtensions: 'never' } },\n { commandPath: ['models'], policy: { loadExtensions: 'never' } },\n { commandPath: ['providers'], policy: { loadExtensions: 'never' } },\n { commandPath: ['auth'], policy: { loadExtensions: 'never' } },\n { commandPath: ['logs'], policy: { loadExtensions: 'never' } },\n { commandPath: ['update'], policy: { loadExtensions: 'never' } },\n { commandPath: ['session'], policy: { loadExtensions: 'never' } },\n { commandPath: ['search'], policy: { loadExtensions: 'never' } },\n { commandPath: ['voice'], policy: { loadExtensions: 'never' } },\n { commandPath: ['image'], policy: { loadExtensions: 'never' } },\n { commandPath: ['skills'], policy: { loadExtensions: 'never' } },\n { commandPath: ['tailscale'], policy: { loadExtensions: 'never' } },\n { commandPath: ['tunnel'], policy: { loadExtensions: 'never' } },\n { commandPath: ['browser'], policy: { loadExtensions: 'never' } },\n { commandPath: ['tui'], policy: { loadExtensions: 'when-configured' } },\n { commandPath: ['agent'], policy: { loadExtensions: 'when-configured' } },\n { commandPath: ['channels'], policy: { loadExtensions: 'always' } },\n { commandPath: ['extensions'], policy: { loadExtensions: 'always' } },\n { commandPath: ['agents'], policy: { loadExtensions: 'when-configured' } },\n {\n commandPath: ['gateway'],\n exact: true,\n policy: { loadExtensions: 'never', gatewaySubcommands: 'lazy' },\n },\n { commandPath: ['gateway', 'token'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'status'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'health'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'call'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'probe'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'stop'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'restart'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'logs'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'install'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'uninstall'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'start'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'status'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'stop'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'restart'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'ssh-tunnel'], exact: true, policy: { loadExtensions: 'never' } },\n];\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"command-catalog.js","names":[],"sources":["../../../src/cli/command-catalog.ts"],"sourcesContent":["export type CliExtensionLoadPolicy = 'never' | 'when-configured' | 'always';\nexport type CliGatewaySubcommandPolicy = 'lazy' | 'eager';\n\nexport type CliCommandPathPolicy = {\n loadExtensions: CliExtensionLoadPolicy;\n gatewaySubcommands: CliGatewaySubcommandPolicy;\n};\n\nexport type CliCommandCatalogEntry = {\n commandPath: readonly string[];\n exact?: boolean;\n policy?: Partial<CliCommandPathPolicy>;\n};\n\nexport const cliCommandCatalog: readonly CliCommandCatalogEntry[] = [\n { commandPath: ['init'], policy: { loadExtensions: 'never' } },\n { commandPath: ['profile'], policy: { loadExtensions: 'never' } },\n { commandPath: ['profile', 'list'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['profile', 'create'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['profile', 'delete'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['profile', 'switch'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['setup'], policy: { loadExtensions: 'never' } },\n { commandPath: ['onboard'], policy: { loadExtensions: 'never' } },\n { commandPath: ['goal'], policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'list'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'new'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'show'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'pause'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'resume'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'archive'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'runs'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['goal', 'checklist'], policy: { loadExtensions: 'never' } },\n { commandPath: ['config'], policy: { loadExtensions: 'never' } },\n { commandPath: ['doctor'], policy: { loadExtensions: 'never' } },\n { commandPath: ['models'], policy: { loadExtensions: 'never' } },\n { commandPath: ['providers'], policy: { loadExtensions: 'never' } },\n { commandPath: ['auth'], policy: { loadExtensions: 'never' } },\n { commandPath: ['logs'], policy: { loadExtensions: 'never' } },\n { commandPath: ['update'], policy: { loadExtensions: 'never' } },\n { commandPath: ['session'], policy: { loadExtensions: 'never' } },\n { commandPath: ['search'], policy: { loadExtensions: 'never' } },\n { commandPath: ['voice'], policy: { loadExtensions: 'never' } },\n { commandPath: ['image'], policy: { loadExtensions: 'never' } },\n { commandPath: ['skills'], policy: { loadExtensions: 'never' } },\n { commandPath: ['tailscale'], policy: { loadExtensions: 'never' } },\n { commandPath: ['tunnel'], policy: { loadExtensions: 'never' } },\n { commandPath: ['browser'], policy: { loadExtensions: 'never' } },\n { commandPath: ['tui'], policy: { loadExtensions: 'when-configured' } },\n { commandPath: ['agent'], policy: { loadExtensions: 'when-configured' } },\n { commandPath: ['channels'], policy: { loadExtensions: 'always' } },\n { commandPath: ['extensions'], policy: { loadExtensions: 'always' } },\n { commandPath: ['agents'], policy: { loadExtensions: 'when-configured' } },\n {\n commandPath: ['gateway'],\n exact: true,\n policy: { loadExtensions: 'never', gatewaySubcommands: 'lazy' },\n },\n { commandPath: ['gateway', 'token'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'status'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'health'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'call'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'probe'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'stop'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'restart'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'logs'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'install'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'uninstall'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'start'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'status'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'stop'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'service', 'restart'], exact: true, policy: { loadExtensions: 'never' } },\n { commandPath: ['gateway', 'ssh-tunnel'], exact: true, policy: { loadExtensions: 'never' } },\n];\n"],"mappings":"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"}
|
|
@@ -12,7 +12,6 @@ const REGISTRY_COMMAND_MODULES = {
|
|
|
12
12
|
gateway: () => import("./commands/gateway.js"),
|
|
13
13
|
session: () => import("./commands/session.js"),
|
|
14
14
|
goal: () => import("./commands/goal.js"),
|
|
15
|
-
cron: () => import("./commands/cron.js"),
|
|
16
15
|
config: () => import("./commands/config.js"),
|
|
17
16
|
doctor: () => import("./commands/doctor/index.js"),
|
|
18
17
|
image: () => import("./commands/image.js"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-loaders.js","names":[],"sources":["../../../src/cli/command-loaders.ts"],"sourcesContent":["/**\n * Lazy command loaders.\n *\n * Modules here trigger their `register({...})` side effect on import; the\n * caller then mounts the requested command via `registry.installOne` (or via\n * the explicit registrar functions for non-registry commands).\n *\n * Keeping this map static-but-thunked means `bin.ts` short-circuits and\n * `runCli` can resolve a single subcommand without paying for unrelated\n * command modules.\n */\nimport type { Command } from 'commander';\nimport { resolveCliCatalogCommandPath } from './command-path-policy.js';\nimport { shouldLoadExtensionCliForCommandPath } from './command-startup-policy.js';\nimport { registry, type CLIContext } from './registry.js';\n\nexport type CommandLoader = () => Promise<unknown>;\n\nexport const REGISTRY_COMMAND_MODULES: Record<string, CommandLoader> = {\n init: () => import('./commands/init.js'),\n profile: () => import('./commands/profile.js'),\n setup: () => import('./commands/setup.js'),\n onboard: () => import('./commands/onboard.js'),\n agent: () => import('./commands/agent.js'),\n tui: () => import('./commands/tui.js'),\n gateway: () => import('./commands/gateway.js'),\n session: () => import('./commands/session.js'),\n goal: () => import('./commands/goal.js'),\n
|
|
1
|
+
{"version":3,"file":"command-loaders.js","names":[],"sources":["../../../src/cli/command-loaders.ts"],"sourcesContent":["/**\n * Lazy command loaders.\n *\n * Modules here trigger their `register({...})` side effect on import; the\n * caller then mounts the requested command via `registry.installOne` (or via\n * the explicit registrar functions for non-registry commands).\n *\n * Keeping this map static-but-thunked means `bin.ts` short-circuits and\n * `runCli` can resolve a single subcommand without paying for unrelated\n * command modules.\n */\nimport type { Command } from 'commander';\nimport { resolveCliCatalogCommandPath } from './command-path-policy.js';\nimport { shouldLoadExtensionCliForCommandPath } from './command-startup-policy.js';\nimport { registry, type CLIContext } from './registry.js';\n\nexport type CommandLoader = () => Promise<unknown>;\n\nexport const REGISTRY_COMMAND_MODULES: Record<string, CommandLoader> = {\n init: () => import('./commands/init.js'),\n profile: () => import('./commands/profile.js'),\n setup: () => import('./commands/setup.js'),\n onboard: () => import('./commands/onboard.js'),\n agent: () => import('./commands/agent.js'),\n tui: () => import('./commands/tui.js'),\n gateway: () => import('./commands/gateway.js'),\n session: () => import('./commands/session.js'),\n goal: () => import('./commands/goal.js'),\n config: () => import('./commands/config.js'),\n doctor: () => import('./commands/doctor/index.js'),\n image: () => import('./commands/image.js'),\n channels: () => import('./commands/channels.js'),\n models: () => import('./commands/models.js'),\n providers: () => import('./commands/providers.js'),\n voice: () => import('./commands/voice.js'),\n search: () => import('./commands/search.js'),\n auth: () => import('./commands/auth.js'),\n skills: () => import('./commands/skills.js'),\n browser: () => import('./commands/browser.js'),\n update: () => import('./commands/update.js'),\n logs: () => import('./commands/logs.js'),\n tunnel: () => import('./commands/tunnel.js'),\n tailscale: () => import('./commands/tailscale.js'),\n};\n\nexport interface NonRegistryMatcher {\n matches: (name: string) => boolean;\n load: (program: Command) => Promise<void>;\n}\n\nexport const NON_REGISTRY_COMMAND_MATCHERS: NonRegistryMatcher[] = [\n {\n matches: (name) => name === 'agents' || name.startsWith('agents:'),\n load: async (program) => {\n const { registerAgentsCli } = await import('./commands/agents.js');\n registerAgentsCli(program);\n },\n },\n {\n matches: (name) => name === 'extensions',\n load: async (program) => {\n const { registerExtensionCommands } = await import('./commands/extension.js');\n registerExtensionCommands(program);\n const commandPath = resolveCliCatalogCommandPath(process.argv);\n if (shouldLoadExtensionCliForCommandPath(commandPath)) {\n const { registerExtensionCliCommands } = await import('./extension-cli-register.js');\n await registerExtensionCliCommands(program);\n }\n },\n },\n];\n\nconst FLAGS_WITH_VALUE = new Set(['--config', '--workspace']);\n\n/**\n * Resolve which command module to load based on argv. Skips global flags\n * (`--verbose`/`--config <path>`/`--workspace <path>`) and treats\n * `help <cmd>` as if the user had typed `<cmd>`, so that `xopc help gateway`\n * loads only the gateway module.\n */\nexport function resolveCommandName(argv: string[]): string | undefined {\n let i = 2;\n let firstSubcommand: string | undefined;\n while (i < argv.length) {\n const arg = argv[i];\n if (!arg) {\n i += 1;\n continue;\n }\n if (arg.startsWith('-')) {\n i += FLAGS_WITH_VALUE.has(arg) ? 2 : 1;\n continue;\n }\n if (firstSubcommand === undefined) {\n firstSubcommand = arg;\n if (arg === 'help') {\n i += 1;\n continue;\n }\n return arg;\n }\n return arg;\n }\n return firstSubcommand;\n}\n\nexport async function tryLoadCommand(\n program: Command,\n ctx: CLIContext,\n name: string,\n getCtx?: () => CLIContext,\n): Promise<boolean> {\n const moduleLoader = REGISTRY_COMMAND_MODULES[name];\n if (moduleLoader) {\n await moduleLoader();\n const installed = registry.installOne(program, name, ctx, getCtx);\n if (installed && name === 'gateway') {\n const gatewayCmd = program.commands.find((command) => command.name() === 'gateway');\n if (gatewayCmd) {\n const { prepareGatewayCommandForArgv } = await import('./commands/gateway.js');\n await prepareGatewayCommandForArgv(gatewayCmd, ctx);\n }\n }\n return installed;\n }\n const matcher = NON_REGISTRY_COMMAND_MATCHERS.find((m) => m.matches(name));\n if (matcher) {\n await matcher.load(program);\n return true;\n }\n return false;\n}\n\nexport async function loadAllCommands(\n program: Command,\n ctx: CLIContext,\n getCtx?: () => CLIContext,\n): Promise<void> {\n // Sequential to keep registration order deterministic; registry.install\n // sorts by category and is stable within a category.\n for (const loader of Object.values(REGISTRY_COMMAND_MODULES)) {\n await loader();\n }\n registry.install(program, ctx, getCtx);\n for (const matcher of NON_REGISTRY_COMMAND_MATCHERS) {\n await matcher.load(program);\n }\n const gatewayCmd = program.commands.find((command) => command.name() === 'gateway');\n if (gatewayCmd) {\n const { prepareGatewayCommandForArgv } = await import('./commands/gateway.js');\n await prepareGatewayCommandForArgv(gatewayCmd, ctx);\n }\n}\n"],"mappings":";;;;AAkBA,MAAa,2BAA0D;CACrE,YAAY,OAAO;CACnB,eAAe,OAAO;CACtB,aAAa,OAAO;CACpB,eAAe,OAAO;CACtB,aAAa,OAAO;CACpB,WAAW,OAAO;CAClB,eAAe,OAAO;CACtB,eAAe,OAAO;CACtB,YAAY,OAAO;CACnB,cAAc,OAAO;CACrB,cAAc,OAAO;CACrB,aAAa,OAAO;CACpB,gBAAgB,OAAO;CACvB,cAAc,OAAO;CACrB,iBAAiB,OAAO;CACxB,aAAa,OAAO;CACpB,cAAc,OAAO;CACrB,YAAY,OAAO;CACnB,cAAc,OAAO;CACrB,eAAe,OAAO;CACtB,cAAc,OAAO;CACrB,YAAY,OAAO;CACnB,cAAc,OAAO;CACrB,iBAAiB,OAAO;CACzB;AAOD,MAAa,gCAAsD,CACjE;CACE,UAAU,SAAS,SAAS,YAAY,KAAK,WAAW,UAAU;CAClE,MAAM,OAAO,YAAY;EACvB,MAAM,EAAE,sBAAsB,MAAM,OAAO;AAC3C,oBAAkB,QAAQ;;CAE7B,EACD;CACE,UAAU,SAAS,SAAS;CAC5B,MAAM,OAAO,YAAY;EACvB,MAAM,EAAE,8BAA8B,MAAM,OAAO;AACnD,4BAA0B,QAAQ;AAElC,MAAI,qCADgB,6BAA6B,QAAQ,KACL,CAAC,EAAE;GACrD,MAAM,EAAE,iCAAiC,MAAM,OAAO;AACtD,SAAM,6BAA6B,QAAQ;;;CAGhD,CACF;AAED,MAAM,mBAAmB,IAAI,IAAI,CAAC,YAAY,cAAc,CAAC;;;;;;;AAQ7D,SAAgB,mBAAmB,MAAoC;CACrE,IAAI,IAAI;CACR,IAAI;AACJ,QAAO,IAAI,KAAK,QAAQ;EACtB,MAAM,MAAM,KAAK;AACjB,MAAI,CAAC,KAAK;AACR,QAAK;AACL;;AAEF,MAAI,IAAI,WAAW,IAAI,EAAE;AACvB,QAAK,iBAAiB,IAAI,IAAI,GAAG,IAAI;AACrC;;AAEF,MAAI,oBAAoB,KAAA,GAAW;AACjC,qBAAkB;AAClB,OAAI,QAAQ,QAAQ;AAClB,SAAK;AACL;;AAEF,UAAO;;AAET,SAAO;;AAET,QAAO;;AAGT,eAAsB,eACpB,SACA,KACA,MACA,QACkB;CAClB,MAAM,eAAe,yBAAyB;AAC9C,KAAI,cAAc;AAChB,QAAM,cAAc;EACpB,MAAM,YAAY,SAAS,WAAW,SAAS,MAAM,KAAK,OAAO;AACjE,MAAI,aAAa,SAAS,WAAW;GACnC,MAAM,aAAa,QAAQ,SAAS,MAAM,YAAY,QAAQ,MAAM,KAAK,UAAU;AACnF,OAAI,YAAY;IACd,MAAM,EAAE,iCAAiC,MAAM,OAAO;AACtD,UAAM,6BAA6B,YAAY,IAAI;;;AAGvD,SAAO;;CAET,MAAM,UAAU,8BAA8B,MAAM,MAAM,EAAE,QAAQ,KAAK,CAAC;AAC1E,KAAI,SAAS;AACX,QAAM,QAAQ,KAAK,QAAQ;AAC3B,SAAO;;AAET,QAAO;;AAGT,eAAsB,gBACpB,SACA,KACA,QACe;AAGf,MAAK,MAAM,UAAU,OAAO,OAAO,yBAAyB,CAC1D,OAAM,QAAQ;AAEhB,UAAS,QAAQ,SAAS,KAAK,OAAO;AACtC,MAAK,MAAM,WAAW,8BACpB,OAAM,QAAQ,KAAK,QAAQ;CAE7B,MAAM,aAAa,QAAQ,SAAS,MAAM,YAAY,QAAQ,MAAM,KAAK,UAAU;AACnF,KAAI,YAAY;EACd,MAAM,EAAE,iCAAiC,MAAM,OAAO;AACtD,QAAM,6BAA6B,YAAY,IAAI"}
|