asyncwf 1.0.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/README.md +112 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +83 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/kb.d.ts +8 -0
- package/dist/commands/kb.d.ts.map +1 -0
- package/dist/commands/kb.js +109 -0
- package/dist/commands/kb.js.map +1 -0
- package/dist/commands/link.d.ts +2 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +74 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/skill.d.ts +9 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +103 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/taskmgr.d.ts +11 -0
- package/dist/commands/taskmgr.d.ts.map +1 -0
- package/dist/commands/taskmgr.js +129 -0
- package/dist/commands/taskmgr.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agent.d.ts +5 -0
- package/dist/lib/agent.d.ts.map +1 -0
- package/dist/lib/agent.js +124 -0
- package/dist/lib/agent.js.map +1 -0
- package/dist/lib/knowledge.d.ts +8 -0
- package/dist/lib/knowledge.d.ts.map +1 -0
- package/dist/lib/knowledge.js +149 -0
- package/dist/lib/knowledge.js.map +1 -0
- package/dist/lib/skills.d.ts +8 -0
- package/dist/lib/skills.d.ts.map +1 -0
- package/dist/lib/skills.js +129 -0
- package/dist/lib/skills.js.map +1 -0
- package/dist/lib/state.d.ts +13 -0
- package/dist/lib/state.d.ts.map +1 -0
- package/dist/lib/state.js +87 -0
- package/dist/lib/state.js.map +1 -0
- package/dist/lib/templates.d.ts +9 -0
- package/dist/lib/templates.d.ts.map +1 -0
- package/dist/lib/templates.js +79 -0
- package/dist/lib/templates.js.map +1 -0
- package/dist/types.d.ts +57 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'fs';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { getAllTasks, getTasksByStatus, getTask, getLogPath } from '../lib/state.js';
|
|
4
|
+
import { dispatchAgent, killAgent, waitForJobs } from '../lib/agent.js';
|
|
5
|
+
export async function taskmgrCommand(action, options) {
|
|
6
|
+
switch (action) {
|
|
7
|
+
case 'dispatch':
|
|
8
|
+
await handleDispatch(options);
|
|
9
|
+
break;
|
|
10
|
+
case 'list':
|
|
11
|
+
await handleList(options);
|
|
12
|
+
break;
|
|
13
|
+
case 'wait':
|
|
14
|
+
await handleWait(options);
|
|
15
|
+
break;
|
|
16
|
+
case 'fetch':
|
|
17
|
+
await handleFetch(options);
|
|
18
|
+
break;
|
|
19
|
+
case 'kill':
|
|
20
|
+
await handleKill(options);
|
|
21
|
+
break;
|
|
22
|
+
default:
|
|
23
|
+
console.log(chalk.red(`Unknown action: ${action}`));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async function handleDispatch(options) {
|
|
27
|
+
const { job, prompt, skill } = options;
|
|
28
|
+
if (!job || !prompt) {
|
|
29
|
+
console.log(chalk.red('Error: --job and --prompt are required'));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// Check if job already exists
|
|
33
|
+
const existing = await getTask(job);
|
|
34
|
+
if (existing) {
|
|
35
|
+
console.log(chalk.red(`Error: Job "${job}" already exists`));
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
console.log(chalk.cyan(`🚀 Dispatching job: ${job}`));
|
|
39
|
+
if (skill) {
|
|
40
|
+
console.log(chalk.gray(` Using skill: ${skill}`));
|
|
41
|
+
}
|
|
42
|
+
const task = await dispatchAgent(job, prompt, skill);
|
|
43
|
+
console.log(chalk.green(`✓ Job dispatched`));
|
|
44
|
+
console.log(JSON.stringify({
|
|
45
|
+
id: task.id,
|
|
46
|
+
status: task.status,
|
|
47
|
+
pid: task.pid,
|
|
48
|
+
skill: task.skill,
|
|
49
|
+
}, null, 2));
|
|
50
|
+
}
|
|
51
|
+
async function handleList(options) {
|
|
52
|
+
const { status } = options;
|
|
53
|
+
let tasks;
|
|
54
|
+
if (status) {
|
|
55
|
+
tasks = await getTasksByStatus(status);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
tasks = await getAllTasks();
|
|
59
|
+
}
|
|
60
|
+
if (tasks.length === 0) {
|
|
61
|
+
console.log(chalk.gray('No tasks found'));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
// Output as JSON for easy parsing by Claude
|
|
65
|
+
console.log(JSON.stringify(tasks.map(t => ({
|
|
66
|
+
id: t.id,
|
|
67
|
+
status: t.status,
|
|
68
|
+
skill: t.skill,
|
|
69
|
+
pid: t.pid,
|
|
70
|
+
exitCode: t.exitCode,
|
|
71
|
+
createdAt: t.createdAt,
|
|
72
|
+
updatedAt: t.updatedAt,
|
|
73
|
+
})), null, 2));
|
|
74
|
+
}
|
|
75
|
+
async function handleWait(options) {
|
|
76
|
+
const { jobs, timeout } = options;
|
|
77
|
+
if (!jobs) {
|
|
78
|
+
console.log(chalk.red('Error: --jobs is required'));
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const jobIds = jobs.split(',').map(s => s.trim());
|
|
82
|
+
const timeoutMs = parseInt(timeout || '300000', 10);
|
|
83
|
+
console.log(chalk.cyan(`⏳ Waiting for jobs: ${jobIds.join(', ')}`));
|
|
84
|
+
console.log(chalk.gray(` Timeout: ${timeoutMs / 1000}s`));
|
|
85
|
+
const results = await waitForJobs(jobIds, timeoutMs);
|
|
86
|
+
console.log(chalk.green(`\n✓ Jobs completed`));
|
|
87
|
+
console.log(JSON.stringify(results.map(t => ({
|
|
88
|
+
id: t.id,
|
|
89
|
+
status: t.status,
|
|
90
|
+
exitCode: t.exitCode,
|
|
91
|
+
})), null, 2));
|
|
92
|
+
}
|
|
93
|
+
async function handleFetch(options) {
|
|
94
|
+
const { job } = options;
|
|
95
|
+
if (!job) {
|
|
96
|
+
console.log(chalk.red('Error: --job is required'));
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const task = await getTask(job);
|
|
100
|
+
if (!task) {
|
|
101
|
+
console.log(chalk.red(`Error: Job "${job}" not found`));
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const logPath = getLogPath(job);
|
|
105
|
+
if (!existsSync(logPath)) {
|
|
106
|
+
console.log(chalk.yellow(`No output file found for job "${job}"`));
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const content = readFileSync(logPath, 'utf-8');
|
|
110
|
+
console.log(chalk.cyan(`📄 Output for job: ${job}`));
|
|
111
|
+
console.log(chalk.gray(`Status: ${task.status}`));
|
|
112
|
+
console.log(chalk.gray('---'));
|
|
113
|
+
console.log(content);
|
|
114
|
+
}
|
|
115
|
+
async function handleKill(options) {
|
|
116
|
+
const { job } = options;
|
|
117
|
+
if (!job) {
|
|
118
|
+
console.log(chalk.red('Error: --job is required'));
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const success = await killAgent(job);
|
|
122
|
+
if (success) {
|
|
123
|
+
console.log(chalk.green(`✓ Job "${job}" terminated`));
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
console.log(chalk.yellow(`⚠ Could not terminate job "${job}" (may have already finished)`));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=taskmgr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskmgr.js","sourceRoot":"","sources":["../../src/commands/taskmgr.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { initCommand } from './commands/init.js';
|
|
5
|
+
import { linkCommand } from './commands/link.js';
|
|
6
|
+
import { taskmgrCommand } from './commands/taskmgr.js';
|
|
7
|
+
import { skillCommand } from './commands/skill.js';
|
|
8
|
+
import { kbCommand } from './commands/kb.js';
|
|
9
|
+
const program = new Command();
|
|
10
|
+
program
|
|
11
|
+
.name('asyncwf')
|
|
12
|
+
.description(chalk.cyan('AsyncWF - Model-Driven Parallel Agent Workflow CLI'))
|
|
13
|
+
.version('1.0.0');
|
|
14
|
+
// Setup commands
|
|
15
|
+
program
|
|
16
|
+
.command('init')
|
|
17
|
+
.description('Initialize AsyncWF in the current directory')
|
|
18
|
+
.action(initCommand);
|
|
19
|
+
program
|
|
20
|
+
.command('link')
|
|
21
|
+
.description('Link local specs to global knowledge base')
|
|
22
|
+
.action(linkCommand);
|
|
23
|
+
// Task Manager
|
|
24
|
+
const taskmgr = program
|
|
25
|
+
.command('taskmgr')
|
|
26
|
+
.description('Task manager for parallel agent workflows');
|
|
27
|
+
taskmgr
|
|
28
|
+
.command('dispatch')
|
|
29
|
+
.description('Spawn a sub-agent task')
|
|
30
|
+
.requiredOption('--job <id>', 'Job identifier')
|
|
31
|
+
.requiredOption('--prompt <text>', 'Prompt for the sub-agent')
|
|
32
|
+
.option('--skill <name>', 'Skill to inject into prompt')
|
|
33
|
+
.action((opts) => taskmgrCommand('dispatch', opts));
|
|
34
|
+
taskmgr
|
|
35
|
+
.command('list')
|
|
36
|
+
.description('List all tasks')
|
|
37
|
+
.option('--status <status>', 'Filter by status (pending|running|done|failed)')
|
|
38
|
+
.action((opts) => taskmgrCommand('list', opts));
|
|
39
|
+
taskmgr
|
|
40
|
+
.command('wait')
|
|
41
|
+
.description('Wait for tasks to complete')
|
|
42
|
+
.requiredOption('--jobs <ids>', 'Comma-separated job IDs')
|
|
43
|
+
.option('--timeout <ms>', 'Timeout in milliseconds', '300000')
|
|
44
|
+
.action((opts) => taskmgrCommand('wait', opts));
|
|
45
|
+
taskmgr
|
|
46
|
+
.command('fetch')
|
|
47
|
+
.description('Fetch task output')
|
|
48
|
+
.requiredOption('--job <id>', 'Job identifier')
|
|
49
|
+
.action((opts) => taskmgrCommand('fetch', opts));
|
|
50
|
+
taskmgr
|
|
51
|
+
.command('kill')
|
|
52
|
+
.description('Kill a running task')
|
|
53
|
+
.requiredOption('--job <id>', 'Job identifier')
|
|
54
|
+
.action((opts) => taskmgrCommand('kill', opts));
|
|
55
|
+
// Skills Manager
|
|
56
|
+
const skill = program
|
|
57
|
+
.command('skill')
|
|
58
|
+
.description('Manage reusable skills');
|
|
59
|
+
skill
|
|
60
|
+
.command('list')
|
|
61
|
+
.description('List all available skills')
|
|
62
|
+
.action(() => skillCommand('list', {}));
|
|
63
|
+
skill
|
|
64
|
+
.command('show <name>')
|
|
65
|
+
.description('Display skill content')
|
|
66
|
+
.action((name) => skillCommand('show', { name }));
|
|
67
|
+
skill
|
|
68
|
+
.command('add <name>')
|
|
69
|
+
.description('Add or update a skill')
|
|
70
|
+
.requiredOption('--content <markdown>', 'Skill content in markdown')
|
|
71
|
+
.option('--description <text>', 'Skill description')
|
|
72
|
+
.option('--tags <tags>', 'Comma-separated tags')
|
|
73
|
+
.action((name, opts) => skillCommand('add', { name, ...opts }));
|
|
74
|
+
skill
|
|
75
|
+
.command('delete <name>')
|
|
76
|
+
.description('Delete a skill')
|
|
77
|
+
.action((name) => skillCommand('delete', { name }));
|
|
78
|
+
skill
|
|
79
|
+
.command('use <name>')
|
|
80
|
+
.description('Output skill content for prompt injection')
|
|
81
|
+
.action((name) => skillCommand('use', { name }));
|
|
82
|
+
// Knowledge Base
|
|
83
|
+
const kb = program
|
|
84
|
+
.command('kb')
|
|
85
|
+
.description('Manage knowledge base');
|
|
86
|
+
kb
|
|
87
|
+
.command('list')
|
|
88
|
+
.description('List all knowledge entries')
|
|
89
|
+
.action(() => kbCommand('list', {}));
|
|
90
|
+
kb
|
|
91
|
+
.command('show <topic>')
|
|
92
|
+
.description('Display knowledge entry')
|
|
93
|
+
.action((topic) => kbCommand('show', { topic }));
|
|
94
|
+
kb
|
|
95
|
+
.command('learn')
|
|
96
|
+
.description('Add learned knowledge')
|
|
97
|
+
.requiredOption('--topic <name>', 'Knowledge topic')
|
|
98
|
+
.requiredOption('--content <markdown>', 'Knowledge content')
|
|
99
|
+
.action((opts) => kbCommand('learn', opts));
|
|
100
|
+
kb
|
|
101
|
+
.command('search <query>')
|
|
102
|
+
.description('Search knowledge base')
|
|
103
|
+
.action((query) => kbCommand('search', { query }));
|
|
104
|
+
kb
|
|
105
|
+
.command('delete <topic>')
|
|
106
|
+
.description('Delete knowledge entry')
|
|
107
|
+
.action((topic) => kbCommand('delete', { topic }));
|
|
108
|
+
program.parse();
|
|
109
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Task } from '../types.js';
|
|
2
|
+
export declare function dispatchAgent(jobId: string, prompt: string, skillName?: string): Promise<Task>;
|
|
3
|
+
export declare function killAgent(jobId: string): Promise<boolean>;
|
|
4
|
+
export declare function waitForJobs(jobIds: string[], timeoutMs?: number): Promise<Task[]>;
|
|
5
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/lib/agent.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAKxC,wBAAsB,aAAa,CAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAqFf;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAyB/D;AAED,wBAAsB,WAAW,CAC7B,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,GAAE,MAAe,GAC3B,OAAO,CAAC,IAAI,EAAE,CAAC,CAwBjB"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import { createWriteStream, existsSync } from 'fs';
|
|
3
|
+
import { getLogPath, getLogsDir, createTask, updateTask, getTask } from './state.js';
|
|
4
|
+
import { getSkill, formatSkillForPrompt } from './skills.js';
|
|
5
|
+
// Store child process references for kill
|
|
6
|
+
const processes = new Map();
|
|
7
|
+
export async function dispatchAgent(jobId, prompt, skillName) {
|
|
8
|
+
// Build full prompt with skill if provided
|
|
9
|
+
let fullPrompt = prompt;
|
|
10
|
+
if (skillName) {
|
|
11
|
+
const skill = getSkill(skillName);
|
|
12
|
+
if (skill) {
|
|
13
|
+
fullPrompt = `${formatSkillForPrompt(skill)}\n\n${prompt}`;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
// Create log file
|
|
17
|
+
const logsDir = getLogsDir();
|
|
18
|
+
if (!existsSync(logsDir)) {
|
|
19
|
+
const { mkdirSync } = await import('fs');
|
|
20
|
+
mkdirSync(logsDir, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
const logPath = getLogPath(jobId);
|
|
23
|
+
const logStream = createWriteStream(logPath);
|
|
24
|
+
// Create task record
|
|
25
|
+
const task = await createTask({
|
|
26
|
+
id: jobId,
|
|
27
|
+
prompt: fullPrompt,
|
|
28
|
+
skill: skillName,
|
|
29
|
+
status: 'running',
|
|
30
|
+
logFile: logPath,
|
|
31
|
+
});
|
|
32
|
+
// Spawn the agent process
|
|
33
|
+
// Try claude CLI first, fallback to echo for testing
|
|
34
|
+
const agentCommand = process.env.ASYNCWF_AGENT || 'claude';
|
|
35
|
+
const args = agentCommand === 'claude'
|
|
36
|
+
? ['-p', fullPrompt]
|
|
37
|
+
: [fullPrompt]; // For testing with echo
|
|
38
|
+
try {
|
|
39
|
+
const child = spawn(agentCommand, args, {
|
|
40
|
+
detached: true,
|
|
41
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
42
|
+
shell: true,
|
|
43
|
+
});
|
|
44
|
+
processes.set(jobId, child);
|
|
45
|
+
// Pipe output to log file
|
|
46
|
+
child.stdout?.pipe(logStream);
|
|
47
|
+
child.stderr?.pipe(logStream);
|
|
48
|
+
// Update task with PID
|
|
49
|
+
await updateTask(jobId, { pid: child.pid });
|
|
50
|
+
// Handle process exit
|
|
51
|
+
child.on('exit', async (code) => {
|
|
52
|
+
processes.delete(jobId);
|
|
53
|
+
logStream.end();
|
|
54
|
+
await updateTask(jobId, {
|
|
55
|
+
status: code === 0 ? 'done' : 'failed',
|
|
56
|
+
exitCode: code ?? -1,
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
child.on('error', async (err) => {
|
|
60
|
+
processes.delete(jobId);
|
|
61
|
+
logStream.write(`\nError: ${err.message}\n`);
|
|
62
|
+
logStream.end();
|
|
63
|
+
await updateTask(jobId, {
|
|
64
|
+
status: 'failed',
|
|
65
|
+
exitCode: -1,
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
// Unref to allow parent to exit
|
|
69
|
+
child.unref();
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
logStream.write(`Failed to spawn agent: ${error}\n`);
|
|
73
|
+
logStream.end();
|
|
74
|
+
await updateTask(jobId, {
|
|
75
|
+
status: 'failed',
|
|
76
|
+
exitCode: -1,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return task;
|
|
80
|
+
}
|
|
81
|
+
export async function killAgent(jobId) {
|
|
82
|
+
const task = await getTask(jobId);
|
|
83
|
+
if (!task)
|
|
84
|
+
return false;
|
|
85
|
+
// Try to kill by stored process reference
|
|
86
|
+
const proc = processes.get(jobId);
|
|
87
|
+
if (proc && !proc.killed) {
|
|
88
|
+
proc.kill('SIGTERM');
|
|
89
|
+
processes.delete(jobId);
|
|
90
|
+
await updateTask(jobId, { status: 'failed', exitCode: -1 });
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
// Try to kill by PID
|
|
94
|
+
if (task.pid) {
|
|
95
|
+
try {
|
|
96
|
+
process.kill(task.pid, 'SIGTERM');
|
|
97
|
+
await updateTask(jobId, { status: 'failed', exitCode: -1 });
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Process may have already exited
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
export async function waitForJobs(jobIds, timeoutMs = 300000) {
|
|
107
|
+
const startTime = Date.now();
|
|
108
|
+
const pollInterval = 1000; // 1 second
|
|
109
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
110
|
+
const tasks = await Promise.all(jobIds.map(id => getTask(id)));
|
|
111
|
+
const validTasks = tasks.filter((t) => t !== undefined);
|
|
112
|
+
// Check if all tasks are complete
|
|
113
|
+
const allComplete = validTasks.every(t => t.status === 'done' || t.status === 'failed');
|
|
114
|
+
if (allComplete) {
|
|
115
|
+
return validTasks;
|
|
116
|
+
}
|
|
117
|
+
// Wait before next poll
|
|
118
|
+
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
119
|
+
}
|
|
120
|
+
// Timeout - return current state
|
|
121
|
+
const tasks = await Promise.all(jobIds.map(id => getTask(id)));
|
|
122
|
+
return tasks.filter((t) => t !== undefined);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/lib/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { KnowledgeEntry, KnowledgeIndex } from '../types.js';
|
|
2
|
+
export declare function ensureKnowledgeDir(): void;
|
|
3
|
+
export declare function listKnowledge(): KnowledgeIndex['entries'];
|
|
4
|
+
export declare function getKnowledge(topic: string): KnowledgeEntry | null;
|
|
5
|
+
export declare function learnKnowledge(topic: string, content: string, source?: KnowledgeEntry['source']): KnowledgeEntry;
|
|
6
|
+
export declare function searchKnowledge(query: string): KnowledgeEntry[];
|
|
7
|
+
export declare function deleteKnowledge(topic: string): boolean;
|
|
8
|
+
//# sourceMappingURL=knowledge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/lib/knowledge.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAclE,wBAAgB,kBAAkB,IAAI,IAAI,CAUzC;AAYD,wBAAgB,aAAa,IAAI,cAAc,CAAC,SAAS,CAAC,CAEzD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAqCjE;AAED,wBAAgB,cAAc,CAC1B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,cAAc,CAAC,QAAQ,CAAmB,GACnD,cAAc,CAkDhB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAyB/D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CActD"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
function getCKBDir() {
|
|
5
|
+
return join(homedir(), '.ckb');
|
|
6
|
+
}
|
|
7
|
+
function getKnowledgeDir() {
|
|
8
|
+
return join(getCKBDir(), 'knowledge');
|
|
9
|
+
}
|
|
10
|
+
function getKnowledgeIndexPath() {
|
|
11
|
+
return join(getKnowledgeDir(), '_index.json');
|
|
12
|
+
}
|
|
13
|
+
export function ensureKnowledgeDir() {
|
|
14
|
+
const dir = getKnowledgeDir();
|
|
15
|
+
if (!existsSync(dir)) {
|
|
16
|
+
mkdirSync(dir, { recursive: true });
|
|
17
|
+
}
|
|
18
|
+
const indexPath = getKnowledgeIndexPath();
|
|
19
|
+
if (!existsSync(indexPath)) {
|
|
20
|
+
writeFileSync(indexPath, JSON.stringify({ entries: [] }, null, 2));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function getKnowledgeIndex() {
|
|
24
|
+
ensureKnowledgeDir();
|
|
25
|
+
const data = readFileSync(getKnowledgeIndexPath(), 'utf-8');
|
|
26
|
+
return JSON.parse(data);
|
|
27
|
+
}
|
|
28
|
+
function saveKnowledgeIndex(index) {
|
|
29
|
+
writeFileSync(getKnowledgeIndexPath(), JSON.stringify(index, null, 2));
|
|
30
|
+
}
|
|
31
|
+
export function listKnowledge() {
|
|
32
|
+
return getKnowledgeIndex().entries;
|
|
33
|
+
}
|
|
34
|
+
export function getKnowledge(topic) {
|
|
35
|
+
const index = getKnowledgeIndex();
|
|
36
|
+
const entry = index.entries.find(e => e.topic === topic);
|
|
37
|
+
if (!entry)
|
|
38
|
+
return null;
|
|
39
|
+
const filePath = join(getKnowledgeDir(), `${topic}.md`);
|
|
40
|
+
if (!existsSync(filePath))
|
|
41
|
+
return null;
|
|
42
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
43
|
+
// Parse frontmatter
|
|
44
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
|
|
45
|
+
if (!frontmatterMatch) {
|
|
46
|
+
return {
|
|
47
|
+
topic,
|
|
48
|
+
created: entry.created,
|
|
49
|
+
updated: entry.updated,
|
|
50
|
+
source: 'model-learned',
|
|
51
|
+
content,
|
|
52
|
+
filePath,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const frontmatter = frontmatterMatch[1];
|
|
56
|
+
const body = frontmatterMatch[2];
|
|
57
|
+
// Simple parsing
|
|
58
|
+
const sourceMatch = frontmatter.match(/source:\s*(.+)/);
|
|
59
|
+
return {
|
|
60
|
+
topic,
|
|
61
|
+
created: entry.created,
|
|
62
|
+
updated: entry.updated,
|
|
63
|
+
source: (sourceMatch ? sourceMatch[1].trim() : 'model-learned'),
|
|
64
|
+
content: body.trim(),
|
|
65
|
+
filePath,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export function learnKnowledge(topic, content, source = 'model-learned') {
|
|
69
|
+
ensureKnowledgeDir();
|
|
70
|
+
const filePath = join(getKnowledgeDir(), `${topic}.md`);
|
|
71
|
+
const now = new Date().toISOString().split('T')[0];
|
|
72
|
+
// Check if exists for created date
|
|
73
|
+
const existing = getKnowledgeIndex().entries.find(e => e.topic === topic);
|
|
74
|
+
const created = existing?.created || now;
|
|
75
|
+
// Create markdown with frontmatter
|
|
76
|
+
const fullContent = `---
|
|
77
|
+
topic: ${topic}
|
|
78
|
+
created: ${created}
|
|
79
|
+
updated: ${now}
|
|
80
|
+
source: ${source}
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
${content}
|
|
84
|
+
`;
|
|
85
|
+
writeFileSync(filePath, fullContent);
|
|
86
|
+
// Update index
|
|
87
|
+
const index = getKnowledgeIndex();
|
|
88
|
+
const existingIndex = index.entries.findIndex(e => e.topic === topic);
|
|
89
|
+
const entry = {
|
|
90
|
+
topic,
|
|
91
|
+
created,
|
|
92
|
+
updated: now,
|
|
93
|
+
filePath,
|
|
94
|
+
};
|
|
95
|
+
if (existingIndex >= 0) {
|
|
96
|
+
index.entries[existingIndex] = entry;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
index.entries.push(entry);
|
|
100
|
+
}
|
|
101
|
+
saveKnowledgeIndex(index);
|
|
102
|
+
return {
|
|
103
|
+
topic,
|
|
104
|
+
created,
|
|
105
|
+
updated: now,
|
|
106
|
+
source,
|
|
107
|
+
content,
|
|
108
|
+
filePath,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
export function searchKnowledge(query) {
|
|
112
|
+
const index = getKnowledgeIndex();
|
|
113
|
+
const results = [];
|
|
114
|
+
const lowerQuery = query.toLowerCase();
|
|
115
|
+
for (const entry of index.entries) {
|
|
116
|
+
// Search in topic name
|
|
117
|
+
if (entry.topic.toLowerCase().includes(lowerQuery)) {
|
|
118
|
+
const kb = getKnowledge(entry.topic);
|
|
119
|
+
if (kb)
|
|
120
|
+
results.push(kb);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
// Search in content
|
|
124
|
+
const filePath = join(getKnowledgeDir(), `${entry.topic}.md`);
|
|
125
|
+
if (existsSync(filePath)) {
|
|
126
|
+
const content = readFileSync(filePath, 'utf-8').toLowerCase();
|
|
127
|
+
if (content.includes(lowerQuery)) {
|
|
128
|
+
const kb = getKnowledge(entry.topic);
|
|
129
|
+
if (kb)
|
|
130
|
+
results.push(kb);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return results;
|
|
135
|
+
}
|
|
136
|
+
export function deleteKnowledge(topic) {
|
|
137
|
+
const index = getKnowledgeIndex();
|
|
138
|
+
const entryIndex = index.entries.findIndex(e => e.topic === topic);
|
|
139
|
+
if (entryIndex === -1)
|
|
140
|
+
return false;
|
|
141
|
+
const filePath = join(getKnowledgeDir(), `${topic}.md`);
|
|
142
|
+
if (existsSync(filePath)) {
|
|
143
|
+
unlinkSync(filePath);
|
|
144
|
+
}
|
|
145
|
+
index.entries.splice(entryIndex, 1);
|
|
146
|
+
saveKnowledgeIndex(index);
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=knowledge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/lib/knowledge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Skill, SkillsIndex } from '../types.js';
|
|
2
|
+
export declare function ensureSkillsDir(): void;
|
|
3
|
+
export declare function listSkills(): SkillsIndex['skills'];
|
|
4
|
+
export declare function getSkill(name: string): Skill | null;
|
|
5
|
+
export declare function addSkill(name: string, content: string, description?: string, tags?: string[]): Skill;
|
|
6
|
+
export declare function deleteSkill(name: string): boolean;
|
|
7
|
+
export declare function formatSkillForPrompt(skill: Skill): string;
|
|
8
|
+
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/lib/skills.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AActD,wBAAgB,eAAe,IAAI,IAAI,CAUtC;AAYD,wBAAgB,UAAU,IAAI,WAAW,CAAC,QAAQ,CAAC,CAElD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAqCnD;AAED,wBAAgB,QAAQ,CACpB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,MAAW,EACxB,IAAI,GAAE,MAAM,EAAO,GACpB,KAAK,CA+CP;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAcjD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAMzD"}
|