pilot-ai 0.1.0
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/agent/claude.d.ts +45 -0
- package/dist/agent/claude.d.ts.map +1 -0
- package/dist/agent/claude.js +114 -0
- package/dist/agent/claude.js.map +1 -0
- package/dist/agent/core.d.ts +17 -0
- package/dist/agent/core.d.ts.map +1 -0
- package/dist/agent/core.js +129 -0
- package/dist/agent/core.js.map +1 -0
- package/dist/agent/heartbeat.d.ts +51 -0
- package/dist/agent/heartbeat.d.ts.map +1 -0
- package/dist/agent/heartbeat.js +253 -0
- package/dist/agent/heartbeat.js.map +1 -0
- package/dist/agent/memory-commands.d.ts +11 -0
- package/dist/agent/memory-commands.d.ts.map +1 -0
- package/dist/agent/memory-commands.js +55 -0
- package/dist/agent/memory-commands.js.map +1 -0
- package/dist/agent/memory.d.ts +11 -0
- package/dist/agent/memory.d.ts.map +1 -0
- package/dist/agent/memory.js +109 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/multi-agent.d.ts +47 -0
- package/dist/agent/multi-agent.d.ts.map +1 -0
- package/dist/agent/multi-agent.js +117 -0
- package/dist/agent/multi-agent.js.map +1 -0
- package/dist/agent/pipeline.d.ts +27 -0
- package/dist/agent/pipeline.d.ts.map +1 -0
- package/dist/agent/pipeline.js +52 -0
- package/dist/agent/pipeline.js.map +1 -0
- package/dist/agent/planner.d.ts +21 -0
- package/dist/agent/planner.d.ts.map +1 -0
- package/dist/agent/planner.js +51 -0
- package/dist/agent/planner.js.map +1 -0
- package/dist/agent/preference-detector.d.ts +6 -0
- package/dist/agent/preference-detector.d.ts.map +1 -0
- package/dist/agent/preference-detector.js +50 -0
- package/dist/agent/preference-detector.js.map +1 -0
- package/dist/agent/project-analyzer.d.ts +6 -0
- package/dist/agent/project-analyzer.d.ts.map +1 -0
- package/dist/agent/project-analyzer.js +108 -0
- package/dist/agent/project-analyzer.js.map +1 -0
- package/dist/agent/project.d.ts +28 -0
- package/dist/agent/project.d.ts.map +1 -0
- package/dist/agent/project.js +121 -0
- package/dist/agent/project.js.map +1 -0
- package/dist/agent/queue.d.ts +61 -0
- package/dist/agent/queue.d.ts.map +1 -0
- package/dist/agent/queue.js +167 -0
- package/dist/agent/queue.js.map +1 -0
- package/dist/agent/safety.d.ts +25 -0
- package/dist/agent/safety.d.ts.map +1 -0
- package/dist/agent/safety.js +77 -0
- package/dist/agent/safety.js.map +1 -0
- package/dist/agent/semantic-search.d.ts +34 -0
- package/dist/agent/semantic-search.d.ts.map +1 -0
- package/dist/agent/semantic-search.js +183 -0
- package/dist/agent/semantic-search.js.map +1 -0
- package/dist/agent/skills.d.ts +59 -0
- package/dist/agent/skills.d.ts.map +1 -0
- package/dist/agent/skills.js +161 -0
- package/dist/agent/skills.js.map +1 -0
- package/dist/agent/tool-descriptions.d.ts +7 -0
- package/dist/agent/tool-descriptions.d.ts.map +1 -0
- package/dist/agent/tool-descriptions.js +51 -0
- package/dist/agent/tool-descriptions.js.map +1 -0
- package/dist/agent/worktree.d.ts +28 -0
- package/dist/agent/worktree.d.ts.map +1 -0
- package/dist/agent/worktree.js +59 -0
- package/dist/agent/worktree.js.map +1 -0
- package/dist/api/server.d.ts +30 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +135 -0
- package/dist/api/server.js.map +1 -0
- package/dist/cli/connection-test.d.ts +14 -0
- package/dist/cli/connection-test.d.ts.map +1 -0
- package/dist/cli/connection-test.js +82 -0
- package/dist/cli/connection-test.js.map +1 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +287 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/logs.d.ts +5 -0
- package/dist/cli/logs.d.ts.map +1 -0
- package/dist/cli/logs.js +32 -0
- package/dist/cli/logs.js.map +1 -0
- package/dist/cli/project.d.ts +3 -0
- package/dist/cli/project.d.ts.map +1 -0
- package/dist/cli/project.js +58 -0
- package/dist/cli/project.js.map +1 -0
- package/dist/cli/start.d.ts +5 -0
- package/dist/cli/start.d.ts.map +1 -0
- package/dist/cli/start.js +82 -0
- package/dist/cli/start.js.map +1 -0
- package/dist/cli/status.d.ts +8 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +39 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/stop.d.ts +2 -0
- package/dist/cli/stop.d.ts.map +1 -0
- package/dist/cli/stop.js +28 -0
- package/dist/cli/stop.js.map +1 -0
- package/dist/config/keychain.d.ts +4 -0
- package/dist/config/keychain.d.ts.map +1 -0
- package/dist/config/keychain.js +54 -0
- package/dist/config/keychain.js.map +1 -0
- package/dist/config/schema.d.ts +60 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +88 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/store.d.ts +8 -0
- package/dist/config/store.d.ts.map +1 -0
- package/dist/config/store.js +48 -0
- package/dist/config/store.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/messenger/adapter.d.ts +30 -0
- package/dist/messenger/adapter.d.ts.map +1 -0
- package/dist/messenger/adapter.js +2 -0
- package/dist/messenger/adapter.js.map +1 -0
- package/dist/messenger/factory.d.ts +4 -0
- package/dist/messenger/factory.d.ts.map +1 -0
- package/dist/messenger/factory.js +19 -0
- package/dist/messenger/factory.js.map +1 -0
- package/dist/messenger/slack.d.ts +21 -0
- package/dist/messenger/slack.d.ts.map +1 -0
- package/dist/messenger/slack.js +127 -0
- package/dist/messenger/slack.js.map +1 -0
- package/dist/messenger/telegram.d.ts +21 -0
- package/dist/messenger/telegram.d.ts.map +1 -0
- package/dist/messenger/telegram.js +118 -0
- package/dist/messenger/telegram.js.map +1 -0
- package/dist/security/audit.d.ts +15 -0
- package/dist/security/audit.d.ts.map +1 -0
- package/dist/security/audit.js +41 -0
- package/dist/security/audit.js.map +1 -0
- package/dist/security/auth.d.ts +8 -0
- package/dist/security/auth.d.ts.map +1 -0
- package/dist/security/auth.js +15 -0
- package/dist/security/auth.js.map +1 -0
- package/dist/security/prompt-guard.d.ts +11 -0
- package/dist/security/prompt-guard.d.ts.map +1 -0
- package/dist/security/prompt-guard.js +30 -0
- package/dist/security/prompt-guard.js.map +1 -0
- package/dist/security/sandbox.d.ts +11 -0
- package/dist/security/sandbox.d.ts.map +1 -0
- package/dist/security/sandbox.js +76 -0
- package/dist/security/sandbox.js.map +1 -0
- package/dist/tools/browser.d.ts +61 -0
- package/dist/tools/browser.d.ts.map +1 -0
- package/dist/tools/browser.js +196 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/calendar.d.ts +36 -0
- package/dist/tools/calendar.d.ts.map +1 -0
- package/dist/tools/calendar.js +146 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/clipboard.d.ts +13 -0
- package/dist/tools/clipboard.d.ts.map +1 -0
- package/dist/tools/clipboard.js +47 -0
- package/dist/tools/clipboard.js.map +1 -0
- package/dist/tools/email.d.ts +52 -0
- package/dist/tools/email.d.ts.map +1 -0
- package/dist/tools/email.js +211 -0
- package/dist/tools/email.js.map +1 -0
- package/dist/tools/figma-mcp.d.ts +30 -0
- package/dist/tools/figma-mcp.d.ts.map +1 -0
- package/dist/tools/figma-mcp.js +58 -0
- package/dist/tools/figma-mcp.js.map +1 -0
- package/dist/tools/figma.d.ts +52 -0
- package/dist/tools/figma.d.ts.map +1 -0
- package/dist/tools/figma.js +62 -0
- package/dist/tools/figma.js.map +1 -0
- package/dist/tools/filesystem.d.ts +9 -0
- package/dist/tools/filesystem.d.ts.map +1 -0
- package/dist/tools/filesystem.js +62 -0
- package/dist/tools/filesystem.js.map +1 -0
- package/dist/tools/github.d.ts +36 -0
- package/dist/tools/github.d.ts.map +1 -0
- package/dist/tools/github.js +93 -0
- package/dist/tools/github.js.map +1 -0
- package/dist/tools/image.d.ts +14 -0
- package/dist/tools/image.d.ts.map +1 -0
- package/dist/tools/image.js +57 -0
- package/dist/tools/image.js.map +1 -0
- package/dist/tools/linear.d.ts +41 -0
- package/dist/tools/linear.d.ts.map +1 -0
- package/dist/tools/linear.js +87 -0
- package/dist/tools/linear.js.map +1 -0
- package/dist/tools/notification.d.ts +8 -0
- package/dist/tools/notification.d.ts.map +1 -0
- package/dist/tools/notification.js +49 -0
- package/dist/tools/notification.js.map +1 -0
- package/dist/tools/notion.d.ts +23 -0
- package/dist/tools/notion.d.ts.map +1 -0
- package/dist/tools/notion.js +91 -0
- package/dist/tools/notion.js.map +1 -0
- package/dist/tools/obsidian.d.ts +17 -0
- package/dist/tools/obsidian.d.ts.map +1 -0
- package/dist/tools/obsidian.js +100 -0
- package/dist/tools/obsidian.js.map +1 -0
- package/dist/tools/shell.d.ts +10 -0
- package/dist/tools/shell.d.ts.map +1 -0
- package/dist/tools/shell.js +37 -0
- package/dist/tools/shell.js.map +1 -0
- package/dist/tools/voice.d.ts +28 -0
- package/dist/tools/voice.d.ts.map +1 -0
- package/dist/tools/voice.js +88 -0
- package/dist/tools/voice.js.map +1 -0
- package/dist/tools/vscode.d.ts +42 -0
- package/dist/tools/vscode.d.ts.map +1 -0
- package/dist/tools/vscode.js +80 -0
- package/dist/tools/vscode.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface ClaudeCliOptions {
|
|
2
|
+
prompt: string;
|
|
3
|
+
cwd?: string;
|
|
4
|
+
allowedTools?: string[];
|
|
5
|
+
mcpConfigPath?: string;
|
|
6
|
+
timeoutMs?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ClaudeCliResult {
|
|
9
|
+
result: string;
|
|
10
|
+
exitCode: number;
|
|
11
|
+
}
|
|
12
|
+
export interface ClaudeJsonMessage {
|
|
13
|
+
type: string;
|
|
14
|
+
subtype?: string;
|
|
15
|
+
result?: string;
|
|
16
|
+
content?: Array<{
|
|
17
|
+
type: string;
|
|
18
|
+
text?: string;
|
|
19
|
+
}>;
|
|
20
|
+
[key: string]: unknown;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* claude CLI 바이너리가 설치되어 있는지 확인한다.
|
|
24
|
+
*/
|
|
25
|
+
export declare function checkClaudeCli(binary?: string): Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Claude Code CLI를 subprocess로 호출한다.
|
|
28
|
+
* `claude -p --output-format json` 형태로 실행하여 JSON 응답을 파싱한다.
|
|
29
|
+
*/
|
|
30
|
+
export declare function invokeClaudeCli(options: ClaudeCliOptions): Promise<ClaudeCliResult>;
|
|
31
|
+
/**
|
|
32
|
+
* Claude CLI의 JSON 출력을 파싱하여 최종 텍스트 결과를 추출한다.
|
|
33
|
+
* --output-format json은 JSONL 형태로 여러 메시지를 출력한다.
|
|
34
|
+
*/
|
|
35
|
+
export declare function parseClaudeJsonOutput(output: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* Anthropic API를 직접 호출하는 fallback 모드.
|
|
38
|
+
*/
|
|
39
|
+
export declare function invokeClaudeApi(options: {
|
|
40
|
+
prompt: string;
|
|
41
|
+
apiKey: string;
|
|
42
|
+
model?: string;
|
|
43
|
+
maxTokens?: number;
|
|
44
|
+
}): Promise<string>;
|
|
45
|
+
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/agent/claude.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,GAAE,MAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAOhF;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAsDzF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA4B5D;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBlB"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { execFile } from 'node:child_process';
|
|
3
|
+
import { promisify } from 'node:util';
|
|
4
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
5
|
+
const execFileAsync = promisify(execFile);
|
|
6
|
+
const DEFAULT_TIMEOUT_MS = 5 * 60 * 1000; // 5분
|
|
7
|
+
/**
|
|
8
|
+
* claude CLI 바이너리가 설치되어 있는지 확인한다.
|
|
9
|
+
*/
|
|
10
|
+
export async function checkClaudeCli(binary = 'claude') {
|
|
11
|
+
try {
|
|
12
|
+
await execFileAsync('which', [binary]);
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Claude Code CLI를 subprocess로 호출한다.
|
|
21
|
+
* `claude -p --output-format json` 형태로 실행하여 JSON 응답을 파싱한다.
|
|
22
|
+
*/
|
|
23
|
+
export async function invokeClaudeCli(options) {
|
|
24
|
+
const { prompt, cwd, allowedTools, mcpConfigPath, timeoutMs = DEFAULT_TIMEOUT_MS } = options;
|
|
25
|
+
const args = ['-p', '--output-format', 'json'];
|
|
26
|
+
if (cwd) {
|
|
27
|
+
args.push('--cwd', cwd);
|
|
28
|
+
}
|
|
29
|
+
if (allowedTools && allowedTools.length > 0) {
|
|
30
|
+
for (const tool of allowedTools) {
|
|
31
|
+
args.push('--allowedTools', tool);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (mcpConfigPath) {
|
|
35
|
+
args.push('--mcp-config', mcpConfigPath);
|
|
36
|
+
}
|
|
37
|
+
args.push(prompt);
|
|
38
|
+
return new Promise((resolve, reject) => {
|
|
39
|
+
const child = spawn('claude', args, {
|
|
40
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
41
|
+
timeout: timeoutMs,
|
|
42
|
+
});
|
|
43
|
+
let stdout = '';
|
|
44
|
+
let stderr = '';
|
|
45
|
+
child.stdout.on('data', (data) => {
|
|
46
|
+
stdout += data.toString();
|
|
47
|
+
});
|
|
48
|
+
child.stderr.on('data', (data) => {
|
|
49
|
+
stderr += data.toString();
|
|
50
|
+
});
|
|
51
|
+
child.on('error', (err) => {
|
|
52
|
+
reject(new Error(`Claude CLI 실행 실패: ${err.message}`));
|
|
53
|
+
});
|
|
54
|
+
child.on('close', (code) => {
|
|
55
|
+
const exitCode = code ?? 1;
|
|
56
|
+
if (exitCode !== 0 && !stdout) {
|
|
57
|
+
reject(new Error(`Claude CLI 에러 (exit ${exitCode}): ${stderr || '알 수 없는 오류'}`));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const result = parseClaudeJsonOutput(stdout);
|
|
61
|
+
resolve({ result, exitCode });
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Claude CLI의 JSON 출력을 파싱하여 최종 텍스트 결과를 추출한다.
|
|
67
|
+
* --output-format json은 JSONL 형태로 여러 메시지를 출력한다.
|
|
68
|
+
*/
|
|
69
|
+
export function parseClaudeJsonOutput(output) {
|
|
70
|
+
const lines = output.trim().split('\n').filter(Boolean);
|
|
71
|
+
const texts = [];
|
|
72
|
+
for (const line of lines) {
|
|
73
|
+
try {
|
|
74
|
+
const msg = JSON.parse(line);
|
|
75
|
+
// assistant 메시지에서 텍스트 추출
|
|
76
|
+
if (msg.type === 'assistant' && Array.isArray(msg.content)) {
|
|
77
|
+
for (const block of msg.content) {
|
|
78
|
+
if (block.type === 'text' && block.text) {
|
|
79
|
+
texts.push(block.text);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// result 메시지
|
|
84
|
+
if (msg.type === 'result' && typeof msg.result === 'string') {
|
|
85
|
+
texts.push(msg.result);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// JSON 파싱 실패 시 원문 텍스트로 처리
|
|
90
|
+
texts.push(line);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return texts.join('\n') || output;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Anthropic API를 직접 호출하는 fallback 모드.
|
|
97
|
+
*/
|
|
98
|
+
export async function invokeClaudeApi(options) {
|
|
99
|
+
const { prompt, apiKey, model = 'claude-sonnet-4-20250514', maxTokens = 4096 } = options;
|
|
100
|
+
const client = new Anthropic({ apiKey });
|
|
101
|
+
const response = await client.messages.create({
|
|
102
|
+
model,
|
|
103
|
+
max_tokens: maxTokens,
|
|
104
|
+
messages: [{ role: 'user', content: prompt }],
|
|
105
|
+
});
|
|
106
|
+
const texts = [];
|
|
107
|
+
for (const block of response.content) {
|
|
108
|
+
if (block.type === 'text') {
|
|
109
|
+
texts.push(block.text);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return texts.join('\n');
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agent/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { MessengerAdapter } from '../messenger/adapter.js';
|
|
2
|
+
import type { PilotConfig } from '../config/schema.js';
|
|
3
|
+
export declare class AgentCore {
|
|
4
|
+
private messenger;
|
|
5
|
+
private config;
|
|
6
|
+
private approvalManager;
|
|
7
|
+
constructor(messenger: MessengerAdapter, config: PilotConfig);
|
|
8
|
+
private setupHandlers;
|
|
9
|
+
start(): Promise<void>;
|
|
10
|
+
stop(): Promise<void>;
|
|
11
|
+
private handleMessage;
|
|
12
|
+
/**
|
|
13
|
+
* Resolves project from message, builds memory context, and invokes Claude.
|
|
14
|
+
*/
|
|
15
|
+
private invokeClaudeWithContext;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/agent/core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAmB,MAAM,yBAAyB,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAcvD,qBAAa,SAAS;IACpB,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,eAAe,CAAkB;gBAE7B,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,WAAW;IAQ5D,OAAO,CAAC,aAAa;IAOf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAIb,aAAa;IA8D3B;;OAEG;YACW,uBAAuB;CAyCtC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { isAuthorizedUser } from '../security/auth.js';
|
|
2
|
+
import { writeAuditLog } from '../security/audit.js';
|
|
3
|
+
import { invokeClaudeCli, invokeClaudeApi } from './claude.js';
|
|
4
|
+
import { ApprovalManager } from './safety.js';
|
|
5
|
+
import { buildMemoryContext } from './memory.js';
|
|
6
|
+
import { resolveProject, touchProject } from './project.js';
|
|
7
|
+
import { handleMemoryCommand } from './memory-commands.js';
|
|
8
|
+
import { detectAndSavePreference } from './preference-detector.js';
|
|
9
|
+
import { analyzeProjectIfNew } from './project-analyzer.js';
|
|
10
|
+
import { buildSkillsContext } from './skills.js';
|
|
11
|
+
import { buildToolDescriptions } from './tool-descriptions.js';
|
|
12
|
+
import { getMcpConfigPathIfExists } from '../tools/figma-mcp.js';
|
|
13
|
+
export class AgentCore {
|
|
14
|
+
messenger;
|
|
15
|
+
config;
|
|
16
|
+
approvalManager;
|
|
17
|
+
constructor(messenger, config) {
|
|
18
|
+
this.messenger = messenger;
|
|
19
|
+
this.config = config;
|
|
20
|
+
this.approvalManager = new ApprovalManager();
|
|
21
|
+
this.setupHandlers();
|
|
22
|
+
}
|
|
23
|
+
setupHandlers() {
|
|
24
|
+
this.messenger.onMessage((msg) => this.handleMessage(msg));
|
|
25
|
+
this.messenger.onApproval((taskId, approved) => {
|
|
26
|
+
this.approvalManager.handleResponse(taskId, approved);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
async start() {
|
|
30
|
+
await this.messenger.start();
|
|
31
|
+
}
|
|
32
|
+
async stop() {
|
|
33
|
+
await this.messenger.stop();
|
|
34
|
+
}
|
|
35
|
+
async handleMessage(msg) {
|
|
36
|
+
// 1. Auth check
|
|
37
|
+
if (!isAuthorizedUser(msg, this.config)) {
|
|
38
|
+
await writeAuditLog({
|
|
39
|
+
timestamp: new Date().toISOString(),
|
|
40
|
+
type: 'command',
|
|
41
|
+
userId: msg.userId,
|
|
42
|
+
platform: msg.platform,
|
|
43
|
+
content: `[BLOCKED] ${msg.text}`,
|
|
44
|
+
});
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// 2. Audit log
|
|
48
|
+
await writeAuditLog({
|
|
49
|
+
timestamp: new Date().toISOString(),
|
|
50
|
+
type: 'command',
|
|
51
|
+
userId: msg.userId,
|
|
52
|
+
platform: msg.platform,
|
|
53
|
+
content: msg.text,
|
|
54
|
+
});
|
|
55
|
+
// 3. Memory command intercept
|
|
56
|
+
const memResult = await handleMemoryCommand(msg.text);
|
|
57
|
+
if (memResult.handled) {
|
|
58
|
+
await this.messenger.sendText(msg.channelId, memResult.response, msg.threadId);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
// 4. Detect user preferences (async, non-blocking)
|
|
62
|
+
detectAndSavePreference(msg.text).catch(() => { });
|
|
63
|
+
// 5. Invoke Claude with context
|
|
64
|
+
try {
|
|
65
|
+
const response = await this.invokeClaudeWithContext(msg);
|
|
66
|
+
await this.messenger.sendText(msg.channelId, response, msg.threadId);
|
|
67
|
+
await writeAuditLog({
|
|
68
|
+
timestamp: new Date().toISOString(),
|
|
69
|
+
type: 'result',
|
|
70
|
+
userId: msg.userId,
|
|
71
|
+
platform: msg.platform,
|
|
72
|
+
content: response,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
77
|
+
await this.messenger.sendText(msg.channelId, `Error: ${errorMsg}`, msg.threadId);
|
|
78
|
+
await writeAuditLog({
|
|
79
|
+
timestamp: new Date().toISOString(),
|
|
80
|
+
type: 'error',
|
|
81
|
+
userId: msg.userId,
|
|
82
|
+
platform: msg.platform,
|
|
83
|
+
content: errorMsg,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Resolves project from message, builds memory context, and invokes Claude.
|
|
89
|
+
*/
|
|
90
|
+
async invokeClaudeWithContext(msg) {
|
|
91
|
+
// Resolve project from message text
|
|
92
|
+
const project = await resolveProject(msg.text);
|
|
93
|
+
const projectName = project?.name;
|
|
94
|
+
const projectPath = project?.path;
|
|
95
|
+
// If project resolved, analyze on first use and update lastUsed
|
|
96
|
+
if (projectName && projectPath) {
|
|
97
|
+
await touchProject(projectName);
|
|
98
|
+
await analyzeProjectIfNew(projectName, projectPath);
|
|
99
|
+
}
|
|
100
|
+
// Build memory context, skills context, and tool descriptions
|
|
101
|
+
const memoryContext = await buildMemoryContext(projectName);
|
|
102
|
+
const skillsContext = await buildSkillsContext();
|
|
103
|
+
const toolDescriptions = buildToolDescriptions();
|
|
104
|
+
const contextParts = [];
|
|
105
|
+
if (memoryContext)
|
|
106
|
+
contextParts.push(memoryContext);
|
|
107
|
+
if (skillsContext)
|
|
108
|
+
contextParts.push(skillsContext);
|
|
109
|
+
if (toolDescriptions)
|
|
110
|
+
contextParts.push(toolDescriptions);
|
|
111
|
+
const prompt = contextParts.length > 0
|
|
112
|
+
? `${contextParts.join('\n\n')}\n\n<USER_COMMAND>\n${msg.text}\n</USER_COMMAND>`
|
|
113
|
+
: msg.text;
|
|
114
|
+
if (this.config.claude.mode === 'api' && this.config.claude.apiKey) {
|
|
115
|
+
return invokeClaudeApi({
|
|
116
|
+
prompt,
|
|
117
|
+
apiKey: this.config.claude.apiKey,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
const mcpConfigPath = await getMcpConfigPathIfExists() ?? undefined;
|
|
121
|
+
const result = await invokeClaudeCli({
|
|
122
|
+
prompt,
|
|
123
|
+
cwd: projectPath,
|
|
124
|
+
mcpConfigPath,
|
|
125
|
+
});
|
|
126
|
+
return result.result;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/agent/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export interface CronJob {
|
|
2
|
+
id: number;
|
|
3
|
+
cron: string;
|
|
4
|
+
command: string;
|
|
5
|
+
project?: string;
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
createdAt: string;
|
|
8
|
+
lastRunAt?: string;
|
|
9
|
+
lastError?: string;
|
|
10
|
+
}
|
|
11
|
+
export type JobExecutor = (job: CronJob) => Promise<string>;
|
|
12
|
+
export interface HeartbeatReporter {
|
|
13
|
+
sendText(channelId: string, text: string): Promise<string>;
|
|
14
|
+
sendApproval(channelId: string, text: string, taskId: string): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export interface HeartbeatApprovalRequest {
|
|
17
|
+
requestApproval(taskId: string, action: string, timeoutMs: number): Promise<boolean>;
|
|
18
|
+
}
|
|
19
|
+
export declare function setHeartbeatReporter(r: HeartbeatReporter, channelId: string): void;
|
|
20
|
+
export declare function setHeartbeatApproval(a: HeartbeatApprovalRequest): void;
|
|
21
|
+
interface CronFields {
|
|
22
|
+
minute: number[];
|
|
23
|
+
hour: number[];
|
|
24
|
+
dayOfMonth: number[];
|
|
25
|
+
month: number[];
|
|
26
|
+
dayOfWeek: number[];
|
|
27
|
+
}
|
|
28
|
+
export declare function parseCron(expression: string): CronFields;
|
|
29
|
+
export declare function cronMatches(expression: string, date: Date): boolean;
|
|
30
|
+
export declare function parseHeartbeat(content: string): Array<{
|
|
31
|
+
cron: string;
|
|
32
|
+
command: string;
|
|
33
|
+
project?: string;
|
|
34
|
+
}>;
|
|
35
|
+
export declare function loadCronJobs(): Promise<CronJob[]>;
|
|
36
|
+
export declare function saveCronJobs(jobs: CronJob[]): Promise<void>;
|
|
37
|
+
export declare function addCronJob(params: {
|
|
38
|
+
cron: string;
|
|
39
|
+
command: string;
|
|
40
|
+
project?: string;
|
|
41
|
+
}): Promise<CronJob>;
|
|
42
|
+
export declare function removeCronJob(id: number): Promise<boolean>;
|
|
43
|
+
export declare function toggleCronJob(id: number): Promise<CronJob | null>;
|
|
44
|
+
export declare function onJobExecute(handler: JobExecutor): void;
|
|
45
|
+
export declare function tick(now?: Date): Promise<CronJob[]>;
|
|
46
|
+
export declare function startScheduler(): void;
|
|
47
|
+
export declare function stopScheduler(): void;
|
|
48
|
+
export declare function isSchedulerRunning(): boolean;
|
|
49
|
+
export declare function formatCronJobs(jobs: CronJob[]): string;
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=heartbeat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/agent/heartbeat.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAE5D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3D,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9E;AAED,MAAM,WAAW,wBAAwB;IACvC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtF;AAMD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAGlF;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAEtE;AAYD,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAuBD,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAWxD;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CASnE;AAID,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB1G;AAID,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAOvD;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjE;AAOD,wBAAsB,UAAU,CAAC,MAAM,EAAE;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBnB;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOhE;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAOvE;AAOD,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAEvD;AAED,wBAAsB,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CA+FzD;AAED,wBAAgB,cAAc,IAAI,IAAI,CAMrC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAYtD"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import crypto from 'node:crypto';
|
|
4
|
+
import { getPilotDir } from '../config/store.js';
|
|
5
|
+
import { classifySafety } from './safety.js';
|
|
6
|
+
let reporter = null;
|
|
7
|
+
let approvalManager = null;
|
|
8
|
+
let reportChannelId = null;
|
|
9
|
+
export function setHeartbeatReporter(r, channelId) {
|
|
10
|
+
reporter = r;
|
|
11
|
+
reportChannelId = channelId;
|
|
12
|
+
}
|
|
13
|
+
export function setHeartbeatApproval(a) {
|
|
14
|
+
approvalManager = a;
|
|
15
|
+
}
|
|
16
|
+
function getCronJobsPath() {
|
|
17
|
+
return path.join(getPilotDir(), 'cron-jobs.json');
|
|
18
|
+
}
|
|
19
|
+
function getHeartbeatPath() {
|
|
20
|
+
return path.join(getPilotDir(), 'HEARTBEAT.md');
|
|
21
|
+
}
|
|
22
|
+
function parseField(field, min, max) {
|
|
23
|
+
const values = new Set();
|
|
24
|
+
for (const part of field.split(',')) {
|
|
25
|
+
const stepMatch = part.match(/^(.+)\/(\d+)$/);
|
|
26
|
+
const step = stepMatch ? parseInt(stepMatch[2], 10) : 1;
|
|
27
|
+
const range = stepMatch ? stepMatch[1] : part;
|
|
28
|
+
if (range === '*') {
|
|
29
|
+
for (let i = min; i <= max; i += step)
|
|
30
|
+
values.add(i);
|
|
31
|
+
}
|
|
32
|
+
else if (range.includes('-')) {
|
|
33
|
+
const [start, end] = range.split('-').map(Number);
|
|
34
|
+
for (let i = start; i <= end; i += step)
|
|
35
|
+
values.add(i);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
values.add(parseInt(range, 10));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return [...values].sort((a, b) => a - b);
|
|
42
|
+
}
|
|
43
|
+
export function parseCron(expression) {
|
|
44
|
+
const parts = expression.trim().split(/\s+/);
|
|
45
|
+
if (parts.length !== 5)
|
|
46
|
+
throw new Error(`Invalid cron expression: "${expression}" (expected 5 fields)`);
|
|
47
|
+
return {
|
|
48
|
+
minute: parseField(parts[0], 0, 59),
|
|
49
|
+
hour: parseField(parts[1], 0, 23),
|
|
50
|
+
dayOfMonth: parseField(parts[2], 1, 31),
|
|
51
|
+
month: parseField(parts[3], 1, 12),
|
|
52
|
+
dayOfWeek: parseField(parts[4], 0, 6),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export function cronMatches(expression, date) {
|
|
56
|
+
const fields = parseCron(expression);
|
|
57
|
+
return (fields.minute.includes(date.getMinutes()) &&
|
|
58
|
+
fields.hour.includes(date.getHours()) &&
|
|
59
|
+
fields.dayOfMonth.includes(date.getDate()) &&
|
|
60
|
+
fields.month.includes(date.getMonth() + 1) &&
|
|
61
|
+
fields.dayOfWeek.includes(date.getDay()));
|
|
62
|
+
}
|
|
63
|
+
// --- HEARTBEAT.md parser ---
|
|
64
|
+
export function parseHeartbeat(content) {
|
|
65
|
+
const jobs = [];
|
|
66
|
+
const lines = content.split('\n');
|
|
67
|
+
for (const line of lines) {
|
|
68
|
+
const trimmed = line.trim();
|
|
69
|
+
// Format: `CRON_EXPR | command [| project]`
|
|
70
|
+
// Example: `0 9 * * * | git pull && npm test | api`
|
|
71
|
+
if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('//'))
|
|
72
|
+
continue;
|
|
73
|
+
const parts = trimmed.split('|').map((p) => p.trim());
|
|
74
|
+
if (parts.length < 2)
|
|
75
|
+
continue;
|
|
76
|
+
const cron = parts[0];
|
|
77
|
+
const command = parts[1];
|
|
78
|
+
const project = parts[2] || undefined;
|
|
79
|
+
// Validate cron has 5 fields
|
|
80
|
+
if (cron.split(/\s+/).length !== 5)
|
|
81
|
+
continue;
|
|
82
|
+
jobs.push({ cron, command, project });
|
|
83
|
+
}
|
|
84
|
+
return jobs;
|
|
85
|
+
}
|
|
86
|
+
// --- CronJob store ---
|
|
87
|
+
export async function loadCronJobs() {
|
|
88
|
+
try {
|
|
89
|
+
const data = await fs.readFile(getCronJobsPath(), 'utf-8');
|
|
90
|
+
return JSON.parse(data);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export async function saveCronJobs(jobs) {
|
|
97
|
+
await fs.writeFile(getCronJobsPath(), JSON.stringify(jobs, null, 2), 'utf-8');
|
|
98
|
+
}
|
|
99
|
+
function nextId(jobs) {
|
|
100
|
+
if (jobs.length === 0)
|
|
101
|
+
return 1;
|
|
102
|
+
return Math.max(...jobs.map((j) => j.id)) + 1;
|
|
103
|
+
}
|
|
104
|
+
export async function addCronJob(params) {
|
|
105
|
+
// Validate cron expression
|
|
106
|
+
parseCron(params.cron);
|
|
107
|
+
const jobs = await loadCronJobs();
|
|
108
|
+
const job = {
|
|
109
|
+
id: nextId(jobs),
|
|
110
|
+
cron: params.cron,
|
|
111
|
+
command: params.command,
|
|
112
|
+
project: params.project,
|
|
113
|
+
enabled: true,
|
|
114
|
+
createdAt: new Date().toISOString(),
|
|
115
|
+
};
|
|
116
|
+
jobs.push(job);
|
|
117
|
+
await saveCronJobs(jobs);
|
|
118
|
+
return job;
|
|
119
|
+
}
|
|
120
|
+
export async function removeCronJob(id) {
|
|
121
|
+
const jobs = await loadCronJobs();
|
|
122
|
+
const idx = jobs.findIndex((j) => j.id === id);
|
|
123
|
+
if (idx === -1)
|
|
124
|
+
return false;
|
|
125
|
+
jobs.splice(idx, 1);
|
|
126
|
+
await saveCronJobs(jobs);
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
export async function toggleCronJob(id) {
|
|
130
|
+
const jobs = await loadCronJobs();
|
|
131
|
+
const job = jobs.find((j) => j.id === id);
|
|
132
|
+
if (!job)
|
|
133
|
+
return null;
|
|
134
|
+
job.enabled = !job.enabled;
|
|
135
|
+
await saveCronJobs(jobs);
|
|
136
|
+
return job;
|
|
137
|
+
}
|
|
138
|
+
// --- Scheduler ---
|
|
139
|
+
let intervalHandle = null;
|
|
140
|
+
let executor = null;
|
|
141
|
+
export function onJobExecute(handler) {
|
|
142
|
+
executor = handler;
|
|
143
|
+
}
|
|
144
|
+
export async function tick(now) {
|
|
145
|
+
const date = now ?? new Date();
|
|
146
|
+
const executedJobs = [];
|
|
147
|
+
// Load jobs from cron-jobs.json
|
|
148
|
+
const jobs = await loadCronJobs();
|
|
149
|
+
// Also parse HEARTBEAT.md for additional jobs
|
|
150
|
+
let heartbeatJobs = [];
|
|
151
|
+
try {
|
|
152
|
+
const content = await fs.readFile(getHeartbeatPath(), 'utf-8');
|
|
153
|
+
heartbeatJobs = parseHeartbeat(content);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// HEARTBEAT.md doesn't exist, that's fine
|
|
157
|
+
}
|
|
158
|
+
// Merge: heartbeat jobs treated as always-enabled virtual jobs
|
|
159
|
+
const allJobs = [
|
|
160
|
+
...jobs.filter((j) => j.enabled).map((j) => ({ job: j, cron: j.cron, command: j.command, project: j.project })),
|
|
161
|
+
...heartbeatJobs.map((h) => ({ cron: h.cron, command: h.command, project: h.project })),
|
|
162
|
+
];
|
|
163
|
+
for (const entry of allJobs) {
|
|
164
|
+
if (!cronMatches(entry.cron, date))
|
|
165
|
+
continue;
|
|
166
|
+
const cronJob = entry.job ?? {
|
|
167
|
+
id: 0,
|
|
168
|
+
cron: entry.cron,
|
|
169
|
+
command: entry.command,
|
|
170
|
+
project: entry.project,
|
|
171
|
+
enabled: true,
|
|
172
|
+
createdAt: '',
|
|
173
|
+
};
|
|
174
|
+
// Check dangerous actions and request approval
|
|
175
|
+
const safety = classifySafety(cronJob.command);
|
|
176
|
+
if (safety === 'dangerous' && approvalManager && reporter && reportChannelId) {
|
|
177
|
+
const taskId = `heartbeat-${cronJob.id}-${crypto.randomUUID().slice(0, 8)}`;
|
|
178
|
+
await reporter.sendApproval(reportChannelId, `⚠️ Scheduled task requires approval:\n\`${cronJob.command}\`\nCron: ${cronJob.cron}`, taskId);
|
|
179
|
+
const approved = await approvalManager.requestApproval(taskId, cronJob.command, 30 * 60 * 1000);
|
|
180
|
+
if (!approved) {
|
|
181
|
+
if (entry.job) {
|
|
182
|
+
entry.job.lastRunAt = date.toISOString();
|
|
183
|
+
entry.job.lastError = 'Approval denied or timed out';
|
|
184
|
+
}
|
|
185
|
+
executedJobs.push(cronJob);
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (executor) {
|
|
190
|
+
try {
|
|
191
|
+
const result = await executor(cronJob);
|
|
192
|
+
if (entry.job) {
|
|
193
|
+
entry.job.lastRunAt = date.toISOString();
|
|
194
|
+
entry.job.lastError = undefined;
|
|
195
|
+
}
|
|
196
|
+
// Report result via messenger
|
|
197
|
+
if (reporter && reportChannelId) {
|
|
198
|
+
const proj = cronJob.project ? ` [${cronJob.project}]` : '';
|
|
199
|
+
const summary = result.length > 500 ? result.slice(0, 500) + '...' : result;
|
|
200
|
+
await reporter.sendText(reportChannelId, `✅ Scheduled task completed${proj}:\n\`${cronJob.command}\`\n${summary}`).catch(() => { });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
205
|
+
if (entry.job) {
|
|
206
|
+
entry.job.lastRunAt = date.toISOString();
|
|
207
|
+
entry.job.lastError = errorMsg;
|
|
208
|
+
}
|
|
209
|
+
// Report error via messenger
|
|
210
|
+
if (reporter && reportChannelId) {
|
|
211
|
+
await reporter.sendText(reportChannelId, `❌ Scheduled task failed:\n\`${cronJob.command}\`\nError: ${errorMsg}`).catch(() => { });
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
executedJobs.push(cronJob);
|
|
216
|
+
}
|
|
217
|
+
// Save updated lastRunAt/lastError
|
|
218
|
+
if (executedJobs.some((j) => j.id !== 0)) {
|
|
219
|
+
await saveCronJobs(jobs);
|
|
220
|
+
}
|
|
221
|
+
return executedJobs;
|
|
222
|
+
}
|
|
223
|
+
export function startScheduler() {
|
|
224
|
+
if (intervalHandle)
|
|
225
|
+
return;
|
|
226
|
+
// Check every 60 seconds
|
|
227
|
+
intervalHandle = setInterval(() => {
|
|
228
|
+
tick().catch(() => { });
|
|
229
|
+
}, 60_000);
|
|
230
|
+
}
|
|
231
|
+
export function stopScheduler() {
|
|
232
|
+
if (intervalHandle) {
|
|
233
|
+
clearInterval(intervalHandle);
|
|
234
|
+
intervalHandle = null;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
export function isSchedulerRunning() {
|
|
238
|
+
return intervalHandle !== null;
|
|
239
|
+
}
|
|
240
|
+
export function formatCronJobs(jobs) {
|
|
241
|
+
if (jobs.length === 0)
|
|
242
|
+
return 'No scheduled jobs.';
|
|
243
|
+
const lines = ['Scheduled Jobs:'];
|
|
244
|
+
for (const job of jobs) {
|
|
245
|
+
const status = job.enabled ? 'ON' : 'OFF';
|
|
246
|
+
const proj = job.project ? ` [${job.project}]` : '';
|
|
247
|
+
const lastRun = job.lastRunAt ? ` (last: ${job.lastRunAt})` : '';
|
|
248
|
+
const error = job.lastError ? ` ERROR: ${job.lastError}` : '';
|
|
249
|
+
lines.push(` #${job.id} [${status}] ${job.cron}${proj} - ${job.command}${lastRun}${error}`);
|
|
250
|
+
}
|
|
251
|
+
return lines.join('\n');
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=heartbeat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/agent/heartbeat.ts"],"names":[],"mappings":"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"}
|