@praveencs/agent 0.1.1 → 0.2.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/src/cli/commands/goal.d.ts +7 -0
- package/dist/src/cli/commands/goal.d.ts.map +1 -0
- package/dist/src/cli/commands/goal.js +246 -0
- package/dist/src/cli/commands/goal.js.map +1 -0
- package/dist/src/cli/commands/memory.d.ts +3 -0
- package/dist/src/cli/commands/memory.d.ts.map +1 -0
- package/dist/src/cli/commands/memory.js +108 -0
- package/dist/src/cli/commands/memory.js.map +1 -0
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +7 -2
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/goals/store.d.ts +128 -0
- package/dist/src/goals/store.d.ts.map +1 -0
- package/dist/src/goals/store.js +234 -0
- package/dist/src/goals/store.js.map +1 -0
- package/dist/src/memory/store.d.ts +69 -0
- package/dist/src/memory/store.d.ts.map +1 -0
- package/dist/src/memory/store.js +255 -0
- package/dist/src/memory/store.js.map +1 -0
- package/package.json +4 -2
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
export declare function createGoalCommand(): Command;
|
|
3
|
+
/**
|
|
4
|
+
* Standalone approve command (registered at top level: agent approve <id>)
|
|
5
|
+
*/
|
|
6
|
+
export declare function createApproveCommand(): Command;
|
|
7
|
+
//# sourceMappingURL=goal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/goal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkCpC,wBAAgB,iBAAiB,IAAI,OAAO,CAqO3C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAc9C"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { MemoryStore } from '../../memory/store.js';
|
|
4
|
+
import { GoalStore } from '../../goals/store.js';
|
|
5
|
+
function getStores() {
|
|
6
|
+
const mem = MemoryStore.open(process.cwd());
|
|
7
|
+
const goals = new GoalStore(mem);
|
|
8
|
+
return { mem, goals };
|
|
9
|
+
}
|
|
10
|
+
function progressBar(progress, width = 20) {
|
|
11
|
+
const filled = Math.round(progress * width);
|
|
12
|
+
const empty = width - filled;
|
|
13
|
+
const bar = '█'.repeat(filled) + '░'.repeat(empty);
|
|
14
|
+
const pct = Math.round(progress * 100);
|
|
15
|
+
return `${bar} ${pct}%`;
|
|
16
|
+
}
|
|
17
|
+
function statusIcon(status) {
|
|
18
|
+
switch (status) {
|
|
19
|
+
case 'active': return '🔄';
|
|
20
|
+
case 'completed': return '✅';
|
|
21
|
+
case 'failed': return '❌';
|
|
22
|
+
case 'paused': return '⏸️';
|
|
23
|
+
case 'cancelled': return '🚫';
|
|
24
|
+
case 'pending': return '⏳';
|
|
25
|
+
case 'queued': return '📋';
|
|
26
|
+
case 'running': return '🔄';
|
|
27
|
+
case 'blocked': return '🚧';
|
|
28
|
+
default: return '❓';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function createGoalCommand() {
|
|
32
|
+
const cmd = new Command('goal')
|
|
33
|
+
.description('Manage autonomous goals and tasks');
|
|
34
|
+
// ─── Add a goal ───
|
|
35
|
+
cmd
|
|
36
|
+
.command('add <title>')
|
|
37
|
+
.description('Add a new goal for the agent to accomplish')
|
|
38
|
+
.option('-d, --description <desc>', 'Detailed description')
|
|
39
|
+
.option('-p, --priority <n>', 'Priority 1-10 (1=critical)', '5')
|
|
40
|
+
.option('--deadline <date>', 'Deadline (ISO date format)')
|
|
41
|
+
.action(async (title, opts) => {
|
|
42
|
+
const { goals } = getStores();
|
|
43
|
+
const goal = goals.addGoal(title, {
|
|
44
|
+
description: opts.description,
|
|
45
|
+
priority: parseInt(opts.priority),
|
|
46
|
+
deadline: opts.deadline,
|
|
47
|
+
});
|
|
48
|
+
console.log(chalk.green(`\n✓ Goal #${goal.id} created`));
|
|
49
|
+
console.log(chalk.white.bold(` ${goal.title}`));
|
|
50
|
+
if (goal.description)
|
|
51
|
+
console.log(chalk.dim(` ${goal.description}`));
|
|
52
|
+
console.log(chalk.dim(` Priority: ${goal.priority}/10`));
|
|
53
|
+
if (goal.deadline)
|
|
54
|
+
console.log(chalk.dim(` Deadline: ${goal.deadline}`));
|
|
55
|
+
console.log(chalk.dim(`\n Add tasks: agent goal task ${goal.id} "task description"\n`));
|
|
56
|
+
});
|
|
57
|
+
// ─── List goals ───
|
|
58
|
+
cmd
|
|
59
|
+
.command('list')
|
|
60
|
+
.description('List all goals')
|
|
61
|
+
.option('-s, --status <status>', 'Filter by status: active|paused|completed|failed')
|
|
62
|
+
.action(async (opts) => {
|
|
63
|
+
const { goals } = getStores();
|
|
64
|
+
const allGoals = goals.listGoals(opts.status);
|
|
65
|
+
if (allGoals.length === 0) {
|
|
66
|
+
console.log(chalk.yellow('\nNo goals found.'));
|
|
67
|
+
console.log(chalk.dim(' Create one: agent goal add "Your goal"\n'));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
console.log(chalk.bold.cyan('\n🎯 Goals\n'));
|
|
71
|
+
for (const goal of allGoals) {
|
|
72
|
+
const tasks = goals.listTasks(goal.id);
|
|
73
|
+
const completed = tasks.filter(t => t.status === 'completed').length;
|
|
74
|
+
console.log(` ${statusIcon(goal.status)} ` +
|
|
75
|
+
`${chalk.dim(`#${goal.id}`)} ` +
|
|
76
|
+
chalk.white.bold(goal.title) +
|
|
77
|
+
` ${chalk.dim(`[P${goal.priority}]`)}`);
|
|
78
|
+
console.log(` ${progressBar(goal.progress)} ` +
|
|
79
|
+
chalk.dim(`(${completed}/${tasks.length} tasks)`));
|
|
80
|
+
if (goal.deadline) {
|
|
81
|
+
console.log(chalk.dim(` ⏰ Deadline: ${goal.deadline}`));
|
|
82
|
+
}
|
|
83
|
+
console.log();
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// ─── Goal status (detailed) ───
|
|
87
|
+
cmd
|
|
88
|
+
.command('status [goalId]')
|
|
89
|
+
.description('Show detailed goal status with tasks')
|
|
90
|
+
.action(async (goalId) => {
|
|
91
|
+
const { goals } = getStores();
|
|
92
|
+
if (goalId) {
|
|
93
|
+
// Show specific goal
|
|
94
|
+
const goal = goals.getGoal(parseInt(goalId));
|
|
95
|
+
if (!goal) {
|
|
96
|
+
console.error(chalk.red(`\n✗ Goal #${goalId} not found\n`));
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const tasks = goals.listTasks(goal.id);
|
|
100
|
+
console.log(chalk.bold.cyan(`\n🎯 ${goal.title}\n`));
|
|
101
|
+
console.log(` ${chalk.dim('Status:')} ${statusIcon(goal.status)} ${goal.status}`);
|
|
102
|
+
console.log(` ${chalk.dim('Priority:')} ${goal.priority}/10`);
|
|
103
|
+
console.log(` ${chalk.dim('Progress:')} ${progressBar(goal.progress)}`);
|
|
104
|
+
if (goal.deadline)
|
|
105
|
+
console.log(` ${chalk.dim('Deadline:')} ${goal.deadline}`);
|
|
106
|
+
if (goal.description)
|
|
107
|
+
console.log(` ${chalk.dim('Details:')} ${goal.description}`);
|
|
108
|
+
console.log();
|
|
109
|
+
if (tasks.length > 0) {
|
|
110
|
+
console.log(chalk.bold(' Tasks:'));
|
|
111
|
+
for (const task of tasks) {
|
|
112
|
+
const icon = statusIcon(task.status);
|
|
113
|
+
const skillTag = task.skill ? chalk.blue(` [${task.skill}]`) : '';
|
|
114
|
+
const approval = task.requires_approval && !task.approved_at
|
|
115
|
+
? chalk.yellow(' 🛡️ needs approval')
|
|
116
|
+
: '';
|
|
117
|
+
console.log(` ${icon} ${chalk.dim(`#${task.id}`)} ` +
|
|
118
|
+
chalk.white(task.title) +
|
|
119
|
+
skillTag +
|
|
120
|
+
approval);
|
|
121
|
+
if (task.error) {
|
|
122
|
+
console.log(chalk.red(` Error: ${task.error}`));
|
|
123
|
+
}
|
|
124
|
+
if (task.output) {
|
|
125
|
+
const preview = task.output.slice(0, 80);
|
|
126
|
+
console.log(chalk.dim(` Output: ${preview}${task.output.length > 80 ? '...' : ''}`));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
console.log(chalk.dim(' No tasks yet.'));
|
|
132
|
+
console.log(chalk.dim(` Add: agent goal task ${goal.id} "task description"`));
|
|
133
|
+
}
|
|
134
|
+
console.log();
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
// Show overview dashboard
|
|
138
|
+
const stats = goals.stats();
|
|
139
|
+
const activeGoals = goals.listGoals('active');
|
|
140
|
+
console.log(chalk.bold.cyan('\n📊 Agent Status Dashboard\n'));
|
|
141
|
+
console.log(` ${chalk.dim('Active Goals:')} ${stats.activeGoals}`);
|
|
142
|
+
console.log(` ${chalk.dim('Completed Goals:')} ${stats.completedGoals}`);
|
|
143
|
+
console.log(` ${chalk.dim('Pending Tasks:')} ${stats.pendingTasks}`);
|
|
144
|
+
console.log(` ${chalk.dim('Running Tasks:')} ${stats.runningTasks}`);
|
|
145
|
+
console.log(` ${chalk.dim('Awaiting Approval:')} ${stats.awaitingApproval}`);
|
|
146
|
+
console.log();
|
|
147
|
+
if (activeGoals.length > 0) {
|
|
148
|
+
console.log(chalk.bold(' Active Goals:'));
|
|
149
|
+
for (const goal of activeGoals) {
|
|
150
|
+
console.log(` ${chalk.dim(`#${goal.id}`)} ` +
|
|
151
|
+
chalk.white.bold(goal.title) +
|
|
152
|
+
` ${progressBar(goal.progress, 15)}`);
|
|
153
|
+
}
|
|
154
|
+
console.log();
|
|
155
|
+
}
|
|
156
|
+
const approvals = goals.getPendingApprovals();
|
|
157
|
+
if (approvals.length > 0) {
|
|
158
|
+
console.log(chalk.bold.yellow(' ⚠️ Awaiting Your Approval:'));
|
|
159
|
+
for (const task of approvals) {
|
|
160
|
+
console.log(` 🛡️ ${chalk.dim(`#${task.id}`)} ` +
|
|
161
|
+
chalk.white(task.title) +
|
|
162
|
+
chalk.dim(` (Goal #${task.goal_id})`));
|
|
163
|
+
}
|
|
164
|
+
console.log(chalk.dim(' Approve: agent approve <task-id>'));
|
|
165
|
+
console.log();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
// ─── Add task to goal ───
|
|
170
|
+
cmd
|
|
171
|
+
.command('task <goalId> <title>')
|
|
172
|
+
.description('Add a task to a goal')
|
|
173
|
+
.option('-s, --skill <skill>', 'Skill to use for this task')
|
|
174
|
+
.option('--depends <ids>', 'Comma-separated task IDs this depends on')
|
|
175
|
+
.option('--approval', 'Requires human approval before execution')
|
|
176
|
+
.action(async (goalId, title, opts) => {
|
|
177
|
+
const { goals } = getStores();
|
|
178
|
+
const goal = goals.getGoal(parseInt(goalId));
|
|
179
|
+
if (!goal) {
|
|
180
|
+
console.error(chalk.red(`\n✗ Goal #${goalId} not found\n`));
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const dependsOn = opts.depends
|
|
184
|
+
? opts.depends.split(',').map(id => parseInt(id.trim()))
|
|
185
|
+
: [];
|
|
186
|
+
const task = goals.addTask(parseInt(goalId), title, {
|
|
187
|
+
skill: opts.skill,
|
|
188
|
+
dependsOn,
|
|
189
|
+
requiresApproval: opts.approval ?? false,
|
|
190
|
+
});
|
|
191
|
+
console.log(chalk.green(`\n✓ Task #${task.id} added to Goal #${goalId}`));
|
|
192
|
+
console.log(chalk.white(` ${title}`));
|
|
193
|
+
if (opts.skill)
|
|
194
|
+
console.log(chalk.dim(` Skill: ${opts.skill}`));
|
|
195
|
+
if (dependsOn.length > 0)
|
|
196
|
+
console.log(chalk.dim(` Depends on: ${dependsOn.join(', ')}`));
|
|
197
|
+
if (opts.approval)
|
|
198
|
+
console.log(chalk.yellow(` ⚠️ Requires human approval`));
|
|
199
|
+
console.log();
|
|
200
|
+
});
|
|
201
|
+
// ─── Pause/Resume/Cancel goal ───
|
|
202
|
+
cmd
|
|
203
|
+
.command('pause <goalId>')
|
|
204
|
+
.description('Pause an active goal')
|
|
205
|
+
.action(async (goalId) => {
|
|
206
|
+
const { goals } = getStores();
|
|
207
|
+
goals.updateGoalStatus(parseInt(goalId), 'paused');
|
|
208
|
+
console.log(chalk.yellow(`\n⏸️ Goal #${goalId} paused\n`));
|
|
209
|
+
});
|
|
210
|
+
cmd
|
|
211
|
+
.command('resume <goalId>')
|
|
212
|
+
.description('Resume a paused goal')
|
|
213
|
+
.action(async (goalId) => {
|
|
214
|
+
const { goals } = getStores();
|
|
215
|
+
goals.updateGoalStatus(parseInt(goalId), 'active');
|
|
216
|
+
console.log(chalk.green(`\n▶️ Goal #${goalId} resumed\n`));
|
|
217
|
+
});
|
|
218
|
+
cmd
|
|
219
|
+
.command('cancel <goalId>')
|
|
220
|
+
.description('Cancel a goal')
|
|
221
|
+
.action(async (goalId) => {
|
|
222
|
+
const { goals } = getStores();
|
|
223
|
+
goals.updateGoalStatus(parseInt(goalId), 'cancelled');
|
|
224
|
+
console.log(chalk.red(`\n🚫 Goal #${goalId} cancelled\n`));
|
|
225
|
+
});
|
|
226
|
+
return cmd;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Standalone approve command (registered at top level: agent approve <id>)
|
|
230
|
+
*/
|
|
231
|
+
export function createApproveCommand() {
|
|
232
|
+
return new Command('approve')
|
|
233
|
+
.argument('<taskId>', 'Task ID to approve')
|
|
234
|
+
.description('Approve a task that requires human authorization')
|
|
235
|
+
.action(async (taskId) => {
|
|
236
|
+
const { goals } = getStores();
|
|
237
|
+
const approved = goals.approveTask(parseInt(taskId));
|
|
238
|
+
if (approved) {
|
|
239
|
+
console.log(chalk.green(`\n✅ Task #${taskId} approved and queued for execution\n`));
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
console.error(chalk.red(`\n✗ Task #${taskId} not found or doesn't require approval\n`));
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=goal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal.js","sourceRoot":"","sources":["../../../../src/cli/commands/goal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,SAAS,SAAS;IACd,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB,EAAE,KAAK,GAAG,EAAE;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;IACvC,OAAO,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AAC5B,CAAC;AAED,SAAS,UAAU,CAAC,MAAc;IAC9B,QAAQ,MAAM,EAAE,CAAC;QACb,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC;QAC3B,KAAK,WAAW,CAAC,CAAC,OAAO,GAAG,CAAC;QAC7B,KAAK,QAAQ,CAAC,CAAC,OAAO,GAAG,CAAC;QAC1B,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC;QAC3B,KAAK,WAAW,CAAC,CAAC,OAAO,IAAI,CAAC;QAC9B,KAAK,SAAS,CAAC,CAAC,OAAO,GAAG,CAAC;QAC3B,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC;QAC3B,KAAK,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC;QAC5B,KAAK,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC;QAC5B,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC;IACxB,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC7B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;SAC1B,WAAW,CAAC,mCAAmC,CAAC,CAAC;IAEtD,qBAAqB;IACrB,GAAG;SACE,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,0BAA0B,EAAE,sBAAsB,CAAC;SAC1D,MAAM,CAAC,oBAAoB,EAAE,4BAA4B,EAAE,GAAG,CAAC;SAC/D,MAAM,CAAC,mBAAmB,EAAE,4BAA4B,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAI7B,EAAE,EAAE;QACD,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE;YAC9B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;YACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;SAC1B,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC;QAC1D,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,IAAI,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEP,qBAAqB;IACrB,GAAG;SACE,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gBAAgB,CAAC;SAC7B,MAAM,CAAC,uBAAuB,EAAE,kDAAkD,CAAC;SACnF,MAAM,CAAC,KAAK,EAAE,IAAyB,EAAE,EAAE;QACxC,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,MAAa,CAAC,CAAC;QAErD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;YACrE,OAAO;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QAC7C,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;YAErE,OAAO,CAAC,GAAG,CACP,KAAK,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG;gBAC/B,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG;gBAC9B,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC5B,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CACzC,CAAC;YACF,OAAO,CAAC,GAAG,CACP,OAAO,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG;gBACpC,KAAK,CAAC,GAAG,CAAC,IAAI,SAAS,IAAI,KAAK,CAAC,MAAM,SAAS,CAAC,CACpD,CAAC;YACF,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC/D,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAClB,CAAC;IACL,CAAC,CAAC,CAAC;IAEP,iCAAiC;IACjC,GAAG;SACE,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,MAAe,EAAE,EAAE;QAC9B,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,CAAC;QAE9B,IAAI,MAAM,EAAE,CAAC;YACT,qBAAqB;YACrB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACR,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,MAAM,cAAc,CAAC,CAAC,CAAC;gBAC5D,OAAO;YACX,CAAC;YAED,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACzE,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC/E,IAAI,IAAI,CAAC,WAAW;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;gBACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACvB,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,WAAW;wBACxD,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC;wBACrC,CAAC,CAAC,EAAE,CAAC;oBAET,OAAO,CAAC,GAAG,CACP,OAAO,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG;wBAC1C,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;wBACvB,QAAQ;wBACR,QAAQ,CACX,CAAC;oBAEF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;oBACzD,CAAC;oBACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;wBACd,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;oBAC9F,CAAC;gBACL,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC;YACnF,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAClB,CAAC;aAAM,CAAC;YACJ,0BAA0B;YAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAC5B,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAE9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;YAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,QAAQ,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,QAAQ,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAC3C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;oBAC7B,OAAO,CAAC,GAAG,CACP,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG;wBAClC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;wBAC5B,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,CACvC,CAAC;gBACN,CAAC;gBACD,OAAO,CAAC,GAAG,EAAE,CAAC;YAClB,CAAC;YAED,MAAM,SAAS,GAAG,KAAK,CAAC,mBAAmB,EAAE,CAAC;YAC9C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBAC/D,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;oBAC3B,OAAO,CAAC,GAAG,CACP,WAAW,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG;wBACtC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;wBACvB,KAAK,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,OAAO,GAAG,CAAC,CACxC,CAAC;gBACN,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;gBAC/D,OAAO,CAAC,GAAG,EAAE,CAAC;YAClB,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;IAEP,2BAA2B;IAC3B,GAAG;SACE,OAAO,CAAC,uBAAuB,CAAC;SAChC,WAAW,CAAC,sBAAsB,CAAC;SACnC,MAAM,CAAC,qBAAqB,EAAE,4BAA4B,CAAC;SAC3D,MAAM,CAAC,iBAAiB,EAAE,0CAA0C,CAAC;SACrE,MAAM,CAAC,YAAY,EAAE,0CAA0C,CAAC;SAChE,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,KAAa,EAAE,IAI7C,EAAE,EAAE;QACD,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,MAAM,cAAc,CAAC,CAAC,CAAC;YAC5D,OAAO;QACX,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO;YAC1B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YACxD,CAAC,CAAC,EAAE,CAAC;QAET,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE;YAChD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS;YACT,gBAAgB,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;SAC3C,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,EAAE,mBAAmB,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACjE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1F,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEP,mCAAmC;IACnC,GAAG;SACE,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,sBAAsB,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE;QAC7B,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,CAAC;QAC9B,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,MAAM,WAAW,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEP,GAAG;SACE,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,sBAAsB,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE;QAC7B,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,CAAC;QAC9B,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,MAAM,YAAY,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEP,GAAG;SACE,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,eAAe,CAAC;SAC5B,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE;QAC7B,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,CAAC;QAC9B,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,MAAM,cAAc,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEP,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAChC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;SACxB,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;SAC1C,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE;QAC7B,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAErD,IAAI,QAAQ,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,MAAM,sCAAsC,CAAC,CAAC,CAAC;QACxF,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,MAAM,0CAA0C,CAAC,CAAC,CAAC;QAC5F,CAAC;IACL,CAAC,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,mBAAmB,IAAI,OAAO,CAuH7C"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { MemoryStore } from '../../memory/store.js';
|
|
4
|
+
export function createMemoryCommand() {
|
|
5
|
+
const cmd = new Command('memory')
|
|
6
|
+
.description('Manage agent persistent memory');
|
|
7
|
+
// ─── Save a memory ───
|
|
8
|
+
cmd
|
|
9
|
+
.command('save <content>')
|
|
10
|
+
.description('Save a memory (fact, preference, or project context)')
|
|
11
|
+
.option('-c, --category <cat>', 'Category: project|preference|fact|learned|general', 'general')
|
|
12
|
+
.option('-t, --tags <tags>', 'Comma-separated tags', '')
|
|
13
|
+
.action(async (content, opts) => {
|
|
14
|
+
const store = MemoryStore.open(process.cwd());
|
|
15
|
+
const tags = opts.tags ? opts.tags.split(',').map(t => t.trim()) : [];
|
|
16
|
+
const memory = store.save(content, opts.category, 'user', tags);
|
|
17
|
+
console.log(chalk.green(`\n✓ Memory saved (ID: ${memory.id})`));
|
|
18
|
+
console.log(chalk.dim(` Category: ${memory.category}`));
|
|
19
|
+
if (tags.length > 0)
|
|
20
|
+
console.log(chalk.dim(` Tags: ${tags.join(', ')}`));
|
|
21
|
+
console.log(chalk.dim(` Content: ${memory.content}\n`));
|
|
22
|
+
});
|
|
23
|
+
// ─── Search memories ───
|
|
24
|
+
cmd
|
|
25
|
+
.command('search <query>')
|
|
26
|
+
.description('Search memories using full-text search')
|
|
27
|
+
.option('-l, --limit <n>', 'Max results', '10')
|
|
28
|
+
.action(async (query, opts) => {
|
|
29
|
+
const store = MemoryStore.open(process.cwd());
|
|
30
|
+
const results = store.search(query, parseInt(opts.limit));
|
|
31
|
+
if (results.length === 0) {
|
|
32
|
+
console.log(chalk.yellow(`\nNo memories found matching "${query}"\n`));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
console.log(chalk.bold.cyan(`\n🧠 Memories matching "${query}":\n`));
|
|
36
|
+
for (const mem of results) {
|
|
37
|
+
console.log(` ${chalk.dim(`#${mem.id}`)} ` +
|
|
38
|
+
`${chalk.magenta(`[${mem.category}]`)} ` +
|
|
39
|
+
chalk.white(mem.content));
|
|
40
|
+
console.log(chalk.dim(` Saved: ${mem.created_at} | Source: ${mem.source}`));
|
|
41
|
+
if (mem.tags.length > 0) {
|
|
42
|
+
console.log(chalk.dim(` Tags: ${mem.tags.join(', ')}`));
|
|
43
|
+
}
|
|
44
|
+
console.log();
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
// ─── List all memories ───
|
|
48
|
+
cmd
|
|
49
|
+
.command('list')
|
|
50
|
+
.description('List all saved memories')
|
|
51
|
+
.option('-c, --category <cat>', 'Filter by category')
|
|
52
|
+
.option('-l, --limit <n>', 'Max results', '20')
|
|
53
|
+
.action(async (opts) => {
|
|
54
|
+
const store = MemoryStore.open(process.cwd());
|
|
55
|
+
const memories = store.list(opts.category, parseInt(opts.limit));
|
|
56
|
+
if (memories.length === 0) {
|
|
57
|
+
console.log(chalk.yellow('\nNo memories saved yet.'));
|
|
58
|
+
console.log(chalk.dim(' Save one: agent memory save "some fact"\n'));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
console.log(chalk.bold.cyan('\n🧠 Agent Memory\n'));
|
|
62
|
+
for (const mem of memories) {
|
|
63
|
+
console.log(` ${chalk.dim(`#${mem.id}`)} ` +
|
|
64
|
+
`${chalk.magenta(`[${mem.category}]`)} ` +
|
|
65
|
+
chalk.white(mem.content));
|
|
66
|
+
if (mem.tags.length > 0) {
|
|
67
|
+
console.log(chalk.dim(` Tags: ${mem.tags.join(', ')}`));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const stats = store.stats();
|
|
71
|
+
console.log(chalk.dim(`\n Total: ${stats.total} memories\n`));
|
|
72
|
+
});
|
|
73
|
+
// ─── Forget a memory ───
|
|
74
|
+
cmd
|
|
75
|
+
.command('forget <id>')
|
|
76
|
+
.description('Delete a memory by ID')
|
|
77
|
+
.action(async (id) => {
|
|
78
|
+
const store = MemoryStore.open(process.cwd());
|
|
79
|
+
const deleted = store.forget(parseInt(id));
|
|
80
|
+
if (deleted) {
|
|
81
|
+
console.log(chalk.green(`\n✓ Memory #${id} deleted\n`));
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
console.error(chalk.red(`\n✗ Memory #${id} not found\n`));
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
// ─── Memory stats ───
|
|
88
|
+
cmd
|
|
89
|
+
.command('stats')
|
|
90
|
+
.description('Show memory statistics')
|
|
91
|
+
.action(async () => {
|
|
92
|
+
const store = MemoryStore.open(process.cwd());
|
|
93
|
+
const stats = store.stats();
|
|
94
|
+
console.log(chalk.bold.cyan('\n📊 Memory Stats\n'));
|
|
95
|
+
console.log(` ${chalk.dim('Total:')} ${stats.total}`);
|
|
96
|
+
console.log(` ${chalk.dim('By Category:')}`);
|
|
97
|
+
for (const [cat, count] of Object.entries(stats.byCategory)) {
|
|
98
|
+
console.log(` ${chalk.magenta(cat)}: ${count}`);
|
|
99
|
+
}
|
|
100
|
+
console.log(` ${chalk.dim('By Source:')}`);
|
|
101
|
+
for (const [src, count] of Object.entries(stats.bySource)) {
|
|
102
|
+
console.log(` ${chalk.blue(src)}: ${count}`);
|
|
103
|
+
}
|
|
104
|
+
console.log();
|
|
105
|
+
});
|
|
106
|
+
return cmd;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../../src/cli/commands/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAyBnC"}
|
package/dist/src/cli/index.js
CHANGED
|
@@ -7,6 +7,8 @@ import { createDaemonCommand } from './commands/daemon.js';
|
|
|
7
7
|
import { createMcpCommand } from './commands/mcp.js';
|
|
8
8
|
import { createDoctorCommand } from './commands/doctor.js';
|
|
9
9
|
import { createConfigCommand } from './commands/config.js';
|
|
10
|
+
import { createMemoryCommand } from './commands/memory.js';
|
|
11
|
+
import { createGoalCommand, createApproveCommand } from './commands/goal.js';
|
|
10
12
|
/**
|
|
11
13
|
* Create the CLI program with all commands
|
|
12
14
|
*/
|
|
@@ -14,8 +16,8 @@ export function createCLI() {
|
|
|
14
16
|
const program = new Command();
|
|
15
17
|
program
|
|
16
18
|
.name('agent')
|
|
17
|
-
.description('Agent Runtime —
|
|
18
|
-
.version('0.
|
|
19
|
+
.description('Agent Runtime — autonomous, goal-oriented AI agent with skills, plans, memory, and permissioned tools')
|
|
20
|
+
.version('0.2.0')
|
|
19
21
|
.option('--verbose', 'Enable verbose output')
|
|
20
22
|
.option('--no-color', 'Disable colored output')
|
|
21
23
|
.option('--config <path>', 'Path to config file');
|
|
@@ -28,6 +30,9 @@ export function createCLI() {
|
|
|
28
30
|
program.addCommand(createMcpCommand());
|
|
29
31
|
program.addCommand(createDoctorCommand());
|
|
30
32
|
program.addCommand(createConfigCommand());
|
|
33
|
+
program.addCommand(createMemoryCommand());
|
|
34
|
+
program.addCommand(createGoalCommand());
|
|
35
|
+
program.addCommand(createApproveCommand());
|
|
31
36
|
return program;
|
|
32
37
|
}
|
|
33
38
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE7E;;GAEG;AACH,MAAM,UAAU,SAAS;IACrB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACF,IAAI,CAAC,OAAO,CAAC;SACb,WAAW,CAAC,uGAAuG,CAAC;SACpH,OAAO,CAAC,OAAO,CAAC;SAChB,MAAM,CAAC,WAAW,EAAE,uBAAuB,CAAC;SAC5C,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC;SAC9C,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC;IAEtD,wBAAwB;IACxB,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAE3C,OAAO,OAAO,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { MemoryStore } from '../memory/store.js';
|
|
2
|
+
/**
|
|
3
|
+
* Goal & Task management for autonomous execution
|
|
4
|
+
*/
|
|
5
|
+
export interface Goal {
|
|
6
|
+
id: number;
|
|
7
|
+
title: string;
|
|
8
|
+
description: string | null;
|
|
9
|
+
status: 'active' | 'paused' | 'completed' | 'failed' | 'cancelled';
|
|
10
|
+
priority: number;
|
|
11
|
+
created_at: string;
|
|
12
|
+
updated_at: string;
|
|
13
|
+
deadline: string | null;
|
|
14
|
+
parent_goal_id: number | null;
|
|
15
|
+
progress: number;
|
|
16
|
+
metadata: Record<string, any>;
|
|
17
|
+
}
|
|
18
|
+
export interface Task {
|
|
19
|
+
id: number;
|
|
20
|
+
goal_id: number;
|
|
21
|
+
title: string;
|
|
22
|
+
description: string | null;
|
|
23
|
+
status: 'pending' | 'queued' | 'running' | 'completed' | 'failed' | 'blocked' | 'cancelled';
|
|
24
|
+
skill: string | null;
|
|
25
|
+
input: Record<string, any>;
|
|
26
|
+
output: string | null;
|
|
27
|
+
depends_on: number[];
|
|
28
|
+
scheduled_at: string | null;
|
|
29
|
+
started_at: string | null;
|
|
30
|
+
completed_at: string | null;
|
|
31
|
+
retry_count: number;
|
|
32
|
+
max_retries: number;
|
|
33
|
+
error: string | null;
|
|
34
|
+
requires_approval: boolean;
|
|
35
|
+
approved_at: string | null;
|
|
36
|
+
created_at: string;
|
|
37
|
+
}
|
|
38
|
+
export declare class GoalStore {
|
|
39
|
+
private db;
|
|
40
|
+
constructor(memoryStore: MemoryStore);
|
|
41
|
+
/**
|
|
42
|
+
* Create a new goal
|
|
43
|
+
*/
|
|
44
|
+
addGoal(title: string, options?: {
|
|
45
|
+
description?: string;
|
|
46
|
+
priority?: number;
|
|
47
|
+
deadline?: string;
|
|
48
|
+
parentGoalId?: number;
|
|
49
|
+
}): Goal;
|
|
50
|
+
/**
|
|
51
|
+
* Get a goal by ID
|
|
52
|
+
*/
|
|
53
|
+
getGoal(id: number): Goal | null;
|
|
54
|
+
/**
|
|
55
|
+
* List goals by status
|
|
56
|
+
*/
|
|
57
|
+
listGoals(status?: Goal['status']): Goal[];
|
|
58
|
+
/**
|
|
59
|
+
* Update goal status
|
|
60
|
+
*/
|
|
61
|
+
updateGoalStatus(id: number, status: Goal['status']): void;
|
|
62
|
+
/**
|
|
63
|
+
* Update goal progress (0.0 to 1.0)
|
|
64
|
+
*/
|
|
65
|
+
updateGoalProgress(id: number): void;
|
|
66
|
+
/**
|
|
67
|
+
* Delete a goal and its tasks
|
|
68
|
+
*/
|
|
69
|
+
removeGoal(id: number): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Add a task to a goal
|
|
72
|
+
*/
|
|
73
|
+
addTask(goalId: number, title: string, options?: {
|
|
74
|
+
description?: string;
|
|
75
|
+
skill?: string;
|
|
76
|
+
input?: Record<string, any>;
|
|
77
|
+
dependsOn?: number[];
|
|
78
|
+
requiresApproval?: boolean;
|
|
79
|
+
scheduledAt?: string;
|
|
80
|
+
}): Task;
|
|
81
|
+
/**
|
|
82
|
+
* Get a task by ID
|
|
83
|
+
*/
|
|
84
|
+
getTask(id: number): Task | null;
|
|
85
|
+
/**
|
|
86
|
+
* List tasks for a goal
|
|
87
|
+
*/
|
|
88
|
+
listTasks(goalId: number): Task[];
|
|
89
|
+
/**
|
|
90
|
+
* Get the next executable task (respects dependencies)
|
|
91
|
+
*/
|
|
92
|
+
getNextTask(): Task | null;
|
|
93
|
+
/**
|
|
94
|
+
* Mark task as running
|
|
95
|
+
*/
|
|
96
|
+
startTask(id: number): void;
|
|
97
|
+
/**
|
|
98
|
+
* Mark task as completed
|
|
99
|
+
*/
|
|
100
|
+
completeTask(id: number, output: string): void;
|
|
101
|
+
/**
|
|
102
|
+
* Mark task as failed
|
|
103
|
+
*/
|
|
104
|
+
failTask(id: number, error: string): void;
|
|
105
|
+
/**
|
|
106
|
+
* Approve a task that requires human approval
|
|
107
|
+
*/
|
|
108
|
+
approveTask(id: number): boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Get tasks waiting for approval
|
|
111
|
+
*/
|
|
112
|
+
getPendingApprovals(): Task[];
|
|
113
|
+
/**
|
|
114
|
+
* Get summary stats
|
|
115
|
+
*/
|
|
116
|
+
stats(): {
|
|
117
|
+
activeGoals: number;
|
|
118
|
+
completedGoals: number;
|
|
119
|
+
pendingTasks: number;
|
|
120
|
+
runningTasks: number;
|
|
121
|
+
completedTasks: number;
|
|
122
|
+
failedTasks: number;
|
|
123
|
+
awaitingApproval: number;
|
|
124
|
+
};
|
|
125
|
+
private parseTask;
|
|
126
|
+
private logAudit;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/goals/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
export class GoalStore {
|
|
2
|
+
db;
|
|
3
|
+
constructor(memoryStore) {
|
|
4
|
+
// Reuse the same database from MemoryStore
|
|
5
|
+
this.db = memoryStore.db;
|
|
6
|
+
}
|
|
7
|
+
// ─── Goal Operations ──────────────────────────────────────
|
|
8
|
+
/**
|
|
9
|
+
* Create a new goal
|
|
10
|
+
*/
|
|
11
|
+
addGoal(title, options = {}) {
|
|
12
|
+
const stmt = this.db.prepare(`
|
|
13
|
+
INSERT INTO goals (title, description, priority, deadline, parent_goal_id)
|
|
14
|
+
VALUES (?, ?, ?, ?, ?)
|
|
15
|
+
`);
|
|
16
|
+
const result = stmt.run(title, options.description ?? null, options.priority ?? 5, options.deadline ?? null, options.parentGoalId ?? null);
|
|
17
|
+
this.logAudit('goal.created', 'goal', result.lastInsertRowid, title);
|
|
18
|
+
return this.getGoal(result.lastInsertRowid);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get a goal by ID
|
|
22
|
+
*/
|
|
23
|
+
getGoal(id) {
|
|
24
|
+
const row = this.db.prepare('SELECT * FROM goals WHERE id = ?').get(id);
|
|
25
|
+
if (!row)
|
|
26
|
+
return null;
|
|
27
|
+
return { ...row, metadata: JSON.parse(row.metadata || '{}') };
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* List goals by status
|
|
31
|
+
*/
|
|
32
|
+
listGoals(status) {
|
|
33
|
+
let rows;
|
|
34
|
+
if (status) {
|
|
35
|
+
rows = this.db.prepare('SELECT * FROM goals WHERE status = ? ORDER BY priority ASC, created_at DESC').all(status);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
rows = this.db.prepare('SELECT * FROM goals ORDER BY status ASC, priority ASC, created_at DESC').all();
|
|
39
|
+
}
|
|
40
|
+
return rows.map(r => ({ ...r, metadata: JSON.parse(r.metadata || '{}') }));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Update goal status
|
|
44
|
+
*/
|
|
45
|
+
updateGoalStatus(id, status) {
|
|
46
|
+
this.db.prepare(`
|
|
47
|
+
UPDATE goals SET status = ?, updated_at = datetime('now') WHERE id = ?
|
|
48
|
+
`).run(status, id);
|
|
49
|
+
this.logAudit(`goal.${status}`, 'goal', id, `Goal #${id} → ${status}`);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Update goal progress (0.0 to 1.0)
|
|
53
|
+
*/
|
|
54
|
+
updateGoalProgress(id) {
|
|
55
|
+
const tasks = this.listTasks(id);
|
|
56
|
+
if (tasks.length === 0)
|
|
57
|
+
return;
|
|
58
|
+
const completed = tasks.filter(t => t.status === 'completed').length;
|
|
59
|
+
const progress = completed / tasks.length;
|
|
60
|
+
this.db.prepare(`
|
|
61
|
+
UPDATE goals SET progress = ?, updated_at = datetime('now') WHERE id = ?
|
|
62
|
+
`).run(progress, id);
|
|
63
|
+
// Auto-complete goal if all tasks done
|
|
64
|
+
if (progress >= 1.0) {
|
|
65
|
+
this.updateGoalStatus(id, 'completed');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Delete a goal and its tasks
|
|
70
|
+
*/
|
|
71
|
+
removeGoal(id) {
|
|
72
|
+
const result = this.db.prepare('DELETE FROM goals WHERE id = ?').run(id);
|
|
73
|
+
return result.changes > 0;
|
|
74
|
+
}
|
|
75
|
+
// ─── Task Operations ──────────────────────────────────────
|
|
76
|
+
/**
|
|
77
|
+
* Add a task to a goal
|
|
78
|
+
*/
|
|
79
|
+
addTask(goalId, title, options = {}) {
|
|
80
|
+
const stmt = this.db.prepare(`
|
|
81
|
+
INSERT INTO tasks (goal_id, title, description, skill, input, depends_on, requires_approval, scheduled_at)
|
|
82
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
83
|
+
`);
|
|
84
|
+
const result = stmt.run(goalId, title, options.description ?? null, options.skill ?? null, JSON.stringify(options.input ?? {}), JSON.stringify(options.dependsOn ?? []), options.requiresApproval ? 1 : 0, options.scheduledAt ?? null);
|
|
85
|
+
this.logAudit('task.created', 'task', result.lastInsertRowid, title);
|
|
86
|
+
return this.getTask(result.lastInsertRowid);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get a task by ID
|
|
90
|
+
*/
|
|
91
|
+
getTask(id) {
|
|
92
|
+
const row = this.db.prepare('SELECT * FROM tasks WHERE id = ?').get(id);
|
|
93
|
+
if (!row)
|
|
94
|
+
return null;
|
|
95
|
+
return this.parseTask(row);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* List tasks for a goal
|
|
99
|
+
*/
|
|
100
|
+
listTasks(goalId) {
|
|
101
|
+
const rows = this.db.prepare('SELECT * FROM tasks WHERE goal_id = ? ORDER BY id ASC').all(goalId);
|
|
102
|
+
return rows.map(r => this.parseTask(r));
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get the next executable task (respects dependencies)
|
|
106
|
+
*/
|
|
107
|
+
getNextTask() {
|
|
108
|
+
// Get all pending/queued tasks ordered by goal priority
|
|
109
|
+
const candidates = this.db.prepare(`
|
|
110
|
+
SELECT t.* FROM tasks t
|
|
111
|
+
JOIN goals g ON t.goal_id = g.id
|
|
112
|
+
WHERE t.status IN ('pending', 'queued')
|
|
113
|
+
AND g.status = 'active'
|
|
114
|
+
ORDER BY g.priority ASC, t.id ASC
|
|
115
|
+
`).all();
|
|
116
|
+
for (const row of candidates) {
|
|
117
|
+
const task = this.parseTask(row);
|
|
118
|
+
// Check dependencies
|
|
119
|
+
if (task.depends_on.length > 0) {
|
|
120
|
+
const deps = task.depends_on.map(id => this.getTask(id));
|
|
121
|
+
const allMet = deps.every(d => d?.status === 'completed');
|
|
122
|
+
if (!allMet)
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
// Check if approval is needed and granted
|
|
126
|
+
if (task.requires_approval && !task.approved_at)
|
|
127
|
+
continue;
|
|
128
|
+
return task;
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Mark task as running
|
|
134
|
+
*/
|
|
135
|
+
startTask(id) {
|
|
136
|
+
this.db.prepare(`
|
|
137
|
+
UPDATE tasks SET status = 'running', started_at = datetime('now') WHERE id = ?
|
|
138
|
+
`).run(id);
|
|
139
|
+
this.logAudit('task.started', 'task', id, `Task #${id} started`);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Mark task as completed
|
|
143
|
+
*/
|
|
144
|
+
completeTask(id, output) {
|
|
145
|
+
this.db.prepare(`
|
|
146
|
+
UPDATE tasks SET status = 'completed', output = ?, completed_at = datetime('now')
|
|
147
|
+
WHERE id = ?
|
|
148
|
+
`).run(output, id);
|
|
149
|
+
this.logAudit('task.completed', 'task', id, `Task #${id} completed`);
|
|
150
|
+
// Update goal progress
|
|
151
|
+
const task = this.getTask(id);
|
|
152
|
+
if (task)
|
|
153
|
+
this.updateGoalProgress(task.goal_id);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Mark task as failed
|
|
157
|
+
*/
|
|
158
|
+
failTask(id, error) {
|
|
159
|
+
const task = this.getTask(id);
|
|
160
|
+
if (!task)
|
|
161
|
+
return;
|
|
162
|
+
if (task.retry_count < task.max_retries) {
|
|
163
|
+
// Retry
|
|
164
|
+
this.db.prepare(`
|
|
165
|
+
UPDATE tasks SET status = 'pending', retry_count = retry_count + 1, error = ?
|
|
166
|
+
WHERE id = ?
|
|
167
|
+
`).run(error, id);
|
|
168
|
+
this.logAudit('task.retry', 'task', id, `Task #${id} retry ${task.retry_count + 1}/${task.max_retries}: ${error}`);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
// Final failure
|
|
172
|
+
this.db.prepare(`
|
|
173
|
+
UPDATE tasks SET status = 'failed', error = ?, completed_at = datetime('now')
|
|
174
|
+
WHERE id = ?
|
|
175
|
+
`).run(error, id);
|
|
176
|
+
this.logAudit('task.failed', 'task', id, `Task #${id} failed: ${error}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Approve a task that requires human approval
|
|
181
|
+
*/
|
|
182
|
+
approveTask(id) {
|
|
183
|
+
const result = this.db.prepare(`
|
|
184
|
+
UPDATE tasks SET approved_at = datetime('now'), status = 'queued'
|
|
185
|
+
WHERE id = ? AND requires_approval = 1
|
|
186
|
+
`).run(id);
|
|
187
|
+
if (result.changes > 0) {
|
|
188
|
+
this.logAudit('task.approved', 'task', id, `Task #${id} approved`);
|
|
189
|
+
}
|
|
190
|
+
return result.changes > 0;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Get tasks waiting for approval
|
|
194
|
+
*/
|
|
195
|
+
getPendingApprovals() {
|
|
196
|
+
const rows = this.db.prepare(`
|
|
197
|
+
SELECT * FROM tasks
|
|
198
|
+
WHERE requires_approval = 1 AND approved_at IS NULL
|
|
199
|
+
AND status NOT IN ('cancelled', 'completed', 'failed')
|
|
200
|
+
ORDER BY id ASC
|
|
201
|
+
`).all();
|
|
202
|
+
return rows.map(r => this.parseTask(r));
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Get summary stats
|
|
206
|
+
*/
|
|
207
|
+
stats() {
|
|
208
|
+
return {
|
|
209
|
+
activeGoals: this.db.prepare("SELECT COUNT(*) as c FROM goals WHERE status = 'active'").get().c,
|
|
210
|
+
completedGoals: this.db.prepare("SELECT COUNT(*) as c FROM goals WHERE status = 'completed'").get().c,
|
|
211
|
+
pendingTasks: this.db.prepare("SELECT COUNT(*) as c FROM tasks WHERE status IN ('pending','queued')").get().c,
|
|
212
|
+
runningTasks: this.db.prepare("SELECT COUNT(*) as c FROM tasks WHERE status = 'running'").get().c,
|
|
213
|
+
completedTasks: this.db.prepare("SELECT COUNT(*) as c FROM tasks WHERE status = 'completed'").get().c,
|
|
214
|
+
failedTasks: this.db.prepare("SELECT COUNT(*) as c FROM tasks WHERE status = 'failed'").get().c,
|
|
215
|
+
awaitingApproval: this.db.prepare("SELECT COUNT(*) as c FROM tasks WHERE requires_approval = 1 AND approved_at IS NULL AND status NOT IN ('cancelled','completed','failed')").get().c,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
// ─── Helpers ──────────────────────────────────────────────
|
|
219
|
+
parseTask(row) {
|
|
220
|
+
return {
|
|
221
|
+
...row,
|
|
222
|
+
input: JSON.parse(row.input || '{}'),
|
|
223
|
+
depends_on: JSON.parse(row.depends_on || '[]'),
|
|
224
|
+
requires_approval: !!row.requires_approval,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
logAudit(eventType, entityType, entityId, details) {
|
|
228
|
+
this.db.prepare(`
|
|
229
|
+
INSERT INTO audit_events (event_type, entity_type, entity_id, action, details)
|
|
230
|
+
VALUES (?, ?, ?, ?, ?)
|
|
231
|
+
`).run(eventType, entityType, entityId, eventType, details);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/goals/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Store — Persistent agent memory backed by SQLite + FTS5
|
|
3
|
+
*
|
|
4
|
+
* Stores facts, project context, and learned information
|
|
5
|
+
* that persists across sessions.
|
|
6
|
+
*/
|
|
7
|
+
export interface Memory {
|
|
8
|
+
id: number;
|
|
9
|
+
content: string;
|
|
10
|
+
category: 'project' | 'preference' | 'fact' | 'learned' | 'general';
|
|
11
|
+
source: 'user' | 'agent' | 'auto';
|
|
12
|
+
tags: string[];
|
|
13
|
+
created_at: string;
|
|
14
|
+
accessed_at: string | null;
|
|
15
|
+
relevance_score: number;
|
|
16
|
+
}
|
|
17
|
+
export interface MemorySearchResult extends Memory {
|
|
18
|
+
rank: number;
|
|
19
|
+
}
|
|
20
|
+
export declare class MemoryStore {
|
|
21
|
+
private db;
|
|
22
|
+
private static instance;
|
|
23
|
+
constructor(dbPath: string);
|
|
24
|
+
/**
|
|
25
|
+
* Get singleton instance scoped to a working directory
|
|
26
|
+
*/
|
|
27
|
+
static open(workDir: string): MemoryStore;
|
|
28
|
+
/**
|
|
29
|
+
* Run database migrations
|
|
30
|
+
*/
|
|
31
|
+
private migrate;
|
|
32
|
+
/**
|
|
33
|
+
* Save a new memory
|
|
34
|
+
*/
|
|
35
|
+
save(content: string, category?: Memory['category'], source?: Memory['source'], tags?: string[]): Memory;
|
|
36
|
+
/**
|
|
37
|
+
* Search memories using full-text search
|
|
38
|
+
*/
|
|
39
|
+
search(query: string, limit?: number): MemorySearchResult[];
|
|
40
|
+
/**
|
|
41
|
+
* Get all memories, optionally filtered by category
|
|
42
|
+
*/
|
|
43
|
+
list(category?: Memory['category'], limit?: number): Memory[];
|
|
44
|
+
/**
|
|
45
|
+
* Get a specific memory by ID
|
|
46
|
+
*/
|
|
47
|
+
getMemory(id: number): Memory | null;
|
|
48
|
+
/**
|
|
49
|
+
* Delete a memory
|
|
50
|
+
*/
|
|
51
|
+
forget(id: number): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Get relevant context for an LLM prompt
|
|
54
|
+
* Searches memories and returns formatted context
|
|
55
|
+
*/
|
|
56
|
+
getContext(query: string, maxTokens?: number): string;
|
|
57
|
+
/**
|
|
58
|
+
* Get memory count and stats
|
|
59
|
+
*/
|
|
60
|
+
stats(): {
|
|
61
|
+
total: number;
|
|
62
|
+
byCategory: Record<string, number>;
|
|
63
|
+
bySource: Record<string, number>;
|
|
64
|
+
};
|
|
65
|
+
private logAudit;
|
|
66
|
+
getAuditLog(limit?: number): any[];
|
|
67
|
+
close(): void;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/memory/store.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,MAAM,WAAW,MAAM;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,SAAS,GAAG,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACpE,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAClC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAmB,SAAQ,MAAM;IAC9C,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,WAAW;IACpB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA4B;gBAEvC,MAAM,EAAE,MAAM;IAY1B;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW;IASzC;;OAEG;IACH,OAAO,CAAC,OAAO;IAsGf;;OAEG;IACH,IAAI,CACA,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAM,CAAC,UAAU,CAAa,EACxC,MAAM,GAAE,MAAM,CAAC,QAAQ,CAAU,EACjC,IAAI,GAAE,MAAM,EAAO,GACpB,MAAM;IAYT;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,kBAAkB,EAAE;IA0BvD;;OAEG;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,KAAK,SAAK,GAAG,MAAM,EAAE;IAqBzD;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOpC;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAS3B;;;OAGG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,MAAM;IAkBlD;;OAEG;IACH,KAAK,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;IAoBhG,OAAO,CAAC,QAAQ;IAOhB,WAAW,CAAC,KAAK,SAAK,GAAG,GAAG,EAAE;IAQ9B,KAAK,IAAI,IAAI;CAIhB"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { mkdirSync } from 'node:fs';
|
|
4
|
+
export class MemoryStore {
|
|
5
|
+
db;
|
|
6
|
+
static instance = null;
|
|
7
|
+
constructor(dbPath) {
|
|
8
|
+
// Ensure directory exists
|
|
9
|
+
mkdirSync(path.dirname(dbPath), { recursive: true });
|
|
10
|
+
this.db = new Database(dbPath);
|
|
11
|
+
// Enable WAL mode for better concurrent performance
|
|
12
|
+
this.db.pragma('journal_mode = WAL');
|
|
13
|
+
this.migrate();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get singleton instance scoped to a working directory
|
|
17
|
+
*/
|
|
18
|
+
static open(workDir) {
|
|
19
|
+
const dbPath = path.join(workDir, '.agent', 'memory.db');
|
|
20
|
+
if (!MemoryStore.instance || MemoryStore.instance._path !== dbPath) {
|
|
21
|
+
MemoryStore.instance = new MemoryStore(dbPath);
|
|
22
|
+
MemoryStore.instance._path = dbPath;
|
|
23
|
+
}
|
|
24
|
+
return MemoryStore.instance;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Run database migrations
|
|
28
|
+
*/
|
|
29
|
+
migrate() {
|
|
30
|
+
this.db.exec(`
|
|
31
|
+
-- Memories table
|
|
32
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
33
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
34
|
+
content TEXT NOT NULL,
|
|
35
|
+
category TEXT DEFAULT 'general'
|
|
36
|
+
CHECK(category IN ('project','preference','fact','learned','general')),
|
|
37
|
+
source TEXT DEFAULT 'user'
|
|
38
|
+
CHECK(source IN ('user','agent','auto')),
|
|
39
|
+
tags TEXT DEFAULT '[]',
|
|
40
|
+
created_at DATETIME DEFAULT (datetime('now')),
|
|
41
|
+
accessed_at DATETIME,
|
|
42
|
+
relevance_score REAL DEFAULT 1.0
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
-- Full-text search index
|
|
46
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
|
|
47
|
+
content, category, tags,
|
|
48
|
+
content='memories',
|
|
49
|
+
content_rowid='id'
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
-- Triggers to keep FTS in sync
|
|
53
|
+
CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN
|
|
54
|
+
INSERT INTO memories_fts(rowid, content, category, tags)
|
|
55
|
+
VALUES (new.id, new.content, new.category, new.tags);
|
|
56
|
+
END;
|
|
57
|
+
|
|
58
|
+
CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN
|
|
59
|
+
INSERT INTO memories_fts(memories_fts, rowid, content, category, tags)
|
|
60
|
+
VALUES ('delete', old.id, old.content, old.category, old.tags);
|
|
61
|
+
END;
|
|
62
|
+
|
|
63
|
+
CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN
|
|
64
|
+
INSERT INTO memories_fts(memories_fts, rowid, content, category, tags)
|
|
65
|
+
VALUES ('delete', old.id, old.content, old.category, old.tags);
|
|
66
|
+
INSERT INTO memories_fts(rowid, content, category, tags)
|
|
67
|
+
VALUES (new.id, new.content, new.category, new.tags);
|
|
68
|
+
END;
|
|
69
|
+
|
|
70
|
+
-- Goals table
|
|
71
|
+
CREATE TABLE IF NOT EXISTS goals (
|
|
72
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
73
|
+
title TEXT NOT NULL,
|
|
74
|
+
description TEXT,
|
|
75
|
+
status TEXT DEFAULT 'active'
|
|
76
|
+
CHECK(status IN ('active','paused','completed','failed','cancelled')),
|
|
77
|
+
priority INTEGER DEFAULT 5
|
|
78
|
+
CHECK(priority BETWEEN 1 AND 10),
|
|
79
|
+
created_at DATETIME DEFAULT (datetime('now')),
|
|
80
|
+
updated_at DATETIME DEFAULT (datetime('now')),
|
|
81
|
+
deadline DATETIME,
|
|
82
|
+
parent_goal_id INTEGER REFERENCES goals(id),
|
|
83
|
+
progress REAL DEFAULT 0.0,
|
|
84
|
+
metadata TEXT DEFAULT '{}'
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
-- Tasks table
|
|
88
|
+
CREATE TABLE IF NOT EXISTS tasks (
|
|
89
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
90
|
+
goal_id INTEGER REFERENCES goals(id) ON DELETE CASCADE,
|
|
91
|
+
title TEXT NOT NULL,
|
|
92
|
+
description TEXT,
|
|
93
|
+
status TEXT DEFAULT 'pending'
|
|
94
|
+
CHECK(status IN ('pending','queued','running','completed','failed','blocked','cancelled')),
|
|
95
|
+
skill TEXT,
|
|
96
|
+
input TEXT DEFAULT '{}',
|
|
97
|
+
output TEXT,
|
|
98
|
+
depends_on TEXT DEFAULT '[]',
|
|
99
|
+
scheduled_at DATETIME,
|
|
100
|
+
started_at DATETIME,
|
|
101
|
+
completed_at DATETIME,
|
|
102
|
+
retry_count INTEGER DEFAULT 0,
|
|
103
|
+
max_retries INTEGER DEFAULT 3,
|
|
104
|
+
error TEXT,
|
|
105
|
+
requires_approval BOOLEAN DEFAULT 0,
|
|
106
|
+
approved_at DATETIME,
|
|
107
|
+
created_at DATETIME DEFAULT (datetime('now'))
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
-- Audit events table
|
|
111
|
+
CREATE TABLE IF NOT EXISTS audit_events (
|
|
112
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
113
|
+
event_type TEXT NOT NULL,
|
|
114
|
+
entity_type TEXT,
|
|
115
|
+
entity_id INTEGER,
|
|
116
|
+
action TEXT NOT NULL,
|
|
117
|
+
details TEXT,
|
|
118
|
+
created_at DATETIME DEFAULT (datetime('now'))
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
-- Indexes
|
|
122
|
+
CREATE INDEX IF NOT EXISTS idx_goals_status ON goals(status);
|
|
123
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_goal ON tasks(goal_id);
|
|
124
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
|
|
125
|
+
CREATE INDEX IF NOT EXISTS idx_audit_entity ON audit_events(entity_type, entity_id);
|
|
126
|
+
`);
|
|
127
|
+
}
|
|
128
|
+
// ─── Memory Operations ─────────────────────────────────────
|
|
129
|
+
/**
|
|
130
|
+
* Save a new memory
|
|
131
|
+
*/
|
|
132
|
+
save(content, category = 'general', source = 'user', tags = []) {
|
|
133
|
+
const stmt = this.db.prepare(`
|
|
134
|
+
INSERT INTO memories (content, category, source, tags)
|
|
135
|
+
VALUES (?, ?, ?, ?)
|
|
136
|
+
`);
|
|
137
|
+
const result = stmt.run(content, category, source, JSON.stringify(tags));
|
|
138
|
+
this.logAudit('memory.save', 'memory', result.lastInsertRowid, content);
|
|
139
|
+
return this.getMemory(result.lastInsertRowid);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Search memories using full-text search
|
|
143
|
+
*/
|
|
144
|
+
search(query, limit = 10) {
|
|
145
|
+
const stmt = this.db.prepare(`
|
|
146
|
+
SELECT m.*, fts.rank
|
|
147
|
+
FROM memories_fts fts
|
|
148
|
+
JOIN memories m ON m.id = fts.rowid
|
|
149
|
+
WHERE memories_fts MATCH ?
|
|
150
|
+
ORDER BY fts.rank
|
|
151
|
+
LIMIT ?
|
|
152
|
+
`);
|
|
153
|
+
const results = stmt.all(query, limit);
|
|
154
|
+
// Update accessed_at for returned memories
|
|
155
|
+
const updateStmt = this.db.prepare(`
|
|
156
|
+
UPDATE memories SET accessed_at = datetime('now') WHERE id = ?
|
|
157
|
+
`);
|
|
158
|
+
for (const r of results) {
|
|
159
|
+
updateStmt.run(r.id);
|
|
160
|
+
}
|
|
161
|
+
return results.map(r => ({
|
|
162
|
+
...r,
|
|
163
|
+
tags: JSON.parse(r.tags || '[]'),
|
|
164
|
+
}));
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get all memories, optionally filtered by category
|
|
168
|
+
*/
|
|
169
|
+
list(category, limit = 50) {
|
|
170
|
+
let stmt;
|
|
171
|
+
if (category) {
|
|
172
|
+
stmt = this.db.prepare(`
|
|
173
|
+
SELECT * FROM memories WHERE category = ?
|
|
174
|
+
ORDER BY created_at DESC LIMIT ?
|
|
175
|
+
`);
|
|
176
|
+
return stmt.all(category, limit).map(r => ({
|
|
177
|
+
...r,
|
|
178
|
+
tags: JSON.parse(r.tags || '[]'),
|
|
179
|
+
}));
|
|
180
|
+
}
|
|
181
|
+
stmt = this.db.prepare(`
|
|
182
|
+
SELECT * FROM memories ORDER BY created_at DESC LIMIT ?
|
|
183
|
+
`);
|
|
184
|
+
return stmt.all(limit).map(r => ({
|
|
185
|
+
...r,
|
|
186
|
+
tags: JSON.parse(r.tags || '[]'),
|
|
187
|
+
}));
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get a specific memory by ID
|
|
191
|
+
*/
|
|
192
|
+
getMemory(id) {
|
|
193
|
+
const stmt = this.db.prepare('SELECT * FROM memories WHERE id = ?');
|
|
194
|
+
const row = stmt.get(id);
|
|
195
|
+
if (!row)
|
|
196
|
+
return null;
|
|
197
|
+
return { ...row, tags: JSON.parse(row.tags || '[]') };
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Delete a memory
|
|
201
|
+
*/
|
|
202
|
+
forget(id) {
|
|
203
|
+
const stmt = this.db.prepare('DELETE FROM memories WHERE id = ?');
|
|
204
|
+
const result = stmt.run(id);
|
|
205
|
+
if (result.changes > 0) {
|
|
206
|
+
this.logAudit('memory.forget', 'memory', id, `Deleted memory #${id}`);
|
|
207
|
+
}
|
|
208
|
+
return result.changes > 0;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Get relevant context for an LLM prompt
|
|
212
|
+
* Searches memories and returns formatted context
|
|
213
|
+
*/
|
|
214
|
+
getContext(query, maxTokens = 500) {
|
|
215
|
+
const results = this.search(query, 5);
|
|
216
|
+
if (results.length === 0)
|
|
217
|
+
return '';
|
|
218
|
+
const lines = results.map(r => `- [${r.category}] ${r.content}`);
|
|
219
|
+
const context = lines.join('\n');
|
|
220
|
+
// Rough token estimate (4 chars ≈ 1 token)
|
|
221
|
+
if (context.length > maxTokens * 4) {
|
|
222
|
+
return context.slice(0, maxTokens * 4) + '\n...';
|
|
223
|
+
}
|
|
224
|
+
return context;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Get memory count and stats
|
|
228
|
+
*/
|
|
229
|
+
stats() {
|
|
230
|
+
const total = this.db.prepare('SELECT COUNT(*) as c FROM memories').get().c;
|
|
231
|
+
const byCat = this.db.prepare('SELECT category, COUNT(*) as c FROM memories GROUP BY category').all();
|
|
232
|
+
const bySrc = this.db.prepare('SELECT source, COUNT(*) as c FROM memories GROUP BY source').all();
|
|
233
|
+
return {
|
|
234
|
+
total,
|
|
235
|
+
byCategory: Object.fromEntries(byCat.map(r => [r.category, r.c])),
|
|
236
|
+
bySource: Object.fromEntries(bySrc.map(r => [r.source, r.c])),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
// ─── Audit Operations ─────────────────────────────────────
|
|
240
|
+
logAudit(eventType, entityType, entityId, details) {
|
|
241
|
+
this.db.prepare(`
|
|
242
|
+
INSERT INTO audit_events (event_type, entity_type, entity_id, action, details)
|
|
243
|
+
VALUES (?, ?, ?, ?, ?)
|
|
244
|
+
`).run(eventType, entityType, entityId, eventType, details);
|
|
245
|
+
}
|
|
246
|
+
getAuditLog(limit = 20) {
|
|
247
|
+
return this.db.prepare('SELECT * FROM audit_events ORDER BY created_at DESC LIMIT ?').all(limit);
|
|
248
|
+
}
|
|
249
|
+
// ─── Cleanup ─────────────────────────────────────────────
|
|
250
|
+
close() {
|
|
251
|
+
this.db.close();
|
|
252
|
+
MemoryStore.instance = null;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/memory/store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praveencs/agent",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"files": [
|
|
5
5
|
"dist",
|
|
6
6
|
"bin",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"dependencies": {
|
|
48
48
|
"@anthropic-ai/sdk": "^0.39.0",
|
|
49
49
|
"@modelcontextprotocol/sdk": "^1.5.0",
|
|
50
|
+
"better-sqlite3": "^12.6.2",
|
|
50
51
|
"chalk": "^5.4.1",
|
|
51
52
|
"chokidar": "^4.0.3",
|
|
52
53
|
"commander": "^13.1.0",
|
|
@@ -64,6 +65,7 @@
|
|
|
64
65
|
"zod": "^3.24.2"
|
|
65
66
|
},
|
|
66
67
|
"devDependencies": {
|
|
68
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
67
69
|
"@types/diff": "^7.0.0",
|
|
68
70
|
"@types/inquirer": "^9.0.7",
|
|
69
71
|
"@types/node": "^22.13.0",
|
|
@@ -74,4 +76,4 @@
|
|
|
74
76
|
"tsx": "^4.19.2",
|
|
75
77
|
"typescript": "^5.7.3"
|
|
76
78
|
}
|
|
77
|
-
}
|
|
79
|
+
}
|