@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
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { init_providers, resolveModel } from "../../providers/index.js";
|
|
2
|
-
import { resolveAgentTurnTimeoutMs, runAgentTurnWithTimeout } from "./run-agent-turn-with-timeout.js";
|
|
3
|
-
import { isAssistantTurnAborted, isAssistantTurnFailed, maybeRetryTurnAfterTransientLlmFailure } from "./llm-turn-retry.js";
|
|
4
|
-
//#region src/agent/orchestration/run-agent-turn-with-fallbacks.ts
|
|
5
|
-
init_providers();
|
|
6
|
-
async function runAgentTurnWithModelFallbacks(params) {
|
|
7
|
-
const { agent, sessionKey, modelManager, userMessage, log } = params;
|
|
8
|
-
const timeoutMs = params.timeoutMs ?? resolveAgentTurnTimeoutMs(params.getConfig?.());
|
|
9
|
-
const beforeUserPrompt = params.beforeUserPrompt ?? (async () => {});
|
|
10
|
-
const afterUserPrompt = params.afterUserPrompt ?? (async () => {});
|
|
11
|
-
const candidates = modelManager.getFallbackCandidatesForSession(sessionKey);
|
|
12
|
-
if (candidates.length === 0) throw new Error("No model candidates available. Configure agent manifest models and provider API keys.");
|
|
13
|
-
let lastError;
|
|
14
|
-
for (let i = 0; i < candidates.length; i++) {
|
|
15
|
-
const candidate = candidates[i];
|
|
16
|
-
const modelRef = `${candidate.provider}/${candidate.model}`;
|
|
17
|
-
let resolved;
|
|
18
|
-
try {
|
|
19
|
-
resolved = resolveModel(modelRef);
|
|
20
|
-
} catch (err) {
|
|
21
|
-
lastError = err;
|
|
22
|
-
log.warn({
|
|
23
|
-
err,
|
|
24
|
-
modelRef,
|
|
25
|
-
attempt: i + 1
|
|
26
|
-
}, "Skipping model candidate (resolve failed)");
|
|
27
|
-
continue;
|
|
28
|
-
}
|
|
29
|
-
const beforeLen = agent.state.messages.length;
|
|
30
|
-
try {
|
|
31
|
-
modelManager.applyResolvedModel(agent, resolved, modelRef);
|
|
32
|
-
log.info({
|
|
33
|
-
attempt: i + 1,
|
|
34
|
-
total: candidates.length,
|
|
35
|
-
provider: candidate.provider,
|
|
36
|
-
model: candidate.model
|
|
37
|
-
}, "Running agent turn");
|
|
38
|
-
const runTurn = async () => {
|
|
39
|
-
await beforeUserPrompt();
|
|
40
|
-
await agent.prompt(userMessage);
|
|
41
|
-
await afterUserPrompt();
|
|
42
|
-
await agent.waitForIdle();
|
|
43
|
-
await maybeRetryTurnAfterTransientLlmFailure(agent, {
|
|
44
|
-
sessionKey,
|
|
45
|
-
log
|
|
46
|
-
});
|
|
47
|
-
};
|
|
48
|
-
await runAgentTurnWithTimeout(agent, runTurn, timeoutMs);
|
|
49
|
-
if (isAssistantTurnAborted(agent)) return;
|
|
50
|
-
if (!isAssistantTurnFailed(agent)) return;
|
|
51
|
-
lastError = /* @__PURE__ */ new Error(`Assistant turn failed: ${modelRef}`);
|
|
52
|
-
log.warn({
|
|
53
|
-
sessionKey,
|
|
54
|
-
attempt: i + 1,
|
|
55
|
-
total: candidates.length,
|
|
56
|
-
modelRef
|
|
57
|
-
}, "Model turn failed after retries, trying fallback");
|
|
58
|
-
} catch (err) {
|
|
59
|
-
lastError = err;
|
|
60
|
-
if (err instanceof DOMException && err.name === "AbortError") throw err;
|
|
61
|
-
log.warn({
|
|
62
|
-
err,
|
|
63
|
-
sessionKey,
|
|
64
|
-
attempt: i + 1,
|
|
65
|
-
modelRef
|
|
66
|
-
}, "Model call threw, trying fallback");
|
|
67
|
-
}
|
|
68
|
-
agent.state.messages = agent.state.messages.slice(0, beforeLen);
|
|
69
|
-
}
|
|
70
|
-
if (lastError instanceof Error) throw lastError;
|
|
71
|
-
throw new Error(lastError != null ? String(lastError) : "All model candidates failed");
|
|
72
|
-
}
|
|
73
|
-
//#endregion
|
|
74
|
-
export { resolveAgentTurnTimeoutMs, runAgentTurnWithModelFallbacks };
|
|
75
|
-
|
|
76
|
-
//# sourceMappingURL=run-agent-turn-with-fallbacks.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"run-agent-turn-with-fallbacks.js","names":[],"sources":["../../../../src/agent/orchestration/run-agent-turn-with-fallbacks.ts"],"sourcesContent":["/**\n * Ordered model candidates: one user turn with rollback on failure.\n * Used by channel orchestrator, gateway webchat stream, and direct CLI-style turns.\n */\n\nimport type { Agent, AgentMessage } from '@earendil-works/pi-agent-core';\nimport type { Model, Api } from '@earendil-works/pi-ai';\n\nimport type { Config } from '../../config/schema.js';\nimport { resolveModel } from '../../providers/index.js';\nimport type { ModelManager } from '../models/index.js';\nimport {\n isAssistantTurnAborted,\n isAssistantTurnFailed,\n maybeRetryTurnAfterTransientLlmFailure,\n} from './llm-turn-retry.js';\nimport { resolveAgentTurnTimeoutMs, runAgentTurnWithTimeout } from './run-agent-turn-with-timeout.js';\n\nexport { resolveAgentTurnTimeoutMs };\n\ntype FallbackLog = {\n info: (obj: Record<string, unknown>, msg: string) => void;\n warn: (obj: Record<string, unknown>, msg: string) => void;\n debug?: (obj: Record<string, unknown>, msg: string) => void;\n};\n\nexport async function runAgentTurnWithModelFallbacks(params: {\n agent: Agent;\n sessionKey: string;\n modelManager: ModelManager;\n userMessage: AgentMessage;\n log: FallbackLog;\n /** Before `prompt` adds the user message (e.g. background-review nudge counters). */\n beforeUserPrompt?: () => void | Promise<void>;\n /** After `prompt` adds the user message; before `waitForIdle`. */\n afterUserPrompt?: () => Promise<void>;\n /** Overrides {@link resolveAgentTurnTimeoutMs} when set. */\n timeoutMs?: number;\n /** Supplies the default turn limit. */\n getConfig?: () => Config | undefined;\n}): Promise<void> {\n const { agent, sessionKey, modelManager, userMessage, log } = params;\n const timeoutMs = params.timeoutMs ?? resolveAgentTurnTimeoutMs(params.getConfig?.());\n const beforeUserPrompt = params.beforeUserPrompt ?? (async () => {});\n const afterUserPrompt = params.afterUserPrompt ?? (async () => {});\n\n const candidates = modelManager.getFallbackCandidatesForSession(sessionKey);\n if (candidates.length === 0) {\n throw new Error(\n 'No model candidates available. Configure agent manifest models and provider API keys.',\n );\n }\n\n let lastError: unknown;\n\n for (let i = 0; i < candidates.length; i++) {\n const candidate = candidates[i];\n const modelRef = `${candidate.provider}/${candidate.model}`;\n\n let resolved: Model<Api>;\n try {\n resolved = resolveModel(modelRef);\n } catch (err) {\n lastError = err;\n log.warn({ err, modelRef, attempt: i + 1 }, 'Skipping model candidate (resolve failed)');\n continue;\n }\n\n const beforeLen = agent.state.messages.length;\n\n try {\n modelManager.applyResolvedModel(agent, resolved, modelRef);\n\n log.info(\n { attempt: i + 1, total: candidates.length, provider: candidate.provider, model: candidate.model },\n 'Running agent turn',\n );\n\n const runTurn = async () => {\n await beforeUserPrompt();\n await agent.prompt(userMessage);\n await afterUserPrompt();\n await agent.waitForIdle();\n await maybeRetryTurnAfterTransientLlmFailure(agent, { sessionKey, log });\n };\n\n await runAgentTurnWithTimeout(agent, runTurn, timeoutMs);\n\n if (isAssistantTurnAborted(agent)) {\n return;\n }\n\n if (!isAssistantTurnFailed(agent)) {\n return;\n }\n\n lastError = new Error(`Assistant turn failed: ${modelRef}`);\n log.warn(\n { sessionKey, attempt: i + 1, total: candidates.length, modelRef },\n 'Model turn failed after retries, trying fallback',\n );\n } catch (err) {\n lastError = err;\n if (err instanceof DOMException && err.name === 'AbortError') {\n throw err;\n }\n log.warn({ err, sessionKey, attempt: i + 1, modelRef }, 'Model call threw, trying fallback');\n }\n\n agent.state.messages = agent.state.messages.slice(0, beforeLen);\n }\n\n if (lastError instanceof Error) {\n throw lastError;\n }\n throw new Error(lastError != null ? String(lastError) : 'All model candidates failed');\n}\n"],"mappings":";;;;gBASwD;AAiBxD,eAAsB,+BAA+B,QAcnC;CAChB,MAAM,EAAE,OAAO,YAAY,cAAc,aAAa,QAAQ;CAC9D,MAAM,YAAY,OAAO,aAAa,0BAA0B,OAAO,aAAa,CAAC;CACrF,MAAM,mBAAmB,OAAO,qBAAqB,YAAY;CACjE,MAAM,kBAAkB,OAAO,oBAAoB,YAAY;CAE/D,MAAM,aAAa,aAAa,gCAAgC,WAAW;AAC3E,KAAI,WAAW,WAAW,EACxB,OAAM,IAAI,MACR,wFACD;CAGH,IAAI;AAEJ,MAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;EAC1C,MAAM,YAAY,WAAW;EAC7B,MAAM,WAAW,GAAG,UAAU,SAAS,GAAG,UAAU;EAEpD,IAAI;AACJ,MAAI;AACF,cAAW,aAAa,SAAS;WAC1B,KAAK;AACZ,eAAY;AACZ,OAAI,KAAK;IAAE;IAAK;IAAU,SAAS,IAAI;IAAG,EAAE,4CAA4C;AACxF;;EAGF,MAAM,YAAY,MAAM,MAAM,SAAS;AAEvC,MAAI;AACF,gBAAa,mBAAmB,OAAO,UAAU,SAAS;AAE1D,OAAI,KACF;IAAE,SAAS,IAAI;IAAG,OAAO,WAAW;IAAQ,UAAU,UAAU;IAAU,OAAO,UAAU;IAAO,EAClG,qBACD;GAED,MAAM,UAAU,YAAY;AAC1B,UAAM,kBAAkB;AACxB,UAAM,MAAM,OAAO,YAAY;AAC/B,UAAM,iBAAiB;AACvB,UAAM,MAAM,aAAa;AACzB,UAAM,uCAAuC,OAAO;KAAE;KAAY;KAAK,CAAC;;AAG1E,SAAM,wBAAwB,OAAO,SAAS,UAAU;AAExD,OAAI,uBAAuB,MAAM,CAC/B;AAGF,OAAI,CAAC,sBAAsB,MAAM,CAC/B;AAGF,+BAAY,IAAI,MAAM,0BAA0B,WAAW;AAC3D,OAAI,KACF;IAAE;IAAY,SAAS,IAAI;IAAG,OAAO,WAAW;IAAQ;IAAU,EAClE,mDACD;WACM,KAAK;AACZ,eAAY;AACZ,OAAI,eAAe,gBAAgB,IAAI,SAAS,aAC9C,OAAM;AAER,OAAI,KAAK;IAAE;IAAK;IAAY,SAAS,IAAI;IAAG;IAAU,EAAE,oCAAoC;;AAG9F,QAAM,MAAM,WAAW,MAAM,MAAM,SAAS,MAAM,GAAG,UAAU;;AAGjE,KAAI,qBAAqB,MACvB,OAAM;AAER,OAAM,IAAI,MAAM,aAAa,OAAO,OAAO,UAAU,GAAG,8BAA8B"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { Config } from '../../config/schema.js';
|
|
2
|
-
import type { CronService } from '../../cron/index.js';
|
|
3
|
-
/**
|
|
4
|
-
* Reconcile managed Dreaming cron jobs against the current effective config.
|
|
5
|
-
*/
|
|
6
|
-
export declare function reconcileManagedDreamingCronJobs(cron: CronService, effectiveConfig: Config | undefined): Promise<void>;
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { DREAMING_CRON_NAME, DREAMING_LIGHT_CRON_NAME, DREAMING_LIGHT_SWEEP_TOKEN, DREAMING_REM_CRON_NAME, DREAMING_REM_SWEEP_TOKEN, DREAMING_SWEEP_TOKEN } from "../memory/dreaming/constants.js";
|
|
2
|
-
import { resolveDreamingConfig } from "../memory/dreaming/config.js";
|
|
3
|
-
//#region src/agent/service/reconcile-dreaming-cron.ts
|
|
4
|
-
const DREAMING_SWEEP_TOKENS = new Set([
|
|
5
|
-
DREAMING_LIGHT_SWEEP_TOKEN,
|
|
6
|
-
DREAMING_SWEEP_TOKEN,
|
|
7
|
-
DREAMING_REM_SWEEP_TOKEN
|
|
8
|
-
]);
|
|
9
|
-
function dreamingSweepTokenFromJob(job) {
|
|
10
|
-
if (job.payload?.kind !== "agentTurn") return;
|
|
11
|
-
const msg = job.payload.message;
|
|
12
|
-
return typeof msg === "string" && DREAMING_SWEEP_TOKENS.has(msg) ? msg : void 0;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Reconcile managed Dreaming cron jobs against the current effective config.
|
|
16
|
-
*/
|
|
17
|
-
async function reconcileManagedDreamingCronJobs(cron, effectiveConfig) {
|
|
18
|
-
const dreaming = resolveDreamingConfig(effectiveConfig);
|
|
19
|
-
/** Match by sweep token — job names omit `[managed-by=…]`, so name-only matching never saw these jobs and re-added them every reconcile. */
|
|
20
|
-
const managed = (await cron.listJobs()).filter((job) => dreamingSweepTokenFromJob(job) !== void 0);
|
|
21
|
-
const phaseSpecs = [
|
|
22
|
-
{
|
|
23
|
-
cronName: DREAMING_LIGHT_CRON_NAME,
|
|
24
|
-
token: DREAMING_LIGHT_SWEEP_TOKEN,
|
|
25
|
-
schedule: dreaming.phases.light.cron,
|
|
26
|
-
phaseEnabled: dreaming.phases.light.enabled
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
cronName: DREAMING_CRON_NAME,
|
|
30
|
-
token: DREAMING_SWEEP_TOKEN,
|
|
31
|
-
schedule: dreaming.phases.deep.cron,
|
|
32
|
-
phaseEnabled: dreaming.phases.deep.enabled
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
cronName: DREAMING_REM_CRON_NAME,
|
|
36
|
-
token: DREAMING_REM_SWEEP_TOKEN,
|
|
37
|
-
schedule: dreaming.phases.rem.cron,
|
|
38
|
-
phaseEnabled: dreaming.phases.rem.enabled
|
|
39
|
-
}
|
|
40
|
-
];
|
|
41
|
-
if (!dreaming.enabled) {
|
|
42
|
-
for (const job of managed) await cron.removeJob(job.id).catch(() => {});
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
for (const spec of phaseSpecs) {
|
|
46
|
-
const phaseJobs = managed.filter((job) => dreamingSweepTokenFromJob(job) === spec.token);
|
|
47
|
-
if (!spec.phaseEnabled) {
|
|
48
|
-
for (const job of phaseJobs) await cron.removeJob(job.id).catch(() => {});
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
const desiredPayload = {
|
|
52
|
-
kind: "agentTurn",
|
|
53
|
-
message: spec.token
|
|
54
|
-
};
|
|
55
|
-
const desiredSchedule = {
|
|
56
|
-
kind: "cron",
|
|
57
|
-
expr: spec.schedule,
|
|
58
|
-
...dreaming.timezone ? { tz: dreaming.timezone } : {}
|
|
59
|
-
};
|
|
60
|
-
if (phaseJobs.length === 0) {
|
|
61
|
-
await cron.addJob(desiredSchedule, {
|
|
62
|
-
name: spec.cronName,
|
|
63
|
-
sessionTarget: "isolated",
|
|
64
|
-
payload: desiredPayload,
|
|
65
|
-
enabled: true
|
|
66
|
-
});
|
|
67
|
-
continue;
|
|
68
|
-
}
|
|
69
|
-
const primary = phaseJobs[0];
|
|
70
|
-
for (const dup of phaseJobs.slice(1)) await cron.removeJob(dup.id).catch(() => {});
|
|
71
|
-
const payloadMessage = primary.payload?.kind === "agentTurn" ? primary.payload.message : primary.payload?.text;
|
|
72
|
-
if (JSON.stringify(primary.schedule) !== JSON.stringify(desiredSchedule) || primary.sessionTarget !== "isolated" || payloadMessage !== spec.token || primary.enabled !== true || primary.name !== spec.cronName) await cron.updateJob(primary.id, {
|
|
73
|
-
schedule: desiredSchedule,
|
|
74
|
-
sessionTarget: "isolated",
|
|
75
|
-
name: spec.cronName,
|
|
76
|
-
payload: desiredPayload,
|
|
77
|
-
enabled: true
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
//#endregion
|
|
82
|
-
export { reconcileManagedDreamingCronJobs };
|
|
83
|
-
|
|
84
|
-
//# sourceMappingURL=reconcile-dreaming-cron.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reconcile-dreaming-cron.js","names":[],"sources":["../../../../src/agent/service/reconcile-dreaming-cron.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport type { CronService } from '../../cron/index.js';\nimport type { JobData } from '../../cron/types.js';\nimport {\n DREAMING_SWEEP_TOKEN,\n DREAMING_LIGHT_CRON_NAME,\n DREAMING_LIGHT_SWEEP_TOKEN,\n DREAMING_CRON_NAME,\n DREAMING_REM_CRON_NAME,\n DREAMING_REM_SWEEP_TOKEN,\n} from '../memory/dreaming/constants.js';\nimport { resolveDreamingConfig } from '../memory/dreaming/config.js';\n\nconst DREAMING_SWEEP_TOKENS = new Set<string>([\n DREAMING_LIGHT_SWEEP_TOKEN,\n DREAMING_SWEEP_TOKEN,\n DREAMING_REM_SWEEP_TOKEN,\n]);\n\nfunction dreamingSweepTokenFromJob(job: JobData): string | undefined {\n if (job.payload?.kind !== 'agentTurn') {\n return undefined;\n }\n const msg = job.payload.message;\n return typeof msg === 'string' && DREAMING_SWEEP_TOKENS.has(msg) ? msg : undefined;\n}\n\n/**\n * Reconcile managed Dreaming cron jobs against the current effective config.\n */\nexport async function reconcileManagedDreamingCronJobs(\n cron: CronService,\n effectiveConfig: Config | undefined,\n): Promise<void> {\n const dreaming = resolveDreamingConfig(effectiveConfig);\n const jobs = await cron.listJobs();\n /** Match by sweep token — job names omit `[managed-by=…]`, so name-only matching never saw these jobs and re-added them every reconcile. */\n const managed = jobs.filter((job) => dreamingSweepTokenFromJob(job) !== undefined);\n\n const phaseSpecs: Array<{\n cronName: string;\n token: string;\n schedule: string;\n phaseEnabled: boolean;\n }> = [\n {\n cronName: DREAMING_LIGHT_CRON_NAME,\n token: DREAMING_LIGHT_SWEEP_TOKEN,\n schedule: dreaming.phases.light.cron,\n phaseEnabled: dreaming.phases.light.enabled,\n },\n {\n cronName: DREAMING_CRON_NAME,\n token: DREAMING_SWEEP_TOKEN,\n schedule: dreaming.phases.deep.cron,\n phaseEnabled: dreaming.phases.deep.enabled,\n },\n {\n cronName: DREAMING_REM_CRON_NAME,\n token: DREAMING_REM_SWEEP_TOKEN,\n schedule: dreaming.phases.rem.cron,\n phaseEnabled: dreaming.phases.rem.enabled,\n },\n ];\n\n if (!dreaming.enabled) {\n for (const job of managed) {\n await cron.removeJob(job.id).catch(() => {});\n }\n return;\n }\n\n for (const spec of phaseSpecs) {\n const phaseJobs = managed.filter((job) => dreamingSweepTokenFromJob(job) === spec.token);\n\n if (!spec.phaseEnabled) {\n for (const job of phaseJobs) {\n await cron.removeJob(job.id).catch(() => {});\n }\n continue;\n }\n\n const desiredPayload = { kind: 'agentTurn' as const, message: spec.token };\n const desiredSchedule = {\n kind: 'cron' as const,\n expr: spec.schedule,\n ...(dreaming.timezone ? { tz: dreaming.timezone } : {}),\n };\n\n if (phaseJobs.length === 0) {\n await cron.addJob(desiredSchedule, {\n name: spec.cronName,\n sessionTarget: 'isolated' as const,\n payload: desiredPayload,\n enabled: true,\n } as any);\n continue;\n }\n\n const primary = phaseJobs[0]!;\n for (const dup of phaseJobs.slice(1)) {\n await cron.removeJob(dup.id).catch(() => {});\n }\n\n const payloadMessage =\n primary.payload?.kind === 'agentTurn'\n ? primary.payload.message\n : (primary.payload as any)?.text;\n const needsUpdate =\n JSON.stringify(primary.schedule) !== JSON.stringify(desiredSchedule) ||\n primary.sessionTarget !== 'isolated' ||\n payloadMessage !== spec.token ||\n primary.enabled !== true ||\n primary.name !== spec.cronName;\n\n if (needsUpdate) {\n await cron.updateJob(primary.id, {\n schedule: desiredSchedule,\n sessionTarget: 'isolated',\n name: spec.cronName,\n payload: desiredPayload,\n enabled: true,\n } as any);\n }\n }\n}\n"],"mappings":";;;AAaA,MAAM,wBAAwB,IAAI,IAAY;CAC5C;CACA;CACA;CACD,CAAC;AAEF,SAAS,0BAA0B,KAAkC;AACnE,KAAI,IAAI,SAAS,SAAS,YACxB;CAEF,MAAM,MAAM,IAAI,QAAQ;AACxB,QAAO,OAAO,QAAQ,YAAY,sBAAsB,IAAI,IAAI,GAAG,MAAM,KAAA;;;;;AAM3E,eAAsB,iCACpB,MACA,iBACe;CACf,MAAM,WAAW,sBAAsB,gBAAgB;;CAGvD,MAAM,WAAU,MAFG,KAAK,UAAU,EAEb,QAAQ,QAAQ,0BAA0B,IAAI,KAAK,KAAA,EAAU;CAElF,MAAM,aAKD;EACH;GACE,UAAU;GACV,OAAO;GACP,UAAU,SAAS,OAAO,MAAM;GAChC,cAAc,SAAS,OAAO,MAAM;GACrC;EACD;GACE,UAAU;GACV,OAAO;GACP,UAAU,SAAS,OAAO,KAAK;GAC/B,cAAc,SAAS,OAAO,KAAK;GACpC;EACD;GACE,UAAU;GACV,OAAO;GACP,UAAU,SAAS,OAAO,IAAI;GAC9B,cAAc,SAAS,OAAO,IAAI;GACnC;EACF;AAED,KAAI,CAAC,SAAS,SAAS;AACrB,OAAK,MAAM,OAAO,QAChB,OAAM,KAAK,UAAU,IAAI,GAAG,CAAC,YAAY,GAAG;AAE9C;;AAGF,MAAK,MAAM,QAAQ,YAAY;EAC7B,MAAM,YAAY,QAAQ,QAAQ,QAAQ,0BAA0B,IAAI,KAAK,KAAK,MAAM;AAExF,MAAI,CAAC,KAAK,cAAc;AACtB,QAAK,MAAM,OAAO,UAChB,OAAM,KAAK,UAAU,IAAI,GAAG,CAAC,YAAY,GAAG;AAE9C;;EAGF,MAAM,iBAAiB;GAAE,MAAM;GAAsB,SAAS,KAAK;GAAO;EAC1E,MAAM,kBAAkB;GACtB,MAAM;GACN,MAAM,KAAK;GACX,GAAI,SAAS,WAAW,EAAE,IAAI,SAAS,UAAU,GAAG,EAAE;GACvD;AAED,MAAI,UAAU,WAAW,GAAG;AAC1B,SAAM,KAAK,OAAO,iBAAiB;IACjC,MAAM,KAAK;IACX,eAAe;IACf,SAAS;IACT,SAAS;IACV,CAAQ;AACT;;EAGF,MAAM,UAAU,UAAU;AAC1B,OAAK,MAAM,OAAO,UAAU,MAAM,EAAE,CAClC,OAAM,KAAK,UAAU,IAAI,GAAG,CAAC,YAAY,GAAG;EAG9C,MAAM,iBACJ,QAAQ,SAAS,SAAS,cACtB,QAAQ,QAAQ,UACf,QAAQ,SAAiB;AAQhC,MANE,KAAK,UAAU,QAAQ,SAAS,KAAK,KAAK,UAAU,gBAAgB,IACpE,QAAQ,kBAAkB,cAC1B,mBAAmB,KAAK,SACxB,QAAQ,YAAY,QACpB,QAAQ,SAAS,KAAK,SAGtB,OAAM,KAAK,UAAU,QAAQ,IAAI;GAC/B,UAAU;GACV,eAAe;GACf,MAAM,KAAK;GACX,SAAS;GACT,SAAS;GACV,CAAQ"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { AgentTool } from '@earendil-works/pi-agent-core';
|
|
2
|
-
import type { CronService } from '../../cron/index.js';
|
|
3
|
-
export declare function scanCronPrompt(prompt: string): string | null;
|
|
4
|
-
export type CronjobToolParams = {
|
|
5
|
-
action: 'list' | 'create' | 'update' | 'remove' | 'enable' | 'disable' | 'history';
|
|
6
|
-
name?: string;
|
|
7
|
-
scheduleKind?: 'cron' | 'at' | 'every';
|
|
8
|
-
cronExpr?: string;
|
|
9
|
-
at?: string;
|
|
10
|
-
everyMs?: number;
|
|
11
|
-
tz?: string;
|
|
12
|
-
message?: string;
|
|
13
|
-
workflowDefinitionId?: string;
|
|
14
|
-
workflowGoal?: string;
|
|
15
|
-
workflowInputJson?: string;
|
|
16
|
-
goalId?: string;
|
|
17
|
-
goalMessage?: string;
|
|
18
|
-
waitForCompletion?: boolean;
|
|
19
|
-
deliveryChannel?: string;
|
|
20
|
-
deliveryTo?: string;
|
|
21
|
-
sessionTarget?: 'main' | 'isolated' | 'current';
|
|
22
|
-
agentId?: string;
|
|
23
|
-
workingDirectory?: string;
|
|
24
|
-
jobId?: string;
|
|
25
|
-
};
|
|
26
|
-
export interface CronjobToolDeps {
|
|
27
|
-
getCronService: () => CronService | undefined;
|
|
28
|
-
}
|
|
29
|
-
export declare function createCronjobTool(deps: CronjobToolDeps): AgentTool;
|
|
@@ -1,274 +0,0 @@
|
|
|
1
|
-
import { describeSchedule } from "../../cron/schedule.js";
|
|
2
|
-
import { getCronPayloadText } from "../../cron/job-content.js";
|
|
3
|
-
import { Type } from "@sinclair/typebox";
|
|
4
|
-
//#region src/agent/tools/cronjob-tool.ts
|
|
5
|
-
const CRON_THREAT_PATTERNS = [
|
|
6
|
-
[/ignore\s+(previous|all|above)\s+instructions/i, "prompt_injection"],
|
|
7
|
-
[/do\s+not\s+tell\s+the\s+user/i, "deception"],
|
|
8
|
-
[/system\s+prompt\s+override/i, "sys_prompt_override"],
|
|
9
|
-
[/curl\s+[^\n]*\$\{?\w*(KEY|TOKEN|SECRET|PASSWORD)/i, "exfil_curl"],
|
|
10
|
-
[/cat\s+[^\n]*(\.env|credentials|\.netrc)/i, "read_secrets"],
|
|
11
|
-
[/rm\s+-rf\s+\//i, "destructive_rm"]
|
|
12
|
-
];
|
|
13
|
-
function scanCronPrompt(prompt) {
|
|
14
|
-
for (const [pattern, id] of CRON_THREAT_PATTERNS) if (pattern.test(prompt)) return `Blocked: prompt matches threat pattern '${id}'. Cron prompts must not contain injection or exfiltration payloads.`;
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
|
-
const CronjobSchema = Type.Object({
|
|
18
|
-
action: Type.Union([
|
|
19
|
-
Type.Literal("list"),
|
|
20
|
-
Type.Literal("create"),
|
|
21
|
-
Type.Literal("update"),
|
|
22
|
-
Type.Literal("remove"),
|
|
23
|
-
Type.Literal("enable"),
|
|
24
|
-
Type.Literal("disable"),
|
|
25
|
-
Type.Literal("history")
|
|
26
|
-
], { description: "Action to perform on cron jobs" }),
|
|
27
|
-
name: Type.Optional(Type.String({ description: "Human-readable job name" })),
|
|
28
|
-
scheduleKind: Type.Optional(Type.Union([
|
|
29
|
-
Type.Literal("cron"),
|
|
30
|
-
Type.Literal("at"),
|
|
31
|
-
Type.Literal("every")
|
|
32
|
-
], { description: "Schedule kind. Use cronExpr for cron, at for one-time ISO time, everyMs for interval." })),
|
|
33
|
-
cronExpr: Type.Optional(Type.String({ description: "Cron schedule expression. Examples:\n \"0 9 * * *\" = every day at 9:00 AM\n \"*/30 * * * *\" = every 30 minutes\n \"0 9 * * 1-5\" = weekdays at 9:00 AM\n \"0 0 1 * *\" = first day of each month" })),
|
|
34
|
-
at: Type.Optional(Type.String({ description: "One-time run timestamp as ISO 8601 string." })),
|
|
35
|
-
everyMs: Type.Optional(Type.Number({ description: "Fixed interval in milliseconds." })),
|
|
36
|
-
tz: Type.Optional(Type.String({ description: "IANA timezone for cronExpr, e.g. Asia/Shanghai." })),
|
|
37
|
-
message: Type.Optional(Type.String({ description: "Instruction for the agent when the job runs (agentTurn payload; typically a fresh session)." })),
|
|
38
|
-
workflowDefinitionId: Type.Optional(Type.String({ description: "Workflow definition id for a workflowRun job (mutually exclusive with message on create)." })),
|
|
39
|
-
workflowGoal: Type.Optional(Type.String({ description: "Optional goal override when creating a workflowRun job." })),
|
|
40
|
-
workflowInputJson: Type.Optional(Type.String({ description: "JSON object for workflow input payload (workflowRun create/update)." })),
|
|
41
|
-
goalId: Type.Optional(Type.String({ description: "Durable goal id for a goalContinue job (mutually exclusive with message and workflowDefinitionId)." })),
|
|
42
|
-
goalMessage: Type.Optional(Type.String({ description: "Optional custom continuation message for a goalContinue job." })),
|
|
43
|
-
waitForCompletion: Type.Optional(Type.Boolean({ description: "For workflowRun jobs: when true (default), cron waits for terminal status before succeeding." })),
|
|
44
|
-
deliveryChannel: Type.Optional(Type.String({ description: "Delivery channel when workflow completes (e.g. telegram)." })),
|
|
45
|
-
deliveryTo: Type.Optional(Type.String({ description: "Delivery recipient chat id when workflow completes." })),
|
|
46
|
-
sessionTarget: Type.Optional(Type.Union([Type.Literal("main"), Type.Literal("isolated")], { description: "\"main\" uses the main session context; \"isolated\" (default on create) uses a separate session per run." })),
|
|
47
|
-
agentId: Type.Optional(Type.String({ description: "Agent profile id for isolated jobs (session key). Omit to use the configured default agent (usually `main`)." })),
|
|
48
|
-
workingDirectory: Type.Optional(Type.String({ description: "Absolute workspace path on the gateway host for isolated jobs. Omit to use the agent default workspace." })),
|
|
49
|
-
jobId: Type.Optional(Type.String({ description: "Job ID (from list output)" }))
|
|
50
|
-
});
|
|
51
|
-
function textResult(text) {
|
|
52
|
-
return {
|
|
53
|
-
content: [{
|
|
54
|
-
type: "text",
|
|
55
|
-
text
|
|
56
|
-
}],
|
|
57
|
-
details: {}
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
function formatJob(job) {
|
|
61
|
-
const status = job.enabled ? "active" : "disabled";
|
|
62
|
-
const payloadText = getCronPayloadText(job);
|
|
63
|
-
const truncatedPayload = payloadText.length > 100 ? `${payloadText.slice(0, 100)}...` : payloadText;
|
|
64
|
-
const payloadLine = job.payload.kind === "workflowRun" ? ` Workflow: ${job.payload.definitionId}${job.payload.goal ? ` — ${job.payload.goal}` : ""}` : ` Message: ${truncatedPayload}`;
|
|
65
|
-
return [
|
|
66
|
-
`${status} ${job.name ?? "(unnamed)"} (${job.id})`,
|
|
67
|
-
` Schedule: ${describeSchedule(job.schedule)}`,
|
|
68
|
-
` Type: ${job.payload.kind}`,
|
|
69
|
-
payloadLine,
|
|
70
|
-
` Next run: ${job.state.nextRunAtMs ? new Date(job.state.nextRunAtMs).toISOString() : "N/A"}`,
|
|
71
|
-
` Session: ${job.sessionTarget ?? "main"}`,
|
|
72
|
-
` Agent: ${job.agentId?.trim() || "(default)"}`,
|
|
73
|
-
` Workspace: ${job.workingDirectory?.trim() || "(agent default)"}`
|
|
74
|
-
].join("\n");
|
|
75
|
-
}
|
|
76
|
-
function scheduleFromParams(params) {
|
|
77
|
-
const kind = params.scheduleKind;
|
|
78
|
-
if (!kind) return void 0;
|
|
79
|
-
if (kind === "cron") {
|
|
80
|
-
const expr = params.cronExpr?.trim();
|
|
81
|
-
if (!expr) return void 0;
|
|
82
|
-
return {
|
|
83
|
-
kind,
|
|
84
|
-
expr,
|
|
85
|
-
...params.tz?.trim() ? { tz: params.tz.trim() } : {}
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
if (kind === "at") {
|
|
89
|
-
const at = params.at?.trim();
|
|
90
|
-
if (!at) return void 0;
|
|
91
|
-
return {
|
|
92
|
-
kind,
|
|
93
|
-
at
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
if (!Number.isFinite(params.everyMs) || !params.everyMs || params.everyMs <= 0) return void 0;
|
|
97
|
-
return {
|
|
98
|
-
kind,
|
|
99
|
-
everyMs: Math.floor(params.everyMs)
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
function formatExecution(exec) {
|
|
103
|
-
const dur = exec.duration != null ? `${(exec.duration / 1e3).toFixed(1)}s` : "N/A";
|
|
104
|
-
const lines = [`[${exec.status}] ${exec.startedAt} (${dur})`];
|
|
105
|
-
if (exec.summary) lines.push(` Summary: ${exec.summary.slice(0, 200)}`);
|
|
106
|
-
if (exec.error) lines.push(` Error: ${exec.error.slice(0, 200)}`);
|
|
107
|
-
return lines.join("\n");
|
|
108
|
-
}
|
|
109
|
-
function createCronjobTool(deps) {
|
|
110
|
-
return {
|
|
111
|
-
name: "cronjob",
|
|
112
|
-
label: "⏰ Cronjob",
|
|
113
|
-
description: "Manage scheduled tasks (cron jobs) that run automatically.\n\nJobs can run an agent message (agentTurn), a workflow directly (workflowRun), or continue a durable goal (goalContinue).\n\nACTIONS:\n- list: Show all scheduled jobs with status and next run time\n- create: Create a job (scheduleKind plus exactly one of message, workflowDefinitionId, or goalId)\n- update: Change schedule, message, workflow fields, name, sessionTarget, agentId, or workingDirectory (requires jobId)\n- remove: Delete a job (requires jobId)\n- enable / disable: Toggle a job (requires jobId)\n- history: Recent executions for a job (requires jobId)",
|
|
114
|
-
parameters: CronjobSchema,
|
|
115
|
-
async execute(_toolCallId, params, _signal) {
|
|
116
|
-
const cron = deps.getCronService();
|
|
117
|
-
if (!cron) return textResult("Cron service is not available in this environment.");
|
|
118
|
-
try {
|
|
119
|
-
switch (params.action) {
|
|
120
|
-
case "list": {
|
|
121
|
-
const jobs = await cron.listJobs();
|
|
122
|
-
if (jobs.length === 0) return textResult("No scheduled jobs.");
|
|
123
|
-
return {
|
|
124
|
-
content: [{
|
|
125
|
-
type: "text",
|
|
126
|
-
text: jobs.map(formatJob).join("\n\n")
|
|
127
|
-
}],
|
|
128
|
-
details: {}
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
case "create": {
|
|
132
|
-
const workflowId = params.workflowDefinitionId?.trim();
|
|
133
|
-
const goalId = params.goalId?.trim();
|
|
134
|
-
const hasMessage = Boolean(params.message?.trim());
|
|
135
|
-
const targetCount = [
|
|
136
|
-
workflowId,
|
|
137
|
-
goalId,
|
|
138
|
-
hasMessage ? "message" : ""
|
|
139
|
-
].filter(Boolean).length;
|
|
140
|
-
const schedule = scheduleFromParams(params);
|
|
141
|
-
if (!schedule || targetCount !== 1) return textResult("Error: create requires scheduleKind with matching cronExpr/at/everyMs and exactly one of message, workflowDefinitionId, or goalId.");
|
|
142
|
-
if (hasMessage) {
|
|
143
|
-
const scanResult = scanCronPrompt(params.message);
|
|
144
|
-
if (scanResult) return textResult(`Error: ${scanResult}`);
|
|
145
|
-
}
|
|
146
|
-
let payload;
|
|
147
|
-
let sessionTarget = params.sessionTarget ?? "isolated";
|
|
148
|
-
let delivery;
|
|
149
|
-
if (goalId) {
|
|
150
|
-
payload = {
|
|
151
|
-
kind: "goalContinue",
|
|
152
|
-
goalId,
|
|
153
|
-
...params.goalMessage?.trim() ? { message: params.goalMessage.trim() } : {}
|
|
154
|
-
};
|
|
155
|
-
sessionTarget = "isolated";
|
|
156
|
-
} else if (workflowId) {
|
|
157
|
-
let inputEnvelope;
|
|
158
|
-
if (params.workflowInputJson?.trim()) try {
|
|
159
|
-
inputEnvelope = { payload: JSON.parse(params.workflowInputJson) };
|
|
160
|
-
} catch {
|
|
161
|
-
return textResult("Error: workflowInputJson must be valid JSON.");
|
|
162
|
-
}
|
|
163
|
-
const agentId = params.agentId?.trim() || void 0;
|
|
164
|
-
payload = {
|
|
165
|
-
kind: "workflowRun",
|
|
166
|
-
definitionId: workflowId,
|
|
167
|
-
...params.workflowGoal?.trim() ? { goal: params.workflowGoal.trim() } : {},
|
|
168
|
-
...inputEnvelope ? { inputEnvelope } : {},
|
|
169
|
-
...agentId ? { agentId } : {},
|
|
170
|
-
...params.waitForCompletion === false ? { waitForCompletion: false } : {}
|
|
171
|
-
};
|
|
172
|
-
sessionTarget = "isolated";
|
|
173
|
-
if (params.deliveryChannel?.trim() && params.deliveryTo?.trim()) delivery = {
|
|
174
|
-
mode: "announce",
|
|
175
|
-
channel: params.deliveryChannel.trim(),
|
|
176
|
-
to: params.deliveryTo.trim()
|
|
177
|
-
};
|
|
178
|
-
} else payload = {
|
|
179
|
-
kind: "agentTurn",
|
|
180
|
-
message: params.message.trim()
|
|
181
|
-
};
|
|
182
|
-
const result = await cron.addJob(schedule, {
|
|
183
|
-
name: params.name?.trim() || void 0,
|
|
184
|
-
sessionTarget,
|
|
185
|
-
...delivery ? { delivery } : {},
|
|
186
|
-
...params.agentId?.trim() ? { agentId: params.agentId.trim() } : {},
|
|
187
|
-
...params.workingDirectory?.trim() ? { workingDirectory: params.workingDirectory.trim() } : {},
|
|
188
|
-
payload
|
|
189
|
-
});
|
|
190
|
-
return textResult(`Created ${goalId ? `goal job (${goalId})` : workflowId ? `workflow job (${workflowId})` : "job"}${params.name ? ` "${params.name.trim()}"` : ""} (${result.id})\nSchedule: ${describeSchedule(result.schedule)}`);
|
|
191
|
-
}
|
|
192
|
-
case "update": {
|
|
193
|
-
if (!params.jobId?.trim()) return textResult("Error: update requires jobId.");
|
|
194
|
-
const updates = {};
|
|
195
|
-
const nextSchedule = scheduleFromParams(params);
|
|
196
|
-
if (nextSchedule) updates.schedule = nextSchedule;
|
|
197
|
-
if (params.message != null && params.message.trim()) {
|
|
198
|
-
const scanResult = scanCronPrompt(params.message);
|
|
199
|
-
if (scanResult) return textResult(`Error: ${scanResult}`);
|
|
200
|
-
updates.payload = {
|
|
201
|
-
kind: "agentTurn",
|
|
202
|
-
message: params.message.trim()
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
if (params.goalId?.trim()) {
|
|
206
|
-
updates.payload = {
|
|
207
|
-
kind: "goalContinue",
|
|
208
|
-
goalId: params.goalId.trim(),
|
|
209
|
-
...params.goalMessage?.trim() ? { message: params.goalMessage.trim() } : {}
|
|
210
|
-
};
|
|
211
|
-
updates.sessionTarget = "isolated";
|
|
212
|
-
}
|
|
213
|
-
if (params.workflowDefinitionId?.trim()) {
|
|
214
|
-
let inputEnvelope;
|
|
215
|
-
if (params.workflowInputJson?.trim()) try {
|
|
216
|
-
inputEnvelope = { payload: JSON.parse(params.workflowInputJson) };
|
|
217
|
-
} catch {
|
|
218
|
-
return textResult("Error: workflowInputJson must be valid JSON.");
|
|
219
|
-
}
|
|
220
|
-
const agentId = params.agentId?.trim() || void 0;
|
|
221
|
-
updates.payload = {
|
|
222
|
-
kind: "workflowRun",
|
|
223
|
-
definitionId: params.workflowDefinitionId.trim(),
|
|
224
|
-
...params.workflowGoal?.trim() ? { goal: params.workflowGoal.trim() } : {},
|
|
225
|
-
...inputEnvelope ? { inputEnvelope } : {},
|
|
226
|
-
...agentId ? { agentId } : {},
|
|
227
|
-
...params.waitForCompletion === false ? { waitForCompletion: false } : {}
|
|
228
|
-
};
|
|
229
|
-
updates.sessionTarget = "isolated";
|
|
230
|
-
}
|
|
231
|
-
if (params.deliveryChannel?.trim() && params.deliveryTo?.trim()) updates.delivery = {
|
|
232
|
-
mode: "announce",
|
|
233
|
-
channel: params.deliveryChannel.trim(),
|
|
234
|
-
to: params.deliveryTo.trim()
|
|
235
|
-
};
|
|
236
|
-
if (params.name !== void 0) updates.name = params.name.trim() || void 0;
|
|
237
|
-
if (params.sessionTarget !== void 0) updates.sessionTarget = params.sessionTarget;
|
|
238
|
-
if (params.agentId !== void 0) {
|
|
239
|
-
const t = params.agentId.trim();
|
|
240
|
-
if (t) updates.agentId = t;
|
|
241
|
-
}
|
|
242
|
-
if (params.workingDirectory !== void 0) {
|
|
243
|
-
const t = params.workingDirectory.trim();
|
|
244
|
-
if (t) updates.workingDirectory = t;
|
|
245
|
-
}
|
|
246
|
-
if (Object.keys(updates).length === 0) return textResult("Error: update requires at least one of scheduleKind, message, workflowDefinitionId, name, sessionTarget, agentId, workingDirectory, deliveryChannel/deliveryTo.");
|
|
247
|
-
return textResult(await cron.updateJob(params.jobId.trim(), updates) ? `Updated job ${params.jobId.trim()}.` : `Job ${params.jobId.trim()} not found.`);
|
|
248
|
-
}
|
|
249
|
-
case "remove":
|
|
250
|
-
if (!params.jobId?.trim()) return textResult("Error: remove requires jobId.");
|
|
251
|
-
return textResult(await cron.removeJob(params.jobId.trim()) ? `Removed job ${params.jobId.trim()}.` : `Job ${params.jobId.trim()} not found.`);
|
|
252
|
-
case "disable":
|
|
253
|
-
if (!params.jobId?.trim()) return textResult("Error: disable requires jobId.");
|
|
254
|
-
return textResult(await cron.toggleJob(params.jobId.trim(), false) ? `Disabled job ${params.jobId.trim()}.` : `Job ${params.jobId.trim()} not found.`);
|
|
255
|
-
case "enable":
|
|
256
|
-
if (!params.jobId?.trim()) return textResult("Error: enable requires jobId.");
|
|
257
|
-
return textResult(await cron.toggleJob(params.jobId.trim(), true) ? `Enabled job ${params.jobId.trim()}.` : `Job ${params.jobId.trim()} not found.`);
|
|
258
|
-
case "history": {
|
|
259
|
-
if (!params.jobId?.trim()) return textResult("Error: history requires jobId.");
|
|
260
|
-
const history = await cron.getJobHistory(params.jobId.trim(), 5);
|
|
261
|
-
if (history.length === 0) return textResult(`No execution history for job ${params.jobId.trim()}.`);
|
|
262
|
-
return textResult(history.map(formatExecution).join("\n\n"));
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
} catch (error) {
|
|
266
|
-
return textResult(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
};
|
|
270
|
-
}
|
|
271
|
-
//#endregion
|
|
272
|
-
export { createCronjobTool, scanCronPrompt };
|
|
273
|
-
|
|
274
|
-
//# sourceMappingURL=cronjob-tool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cronjob-tool.js","names":[],"sources":["../../../../src/agent/tools/cronjob-tool.ts"],"sourcesContent":["// Agent tool for managing scheduled cron jobs (CronService-backed)\nimport { Type } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@earendil-works/pi-agent-core';\n\nimport type { CronService } from '../../cron/index.js';\nimport { describeSchedule } from '../../cron/schedule.js';\nimport { getCronPayloadText } from '../../cron/job-content.js';\nimport type { CronDelivery, CronPayload, CronSchedule, CronJobPatch, JobData, JobExecution } from '../../cron/types.js';\n\nconst CRON_THREAT_PATTERNS: Array<[RegExp, string]> = [\n [/ignore\\s+(previous|all|above)\\s+instructions/i, 'prompt_injection'],\n [/do\\s+not\\s+tell\\s+the\\s+user/i, 'deception'],\n [/system\\s+prompt\\s+override/i, 'sys_prompt_override'],\n [/curl\\s+[^\\n]*\\$\\{?\\w*(KEY|TOKEN|SECRET|PASSWORD)/i, 'exfil_curl'],\n [/cat\\s+[^\\n]*(\\.env|credentials|\\.netrc)/i, 'read_secrets'],\n [/rm\\s+-rf\\s+\\//i, 'destructive_rm'],\n];\n\nexport function scanCronPrompt(prompt: string): string | null {\n for (const [pattern, id] of CRON_THREAT_PATTERNS) {\n if (pattern.test(prompt)) {\n return (\n `Blocked: prompt matches threat pattern '${id}'. ` +\n 'Cron prompts must not contain injection or exfiltration payloads.'\n );\n }\n }\n return null;\n}\n\nconst CronjobSchema = Type.Object({\n action: Type.Union(\n [\n Type.Literal('list'),\n Type.Literal('create'),\n Type.Literal('update'),\n Type.Literal('remove'),\n Type.Literal('enable'),\n Type.Literal('disable'),\n Type.Literal('history'),\n ],\n { description: 'Action to perform on cron jobs' },\n ),\n\n name: Type.Optional(Type.String({ description: 'Human-readable job name' })),\n scheduleKind: Type.Optional(\n Type.Union([Type.Literal('cron'), Type.Literal('at'), Type.Literal('every')], {\n description: 'Schedule kind. Use cronExpr for cron, at for one-time ISO time, everyMs for interval.',\n }),\n ),\n cronExpr: Type.Optional(\n Type.String({\n description:\n 'Cron schedule expression. Examples:\\n' +\n ' \"0 9 * * *\" = every day at 9:00 AM\\n' +\n ' \"*/30 * * * *\" = every 30 minutes\\n' +\n ' \"0 9 * * 1-5\" = weekdays at 9:00 AM\\n' +\n ' \"0 0 1 * *\" = first day of each month',\n }),\n ),\n at: Type.Optional(Type.String({ description: 'One-time run timestamp as ISO 8601 string.' })),\n everyMs: Type.Optional(Type.Number({ description: 'Fixed interval in milliseconds.' })),\n tz: Type.Optional(Type.String({ description: 'IANA timezone for cronExpr, e.g. Asia/Shanghai.' })),\n message: Type.Optional(\n Type.String({\n description:\n 'Instruction for the agent when the job runs (agentTurn payload; typically a fresh session).',\n }),\n ),\n workflowDefinitionId: Type.Optional(\n Type.String({\n description:\n 'Workflow definition id for a workflowRun job (mutually exclusive with message on create).',\n }),\n ),\n workflowGoal: Type.Optional(\n Type.String({ description: 'Optional goal override when creating a workflowRun job.' }),\n ),\n workflowInputJson: Type.Optional(\n Type.String({\n description: 'JSON object for workflow input payload (workflowRun create/update).',\n }),\n ),\n goalId: Type.Optional(\n Type.String({\n description:\n 'Durable goal id for a goalContinue job (mutually exclusive with message and workflowDefinitionId).',\n }),\n ),\n goalMessage: Type.Optional(\n Type.String({\n description: 'Optional custom continuation message for a goalContinue job.',\n }),\n ),\n waitForCompletion: Type.Optional(\n Type.Boolean({\n description:\n 'For workflowRun jobs: when true (default), cron waits for terminal status before succeeding.',\n }),\n ),\n deliveryChannel: Type.Optional(\n Type.String({ description: 'Delivery channel when workflow completes (e.g. telegram).' }),\n ),\n deliveryTo: Type.Optional(\n Type.String({ description: 'Delivery recipient chat id when workflow completes.' }),\n ),\n sessionTarget: Type.Optional(\n Type.Union([Type.Literal('main'), Type.Literal('isolated')], {\n description:\n '\"main\" uses the main session context; \"isolated\" (default on create) uses a separate session per run.',\n }),\n ),\n agentId: Type.Optional(\n Type.String({\n description:\n 'Agent profile id for isolated jobs (session key). Omit to use the configured default agent (usually `main`).',\n }),\n ),\n workingDirectory: Type.Optional(\n Type.String({\n description:\n 'Absolute workspace path on the gateway host for isolated jobs. Omit to use the agent default workspace.',\n }),\n ),\n\n jobId: Type.Optional(Type.String({ description: 'Job ID (from list output)' })),\n});\n\nexport type CronjobToolParams = {\n action: 'list' | 'create' | 'update' | 'remove' | 'enable' | 'disable' | 'history';\n name?: string;\n scheduleKind?: 'cron' | 'at' | 'every';\n cronExpr?: string;\n at?: string;\n everyMs?: number;\n tz?: string;\n message?: string;\n workflowDefinitionId?: string;\n workflowGoal?: string;\n workflowInputJson?: string;\n goalId?: string;\n goalMessage?: string;\n waitForCompletion?: boolean;\n deliveryChannel?: string;\n deliveryTo?: string;\n sessionTarget?: 'main' | 'isolated' | 'current';\n agentId?: string;\n workingDirectory?: string;\n jobId?: string;\n};\n\nexport interface CronjobToolDeps {\n getCronService: () => CronService | undefined;\n}\n\nfunction textResult(text: string): AgentToolResult<{}> {\n return { content: [{ type: 'text', text }], details: {} };\n}\n\nfunction formatJob(job: JobData): string {\n const status = job.enabled ? 'active' : 'disabled';\n const payloadText = getCronPayloadText(job);\n const truncatedPayload =\n payloadText.length > 100 ? `${payloadText.slice(0, 100)}...` : payloadText;\n const payloadLine =\n job.payload.kind === 'workflowRun'\n ? ` Workflow: ${job.payload.definitionId}${job.payload.goal ? ` — ${job.payload.goal}` : ''}`\n : ` Message: ${truncatedPayload}`;\n\n return [\n `${status} ${job.name ?? '(unnamed)'} (${job.id})`,\n ` Schedule: ${describeSchedule(job.schedule)}`,\n ` Type: ${job.payload.kind}`,\n payloadLine,\n ` Next run: ${job.state.nextRunAtMs ? new Date(job.state.nextRunAtMs).toISOString() : 'N/A'}`,\n ` Session: ${job.sessionTarget ?? 'main'}`,\n ` Agent: ${job.agentId?.trim() || '(default)'}`,\n ` Workspace: ${job.workingDirectory?.trim() || '(agent default)'}`,\n ].join('\\n');\n}\n\nfunction scheduleFromParams(params: Pick<CronjobToolParams, 'scheduleKind' | 'cronExpr' | 'at' | 'everyMs' | 'tz'>): CronSchedule | undefined {\n const kind = params.scheduleKind;\n if (!kind) return undefined;\n if (kind === 'cron') {\n const expr = params.cronExpr?.trim();\n if (!expr) return undefined;\n return { kind, expr, ...(params.tz?.trim() ? { tz: params.tz.trim() } : {}) };\n }\n if (kind === 'at') {\n const at = params.at?.trim();\n if (!at) return undefined;\n return { kind, at };\n }\n if (!Number.isFinite(params.everyMs) || !params.everyMs || params.everyMs <= 0) return undefined;\n return { kind, everyMs: Math.floor(params.everyMs) };\n}\n\nfunction formatExecution(exec: JobExecution): string {\n const dur = exec.duration != null ? `${(exec.duration / 1000).toFixed(1)}s` : 'N/A';\n const lines = [`[${exec.status}] ${exec.startedAt} (${dur})`];\n if (exec.summary) {\n lines.push(` Summary: ${exec.summary.slice(0, 200)}`);\n }\n if (exec.error) {\n lines.push(` Error: ${exec.error.slice(0, 200)}`);\n }\n return lines.join('\\n');\n}\n\nexport function createCronjobTool(deps: CronjobToolDeps): AgentTool {\n return {\n name: 'cronjob',\n label: '⏰ Cronjob',\n description:\n 'Manage scheduled tasks (cron jobs) that run automatically.\\n\\n' +\n 'Jobs can run an agent message (agentTurn), a workflow directly (workflowRun), or continue a durable goal (goalContinue).\\n\\n' +\n 'ACTIONS:\\n' +\n '- list: Show all scheduled jobs with status and next run time\\n' +\n '- create: Create a job (scheduleKind plus exactly one of message, workflowDefinitionId, or goalId)\\n' +\n '- update: Change schedule, message, workflow fields, name, sessionTarget, agentId, or workingDirectory (requires jobId)\\n' +\n '- remove: Delete a job (requires jobId)\\n' +\n '- enable / disable: Toggle a job (requires jobId)\\n' +\n '- history: Recent executions for a job (requires jobId)',\n parameters: CronjobSchema,\n\n async execute(_toolCallId, params: CronjobToolParams, _signal) {\n const cron = deps.getCronService();\n if (!cron) {\n return textResult('Cron service is not available in this environment.');\n }\n\n try {\n switch (params.action) {\n case 'list': {\n const jobs = await cron.listJobs();\n if (jobs.length === 0) {\n return textResult('No scheduled jobs.');\n }\n const formatted = jobs.map(formatJob).join('\\n\\n');\n return { content: [{ type: 'text', text: formatted }], details: {} };\n }\n\n case 'create': {\n const workflowId = params.workflowDefinitionId?.trim();\n const goalId = params.goalId?.trim();\n const hasMessage = Boolean(params.message?.trim());\n const targetCount = [workflowId, goalId, hasMessage ? 'message' : ''].filter(Boolean).length;\n const schedule = scheduleFromParams(params);\n if (!schedule || targetCount !== 1) {\n return textResult(\n 'Error: create requires scheduleKind with matching cronExpr/at/everyMs and exactly one of message, workflowDefinitionId, or goalId.',\n );\n }\n\n if (hasMessage) {\n const scanResult = scanCronPrompt(params.message!);\n if (scanResult) {\n return textResult(`Error: ${scanResult}`);\n }\n }\n\n let payload: CronPayload;\n let sessionTarget = params.sessionTarget ?? 'isolated';\n let delivery: CronDelivery | undefined;\n\n if (goalId) {\n payload = {\n kind: 'goalContinue',\n goalId,\n ...(params.goalMessage?.trim() ? { message: params.goalMessage.trim() } : {}),\n };\n sessionTarget = 'isolated';\n } else if (workflowId) {\n let inputEnvelope: { payload: unknown } | undefined;\n if (params.workflowInputJson?.trim()) {\n try {\n inputEnvelope = { payload: JSON.parse(params.workflowInputJson) as unknown };\n } catch {\n return textResult('Error: workflowInputJson must be valid JSON.');\n }\n }\n const agentId = params.agentId?.trim() || undefined;\n payload = {\n kind: 'workflowRun',\n definitionId: workflowId,\n ...(params.workflowGoal?.trim() ? { goal: params.workflowGoal.trim() } : {}),\n ...(inputEnvelope ? { inputEnvelope } : {}),\n ...(agentId ? { agentId } : {}),\n ...(params.waitForCompletion === false ? { waitForCompletion: false } : {}),\n };\n sessionTarget = 'isolated';\n if (params.deliveryChannel?.trim() && params.deliveryTo?.trim()) {\n delivery = {\n mode: 'announce',\n channel: params.deliveryChannel.trim(),\n to: params.deliveryTo.trim(),\n };\n }\n } else {\n payload = {\n kind: 'agentTurn',\n message: params.message!.trim(),\n };\n }\n\n const result = await cron.addJob(schedule, {\n name: params.name?.trim() || undefined,\n sessionTarget,\n ...(delivery ? { delivery } : {}),\n ...(params.agentId?.trim() ? { agentId: params.agentId.trim() } : {}),\n ...(params.workingDirectory?.trim()\n ? { workingDirectory: params.workingDirectory.trim() }\n : {}),\n payload,\n });\n\n const kindLabel = goalId ? `goal job (${goalId})` : workflowId ? `workflow job (${workflowId})` : 'job';\n return textResult(\n `Created ${kindLabel}${params.name ? ` \"${params.name.trim()}\"` : ''} (${result.id})\\n` +\n `Schedule: ${describeSchedule(result.schedule)}`,\n );\n }\n\n case 'update': {\n if (!params.jobId?.trim()) {\n return textResult('Error: update requires jobId.');\n }\n\n const updates: CronJobPatch = {};\n const nextSchedule = scheduleFromParams(params);\n if (nextSchedule) {\n updates.schedule = nextSchedule;\n }\n if (params.message != null && params.message.trim()) {\n const scanResult = scanCronPrompt(params.message);\n if (scanResult) {\n return textResult(`Error: ${scanResult}`);\n }\n updates.payload = { kind: 'agentTurn', message: params.message.trim() };\n }\n if (params.goalId?.trim()) {\n updates.payload = {\n kind: 'goalContinue',\n goalId: params.goalId.trim(),\n ...(params.goalMessage?.trim() ? { message: params.goalMessage.trim() } : {}),\n };\n updates.sessionTarget = 'isolated';\n }\n if (params.workflowDefinitionId?.trim()) {\n let inputEnvelope: { payload: unknown } | undefined;\n if (params.workflowInputJson?.trim()) {\n try {\n inputEnvelope = { payload: JSON.parse(params.workflowInputJson) as unknown };\n } catch {\n return textResult('Error: workflowInputJson must be valid JSON.');\n }\n }\n const agentId = params.agentId?.trim() || undefined;\n updates.payload = {\n kind: 'workflowRun',\n definitionId: params.workflowDefinitionId.trim(),\n ...(params.workflowGoal?.trim() ? { goal: params.workflowGoal.trim() } : {}),\n ...(inputEnvelope ? { inputEnvelope } : {}),\n ...(agentId ? { agentId } : {}),\n ...(params.waitForCompletion === false ? { waitForCompletion: false } : {}),\n };\n updates.sessionTarget = 'isolated';\n }\n if (params.deliveryChannel?.trim() && params.deliveryTo?.trim()) {\n updates.delivery = {\n mode: 'announce',\n channel: params.deliveryChannel.trim(),\n to: params.deliveryTo.trim(),\n };\n }\n if (params.name !== undefined) {\n updates.name = params.name.trim() || undefined;\n }\n if (params.sessionTarget !== undefined) {\n updates.sessionTarget = params.sessionTarget;\n }\n if (params.agentId !== undefined) {\n const t = params.agentId.trim();\n if (t) updates.agentId = t;\n }\n if (params.workingDirectory !== undefined) {\n const t = params.workingDirectory.trim();\n if (t) updates.workingDirectory = t;\n }\n\n if (Object.keys(updates).length === 0) {\n return textResult(\n 'Error: update requires at least one of scheduleKind, message, workflowDefinitionId, name, sessionTarget, agentId, workingDirectory, deliveryChannel/deliveryTo.',\n );\n }\n\n const success = await cron.updateJob(params.jobId.trim(), updates);\n return textResult(\n success ? `Updated job ${params.jobId.trim()}.` : `Job ${params.jobId.trim()} not found.`,\n );\n }\n\n case 'remove': {\n if (!params.jobId?.trim()) {\n return textResult('Error: remove requires jobId.');\n }\n const removed = await cron.removeJob(params.jobId.trim());\n return textResult(\n removed ? `Removed job ${params.jobId.trim()}.` : `Job ${params.jobId.trim()} not found.`,\n );\n }\n\n case 'disable': {\n if (!params.jobId?.trim()) {\n return textResult('Error: disable requires jobId.');\n }\n const toggled = await cron.toggleJob(params.jobId.trim(), false);\n return textResult(\n toggled ? `Disabled job ${params.jobId.trim()}.` : `Job ${params.jobId.trim()} not found.`,\n );\n }\n\n case 'enable': {\n if (!params.jobId?.trim()) {\n return textResult('Error: enable requires jobId.');\n }\n const toggled = await cron.toggleJob(params.jobId.trim(), true);\n return textResult(\n toggled ? `Enabled job ${params.jobId.trim()}.` : `Job ${params.jobId.trim()} not found.`,\n );\n }\n\n case 'history': {\n if (!params.jobId?.trim()) {\n return textResult('Error: history requires jobId.');\n }\n const history = await cron.getJobHistory(params.jobId.trim(), 5);\n if (history.length === 0) {\n return textResult(`No execution history for job ${params.jobId.trim()}.`);\n }\n const formatted = history.map(formatExecution).join('\\n\\n');\n return textResult(formatted);\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return textResult(`Error: ${message}`);\n }\n },\n } as any;\n}\n"],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
//#region src/cli/commands/cron-cli.ts
|
|
2
|
-
async function withCronService(fn) {
|
|
3
|
-
const { CronService } = await import("../../cron/index.js");
|
|
4
|
-
const cronService = new CronService();
|
|
5
|
-
await cronService.initialize();
|
|
6
|
-
try {
|
|
7
|
-
return await fn(cronService);
|
|
8
|
-
} finally {
|
|
9
|
-
await cronService.stop();
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
//#endregion
|
|
13
|
-
export { withCronService };
|
|
14
|
-
|
|
15
|
-
//# sourceMappingURL=cron-cli.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cron-cli.js","names":[],"sources":["../../../../src/cli/commands/cron-cli.ts"],"sourcesContent":["import type { CronService } from '../../cron/service.js';\n\nexport async function withCronService<T>(fn: (service: CronService) => Promise<T>): Promise<T> {\n const { CronService } = await import('../../cron/index.js');\n const cronService = new CronService();\n await cronService.initialize();\n try {\n return await fn(cronService);\n } finally {\n await cronService.stop();\n }\n}\n"],"mappings":";AAEA,eAAsB,gBAAmB,IAAsD;CAC7F,MAAM,EAAE,gBAAgB,MAAM,OAAO;CACrC,MAAM,cAAc,IAAI,aAAa;AACrC,OAAM,YAAY,YAAY;AAC9B,KAAI;AACF,SAAO,MAAM,GAAG,YAAY;WACpB;AACR,QAAM,YAAY,MAAM"}
|