@jungjaehoon/mama-os 0.1.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/CHANGELOG.md +67 -0
- package/README.md +643 -0
- package/dist/agent/agent-loop.d.ts +98 -0
- package/dist/agent/agent-loop.d.ts.map +1 -0
- package/dist/agent/agent-loop.js +417 -0
- package/dist/agent/agent-loop.js.map +1 -0
- package/dist/agent/auto-recall.d.ts +48 -0
- package/dist/agent/auto-recall.d.ts.map +1 -0
- package/dist/agent/auto-recall.js +178 -0
- package/dist/agent/auto-recall.js.map +1 -0
- package/dist/agent/claude-cli-wrapper.d.ts +130 -0
- package/dist/agent/claude-cli-wrapper.d.ts.map +1 -0
- package/dist/agent/claude-cli-wrapper.js +227 -0
- package/dist/agent/claude-cli-wrapper.js.map +1 -0
- package/dist/agent/claude-client.d.ts +50 -0
- package/dist/agent/claude-client.d.ts.map +1 -0
- package/dist/agent/claude-client.js +214 -0
- package/dist/agent/claude-client.js.map +1 -0
- package/dist/agent/gateway-tool-executor.d.ts +75 -0
- package/dist/agent/gateway-tool-executor.d.ts.map +1 -0
- package/dist/agent/gateway-tool-executor.js +348 -0
- package/dist/agent/gateway-tool-executor.js.map +1 -0
- package/dist/agent/index.d.ts +13 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +18 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/mcp-executor.d.ts +75 -0
- package/dist/agent/mcp-executor.d.ts.map +1 -0
- package/dist/agent/mcp-executor.js +307 -0
- package/dist/agent/mcp-executor.js.map +1 -0
- package/dist/agent/session-pool.d.ts +148 -0
- package/dist/agent/session-pool.d.ts.map +1 -0
- package/dist/agent/session-pool.js +272 -0
- package/dist/agent/session-pool.js.map +1 -0
- package/dist/agent/streaming-callback-manager.d.ts +85 -0
- package/dist/agent/streaming-callback-manager.d.ts.map +1 -0
- package/dist/agent/streaming-callback-manager.js +103 -0
- package/dist/agent/streaming-callback-manager.js.map +1 -0
- package/dist/agent/types.d.ts +437 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +29 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/api/cron-handler.d.ts +44 -0
- package/dist/api/cron-handler.d.ts.map +1 -0
- package/dist/api/cron-handler.js +195 -0
- package/dist/api/cron-handler.js.map +1 -0
- package/dist/api/error-handler.d.ts +22 -0
- package/dist/api/error-handler.d.ts.map +1 -0
- package/dist/api/error-handler.js +104 -0
- package/dist/api/error-handler.js.map +1 -0
- package/dist/api/heartbeat-handler.d.ts +49 -0
- package/dist/api/heartbeat-handler.d.ts.map +1 -0
- package/dist/api/heartbeat-handler.js +91 -0
- package/dist/api/heartbeat-handler.js.map +1 -0
- package/dist/api/index.d.ts +61 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +145 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/types.d.ts +156 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +62 -0
- package/dist/api/types.js.map +1 -0
- package/dist/auth/index.d.ts +7 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +11 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/oauth-manager.d.ts +59 -0
- package/dist/auth/oauth-manager.d.ts.map +1 -0
- package/dist/auth/oauth-manager.js +237 -0
- package/dist/auth/oauth-manager.js.map +1 -0
- package/dist/auth/types.d.ts +92 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +23 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cli/commands/init.d.ts +19 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +155 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/run.d.ts +19 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +89 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +19 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +134 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/start.d.ts +24 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +1073 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +10 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +85 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +10 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +65 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/config/config-manager.d.ts +51 -0
- package/dist/cli/config/config-manager.d.ts.map +1 -0
- package/dist/cli/config/config-manager.js +216 -0
- package/dist/cli/config/config-manager.js.map +1 -0
- package/dist/cli/config/types.d.ts +172 -0
- package/dist/cli/config/types.d.ts.map +1 -0
- package/dist/cli/config/types.js +48 -0
- package/dist/cli/config/types.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +92 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/pid-manager.d.ts +66 -0
- package/dist/cli/utils/pid-manager.d.ts.map +1 -0
- package/dist/cli/utils/pid-manager.js +167 -0
- package/dist/cli/utils/pid-manager.js.map +1 -0
- package/dist/concurrency/index.d.ts +13 -0
- package/dist/concurrency/index.d.ts.map +1 -0
- package/dist/concurrency/index.js +22 -0
- package/dist/concurrency/index.js.map +1 -0
- package/dist/concurrency/lane-manager.d.ts +113 -0
- package/dist/concurrency/lane-manager.d.ts.map +1 -0
- package/dist/concurrency/lane-manager.js +245 -0
- package/dist/concurrency/lane-manager.js.map +1 -0
- package/dist/concurrency/session-key.d.ts +41 -0
- package/dist/concurrency/session-key.d.ts.map +1 -0
- package/dist/concurrency/session-key.js +61 -0
- package/dist/concurrency/session-key.js.map +1 -0
- package/dist/concurrency/types.d.ts +69 -0
- package/dist/concurrency/types.d.ts.map +1 -0
- package/dist/concurrency/types.js +16 -0
- package/dist/concurrency/types.js.map +1 -0
- package/dist/gateways/channel-history.d.ts +102 -0
- package/dist/gateways/channel-history.d.ts.map +1 -0
- package/dist/gateways/channel-history.js +181 -0
- package/dist/gateways/channel-history.js.map +1 -0
- package/dist/gateways/context-injector.d.ts +74 -0
- package/dist/gateways/context-injector.d.ts.map +1 -0
- package/dist/gateways/context-injector.js +121 -0
- package/dist/gateways/context-injector.js.map +1 -0
- package/dist/gateways/discord.d.ts +122 -0
- package/dist/gateways/discord.d.ts.map +1 -0
- package/dist/gateways/discord.js +602 -0
- package/dist/gateways/discord.js.map +1 -0
- package/dist/gateways/index.d.ts +30 -0
- package/dist/gateways/index.d.ts.map +1 -0
- package/dist/gateways/index.js +49 -0
- package/dist/gateways/index.js.map +1 -0
- package/dist/gateways/message-router.d.ts +116 -0
- package/dist/gateways/message-router.d.ts.map +1 -0
- package/dist/gateways/message-router.js +315 -0
- package/dist/gateways/message-router.js.map +1 -0
- package/dist/gateways/message-splitter.d.ts +54 -0
- package/dist/gateways/message-splitter.d.ts.map +1 -0
- package/dist/gateways/message-splitter.js +146 -0
- package/dist/gateways/message-splitter.js.map +1 -0
- package/dist/gateways/plugin-loader.d.ts +76 -0
- package/dist/gateways/plugin-loader.d.ts.map +1 -0
- package/dist/gateways/plugin-loader.js +221 -0
- package/dist/gateways/plugin-loader.js.map +1 -0
- package/dist/gateways/session-store.d.ts +77 -0
- package/dist/gateways/session-store.d.ts.map +1 -0
- package/dist/gateways/session-store.js +233 -0
- package/dist/gateways/session-store.js.map +1 -0
- package/dist/gateways/slack.d.ts +90 -0
- package/dist/gateways/slack.d.ts.map +1 -0
- package/dist/gateways/slack.js +281 -0
- package/dist/gateways/slack.js.map +1 -0
- package/dist/gateways/telegram.d.ts +79 -0
- package/dist/gateways/telegram.d.ts.map +1 -0
- package/dist/gateways/telegram.js +207 -0
- package/dist/gateways/telegram.js.map +1 -0
- package/dist/gateways/types.d.ts +340 -0
- package/dist/gateways/types.d.ts.map +1 -0
- package/dist/gateways/types.js +6 -0
- package/dist/gateways/types.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/memory-logger.d.ts +47 -0
- package/dist/memory/memory-logger.d.ts.map +1 -0
- package/dist/memory/memory-logger.js +126 -0
- package/dist/memory/memory-logger.js.map +1 -0
- package/dist/onboarding/all-tools.d.ts +18 -0
- package/dist/onboarding/all-tools.d.ts.map +1 -0
- package/dist/onboarding/all-tools.js +149 -0
- package/dist/onboarding/all-tools.js.map +1 -0
- package/dist/onboarding/autonomous-discovery-tools.d.ts +13 -0
- package/dist/onboarding/autonomous-discovery-tools.d.ts.map +1 -0
- package/dist/onboarding/autonomous-discovery-tools.js +268 -0
- package/dist/onboarding/autonomous-discovery-tools.js.map +1 -0
- package/dist/onboarding/bootstrap-template.d.ts +5 -0
- package/dist/onboarding/bootstrap-template.d.ts.map +1 -0
- package/dist/onboarding/bootstrap-template.js +142 -0
- package/dist/onboarding/bootstrap-template.js.map +1 -0
- package/dist/onboarding/complete-autonomous-prompt.d.ts +13 -0
- package/dist/onboarding/complete-autonomous-prompt.d.ts.map +1 -0
- package/dist/onboarding/complete-autonomous-prompt.js +1220 -0
- package/dist/onboarding/complete-autonomous-prompt.js.map +1 -0
- package/dist/onboarding/onboarding-state.d.ts +70 -0
- package/dist/onboarding/onboarding-state.d.ts.map +1 -0
- package/dist/onboarding/onboarding-state.js +184 -0
- package/dist/onboarding/onboarding-state.js.map +1 -0
- package/dist/onboarding/personality-quiz.d.ts +35 -0
- package/dist/onboarding/personality-quiz.d.ts.map +1 -0
- package/dist/onboarding/personality-quiz.js +219 -0
- package/dist/onboarding/personality-quiz.js.map +1 -0
- package/dist/onboarding/phase-5-summary.d.ts +22 -0
- package/dist/onboarding/phase-5-summary.d.ts.map +1 -0
- package/dist/onboarding/phase-5-summary.js +151 -0
- package/dist/onboarding/phase-5-summary.js.map +1 -0
- package/dist/onboarding/phase-6-security.d.ts +33 -0
- package/dist/onboarding/phase-6-security.d.ts.map +1 -0
- package/dist/onboarding/phase-6-security.js +473 -0
- package/dist/onboarding/phase-6-security.js.map +1 -0
- package/dist/onboarding/phase-7-integrations.d.ts +66 -0
- package/dist/onboarding/phase-7-integrations.d.ts.map +1 -0
- package/dist/onboarding/phase-7-integrations.js +619 -0
- package/dist/onboarding/phase-7-integrations.js.map +1 -0
- package/dist/onboarding/phase-8-demo.d.ts +43 -0
- package/dist/onboarding/phase-8-demo.d.ts.map +1 -0
- package/dist/onboarding/phase-8-demo.js +346 -0
- package/dist/onboarding/phase-8-demo.js.map +1 -0
- package/dist/onboarding/phase-9-finalization.d.ts +22 -0
- package/dist/onboarding/phase-9-finalization.d.ts.map +1 -0
- package/dist/onboarding/phase-9-finalization.js +375 -0
- package/dist/onboarding/phase-9-finalization.js.map +1 -0
- package/dist/onboarding/ritual-prompt.d.ts +2 -0
- package/dist/onboarding/ritual-prompt.d.ts.map +1 -0
- package/dist/onboarding/ritual-prompt.js +285 -0
- package/dist/onboarding/ritual-prompt.js.map +1 -0
- package/dist/onboarding/ritual-tools.d.ts +13 -0
- package/dist/onboarding/ritual-tools.d.ts.map +1 -0
- package/dist/onboarding/ritual-tools.js +93 -0
- package/dist/onboarding/ritual-tools.js.map +1 -0
- package/dist/runners/cli-runner.d.ts +59 -0
- package/dist/runners/cli-runner.d.ts.map +1 -0
- package/dist/runners/cli-runner.js +190 -0
- package/dist/runners/cli-runner.js.map +1 -0
- package/dist/runners/index.d.ts +11 -0
- package/dist/runners/index.d.ts.map +1 -0
- package/dist/runners/index.js +15 -0
- package/dist/runners/index.js.map +1 -0
- package/dist/runners/types.d.ts +81 -0
- package/dist/runners/types.d.ts.map +1 -0
- package/dist/runners/types.js +31 -0
- package/dist/runners/types.js.map +1 -0
- package/dist/scheduler/cron-scheduler.d.ts +115 -0
- package/dist/scheduler/cron-scheduler.d.ts.map +1 -0
- package/dist/scheduler/cron-scheduler.js +320 -0
- package/dist/scheduler/cron-scheduler.js.map +1 -0
- package/dist/scheduler/heartbeat.d.ts +53 -0
- package/dist/scheduler/heartbeat.d.ts.map +1 -0
- package/dist/scheduler/heartbeat.js +160 -0
- package/dist/scheduler/heartbeat.js.map +1 -0
- package/dist/scheduler/index.d.ts +22 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +31 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/job-lock.d.ts +85 -0
- package/dist/scheduler/job-lock.d.ts.map +1 -0
- package/dist/scheduler/job-lock.js +137 -0
- package/dist/scheduler/job-lock.js.map +1 -0
- package/dist/scheduler/recovery.d.ts +78 -0
- package/dist/scheduler/recovery.d.ts.map +1 -0
- package/dist/scheduler/recovery.js +124 -0
- package/dist/scheduler/recovery.js.map +1 -0
- package/dist/scheduler/schedule-store.d.ts +112 -0
- package/dist/scheduler/schedule-store.d.ts.map +1 -0
- package/dist/scheduler/schedule-store.js +259 -0
- package/dist/scheduler/schedule-store.js.map +1 -0
- package/dist/scheduler/token-keep-alive.d.ts +49 -0
- package/dist/scheduler/token-keep-alive.d.ts.map +1 -0
- package/dist/scheduler/token-keep-alive.js +102 -0
- package/dist/scheduler/token-keep-alive.js.map +1 -0
- package/dist/scheduler/types.d.ts +96 -0
- package/dist/scheduler/types.d.ts.map +1 -0
- package/dist/scheduler/types.js +21 -0
- package/dist/scheduler/types.js.map +1 -0
- package/dist/setup/setup-prompt.d.ts +2 -0
- package/dist/setup/setup-prompt.d.ts.map +1 -0
- package/dist/setup/setup-prompt.js +138 -0
- package/dist/setup/setup-prompt.js.map +1 -0
- package/dist/setup/setup-server.d.ts +8 -0
- package/dist/setup/setup-server.d.ts.map +1 -0
- package/dist/setup/setup-server.js +71 -0
- package/dist/setup/setup-server.js.map +1 -0
- package/dist/setup/setup-tools.d.ts +13 -0
- package/dist/setup/setup-tools.d.ts.map +1 -0
- package/dist/setup/setup-tools.js +103 -0
- package/dist/setup/setup-tools.js.map +1 -0
- package/dist/setup/setup-websocket.d.ts +6 -0
- package/dist/setup/setup-websocket.d.ts.map +1 -0
- package/dist/setup/setup-websocket.js +312 -0
- package/dist/setup/setup-websocket.js.map +1 -0
- package/dist/skills/index.d.ts +10 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +26 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/skill-executor.d.ts +48 -0
- package/dist/skills/skill-executor.d.ts.map +1 -0
- package/dist/skills/skill-executor.js +483 -0
- package/dist/skills/skill-executor.js.map +1 -0
- package/dist/skills/skill-loader.d.ts +40 -0
- package/dist/skills/skill-loader.d.ts.map +1 -0
- package/dist/skills/skill-loader.js +225 -0
- package/dist/skills/skill-loader.js.map +1 -0
- package/dist/skills/skill-matcher.d.ts +33 -0
- package/dist/skills/skill-matcher.d.ts.map +1 -0
- package/dist/skills/skill-matcher.js +190 -0
- package/dist/skills/skill-matcher.js.map +1 -0
- package/dist/skills/types.d.ts +123 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +12 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/tools/browser-tool.d.ts +149 -0
- package/dist/tools/browser-tool.d.ts.map +1 -0
- package/dist/tools/browser-tool.js +257 -0
- package/dist/tools/browser-tool.js.map +1 -0
- package/package.json +84 -0
- package/public/favicon.ico +0 -0
- package/public/setup.html +1026 -0
- package/public/viewer/icons/icon-192.png +0 -0
- package/public/viewer/icons/icon-512.png +0 -0
- package/public/viewer/js/modules/chat.js +1587 -0
- package/public/viewer/js/modules/dashboard.js +275 -0
- package/public/viewer/js/modules/graph.js +997 -0
- package/public/viewer/js/modules/memory.js +353 -0
- package/public/viewer/js/modules/settings.js +255 -0
- package/public/viewer/js/utils/api.js +169 -0
- package/public/viewer/js/utils/dom.js +92 -0
- package/public/viewer/js/utils/format.js +192 -0
- package/public/viewer/manifest.json +26 -0
- package/public/viewer/sw.js +131 -0
- package/public/viewer/viewer.css +500 -0
- package/public/viewer/viewer.html +1535 -0
- package/scripts/postinstall.js +118 -0
- package/templates/skills/document-analyze.md +63 -0
- package/templates/skills/heartbeat-report.md +75 -0
- package/templates/skills/image-translate.md +67 -0
- package/templates/workspace/skill-forge/DESIGN.md +115 -0
- package/templates/workspace/skill-forge/agents/architect.ts +295 -0
- package/templates/workspace/skill-forge/agents/developer.ts +364 -0
- package/templates/workspace/skill-forge/agents/qa.ts +313 -0
- package/templates/workspace/skill-forge/claude-api.ts +353 -0
- package/templates/workspace/skill-forge/discord-ui.ts +580 -0
- package/templates/workspace/skill-forge/error-handler.ts +354 -0
- package/templates/workspace/skill-forge/mama-integration.ts +357 -0
- package/templates/workspace/skill-forge/orchestrator.ts +495 -0
- package/templates/workspace/skill-forge/output/generated-skills/skills/hello-world/README.md +24 -0
- package/templates/workspace/skill-forge/output/generated-skills/skills/hello-world/index.ts +79 -0
- package/templates/workspace/skill-forge/output/generated-skills/skills/hello-world/types.ts +17 -0
- package/templates/workspace/skill-forge/package.json +21 -0
- package/templates/workspace/skill-forge/state/session.json +132 -0
- package/templates/workspace/skill-forge/test-e2e.ts +139 -0
- package/templates/workspace/skill-forge/tsconfig.json +20 -0
- package/templates/workspace/skill-forge/types.ts +159 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Job Lock for preventing concurrent execution
|
|
3
|
+
*
|
|
4
|
+
* Simple in-memory lock mechanism for single-process environments.
|
|
5
|
+
* For multi-process scenarios, use a distributed lock (Redis, etc.)
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Lock information
|
|
9
|
+
*/
|
|
10
|
+
export interface LockInfo {
|
|
11
|
+
/** Job ID */
|
|
12
|
+
jobId: string;
|
|
13
|
+
/** When lock was acquired */
|
|
14
|
+
acquiredAt: Date;
|
|
15
|
+
/** Lock timeout in ms (0 = no timeout) */
|
|
16
|
+
timeout: number;
|
|
17
|
+
}
|
|
18
|
+
export declare class JobLock {
|
|
19
|
+
private locks;
|
|
20
|
+
private readonly defaultTimeout;
|
|
21
|
+
/**
|
|
22
|
+
* Create a new JobLock instance
|
|
23
|
+
*
|
|
24
|
+
* @param defaultTimeout - Default lock timeout in ms (0 = no timeout)
|
|
25
|
+
*/
|
|
26
|
+
constructor(defaultTimeout?: number);
|
|
27
|
+
/**
|
|
28
|
+
* Attempt to acquire a lock for a job
|
|
29
|
+
*
|
|
30
|
+
* @param jobId - Job identifier
|
|
31
|
+
* @param timeout - Lock timeout in ms (overrides default)
|
|
32
|
+
* @returns true if lock acquired, false if already locked
|
|
33
|
+
*/
|
|
34
|
+
acquire(jobId: string, timeout?: number): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Release a lock for a job
|
|
37
|
+
*
|
|
38
|
+
* @param jobId - Job identifier
|
|
39
|
+
* @returns true if lock was released, false if not locked
|
|
40
|
+
*/
|
|
41
|
+
release(jobId: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Check if a job is currently locked
|
|
44
|
+
*
|
|
45
|
+
* Also handles timeout expiration.
|
|
46
|
+
*
|
|
47
|
+
* @param jobId - Job identifier
|
|
48
|
+
* @returns true if locked, false otherwise
|
|
49
|
+
*/
|
|
50
|
+
isLocked(jobId: string): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Get lock information for a job
|
|
53
|
+
*
|
|
54
|
+
* @param jobId - Job identifier
|
|
55
|
+
* @returns Lock info or null if not locked
|
|
56
|
+
*/
|
|
57
|
+
getLockInfo(jobId: string): LockInfo | null;
|
|
58
|
+
/**
|
|
59
|
+
* Get all currently held locks
|
|
60
|
+
*
|
|
61
|
+
* @returns Array of lock info
|
|
62
|
+
*/
|
|
63
|
+
getAllLocks(): LockInfo[];
|
|
64
|
+
/**
|
|
65
|
+
* Release all locks
|
|
66
|
+
*/
|
|
67
|
+
releaseAll(): void;
|
|
68
|
+
/**
|
|
69
|
+
* Get the number of currently held locks
|
|
70
|
+
*/
|
|
71
|
+
get size(): number;
|
|
72
|
+
/**
|
|
73
|
+
* Execute a function with a lock
|
|
74
|
+
*
|
|
75
|
+
* Automatically acquires and releases lock around the function.
|
|
76
|
+
*
|
|
77
|
+
* @param jobId - Job identifier
|
|
78
|
+
* @param fn - Function to execute
|
|
79
|
+
* @param timeout - Lock timeout in ms
|
|
80
|
+
* @returns Result of the function
|
|
81
|
+
* @throws Error if lock cannot be acquired
|
|
82
|
+
*/
|
|
83
|
+
withLock<T>(jobId: string, fn: () => Promise<T>, timeout?: number): Promise<T>;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=job-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-lock.d.ts","sourceRoot":"","sources":["../../src/scheduler/job-lock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,UAAU,EAAE,IAAI,CAAC;IACjB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC;;;;OAIG;gBACS,cAAc,SAAI;IAI9B;;;;;;OAMG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAgBjD;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI/B;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAoBhC;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAO3C;;;;OAIG;IACH,WAAW,IAAI,QAAQ,EAAE;IAazB;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;;;;;;;OAUG;IACG,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAWrF"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Job Lock for preventing concurrent execution
|
|
4
|
+
*
|
|
5
|
+
* Simple in-memory lock mechanism for single-process environments.
|
|
6
|
+
* For multi-process scenarios, use a distributed lock (Redis, etc.)
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.JobLock = void 0;
|
|
10
|
+
class JobLock {
|
|
11
|
+
locks = new Map();
|
|
12
|
+
defaultTimeout;
|
|
13
|
+
/**
|
|
14
|
+
* Create a new JobLock instance
|
|
15
|
+
*
|
|
16
|
+
* @param defaultTimeout - Default lock timeout in ms (0 = no timeout)
|
|
17
|
+
*/
|
|
18
|
+
constructor(defaultTimeout = 0) {
|
|
19
|
+
this.defaultTimeout = defaultTimeout;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Attempt to acquire a lock for a job
|
|
23
|
+
*
|
|
24
|
+
* @param jobId - Job identifier
|
|
25
|
+
* @param timeout - Lock timeout in ms (overrides default)
|
|
26
|
+
* @returns true if lock acquired, false if already locked
|
|
27
|
+
*/
|
|
28
|
+
acquire(jobId, timeout) {
|
|
29
|
+
// Check if already locked
|
|
30
|
+
if (this.isLocked(jobId)) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
// Acquire lock
|
|
34
|
+
this.locks.set(jobId, {
|
|
35
|
+
jobId,
|
|
36
|
+
acquiredAt: new Date(),
|
|
37
|
+
timeout: timeout ?? this.defaultTimeout,
|
|
38
|
+
});
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Release a lock for a job
|
|
43
|
+
*
|
|
44
|
+
* @param jobId - Job identifier
|
|
45
|
+
* @returns true if lock was released, false if not locked
|
|
46
|
+
*/
|
|
47
|
+
release(jobId) {
|
|
48
|
+
return this.locks.delete(jobId);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check if a job is currently locked
|
|
52
|
+
*
|
|
53
|
+
* Also handles timeout expiration.
|
|
54
|
+
*
|
|
55
|
+
* @param jobId - Job identifier
|
|
56
|
+
* @returns true if locked, false otherwise
|
|
57
|
+
*/
|
|
58
|
+
isLocked(jobId) {
|
|
59
|
+
const lock = this.locks.get(jobId);
|
|
60
|
+
if (!lock) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
// Check for timeout expiration
|
|
64
|
+
if (lock.timeout > 0) {
|
|
65
|
+
const elapsed = Date.now() - lock.acquiredAt.getTime();
|
|
66
|
+
if (elapsed >= lock.timeout) {
|
|
67
|
+
// Lock expired, release it
|
|
68
|
+
this.locks.delete(jobId);
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get lock information for a job
|
|
76
|
+
*
|
|
77
|
+
* @param jobId - Job identifier
|
|
78
|
+
* @returns Lock info or null if not locked
|
|
79
|
+
*/
|
|
80
|
+
getLockInfo(jobId) {
|
|
81
|
+
if (!this.isLocked(jobId)) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
return this.locks.get(jobId) ?? null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get all currently held locks
|
|
88
|
+
*
|
|
89
|
+
* @returns Array of lock info
|
|
90
|
+
*/
|
|
91
|
+
getAllLocks() {
|
|
92
|
+
// Filter out expired locks
|
|
93
|
+
const activeLocks = [];
|
|
94
|
+
for (const [jobId, lock] of this.locks) {
|
|
95
|
+
if (this.isLocked(jobId)) {
|
|
96
|
+
activeLocks.push(lock);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return activeLocks;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Release all locks
|
|
103
|
+
*/
|
|
104
|
+
releaseAll() {
|
|
105
|
+
this.locks.clear();
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get the number of currently held locks
|
|
109
|
+
*/
|
|
110
|
+
get size() {
|
|
111
|
+
return this.getAllLocks().length;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Execute a function with a lock
|
|
115
|
+
*
|
|
116
|
+
* Automatically acquires and releases lock around the function.
|
|
117
|
+
*
|
|
118
|
+
* @param jobId - Job identifier
|
|
119
|
+
* @param fn - Function to execute
|
|
120
|
+
* @param timeout - Lock timeout in ms
|
|
121
|
+
* @returns Result of the function
|
|
122
|
+
* @throws Error if lock cannot be acquired
|
|
123
|
+
*/
|
|
124
|
+
async withLock(jobId, fn, timeout) {
|
|
125
|
+
if (!this.acquire(jobId, timeout)) {
|
|
126
|
+
throw new Error(`Failed to acquire lock for job: ${jobId}`);
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
return await fn();
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
this.release(jobId);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.JobLock = JobLock;
|
|
137
|
+
//# sourceMappingURL=job-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-lock.js","sourceRoot":"","sources":["../../src/scheduler/job-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schedule recovery module
|
|
3
|
+
*
|
|
4
|
+
* Recovers enabled schedules from the database on server startup
|
|
5
|
+
* and registers them with the scheduler.
|
|
6
|
+
*/
|
|
7
|
+
import { CronScheduler } from './cron-scheduler.js';
|
|
8
|
+
import { ScheduleStore } from './schedule-store.js';
|
|
9
|
+
/**
|
|
10
|
+
* Recovery result information
|
|
11
|
+
*/
|
|
12
|
+
export interface RecoveryResult {
|
|
13
|
+
/** Number of schedules recovered */
|
|
14
|
+
recovered: number;
|
|
15
|
+
/** Number of schedules that failed to recover */
|
|
16
|
+
failed: number;
|
|
17
|
+
/** Details of recovered schedules */
|
|
18
|
+
schedules: Array<{
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
cronExpr: string;
|
|
22
|
+
success: boolean;
|
|
23
|
+
error?: string;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Recovery options
|
|
28
|
+
*/
|
|
29
|
+
export interface RecoveryOptions {
|
|
30
|
+
/** Whether to log recovery progress */
|
|
31
|
+
verbose?: boolean;
|
|
32
|
+
/** Logger function (defaults to console.log) */
|
|
33
|
+
logger?: (message: string) => void;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Recover enabled schedules from the database and register with scheduler
|
|
37
|
+
*
|
|
38
|
+
* @param scheduler - The CronScheduler instance
|
|
39
|
+
* @param store - The ScheduleStore instance
|
|
40
|
+
* @param options - Recovery options
|
|
41
|
+
* @returns Recovery result with details
|
|
42
|
+
*/
|
|
43
|
+
export declare function recoverSchedules(scheduler: CronScheduler, store: ScheduleStore, options?: RecoveryOptions): RecoveryResult;
|
|
44
|
+
/**
|
|
45
|
+
* Sync scheduler state with database
|
|
46
|
+
*
|
|
47
|
+
* Updates next_run times in the database based on scheduler state.
|
|
48
|
+
* Call this after recovery to ensure database reflects current scheduler state.
|
|
49
|
+
*
|
|
50
|
+
* @param scheduler - The CronScheduler instance
|
|
51
|
+
* @param store - The ScheduleStore instance
|
|
52
|
+
*/
|
|
53
|
+
export declare function syncSchedulerState(scheduler: CronScheduler, store: ScheduleStore): void;
|
|
54
|
+
/**
|
|
55
|
+
* Create a schedule store event handler that persists changes to database
|
|
56
|
+
*
|
|
57
|
+
* @param store - The ScheduleStore instance
|
|
58
|
+
* @returns Event handler function for scheduler events
|
|
59
|
+
*/
|
|
60
|
+
export declare function createPersistenceHandler(store: ScheduleStore): {
|
|
61
|
+
/**
|
|
62
|
+
* Handle job started event
|
|
63
|
+
*/
|
|
64
|
+
onJobStarted(jobId: string): string;
|
|
65
|
+
/**
|
|
66
|
+
* Handle job completed event
|
|
67
|
+
*/
|
|
68
|
+
onJobCompleted(logId: string, success: boolean, output?: string, error?: string): void;
|
|
69
|
+
/**
|
|
70
|
+
* Handle job state change (enabled/disabled)
|
|
71
|
+
*/
|
|
72
|
+
onJobStateChanged(jobId: string, enabled: boolean): void;
|
|
73
|
+
/**
|
|
74
|
+
* Handle next run time update
|
|
75
|
+
*/
|
|
76
|
+
onNextRunUpdated(jobId: string, nextRun: Date | undefined): void;
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/scheduler/recovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,SAAS,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,aAAa,EACpB,OAAO,GAAE,eAAoB,GAC5B,cAAc,CA0DhB;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAUvF;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,aAAa;IAEzD;;OAEG;wBACiB,MAAM,GAAG,MAAM;IAInC;;OAEG;0BACmB,MAAM,WAAW,OAAO,WAAW,MAAM,UAAU,MAAM,GAAG,IAAI;IAItF;;OAEG;6BACsB,MAAM,WAAW,OAAO,GAAG,IAAI;IAIxD;;OAEG;4BACqB,MAAM,WAAW,IAAI,GAAG,SAAS,GAAG,IAAI;EAMnE"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Schedule recovery module
|
|
4
|
+
*
|
|
5
|
+
* Recovers enabled schedules from the database on server startup
|
|
6
|
+
* and registers them with the scheduler.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.recoverSchedules = recoverSchedules;
|
|
10
|
+
exports.syncSchedulerState = syncSchedulerState;
|
|
11
|
+
exports.createPersistenceHandler = createPersistenceHandler;
|
|
12
|
+
/**
|
|
13
|
+
* Recover enabled schedules from the database and register with scheduler
|
|
14
|
+
*
|
|
15
|
+
* @param scheduler - The CronScheduler instance
|
|
16
|
+
* @param store - The ScheduleStore instance
|
|
17
|
+
* @param options - Recovery options
|
|
18
|
+
* @returns Recovery result with details
|
|
19
|
+
*/
|
|
20
|
+
function recoverSchedules(scheduler, store, options = {}) {
|
|
21
|
+
const { verbose = false, logger = console.log } = options;
|
|
22
|
+
const result = {
|
|
23
|
+
recovered: 0,
|
|
24
|
+
failed: 0,
|
|
25
|
+
schedules: [],
|
|
26
|
+
};
|
|
27
|
+
// Get all enabled schedules from database
|
|
28
|
+
const enabledJobs = store.listEnabledJobs();
|
|
29
|
+
if (verbose) {
|
|
30
|
+
logger(`Found ${enabledJobs.length} enabled schedules to recover`);
|
|
31
|
+
}
|
|
32
|
+
for (const job of enabledJobs) {
|
|
33
|
+
const scheduleResult = {
|
|
34
|
+
id: job.id,
|
|
35
|
+
name: job.name,
|
|
36
|
+
cronExpr: job.cron_expr,
|
|
37
|
+
success: false,
|
|
38
|
+
error: undefined,
|
|
39
|
+
};
|
|
40
|
+
try {
|
|
41
|
+
// Register the job with the scheduler
|
|
42
|
+
scheduler.addJob({
|
|
43
|
+
id: job.id,
|
|
44
|
+
name: job.name,
|
|
45
|
+
cronExpr: job.cron_expr,
|
|
46
|
+
prompt: job.prompt,
|
|
47
|
+
enabled: true,
|
|
48
|
+
});
|
|
49
|
+
scheduleResult.success = true;
|
|
50
|
+
result.recovered++;
|
|
51
|
+
if (verbose) {
|
|
52
|
+
logger(` ✓ Recovered: ${job.name} (${job.cron_expr})`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
scheduleResult.error = error instanceof Error ? error.message : String(error);
|
|
57
|
+
result.failed++;
|
|
58
|
+
if (verbose) {
|
|
59
|
+
logger(` ✗ Failed: ${job.name} - ${scheduleResult.error}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
result.schedules.push(scheduleResult);
|
|
63
|
+
}
|
|
64
|
+
if (verbose) {
|
|
65
|
+
logger(`Recovery complete: ${result.recovered} recovered, ${result.failed} failed`);
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Sync scheduler state with database
|
|
71
|
+
*
|
|
72
|
+
* Updates next_run times in the database based on scheduler state.
|
|
73
|
+
* Call this after recovery to ensure database reflects current scheduler state.
|
|
74
|
+
*
|
|
75
|
+
* @param scheduler - The CronScheduler instance
|
|
76
|
+
* @param store - The ScheduleStore instance
|
|
77
|
+
*/
|
|
78
|
+
function syncSchedulerState(scheduler, store) {
|
|
79
|
+
const jobs = scheduler.listJobs();
|
|
80
|
+
for (const job of jobs) {
|
|
81
|
+
if (job.nextRun) {
|
|
82
|
+
store.updateJob(job.id, {
|
|
83
|
+
next_run: job.nextRun.getTime(),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Create a schedule store event handler that persists changes to database
|
|
90
|
+
*
|
|
91
|
+
* @param store - The ScheduleStore instance
|
|
92
|
+
* @returns Event handler function for scheduler events
|
|
93
|
+
*/
|
|
94
|
+
function createPersistenceHandler(store) {
|
|
95
|
+
return {
|
|
96
|
+
/**
|
|
97
|
+
* Handle job started event
|
|
98
|
+
*/
|
|
99
|
+
onJobStarted(jobId) {
|
|
100
|
+
return store.logStart(jobId);
|
|
101
|
+
},
|
|
102
|
+
/**
|
|
103
|
+
* Handle job completed event
|
|
104
|
+
*/
|
|
105
|
+
onJobCompleted(logId, success, output, error) {
|
|
106
|
+
store.logFinish(logId, success ? 'success' : 'failed', output, error);
|
|
107
|
+
},
|
|
108
|
+
/**
|
|
109
|
+
* Handle job state change (enabled/disabled)
|
|
110
|
+
*/
|
|
111
|
+
onJobStateChanged(jobId, enabled) {
|
|
112
|
+
store.updateJob(jobId, { enabled });
|
|
113
|
+
},
|
|
114
|
+
/**
|
|
115
|
+
* Handle next run time update
|
|
116
|
+
*/
|
|
117
|
+
onNextRunUpdated(jobId, nextRun) {
|
|
118
|
+
store.updateJob(jobId, {
|
|
119
|
+
next_run: nextRun ? nextRun.getTime() : null,
|
|
120
|
+
});
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/scheduler/recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schedule persistence store using SQLite
|
|
3
|
+
*
|
|
4
|
+
* Stores cron job definitions and execution logs in SQLite database.
|
|
5
|
+
* Supports server restart recovery and execution history tracking.
|
|
6
|
+
*/
|
|
7
|
+
import Database from 'better-sqlite3';
|
|
8
|
+
/**
|
|
9
|
+
* Persisted schedule (cron job) definition
|
|
10
|
+
*/
|
|
11
|
+
export interface Schedule {
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
cron_expr: string;
|
|
15
|
+
prompt: string;
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
last_run: number | null;
|
|
18
|
+
next_run: number | null;
|
|
19
|
+
created_at: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Schedule execution log entry
|
|
23
|
+
*/
|
|
24
|
+
export interface ScheduleLog {
|
|
25
|
+
id: string;
|
|
26
|
+
schedule_id: string;
|
|
27
|
+
started_at: number;
|
|
28
|
+
finished_at: number | null;
|
|
29
|
+
status: 'running' | 'success' | 'failed';
|
|
30
|
+
output: string | null;
|
|
31
|
+
error: string | null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Input for creating a new schedule
|
|
35
|
+
*/
|
|
36
|
+
export type CreateScheduleInput = Omit<Schedule, 'id' | 'created_at' | 'last_run'>;
|
|
37
|
+
/**
|
|
38
|
+
* Input for updating a schedule
|
|
39
|
+
*/
|
|
40
|
+
export type UpdateScheduleInput = Partial<Omit<Schedule, 'id' | 'created_at'>>;
|
|
41
|
+
/**
|
|
42
|
+
* SQLite-backed store for schedules and execution logs
|
|
43
|
+
*/
|
|
44
|
+
export declare class ScheduleStore {
|
|
45
|
+
private db;
|
|
46
|
+
constructor(db: Database.Database);
|
|
47
|
+
/**
|
|
48
|
+
* Run database migration to create tables
|
|
49
|
+
*/
|
|
50
|
+
private runMigration;
|
|
51
|
+
/**
|
|
52
|
+
* Create a new schedule
|
|
53
|
+
*/
|
|
54
|
+
createJob(input: CreateScheduleInput): string;
|
|
55
|
+
/**
|
|
56
|
+
* Get a schedule by ID
|
|
57
|
+
*/
|
|
58
|
+
getJob(id: string): Schedule | null;
|
|
59
|
+
/**
|
|
60
|
+
* List all schedules
|
|
61
|
+
*/
|
|
62
|
+
listJobs(): Schedule[];
|
|
63
|
+
/**
|
|
64
|
+
* List only enabled schedules
|
|
65
|
+
*/
|
|
66
|
+
listEnabledJobs(): Schedule[];
|
|
67
|
+
/**
|
|
68
|
+
* Update a schedule
|
|
69
|
+
*/
|
|
70
|
+
updateJob(id: string, updates: UpdateScheduleInput): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Delete a schedule (cascade deletes logs)
|
|
73
|
+
*/
|
|
74
|
+
deleteJob(id: string): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Log the start of a schedule execution
|
|
77
|
+
*/
|
|
78
|
+
logStart(scheduleId: string): string;
|
|
79
|
+
/**
|
|
80
|
+
* Log the finish of a schedule execution
|
|
81
|
+
*/
|
|
82
|
+
logFinish(logId: string, status: 'success' | 'failed', output?: string, error?: string): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Get execution logs for a schedule
|
|
85
|
+
*/
|
|
86
|
+
getLogs(scheduleId: string, limit?: number, offset?: number): ScheduleLog[];
|
|
87
|
+
/**
|
|
88
|
+
* Get the last execution for a schedule
|
|
89
|
+
*/
|
|
90
|
+
getLastExecution(scheduleId: string): ScheduleLog | null;
|
|
91
|
+
/**
|
|
92
|
+
* Get the last execution across all schedules (for heartbeat status)
|
|
93
|
+
*/
|
|
94
|
+
getLastExecutionGlobal(): ScheduleLog | null;
|
|
95
|
+
/**
|
|
96
|
+
* Get a specific log entry by ID
|
|
97
|
+
*/
|
|
98
|
+
getLog(logId: string): ScheduleLog | null;
|
|
99
|
+
/**
|
|
100
|
+
* Convert database row to Schedule object
|
|
101
|
+
*/
|
|
102
|
+
private rowToSchedule;
|
|
103
|
+
/**
|
|
104
|
+
* Convert database row to ScheduleLog object
|
|
105
|
+
*/
|
|
106
|
+
private rowToLog;
|
|
107
|
+
/**
|
|
108
|
+
* Close the database connection
|
|
109
|
+
*/
|
|
110
|
+
close(): void;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=schedule-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-store.d.ts","sourceRoot":"","sources":["../../src/scheduler/schedule-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAOtC;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACzC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,YAAY,GAAG,UAAU,CAAC,CAAC;AAEnF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC;AA+B/E;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAoB;gBAElB,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAKjC;;OAEG;IACH,OAAO,CAAC,YAAY;IAuCpB;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM;IAU7C;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAMnC;;OAEG;IACH,QAAQ,IAAI,QAAQ,EAAE;IAMtB;;OAEG;IACH,eAAe,IAAI,QAAQ,EAAE;IAQ7B;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO;IAqC5D;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAU9B;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAgBpC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO;IAUhG;;OAEG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,MAAM,SAAI,GAAG,WAAW,EAAE;IAWlE;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAWxD;;OAEG;IACH,sBAAsB,IAAI,WAAW,GAAG,IAAI;IAU5C;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAUzC;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAYhB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
|