@xopcai/xopc 0.0.118 → 0.0.119
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-CU8J6zou.js} +1 -1
- package/dist/gateway/static/root/assets/agents-B0hkpLhP.js +2 -0
- package/dist/gateway/static/root/assets/app-management-settings-panel-B9vfYoEr.js +1 -0
- package/dist/gateway/static/root/assets/appearance-settings-ClOzIO24.js +1 -0
- package/dist/gateway/static/root/assets/{apps-page--wMEL00f.js → apps-page-DU0dz9Zo.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-Cki4SfU2.js → archive-plugin-BkVIgZzA.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-D-KnS2Do.js → attachment-load-CaCMWh1D.js} +1 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-DhGDpKP3.js +1 -0
- package/dist/gateway/static/root/assets/automations-page-CTedroVo.js +1 -0
- package/dist/gateway/static/root/assets/{binary-plugins-D2sgvJja.js → binary-plugins-B4TO_bsn.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-DIq-4Gvb.js → block-editor-DJRWwWNI.js} +28 -28
- package/dist/gateway/static/root/assets/browser-settings-page-FCDwOOBK.js +8 -0
- package/dist/gateway/static/root/assets/capability-presets-api-Befi89CL.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-_G8eb2vJ.js +1 -0
- package/dist/gateway/static/root/assets/channel-recipient-api-BNSuJb5f.js +1 -0
- package/dist/gateway/static/root/assets/channels-settings-C3d5JBJX.js +1 -0
- package/dist/gateway/static/root/assets/cn-BQ_8x0bT.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-yaUNvt5u.js +2 -0
- package/dist/gateway/static/root/assets/cron-expression-B3B1eqnr.js +2 -0
- package/dist/gateway/static/root/assets/dreaming-settings-DNrdg1Ve.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-DYu1KaFQ.js → extension-debug-page-DYh402XV.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-B3W6QwlZ.js → extension-page-Cr_TizrN.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-D7VQ-cxE.js → extension-settings-page-BU1KoKRj.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-B7xDPu-R.js → fetch-Y7AEX4H3.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-RbMmAOpX.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-C79wkXef.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-CYj9FWCp.js → gateway-startup-retry-DiD_Tx4N.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-9paXuHdo.js +1 -0
- package/dist/gateway/static/root/assets/{goals-config-api-CQQgzPr3.js → goals-config-api-DqxVi0p5.js} +1 -1
- package/dist/gateway/static/root/assets/{goals-page-BHitvJAv.js → goals-page-CS0R-Af2.js} +2 -2
- package/dist/gateway/static/root/assets/goals-settings-CSuzZ8Ae.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-settings-DXPaYJm3.js +1 -0
- package/dist/gateway/static/root/assets/index-BoKafJIZ.js +191 -0
- package/dist/gateway/static/root/assets/index-CArhCcYn.css +1 -0
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-Dvg53qnd.js +1 -0
- package/dist/gateway/static/root/assets/{logs-page-C2Uqvae9.js → logs-page-DLXPcksQ.js} +2 -2
- package/dist/gateway/static/root/assets/{markdown-split-BwOFrJ2E.js → markdown-split-CpHxbtWJ.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-Cnz6Q5G6.js → media-plugins-SFPQRSxq.js} +1 -1
- package/dist/gateway/static/root/assets/messages-CrDHEbss.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-BDF2iyRk.js +2 -0
- package/dist/gateway/static/root/assets/note-detail-page-CSb_hwig.js +2 -0
- package/dist/gateway/static/root/assets/{note-image-lightbox-B-Svpmza.js → note-image-lightbox-BUYURRgn.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-BsIBSFyZ.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-Bss4TiwP.js → preview-open-alternatives-BHz9iWYA.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CwzSovcS.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-BRNjdgKq.js → save-bar-controls-CefkOlRg.js} +1 -1
- package/dist/gateway/static/root/assets/schedule-field-CmTRoOcE.js +1 -0
- package/dist/gateway/static/root/assets/{schema-form-Dub9sy8r.js → schema-form-FMKv1vGu.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-PHmX-NmA.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BRAeKJN4.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-BeFLavGi.js → settings-collapsible-section-BouO6JTi.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-dmyaPOTG.js → settings-form-section-D-4lBl6X.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-KKrbFjy8.js +1 -0
- package/dist/gateway/static/root/assets/settings-page-layout-BJ4Gsef5.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-CrUjHPQo.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-C8glrdqe.js → share-preview-page-BDy2btRN.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-B18OBmH5.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-C28-2uKQ.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-Bm2ebkwl.js +2 -0
- package/dist/gateway/static/root/assets/system-settings-panel-CRngrlnZ.js +1 -0
- package/dist/gateway/static/root/assets/typed-models-lib-BltBc0b-.js +1 -0
- package/dist/gateway/static/root/assets/{use-channel-catalog-DqlWTsDb.js → use-channel-catalog-CjN-51e6.js} +1 -1
- package/dist/gateway/static/root/assets/user-profile-settings-panel-DJ1dKwZy.js +1 -0
- package/dist/gateway/static/root/assets/utils-B5M5-YvK.js +1 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-C73IVZeC.js → voice-api-key-field-CeEevm7z.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-player-store-C_ArLJPM.js → voice-player-store-B7ykUlHM.js} +1 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-C4PzUQjB.js +3 -0
- package/dist/gateway/static/root/assets/workflows-page-BL84_-Ky.js +18 -0
- package/dist/gateway/static/root/index.html +6 -7
- 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/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/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/tooling.js +2 -2
- 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/service.d.ts +1 -9
- package/dist/src/agent/service.js +3 -40
- 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-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/lifecycle.js +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 +26 -8
- 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/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 +12 -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/infra/update-restart.js +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/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 +18 -7
- 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-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/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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","names":[],"sources":["../../../src/cron/executor.ts"],"sourcesContent":["// Cron job executor with timeout, retry logic and agent integration\nimport type { WorkflowRunView } from '../workflows/domain/index.js';\nimport type {\n CronRunOutcome,\n CronWorkflowRunStarter,\n HeartbeatWakeSink,\n JobData,\n JobExecution,\n JobExecutor,\n JobExecutorDeps,\n} from './types.js';\nimport type { OutboundMessage } from '../channels/transport-types.js';\nimport { createLogger } from '../utils/logger.js';\nimport {\n getChannelPlugin,\n} from '../channels/plugins/registry.js';\nimport { getCronPayloadText } from './job-content.js';\nimport type { CronRunLogStore } from './run-log-store.js';\nimport {\n DEFAULT_ACK_MAX_CHARS,\n NO_REPLY,\n shouldSilence,\n stripHeartbeatToken,\n} from '../heartbeat/tokens.js';\nimport { DEFAULT_AGENT_ID, normalizeAgentId } from '../agent/agent-scope.js';\nimport { buildSessionKey } from '../routing/session-key.js';\nimport {\n buildWorkflowRunCronSummary,\n buildWorkflowRunDeliveryText,\n isWorkflowRunCronSuccess,\n resolveWorkflowCronWaitMs,\n waitForWorkflowRunView,\n} from './workflow-run-completion.js';\n\nconst log = createLogger('CronExecutor');\n\n// Error backoff schedule in ms\nconst ERROR_BACKOFF_MS = [\n 30_000, // 1st error → 30s\n 60_000, // 2nd error → 1min\n 5 * 60_000, // 3rd error → 5min\n 15 * 60_000, // 4th error → 15min\n 60 * 60_000, // 5th+ error → 60min\n];\n\nfunction errorBackoffMs(consecutiveErrors: number): number {\n const idx = Math.min(consecutiveErrors - 1, ERROR_BACKOFF_MS.length - 1);\n return ERROR_BACKOFF_MS[Math.max(0, idx)];\n}\n\nfunction resolveIsolatedCronJobModel(job: JobData): string | undefined {\n if (job.payload?.kind === 'agentTurn') {\n const m = job.payload.model?.trim();\n if (m) return m;\n }\n return undefined;\n}\n\nasync function postCronWebhook(url: string, payload: unknown): Promise<void> {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`Webhook delivery failed: HTTP ${res.status}${text ? ` ${text.slice(0, 200)}` : ''}`);\n }\n}\n\nexport class DefaultJobExecutor implements JobExecutor {\n private history: Map<string, JobExecution[]> = new Map();\n private runningJobs = new Map<string, AbortController>();\n private agentService: any = null;\n private messageBus: any = null;\n private heartbeatService: HeartbeatWakeSink | null = null;\n private sessionStore: JobExecutorDeps['sessionStore'] | undefined;\n private runLogStore: CronRunLogStore | null = null;\n private getDefaultCronAgentId: (() => string) | null = null;\n private workflowRunService: CronWorkflowRunStarter | null = null;\n private goalRunner: JobExecutorDeps['goalRunner'] | null = null;\n\n setRunLogStore(store: CronRunLogStore | null): void {\n this.runLogStore = store;\n }\n\n setDeps(deps: JobExecutorDeps): void {\n this.agentService = deps.agentService;\n this.messageBus = deps.messageBus;\n this.heartbeatService = deps.heartbeatService ?? null;\n if (deps.sessionStore !== undefined) {\n this.sessionStore = deps.sessionStore;\n }\n this.getDefaultCronAgentId = deps.getDefaultCronAgentId ?? null;\n this.workflowRunService = deps.workflowRunService ?? null;\n this.goalRunner = deps.goalRunner ?? null;\n }\n\n private async buildCronOutboundMessage(\n channel: string,\n to: string,\n content: string,\n ): Promise<OutboundMessage> {\n const plugin = getChannelPlugin(channel);\n if (plugin?.cronDelivery) {\n const { chatId, accountId, metadata } = await plugin.cronDelivery.normalizeDeliveryTarget(\n to,\n this.sessionStore,\n );\n const meta =\n accountId || metadata\n ? { ...(metadata ?? {}), ...(accountId ? { accountId } : {}) }\n : undefined;\n return {\n channel,\n chat_id: chatId,\n content,\n type: 'message',\n ...(meta && Object.keys(meta).length > 0 ? { metadata: meta } : {}),\n };\n }\n return {\n channel,\n chat_id: to,\n content,\n type: 'message',\n };\n }\n\n async execute(job: JobData, signal: AbortSignal, deps?: JobExecutorDeps): Promise<void> {\n // Set deps if provided\n if (deps) {\n this.setDeps(deps);\n }\n\n const executionId = crypto.randomUUID();\n const execution: JobExecution = {\n id: executionId,\n jobId: job.id,\n status: 'running',\n startedAt: new Date().toISOString(),\n retryCount: 0,\n sessionId: job.sessionKey,\n sessionKey: job.sessionKey,\n sessionType: job.sessionKey ? 'cron' : undefined,\n };\n\n // Record execution start\n this.addToHistory(job.id, execution);\n if (this.runLogStore) {\n await this.runLogStore.upsert(execution);\n }\n this.runningJobs.set(job.id, new AbortController());\n\n log.info(\n { jobId: job.id, executionId, preview: getCronPayloadText(job).slice(0, 100) },\n 'Job executing'\n );\n\n let result: CronRunOutcome;\n\n try {\n // Check for cancellation\n if (signal.aborted) {\n throw new Error('Job was cancelled before execution');\n }\n\n // Execute the job\n result = await this.performJob(job, signal);\n\n // Mark as success/failed\n execution.status = result.status === 'ok' ? 'success' : result.status === 'skipped' ? 'cancelled' : 'failed';\n execution.endedAt = new Date().toISOString();\n execution.duration = Date.now() - new Date(execution.startedAt).getTime();\n execution.summary = result.summary;\n execution.error = result.error;\n execution.sessionId = result.sessionId;\n execution.sessionKey = result.sessionKey;\n execution.sessionType = result.sessionType;\n execution.model = result.model;\n execution.workflowRunId = result.workflowRunId;\n\n if (result.status === 'ok') {\n log.info(\n { jobId: job.id, executionId, duration: execution.duration },\n 'Job completed'\n );\n } else if (result.status === 'skipped') {\n log.warn({ jobId: job.id, executionId, reason: result.error }, 'Job skipped');\n } else {\n log.error(\n { jobId: job.id, executionId, errorMessage: result.error, phase: 'cron.execute' },\n `Job failed: ${result.error ?? 'unknown'}`,\n );\n }\n\n if (result.status === 'ok' && job.wakeMode === 'next-heartbeat' && this.heartbeatService) {\n try {\n this.heartbeatService.requestNow({ reason: `cron:${job.id}` });\n } catch (e) {\n log.warn({ jobId: job.id, err: e }, 'Heartbeat wake after cron failed');\n }\n }\n } catch (error) {\n execution.status = 'failed';\n execution.endedAt = new Date().toISOString();\n execution.duration = Date.now() - new Date(execution.startedAt).getTime();\n execution.error = error instanceof Error ? error.message : String(error);\n\n log.error(\n {\n err: error,\n errorMessage: execution.error,\n jobId: job.id,\n executionId,\n phase: 'cron.execute',\n },\n `Job execution error: ${execution.error}`,\n );\n\n result = {\n status: 'error',\n error: execution.error,\n };\n } finally {\n this.runningJobs.delete(job.id);\n }\n\n if (this.runLogStore) {\n await this.runLogStore.upsert(execution);\n }\n\n return;\n }\n\n /**\n * Perform the actual job work - integrate with AgentService\n */\n protected async performJob(job: JobData, signal: AbortSignal): Promise<CronRunOutcome> {\n const timeout =\n job.payload.kind === 'agentTurn' && job.payload.timeoutSeconds\n ? job.payload.timeoutSeconds * 1000\n : 180_000;\n const sessionTarget = job.sessionTarget;\n\n // Check for abort before starting\n if (signal.aborted) {\n return { status: 'skipped', error: 'Job was aborted before execution' };\n }\n\n try {\n if (job.payload.kind === 'goalContinue') {\n return await this.executeGoalContinue(job);\n }\n\n if (job.payload.kind === 'workflowRun') {\n return await this.executeWorkflowRun(job, signal);\n }\n\n // If no agent service, fall back to basic execution\n if (!this.agentService || !this.messageBus) {\n log.warn({ jobId: job.id }, 'No agent service configured, using basic execution');\n return this.basicExecute(job, signal, timeout);\n }\n\n if (sessionTarget === 'main') {\n return await this.executeMainSession(job, signal, timeout);\n } else {\n return await this.executeIsolated(job, signal, timeout);\n }\n } catch (error) {\n return {\n status: 'error',\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n private async executeGoalContinue(job: JobData): Promise<CronRunOutcome> {\n if (job.payload.kind !== 'goalContinue') {\n return { status: 'error', error: 'Cron job payload is not goalContinue' };\n }\n if (!this.goalRunner) {\n return { status: 'error', error: 'Goal runner is not configured for cron' };\n }\n const item = this.goalRunner.enqueue(job.payload.goalId, {\n message: job.payload.message,\n maxRetries: job.payload.maxRetries ?? 0,\n source: 'cron',\n });\n return {\n status: 'ok',\n summary: `Queued goal ${job.payload.goalId} (${item.status})`,\n sessionId: item.sessionKey,\n sessionKey: item.sessionKey,\n sessionType: 'goal',\n };\n }\n\n private async executeWorkflowRun(job: JobData, signal: AbortSignal): Promise<CronRunOutcome> {\n if (signal.aborted) {\n return { status: 'skipped', error: 'Job was aborted before workflow run start' };\n }\n\n if (job.payload.kind !== 'workflowRun') {\n return { status: 'error', error: 'Cron job payload is not workflowRun' };\n }\n\n if (!this.workflowRunService) {\n return { status: 'error', error: 'Workflow run service is not configured for cron' };\n }\n\n const fallbackAgentId = this.getDefaultCronAgentId?.() ?? DEFAULT_AGENT_ID;\n const agentId = normalizeAgentId(job.payload.agentId || job.agentId || fallbackAgentId);\n const fireId = job.payload.source?.fireId || crypto.randomUUID();\n const source = {\n kind: 'cron' as const,\n scheduleId: job.payload.source?.scheduleId || job.id,\n fireId,\n scheduledAtMs: job.payload.source?.scheduledAtMs ?? Date.now(),\n };\n const result = await this.workflowRunService.startWorkflowRun({\n agentId,\n definitionId: job.payload.definitionId,\n input: job.payload.input,\n inputEnvelope: job.payload.inputEnvelope,\n goal: job.payload.goal,\n source,\n idempotencyKey: `cron:${job.id}:${fireId}`,\n });\n\n if (result.ok === false) {\n return {\n status: 'error',\n error: result.message,\n };\n }\n\n log.info(\n {\n jobId: job.id,\n workflowRunId: result.runId,\n definitionId: job.payload.definitionId,\n sessionKey: result.sessionKey,\n },\n 'Workflow run started from cron',\n );\n\n const waitForCompletion = job.payload.waitForCompletion !== false;\n if (!waitForCompletion || !this.workflowRunService.readWorkflowRunView) {\n return {\n status: 'ok',\n summary: `Started workflow run ${result.runId}`,\n sessionId: result.sessionKey,\n sessionKey: result.sessionKey,\n sessionType: 'workflow',\n workflowRunId: result.runId,\n };\n }\n\n return this.waitForWorkflowRunOutcome({\n job,\n agentId,\n sessionKey: result.sessionKey,\n initialRunId: result.runId,\n signal,\n });\n }\n\n private async waitForWorkflowRunOutcome(params: {\n job: JobData;\n agentId: string;\n sessionKey: string;\n initialRunId: string;\n signal: AbortSignal;\n }): Promise<CronRunOutcome> {\n const waitMs = resolveWorkflowCronWaitMs(180_000);\n const maxWorkflowRetries =\n params.job.payload.kind === 'workflowRun'\n ? Math.max(0, Math.floor(params.job.payload.maxRetries ?? 0))\n : 0;\n let runId = params.initialRunId;\n let attempt = 0;\n\n while (attempt <= maxWorkflowRetries) {\n const waitResult = await waitForWorkflowRunView({\n readView: (id) => this.workflowRunService!.readWorkflowRunView!(params.agentId, id),\n runId,\n signal: params.signal,\n timeoutMs: waitMs,\n });\n\n if (waitResult.kind === 'aborted') {\n return { status: 'skipped', error: 'Job was aborted while waiting for workflow run' };\n }\n\n if (waitResult.kind === 'timeout') {\n return {\n status: 'error',\n error: `Workflow run ${runId} did not finish within ${waitMs}ms`,\n summary: waitResult.lastView ? buildWorkflowRunCronSummary(waitResult.lastView) : undefined,\n sessionId: params.sessionKey,\n sessionKey: params.sessionKey,\n sessionType: 'workflow',\n workflowRunId: runId,\n };\n }\n\n const view = waitResult.view;\n const summary = buildWorkflowRunCronSummary(view);\n const succeeded = isWorkflowRunCronSuccess(view);\n\n if (succeeded) {\n const baseOutcome: CronRunOutcome = {\n status: 'ok',\n summary,\n sessionId: params.sessionKey,\n sessionKey: params.sessionKey,\n sessionType: 'workflow',\n workflowRunId: runId,\n };\n await this.deliverWorkflowRunOutcome(params.job, view, baseOutcome);\n return baseOutcome;\n }\n\n const canRetry =\n attempt < maxWorkflowRetries &&\n view.run.status === 'failed' &&\n Boolean(this.workflowRunService?.retryWorkflowRun);\n\n if (!canRetry) {\n return {\n status: 'error',\n summary,\n error: summary,\n sessionId: params.sessionKey,\n sessionKey: params.sessionKey,\n sessionType: 'workflow',\n workflowRunId: runId,\n };\n }\n\n const retryResult = await this.workflowRunService!.retryWorkflowRun!({\n agentId: params.agentId,\n runId,\n });\n if (retryResult.ok === false) {\n return {\n status: 'error',\n error: retryResult.message,\n summary,\n sessionId: params.sessionKey,\n sessionKey: params.sessionKey,\n sessionType: 'workflow',\n workflowRunId: runId,\n };\n }\n\n runId = retryResult.runId;\n attempt += 1;\n log.info(\n { jobId: params.job.id, attempt, workflowRunId: runId },\n 'Retrying failed workflow run from cron',\n );\n }\n\n return {\n status: 'error',\n error: 'Workflow run retries exhausted',\n sessionId: params.sessionKey,\n sessionKey: params.sessionKey,\n sessionType: 'workflow',\n workflowRunId: runId,\n };\n }\n\n private async deliverWorkflowRunOutcome(\n job: JobData,\n view: WorkflowRunView,\n outcome: CronRunOutcome,\n ): Promise<void> {\n const delivery = job.delivery;\n if (!delivery || delivery.mode === 'none' || delivery.channel === 'local' || !delivery.to?.trim()) {\n return;\n }\n\n try {\n const text = buildWorkflowRunDeliveryText(view);\n if (delivery.mode === 'webhook') {\n await postCronWebhook(delivery.to, {\n jobId: job.id,\n jobName: job.name,\n payloadKind: job.payload.kind,\n workflowRunId: view.run.id,\n status: view.run.status,\n text,\n run: view.run,\n });\n log.info({ jobId: job.id, workflowRunId: view.run.id }, 'Delivered workflow run webhook from cron');\n return;\n }\n if (!this.messageBus || !delivery.channel) return;\n const outbound = await this.buildCronOutboundMessage(delivery.channel!, delivery.to!, text);\n await this.messageBus.publishOutbound(outbound);\n log.info(\n { jobId: job.id, channel: delivery.channel, to: outbound.chat_id, workflowRunId: view.run.id },\n 'Delivered workflow run result from cron',\n );\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n log.warn({ jobId: job.id, err, workflowRunId: view.run.id }, `Workflow cron delivery failed: ${em}`);\n if (outcome.status === 'ok') {\n outcome.summary = `${outcome.summary ?? ''} (delivery failed: ${em})`.trim();\n }\n }\n }\n\n /**\n * Execute in main session - sends system event\n */\n private async executeMainSession(\n job: JobData,\n signal: AbortSignal,\n timeout: number\n ): Promise<CronRunOutcome> {\n const text = getCronPayloadText(job);\n\n if (!text || !text.trim()) {\n return { status: 'skipped', error: 'Main session job requires non-empty message' };\n }\n\n const delivery = job.delivery;\n const channel = delivery?.channel ?? 'local';\n const to = delivery?.to ?? '';\n const actualMessage = text;\n\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(`Job timed out after ${timeout}ms`)), timeout);\n });\n\n // Create execution promise\n const executePromise = (async () => {\n // Check for abort\n if (signal.aborted) {\n throw new Error('Job was aborted');\n }\n\n if (!delivery || delivery.mode === 'none' || channel === 'local') {\n log.info(\n { jobId: job.id, messageLength: actualMessage.length },\n 'Cron main session: no outbound publish'\n );\n return {\n status: 'ok' as const,\n summary: actualMessage.slice(0, 200),\n };\n }\n\n if (delivery.mode === 'webhook') {\n if (!to.trim()) {\n throw new Error('Webhook delivery requires delivery.to');\n }\n await postCronWebhook(to, {\n jobId: job.id,\n jobName: job.name,\n payloadKind: job.payload.kind,\n text: actualMessage,\n });\n return {\n status: 'ok' as const,\n summary: actualMessage.slice(0, 200),\n };\n }\n\n if (!this.messageBus) {\n return { status: 'error' as const, error: 'MessageBus not available' };\n }\n\n const outbound = await this.buildCronOutboundMessage(channel, to, actualMessage);\n\n await this.messageBus.publishOutbound(outbound);\n\n log.info(\n { jobId: job.id, channel, to: outbound.chat_id, messageLength: actualMessage.length },\n 'Sent message to main session'\n );\n\n return {\n status: 'ok' as const,\n summary: actualMessage.slice(0, 200),\n };\n })();\n\n // Race against timeout\n return await Promise.race([executePromise, timeoutPromise]);\n }\n\n /**\n * Execute in isolated mode - runs agent independently\n */\n private async executeIsolated(\n job: JobData,\n signal: AbortSignal,\n timeout: number\n ): Promise<CronRunOutcome> {\n const message = getCronPayloadText(job);\n\n if (!message || !message.trim()) {\n return { status: 'skipped', error: 'Isolated job requires non-empty message' };\n }\n\n const explicitSessionKey =\n job.sessionTarget.startsWith('session:')\n ? job.sessionTarget.slice('session:'.length).trim()\n : job.sessionTarget === 'current'\n ? job.sessionKey?.trim()\n : job.sessionTarget === 'isolated'\n ? job.sessionKey?.trim()\n : undefined;\n const aid = job.agentId?.trim();\n const fallbackAgentId = this.getDefaultCronAgentId?.() ?? DEFAULT_AGENT_ID;\n const sessionKey = explicitSessionKey || buildSessionKey({\n agentId: normalizeAgentId(aid || fallbackAgentId),\n source: 'cron',\n accountId: 'default',\n peerKind: 'dm',\n peerId: `${job.id}-${crypto.randomUUID().slice(0, 8)}`,\n });\n\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(`Job timed out after ${timeout}ms`)), timeout);\n });\n\n // Create execution promise\n const executePromise = (async () => {\n // Check for abort\n if (signal.aborted) {\n throw new Error('Job was aborted');\n }\n\n await this.agentService.sessionConfig.applyCronJobWorkingDirectory(sessionKey, job.workingDirectory);\n\n const jobModel = resolveIsolatedCronJobModel(job);\n if (jobModel) {\n const ok = await this.agentService.sessionConfig.applyCronJobModelOverride(sessionKey, jobModel);\n if (!ok) {\n log.warn({ jobId: job.id, sessionKey, model: jobModel }, 'Cron job model invalid; using agent default');\n }\n } else {\n await this.agentService.sessionConfig.applyCronJobModelOverride(sessionKey, undefined);\n }\n\n const response = await this.agentService.turnDispatcher.processDirect(message, sessionKey);\n\n const model = this.agentService.getModelForSession(sessionKey);\n\n log.info(\n { jobId: job.id, sessionKey, responseLength: response.length, model },\n 'Agent execution completed'\n );\n\n // Handle delivery (`local` channel or `mode: none` = no outbound; transcript in SessionStore)\n const delivery = job.delivery;\n const outboundChannel = delivery?.channel;\n const shouldPublish =\n delivery &&\n delivery.mode !== 'none' &&\n delivery.to;\n\n if (shouldPublish) {\n if (shouldSilence(response, DEFAULT_ACK_MAX_CHARS) || response.trim() === NO_REPLY) {\n return {\n status: 'ok' as const,\n summary: response.slice(0, 200),\n sessionId: sessionKey,\n sessionKey,\n sessionType: 'cron',\n model,\n };\n }\n const { stripped } = stripHeartbeatToken(response);\n const outboundText = stripped || response.trim();\n\n if (delivery.mode === 'webhook') {\n await postCronWebhook(delivery.to, {\n jobId: job.id,\n jobName: job.name,\n payloadKind: job.payload.kind,\n sessionKey,\n model,\n text: outboundText,\n });\n log.info({ jobId: job.id }, 'Delivered agent response webhook');\n return {\n status: 'ok' as const,\n summary: response.slice(0, 200),\n sessionId: sessionKey,\n sessionKey,\n sessionType: 'cron',\n model,\n };\n }\n if (outboundChannel === 'local') {\n return {\n status: 'ok' as const,\n summary: response.slice(0, 200),\n sessionId: sessionKey,\n sessionKey,\n sessionType: 'cron',\n model,\n };\n }\n const targetChannel = outboundChannel || 'cli';\n const outbound = await this.buildCronOutboundMessage(targetChannel, delivery.to, outboundText);\n\n await this.messageBus.publishOutbound(outbound);\n\n log.info(\n { jobId: job.id, channel: targetChannel, to: outbound.chat_id },\n 'Delivered agent response'\n );\n\n return {\n status: 'ok' as const,\n summary: response.slice(0, 200),\n sessionId: sessionKey,\n sessionKey,\n sessionType: 'cron',\n model,\n };\n }\n\n // No outbound delivery: transcript is in SessionStore under `sessionKey`.\n return {\n status: 'ok' as const,\n summary: response.slice(0, 200),\n sessionId: sessionKey,\n sessionKey,\n sessionType: 'cron',\n model,\n };\n })();\n\n // Race against timeout\n try {\n return await Promise.race([executePromise, timeoutPromise]);\n } finally {\n const { retireSessionMcpRuntimeForSessionKey } = await import('../agent/mcp/bundle-mcp-tools.js');\n await retireSessionMcpRuntimeForSessionKey({\n sessionKey,\n reason: 'cron-isolated-end',\n }).catch(() => {});\n }\n }\n\n /**\n * Basic execution without agent service (fallback)\n */\n private async basicExecute(\n job: JobData,\n signal: AbortSignal,\n timeout: number\n ): Promise<CronRunOutcome> {\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error(`Job timed out after ${timeout}ms`));\n }, timeout);\n\n // Listen for abort signal\n const abortHandler = () => {\n clearTimeout(timeoutId);\n reject(new Error('Job was aborted'));\n };\n signal.addEventListener('abort', abortHandler);\n\n // Simulate basic work\n setTimeout(() => {\n clearTimeout(timeoutId);\n signal.removeEventListener('abort', abortHandler);\n\n if (signal.aborted) {\n reject(new Error('Job was aborted'));\n } else {\n resolve({\n status: 'ok',\n summary: `Executed: ${getCronPayloadText(job).slice(0, 100)}`,\n });\n }\n }, 100);\n });\n }\n\n /**\n * Cancel a running job\n */\n cancelJob(jobId: string): boolean {\n const controller = this.runningJobs.get(jobId);\n if (controller) {\n controller.abort();\n this.runningJobs.delete(jobId);\n return true;\n }\n return false;\n }\n\n /**\n * Get execution history for a job\n */\n getHistory(jobId: string, limit = 10): JobExecution[] {\n const history = this.history.get(jobId) || [];\n return history.slice(-limit);\n }\n\n /**\n * Get currently running executions\n */\n getRunningExecutions(): JobExecution[] {\n const result: JobExecution[] = [];\n for (const [jobId] of this.runningJobs) {\n const history = this.history.get(jobId);\n if (history) {\n const running = history.find((e) => e.status === 'running');\n if (running) result.push(running);\n }\n }\n return result;\n }\n\n /**\n * Check if a job is currently running\n */\n isRunning(jobId: string): boolean {\n return this.runningJobs.has(jobId);\n }\n\n /**\n * Get consecutive error count for a job\n */\n getConsecutiveErrors(jobId: string): number {\n const history = this.history.get(jobId) || [];\n // Find last execution\n for (let i = history.length - 1; i >= 0; i--) {\n if (history[i].status !== 'running') {\n if (history[i].status === 'failed' || history[i].status === 'cancelled') {\n // Count consecutive errors before this\n let count = 0;\n for (let j = i - 1; j >= 0; j--) {\n if (history[j].status === 'failed' || history[j].status === 'cancelled') {\n count++;\n } else {\n break;\n }\n }\n return count + 1;\n }\n return 0;\n }\n }\n return 0;\n }\n\n /**\n * Calculate backoff delay for a job\n */\n calculateBackoff(jobId: string): number {\n const errors = this.getConsecutiveErrors(jobId);\n return errorBackoffMs(errors);\n }\n\n /**\n * Clear old history entries\n */\n cleanupHistory(maxAgeDays = 7): void {\n const cutoff = Date.now() - maxAgeDays * 24 * 60 * 60 * 1000;\n\n for (const [jobId, executions] of this.history) {\n this.history.set(\n jobId,\n executions.filter((e) => new Date(e.startedAt).getTime() > cutoff)\n );\n }\n }\n\n private addToHistory(jobId: string, execution: JobExecution): void {\n const existing = this.history.get(jobId) || [];\n existing.push(execution);\n // Keep last 100 executions per job\n if (existing.length > 100) {\n existing.shift();\n }\n this.history.set(jobId, existing);\n }\n}\n"],"mappings":"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"}
|
package/dist/src/cron/index.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export { CronService } from './service.js';
|
|
2
|
-
export { CronRunLogStore } from './run-log-store.js';
|
|
3
|
-
export { DefaultJobExecutor } from './executor.js';
|
|
4
|
-
export { AddJobRequestSchema, UpdateJobRequestSchema, JobDataSchema } from './validation.js';
|
|
5
|
-
export * from './types.js';
|
|
6
|
-
export { getCronPayloadText } from './job-content.js';
|
|
7
|
-
export { describeSchedule } from './schedule.js';
|
package/dist/src/cron/index.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { describeSchedule } from "./schedule.js";
|
|
2
|
-
import { getCronPayloadText } from "./job-content.js";
|
|
3
|
-
import { AddJobRequestSchema, JobDataSchema, UpdateJobRequestSchema } from "./validation.js";
|
|
4
|
-
import { DefaultJobExecutor } from "./executor.js";
|
|
5
|
-
import { CronRunLogStore } from "./run-log-store.js";
|
|
6
|
-
import { CronService } from "./service.js";
|
|
7
|
-
export { AddJobRequestSchema, CronRunLogStore, CronService, DefaultJobExecutor, JobDataSchema, UpdateJobRequestSchema, describeSchedule, getCronPayloadText };
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
//#region src/cron/job-content.ts
|
|
2
|
-
/**
|
|
3
|
-
* Executable body text from a cron job (`payload` only).
|
|
4
|
-
*/
|
|
5
|
-
function getCronPayloadText(job) {
|
|
6
|
-
const p = job.payload;
|
|
7
|
-
if (p.kind === "systemEvent") return p.text;
|
|
8
|
-
if (p.kind === "agentTurn") return p.message;
|
|
9
|
-
if (p.kind === "goalContinue") return p.message || p.goalId;
|
|
10
|
-
return p.goal || p.definitionId;
|
|
11
|
-
}
|
|
12
|
-
//#endregion
|
|
13
|
-
export { getCronPayloadText };
|
|
14
|
-
|
|
15
|
-
//# sourceMappingURL=job-content.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"job-content.js","names":[],"sources":["../../../src/cron/job-content.ts"],"sourcesContent":["import type { JobData } from './types.js';\n\n/**\n * Executable body text from a cron job (`payload` only).\n */\nexport function getCronPayloadText(job: Pick<JobData, 'payload'>): string {\n const p = job.payload;\n if (p.kind === 'systemEvent') return p.text;\n if (p.kind === 'agentTurn') return p.message;\n if (p.kind === 'goalContinue') return p.message || p.goalId;\n return p.goal || p.definitionId;\n}\n"],"mappings":";;;;AAKA,SAAgB,mBAAmB,KAAuC;CACxE,MAAM,IAAI,IAAI;AACd,KAAI,EAAE,SAAS,cAAe,QAAO,EAAE;AACvC,KAAI,EAAE,SAAS,YAAa,QAAO,EAAE;AACrC,KAAI,EAAE,SAAS,eAAgB,QAAO,EAAE,WAAW,EAAE;AACrD,QAAO,EAAE,QAAQ,EAAE"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { CronRunHistoryRow, JobExecution } from './types.js';
|
|
2
|
-
export declare class CronRunLogStore {
|
|
3
|
-
private readonly dbPath?;
|
|
4
|
-
/** @param dbPath Optional SQLite path for tests (opens a dedicated DB). */
|
|
5
|
-
constructor(dbPath?: string);
|
|
6
|
-
private requireDatabase;
|
|
7
|
-
upsert(execution: JobExecution): Promise<void>;
|
|
8
|
-
appendCompleted(execution: JobExecution): Promise<void>;
|
|
9
|
-
readJobHistory(jobId: string, limit: number): Promise<JobExecution[]>;
|
|
10
|
-
readAllRuns(limit: number, jobNames: Map<string, string | undefined>): Promise<CronRunHistoryRow[]>;
|
|
11
|
-
deleteJobRuns(jobId: string): Promise<void>;
|
|
12
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { createLogger } from "../utils/logger/index.js";
|
|
2
|
-
import { init_logger } from "../utils/logger.js";
|
|
3
|
-
import { requireXopcDatabase } from "../storage/sqlite/connection.js";
|
|
4
|
-
import { appendCronRun, deleteCronRunsForJob, readAllCronRuns, readCronJobHistory } from "../storage/sqlite/cron-run-repository.js";
|
|
5
|
-
import "../storage/sqlite/index.js";
|
|
6
|
-
//#region src/cron/run-log-store.ts
|
|
7
|
-
init_logger();
|
|
8
|
-
const log = createLogger("CronRunLog");
|
|
9
|
-
var CronRunLogStore = class {
|
|
10
|
-
dbPath;
|
|
11
|
-
/** @param dbPath Optional SQLite path for tests (opens a dedicated DB). */
|
|
12
|
-
constructor(dbPath) {
|
|
13
|
-
this.dbPath = dbPath;
|
|
14
|
-
}
|
|
15
|
-
requireDatabase() {
|
|
16
|
-
requireXopcDatabase(this.dbPath ? { path: this.dbPath } : void 0);
|
|
17
|
-
}
|
|
18
|
-
async upsert(execution) {
|
|
19
|
-
try {
|
|
20
|
-
this.requireDatabase();
|
|
21
|
-
appendCronRun(execution);
|
|
22
|
-
} catch (err) {
|
|
23
|
-
log.error({
|
|
24
|
-
jobId: execution.jobId,
|
|
25
|
-
err
|
|
26
|
-
}, "Failed to persist cron run");
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
async appendCompleted(execution) {
|
|
30
|
-
await this.upsert(execution);
|
|
31
|
-
}
|
|
32
|
-
async readJobHistory(jobId, limit) {
|
|
33
|
-
this.requireDatabase();
|
|
34
|
-
return readCronJobHistory(jobId, limit);
|
|
35
|
-
}
|
|
36
|
-
async readAllRuns(limit, jobNames) {
|
|
37
|
-
this.requireDatabase();
|
|
38
|
-
return readAllCronRuns(limit).map((execution) => ({
|
|
39
|
-
...execution,
|
|
40
|
-
jobName: jobNames.get(execution.jobId)
|
|
41
|
-
}));
|
|
42
|
-
}
|
|
43
|
-
async deleteJobRuns(jobId) {
|
|
44
|
-
try {
|
|
45
|
-
this.requireDatabase();
|
|
46
|
-
deleteCronRunsForJob(jobId);
|
|
47
|
-
} catch (err) {
|
|
48
|
-
log.warn({
|
|
49
|
-
jobId,
|
|
50
|
-
err
|
|
51
|
-
}, "Failed to delete cron runs");
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
//#endregion
|
|
56
|
-
export { CronRunLogStore };
|
|
57
|
-
|
|
58
|
-
//# sourceMappingURL=run-log-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"run-log-store.js","names":[],"sources":["../../../src/cron/run-log-store.ts"],"sourcesContent":["// Durable cron run history in SQLite (`cron_runs` table).\nimport { createLogger } from '../utils/logger.js';\nimport {\n appendCronRun,\n deleteCronRunsForJob,\n requireXopcDatabase,\n readAllCronRuns,\n readCronJobHistory,\n} from '../storage/sqlite/index.js';\nimport type { CronRunHistoryRow, JobExecution } from './types.js';\n\nconst log = createLogger('CronRunLog');\n\nexport class CronRunLogStore {\n private readonly dbPath?: string;\n\n /** @param dbPath Optional SQLite path for tests (opens a dedicated DB). */\n constructor(dbPath?: string) {\n this.dbPath = dbPath;\n }\n\n private requireDatabase(): void {\n requireXopcDatabase(this.dbPath ? { path: this.dbPath } : undefined);\n }\n\n async upsert(execution: JobExecution): Promise<void> {\n try {\n this.requireDatabase();\n appendCronRun(execution);\n } catch (err) {\n log.error({ jobId: execution.jobId, err: err as Error }, 'Failed to persist cron run');\n }\n }\n\n async appendCompleted(execution: JobExecution): Promise<void> {\n await this.upsert(execution);\n }\n\n async readJobHistory(jobId: string, limit: number): Promise<JobExecution[]> {\n this.requireDatabase();\n return readCronJobHistory(jobId, limit);\n }\n\n async readAllRuns(limit: number, jobNames: Map<string, string | undefined>): Promise<CronRunHistoryRow[]> {\n this.requireDatabase();\n const rows = readAllCronRuns(limit);\n return rows.map((execution) => ({\n ...execution,\n jobName: jobNames.get(execution.jobId),\n }));\n }\n\n async deleteJobRuns(jobId: string): Promise<void> {\n try {\n this.requireDatabase();\n deleteCronRunsForJob(jobId);\n } catch (err) {\n log.warn({ jobId, err: err as Error }, 'Failed to delete cron runs');\n }\n }\n}\n"],"mappings":";;;;;;aACkD;AAUlD,MAAM,MAAM,aAAa,aAAa;AAEtC,IAAa,kBAAb,MAA6B;CAC3B;;CAGA,YAAY,QAAiB;AAC3B,OAAK,SAAS;;CAGhB,kBAAgC;AAC9B,sBAAoB,KAAK,SAAS,EAAE,MAAM,KAAK,QAAQ,GAAG,KAAA,EAAU;;CAGtE,MAAM,OAAO,WAAwC;AACnD,MAAI;AACF,QAAK,iBAAiB;AACtB,iBAAc,UAAU;WACjB,KAAK;AACZ,OAAI,MAAM;IAAE,OAAO,UAAU;IAAY;IAAc,EAAE,6BAA6B;;;CAI1F,MAAM,gBAAgB,WAAwC;AAC5D,QAAM,KAAK,OAAO,UAAU;;CAG9B,MAAM,eAAe,OAAe,OAAwC;AAC1E,OAAK,iBAAiB;AACtB,SAAO,mBAAmB,OAAO,MAAM;;CAGzC,MAAM,YAAY,OAAe,UAAyE;AACxG,OAAK,iBAAiB;AAEtB,SADa,gBAAgB,MAClB,CAAC,KAAK,eAAe;GAC9B,GAAG;GACH,SAAS,SAAS,IAAI,UAAU,MAAM;GACvC,EAAE;;CAGL,MAAM,cAAc,OAA8B;AAChD,MAAI;AACF,QAAK,iBAAiB;AACtB,wBAAqB,MAAM;WACpB,KAAK;AACZ,OAAI,KAAK;IAAE;IAAY;IAAc,EAAE,6BAA6B"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { CronSchedule, JobData } from './types.js';
|
|
2
|
-
export declare const DEFAULT_TOP_OF_HOUR_STAGGER_MS: number;
|
|
3
|
-
export declare function normalizeCronStaggerMs(value: unknown): number | undefined;
|
|
4
|
-
export declare function isRecurringTopOfHourCronExpr(expr: string): boolean;
|
|
5
|
-
export declare function resolveDefaultCronStaggerMs(expr: string): number | undefined;
|
|
6
|
-
export declare function resolveCronStaggerMs(schedule: CronSchedule): number;
|
|
7
|
-
export declare function computeNextRunAtMs(job: Pick<JobData, 'id' | 'enabled' | 'schedule'>, nowMs?: number): number | undefined;
|
|
8
|
-
export declare function computePreviousRunAtMs(job: Pick<JobData, 'id' | 'schedule'>, nowMs?: number): number | undefined;
|
|
9
|
-
export declare function describeSchedule(schedule: CronSchedule): string;
|
|
10
|
-
export declare function timerDelayUntil(targetMs: number, nowMs?: number): number;
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import crypto from "node:crypto";
|
|
2
|
-
import { CronExpressionParser } from "cron-parser";
|
|
3
|
-
//#region src/cron/schedule.ts
|
|
4
|
-
const MAX_TIMER_DELAY_MS = 2147483647;
|
|
5
|
-
const DEFAULT_TOP_OF_HOUR_STAGGER_MS = 5 * 6e4;
|
|
6
|
-
function normalizeCronStaggerMs(value) {
|
|
7
|
-
if (typeof value !== "number" || !Number.isFinite(value) || value < 0) return;
|
|
8
|
-
return Math.floor(value);
|
|
9
|
-
}
|
|
10
|
-
function isRecurringTopOfHourCronExpr(expr) {
|
|
11
|
-
const parts = expr.trim().split(/\s+/);
|
|
12
|
-
if (parts.length !== 5) return false;
|
|
13
|
-
return parts[0] === "0" && parts[1] !== "*" && parts[2] === "*" && parts[3] === "*" && parts[4] === "*";
|
|
14
|
-
}
|
|
15
|
-
function resolveDefaultCronStaggerMs(expr) {
|
|
16
|
-
return isRecurringTopOfHourCronExpr(expr) ? DEFAULT_TOP_OF_HOUR_STAGGER_MS : void 0;
|
|
17
|
-
}
|
|
18
|
-
function resolveCronStaggerMs(schedule) {
|
|
19
|
-
if (schedule.kind !== "cron") return 0;
|
|
20
|
-
const explicit = normalizeCronStaggerMs(schedule.staggerMs);
|
|
21
|
-
if (explicit !== void 0) return explicit;
|
|
22
|
-
return resolveDefaultCronStaggerMs(schedule.expr) ?? 0;
|
|
23
|
-
}
|
|
24
|
-
function stableOffsetMs(jobId, windowMs) {
|
|
25
|
-
if (windowMs <= 1) return 0;
|
|
26
|
-
return crypto.createHash("sha256").update(jobId).digest().readUInt32BE(0) % windowMs;
|
|
27
|
-
}
|
|
28
|
-
function parseAtMs(at) {
|
|
29
|
-
const ms = Date.parse(at);
|
|
30
|
-
if (!Number.isFinite(ms)) throw new Error(`Invalid at schedule timestamp: ${at}`);
|
|
31
|
-
return ms;
|
|
32
|
-
}
|
|
33
|
-
function parseCron(schedule, currentDate) {
|
|
34
|
-
return CronExpressionParser.parse(schedule.expr, {
|
|
35
|
-
currentDate,
|
|
36
|
-
...schedule.tz ? { tz: schedule.tz } : {}
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
function computeNextRunAtMs(job, nowMs = Date.now()) {
|
|
40
|
-
if (!job.enabled) return void 0;
|
|
41
|
-
const schedule = job.schedule;
|
|
42
|
-
if (schedule.kind === "at") {
|
|
43
|
-
const atMs = parseAtMs(schedule.at);
|
|
44
|
-
return atMs >= nowMs ? atMs : void 0;
|
|
45
|
-
}
|
|
46
|
-
if (schedule.kind === "every") {
|
|
47
|
-
const everyMs = Math.max(1, Math.floor(schedule.everyMs));
|
|
48
|
-
const anchorMs = Math.max(0, Math.floor(schedule.anchorMs ?? nowMs));
|
|
49
|
-
if (anchorMs >= nowMs) return anchorMs;
|
|
50
|
-
const elapsed = nowMs - anchorMs;
|
|
51
|
-
return anchorMs + (Math.floor(elapsed / everyMs) + 1) * everyMs;
|
|
52
|
-
}
|
|
53
|
-
const staggerMs = resolveCronStaggerMs(schedule);
|
|
54
|
-
const offsetMs = stableOffsetMs(job.id, staggerMs);
|
|
55
|
-
return parseCron(schedule, new Date(Math.max(0, nowMs - offsetMs))).next().getTime() + offsetMs;
|
|
56
|
-
}
|
|
57
|
-
function computePreviousRunAtMs(job, nowMs = Date.now()) {
|
|
58
|
-
const schedule = job.schedule;
|
|
59
|
-
if (schedule.kind === "at") {
|
|
60
|
-
const atMs = parseAtMs(schedule.at);
|
|
61
|
-
return atMs <= nowMs ? atMs : void 0;
|
|
62
|
-
}
|
|
63
|
-
if (schedule.kind === "every") {
|
|
64
|
-
const everyMs = Math.max(1, Math.floor(schedule.everyMs));
|
|
65
|
-
const anchorMs = Math.max(0, Math.floor(schedule.anchorMs ?? nowMs));
|
|
66
|
-
if (anchorMs > nowMs) return void 0;
|
|
67
|
-
const elapsed = nowMs - anchorMs;
|
|
68
|
-
return anchorMs + Math.floor(elapsed / everyMs) * everyMs;
|
|
69
|
-
}
|
|
70
|
-
const staggerMs = resolveCronStaggerMs(schedule);
|
|
71
|
-
const offsetMs = stableOffsetMs(job.id, staggerMs);
|
|
72
|
-
return parseCron(schedule, new Date(Math.max(0, nowMs - offsetMs))).prev().getTime() + offsetMs;
|
|
73
|
-
}
|
|
74
|
-
function describeSchedule(schedule) {
|
|
75
|
-
if (schedule.kind === "at") return `at ${schedule.at}`;
|
|
76
|
-
if (schedule.kind === "every") return `every ${schedule.everyMs}ms`;
|
|
77
|
-
return `cron ${schedule.expr}${schedule.tz ? ` (${schedule.tz})` : ""}`;
|
|
78
|
-
}
|
|
79
|
-
function timerDelayUntil(targetMs, nowMs = Date.now()) {
|
|
80
|
-
return Math.max(0, Math.min(MAX_TIMER_DELAY_MS, targetMs - nowMs));
|
|
81
|
-
}
|
|
82
|
-
//#endregion
|
|
83
|
-
export { DEFAULT_TOP_OF_HOUR_STAGGER_MS, computeNextRunAtMs, computePreviousRunAtMs, describeSchedule, isRecurringTopOfHourCronExpr, normalizeCronStaggerMs, resolveCronStaggerMs, resolveDefaultCronStaggerMs, timerDelayUntil };
|
|
84
|
-
|
|
85
|
-
//# sourceMappingURL=schedule.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schedule.js","names":[],"sources":["../../../src/cron/schedule.ts"],"sourcesContent":["import crypto from 'node:crypto';\n\nimport { CronExpressionParser } from 'cron-parser';\n\nimport type { CronSchedule, JobData } from './types.js';\n\nconst MAX_TIMER_DELAY_MS = 2_147_483_647;\nexport const DEFAULT_TOP_OF_HOUR_STAGGER_MS = 5 * 60_000;\n\nexport function normalizeCronStaggerMs(value: unknown): number | undefined {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {\n return undefined;\n }\n return Math.floor(value);\n}\n\nexport function isRecurringTopOfHourCronExpr(expr: string): boolean {\n const parts = expr.trim().split(/\\s+/);\n if (parts.length !== 5) return false;\n return parts[0] === '0' && parts[1] !== '*' && parts[2] === '*' && parts[3] === '*' && parts[4] === '*';\n}\n\nexport function resolveDefaultCronStaggerMs(expr: string): number | undefined {\n return isRecurringTopOfHourCronExpr(expr) ? DEFAULT_TOP_OF_HOUR_STAGGER_MS : undefined;\n}\n\nexport function resolveCronStaggerMs(schedule: CronSchedule): number {\n if (schedule.kind !== 'cron') return 0;\n const explicit = normalizeCronStaggerMs(schedule.staggerMs);\n if (explicit !== undefined) return explicit;\n return resolveDefaultCronStaggerMs(schedule.expr) ?? 0;\n}\n\nfunction stableOffsetMs(jobId: string, windowMs: number): number {\n if (windowMs <= 1) return 0;\n const digest = crypto.createHash('sha256').update(jobId).digest();\n return digest.readUInt32BE(0) % windowMs;\n}\n\nfunction parseAtMs(at: string): number {\n const ms = Date.parse(at);\n if (!Number.isFinite(ms)) {\n throw new Error(`Invalid at schedule timestamp: ${at}`);\n }\n return ms;\n}\n\nfunction parseCron(schedule: Extract<CronSchedule, { kind: 'cron' }>, currentDate: Date) {\n return CronExpressionParser.parse(schedule.expr, {\n currentDate,\n ...(schedule.tz ? { tz: schedule.tz } : {}),\n });\n}\n\nexport function computeNextRunAtMs(job: Pick<JobData, 'id' | 'enabled' | 'schedule'>, nowMs = Date.now()): number | undefined {\n if (!job.enabled) return undefined;\n const schedule = job.schedule;\n if (schedule.kind === 'at') {\n const atMs = parseAtMs(schedule.at);\n return atMs >= nowMs ? atMs : undefined;\n }\n if (schedule.kind === 'every') {\n const everyMs = Math.max(1, Math.floor(schedule.everyMs));\n const anchorMs = Math.max(0, Math.floor(schedule.anchorMs ?? nowMs));\n if (anchorMs >= nowMs) return anchorMs;\n const elapsed = nowMs - anchorMs;\n return anchorMs + (Math.floor(elapsed / everyMs) + 1) * everyMs;\n }\n\n const staggerMs = resolveCronStaggerMs(schedule);\n const offsetMs = stableOffsetMs(job.id, staggerMs);\n const interval = parseCron(schedule, new Date(Math.max(0, nowMs - offsetMs)));\n return interval.next().getTime() + offsetMs;\n}\n\nexport function computePreviousRunAtMs(job: Pick<JobData, 'id' | 'schedule'>, nowMs = Date.now()): number | undefined {\n const schedule = job.schedule;\n if (schedule.kind === 'at') {\n const atMs = parseAtMs(schedule.at);\n return atMs <= nowMs ? atMs : undefined;\n }\n if (schedule.kind === 'every') {\n const everyMs = Math.max(1, Math.floor(schedule.everyMs));\n const anchorMs = Math.max(0, Math.floor(schedule.anchorMs ?? nowMs));\n if (anchorMs > nowMs) return undefined;\n const elapsed = nowMs - anchorMs;\n return anchorMs + Math.floor(elapsed / everyMs) * everyMs;\n }\n\n const staggerMs = resolveCronStaggerMs(schedule);\n const offsetMs = stableOffsetMs(job.id, staggerMs);\n const interval = parseCron(schedule, new Date(Math.max(0, nowMs - offsetMs)));\n return interval.prev().getTime() + offsetMs;\n}\n\nexport function describeSchedule(schedule: CronSchedule): string {\n if (schedule.kind === 'at') return `at ${schedule.at}`;\n if (schedule.kind === 'every') return `every ${schedule.everyMs}ms`;\n return `cron ${schedule.expr}${schedule.tz ? ` (${schedule.tz})` : ''}`;\n}\n\nexport function timerDelayUntil(targetMs: number, nowMs = Date.now()): number {\n return Math.max(0, Math.min(MAX_TIMER_DELAY_MS, targetMs - nowMs));\n}\n"],"mappings":"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"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import type { Config } from '../config/schema.js';
|
|
2
|
-
import type { AddJobOptions, CronHealth, CronJobPatch, CronMetrics, CronRunHistoryRow, JobData, JobExecution, JobExecutorDeps } from './types.js';
|
|
3
|
-
export interface CronServiceConfig {
|
|
4
|
-
dbPath?: string;
|
|
5
|
-
agentService?: unknown;
|
|
6
|
-
messageBus?: unknown;
|
|
7
|
-
maxConcurrentJobs?: number;
|
|
8
|
-
missedJobStaggerMs?: number;
|
|
9
|
-
}
|
|
10
|
-
export declare class CronJobAlreadyRunningError extends Error {
|
|
11
|
-
readonly jobId: string;
|
|
12
|
-
readonly runningSessionKey?: string;
|
|
13
|
-
constructor(jobId: string, runningSessionKey?: string);
|
|
14
|
-
}
|
|
15
|
-
export interface CronJobRunNowResult {
|
|
16
|
-
job: JobData;
|
|
17
|
-
history: JobExecution[];
|
|
18
|
-
}
|
|
19
|
-
export declare class CronService {
|
|
20
|
-
private executor;
|
|
21
|
-
private runLogStore;
|
|
22
|
-
private initialized;
|
|
23
|
-
private stopped;
|
|
24
|
-
private running;
|
|
25
|
-
private timer;
|
|
26
|
-
private deps;
|
|
27
|
-
private maxConcurrentJobs;
|
|
28
|
-
private missedJobStaggerMs;
|
|
29
|
-
constructor(config?: CronServiceConfig);
|
|
30
|
-
setDeps(deps: JobExecutorDeps): void;
|
|
31
|
-
initialize(): Promise<void>;
|
|
32
|
-
addJob(scheduleOrInput: AddJobOptions['schedule'], options?: Omit<AddJobOptions, 'schedule'>): Promise<{
|
|
33
|
-
id: string;
|
|
34
|
-
schedule: AddJobOptions['schedule'];
|
|
35
|
-
}>;
|
|
36
|
-
listJobs(): Promise<JobData[]>;
|
|
37
|
-
getJob(id: string): Promise<JobData | null>;
|
|
38
|
-
updateJob(id: string, updates: CronJobPatch): Promise<boolean>;
|
|
39
|
-
removeJob(id: string): Promise<boolean>;
|
|
40
|
-
toggleJob(id: string, enabled: boolean): Promise<boolean>;
|
|
41
|
-
getJobHistory(jobId: string, limit?: number): Promise<JobExecution[]>;
|
|
42
|
-
getAllRunsHistory(limit?: number): Promise<CronRunHistoryRow[]>;
|
|
43
|
-
getMetrics(): Promise<CronMetrics>;
|
|
44
|
-
updateConfig(config: Config): void;
|
|
45
|
-
healthCheck(): Promise<CronHealth>;
|
|
46
|
-
runJobNow(id: string): Promise<CronJobRunNowResult>;
|
|
47
|
-
stop(options?: {
|
|
48
|
-
waitForRunning?: boolean;
|
|
49
|
-
timeout?: number;
|
|
50
|
-
}): Promise<void>;
|
|
51
|
-
private recomputeAllNextRuns;
|
|
52
|
-
private armTimer;
|
|
53
|
-
private onTimer;
|
|
54
|
-
private startSingleJob;
|
|
55
|
-
private runSingleJob;
|
|
56
|
-
private runReservedJob;
|
|
57
|
-
private maybeEmitFailureAlert;
|
|
58
|
-
}
|