synabun 2026.3.307 → 2026.3.310
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/CLAUDE.md +150 -0
- package/hooks/claude-code/post-plan.mjs +1 -1
- package/hooks/claude-code/session-start.mjs +2 -0
- package/mcp-server/dist/config.d.ts +13 -0
- package/mcp-server/dist/config.d.ts.map +1 -0
- package/mcp-server/dist/config.js +59 -0
- package/mcp-server/dist/config.js.map +1 -0
- package/mcp-server/dist/http.d.ts +13 -0
- package/mcp-server/dist/http.d.ts.map +1 -0
- package/mcp-server/dist/http.js +86 -0
- package/mcp-server/dist/http.js.map +1 -0
- package/mcp-server/dist/index.d.ts +10 -0
- package/mcp-server/dist/index.d.ts.map +1 -0
- package/mcp-server/dist/index.js +189 -0
- package/mcp-server/dist/index.js.map +1 -0
- package/mcp-server/dist/preload-http.d.ts +3 -0
- package/mcp-server/dist/preload-http.d.ts.map +1 -0
- package/mcp-server/dist/preload-http.js +26 -0
- package/mcp-server/dist/preload-http.js.map +1 -0
- package/mcp-server/dist/preload.d.ts +3 -0
- package/mcp-server/dist/preload.d.ts.map +1 -0
- package/mcp-server/dist/preload.js +30 -0
- package/mcp-server/dist/preload.js.map +1 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
- package/mcp-server/dist/services/categories.d.ts +61 -0
- package/mcp-server/dist/services/categories.d.ts.map +1 -0
- package/mcp-server/dist/services/categories.js +356 -0
- package/mcp-server/dist/services/categories.js.map +1 -0
- package/mcp-server/dist/services/discord.d.ts +112 -0
- package/mcp-server/dist/services/discord.d.ts.map +1 -0
- package/mcp-server/dist/services/discord.js +477 -0
- package/mcp-server/dist/services/discord.js.map +1 -0
- package/mcp-server/dist/services/file-checksums.d.ts +14 -0
- package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
- package/mcp-server/dist/services/file-checksums.js +34 -0
- package/mcp-server/dist/services/file-checksums.js.map +1 -0
- package/mcp-server/dist/services/local-embeddings.d.ts +23 -0
- package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
- package/mcp-server/dist/services/local-embeddings.js +71 -0
- package/mcp-server/dist/services/local-embeddings.js.map +1 -0
- package/mcp-server/dist/services/neural-interface.d.ts +92 -0
- package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
- package/mcp-server/dist/services/neural-interface.js +238 -0
- package/mcp-server/dist/services/neural-interface.js.map +1 -0
- package/mcp-server/dist/services/sqlite.d.ts +85 -0
- package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
- package/mcp-server/dist/services/sqlite.js +660 -0
- package/mcp-server/dist/services/sqlite.js.map +1 -0
- package/mcp-server/dist/tools/browser-advanced.d.ts +54 -0
- package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-advanced.js +97 -0
- package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
- package/mcp-server/dist/tools/browser-interact.d.ts +138 -0
- package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-interact.js +216 -0
- package/mcp-server/dist/tools/browser-interact.js.map +1 -0
- package/mcp-server/dist/tools/browser-navigate.d.ts +52 -0
- package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-navigate.js +61 -0
- package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
- package/mcp-server/dist/tools/browser-observe.d.ts +298 -0
- package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-observe.js +1154 -0
- package/mcp-server/dist/tools/browser-observe.js.map +1 -0
- package/mcp-server/dist/tools/browser.d.ts +7 -0
- package/mcp-server/dist/tools/browser.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser.js +55 -0
- package/mcp-server/dist/tools/browser.js.map +1 -0
- package/mcp-server/dist/tools/card-tools.d.ts +82 -0
- package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/card-tools.js +137 -0
- package/mcp-server/dist/tools/card-tools.js.map +1 -0
- package/mcp-server/dist/tools/card.d.ts +8 -0
- package/mcp-server/dist/tools/card.d.ts.map +1 -0
- package/mcp-server/dist/tools/card.js +14 -0
- package/mcp-server/dist/tools/card.js.map +1 -0
- package/mcp-server/dist/tools/category.d.ts +32 -0
- package/mcp-server/dist/tools/category.d.ts.map +1 -0
- package/mcp-server/dist/tools/category.js +290 -0
- package/mcp-server/dist/tools/category.js.map +1 -0
- package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
- package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-channel.js +236 -0
- package/mcp-server/dist/tools/discord-channel.js.map +1 -0
- package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
- package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-guild.js +138 -0
- package/mcp-server/dist/tools/discord-guild.js.map +1 -0
- package/mcp-server/dist/tools/discord-member.d.ts +26 -0
- package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-member.js +122 -0
- package/mcp-server/dist/tools/discord-member.js.map +1 -0
- package/mcp-server/dist/tools/discord-message.d.ts +36 -0
- package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-message.js +184 -0
- package/mcp-server/dist/tools/discord-message.js.map +1 -0
- package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
- package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-onboarding.js +179 -0
- package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
- package/mcp-server/dist/tools/discord-role.d.ts +34 -0
- package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-role.js +178 -0
- package/mcp-server/dist/tools/discord-role.js.map +1 -0
- package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
- package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-thread.js +88 -0
- package/mcp-server/dist/tools/discord-thread.js.map +1 -0
- package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
- package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-webhook.js +154 -0
- package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
- package/mcp-server/dist/tools/discord.d.ts +7 -0
- package/mcp-server/dist/tools/discord.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord.js +31 -0
- package/mcp-server/dist/tools/discord.js.map +1 -0
- package/mcp-server/dist/tools/forget.d.ts +14 -0
- package/mcp-server/dist/tools/forget.d.ts.map +1 -0
- package/mcp-server/dist/tools/forget.js +26 -0
- package/mcp-server/dist/tools/forget.js.map +1 -0
- package/mcp-server/dist/tools/git-tools.d.ts +24 -0
- package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/git-tools.js +107 -0
- package/mcp-server/dist/tools/git-tools.js.map +1 -0
- package/mcp-server/dist/tools/git.d.ts +7 -0
- package/mcp-server/dist/tools/git.d.ts.map +1 -0
- package/mcp-server/dist/tools/git.js +9 -0
- package/mcp-server/dist/tools/git.js.map +1 -0
- package/mcp-server/dist/tools/image-tools.d.ts +24 -0
- package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/image-tools.js +80 -0
- package/mcp-server/dist/tools/image-tools.js.map +1 -0
- package/mcp-server/dist/tools/image.d.ts +10 -0
- package/mcp-server/dist/tools/image.d.ts.map +1 -0
- package/mcp-server/dist/tools/image.js +12 -0
- package/mcp-server/dist/tools/image.js.map +1 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +77 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.js +223 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
- package/mcp-server/dist/tools/leonardo.d.ts +13 -0
- package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
- package/mcp-server/dist/tools/leonardo.js +19 -0
- package/mcp-server/dist/tools/leonardo.js.map +1 -0
- package/mcp-server/dist/tools/loop.d.ts +30 -0
- package/mcp-server/dist/tools/loop.d.ts.map +1 -0
- package/mcp-server/dist/tools/loop.js +302 -0
- package/mcp-server/dist/tools/loop.js.map +1 -0
- package/mcp-server/dist/tools/memories.d.ts +26 -0
- package/mcp-server/dist/tools/memories.d.ts.map +1 -0
- package/mcp-server/dist/tools/memories.js +96 -0
- package/mcp-server/dist/tools/memories.js.map +1 -0
- package/mcp-server/dist/tools/recall.d.ts +41 -0
- package/mcp-server/dist/tools/recall.d.ts.map +1 -0
- package/mcp-server/dist/tools/recall.js +275 -0
- package/mcp-server/dist/tools/recall.js.map +1 -0
- package/mcp-server/dist/tools/reflect.d.ts +44 -0
- package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
- package/mcp-server/dist/tools/reflect.js +118 -0
- package/mcp-server/dist/tools/reflect.js.map +1 -0
- package/mcp-server/dist/tools/remember.d.ts +38 -0
- package/mcp-server/dist/tools/remember.d.ts.map +1 -0
- package/mcp-server/dist/tools/remember.js +88 -0
- package/mcp-server/dist/tools/remember.js.map +1 -0
- package/mcp-server/dist/tools/response.d.ts +23 -0
- package/mcp-server/dist/tools/response.d.ts.map +1 -0
- package/mcp-server/dist/tools/response.js +24 -0
- package/mcp-server/dist/tools/response.js.map +1 -0
- package/mcp-server/dist/tools/restore.d.ts +14 -0
- package/mcp-server/dist/tools/restore.d.ts.map +1 -0
- package/mcp-server/dist/tools/restore.js +23 -0
- package/mcp-server/dist/tools/restore.js.map +1 -0
- package/mcp-server/dist/tools/sync.d.ts +18 -0
- package/mcp-server/dist/tools/sync.d.ts.map +1 -0
- package/mcp-server/dist/tools/sync.js +93 -0
- package/mcp-server/dist/tools/sync.js.map +1 -0
- package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
- package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
- package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
- package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
- package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
- package/mcp-server/dist/tools/tictactoe.js +9 -0
- package/mcp-server/dist/tools/tictactoe.js.map +1 -0
- package/mcp-server/dist/tools/utils.d.ts +10 -0
- package/mcp-server/dist/tools/utils.d.ts.map +1 -0
- package/mcp-server/dist/tools/utils.js +30 -0
- package/mcp-server/dist/tools/utils.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-tools.d.ts +194 -0
- package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard-tools.js +198 -0
- package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
- package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard.js +14 -0
- package/mcp-server/dist/tools/whiteboard.js.map +1 -0
- package/mcp-server/dist/tui.d.ts +3 -0
- package/mcp-server/dist/tui.d.ts.map +1 -0
- package/mcp-server/dist/tui.js +807 -0
- package/mcp-server/dist/tui.js.map +1 -0
- package/mcp-server/dist/types.d.ts +77 -0
- package/mcp-server/dist/types.d.ts.map +1 -0
- package/mcp-server/dist/types.js +2 -0
- package/mcp-server/dist/types.js.map +1 -0
- package/neural-interface/public/shared/styles.css +2 -2
- package/neural-interface/public/shared/ui-settings.js +2 -2
- package/neural-interface/server.js +82 -8
- package/neural-interface/templates/CLAUDE-template.md +9 -1
- package/package.json +4 -2
- package/preuninstall.js +28 -0
- package/setup.js +86 -1
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { readFileSync, writeFileSync, existsSync, unlinkSync, mkdirSync, readdirSync } from 'fs';
|
|
3
|
+
import { join, dirname } from 'path';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { text } from './response.js';
|
|
6
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
const DATA_DIR = join(__dirname, '..', '..', 'data');
|
|
8
|
+
// Loop state files and templates live in the project root data dir (Synabun/data/)
|
|
9
|
+
const PROJECT_ROOT = process.env.SYNABUN_ROOT || join(__dirname, '..', '..', '..');
|
|
10
|
+
const NI_DATA_DIR = join(PROJECT_ROOT, 'data');
|
|
11
|
+
const LOOP_DIR = join(NI_DATA_DIR, 'loop');
|
|
12
|
+
const LOOP_TEMPLATES_PATH = join(NI_DATA_DIR, 'loop-templates.json');
|
|
13
|
+
const MAX_ITERATIONS = 50;
|
|
14
|
+
const DEFAULT_ITERATIONS = 10;
|
|
15
|
+
const MAX_MINUTES = 480;
|
|
16
|
+
const DEFAULT_MINUTES = 60;
|
|
17
|
+
function ensureLoopDir() {
|
|
18
|
+
if (!existsSync(LOOP_DIR)) {
|
|
19
|
+
mkdirSync(LOOP_DIR, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the session ID for loop state file.
|
|
24
|
+
* Priority: explicit param > CLAUDE_SESSION_ID env > SYNABUN_TERMINAL_SESSION env > scan.
|
|
25
|
+
*
|
|
26
|
+
* When SYNABUN_TERMINAL_SESSION is set (server-launched loop), find the loop file
|
|
27
|
+
* by matching the terminalSessionId field. This survives /clear (which changes
|
|
28
|
+
* CLAUDE_SESSION_ID) and prevents cross-loop contamination with multiple automations.
|
|
29
|
+
*/
|
|
30
|
+
function resolveSessionId(explicit) {
|
|
31
|
+
if (explicit)
|
|
32
|
+
return explicit;
|
|
33
|
+
if (process.env.CLAUDE_SESSION_ID)
|
|
34
|
+
return process.env.CLAUDE_SESSION_ID;
|
|
35
|
+
ensureLoopDir();
|
|
36
|
+
// Priority: find loop file owned by this terminal session (survives /clear)
|
|
37
|
+
const terminalSessionEnv = process.env.SYNABUN_TERMINAL_SESSION;
|
|
38
|
+
if (terminalSessionEnv) {
|
|
39
|
+
try {
|
|
40
|
+
const files = readdirSync(LOOP_DIR).filter(f => f.endsWith('.json') && !f.startsWith('pending-'));
|
|
41
|
+
for (const file of files) {
|
|
42
|
+
try {
|
|
43
|
+
const data = JSON.parse(readFileSync(join(LOOP_DIR, file), 'utf-8'));
|
|
44
|
+
if (data?.active && data.terminalSessionId === terminalSessionEnv) {
|
|
45
|
+
return file.replace('.json', '');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch { /* skip corrupt files */ }
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch { /* dir read failed */ }
|
|
52
|
+
}
|
|
53
|
+
// Fallback: scan for any active loop file (legacy — no terminal scoping)
|
|
54
|
+
try {
|
|
55
|
+
const files = readdirSync(LOOP_DIR).filter(f => f.endsWith('.json'));
|
|
56
|
+
for (const file of files) {
|
|
57
|
+
try {
|
|
58
|
+
const data = JSON.parse(readFileSync(join(LOOP_DIR, file), 'utf-8'));
|
|
59
|
+
if (data?.active)
|
|
60
|
+
return file.replace('.json', '');
|
|
61
|
+
}
|
|
62
|
+
catch { /* skip corrupt files */ }
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch { /* dir read failed */ }
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
function getLoopPath(sessionId) {
|
|
69
|
+
return join(LOOP_DIR, `${sessionId}.json`);
|
|
70
|
+
}
|
|
71
|
+
export const loopSchema = {
|
|
72
|
+
action: z
|
|
73
|
+
.enum(['start', 'stop', 'status', 'update'])
|
|
74
|
+
.describe('start: begin autonomous loop. stop: end loop. status: check current loop state. update: write iteration journal/progress.'),
|
|
75
|
+
task: z
|
|
76
|
+
.string()
|
|
77
|
+
.optional()
|
|
78
|
+
.describe('What to do each iteration (required for start).'),
|
|
79
|
+
iterations: z
|
|
80
|
+
.number()
|
|
81
|
+
.optional()
|
|
82
|
+
.describe(`Max iterations (1-${MAX_ITERATIONS}, default ${DEFAULT_ITERATIONS}).`),
|
|
83
|
+
max_minutes: z
|
|
84
|
+
.number()
|
|
85
|
+
.optional()
|
|
86
|
+
.describe(`Time cap in minutes (1-${MAX_MINUTES}, default ${DEFAULT_MINUTES}).`),
|
|
87
|
+
context: z
|
|
88
|
+
.string()
|
|
89
|
+
.optional()
|
|
90
|
+
.describe('Extra context injected each iteration.'),
|
|
91
|
+
session_id: z
|
|
92
|
+
.string()
|
|
93
|
+
.optional()
|
|
94
|
+
.describe('Claude Code session ID. Auto-detected if omitted.'),
|
|
95
|
+
template: z
|
|
96
|
+
.string()
|
|
97
|
+
.optional()
|
|
98
|
+
.describe('Load a saved template by name or id. Template values are used as defaults; explicit params override.'),
|
|
99
|
+
summary: z
|
|
100
|
+
.string()
|
|
101
|
+
.optional()
|
|
102
|
+
.describe('Brief summary of what this iteration accomplished (1-2 sentences, for journal). Used with action "update".'),
|
|
103
|
+
progress: z
|
|
104
|
+
.string()
|
|
105
|
+
.optional()
|
|
106
|
+
.describe('Rolling progress summary replacing the previous one. Used with action "update".'),
|
|
107
|
+
};
|
|
108
|
+
export const loopDescription = 'Autonomous loop control. Start a repeating task loop, check status, update progress journal, or stop it. The Stop hook drives iteration. Call "update" after each iteration with a brief summary to maintain context across compactions.';
|
|
109
|
+
// ── Start ──────────────────────────────────────────────────────
|
|
110
|
+
function loadTemplate(nameOrId) {
|
|
111
|
+
try {
|
|
112
|
+
if (!existsSync(LOOP_TEMPLATES_PATH))
|
|
113
|
+
return null;
|
|
114
|
+
const templates = JSON.parse(readFileSync(LOOP_TEMPLATES_PATH, 'utf-8'));
|
|
115
|
+
if (!Array.isArray(templates))
|
|
116
|
+
return null;
|
|
117
|
+
const lower = nameOrId.toLowerCase();
|
|
118
|
+
return templates.find((t) => t.id === nameOrId ||
|
|
119
|
+
t.name?.toLowerCase() === lower) || null;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function handleStart(args) {
|
|
126
|
+
// Load template defaults if specified
|
|
127
|
+
if (args.template) {
|
|
128
|
+
const tpl = loadTemplate(args.template);
|
|
129
|
+
if (!tpl) {
|
|
130
|
+
return text(`Error: Template "${args.template}" not found. Check Settings → Automations for available templates.`);
|
|
131
|
+
}
|
|
132
|
+
// Template values as defaults; explicit params override
|
|
133
|
+
if (!args.task)
|
|
134
|
+
args.task = tpl.task;
|
|
135
|
+
if (args.iterations === undefined)
|
|
136
|
+
args.iterations = tpl.iterations;
|
|
137
|
+
if (args.max_minutes === undefined)
|
|
138
|
+
args.max_minutes = tpl.maxMinutes;
|
|
139
|
+
if (!args.context && tpl.context)
|
|
140
|
+
args.context = tpl.context;
|
|
141
|
+
}
|
|
142
|
+
if (!args.task?.trim()) {
|
|
143
|
+
return text('Error: "task" is required for start action. Describe what to do each iteration.');
|
|
144
|
+
}
|
|
145
|
+
const sessionId = resolveSessionId(args.session_id);
|
|
146
|
+
if (!sessionId) {
|
|
147
|
+
return text('Error: Could not determine session ID. Pass session_id explicitly or ensure CLAUDE_SESSION_ID is set.');
|
|
148
|
+
}
|
|
149
|
+
const iterations = Math.min(Math.max(args.iterations || DEFAULT_ITERATIONS, 1), MAX_ITERATIONS);
|
|
150
|
+
const maxMinutes = Math.min(Math.max(args.max_minutes || DEFAULT_MINUTES, 1), MAX_MINUTES);
|
|
151
|
+
ensureLoopDir();
|
|
152
|
+
// Check for existing active loop
|
|
153
|
+
const loopPath = getLoopPath(sessionId);
|
|
154
|
+
if (existsSync(loopPath)) {
|
|
155
|
+
try {
|
|
156
|
+
const existing = JSON.parse(readFileSync(loopPath, 'utf-8'));
|
|
157
|
+
if (existing?.active) {
|
|
158
|
+
return text(`Error: Loop already active (iteration ${existing.currentIteration}/${existing.totalIterations}). Stop it first with action "stop".`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch { /* corrupt file, overwrite */ }
|
|
162
|
+
}
|
|
163
|
+
const state = {
|
|
164
|
+
active: true,
|
|
165
|
+
task: args.task.trim(),
|
|
166
|
+
totalIterations: iterations,
|
|
167
|
+
currentIteration: 0,
|
|
168
|
+
maxMinutes,
|
|
169
|
+
startedAt: new Date().toISOString(),
|
|
170
|
+
lastIterationAt: null,
|
|
171
|
+
context: args.context?.trim() || null,
|
|
172
|
+
retries: 0,
|
|
173
|
+
journal: [],
|
|
174
|
+
lastMemoryAt: 0,
|
|
175
|
+
memoryInterval: 5,
|
|
176
|
+
progressSummary: null,
|
|
177
|
+
awaitingNext: false,
|
|
178
|
+
};
|
|
179
|
+
writeFileSync(loopPath, JSON.stringify(state, null, 2));
|
|
180
|
+
return text([
|
|
181
|
+
`Loop started for session ${sessionId}.`,
|
|
182
|
+
`Task: ${state.task}`,
|
|
183
|
+
`Iterations: ${iterations} | Time cap: ${maxMinutes} min`,
|
|
184
|
+
state.context ? `Context: ${state.context}` : '',
|
|
185
|
+
'',
|
|
186
|
+
'The Stop hook will now drive autonomous iteration. Begin your first iteration.',
|
|
187
|
+
].filter(Boolean).join('\n'));
|
|
188
|
+
}
|
|
189
|
+
// ── Stop ───────────────────────────────────────────────────────
|
|
190
|
+
function handleStop(args) {
|
|
191
|
+
const sessionId = resolveSessionId(args.session_id);
|
|
192
|
+
if (!sessionId) {
|
|
193
|
+
return text('No active loop found to stop.');
|
|
194
|
+
}
|
|
195
|
+
const loopPath = getLoopPath(sessionId);
|
|
196
|
+
if (!existsSync(loopPath)) {
|
|
197
|
+
return text('No active loop found for this session.');
|
|
198
|
+
}
|
|
199
|
+
let summary = '';
|
|
200
|
+
try {
|
|
201
|
+
const state = JSON.parse(readFileSync(loopPath, 'utf-8'));
|
|
202
|
+
const elapsed = Math.round((Date.now() - new Date(state.startedAt).getTime()) / 60000);
|
|
203
|
+
summary = ` Completed ${state.currentIteration}/${state.totalIterations} iterations in ${elapsed} min.`;
|
|
204
|
+
}
|
|
205
|
+
catch { /* ok */ }
|
|
206
|
+
try {
|
|
207
|
+
unlinkSync(loopPath);
|
|
208
|
+
}
|
|
209
|
+
catch { /* ok */ }
|
|
210
|
+
return text(`Loop stopped.${summary}`);
|
|
211
|
+
}
|
|
212
|
+
// ── Status ─────────────────────────────────────────────────────
|
|
213
|
+
function handleStatus(args) {
|
|
214
|
+
const sessionId = resolveSessionId(args.session_id);
|
|
215
|
+
if (!sessionId) {
|
|
216
|
+
return text('No active loop.');
|
|
217
|
+
}
|
|
218
|
+
const loopPath = getLoopPath(sessionId);
|
|
219
|
+
if (!existsSync(loopPath)) {
|
|
220
|
+
return text('No active loop for this session.');
|
|
221
|
+
}
|
|
222
|
+
let state;
|
|
223
|
+
try {
|
|
224
|
+
state = JSON.parse(readFileSync(loopPath, 'utf-8'));
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
return text('Loop state file is corrupt.');
|
|
228
|
+
}
|
|
229
|
+
if (!state.active) {
|
|
230
|
+
const finishedAt = state.finishedAt ? ` Finished at ${state.finishedAt}.` : '';
|
|
231
|
+
return text(`Loop inactive (completed).${finishedAt} ${state.currentIteration}/${state.totalIterations} iterations done.`);
|
|
232
|
+
}
|
|
233
|
+
const elapsed = Math.round((Date.now() - new Date(state.startedAt).getTime()) / 60000);
|
|
234
|
+
const iterationsRemaining = state.totalIterations - (state.currentIteration || 0);
|
|
235
|
+
return text([
|
|
236
|
+
`Loop active: iteration ${state.currentIteration}/${state.totalIterations} (${iterationsRemaining} remaining)`,
|
|
237
|
+
`Task: ${state.task}`,
|
|
238
|
+
`Elapsed: ${elapsed} min`,
|
|
239
|
+
state.context ? `Context: ${state.context}` : '',
|
|
240
|
+
state.lastIterationAt ? `Last iteration: ${state.lastIterationAt}` : '',
|
|
241
|
+
].filter(Boolean).join('\n'));
|
|
242
|
+
}
|
|
243
|
+
// ── Update (journal + progress) ───────────────────────────────
|
|
244
|
+
function handleUpdate(args) {
|
|
245
|
+
if (!args.summary && !args.progress) {
|
|
246
|
+
return text('Error: Provide "summary" (iteration journal) and/or "progress" (rolling summary) for update.');
|
|
247
|
+
}
|
|
248
|
+
const sessionId = resolveSessionId(args.session_id);
|
|
249
|
+
if (!sessionId) {
|
|
250
|
+
return text('No active loop to update.');
|
|
251
|
+
}
|
|
252
|
+
const loopPath = getLoopPath(sessionId);
|
|
253
|
+
if (!existsSync(loopPath)) {
|
|
254
|
+
return text('No loop state file found.');
|
|
255
|
+
}
|
|
256
|
+
let state;
|
|
257
|
+
try {
|
|
258
|
+
state = JSON.parse(readFileSync(loopPath, 'utf-8'));
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return text('Loop state file is corrupt.');
|
|
262
|
+
}
|
|
263
|
+
if (!state.active) {
|
|
264
|
+
return text('Loop is not active.');
|
|
265
|
+
}
|
|
266
|
+
// Append journal entry
|
|
267
|
+
if (args.summary) {
|
|
268
|
+
if (!Array.isArray(state.journal))
|
|
269
|
+
state.journal = [];
|
|
270
|
+
state.journal.push({
|
|
271
|
+
iteration: state.currentIteration || 0,
|
|
272
|
+
summary: args.summary.slice(0, 200),
|
|
273
|
+
timestamp: new Date().toISOString(),
|
|
274
|
+
});
|
|
275
|
+
// Keep only last 10 entries
|
|
276
|
+
if (state.journal.length > 10) {
|
|
277
|
+
state.journal = state.journal.slice(-10);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// Update rolling progress summary
|
|
281
|
+
if (args.progress) {
|
|
282
|
+
state.progressSummary = args.progress.slice(0, 500);
|
|
283
|
+
}
|
|
284
|
+
writeFileSync(loopPath, JSON.stringify(state, null, 2));
|
|
285
|
+
return text(`Loop journal updated (iteration ${state.currentIteration}).`);
|
|
286
|
+
}
|
|
287
|
+
// ── Main dispatcher ────────────────────────────────────────────
|
|
288
|
+
export async function handleLoop(args) {
|
|
289
|
+
switch (args.action) {
|
|
290
|
+
case 'start':
|
|
291
|
+
return handleStart(args);
|
|
292
|
+
case 'stop':
|
|
293
|
+
return handleStop(args);
|
|
294
|
+
case 'status':
|
|
295
|
+
return handleStatus(args);
|
|
296
|
+
case 'update':
|
|
297
|
+
return handleUpdate(args);
|
|
298
|
+
default:
|
|
299
|
+
return text(`Unknown action "${args.action}". Use: start, stop, status, update.`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/tools/loop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AACjG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACrD,mFAAmF;AACnF,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACnF,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAC3C,MAAM,mBAAmB,GAAG,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;AAErE,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,SAAS,aAAa;IACpB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,gBAAgB,CAAC,QAAiB;IACzC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAExE,aAAa,EAAE,CAAC;IAEhB,4EAA4E;IAC5E,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;IAChE,IAAI,kBAAkB,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;YAClG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;oBACrE,IAAI,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,iBAAiB,KAAK,kBAAkB,EAAE,CAAC;wBAClE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACnC,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC;IACnC,CAAC;IAED,yEAAyE;IACzE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACrE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;gBACrE,IAAI,IAAI,EAAE,MAAM;oBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC;IAEjC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,SAAiB;IACpC,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAC;SACpD,QAAQ,CAAC,2HAA2H,CAAC;IACxI,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,iDAAiD,CAAC;IAC9D,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,qBAAqB,cAAc,aAAa,kBAAkB,IAAI,CAAC;IACnF,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,0BAA0B,WAAW,aAAa,eAAe,IAAI,CAAC;IAClF,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,wCAAwC,CAAC;IACrD,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,mDAAmD,CAAC;IAChE,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,sGAAsG,CAAC;IACnH,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,4GAA4G,CAAC;IACzH,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,iFAAiF,CAAC;CAC/F,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAC1B,0OAA0O,CAAC;AAE7O,kEAAkE;AAElE,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC;YAAE,OAAO,IAAI,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAA0B,EAAE,EAAE,CAClD,CAAC,CAAC,EAAa,KAAK,QAAQ;YAC5B,CAAC,CAAC,IAAe,EAAE,WAAW,EAAE,KAAK,KAAK,CAC5C,IAAI,IAAI,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AAC1B,CAAC;AAED,SAAS,WAAW,CAAC,IAOpB;IACC,sCAAsC;IACtC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC,oBAAoB,IAAI,CAAC,QAAQ,oEAAoE,CAAC,CAAC;QACrH,CAAC;QACD,wDAAwD;QACxD,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAc,CAAC;QAC/C,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;YAAE,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAoB,CAAC;QAC9E,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,UAAoB,CAAC;QAChF,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAiB,CAAC;IACzE,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,iFAAiF,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,uGAAuG,CAAC,CAAC;IACvH,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,kBAAkB,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IAChG,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,eAAe,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAE3F,aAAa,EAAE,CAAC;IAEhB,iCAAiC;IACjC,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7D,IAAI,QAAQ,EAAE,MAAM,EAAE,CAAC;gBACrB,OAAO,IAAI,CAAC,yCAAyC,QAAQ,CAAC,gBAAgB,IAAI,QAAQ,CAAC,eAAe,sCAAsC,CAAC,CAAC;YACpJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,6BAA6B,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QACtB,eAAe,EAAE,UAAU;QAC3B,gBAAgB,EAAE,CAAC;QACnB,UAAU;QACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,eAAe,EAAE,IAAqB;QACtC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI;QACrC,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,EAAiE;QAC1E,YAAY,EAAE,CAAC;QACf,cAAc,EAAE,CAAC;QACjB,eAAe,EAAE,IAAqB;QACtC,YAAY,EAAE,KAAK;KACpB,CAAC;IAEF,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAExD,OAAO,IAAI,CAAC;QACV,4BAA4B,SAAS,GAAG;QACxC,SAAS,KAAK,CAAC,IAAI,EAAE;QACrB,eAAe,UAAU,gBAAgB,UAAU,MAAM;QACzD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;QAChD,EAAE;QACF,gFAAgF;KACjF,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,kEAAkE;AAElE,SAAS,UAAU,CAAC,IAA6B;IAC/C,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;QACvF,OAAO,GAAG,cAAc,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,eAAe,kBAAkB,OAAO,OAAO,CAAC;IAC1G,CAAC;IAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;IAEpB,IAAI,CAAC;QAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;IAEhD,OAAO,IAAI,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,kEAAkE;AAElE,SAAS,YAAY,CAAC,IAA6B;IACjD,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,KAAK,CAAC;IACV,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,OAAO,IAAI,CAAC,6BAA6B,UAAU,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,eAAe,mBAAmB,CAAC,CAAC;IAC7H,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;IACvF,MAAM,mBAAmB,GAAG,KAAK,CAAC,eAAe,GAAG,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC;IAElF,OAAO,IAAI,CAAC;QACV,0BAA0B,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,eAAe,KAAK,mBAAmB,aAAa;QAC9G,SAAS,KAAK,CAAC,IAAI,EAAE;QACrB,YAAY,OAAO,MAAM;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;QAChD,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,mBAAmB,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE;KACxE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,iEAAiE;AAEjE,SAAS,YAAY,CAAC,IAIrB;IACC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,8FAA8F,CAAC,CAAC;IAC9G,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,KAA8B,CAAC;IACnC,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACrC,CAAC;IAED,uBAAuB;IACvB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;YAAE,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;QACrD,KAAK,CAAC,OAAuE,CAAC,IAAI,CAAC;YAClF,SAAS,EAAG,KAAK,CAAC,gBAA2B,IAAI,CAAC;YAClD,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QACH,4BAA4B;QAC5B,IAAK,KAAK,CAAC,OAAqB,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC7C,KAAK,CAAC,OAAO,GAAI,KAAK,CAAC,OAAqB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAExD,OAAO,IAAI,CAAC,mCAAmC,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC;AAC7E,CAAC;AAED,kEAAkE;AAElE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAUhC;IACC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,OAAO;YACV,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3B,KAAK,MAAM;YACT,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5B,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5B;YACE,OAAO,IAAI,CAAC,mBAAmB,IAAI,CAAC,MAAM,sCAAsC,CAAC,CAAC;IACtF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare function buildMemoriesSchema(): {
|
|
3
|
+
action: z.ZodEnum<["recent", "stats", "by-category", "by-project"]>;
|
|
4
|
+
category: z.ZodOptional<z.ZodString>;
|
|
5
|
+
project: z.ZodOptional<z.ZodString>;
|
|
6
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
7
|
+
};
|
|
8
|
+
export declare const memoriesSchema: {
|
|
9
|
+
action: z.ZodEnum<["recent", "stats", "by-category", "by-project"]>;
|
|
10
|
+
category: z.ZodOptional<z.ZodString>;
|
|
11
|
+
project: z.ZodOptional<z.ZodString>;
|
|
12
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
13
|
+
};
|
|
14
|
+
export declare const memoriesDescription = "Browse recent memories or get statistics. Use this to see what you remember about a project, review recent learnings, or check memory health.";
|
|
15
|
+
export declare function handleMemories(args: {
|
|
16
|
+
action: string;
|
|
17
|
+
category?: string;
|
|
18
|
+
project?: string;
|
|
19
|
+
limit?: number;
|
|
20
|
+
}): Promise<{
|
|
21
|
+
content: {
|
|
22
|
+
type: "text";
|
|
23
|
+
text: string;
|
|
24
|
+
}[];
|
|
25
|
+
}>;
|
|
26
|
+
//# sourceMappingURL=memories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memories.d.ts","sourceRoot":"","sources":["../../src/tools/memories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,wBAAgB,mBAAmB;;;;;EAsBlC;AAED,eAAO,MAAM,cAAc;;;;;CAAwB,CAAC;AAEpD,eAAO,MAAM,mBAAmB,kJACiH,CAAC;AAalJ,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;;;;;GAkEA"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { scrollMemories, getMemoryStats } from '../services/sqlite.js';
|
|
3
|
+
import { validateCategory } from '../services/categories.js';
|
|
4
|
+
import { text } from './response.js';
|
|
5
|
+
export function buildMemoriesSchema() {
|
|
6
|
+
return {
|
|
7
|
+
action: z
|
|
8
|
+
.enum(['recent', 'stats', 'by-category', 'by-project'])
|
|
9
|
+
.describe('recent=latest memories, stats=counts and health, by-category=filter by type, by-project=filter by project.'),
|
|
10
|
+
category: z
|
|
11
|
+
.string()
|
|
12
|
+
.optional()
|
|
13
|
+
.describe('Category to filter by (for by-category action).'),
|
|
14
|
+
project: z
|
|
15
|
+
.string()
|
|
16
|
+
.optional()
|
|
17
|
+
.describe('Filter by project (for by-project action).'),
|
|
18
|
+
limit: z
|
|
19
|
+
.coerce.number()
|
|
20
|
+
.min(1)
|
|
21
|
+
.max(50)
|
|
22
|
+
.optional()
|
|
23
|
+
.describe('Number of results (default 10).'),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export const memoriesSchema = buildMemoriesSchema();
|
|
27
|
+
export const memoriesDescription = 'Browse recent memories or get statistics. Use this to see what you remember about a project, review recent learnings, or check memory health.';
|
|
28
|
+
function formatAge(isoDate) {
|
|
29
|
+
const diffMs = Date.now() - new Date(isoDate).getTime();
|
|
30
|
+
const days = Math.floor(diffMs / (1000 * 60 * 60 * 24));
|
|
31
|
+
if (days === 0)
|
|
32
|
+
return 'today';
|
|
33
|
+
if (days === 1)
|
|
34
|
+
return '1 day ago';
|
|
35
|
+
if (days < 30)
|
|
36
|
+
return `${days} days ago`;
|
|
37
|
+
const months = Math.floor(days / 30);
|
|
38
|
+
if (months === 1)
|
|
39
|
+
return '1 month ago';
|
|
40
|
+
return `${months} months ago`;
|
|
41
|
+
}
|
|
42
|
+
export async function handleMemories(args) {
|
|
43
|
+
const action = args.action;
|
|
44
|
+
const category = args.category;
|
|
45
|
+
const project = args.project;
|
|
46
|
+
const limit = args.limit ?? 10;
|
|
47
|
+
if (category) {
|
|
48
|
+
const catCheck = validateCategory(category);
|
|
49
|
+
if (!catCheck.valid) {
|
|
50
|
+
return text(catCheck.error);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (action === 'stats') {
|
|
54
|
+
const stats = await getMemoryStats();
|
|
55
|
+
const categoryLines = Object.entries(stats.by_category)
|
|
56
|
+
.filter(([, count]) => count > 0)
|
|
57
|
+
.map(([cat, count]) => ` ${cat}: ${count}`)
|
|
58
|
+
.join('\n');
|
|
59
|
+
const projectLines = Object.entries(stats.by_project)
|
|
60
|
+
.map(([proj, count]) => ` ${proj}: ${count}`)
|
|
61
|
+
.join('\n');
|
|
62
|
+
return text(`Memory Statistics:\n\nTotal memories: ${stats.total}\n\nBy category:\n${categoryLines || ' (none)'}\n\nBy project:\n${projectLines || ' (none)'}\n\nOldest: ${stats.oldest ? formatAge(stats.oldest) : 'n/a'}\nNewest: ${stats.newest ? formatAge(stats.newest) : 'n/a'}`);
|
|
63
|
+
}
|
|
64
|
+
const must = [];
|
|
65
|
+
if ((action === 'by-category' || action === 'recent') && category) {
|
|
66
|
+
must.push({ key: 'category', match: { value: category } });
|
|
67
|
+
}
|
|
68
|
+
if ((action === 'by-project' || action === 'recent') && project) {
|
|
69
|
+
must.push({ key: 'project', match: { value: project } });
|
|
70
|
+
}
|
|
71
|
+
const filter = must.length > 0 ? { must } : undefined;
|
|
72
|
+
const result = await scrollMemories(filter, limit);
|
|
73
|
+
const sorted = result.points
|
|
74
|
+
.map((p) => ({
|
|
75
|
+
id: p.id,
|
|
76
|
+
payload: p.payload,
|
|
77
|
+
}))
|
|
78
|
+
.filter((m) => m.payload?.content && m.payload?.created_at)
|
|
79
|
+
.sort((a, b) => b.payload.created_at.localeCompare(a.payload.created_at));
|
|
80
|
+
if (sorted.length === 0) {
|
|
81
|
+
return text(`No memories found${category ? ` for category "${category}"` : ''}${project ? ` for project "${project}"` : ''}.`);
|
|
82
|
+
}
|
|
83
|
+
const lines = sorted.map((m, i) => {
|
|
84
|
+
const p = m.payload;
|
|
85
|
+
const tagStr = p.tags?.length ? ` [${p.tags.join(', ')}]` : '';
|
|
86
|
+
const sub = p.subcategory ? `/${p.subcategory}` : '';
|
|
87
|
+
return `${i + 1}. [${m.id}] ${p.category}${sub} | ${p.project} | imp:${p.importance} | ${formatAge(p.created_at)}${tagStr}\n ${p.content.slice(0, 150)}${p.content.length > 150 ? '...' : ''}`;
|
|
88
|
+
});
|
|
89
|
+
const title = action === 'recent'
|
|
90
|
+
? 'Recent memories'
|
|
91
|
+
: action === 'by-category'
|
|
92
|
+
? `Memories in "${category}"`
|
|
93
|
+
: `Memories for "${project}"`;
|
|
94
|
+
return text(`${title} (${sorted.length}):\n\n${lines.join('\n\n')}`);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=memories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memories.js","sourceRoot":"","sources":["../../src/tools/memories.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare function buildRecallSchema(): {
|
|
3
|
+
query: z.ZodString;
|
|
4
|
+
category: z.ZodOptional<z.ZodString>;
|
|
5
|
+
project: z.ZodOptional<z.ZodString>;
|
|
6
|
+
tags: z.ZodOptional<z.ZodEffects<z.ZodArray<z.ZodString, "many">, string[], unknown>>;
|
|
7
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
8
|
+
min_importance: z.ZodOptional<z.ZodNumber>;
|
|
9
|
+
min_score: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
include_sessions: z.ZodOptional<z.ZodBoolean>;
|
|
11
|
+
recency_boost: z.ZodOptional<z.ZodBoolean>;
|
|
12
|
+
};
|
|
13
|
+
export declare const recallSchema: {
|
|
14
|
+
query: z.ZodString;
|
|
15
|
+
category: z.ZodOptional<z.ZodString>;
|
|
16
|
+
project: z.ZodOptional<z.ZodString>;
|
|
17
|
+
tags: z.ZodOptional<z.ZodEffects<z.ZodArray<z.ZodString, "many">, string[], unknown>>;
|
|
18
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
19
|
+
min_importance: z.ZodOptional<z.ZodNumber>;
|
|
20
|
+
min_score: z.ZodOptional<z.ZodNumber>;
|
|
21
|
+
include_sessions: z.ZodOptional<z.ZodBoolean>;
|
|
22
|
+
recency_boost: z.ZodOptional<z.ZodBoolean>;
|
|
23
|
+
};
|
|
24
|
+
export declare const recallDescription = "Search your persistent memory for relevant information. Use this at the start of any task to check what you already know, or when you need context about past decisions, known issues, or architectural patterns.";
|
|
25
|
+
export declare function handleRecall(args: {
|
|
26
|
+
query: string;
|
|
27
|
+
category?: string;
|
|
28
|
+
project?: string;
|
|
29
|
+
tags?: string[];
|
|
30
|
+
limit?: number;
|
|
31
|
+
min_importance?: number;
|
|
32
|
+
min_score?: number;
|
|
33
|
+
include_sessions?: boolean;
|
|
34
|
+
recency_boost?: boolean;
|
|
35
|
+
}): Promise<{
|
|
36
|
+
content: {
|
|
37
|
+
type: "text";
|
|
38
|
+
text: string;
|
|
39
|
+
}[];
|
|
40
|
+
}>;
|
|
41
|
+
//# sourceMappingURL=recall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../src/tools/recall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,wBAAgB,iBAAiB;;;;;;;;;;EA2ChC;AAED,eAAO,MAAM,YAAY;;;;;;;;;;CAAsB,CAAC;AAEhD,eAAO,MAAM,iBAAiB,sNACuL,CAAC;AA4EtN,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;;;;;GAiLA"}
|