@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,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cron API router for /api/cron endpoints
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ScheduleStoreAdapter = exports.InMemoryLogStore = void 0;
|
|
7
|
+
exports.createCronRouter = createCronRouter;
|
|
8
|
+
const express_1 = require("express");
|
|
9
|
+
const types_js_1 = require("./types.js");
|
|
10
|
+
const error_handler_js_1 = require("./error-handler.js");
|
|
11
|
+
/**
|
|
12
|
+
* In-memory execution log store (placeholder until S6)
|
|
13
|
+
*/
|
|
14
|
+
class InMemoryLogStore {
|
|
15
|
+
logs = new Map();
|
|
16
|
+
async getLogs(jobId, limit, offset) {
|
|
17
|
+
const jobLogs = this.logs.get(jobId) || [];
|
|
18
|
+
return jobLogs.slice(offset, offset + limit);
|
|
19
|
+
}
|
|
20
|
+
async addLog(jobId, log) {
|
|
21
|
+
if (!this.logs.has(jobId)) {
|
|
22
|
+
this.logs.set(jobId, []);
|
|
23
|
+
}
|
|
24
|
+
this.logs.get(jobId).unshift(log); // Most recent first
|
|
25
|
+
}
|
|
26
|
+
async updateLog(logId, updates) {
|
|
27
|
+
for (const logs of this.logs.values()) {
|
|
28
|
+
const log = logs.find((l) => l.id === logId);
|
|
29
|
+
if (log) {
|
|
30
|
+
Object.assign(log, updates);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.InMemoryLogStore = InMemoryLogStore;
|
|
37
|
+
/**
|
|
38
|
+
* Adapter to use ScheduleStore as ExecutionLogStore
|
|
39
|
+
*
|
|
40
|
+
* Wraps ScheduleStore to provide ExecutionLogStore interface.
|
|
41
|
+
* This allows the API handlers to use persistent SQLite storage.
|
|
42
|
+
*/
|
|
43
|
+
class ScheduleStoreAdapter {
|
|
44
|
+
store;
|
|
45
|
+
constructor(store) {
|
|
46
|
+
this.store = store;
|
|
47
|
+
}
|
|
48
|
+
async getLogs(jobId, limit, offset) {
|
|
49
|
+
const logs = this.store.getLogs(jobId, limit, offset);
|
|
50
|
+
return logs.map((log) => ({
|
|
51
|
+
id: log.id,
|
|
52
|
+
started_at: log.started_at,
|
|
53
|
+
finished_at: log.finished_at,
|
|
54
|
+
status: log.status,
|
|
55
|
+
output: log.output,
|
|
56
|
+
error: log.error,
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
async addLog(jobId, log) {
|
|
60
|
+
// Use logStart for initial log creation
|
|
61
|
+
const logId = this.store.logStart(jobId);
|
|
62
|
+
// If the log has a specific ID, we need to track the mapping
|
|
63
|
+
// For now, we just use the store's generated ID
|
|
64
|
+
if (log.status !== 'running') {
|
|
65
|
+
this.store.logFinish(logId, log.status === 'success' ? 'success' : 'failed', log.output || undefined, log.error || undefined);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async updateLog(logId, updates) {
|
|
69
|
+
if (updates.status && updates.status !== 'running') {
|
|
70
|
+
this.store.logFinish(logId, updates.status === 'success' ? 'success' : 'failed', updates.output || undefined, updates.error || undefined);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.ScheduleStoreAdapter = ScheduleStoreAdapter;
|
|
75
|
+
/**
|
|
76
|
+
* Create cron API router
|
|
77
|
+
*/
|
|
78
|
+
function createCronRouter(scheduler, logStore = new InMemoryLogStore()) {
|
|
79
|
+
const router = (0, express_1.Router)();
|
|
80
|
+
// GET /api/cron - List all jobs
|
|
81
|
+
router.get('/', (0, error_handler_js_1.asyncHandler)(async (_req, res) => {
|
|
82
|
+
const jobs = scheduler.listJobs();
|
|
83
|
+
const apiJobs = jobs.map(types_js_1.toApiCronJob);
|
|
84
|
+
res.json({ jobs: apiJobs });
|
|
85
|
+
}));
|
|
86
|
+
// POST /api/cron - Create a new job
|
|
87
|
+
router.post('/', (0, error_handler_js_1.asyncHandler)(async (req, res) => {
|
|
88
|
+
const body = req.body;
|
|
89
|
+
(0, error_handler_js_1.validateRequired)(body, ['name', 'cron_expr', 'prompt']);
|
|
90
|
+
const id = `job_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
91
|
+
scheduler.addJob({
|
|
92
|
+
id,
|
|
93
|
+
name: body.name,
|
|
94
|
+
cronExpr: body.cron_expr,
|
|
95
|
+
prompt: body.prompt,
|
|
96
|
+
enabled: body.enabled ?? true,
|
|
97
|
+
});
|
|
98
|
+
res.json({ id, created: true });
|
|
99
|
+
}));
|
|
100
|
+
// GET /api/cron/:id - Get a specific job
|
|
101
|
+
router.get('/:id', (0, error_handler_js_1.asyncHandler)(async (req, res) => {
|
|
102
|
+
const id = req.params.id;
|
|
103
|
+
const job = scheduler.getJob(id);
|
|
104
|
+
if (!job) {
|
|
105
|
+
throw new types_js_1.ApiError(`Job not found: ${id}`, 404, 'NOT_FOUND');
|
|
106
|
+
}
|
|
107
|
+
res.json({ job: (0, types_js_1.toApiCronJob)(job) });
|
|
108
|
+
}));
|
|
109
|
+
// PUT /api/cron/:id - Update a job
|
|
110
|
+
router.put('/:id', (0, error_handler_js_1.asyncHandler)(async (req, res) => {
|
|
111
|
+
const id = req.params.id;
|
|
112
|
+
const body = req.body;
|
|
113
|
+
const job = scheduler.getJob(id);
|
|
114
|
+
if (!job) {
|
|
115
|
+
throw new types_js_1.ApiError(`Job not found: ${id}`, 404, 'NOT_FOUND');
|
|
116
|
+
}
|
|
117
|
+
// Update job - need to remove and re-add for scheduler
|
|
118
|
+
// First get current values
|
|
119
|
+
const currentJob = scheduler.getJob(id);
|
|
120
|
+
// Build updated config
|
|
121
|
+
const updatedConfig = {
|
|
122
|
+
id: id,
|
|
123
|
+
name: body.name ?? currentJob.name,
|
|
124
|
+
cronExpr: body.cron_expr ?? currentJob.cronExpr,
|
|
125
|
+
prompt: body.prompt ?? currentJob.prompt,
|
|
126
|
+
enabled: body.enabled ?? currentJob.enabled,
|
|
127
|
+
};
|
|
128
|
+
// Remove old job and add updated one
|
|
129
|
+
scheduler.removeJob(id);
|
|
130
|
+
scheduler.addJob(updatedConfig);
|
|
131
|
+
res.json({ updated: true });
|
|
132
|
+
}));
|
|
133
|
+
// DELETE /api/cron/:id - Delete a job
|
|
134
|
+
router.delete('/:id', (0, error_handler_js_1.asyncHandler)(async (req, res) => {
|
|
135
|
+
const id = req.params.id;
|
|
136
|
+
const job = scheduler.getJob(id);
|
|
137
|
+
if (!job) {
|
|
138
|
+
throw new types_js_1.ApiError(`Job not found: ${id}`, 404, 'NOT_FOUND');
|
|
139
|
+
}
|
|
140
|
+
scheduler.removeJob(id);
|
|
141
|
+
res.json({ deleted: true });
|
|
142
|
+
}));
|
|
143
|
+
// POST /api/cron/:id/run - Run job immediately
|
|
144
|
+
router.post('/:id/run', (0, error_handler_js_1.asyncHandler)(async (req, res) => {
|
|
145
|
+
const id = req.params.id;
|
|
146
|
+
const job = scheduler.getJob(id);
|
|
147
|
+
if (!job) {
|
|
148
|
+
throw new types_js_1.ApiError(`Job not found: ${id}`, 404, 'NOT_FOUND');
|
|
149
|
+
}
|
|
150
|
+
const executionId = `exec_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
151
|
+
// Create log entry for this execution
|
|
152
|
+
const log = {
|
|
153
|
+
id: executionId,
|
|
154
|
+
started_at: Date.now(),
|
|
155
|
+
finished_at: null,
|
|
156
|
+
status: 'running',
|
|
157
|
+
output: null,
|
|
158
|
+
error: null,
|
|
159
|
+
};
|
|
160
|
+
await logStore.addLog(id, log);
|
|
161
|
+
// Run the job asynchronously
|
|
162
|
+
scheduler
|
|
163
|
+
.runNow(id)
|
|
164
|
+
.then(async (result) => {
|
|
165
|
+
await logStore.updateLog(executionId, {
|
|
166
|
+
finished_at: Date.now(),
|
|
167
|
+
status: result.success ? 'success' : 'failed',
|
|
168
|
+
output: result.success ? 'Execution completed' : null,
|
|
169
|
+
error: result.error || null,
|
|
170
|
+
});
|
|
171
|
+
})
|
|
172
|
+
.catch(async (err) => {
|
|
173
|
+
await logStore.updateLog(executionId, {
|
|
174
|
+
finished_at: Date.now(),
|
|
175
|
+
status: 'failed',
|
|
176
|
+
error: err.message,
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
res.json({ execution_id: executionId, started: true });
|
|
180
|
+
}));
|
|
181
|
+
// GET /api/cron/:id/logs - Get execution logs
|
|
182
|
+
router.get('/:id/logs', (0, error_handler_js_1.asyncHandler)(async (req, res) => {
|
|
183
|
+
const id = req.params.id;
|
|
184
|
+
const limit = parseInt(req.query.limit) || 20;
|
|
185
|
+
const offset = parseInt(req.query.offset) || 0;
|
|
186
|
+
const job = scheduler.getJob(id);
|
|
187
|
+
if (!job) {
|
|
188
|
+
throw new types_js_1.ApiError(`Job not found: ${id}`, 404, 'NOT_FOUND');
|
|
189
|
+
}
|
|
190
|
+
const logs = await logStore.getLogs(id, limit, offset);
|
|
191
|
+
res.json({ logs });
|
|
192
|
+
}));
|
|
193
|
+
return router;
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=cron-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron-handler.js","sourceRoot":"","sources":["../../src/api/cron-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error handling middleware for API
|
|
3
|
+
*/
|
|
4
|
+
import type { Request, Response, NextFunction } from 'express';
|
|
5
|
+
export { ApiError } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Express error handling middleware
|
|
8
|
+
*/
|
|
9
|
+
export declare function errorHandler(err: Error, _req: Request, res: Response, _next: NextFunction): void;
|
|
10
|
+
/**
|
|
11
|
+
* Async handler wrapper to catch promise rejections
|
|
12
|
+
*/
|
|
13
|
+
export declare function asyncHandler<T>(fn: (req: Request, res: Response, next: NextFunction) => Promise<T>): (req: Request, res: Response, next: NextFunction) => void;
|
|
14
|
+
/**
|
|
15
|
+
* Validate required fields in request body
|
|
16
|
+
*/
|
|
17
|
+
export declare function validateRequired(body: Record<string, unknown>, fields: string[]): void;
|
|
18
|
+
/**
|
|
19
|
+
* 404 handler for unmatched routes
|
|
20
|
+
*/
|
|
21
|
+
export declare function notFoundHandler(req: Request, res: Response, _next: NextFunction): void;
|
|
22
|
+
//# sourceMappingURL=error-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/api/error-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI/D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CA0BhG;AAoCD;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,GAClE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAI3D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAOtF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAMtF"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Error handling middleware for API
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ApiError = void 0;
|
|
7
|
+
exports.errorHandler = errorHandler;
|
|
8
|
+
exports.asyncHandler = asyncHandler;
|
|
9
|
+
exports.validateRequired = validateRequired;
|
|
10
|
+
exports.notFoundHandler = notFoundHandler;
|
|
11
|
+
const types_js_1 = require("./types.js");
|
|
12
|
+
// Re-export ApiError for convenience
|
|
13
|
+
var types_js_2 = require("./types.js");
|
|
14
|
+
Object.defineProperty(exports, "ApiError", { enumerable: true, get: function () { return types_js_2.ApiError; } });
|
|
15
|
+
const types_js_3 = require("../scheduler/types.js");
|
|
16
|
+
/**
|
|
17
|
+
* Express error handling middleware
|
|
18
|
+
*/
|
|
19
|
+
function errorHandler(err, _req, res, _next) {
|
|
20
|
+
console.error('API Error:', err);
|
|
21
|
+
// Handle ApiError instances
|
|
22
|
+
if (err instanceof types_js_1.ApiError) {
|
|
23
|
+
res.status(err.statusCode).json(err.toResponse());
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
// Handle SchedulerError instances
|
|
27
|
+
if (err instanceof types_js_3.SchedulerError) {
|
|
28
|
+
const statusCode = getStatusCodeForSchedulerError(err.code);
|
|
29
|
+
const response = {
|
|
30
|
+
error: err.message,
|
|
31
|
+
code: mapSchedulerErrorCode(err.code),
|
|
32
|
+
};
|
|
33
|
+
res.status(statusCode).json(response);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
// Handle generic errors
|
|
37
|
+
const response = {
|
|
38
|
+
error: 'Internal server error',
|
|
39
|
+
code: 'INTERNAL_ERROR',
|
|
40
|
+
};
|
|
41
|
+
res.status(500).json(response);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Map SchedulerError code to HTTP status code
|
|
45
|
+
*/
|
|
46
|
+
function getStatusCodeForSchedulerError(code) {
|
|
47
|
+
switch (code) {
|
|
48
|
+
case 'INVALID_CRON':
|
|
49
|
+
case 'JOB_EXISTS':
|
|
50
|
+
return 400;
|
|
51
|
+
case 'JOB_NOT_FOUND':
|
|
52
|
+
return 404;
|
|
53
|
+
case 'JOB_RUNNING':
|
|
54
|
+
return 409;
|
|
55
|
+
default:
|
|
56
|
+
return 500;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Map SchedulerError code to ApiErrorCode
|
|
61
|
+
*/
|
|
62
|
+
function mapSchedulerErrorCode(code) {
|
|
63
|
+
switch (code) {
|
|
64
|
+
case 'INVALID_CRON':
|
|
65
|
+
case 'JOB_EXISTS':
|
|
66
|
+
return 'VALIDATION_ERROR';
|
|
67
|
+
case 'JOB_NOT_FOUND':
|
|
68
|
+
return 'NOT_FOUND';
|
|
69
|
+
case 'JOB_RUNNING':
|
|
70
|
+
return 'JOB_RUNNING';
|
|
71
|
+
default:
|
|
72
|
+
return 'INTERNAL_ERROR';
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Async handler wrapper to catch promise rejections
|
|
77
|
+
*/
|
|
78
|
+
function asyncHandler(fn) {
|
|
79
|
+
return (req, res, next) => {
|
|
80
|
+
Promise.resolve(fn(req, res, next)).catch(next);
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Validate required fields in request body
|
|
85
|
+
*/
|
|
86
|
+
function validateRequired(body, fields) {
|
|
87
|
+
const missing = fields.filter((field) => body[field] === undefined);
|
|
88
|
+
if (missing.length > 0) {
|
|
89
|
+
throw new types_js_1.ApiError(`Missing required fields: ${missing.join(', ')}`, 400, 'BAD_REQUEST', {
|
|
90
|
+
missing,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 404 handler for unmatched routes
|
|
96
|
+
*/
|
|
97
|
+
function notFoundHandler(req, res, _next) {
|
|
98
|
+
const response = {
|
|
99
|
+
error: `Route not found: ${req.method} ${req.path}`,
|
|
100
|
+
code: 'NOT_FOUND',
|
|
101
|
+
};
|
|
102
|
+
res.status(404).json(response);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/api/error-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heartbeat API router for /api/heartbeat endpoints
|
|
3
|
+
*/
|
|
4
|
+
import { Router } from 'express';
|
|
5
|
+
import { CronScheduler } from '../scheduler/index.js';
|
|
6
|
+
import type { LastExecution } from './types.js';
|
|
7
|
+
import type { ExecutionLogStore } from './cron-handler.js';
|
|
8
|
+
/**
|
|
9
|
+
* Default heartbeat prompt for scheduled reports
|
|
10
|
+
*/
|
|
11
|
+
export declare const DEFAULT_HEARTBEAT_PROMPT = "\uD83D\uDEA8 \uC885\uD569\uBCF4\uACE0 \uCCB4\uD06C\uB9AC\uC2A4\uD2B8:\n1. MAMA \uB85C\uB4DC: load_checkpoint\n2. \uB370\uC774\uD130 \uC218\uC9D1: \uCD5C\uADFC \uD65C\uB3D9 \uAC80\uC0C9\n3. \uBCF4\uACE0\uC11C \uC791\uC131: \uC694\uC57D \uC0DD\uC131\n4. \uBA54\uC2E0\uC800 \uC804\uC1A1 (\uC124\uC815\uB41C \uACBD\uC6B0)\n5. MAMA \uC800\uC7A5: checkpoint";
|
|
12
|
+
/**
|
|
13
|
+
* Heartbeat execution tracker interface
|
|
14
|
+
*/
|
|
15
|
+
export interface HeartbeatTracker {
|
|
16
|
+
/** Get the last heartbeat execution */
|
|
17
|
+
getLastExecution(): Promise<LastExecution | null>;
|
|
18
|
+
/** Record a heartbeat execution */
|
|
19
|
+
recordExecution(execution: LastExecution): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* In-memory heartbeat tracker (placeholder until S6)
|
|
23
|
+
*/
|
|
24
|
+
export declare class InMemoryHeartbeatTracker implements HeartbeatTracker {
|
|
25
|
+
private lastExecution;
|
|
26
|
+
getLastExecution(): Promise<LastExecution | null>;
|
|
27
|
+
recordExecution(execution: LastExecution): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Options for creating heartbeat router
|
|
31
|
+
*/
|
|
32
|
+
export interface HeartbeatRouterOptions {
|
|
33
|
+
/** Scheduler instance */
|
|
34
|
+
scheduler: CronScheduler;
|
|
35
|
+
/** Log store for execution logs */
|
|
36
|
+
logStore: ExecutionLogStore;
|
|
37
|
+
/** Heartbeat tracker */
|
|
38
|
+
tracker?: HeartbeatTracker;
|
|
39
|
+
/** Heartbeat execution callback */
|
|
40
|
+
onHeartbeat?: (prompt: string) => Promise<{
|
|
41
|
+
success: boolean;
|
|
42
|
+
error?: string;
|
|
43
|
+
}>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Create heartbeat API router
|
|
47
|
+
*/
|
|
48
|
+
export declare function createHeartbeatRouter(options: HeartbeatRouterOptions): Router;
|
|
49
|
+
//# sourceMappingURL=heartbeat-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat-handler.d.ts","sourceRoot":"","sources":["../../src/api/heartbeat-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAoD,aAAa,EAAE,MAAM,YAAY,CAAC;AAElG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,wBAAwB,oWAKd,CAAC;AAExB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,gBAAgB,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAClD,mCAAmC;IACnC,eAAe,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED;;GAEG;AACH,qBAAa,wBAAyB,YAAW,gBAAgB;IAC/D,OAAO,CAAC,aAAa,CAA8B;IAE7C,gBAAgB,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAIjD,eAAe,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAG/D;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,yBAAyB;IACzB,SAAS,EAAE,aAAa,CAAC;IACzB,mCAAmC;IACnC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,wBAAwB;IACxB,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,mCAAmC;IACnC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,CAqE7E"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Heartbeat API router for /api/heartbeat endpoints
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.InMemoryHeartbeatTracker = exports.DEFAULT_HEARTBEAT_PROMPT = void 0;
|
|
7
|
+
exports.createHeartbeatRouter = createHeartbeatRouter;
|
|
8
|
+
const express_1 = require("express");
|
|
9
|
+
const error_handler_js_1 = require("./error-handler.js");
|
|
10
|
+
/**
|
|
11
|
+
* Default heartbeat prompt for scheduled reports
|
|
12
|
+
*/
|
|
13
|
+
exports.DEFAULT_HEARTBEAT_PROMPT = `🚨 종합보고 체크리스트:
|
|
14
|
+
1. MAMA 로드: load_checkpoint
|
|
15
|
+
2. 데이터 수집: 최근 활동 검색
|
|
16
|
+
3. 보고서 작성: 요약 생성
|
|
17
|
+
4. 메신저 전송 (설정된 경우)
|
|
18
|
+
5. MAMA 저장: checkpoint`;
|
|
19
|
+
/**
|
|
20
|
+
* In-memory heartbeat tracker (placeholder until S6)
|
|
21
|
+
*/
|
|
22
|
+
class InMemoryHeartbeatTracker {
|
|
23
|
+
lastExecution = null;
|
|
24
|
+
async getLastExecution() {
|
|
25
|
+
return this.lastExecution;
|
|
26
|
+
}
|
|
27
|
+
async recordExecution(execution) {
|
|
28
|
+
this.lastExecution = execution;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.InMemoryHeartbeatTracker = InMemoryHeartbeatTracker;
|
|
32
|
+
/**
|
|
33
|
+
* Create heartbeat API router
|
|
34
|
+
*/
|
|
35
|
+
function createHeartbeatRouter(options) {
|
|
36
|
+
const { scheduler, tracker = new InMemoryHeartbeatTracker(), onHeartbeat } = options;
|
|
37
|
+
const router = (0, express_1.Router)();
|
|
38
|
+
// GET /api/heartbeat - Get heartbeat status
|
|
39
|
+
router.get('/', (0, error_handler_js_1.asyncHandler)(async (_req, res) => {
|
|
40
|
+
const jobs = scheduler.listJobs();
|
|
41
|
+
const activeJobs = jobs.filter((j) => j.enabled).length;
|
|
42
|
+
const lastExecution = await tracker.getLastExecution();
|
|
43
|
+
const response = {
|
|
44
|
+
status: activeJobs > 0 ? 'active' : 'inactive',
|
|
45
|
+
active_jobs: activeJobs,
|
|
46
|
+
last_execution: lastExecution,
|
|
47
|
+
};
|
|
48
|
+
res.json(response);
|
|
49
|
+
}));
|
|
50
|
+
// POST /api/heartbeat - Trigger manual heartbeat
|
|
51
|
+
router.post('/', (0, error_handler_js_1.asyncHandler)(async (req, res) => {
|
|
52
|
+
const body = req.body;
|
|
53
|
+
const prompt = body.prompt || exports.DEFAULT_HEARTBEAT_PROMPT;
|
|
54
|
+
const executionId = `heartbeat_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
55
|
+
const startedAt = Date.now();
|
|
56
|
+
// Execute heartbeat asynchronously
|
|
57
|
+
if (onHeartbeat) {
|
|
58
|
+
// Run asynchronously and track result
|
|
59
|
+
onHeartbeat(prompt)
|
|
60
|
+
.then(async (result) => {
|
|
61
|
+
const execution = {
|
|
62
|
+
id: executionId,
|
|
63
|
+
started_at: startedAt,
|
|
64
|
+
status: result.success ? 'success' : 'failed',
|
|
65
|
+
};
|
|
66
|
+
await tracker.recordExecution(execution);
|
|
67
|
+
})
|
|
68
|
+
.catch(async () => {
|
|
69
|
+
const execution = {
|
|
70
|
+
id: executionId,
|
|
71
|
+
started_at: startedAt,
|
|
72
|
+
status: 'failed',
|
|
73
|
+
};
|
|
74
|
+
await tracker.recordExecution(execution);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// No handler, just record as pending
|
|
79
|
+
// The caller is responsible for executing the heartbeat
|
|
80
|
+
const execution = {
|
|
81
|
+
id: executionId,
|
|
82
|
+
started_at: startedAt,
|
|
83
|
+
status: 'success', // Assume success if no handler
|
|
84
|
+
};
|
|
85
|
+
await tracker.recordExecution(execution);
|
|
86
|
+
}
|
|
87
|
+
res.json({ execution_id: executionId, started: true });
|
|
88
|
+
}));
|
|
89
|
+
return router;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=heartbeat-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat-handler.js","sourceRoot":"","sources":["../../src/api/heartbeat-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API module exports
|
|
3
|
+
*
|
|
4
|
+
* Provides HTTP API for cron job management and heartbeat functionality.
|
|
5
|
+
*/
|
|
6
|
+
import { type Express, type Router } from 'express';
|
|
7
|
+
import { type ExecutionLogStore } from './cron-handler.js';
|
|
8
|
+
import { type HeartbeatTracker } from './heartbeat-handler.js';
|
|
9
|
+
import { CronScheduler } from '../scheduler/index.js';
|
|
10
|
+
export * from './types.js';
|
|
11
|
+
export type { ExecutionLogStore } from './cron-handler.js';
|
|
12
|
+
export { InMemoryLogStore, ScheduleStoreAdapter } from './cron-handler.js';
|
|
13
|
+
export type { HeartbeatTracker } from './heartbeat-handler.js';
|
|
14
|
+
export { InMemoryHeartbeatTracker, DEFAULT_HEARTBEAT_PROMPT } from './heartbeat-handler.js';
|
|
15
|
+
export { asyncHandler, validateRequired, ApiError } from './error-handler.js';
|
|
16
|
+
/**
|
|
17
|
+
* API server options
|
|
18
|
+
*/
|
|
19
|
+
export interface ApiServerOptions {
|
|
20
|
+
/** Scheduler instance */
|
|
21
|
+
scheduler: CronScheduler;
|
|
22
|
+
/** Port to listen on (default: 3848) */
|
|
23
|
+
port?: number;
|
|
24
|
+
/** Log store for execution logs (default: InMemoryLogStore) */
|
|
25
|
+
logStore?: ExecutionLogStore;
|
|
26
|
+
/** Heartbeat tracker (default: InMemoryHeartbeatTracker) */
|
|
27
|
+
heartbeatTracker?: HeartbeatTracker;
|
|
28
|
+
/** Heartbeat execution callback */
|
|
29
|
+
onHeartbeat?: (prompt: string) => Promise<{
|
|
30
|
+
success: boolean;
|
|
31
|
+
error?: string;
|
|
32
|
+
}>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* API server instance
|
|
36
|
+
*/
|
|
37
|
+
export interface ApiServer {
|
|
38
|
+
/** Express app instance */
|
|
39
|
+
app: Express;
|
|
40
|
+
/** HTTP server instance */
|
|
41
|
+
server: ReturnType<(typeof import('express'))['application']['listen']> | null;
|
|
42
|
+
/** Start the server */
|
|
43
|
+
start(): Promise<void>;
|
|
44
|
+
/** Stop the server */
|
|
45
|
+
stop(): Promise<void>;
|
|
46
|
+
/** Get the port the server is listening on */
|
|
47
|
+
port: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create and configure the API server
|
|
51
|
+
*/
|
|
52
|
+
export declare function createApiServer(options: ApiServerOptions): ApiServer;
|
|
53
|
+
/**
|
|
54
|
+
* Create API routers without starting a server
|
|
55
|
+
* Useful for integrating into an existing Express app
|
|
56
|
+
*/
|
|
57
|
+
export declare function createApiRouters(options: ApiServerOptions): {
|
|
58
|
+
cronRouter: Router;
|
|
59
|
+
heartbeatRouter: Router;
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAgB,EAAE,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAsC,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,cAAc,YAAY,CAAC;AAC3B,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yBAAyB;IACzB,SAAS,EAAE,aAAa,CAAC;IACzB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,mCAAmC;IACnC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjF;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,2BAA2B;IAC3B,GAAG,EAAE,OAAO,CAAC;IACb,2BAA2B;IAC3B,MAAM,EAAE,UAAU,CAAC,CAAC,cAAc,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC;IAC/E,uBAAuB;IACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,sBAAsB;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CA+FpE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB,CAiBA"}
|