@fidelios/server 0.0.1
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/dist/adapters/codex-models.d.ts +4 -0
- package/dist/adapters/codex-models.d.ts.map +1 -0
- package/dist/adapters/codex-models.js +98 -0
- package/dist/adapters/codex-models.js.map +1 -0
- package/dist/adapters/cursor-models.d.ts +13 -0
- package/dist/adapters/cursor-models.d.ts.map +1 -0
- package/dist/adapters/cursor-models.js +148 -0
- package/dist/adapters/cursor-models.js.map +1 -0
- package/dist/adapters/http/execute.d.ts +3 -0
- package/dist/adapters/http/execute.d.ts.map +1 -0
- package/dist/adapters/http/execute.js +39 -0
- package/dist/adapters/http/execute.js.map +1 -0
- package/dist/adapters/http/index.d.ts +3 -0
- package/dist/adapters/http/index.d.ts.map +1 -0
- package/dist/adapters/http/index.js +20 -0
- package/dist/adapters/http/index.js.map +1 -0
- package/dist/adapters/http/test.d.ts +3 -0
- package/dist/adapters/http/test.d.ts.map +1 -0
- package/dist/adapters/http/test.js +106 -0
- package/dist/adapters/http/test.js.map +1 -0
- package/dist/adapters/index.d.ts +4 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +3 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/process/execute.d.ts +3 -0
- package/dist/adapters/process/execute.d.ts.map +1 -0
- package/dist/adapters/process/execute.js +63 -0
- package/dist/adapters/process/execute.js.map +1 -0
- package/dist/adapters/process/index.d.ts +3 -0
- package/dist/adapters/process/index.d.ts.map +1 -0
- package/dist/adapters/process/index.js +23 -0
- package/dist/adapters/process/index.js.map +1 -0
- package/dist/adapters/process/test.d.ts +3 -0
- package/dist/adapters/process/test.d.ts.map +1 -0
- package/dist/adapters/process/test.js +77 -0
- package/dist/adapters/process/test.js.map +1 -0
- package/dist/adapters/registry.d.ts +14 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +164 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/types.d.ts +2 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/adapters/utils.d.ts +10 -0
- package/dist/adapters/utils.d.ts.map +1 -0
- package/dist/adapters/utils.js +14 -0
- package/dist/adapters/utils.js.map +1 -0
- package/dist/agent-auth-jwt.d.ts +14 -0
- package/dist/agent-auth-jwt.d.ts.map +1 -0
- package/dist/agent-auth-jwt.js +117 -0
- package/dist/agent-auth-jwt.js.map +1 -0
- package/dist/app.d.ts +25 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +265 -0
- package/dist/app.js.map +1 -0
- package/dist/attachment-types.d.ts +33 -0
- package/dist/attachment-types.d.ts.map +1 -0
- package/dist/attachment-types.js +67 -0
- package/dist/attachment-types.js.map +1 -0
- package/dist/auth/better-auth.d.ts +24 -0
- package/dist/auth/better-auth.d.ts.map +1 -0
- package/dist/auth/better-auth.js +108 -0
- package/dist/auth/better-auth.js.map +1 -0
- package/dist/board-claim.d.ts +23 -0
- package/dist/board-claim.d.ts.map +1 -0
- package/dist/board-claim.js +115 -0
- package/dist/board-claim.js.map +1 -0
- package/dist/config-file.d.ts +3 -0
- package/dist/config-file.d.ts.map +1 -0
- package/dist/config-file.js +16 -0
- package/dist/config-file.js.map +1 -0
- package/dist/config.d.ts +45 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +171 -0
- package/dist/config.js.map +1 -0
- package/dist/dev-server-status.d.ts +27 -0
- package/dist/dev-server-status.d.ts.map +1 -0
- package/dist/dev-server-status.js +70 -0
- package/dist/dev-server-status.js.map +1 -0
- package/dist/dev-watch-ignore.d.ts +2 -0
- package/dist/dev-watch-ignore.d.ts.map +1 -0
- package/dist/dev-watch-ignore.js +33 -0
- package/dist/dev-watch-ignore.js.map +1 -0
- package/dist/errors.d.ts +12 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +28 -0
- package/dist/errors.js.map +1 -0
- package/dist/home-paths.d.ts +17 -0
- package/dist/home-paths.d.ts.map +1 -0
- package/dist/home-paths.js +75 -0
- package/dist/home-paths.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +642 -0
- package/dist/index.js.map +1 -0
- package/dist/log-redaction.d.ts +11 -0
- package/dist/log-redaction.d.ts.map +1 -0
- package/dist/log-redaction.js +118 -0
- package/dist/log-redaction.js.map +1 -0
- package/dist/middleware/auth.d.ts +12 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +144 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/board-mutation-guard.d.ts +3 -0
- package/dist/middleware/board-mutation-guard.d.ts.map +1 -0
- package/dist/middleware/board-mutation-guard.js +59 -0
- package/dist/middleware/board-mutation-guard.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +17 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +37 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/index.d.ts +4 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +4 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/logger.d.ts +4 -0
- package/dist/middleware/logger.d.ts.map +1 -0
- package/dist/middleware/logger.js +87 -0
- package/dist/middleware/logger.js.map +1 -0
- package/dist/middleware/private-hostname-guard.d.ts +11 -0
- package/dist/middleware/private-hostname-guard.d.ts.map +1 -0
- package/dist/middleware/private-hostname-guard.js +78 -0
- package/dist/middleware/private-hostname-guard.js.map +1 -0
- package/dist/middleware/validate.d.ts +4 -0
- package/dist/middleware/validate.d.ts.map +1 -0
- package/dist/middleware/validate.js +7 -0
- package/dist/middleware/validate.js.map +1 -0
- package/dist/onboarding-assets/ceo/AGENTS.md +54 -0
- package/dist/onboarding-assets/ceo/HEARTBEAT.md +72 -0
- package/dist/onboarding-assets/ceo/SOUL.md +33 -0
- package/dist/onboarding-assets/ceo/TOOLS.md +3 -0
- package/dist/onboarding-assets/default/AGENTS.md +3 -0
- package/dist/paths.d.ts +3 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +31 -0
- package/dist/paths.js.map +1 -0
- package/dist/realtime/live-events-ws.d.ts +28 -0
- package/dist/realtime/live-events-ws.d.ts.map +1 -0
- package/dist/realtime/live-events-ws.js +187 -0
- package/dist/realtime/live-events-ws.js.map +1 -0
- package/dist/redaction.d.ts +4 -0
- package/dist/redaction.d.ts.map +1 -0
- package/dist/redaction.js +63 -0
- package/dist/redaction.js.map +1 -0
- package/dist/routes/access.d.ts +61 -0
- package/dist/routes/access.d.ts.map +1 -0
- package/dist/routes/access.js +2265 -0
- package/dist/routes/access.js.map +1 -0
- package/dist/routes/activity.d.ts +3 -0
- package/dist/routes/activity.d.ts.map +1 -0
- package/dist/routes/activity.js +78 -0
- package/dist/routes/activity.js.map +1 -0
- package/dist/routes/agents.d.ts +3 -0
- package/dist/routes/agents.d.ts.map +1 -0
- package/dist/routes/agents.js +1828 -0
- package/dist/routes/agents.js.map +1 -0
- package/dist/routes/approvals.d.ts +3 -0
- package/dist/routes/approvals.d.ts.map +1 -0
- package/dist/routes/approvals.js +275 -0
- package/dist/routes/approvals.js.map +1 -0
- package/dist/routes/assets.d.ts +4 -0
- package/dist/routes/assets.d.ts.map +1 -0
- package/dist/routes/assets.js +309 -0
- package/dist/routes/assets.js.map +1 -0
- package/dist/routes/authz.d.ts +16 -0
- package/dist/routes/authz.d.ts.map +1 -0
- package/dist/routes/authz.js +47 -0
- package/dist/routes/authz.js.map +1 -0
- package/dist/routes/companies.d.ts +4 -0
- package/dist/routes/companies.d.ts.map +1 -0
- package/dist/routes/companies.js +303 -0
- package/dist/routes/companies.js.map +1 -0
- package/dist/routes/company-skills.d.ts +3 -0
- package/dist/routes/company-skills.d.ts.map +1 -0
- package/dist/routes/company-skills.js +228 -0
- package/dist/routes/company-skills.js.map +1 -0
- package/dist/routes/costs.d.ts +3 -0
- package/dist/routes/costs.d.ts.map +1 -0
- package/dist/routes/costs.js +268 -0
- package/dist/routes/costs.js.map +1 -0
- package/dist/routes/dashboard.d.ts +3 -0
- package/dist/routes/dashboard.d.ts.map +1 -0
- package/dist/routes/dashboard.js +15 -0
- package/dist/routes/dashboard.js.map +1 -0
- package/dist/routes/execution-workspaces.d.ts +3 -0
- package/dist/routes/execution-workspaces.d.ts.map +1 -0
- package/dist/routes/execution-workspaces.js +165 -0
- package/dist/routes/execution-workspaces.js.map +1 -0
- package/dist/routes/goals.d.ts +3 -0
- package/dist/routes/goals.d.ts.map +1 -0
- package/dist/routes/goals.js +95 -0
- package/dist/routes/goals.js.map +1 -0
- package/dist/routes/health.d.ts +9 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +69 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/index.d.ts +18 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +18 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/instance-settings.d.ts +3 -0
- package/dist/routes/instance-settings.d.ts.map +1 -0
- package/dist/routes/instance-settings.js +71 -0
- package/dist/routes/instance-settings.js.map +1 -0
- package/dist/routes/issues-checkout-wakeup.d.ts +9 -0
- package/dist/routes/issues-checkout-wakeup.d.ts.map +1 -0
- package/dist/routes/issues-checkout-wakeup.js +12 -0
- package/dist/routes/issues-checkout-wakeup.js.map +1 -0
- package/dist/routes/issues.d.ts +4 -0
- package/dist/routes/issues.d.ts.map +1 -0
- package/dist/routes/issues.js +1520 -0
- package/dist/routes/issues.js.map +1 -0
- package/dist/routes/llms.d.ts +3 -0
- package/dist/routes/llms.d.ts.map +1 -0
- package/dist/routes/llms.js +78 -0
- package/dist/routes/llms.js.map +1 -0
- package/dist/routes/org-chart-svg.d.ts +25 -0
- package/dist/routes/org-chart-svg.d.ts.map +1 -0
- package/dist/routes/org-chart-svg.js +656 -0
- package/dist/routes/org-chart-svg.js.map +1 -0
- package/dist/routes/plugin-ui-static.d.ts +69 -0
- package/dist/routes/plugin-ui-static.d.ts.map +1 -0
- package/dist/routes/plugin-ui-static.js +411 -0
- package/dist/routes/plugin-ui-static.js.map +1 -0
- package/dist/routes/plugins.d.ts +120 -0
- package/dist/routes/plugins.d.ts.map +1 -0
- package/dist/routes/plugins.js +1784 -0
- package/dist/routes/plugins.js.map +1 -0
- package/dist/routes/projects.d.ts +3 -0
- package/dist/routes/projects.d.ts.map +1 -0
- package/dist/routes/projects.js +257 -0
- package/dist/routes/projects.js.map +1 -0
- package/dist/routes/routines.d.ts +3 -0
- package/dist/routes/routines.d.ts.map +1 -0
- package/dist/routes/routines.js +277 -0
- package/dist/routes/routines.js.map +1 -0
- package/dist/routes/secrets.d.ts +3 -0
- package/dist/routes/secrets.d.ts.map +1 -0
- package/dist/routes/secrets.js +128 -0
- package/dist/routes/secrets.js.map +1 -0
- package/dist/routes/sidebar-badges.d.ts +3 -0
- package/dist/routes/sidebar-badges.d.ts.map +1 -0
- package/dist/routes/sidebar-badges.js +45 -0
- package/dist/routes/sidebar-badges.js.map +1 -0
- package/dist/secrets/external-stub-providers.d.ts +5 -0
- package/dist/secrets/external-stub-providers.d.ts.map +1 -0
- package/dist/secrets/external-stub-providers.js +21 -0
- package/dist/secrets/external-stub-providers.js.map +1 -0
- package/dist/secrets/local-encrypted-provider.d.ts +3 -0
- package/dist/secrets/local-encrypted-provider.d.ts.map +1 -0
- package/dist/secrets/local-encrypted-provider.js +116 -0
- package/dist/secrets/local-encrypted-provider.js.map +1 -0
- package/dist/secrets/provider-registry.d.ts +5 -0
- package/dist/secrets/provider-registry.d.ts.map +1 -0
- package/dist/secrets/provider-registry.js +20 -0
- package/dist/secrets/provider-registry.js.map +1 -0
- package/dist/secrets/types.d.ts +21 -0
- package/dist/secrets/types.d.ts.map +1 -0
- package/dist/secrets/types.js +2 -0
- package/dist/secrets/types.js.map +1 -0
- package/dist/services/access.d.ts +113 -0
- package/dist/services/access.d.ts.map +1 -0
- package/dist/services/access.js +247 -0
- package/dist/services/access.js.map +1 -0
- package/dist/services/activity-log.d.ts +17 -0
- package/dist/services/activity-log.d.ts.map +1 -0
- package/dist/services/activity-log.js +74 -0
- package/dist/services/activity-log.js.map +1 -0
- package/dist/services/activity.d.ts +764 -0
- package/dist/services/activity.d.ts.map +1 -0
- package/dist/services/activity.js +105 -0
- package/dist/services/activity.js.map +1 -0
- package/dist/services/agent-instructions.d.ts +91 -0
- package/dist/services/agent-instructions.d.ts.map +1 -0
- package/dist/services/agent-instructions.js +580 -0
- package/dist/services/agent-instructions.js.map +1 -0
- package/dist/services/agent-permissions.d.ts +6 -0
- package/dist/services/agent-permissions.d.ts.map +1 -0
- package/dist/services/agent-permissions.js +18 -0
- package/dist/services/agent-permissions.js.map +1 -0
- package/dist/services/agents.d.ts +1670 -0
- package/dist/services/agents.d.ts.map +1 -0
- package/dist/services/agents.js +566 -0
- package/dist/services/agents.js.map +1 -0
- package/dist/services/approvals.d.ts +546 -0
- package/dist/services/approvals.d.ts.map +1 -0
- package/dist/services/approvals.js +212 -0
- package/dist/services/approvals.js.map +1 -0
- package/dist/services/assets.d.ts +33 -0
- package/dist/services/assets.d.ts.map +1 -0
- package/dist/services/assets.js +17 -0
- package/dist/services/assets.js.map +1 -0
- package/dist/services/board-auth.d.ts +234 -0
- package/dist/services/board-auth.d.ts.map +1 -0
- package/dist/services/board-auth.js +295 -0
- package/dist/services/board-auth.js.map +1 -0
- package/dist/services/budgets.d.ts +38 -0
- package/dist/services/budgets.d.ts.map +1 -0
- package/dist/services/budgets.js +784 -0
- package/dist/services/budgets.js.map +1 -0
- package/dist/services/companies.d.ts +124 -0
- package/dist/services/companies.d.ts.map +1 -0
- package/dist/services/companies.js +256 -0
- package/dist/services/companies.js.map +1 -0
- package/dist/services/company-export-readme.d.ts +17 -0
- package/dist/services/company-export-readme.d.ts.map +1 -0
- package/dist/services/company-export-readme.js +148 -0
- package/dist/services/company-export-readme.js.map +1 -0
- package/dist/services/company-portability.d.ts +23 -0
- package/dist/services/company-portability.d.ts.map +1 -0
- package/dist/services/company-portability.js +3739 -0
- package/dist/services/company-portability.js.map +1 -0
- package/dist/services/company-skills.d.ts +77 -0
- package/dist/services/company-skills.d.ts.map +1 -0
- package/dist/services/company-skills.js +2042 -0
- package/dist/services/company-skills.js.map +1 -0
- package/dist/services/costs.d.ts +114 -0
- package/dist/services/costs.d.ts.map +1 -0
- package/dist/services/costs.js +294 -0
- package/dist/services/costs.js.map +1 -0
- package/dist/services/cron.d.ts +80 -0
- package/dist/services/cron.d.ts.map +1 -0
- package/dist/services/cron.js +300 -0
- package/dist/services/cron.js.map +1 -0
- package/dist/services/dashboard.d.ts +26 -0
- package/dist/services/dashboard.d.ts.map +1 -0
- package/dist/services/dashboard.js +98 -0
- package/dist/services/dashboard.js.map +1 -0
- package/dist/services/default-agent-instructions.d.ts +9 -0
- package/dist/services/default-agent-instructions.d.ts.map +1 -0
- package/dist/services/default-agent-instructions.js +20 -0
- package/dist/services/default-agent-instructions.js.map +1 -0
- package/dist/services/documents.d.ts +164 -0
- package/dist/services/documents.d.ts.map +1 -0
- package/dist/services/documents.js +382 -0
- package/dist/services/documents.js.map +1 -0
- package/dist/services/execution-workspace-policy.d.ts +21 -0
- package/dist/services/execution-workspace-policy.d.ts.map +1 -0
- package/dist/services/execution-workspace-policy.js +177 -0
- package/dist/services/execution-workspace-policy.js.map +1 -0
- package/dist/services/execution-workspaces.d.ts +19 -0
- package/dist/services/execution-workspaces.d.ts.map +1 -0
- package/dist/services/execution-workspaces.js +87 -0
- package/dist/services/execution-workspaces.js.map +1 -0
- package/dist/services/finance.d.ts +93 -0
- package/dist/services/finance.d.ts.map +1 -0
- package/dist/services/finance.js +120 -0
- package/dist/services/finance.js.map +1 -0
- package/dist/services/goals.d.ts +433 -0
- package/dist/services/goals.d.ts.map +1 -0
- package/dist/services/goals.js +54 -0
- package/dist/services/goals.js.map +1 -0
- package/dist/services/heartbeat-run-summary.d.ts +2 -0
- package/dist/services/heartbeat-run-summary.d.ts.map +1 -0
- package/dist/services/heartbeat-run-summary.js +30 -0
- package/dist/services/heartbeat-run-summary.js.map +1 -0
- package/dist/services/heartbeat.d.ts +812 -0
- package/dist/services/heartbeat.d.ts.map +1 -0
- package/dist/services/heartbeat.js +3156 -0
- package/dist/services/heartbeat.js.map +1 -0
- package/dist/services/hire-hook.d.ts +14 -0
- package/dist/services/hire-hook.d.ts.map +1 -0
- package/dist/services/hire-hook.js +85 -0
- package/dist/services/hire-hook.js.map +1 -0
- package/dist/services/index.d.ts +33 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +33 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/instance-settings.d.ts +11 -0
- package/dist/services/instance-settings.d.ts.map +1 -0
- package/dist/services/instance-settings.js +116 -0
- package/dist/services/instance-settings.js.map +1 -0
- package/dist/services/issue-approvals.d.ts +56 -0
- package/dist/services/issue-approvals.d.ts.map +1 -0
- package/dist/services/issue-approvals.js +153 -0
- package/dist/services/issue-approvals.js.map +1 -0
- package/dist/services/issue-assignment-wakeup.d.ts +29 -0
- package/dist/services/issue-assignment-wakeup.d.ts.map +1 -0
- package/dist/services/issue-assignment-wakeup.js +22 -0
- package/dist/services/issue-assignment-wakeup.js.map +1 -0
- package/dist/services/issue-goal-fallback.d.ts +18 -0
- package/dist/services/issue-goal-fallback.d.ts.map +1 -0
- package/dist/services/issue-goal-fallback.js +33 -0
- package/dist/services/issue-goal-fallback.js.map +1 -0
- package/dist/services/issues.d.ts +560 -0
- package/dist/services/issues.d.ts.map +1 -0
- package/dist/services/issues.js +1478 -0
- package/dist/services/issues.js.map +1 -0
- package/dist/services/live-events.d.ts +17 -0
- package/dist/services/live-events.d.ts.map +1 -0
- package/dist/services/live-events.js +33 -0
- package/dist/services/live-events.js.map +1 -0
- package/dist/services/plugin-capability-validator.d.ts +108 -0
- package/dist/services/plugin-capability-validator.d.ts.map +1 -0
- package/dist/services/plugin-capability-validator.js +268 -0
- package/dist/services/plugin-capability-validator.js.map +1 -0
- package/dist/services/plugin-config-validator.d.ts +26 -0
- package/dist/services/plugin-config-validator.d.ts.map +1 -0
- package/dist/services/plugin-config-validator.js +41 -0
- package/dist/services/plugin-config-validator.js.map +1 -0
- package/dist/services/plugin-dev-watcher.d.ts +30 -0
- package/dist/services/plugin-dev-watcher.d.ts.map +1 -0
- package/dist/services/plugin-dev-watcher.js +241 -0
- package/dist/services/plugin-dev-watcher.js.map +1 -0
- package/dist/services/plugin-event-bus.d.ts +149 -0
- package/dist/services/plugin-event-bus.d.ts.map +1 -0
- package/dist/services/plugin-event-bus.js +258 -0
- package/dist/services/plugin-event-bus.js.map +1 -0
- package/dist/services/plugin-host-service-cleanup.d.ts +14 -0
- package/dist/services/plugin-host-service-cleanup.d.ts.map +1 -0
- package/dist/services/plugin-host-service-cleanup.js +37 -0
- package/dist/services/plugin-host-service-cleanup.js.map +1 -0
- package/dist/services/plugin-host-services.d.ts +13 -0
- package/dist/services/plugin-host-services.d.ts.map +1 -0
- package/dist/services/plugin-host-services.js +969 -0
- package/dist/services/plugin-host-services.js.map +1 -0
- package/dist/services/plugin-job-coordinator.d.ts +81 -0
- package/dist/services/plugin-job-coordinator.d.ts.map +1 -0
- package/dist/services/plugin-job-coordinator.js +172 -0
- package/dist/services/plugin-job-coordinator.js.map +1 -0
- package/dist/services/plugin-job-scheduler.d.ts +163 -0
- package/dist/services/plugin-job-scheduler.d.ts.map +1 -0
- package/dist/services/plugin-job-scheduler.js +454 -0
- package/dist/services/plugin-job-scheduler.js.map +1 -0
- package/dist/services/plugin-job-store.d.ts +208 -0
- package/dist/services/plugin-job-store.d.ts.map +1 -0
- package/dist/services/plugin-job-store.js +350 -0
- package/dist/services/plugin-job-store.js.map +1 -0
- package/dist/services/plugin-lifecycle.d.ts +203 -0
- package/dist/services/plugin-lifecycle.d.ts.map +1 -0
- package/dist/services/plugin-lifecycle.js +476 -0
- package/dist/services/plugin-lifecycle.js.map +1 -0
- package/dist/services/plugin-loader.d.ts +441 -0
- package/dist/services/plugin-loader.d.ts.map +1 -0
- package/dist/services/plugin-loader.js +1192 -0
- package/dist/services/plugin-loader.js.map +1 -0
- package/dist/services/plugin-log-retention.d.ts +20 -0
- package/dist/services/plugin-log-retention.d.ts.map +1 -0
- package/dist/services/plugin-log-retention.js +63 -0
- package/dist/services/plugin-log-retention.js.map +1 -0
- package/dist/services/plugin-manifest-validator.d.ts +79 -0
- package/dist/services/plugin-manifest-validator.d.ts.map +1 -0
- package/dist/services/plugin-manifest-validator.js +84 -0
- package/dist/services/plugin-manifest-validator.js.map +1 -0
- package/dist/services/plugin-registry.d.ts +2542 -0
- package/dist/services/plugin-registry.d.ts.map +1 -0
- package/dist/services/plugin-registry.js +539 -0
- package/dist/services/plugin-registry.js.map +1 -0
- package/dist/services/plugin-runtime-sandbox.d.ts +40 -0
- package/dist/services/plugin-runtime-sandbox.d.ts.map +1 -0
- package/dist/services/plugin-runtime-sandbox.js +154 -0
- package/dist/services/plugin-runtime-sandbox.js.map +1 -0
- package/dist/services/plugin-secrets-handler.d.ts +81 -0
- package/dist/services/plugin-secrets-handler.d.ts.map +1 -0
- package/dist/services/plugin-secrets-handler.js +275 -0
- package/dist/services/plugin-secrets-handler.js.map +1 -0
- package/dist/services/plugin-state-store.d.ts +92 -0
- package/dist/services/plugin-state-store.d.ts.map +1 -0
- package/dist/services/plugin-state-store.js +190 -0
- package/dist/services/plugin-state-store.js.map +1 -0
- package/dist/services/plugin-stream-bus.d.ts +29 -0
- package/dist/services/plugin-stream-bus.d.ts.map +1 -0
- package/dist/services/plugin-stream-bus.js +48 -0
- package/dist/services/plugin-stream-bus.js.map +1 -0
- package/dist/services/plugin-tool-dispatcher.d.ts +180 -0
- package/dist/services/plugin-tool-dispatcher.d.ts.map +1 -0
- package/dist/services/plugin-tool-dispatcher.js +224 -0
- package/dist/services/plugin-tool-dispatcher.js.map +1 -0
- package/dist/services/plugin-tool-registry.d.ts +192 -0
- package/dist/services/plugin-tool-registry.d.ts.map +1 -0
- package/dist/services/plugin-tool-registry.js +224 -0
- package/dist/services/plugin-tool-registry.js.map +1 -0
- package/dist/services/plugin-worker-manager.d.ts +260 -0
- package/dist/services/plugin-worker-manager.d.ts.map +1 -0
- package/dist/services/plugin-worker-manager.js +835 -0
- package/dist/services/plugin-worker-manager.js.map +1 -0
- package/dist/services/projects.d.ts +87 -0
- package/dist/services/projects.d.ts.map +1 -0
- package/dist/services/projects.js +656 -0
- package/dist/services/projects.js.map +1 -0
- package/dist/services/quota-windows.d.ts +9 -0
- package/dist/services/quota-windows.d.ts.map +1 -0
- package/dist/services/quota-windows.js +56 -0
- package/dist/services/quota-windows.js.map +1 -0
- package/dist/services/routines.d.ts +135 -0
- package/dist/services/routines.d.ts.map +1 -0
- package/dist/services/routines.js +1105 -0
- package/dist/services/routines.js.map +1 -0
- package/dist/services/run-log-store.d.ts +34 -0
- package/dist/services/run-log-store.d.ts.map +1 -0
- package/dist/services/run-log-store.js +109 -0
- package/dist/services/run-log-store.js.map +1 -0
- package/dist/services/secrets.d.ts +511 -0
- package/dist/services/secrets.d.ts.map +1 -0
- package/dist/services/secrets.js +289 -0
- package/dist/services/secrets.js.map +1 -0
- package/dist/services/sidebar-badges.d.ts +9 -0
- package/dist/services/sidebar-badges.d.ts.map +1 -0
- package/dist/services/sidebar-badges.js +33 -0
- package/dist/services/sidebar-badges.js.map +1 -0
- package/dist/services/work-products.d.ts +14 -0
- package/dist/services/work-products.d.ts.map +1 -0
- package/dist/services/work-products.js +100 -0
- package/dist/services/work-products.js.map +1 -0
- package/dist/services/workspace-operation-log-store.d.ts +33 -0
- package/dist/services/workspace-operation-log-store.d.ts.map +1 -0
- package/dist/services/workspace-operation-log-store.js +110 -0
- package/dist/services/workspace-operation-log-store.js.map +1 -0
- package/dist/services/workspace-operations.d.ts +44 -0
- package/dist/services/workspace-operations.d.ts.map +1 -0
- package/dist/services/workspace-operations.js +211 -0
- package/dist/services/workspace-operations.js.map +1 -0
- package/dist/services/workspace-runtime.d.ts +164 -0
- package/dist/services/workspace-runtime.d.ts.map +1 -0
- package/dist/services/workspace-runtime.js +1235 -0
- package/dist/services/workspace-runtime.js.map +1 -0
- package/dist/startup-banner.d.ts +31 -0
- package/dist/startup-banner.d.ts.map +1 -0
- package/dist/startup-banner.js +117 -0
- package/dist/startup-banner.js.map +1 -0
- package/dist/storage/index.d.ts +6 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +29 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/local-disk-provider.d.ts +3 -0
- package/dist/storage/local-disk-provider.d.ts.map +1 -0
- package/dist/storage/local-disk-provider.js +79 -0
- package/dist/storage/local-disk-provider.js.map +1 -0
- package/dist/storage/provider-registry.d.ts +4 -0
- package/dist/storage/provider-registry.d.ts.map +1 -0
- package/dist/storage/provider-registry.js +15 -0
- package/dist/storage/provider-registry.js.map +1 -0
- package/dist/storage/s3-provider.d.ts +11 -0
- package/dist/storage/s3-provider.d.ts.map +1 -0
- package/dist/storage/s3-provider.js +123 -0
- package/dist/storage/s3-provider.js.map +1 -0
- package/dist/storage/service.d.ts +3 -0
- package/dist/storage/service.d.ts.map +1 -0
- package/dist/storage/service.js +120 -0
- package/dist/storage/service.js.map +1 -0
- package/dist/storage/types.d.ts +55 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/ui-branding.d.ts +13 -0
- package/dist/ui-branding.d.ts.map +1 -0
- package/dist/ui-branding.js +187 -0
- package/dist/ui-branding.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/dist/worktree-config.d.ts +19 -0
- package/dist/worktree-config.d.ts.map +1 -0
- package/dist/worktree-config.js +365 -0
- package/dist/worktree-config.js.map +1 -0
- package/package.json +95 -0
- package/ui-dist/android-chrome-192x192.png +0 -0
- package/ui-dist/android-chrome-512x512.png +0 -0
- package/ui-dist/apple-touch-icon.png +0 -0
- package/ui-dist/assets/_basePickBy-BB1S19s0.js +1 -0
- package/ui-dist/assets/_baseUniq-BNk0p-bq.js +1 -0
- package/ui-dist/assets/apl-B4CMkyY2.js +1 -0
- package/ui-dist/assets/arc-Ds13x1NW.js +1 -0
- package/ui-dist/assets/architectureDiagram-VXUJARFQ-D8Br-_jt.js +36 -0
- package/ui-dist/assets/asciiarmor-Df11BRmG.js +1 -0
- package/ui-dist/assets/asn1-EdZsLKOL.js +1 -0
- package/ui-dist/assets/asterisk-B-8jnY81.js +1 -0
- package/ui-dist/assets/blockDiagram-VD42YOAC-CCYsAhQ5.js +122 -0
- package/ui-dist/assets/brainfuck-C4LP7Hcl.js +1 -0
- package/ui-dist/assets/c4Diagram-YG6GDRKO-CsrnTJYB.js +10 -0
- package/ui-dist/assets/channel-Df4ReTUQ.js +1 -0
- package/ui-dist/assets/chunk-4BX2VUAB-s-S3bm2a.js +1 -0
- package/ui-dist/assets/chunk-55IACEB6-AlPeSG3C.js +1 -0
- package/ui-dist/assets/chunk-B4BG7PRW-Dlv3zmp0.js +165 -0
- package/ui-dist/assets/chunk-DI55MBZ5-y3Hfc2F6.js +220 -0
- package/ui-dist/assets/chunk-FMBD7UC4-ZbmFZ8uD.js +15 -0
- package/ui-dist/assets/chunk-QN33PNHL-g7XrAaL5.js +1 -0
- package/ui-dist/assets/chunk-QZHKN3VN-DQz2X_ZR.js +1 -0
- package/ui-dist/assets/chunk-TZMSLE5B-NRbDhryd.js +1 -0
- package/ui-dist/assets/classDiagram-2ON5EDUG-CdLb01dH.js +1 -0
- package/ui-dist/assets/classDiagram-v2-WZHVMYZB-CdLb01dH.js +1 -0
- package/ui-dist/assets/clike-B9uivgTg.js +1 -0
- package/ui-dist/assets/clojure-BMjYHr_A.js +1 -0
- package/ui-dist/assets/clone-ycTwxHSX.js +1 -0
- package/ui-dist/assets/cmake-BQqOBYOt.js +1 -0
- package/ui-dist/assets/cobol-CWcv1MsR.js +1 -0
- package/ui-dist/assets/coffeescript-S37ZYGWr.js +1 -0
- package/ui-dist/assets/commonlisp-DBKNyK5s.js +1 -0
- package/ui-dist/assets/cose-bilkent-S5V4N54A-CifA3UGC.js +1 -0
- package/ui-dist/assets/crystal-SjHAIU92.js +1 -0
- package/ui-dist/assets/css-BnMrqG3P.js +1 -0
- package/ui-dist/assets/cypher-C_CwsFkJ.js +1 -0
- package/ui-dist/assets/cytoscape.esm-BQaXIfA_.js +331 -0
- package/ui-dist/assets/d-pRatUO7H.js +1 -0
- package/ui-dist/assets/dagre-6UL2VRFP-Cy4_402x.js +4 -0
- package/ui-dist/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/ui-dist/assets/diagram-PSM6KHXK-CUA-Vqxe.js +24 -0
- package/ui-dist/assets/diagram-QEK2KX5R-D763Ackt.js +43 -0
- package/ui-dist/assets/diagram-S2PKOQOG-Cu1xEKHt.js +24 -0
- package/ui-dist/assets/diff-DbItnlRl.js +1 -0
- package/ui-dist/assets/dockerfile-BKs6k2Af.js +1 -0
- package/ui-dist/assets/dtd-DF_7sFjM.js +1 -0
- package/ui-dist/assets/dylan-DwRh75JA.js +1 -0
- package/ui-dist/assets/ebnf-CDyGwa7X.js +1 -0
- package/ui-dist/assets/ecl-Cabwm37j.js +1 -0
- package/ui-dist/assets/eiffel-CnydiIhH.js +1 -0
- package/ui-dist/assets/elm-vLlmbW-K.js +1 -0
- package/ui-dist/assets/erDiagram-Q2GNP2WA-9RlN9oCi.js +60 -0
- package/ui-dist/assets/erlang-BNw1qcRV.js +1 -0
- package/ui-dist/assets/factor-kuTfRLto.js +1 -0
- package/ui-dist/assets/fcl-Kvtd6kyn.js +1 -0
- package/ui-dist/assets/flowDiagram-NV44I4VS-Ddv1tq-H.js +162 -0
- package/ui-dist/assets/forth-Ffai-XNe.js +1 -0
- package/ui-dist/assets/fortran-DYz_wnZ1.js +1 -0
- package/ui-dist/assets/ganttDiagram-JELNMOA3-DAw7UfVT.js +267 -0
- package/ui-dist/assets/gas-Bneqetm1.js +1 -0
- package/ui-dist/assets/gherkin-heZmZLOM.js +1 -0
- package/ui-dist/assets/gitGraphDiagram-V2S2FVAM-CLPkzwpF.js +65 -0
- package/ui-dist/assets/graph-B1ThnnK5.js +1 -0
- package/ui-dist/assets/groovy-D9Dt4D0W.js +1 -0
- package/ui-dist/assets/haskell-Cw1EW3IL.js +1 -0
- package/ui-dist/assets/haxe-H-WmDvRZ.js +1 -0
- package/ui-dist/assets/http-DBlCnlav.js +1 -0
- package/ui-dist/assets/idl-BEugSyMb.js +1 -0
- package/ui-dist/assets/index-0DYmQxT3.js +2 -0
- package/ui-dist/assets/index-1BRIjwwa.js +1 -0
- package/ui-dist/assets/index-4pxn9bje.js +1 -0
- package/ui-dist/assets/index-B02pjBpR.js +7 -0
- package/ui-dist/assets/index-BGjMkZzC.js +1 -0
- package/ui-dist/assets/index-BHsjaYJ1.js +1 -0
- package/ui-dist/assets/index-BTwpjL-6.js +1 -0
- package/ui-dist/assets/index-BZ72uG4K.js +6 -0
- package/ui-dist/assets/index-BpC8VHcj.js +3 -0
- package/ui-dist/assets/index-BrvXvCkd.js +1 -0
- package/ui-dist/assets/index-CEBcI-2f.js +1 -0
- package/ui-dist/assets/index-CkmjCahV.js +1 -0
- package/ui-dist/assets/index-Cp84QmJD.css +1 -0
- package/ui-dist/assets/index-CpVjtxma.js +1 -0
- package/ui-dist/assets/index-D3AJPUjv.js +1 -0
- package/ui-dist/assets/index-DRkeP4vs.js +13 -0
- package/ui-dist/assets/index-DXeNhnre.js +1180 -0
- package/ui-dist/assets/index-DXvXmooU.js +1 -0
- package/ui-dist/assets/index-DZdwValG.js +1 -0
- package/ui-dist/assets/index-DbWj5-qO.js +1 -0
- package/ui-dist/assets/index-DbcKBTbp.js +1 -0
- package/ui-dist/assets/index-DdAQdjTR.js +1 -0
- package/ui-dist/assets/index-DlImcHKo.js +1 -0
- package/ui-dist/assets/index-X9LdJDbl.js +1 -0
- package/ui-dist/assets/infoDiagram-HS3SLOUP-CbJm6kuq.js +2 -0
- package/ui-dist/assets/init-Gi6I4Gst.js +1 -0
- package/ui-dist/assets/javascript-iXu5QeM3.js +1 -0
- package/ui-dist/assets/journeyDiagram-XKPGCS4Q-CeNVFpGu.js +139 -0
- package/ui-dist/assets/julia-DuME0IfC.js +1 -0
- package/ui-dist/assets/kanban-definition-3W4ZIXB7-DRqPoDRI.js +89 -0
- package/ui-dist/assets/katex-O9d3_IXG.js +261 -0
- package/ui-dist/assets/layout-CZTKj8OD.js +1 -0
- package/ui-dist/assets/linear-BDJjeIco.js +1 -0
- package/ui-dist/assets/livescript-BwQOo05w.js +1 -0
- package/ui-dist/assets/lua-BgMRiT3U.js +1 -0
- package/ui-dist/assets/mathematica-DTrFuWx2.js +1 -0
- package/ui-dist/assets/mbox-CNhZ1qSd.js +1 -0
- package/ui-dist/assets/mermaid.core-B5v7dPHY.js +256 -0
- package/ui-dist/assets/mindmap-definition-VGOIOE7T-zjw0AyzL.js +68 -0
- package/ui-dist/assets/mirc-CjQqDB4T.js +1 -0
- package/ui-dist/assets/mllike-CXdrOF99.js +1 -0
- package/ui-dist/assets/modelica-Dc1JOy9r.js +1 -0
- package/ui-dist/assets/mscgen-BA5vi2Kp.js +1 -0
- package/ui-dist/assets/mumps-BT43cFF4.js +1 -0
- package/ui-dist/assets/nginx-DdIZxoE0.js +1 -0
- package/ui-dist/assets/nsis-LdVXkNf5.js +1 -0
- package/ui-dist/assets/ntriples-BfvgReVJ.js +1 -0
- package/ui-dist/assets/octave-Ck1zUtKM.js +1 -0
- package/ui-dist/assets/ordinal-Cboi1Yqb.js +1 -0
- package/ui-dist/assets/oz-BzwKVEFT.js +1 -0
- package/ui-dist/assets/pascal--L3eBynH.js +1 -0
- package/ui-dist/assets/perl-CdXCOZ3F.js +1 -0
- package/ui-dist/assets/pieDiagram-ADFJNKIX-ojNQ8Ukr.js +30 -0
- package/ui-dist/assets/pig-CevX1Tat.js +1 -0
- package/ui-dist/assets/powershell-CFHJl5sT.js +1 -0
- package/ui-dist/assets/properties-C78fOPTZ.js +1 -0
- package/ui-dist/assets/protobuf-ChK-085T.js +1 -0
- package/ui-dist/assets/pug-DeIclll2.js +1 -0
- package/ui-dist/assets/puppet-DMA9R1ak.js +1 -0
- package/ui-dist/assets/python-BuPzkPfP.js +1 -0
- package/ui-dist/assets/q-pXgVlZs6.js +1 -0
- package/ui-dist/assets/quadrantDiagram-AYHSOK5B-B8K2F86x.js +7 -0
- package/ui-dist/assets/r-B6wPVr8A.js +1 -0
- package/ui-dist/assets/requirementDiagram-UZGBJVZJ-DA_Bjcpk.js +64 -0
- package/ui-dist/assets/rpm-CTu-6PCP.js +1 -0
- package/ui-dist/assets/ruby-B2Rjki9n.js +1 -0
- package/ui-dist/assets/sankeyDiagram-TZEHDZUN-yQfMgroQ.js +10 -0
- package/ui-dist/assets/sas-B4kiWyti.js +1 -0
- package/ui-dist/assets/scheme-C41bIUwD.js +1 -0
- package/ui-dist/assets/sequenceDiagram-WL72ISMW-CWQm0UQc.js +145 -0
- package/ui-dist/assets/shell-CjFT_Tl9.js +1 -0
- package/ui-dist/assets/sieve-C3Gn_uJK.js +1 -0
- package/ui-dist/assets/simple-mode-GW_nhZxv.js +1 -0
- package/ui-dist/assets/smalltalk-CnHTOXQT.js +1 -0
- package/ui-dist/assets/solr-DehyRSwq.js +1 -0
- package/ui-dist/assets/sparql-DkYu6x3z.js +1 -0
- package/ui-dist/assets/spreadsheet-BCZA_wO0.js +1 -0
- package/ui-dist/assets/sql-D0XecflT.js +1 -0
- package/ui-dist/assets/stateDiagram-FKZM4ZOC-C9L_ELvE.js +1 -0
- package/ui-dist/assets/stateDiagram-v2-4FDKWEC3-D3i22gRM.js +1 -0
- package/ui-dist/assets/stex-C3f8Ysf7.js +1 -0
- package/ui-dist/assets/stylus-B533Al4x.js +1 -0
- package/ui-dist/assets/swift-BzpIVaGY.js +1 -0
- package/ui-dist/assets/tcl-DVfN8rqt.js +1 -0
- package/ui-dist/assets/textile-CnDTJFAw.js +1 -0
- package/ui-dist/assets/tiddlywiki-DO-Gjzrf.js +1 -0
- package/ui-dist/assets/tiki-DGYXhP31.js +1 -0
- package/ui-dist/assets/timeline-definition-IT6M3QCI-Bfva-2zq.js +61 -0
- package/ui-dist/assets/toml-Bm5Em-hy.js +1 -0
- package/ui-dist/assets/treemap-GDKQZRPO-6wTQWQt4.js +162 -0
- package/ui-dist/assets/troff-wAsdV37c.js +1 -0
- package/ui-dist/assets/ttcn-CfJYG6tj.js +1 -0
- package/ui-dist/assets/ttcn-cfg-B9xdYoR4.js +1 -0
- package/ui-dist/assets/turtle-B1tBg_DP.js +1 -0
- package/ui-dist/assets/vb-CmGdzxic.js +1 -0
- package/ui-dist/assets/vbscript-BuJXcnF6.js +1 -0
- package/ui-dist/assets/velocity-D8B20fx6.js +1 -0
- package/ui-dist/assets/verilog-C6RDOZhf.js +1 -0
- package/ui-dist/assets/vhdl-lSbBsy5d.js +1 -0
- package/ui-dist/assets/webidl-ZXfAyPTL.js +1 -0
- package/ui-dist/assets/xquery-DzFWVndE.js +1 -0
- package/ui-dist/assets/xychartDiagram-PRI3JC2R-DNsmIw3v.js +7 -0
- package/ui-dist/assets/yacas-BJ4BC0dw.js +1 -0
- package/ui-dist/assets/z80-Hz9HOZM7.js +1 -0
- package/ui-dist/brands/opencode-logo-dark-square.svg +18 -0
- package/ui-dist/brands/opencode-logo-light-square.svg +18 -0
- package/ui-dist/favicon-16x16.png +0 -0
- package/ui-dist/favicon-32x32.png +0 -0
- package/ui-dist/favicon.ico +0 -0
- package/ui-dist/favicon.svg +9 -0
- package/ui-dist/index.html +48 -0
- package/ui-dist/site.webmanifest +30 -0
- package/ui-dist/sw.js +42 -0
- package/ui-dist/worktree-favicon-16x16.png +0 -0
- package/ui-dist/worktree-favicon-32x32.png +0 -0
- package/ui-dist/worktree-favicon.ico +0 -0
- package/ui-dist/worktree-favicon.svg +9 -0
|
@@ -0,0 +1,454 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PluginJobScheduler — tick-based scheduler for plugin scheduled jobs.
|
|
3
|
+
*
|
|
4
|
+
* The scheduler is the central coordinator for all plugin cron jobs. It
|
|
5
|
+
* periodically ticks (default every 30 seconds), queries the `plugin_jobs`
|
|
6
|
+
* table for jobs whose `nextRunAt` has passed, dispatches `runJob` RPC calls
|
|
7
|
+
* to the appropriate worker processes, records each execution in the
|
|
8
|
+
* `plugin_job_runs` table, and advances the scheduling pointer.
|
|
9
|
+
*
|
|
10
|
+
* ## Responsibilities
|
|
11
|
+
*
|
|
12
|
+
* 1. **Tick loop** — A `setInterval`-based loop fires every `tickIntervalMs`
|
|
13
|
+
* (default 30s). Each tick scans for due jobs and dispatches them.
|
|
14
|
+
*
|
|
15
|
+
* 2. **Cron parsing & next-run calculation** — Uses the lightweight built-in
|
|
16
|
+
* cron parser ({@link parseCron}, {@link nextCronTick}) to compute the
|
|
17
|
+
* `nextRunAt` timestamp after each run or when a new job is registered.
|
|
18
|
+
*
|
|
19
|
+
* 3. **Overlap prevention** — Before dispatching a job, the scheduler checks
|
|
20
|
+
* for an existing `running` run for the same job. If one exists, the job
|
|
21
|
+
* is skipped for that tick.
|
|
22
|
+
*
|
|
23
|
+
* 4. **Job run recording** — Every execution creates a `plugin_job_runs` row:
|
|
24
|
+
* `queued` → `running` → `succeeded` | `failed`. Duration and error are
|
|
25
|
+
* captured.
|
|
26
|
+
*
|
|
27
|
+
* 5. **Lifecycle integration** — The scheduler exposes `registerPlugin()` and
|
|
28
|
+
* `unregisterPlugin()` so the host lifecycle manager can wire up job
|
|
29
|
+
* scheduling when plugins start/stop. On registration, the scheduler
|
|
30
|
+
* computes `nextRunAt` for all active jobs that don't already have one.
|
|
31
|
+
*
|
|
32
|
+
* @see PLUGIN_SPEC.md §17 — Scheduled Jobs
|
|
33
|
+
* @see ./plugin-job-store.ts — Persistence layer
|
|
34
|
+
* @see ./cron.ts — Cron parsing utilities
|
|
35
|
+
*/
|
|
36
|
+
import { and, eq, lte, or } from "drizzle-orm";
|
|
37
|
+
import { pluginJobs, pluginJobRuns } from "@fidelios/db";
|
|
38
|
+
import { parseCron, nextCronTick, validateCron } from "./cron.js";
|
|
39
|
+
import { logger } from "../middleware/logger.js";
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Constants
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
/** Default interval between scheduler ticks (30 seconds). */
|
|
44
|
+
const DEFAULT_TICK_INTERVAL_MS = 30_000;
|
|
45
|
+
/** Default timeout for a runJob RPC call (5 minutes). */
|
|
46
|
+
const DEFAULT_JOB_TIMEOUT_MS = 5 * 60 * 1_000;
|
|
47
|
+
/** Maximum number of concurrent job executions across all plugins. */
|
|
48
|
+
const DEFAULT_MAX_CONCURRENT_JOBS = 10;
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// Implementation
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
/**
|
|
53
|
+
* Create a new PluginJobScheduler.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* const scheduler = createPluginJobScheduler({
|
|
58
|
+
* db,
|
|
59
|
+
* jobStore,
|
|
60
|
+
* workerManager,
|
|
61
|
+
* });
|
|
62
|
+
*
|
|
63
|
+
* // Start the tick loop
|
|
64
|
+
* scheduler.start();
|
|
65
|
+
*
|
|
66
|
+
* // When a plugin comes online, register it
|
|
67
|
+
* await scheduler.registerPlugin(pluginId);
|
|
68
|
+
*
|
|
69
|
+
* // Manually trigger a job
|
|
70
|
+
* const { runId } = await scheduler.triggerJob(jobId);
|
|
71
|
+
*
|
|
72
|
+
* // On server shutdown
|
|
73
|
+
* scheduler.stop();
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export function createPluginJobScheduler(options) {
|
|
77
|
+
const { db, jobStore, workerManager, tickIntervalMs = DEFAULT_TICK_INTERVAL_MS, jobTimeoutMs = DEFAULT_JOB_TIMEOUT_MS, maxConcurrentJobs = DEFAULT_MAX_CONCURRENT_JOBS, } = options;
|
|
78
|
+
const log = logger.child({ service: "plugin-job-scheduler" });
|
|
79
|
+
// -----------------------------------------------------------------------
|
|
80
|
+
// State
|
|
81
|
+
// -----------------------------------------------------------------------
|
|
82
|
+
/** Timer handle for the tick loop. */
|
|
83
|
+
let tickTimer = null;
|
|
84
|
+
/** Whether the scheduler is running. */
|
|
85
|
+
let running = false;
|
|
86
|
+
/** Set of job IDs currently being executed (for overlap prevention). */
|
|
87
|
+
const activeJobs = new Set();
|
|
88
|
+
/** Total number of ticks since start. */
|
|
89
|
+
let tickCount = 0;
|
|
90
|
+
/** Timestamp of the last tick. */
|
|
91
|
+
let lastTickAt = null;
|
|
92
|
+
/** Guard against concurrent tick execution. */
|
|
93
|
+
let tickInProgress = false;
|
|
94
|
+
// -----------------------------------------------------------------------
|
|
95
|
+
// Core: tick
|
|
96
|
+
// -----------------------------------------------------------------------
|
|
97
|
+
/**
|
|
98
|
+
* A single scheduler tick. Queries for due jobs and dispatches them.
|
|
99
|
+
*/
|
|
100
|
+
async function tick() {
|
|
101
|
+
// Prevent overlapping ticks (in case a tick takes longer than the interval)
|
|
102
|
+
if (tickInProgress) {
|
|
103
|
+
log.debug("skipping tick — previous tick still in progress");
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
tickInProgress = true;
|
|
107
|
+
tickCount++;
|
|
108
|
+
lastTickAt = new Date();
|
|
109
|
+
try {
|
|
110
|
+
const now = new Date();
|
|
111
|
+
// Query for jobs whose nextRunAt has passed and are active.
|
|
112
|
+
// We include jobs with null nextRunAt since they may have just been
|
|
113
|
+
// registered and need their first run calculated.
|
|
114
|
+
const dueJobs = await db
|
|
115
|
+
.select()
|
|
116
|
+
.from(pluginJobs)
|
|
117
|
+
.where(and(eq(pluginJobs.status, "active"), lte(pluginJobs.nextRunAt, now)));
|
|
118
|
+
if (dueJobs.length === 0) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
log.debug({ count: dueJobs.length }, "found due jobs");
|
|
122
|
+
// Dispatch each due job (respecting concurrency limits)
|
|
123
|
+
const dispatches = [];
|
|
124
|
+
for (const job of dueJobs) {
|
|
125
|
+
// Concurrency limit
|
|
126
|
+
if (activeJobs.size >= maxConcurrentJobs) {
|
|
127
|
+
log.warn({ maxConcurrentJobs, activeJobCount: activeJobs.size }, "max concurrent jobs reached, deferring remaining jobs");
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
// Overlap prevention: skip if this job is already running
|
|
131
|
+
if (activeJobs.has(job.id)) {
|
|
132
|
+
log.debug({ jobId: job.id, jobKey: job.jobKey, pluginId: job.pluginId }, "skipping job — already running (overlap prevention)");
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
// Check if the worker is available
|
|
136
|
+
if (!workerManager.isRunning(job.pluginId)) {
|
|
137
|
+
log.debug({ jobId: job.id, pluginId: job.pluginId }, "skipping job — worker not running");
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
// Validate cron expression before dispatching
|
|
141
|
+
if (!job.schedule) {
|
|
142
|
+
log.warn({ jobId: job.id, jobKey: job.jobKey }, "skipping job — no schedule defined");
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
dispatches.push(dispatchJob(job));
|
|
146
|
+
}
|
|
147
|
+
if (dispatches.length > 0) {
|
|
148
|
+
await Promise.allSettled(dispatches);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
log.error({ err: err instanceof Error ? err.message : String(err) }, "scheduler tick error");
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
tickInProgress = false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// -----------------------------------------------------------------------
|
|
159
|
+
// Core: dispatch a single job
|
|
160
|
+
// -----------------------------------------------------------------------
|
|
161
|
+
/**
|
|
162
|
+
* Dispatch a single job run — create the run record, call the worker,
|
|
163
|
+
* record the result, and advance the schedule pointer.
|
|
164
|
+
*/
|
|
165
|
+
async function dispatchJob(job) {
|
|
166
|
+
const { id: jobId, pluginId, jobKey, schedule } = job;
|
|
167
|
+
const jobLog = log.child({ jobId, pluginId, jobKey });
|
|
168
|
+
// Mark as active (overlap prevention)
|
|
169
|
+
activeJobs.add(jobId);
|
|
170
|
+
let runId;
|
|
171
|
+
const startedAt = Date.now();
|
|
172
|
+
try {
|
|
173
|
+
// 1. Create run record
|
|
174
|
+
const run = await jobStore.createRun({
|
|
175
|
+
jobId,
|
|
176
|
+
pluginId,
|
|
177
|
+
trigger: "schedule",
|
|
178
|
+
});
|
|
179
|
+
runId = run.id;
|
|
180
|
+
jobLog.info({ runId }, "dispatching scheduled job");
|
|
181
|
+
// 2. Mark run as running
|
|
182
|
+
await jobStore.markRunning(runId);
|
|
183
|
+
// 3. Call worker via RPC
|
|
184
|
+
await workerManager.call(pluginId, "runJob", {
|
|
185
|
+
job: {
|
|
186
|
+
jobKey,
|
|
187
|
+
runId,
|
|
188
|
+
trigger: "schedule",
|
|
189
|
+
scheduledAt: (job.nextRunAt ?? new Date()).toISOString(),
|
|
190
|
+
},
|
|
191
|
+
}, jobTimeoutMs);
|
|
192
|
+
// 4. Mark run as succeeded
|
|
193
|
+
const durationMs = Date.now() - startedAt;
|
|
194
|
+
await jobStore.completeRun(runId, {
|
|
195
|
+
status: "succeeded",
|
|
196
|
+
durationMs,
|
|
197
|
+
});
|
|
198
|
+
jobLog.info({ runId, durationMs }, "job completed successfully");
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
const durationMs = Date.now() - startedAt;
|
|
202
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
203
|
+
jobLog.error({ runId, durationMs, err: errorMessage }, "job execution failed");
|
|
204
|
+
// Record the failure
|
|
205
|
+
if (runId) {
|
|
206
|
+
try {
|
|
207
|
+
await jobStore.completeRun(runId, {
|
|
208
|
+
status: "failed",
|
|
209
|
+
error: errorMessage,
|
|
210
|
+
durationMs,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
catch (completeErr) {
|
|
214
|
+
jobLog.error({
|
|
215
|
+
runId,
|
|
216
|
+
err: completeErr instanceof Error ? completeErr.message : String(completeErr),
|
|
217
|
+
}, "failed to record job failure");
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
finally {
|
|
222
|
+
// Remove from active set
|
|
223
|
+
activeJobs.delete(jobId);
|
|
224
|
+
// 5. Always advance the schedule pointer (even on failure)
|
|
225
|
+
try {
|
|
226
|
+
await advanceSchedulePointer(job);
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
jobLog.error({ err: err instanceof Error ? err.message : String(err) }, "failed to advance schedule pointer");
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// -----------------------------------------------------------------------
|
|
234
|
+
// Core: manual trigger
|
|
235
|
+
// -----------------------------------------------------------------------
|
|
236
|
+
async function triggerJob(jobId, trigger = "manual") {
|
|
237
|
+
const job = await jobStore.getJobById(jobId);
|
|
238
|
+
if (!job) {
|
|
239
|
+
throw new Error(`Job not found: ${jobId}`);
|
|
240
|
+
}
|
|
241
|
+
if (job.status !== "active") {
|
|
242
|
+
throw new Error(`Job "${job.jobKey}" is not active (status: ${job.status})`);
|
|
243
|
+
}
|
|
244
|
+
// Overlap prevention
|
|
245
|
+
if (activeJobs.has(jobId)) {
|
|
246
|
+
throw new Error(`Job "${job.jobKey}" is already running — cannot trigger while in progress`);
|
|
247
|
+
}
|
|
248
|
+
// Also check DB for running runs (defensive — covers multi-instance)
|
|
249
|
+
const existingRuns = await db
|
|
250
|
+
.select()
|
|
251
|
+
.from(pluginJobRuns)
|
|
252
|
+
.where(and(eq(pluginJobRuns.jobId, jobId), eq(pluginJobRuns.status, "running")));
|
|
253
|
+
if (existingRuns.length > 0) {
|
|
254
|
+
throw new Error(`Job "${job.jobKey}" already has a running execution — cannot trigger while in progress`);
|
|
255
|
+
}
|
|
256
|
+
// Check worker availability
|
|
257
|
+
if (!workerManager.isRunning(job.pluginId)) {
|
|
258
|
+
throw new Error(`Worker for plugin "${job.pluginId}" is not running — cannot trigger job`);
|
|
259
|
+
}
|
|
260
|
+
// Create the run and dispatch (non-blocking)
|
|
261
|
+
const run = await jobStore.createRun({
|
|
262
|
+
jobId,
|
|
263
|
+
pluginId: job.pluginId,
|
|
264
|
+
trigger,
|
|
265
|
+
});
|
|
266
|
+
// Dispatch in background — don't block the caller
|
|
267
|
+
void dispatchManualRun(job, run.id, trigger);
|
|
268
|
+
return { runId: run.id, jobId };
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Dispatch a manually triggered job run.
|
|
272
|
+
*/
|
|
273
|
+
async function dispatchManualRun(job, runId, trigger) {
|
|
274
|
+
const { id: jobId, pluginId, jobKey } = job;
|
|
275
|
+
const jobLog = log.child({ jobId, pluginId, jobKey, runId, trigger });
|
|
276
|
+
activeJobs.add(jobId);
|
|
277
|
+
const startedAt = Date.now();
|
|
278
|
+
try {
|
|
279
|
+
await jobStore.markRunning(runId);
|
|
280
|
+
await workerManager.call(pluginId, "runJob", {
|
|
281
|
+
job: {
|
|
282
|
+
jobKey,
|
|
283
|
+
runId,
|
|
284
|
+
trigger,
|
|
285
|
+
scheduledAt: new Date().toISOString(),
|
|
286
|
+
},
|
|
287
|
+
}, jobTimeoutMs);
|
|
288
|
+
const durationMs = Date.now() - startedAt;
|
|
289
|
+
await jobStore.completeRun(runId, {
|
|
290
|
+
status: "succeeded",
|
|
291
|
+
durationMs,
|
|
292
|
+
});
|
|
293
|
+
jobLog.info({ durationMs }, "manual job completed successfully");
|
|
294
|
+
}
|
|
295
|
+
catch (err) {
|
|
296
|
+
const durationMs = Date.now() - startedAt;
|
|
297
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
298
|
+
jobLog.error({ durationMs, err: errorMessage }, "manual job failed");
|
|
299
|
+
try {
|
|
300
|
+
await jobStore.completeRun(runId, {
|
|
301
|
+
status: "failed",
|
|
302
|
+
error: errorMessage,
|
|
303
|
+
durationMs,
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
catch (completeErr) {
|
|
307
|
+
jobLog.error({
|
|
308
|
+
err: completeErr instanceof Error ? completeErr.message : String(completeErr),
|
|
309
|
+
}, "failed to record manual job failure");
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
finally {
|
|
313
|
+
activeJobs.delete(jobId);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// -----------------------------------------------------------------------
|
|
317
|
+
// Schedule pointer management
|
|
318
|
+
// -----------------------------------------------------------------------
|
|
319
|
+
/**
|
|
320
|
+
* Advance the `lastRunAt` and `nextRunAt` timestamps on a job after a run.
|
|
321
|
+
*/
|
|
322
|
+
async function advanceSchedulePointer(job) {
|
|
323
|
+
const now = new Date();
|
|
324
|
+
let nextRunAt = null;
|
|
325
|
+
if (job.schedule) {
|
|
326
|
+
const validationError = validateCron(job.schedule);
|
|
327
|
+
if (validationError) {
|
|
328
|
+
log.warn({ jobId: job.id, schedule: job.schedule, error: validationError }, "invalid cron schedule — cannot compute next run");
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
const cron = parseCron(job.schedule);
|
|
332
|
+
nextRunAt = nextCronTick(cron, now);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
await jobStore.updateRunTimestamps(job.id, now, nextRunAt);
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Ensure all active jobs for a plugin have a `nextRunAt` value.
|
|
339
|
+
* Called when a plugin is registered with the scheduler.
|
|
340
|
+
*/
|
|
341
|
+
async function ensureNextRunTimestamps(pluginId) {
|
|
342
|
+
const jobs = await jobStore.listJobs(pluginId, "active");
|
|
343
|
+
for (const job of jobs) {
|
|
344
|
+
// Skip jobs that already have a valid nextRunAt in the future
|
|
345
|
+
if (job.nextRunAt && job.nextRunAt.getTime() > Date.now()) {
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
// Skip jobs without a schedule
|
|
349
|
+
if (!job.schedule) {
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
const validationError = validateCron(job.schedule);
|
|
353
|
+
if (validationError) {
|
|
354
|
+
log.warn({ jobId: job.id, jobKey: job.jobKey, schedule: job.schedule, error: validationError }, "skipping job with invalid cron schedule");
|
|
355
|
+
continue;
|
|
356
|
+
}
|
|
357
|
+
const cron = parseCron(job.schedule);
|
|
358
|
+
const nextRunAt = nextCronTick(cron, new Date());
|
|
359
|
+
if (nextRunAt) {
|
|
360
|
+
await jobStore.updateRunTimestamps(job.id, job.lastRunAt ?? new Date(0), nextRunAt);
|
|
361
|
+
log.debug({ jobId: job.id, jobKey: job.jobKey, nextRunAt: nextRunAt.toISOString() }, "computed nextRunAt for job");
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
// -----------------------------------------------------------------------
|
|
366
|
+
// Plugin registration
|
|
367
|
+
// -----------------------------------------------------------------------
|
|
368
|
+
async function registerPlugin(pluginId) {
|
|
369
|
+
log.info({ pluginId }, "registering plugin with job scheduler");
|
|
370
|
+
await ensureNextRunTimestamps(pluginId);
|
|
371
|
+
}
|
|
372
|
+
async function unregisterPlugin(pluginId) {
|
|
373
|
+
log.info({ pluginId }, "unregistering plugin from job scheduler");
|
|
374
|
+
// Cancel any in-flight run records for this plugin that are still
|
|
375
|
+
// queued or running. Active jobs in-memory will finish naturally.
|
|
376
|
+
try {
|
|
377
|
+
const runningRuns = await db
|
|
378
|
+
.select()
|
|
379
|
+
.from(pluginJobRuns)
|
|
380
|
+
.where(and(eq(pluginJobRuns.pluginId, pluginId), or(eq(pluginJobRuns.status, "running"), eq(pluginJobRuns.status, "queued"))));
|
|
381
|
+
for (const run of runningRuns) {
|
|
382
|
+
await jobStore.completeRun(run.id, {
|
|
383
|
+
status: "cancelled",
|
|
384
|
+
error: "Plugin unregistered",
|
|
385
|
+
durationMs: run.startedAt
|
|
386
|
+
? Date.now() - run.startedAt.getTime()
|
|
387
|
+
: null,
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
catch (err) {
|
|
392
|
+
log.error({
|
|
393
|
+
pluginId,
|
|
394
|
+
err: err instanceof Error ? err.message : String(err),
|
|
395
|
+
}, "error cancelling in-flight runs during unregister");
|
|
396
|
+
}
|
|
397
|
+
// Remove any active tracking for jobs owned by this plugin
|
|
398
|
+
const jobs = await jobStore.listJobs(pluginId);
|
|
399
|
+
for (const job of jobs) {
|
|
400
|
+
activeJobs.delete(job.id);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
// -----------------------------------------------------------------------
|
|
404
|
+
// Lifecycle: start / stop
|
|
405
|
+
// -----------------------------------------------------------------------
|
|
406
|
+
function start() {
|
|
407
|
+
if (running) {
|
|
408
|
+
log.debug("scheduler already running");
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
running = true;
|
|
412
|
+
tickTimer = setInterval(() => {
|
|
413
|
+
void tick();
|
|
414
|
+
}, tickIntervalMs);
|
|
415
|
+
log.info({ tickIntervalMs, maxConcurrentJobs }, "plugin job scheduler started");
|
|
416
|
+
}
|
|
417
|
+
function stop() {
|
|
418
|
+
// Always clear the timer defensively, even if `running` is already false,
|
|
419
|
+
// to prevent leaked interval timers.
|
|
420
|
+
if (tickTimer !== null) {
|
|
421
|
+
clearInterval(tickTimer);
|
|
422
|
+
tickTimer = null;
|
|
423
|
+
}
|
|
424
|
+
if (!running)
|
|
425
|
+
return;
|
|
426
|
+
running = false;
|
|
427
|
+
log.info({ activeJobCount: activeJobs.size }, "plugin job scheduler stopped");
|
|
428
|
+
}
|
|
429
|
+
// -----------------------------------------------------------------------
|
|
430
|
+
// Diagnostics
|
|
431
|
+
// -----------------------------------------------------------------------
|
|
432
|
+
function diagnostics() {
|
|
433
|
+
return {
|
|
434
|
+
running,
|
|
435
|
+
activeJobCount: activeJobs.size,
|
|
436
|
+
activeJobIds: [...activeJobs],
|
|
437
|
+
tickCount,
|
|
438
|
+
lastTickAt: lastTickAt?.toISOString() ?? null,
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
// -----------------------------------------------------------------------
|
|
442
|
+
// Public API
|
|
443
|
+
// -----------------------------------------------------------------------
|
|
444
|
+
return {
|
|
445
|
+
start,
|
|
446
|
+
stop,
|
|
447
|
+
registerPlugin,
|
|
448
|
+
unregisterPlugin,
|
|
449
|
+
triggerJob,
|
|
450
|
+
tick,
|
|
451
|
+
diagnostics,
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
//# sourceMappingURL=plugin-job-scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-job-scheduler.js","sourceRoot":"","sources":["../../src/services/plugin-job-scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Job Store — persistence layer for scheduled plugin jobs and their
|
|
3
|
+
* execution history.
|
|
4
|
+
*
|
|
5
|
+
* This service manages the `plugin_jobs` and `plugin_job_runs` tables. It is
|
|
6
|
+
* the server-side backing store for the `ctx.jobs` SDK surface exposed to
|
|
7
|
+
* plugin workers.
|
|
8
|
+
*
|
|
9
|
+
* ## Responsibilities
|
|
10
|
+
*
|
|
11
|
+
* 1. **Sync job declarations** — When a plugin is installed or started, the
|
|
12
|
+
* host calls `syncJobDeclarations()` to upsert the manifest's declared jobs
|
|
13
|
+
* into the `plugin_jobs` table. Jobs removed from the manifest are marked
|
|
14
|
+
* `paused` (not deleted) to preserve history.
|
|
15
|
+
*
|
|
16
|
+
* 2. **Job CRUD** — List, get, pause, and resume jobs for a given plugin.
|
|
17
|
+
*
|
|
18
|
+
* 3. **Run lifecycle** — Create job run records, update their status, and
|
|
19
|
+
* record results (duration, errors, logs).
|
|
20
|
+
*
|
|
21
|
+
* 4. **Next-run calculation** — After a run completes the host should call
|
|
22
|
+
* `updateNextRunAt()` with the next cron tick so the scheduler knows when
|
|
23
|
+
* to fire next.
|
|
24
|
+
*
|
|
25
|
+
* The capability check (`jobs.schedule`) is enforced upstream by the host
|
|
26
|
+
* client factory and manifest validator — this store trusts that the caller
|
|
27
|
+
* has already been authorised.
|
|
28
|
+
*
|
|
29
|
+
* @see PLUGIN_SPEC.md §17 — Scheduled Jobs
|
|
30
|
+
* @see PLUGIN_SPEC.md §21.3 — `plugin_jobs` / `plugin_job_runs` tables
|
|
31
|
+
*/
|
|
32
|
+
import type { Db } from "@fidelios/db";
|
|
33
|
+
import { pluginJobs, pluginJobRuns } from "@fidelios/db";
|
|
34
|
+
import type { PluginJobDeclaration, PluginJobRunStatus, PluginJobRunTrigger, PluginJobRecord } from "@fidelios/shared";
|
|
35
|
+
/**
|
|
36
|
+
* The statuses used for job *definitions* in the `plugin_jobs` table.
|
|
37
|
+
* Aliased from `PluginJobRecord` to keep the store API aligned with
|
|
38
|
+
* the domain type (`"active" | "paused" | "failed"`).
|
|
39
|
+
*/
|
|
40
|
+
type JobDefinitionStatus = PluginJobRecord["status"];
|
|
41
|
+
/**
|
|
42
|
+
* Input for creating a job run record.
|
|
43
|
+
*/
|
|
44
|
+
export interface CreateJobRunInput {
|
|
45
|
+
/** FK to the plugin_jobs row. */
|
|
46
|
+
jobId: string;
|
|
47
|
+
/** FK to the plugins row. */
|
|
48
|
+
pluginId: string;
|
|
49
|
+
/** What triggered this run. */
|
|
50
|
+
trigger: PluginJobRunTrigger;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Input for completing (or failing) a job run.
|
|
54
|
+
*/
|
|
55
|
+
export interface CompleteJobRunInput {
|
|
56
|
+
/** Final run status. */
|
|
57
|
+
status: PluginJobRunStatus;
|
|
58
|
+
/** Error message if the run failed. */
|
|
59
|
+
error?: string | null;
|
|
60
|
+
/** Run duration in milliseconds. */
|
|
61
|
+
durationMs?: number | null;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Create a PluginJobStore backed by the given Drizzle database instance.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```ts
|
|
68
|
+
* const jobStore = pluginJobStore(db);
|
|
69
|
+
*
|
|
70
|
+
* // On plugin install/start — sync declared jobs into the DB
|
|
71
|
+
* await jobStore.syncJobDeclarations(pluginId, manifest.jobs ?? []);
|
|
72
|
+
*
|
|
73
|
+
* // Before dispatching a runJob RPC — create a run record
|
|
74
|
+
* const run = await jobStore.createRun({ jobId, pluginId, trigger: "schedule" });
|
|
75
|
+
*
|
|
76
|
+
* // After the RPC completes — record the result
|
|
77
|
+
* await jobStore.completeRun(run.id, {
|
|
78
|
+
* status: "succeeded",
|
|
79
|
+
* durationMs: Date.now() - startedAt,
|
|
80
|
+
* });
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export declare function pluginJobStore(db: Db): {
|
|
84
|
+
/**
|
|
85
|
+
* Sync declared jobs from a plugin manifest into the `plugin_jobs` table.
|
|
86
|
+
*
|
|
87
|
+
* This is called at plugin install and on each worker startup so the DB
|
|
88
|
+
* always reflects the manifest's declared jobs:
|
|
89
|
+
*
|
|
90
|
+
* - **New jobs** are inserted with status `active`.
|
|
91
|
+
* - **Existing jobs** have their `schedule` updated if it changed.
|
|
92
|
+
* - **Removed jobs** (present in DB but absent from the manifest) are
|
|
93
|
+
* set to `paused` so their history is preserved.
|
|
94
|
+
*
|
|
95
|
+
* The unique constraint `(pluginId, jobKey)` is used for conflict
|
|
96
|
+
* resolution.
|
|
97
|
+
*
|
|
98
|
+
* @param pluginId - UUID of the owning plugin
|
|
99
|
+
* @param declarations - Job declarations from the plugin manifest
|
|
100
|
+
*/
|
|
101
|
+
syncJobDeclarations(pluginId: string, declarations: PluginJobDeclaration[]): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* List all jobs for a plugin, optionally filtered by status.
|
|
104
|
+
*
|
|
105
|
+
* @param pluginId - UUID of the owning plugin
|
|
106
|
+
* @param status - Optional status filter
|
|
107
|
+
*/
|
|
108
|
+
listJobs(pluginId: string, status?: JobDefinitionStatus): Promise<(typeof pluginJobs.$inferSelect)[]>;
|
|
109
|
+
/**
|
|
110
|
+
* Get a single job by its composite key `(pluginId, jobKey)`.
|
|
111
|
+
*
|
|
112
|
+
* @param pluginId - UUID of the owning plugin
|
|
113
|
+
* @param jobKey - Stable job identifier from the manifest
|
|
114
|
+
* @returns The job row, or `null` if not found
|
|
115
|
+
*/
|
|
116
|
+
getJobByKey(pluginId: string, jobKey: string): Promise<(typeof pluginJobs.$inferSelect) | null>;
|
|
117
|
+
/**
|
|
118
|
+
* Get a single job by its primary key (UUID).
|
|
119
|
+
*
|
|
120
|
+
* @param jobId - UUID of the job row
|
|
121
|
+
* @returns The job row, or `null` if not found
|
|
122
|
+
*/
|
|
123
|
+
getJobById(jobId: string): Promise<(typeof pluginJobs.$inferSelect) | null>;
|
|
124
|
+
/**
|
|
125
|
+
* Fetch a single job by ID, scoped to a specific plugin.
|
|
126
|
+
*
|
|
127
|
+
* Returns `null` if the job does not exist or does not belong to the
|
|
128
|
+
* given plugin — callers should treat both cases as "not found".
|
|
129
|
+
*/
|
|
130
|
+
getJobByIdForPlugin(pluginId: string, jobId: string): Promise<(typeof pluginJobs.$inferSelect) | null>;
|
|
131
|
+
/**
|
|
132
|
+
* Update a job's status.
|
|
133
|
+
*
|
|
134
|
+
* @param jobId - UUID of the job row
|
|
135
|
+
* @param status - New status
|
|
136
|
+
*/
|
|
137
|
+
updateJobStatus(jobId: string, status: JobDefinitionStatus): Promise<void>;
|
|
138
|
+
/**
|
|
139
|
+
* Update the `lastRunAt` and `nextRunAt` timestamps on a job.
|
|
140
|
+
*
|
|
141
|
+
* Called by the scheduler after a run completes to advance the
|
|
142
|
+
* scheduling pointer.
|
|
143
|
+
*
|
|
144
|
+
* @param jobId - UUID of the job row
|
|
145
|
+
* @param lastRunAt - When the last run started
|
|
146
|
+
* @param nextRunAt - When the next run should fire
|
|
147
|
+
*/
|
|
148
|
+
updateRunTimestamps(jobId: string, lastRunAt: Date, nextRunAt: Date | null): Promise<void>;
|
|
149
|
+
/**
|
|
150
|
+
* Delete all jobs (and cascaded runs) owned by a plugin.
|
|
151
|
+
*
|
|
152
|
+
* Called during plugin uninstall when `removeData = true`.
|
|
153
|
+
*
|
|
154
|
+
* @param pluginId - UUID of the owning plugin
|
|
155
|
+
*/
|
|
156
|
+
deleteAllJobs(pluginId: string): Promise<void>;
|
|
157
|
+
/**
|
|
158
|
+
* Create a new job run record with status `queued`.
|
|
159
|
+
*
|
|
160
|
+
* The caller should create the run record *before* dispatching the
|
|
161
|
+
* `runJob` RPC to the worker, then update it to `running` once the
|
|
162
|
+
* worker begins execution.
|
|
163
|
+
*
|
|
164
|
+
* @param input - Job run input (jobId, pluginId, trigger)
|
|
165
|
+
* @returns The newly created run row
|
|
166
|
+
*/
|
|
167
|
+
createRun(input: CreateJobRunInput): Promise<typeof pluginJobRuns.$inferSelect>;
|
|
168
|
+
/**
|
|
169
|
+
* Mark a run as `running` and set its `startedAt` timestamp.
|
|
170
|
+
*
|
|
171
|
+
* @param runId - UUID of the run row
|
|
172
|
+
*/
|
|
173
|
+
markRunning(runId: string): Promise<void>;
|
|
174
|
+
/**
|
|
175
|
+
* Complete a run — set its final status, error, duration, and
|
|
176
|
+
* `finishedAt` timestamp.
|
|
177
|
+
*
|
|
178
|
+
* @param runId - UUID of the run row
|
|
179
|
+
* @param input - Completion details
|
|
180
|
+
*/
|
|
181
|
+
completeRun(runId: string, input: CompleteJobRunInput): Promise<void>;
|
|
182
|
+
/**
|
|
183
|
+
* Get a run by its primary key.
|
|
184
|
+
*
|
|
185
|
+
* @param runId - UUID of the run row
|
|
186
|
+
* @returns The run row, or `null` if not found
|
|
187
|
+
*/
|
|
188
|
+
getRunById(runId: string): Promise<(typeof pluginJobRuns.$inferSelect) | null>;
|
|
189
|
+
/**
|
|
190
|
+
* List runs for a specific job, ordered by creation time descending.
|
|
191
|
+
*
|
|
192
|
+
* @param jobId - UUID of the job
|
|
193
|
+
* @param limit - Maximum number of rows to return (default: 50)
|
|
194
|
+
*/
|
|
195
|
+
listRunsByJob(jobId: string, limit?: number): Promise<(typeof pluginJobRuns.$inferSelect)[]>;
|
|
196
|
+
/**
|
|
197
|
+
* List runs for a plugin, optionally filtered by status.
|
|
198
|
+
*
|
|
199
|
+
* @param pluginId - UUID of the owning plugin
|
|
200
|
+
* @param status - Optional status filter
|
|
201
|
+
* @param limit - Maximum number of rows to return (default: 50)
|
|
202
|
+
*/
|
|
203
|
+
listRunsByPlugin(pluginId: string, status?: PluginJobRunStatus, limit?: number): Promise<(typeof pluginJobRuns.$inferSelect)[]>;
|
|
204
|
+
};
|
|
205
|
+
/** Type alias for the return value of `pluginJobStore()`. */
|
|
206
|
+
export type PluginJobStore = ReturnType<typeof pluginJobStore>;
|
|
207
|
+
export {};
|
|
208
|
+
//# sourceMappingURL=plugin-job-store.d.ts.map
|