@curie-agent/tools 0.2.4 → 0.3.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/LICENSE +179 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/bash.d.ts.map +1 -1
- package/dist/src/bash.js +54 -27
- package/dist/src/bash.js.map +1 -1
- package/dist/src/edit.js +2 -2
- package/dist/src/edit.js.map +1 -1
- package/dist/src/glob.d.ts.map +1 -1
- package/dist/src/glob.js +64 -17
- package/dist/src/glob.js.map +1 -1
- package/dist/src/grep.d.ts.map +1 -1
- package/dist/src/grep.js +10 -2
- package/dist/src/grep.js.map +1 -1
- package/dist/src/index.d.ts +51 -10
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +10 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/read.d.ts.map +1 -1
- package/dist/src/read.js +4 -10
- package/dist/src/read.js.map +1 -1
- package/dist/src/reminder.d.ts +4 -0
- package/dist/src/reminder.d.ts.map +1 -1
- package/dist/src/reminder.js +31 -10
- package/dist/src/reminder.js.map +1 -1
- package/dist/src/skill.d.ts +34 -0
- package/dist/src/skill.d.ts.map +1 -0
- package/dist/src/skill.js +133 -0
- package/dist/src/skill.js.map +1 -0
- package/dist/src/spawn-agent.d.ts +13 -0
- package/dist/src/spawn-agent.d.ts.map +1 -0
- package/dist/src/spawn-agent.js +89 -0
- package/dist/src/spawn-agent.js.map +1 -0
- package/dist/src/task.d.ts +11 -0
- package/dist/src/task.d.ts.map +1 -0
- package/dist/src/task.js +49 -0
- package/dist/src/task.js.map +1 -0
- package/dist/src/todo.d.ts +21 -0
- package/dist/src/todo.d.ts.map +1 -0
- package/dist/src/todo.js +322 -0
- package/dist/src/todo.js.map +1 -0
- package/dist/src/tool.d.ts +1 -0
- package/dist/src/tool.d.ts.map +1 -1
- package/dist/src/tool.js +9 -3
- package/dist/src/tool.js.map +1 -1
- package/dist/src/web-search.js +2 -2
- package/dist/src/wiki.d.ts +15 -0
- package/dist/src/wiki.d.ts.map +1 -0
- package/dist/src/wiki.js +109 -0
- package/dist/src/wiki.js.map +1 -0
- package/dist/src/write.d.ts.map +1 -1
- package/dist/src/write.js +6 -3
- package/dist/src/write.js.map +1 -1
- package/package.json +11 -10
package/dist/src/todo.js
ADDED
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Todo tool — manages structured task lists.
|
|
3
|
+
* Refactored to use the UnifiedTask schema (supports manual/auto/notify modes).
|
|
4
|
+
* Backward compatible with legacy todo.json format (missing `mode` treated as 'human').
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'node:fs';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
import { createTool, expandPath } from './tool.js';
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Zod schema (same action surface, extended fields)
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
const ACTION_VALUES = ['list', 'add', 'edit', 'remove', 'complete', 'cancel', 'start', 'reorder'];
|
|
14
|
+
const TodoSchema = z.object({
|
|
15
|
+
action: z.enum(ACTION_VALUES).describe('Action: list, add, edit, remove, complete, cancel, start, reorder'),
|
|
16
|
+
scope: z.enum(['personal', 'project']).describe('Scope: personal (~/.curie-agent/tasks.json) or project (<cwd>/tasks.json)'),
|
|
17
|
+
id: z.string().optional().describe('Task ID (required for edit, remove, complete, cancel, start, reorder)'),
|
|
18
|
+
title: z.string().optional().describe('Task title (required for add, optional for edit)'),
|
|
19
|
+
description: z.string().optional().describe('Task description (optional)'),
|
|
20
|
+
status: z.enum(['backlog', 'todo', 'in_progress', 'done', 'canceled']).optional().describe('Task status'),
|
|
21
|
+
priority: z.enum(['low', 'medium', 'high', 'critical']).optional().describe('Task priority'),
|
|
22
|
+
tags: z.array(z.string()).optional().describe('Task tags'),
|
|
23
|
+
ids: z.array(z.string()).optional().describe('Task IDs for reorder action (ordered list)'),
|
|
24
|
+
// Filtering params (used with list action)
|
|
25
|
+
filter_status: z.enum(['backlog', 'todo', 'in_progress', 'done', 'canceled']).optional().describe('Filter by status'),
|
|
26
|
+
filter_priority: z.enum(['low', 'medium', 'high', 'critical']).optional().describe('Filter by priority'),
|
|
27
|
+
}).strict();
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Type helpers (convert legacy TodoTask to UnifiedTask)
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
/** Ensure a task has all UnifiedTask fields (migrates legacy format on read). */
|
|
32
|
+
function normalizeTask(t) {
|
|
33
|
+
if (!t || typeof t !== 'object')
|
|
34
|
+
return {};
|
|
35
|
+
const obj = t;
|
|
36
|
+
const validStatuses = ['backlog', 'todo', 'in_progress', 'done', 'canceled', 'pending'];
|
|
37
|
+
const rawStatus = String(obj.status ?? '');
|
|
38
|
+
const status = (validStatuses.includes(rawStatus) ? rawStatus : 'todo');
|
|
39
|
+
const validModes = ['human', 'agent', 'notify'];
|
|
40
|
+
const rawMode = String(obj.mode ?? '');
|
|
41
|
+
const mode = (validModes.includes(rawMode) ? rawMode : 'human');
|
|
42
|
+
const validPriority = ['low', 'medium', 'high', 'critical'];
|
|
43
|
+
const rawPriority = String(obj.priority ?? 'medium');
|
|
44
|
+
const priority = validPriority.includes(rawPriority) ? rawPriority : 'medium';
|
|
45
|
+
let frequency = null;
|
|
46
|
+
if (obj.frequency && typeof obj.frequency === 'object' && 'type' in obj.frequency && 'value' in obj.frequency) {
|
|
47
|
+
const rawType = String(obj.frequency.type);
|
|
48
|
+
const validSchedules = ['intraday', 'daily', 'weekly', 'monthly', 'dreaming'];
|
|
49
|
+
if (validSchedules.includes(rawType)) {
|
|
50
|
+
frequency = { type: rawType, value: String(obj.frequency.value ?? '') };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
id: String(obj.id ?? ''),
|
|
55
|
+
title: String(obj.title ?? ''),
|
|
56
|
+
description: String(obj.description ?? ''),
|
|
57
|
+
status,
|
|
58
|
+
priority,
|
|
59
|
+
tags: Array.isArray(obj.tags) ? obj.tags : [],
|
|
60
|
+
mode,
|
|
61
|
+
scheduled_at: typeof obj.scheduled_at === 'number' ? obj.scheduled_at : undefined,
|
|
62
|
+
frequency,
|
|
63
|
+
result: typeof obj.result === 'string' ? obj.result : undefined,
|
|
64
|
+
scope: String(obj.scope) === 'project' ? 'project' : 'personal',
|
|
65
|
+
order: typeof obj.order === 'number' ? obj.order : 0,
|
|
66
|
+
created_at: String(obj.created_at ?? new Date().toISOString()),
|
|
67
|
+
completed_at: obj.completed_at && obj.completed_at !== null ? String(obj.completed_at) : undefined,
|
|
68
|
+
last_run: typeof obj.last_run === 'number' ? obj.last_run : undefined,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
// File I/O (supports both old todo.json and new tasks.json)
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
function resolveScopePath(scope, cwd) {
|
|
75
|
+
if (scope === 'personal') {
|
|
76
|
+
// Try new format first, fall back to legacy
|
|
77
|
+
const newPath = path.join(expandPath('~'), '.curie-agent', 'tasks.json');
|
|
78
|
+
if (fs.existsSync(newPath))
|
|
79
|
+
return newPath;
|
|
80
|
+
return path.join(expandPath('~'), '.curie-agent', 'todo.json');
|
|
81
|
+
}
|
|
82
|
+
const projectPath = path.join(cwd, 'tasks.json');
|
|
83
|
+
if (fs.existsSync(projectPath))
|
|
84
|
+
return projectPath;
|
|
85
|
+
return path.join(cwd, 'todo.json');
|
|
86
|
+
}
|
|
87
|
+
function readTaskFile(filePath) {
|
|
88
|
+
if (!fs.existsSync(filePath))
|
|
89
|
+
return null;
|
|
90
|
+
const raw = fs.readFileSync(filePath, 'utf-8');
|
|
91
|
+
try {
|
|
92
|
+
const parsed = JSON.parse(raw);
|
|
93
|
+
if (typeof parsed === 'object' && parsed !== null && 'tasks' in parsed && Array.isArray(parsed.tasks)) {
|
|
94
|
+
return parsed;
|
|
95
|
+
}
|
|
96
|
+
// Legacy format without $schema/version — wrap it
|
|
97
|
+
if (typeof parsed === 'object' && parsed !== null && 'tasks' in parsed) {
|
|
98
|
+
const tasks = parsed.tasks;
|
|
99
|
+
return { $schema: 'legacy.schema.json', version: 1, tasks: Array.isArray(tasks) ? tasks : [] };
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return null; // corrupted → reset
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function ensureTaskFile(filePath) {
|
|
108
|
+
if (!fs.existsSync(filePath)) {
|
|
109
|
+
const fresh = { $schema: 'tasks.schema.json', version: 1, tasks: [] };
|
|
110
|
+
fs.writeFileSync(filePath, JSON.stringify(fresh, null, 2), 'utf-8');
|
|
111
|
+
return fresh;
|
|
112
|
+
}
|
|
113
|
+
const data = readTaskFile(filePath);
|
|
114
|
+
if (!data) {
|
|
115
|
+
const fresh = { $schema: 'tasks.schema.json', version: 1, tasks: [] };
|
|
116
|
+
fs.writeFileSync(filePath, JSON.stringify(fresh, null, 2), 'utf-8');
|
|
117
|
+
return fresh;
|
|
118
|
+
}
|
|
119
|
+
// Normalize existing tasks to UnifiedTask format
|
|
120
|
+
const normalized = data.tasks.map(normalizeTask);
|
|
121
|
+
if (normalized.length !== data.tasks.length || JSON.stringify(normalized) !== JSON.stringify(data.tasks)) {
|
|
122
|
+
data.tasks = normalized;
|
|
123
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
124
|
+
}
|
|
125
|
+
return data;
|
|
126
|
+
}
|
|
127
|
+
function generateId() {
|
|
128
|
+
return crypto.randomUUID();
|
|
129
|
+
}
|
|
130
|
+
function formatDate() {
|
|
131
|
+
return new Date().toISOString();
|
|
132
|
+
}
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
// Tool implementation
|
|
135
|
+
// ---------------------------------------------------------------------------
|
|
136
|
+
export const todoTool = createTool('Todo', 'Manages a structured JSON-based task list with add, edit, remove, complete, cancel, start, reorder, and list actions. Tasks can be manual (todo list), agent (LLM executes at scheduled time), or notify (reminder notification only). Defaults to manual mode unless a time is specified.', TodoSchema, async (input, ctx) => {
|
|
137
|
+
const filePath = resolveScopePath(input.scope, ctx.cwd);
|
|
138
|
+
if (input.action === 'list') {
|
|
139
|
+
const data = ensureTaskFile(filePath);
|
|
140
|
+
let tasks;
|
|
141
|
+
try {
|
|
142
|
+
tasks = data.tasks.map(normalizeTask);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return { output: null, error: 'Failed to parse task file.' };
|
|
146
|
+
}
|
|
147
|
+
if (input.filter_status)
|
|
148
|
+
tasks = tasks.filter((t) => t.status === input.filter_status);
|
|
149
|
+
if (input.filter_priority)
|
|
150
|
+
tasks = tasks.filter((t) => t.priority === input.filter_priority);
|
|
151
|
+
if (input.tags && input.tags.length > 0) {
|
|
152
|
+
tasks = tasks.filter((t) => input.tags.every((tag) => t.tags.includes(tag)));
|
|
153
|
+
}
|
|
154
|
+
tasks.sort((a, b) => a.order - b.order);
|
|
155
|
+
return { output: tasks };
|
|
156
|
+
}
|
|
157
|
+
if (input.action === 'add') {
|
|
158
|
+
const data = ensureTaskFile(filePath);
|
|
159
|
+
if (!input.title)
|
|
160
|
+
return { output: null, error: 'Title is required for add action' };
|
|
161
|
+
// Normalize existing tasks first
|
|
162
|
+
let tasks;
|
|
163
|
+
try {
|
|
164
|
+
tasks = data.tasks.map(normalizeTask);
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
tasks = [];
|
|
168
|
+
}
|
|
169
|
+
const task = {
|
|
170
|
+
id: generateId(),
|
|
171
|
+
title: input.title,
|
|
172
|
+
description: input.description ?? '',
|
|
173
|
+
status: 'todo',
|
|
174
|
+
priority: input.priority ?? 'medium',
|
|
175
|
+
tags: input.tags ?? [],
|
|
176
|
+
mode: 'human', // default — new fields are always human unless specified via tool context
|
|
177
|
+
scheduled_at: undefined,
|
|
178
|
+
frequency: null,
|
|
179
|
+
result: undefined,
|
|
180
|
+
scope: input.scope,
|
|
181
|
+
order: tasks.length,
|
|
182
|
+
created_at: formatDate(),
|
|
183
|
+
completed_at: undefined,
|
|
184
|
+
};
|
|
185
|
+
data.tasks.push(task);
|
|
186
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
187
|
+
return { output: task };
|
|
188
|
+
}
|
|
189
|
+
if (input.action === 'edit') {
|
|
190
|
+
const data = ensureTaskFile(filePath);
|
|
191
|
+
let tasks;
|
|
192
|
+
try {
|
|
193
|
+
tasks = data.tasks.map(normalizeTask);
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
return { output: null, error: 'Failed to parse task file.' };
|
|
197
|
+
}
|
|
198
|
+
if (!input.id)
|
|
199
|
+
return { output: null, error: 'ID is required for edit action' };
|
|
200
|
+
const idx = tasks.findIndex((t) => t.id === input.id);
|
|
201
|
+
if (idx === -1)
|
|
202
|
+
return { output: null, error: `Task with id "${input.id}" not found` };
|
|
203
|
+
const task = tasks[idx];
|
|
204
|
+
if (input.title !== undefined)
|
|
205
|
+
task.title = input.title;
|
|
206
|
+
if (input.description !== undefined)
|
|
207
|
+
task.description = input.description;
|
|
208
|
+
if (input.status !== undefined)
|
|
209
|
+
task.status = input.status;
|
|
210
|
+
if (input.priority !== undefined)
|
|
211
|
+
task.priority = input.priority;
|
|
212
|
+
if (input.tags !== undefined)
|
|
213
|
+
task.tags = input.tags;
|
|
214
|
+
data.tasks[idx] = task;
|
|
215
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
216
|
+
return { output: task };
|
|
217
|
+
}
|
|
218
|
+
if (input.action === 'remove') {
|
|
219
|
+
const data = ensureTaskFile(filePath);
|
|
220
|
+
let tasks;
|
|
221
|
+
try {
|
|
222
|
+
tasks = data.tasks.map(normalizeTask);
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return { output: null, error: 'Failed to parse task file.' };
|
|
226
|
+
}
|
|
227
|
+
if (!input.id)
|
|
228
|
+
return { output: null, error: 'ID is required for remove action' };
|
|
229
|
+
const idx = tasks.findIndex((t) => t.id === input.id);
|
|
230
|
+
if (idx === -1)
|
|
231
|
+
return { output: null, error: `Task with id "${input.id}" not found` };
|
|
232
|
+
tasks.splice(idx, 1);
|
|
233
|
+
tasks.forEach((t, i) => { t.order = i; });
|
|
234
|
+
data.tasks = tasks;
|
|
235
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
236
|
+
return { output: { success: true, id: input.id } };
|
|
237
|
+
}
|
|
238
|
+
if (input.action === 'complete') {
|
|
239
|
+
const data = ensureTaskFile(filePath);
|
|
240
|
+
let tasks;
|
|
241
|
+
try {
|
|
242
|
+
tasks = data.tasks.map(normalizeTask);
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
return { output: null, error: 'Failed to parse task file.' };
|
|
246
|
+
}
|
|
247
|
+
if (!input.id)
|
|
248
|
+
return { output: null, error: 'ID is required for complete action' };
|
|
249
|
+
const idx = tasks.findIndex((t) => t.id === input.id);
|
|
250
|
+
if (idx === -1)
|
|
251
|
+
return { output: null, error: `Task with id "${input.id}" not found` };
|
|
252
|
+
const task = tasks[idx];
|
|
253
|
+
task.status = 'done';
|
|
254
|
+
task.completed_at = formatDate();
|
|
255
|
+
data.tasks[idx] = task;
|
|
256
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
257
|
+
return { output: task };
|
|
258
|
+
}
|
|
259
|
+
if (input.action === 'cancel') {
|
|
260
|
+
const data = ensureTaskFile(filePath);
|
|
261
|
+
let tasks;
|
|
262
|
+
try {
|
|
263
|
+
tasks = data.tasks.map(normalizeTask);
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
return { output: null, error: 'Failed to parse task file.' };
|
|
267
|
+
}
|
|
268
|
+
if (!input.id)
|
|
269
|
+
return { output: null, error: 'ID is required for cancel action' };
|
|
270
|
+
const idx = tasks.findIndex((t) => t.id === input.id);
|
|
271
|
+
if (idx === -1)
|
|
272
|
+
return { output: null, error: `Task with id "${input.id}" not found` };
|
|
273
|
+
tasks[idx].status = 'canceled';
|
|
274
|
+
data.tasks[idx] = tasks[idx];
|
|
275
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
276
|
+
return { output: tasks[idx] };
|
|
277
|
+
}
|
|
278
|
+
if (input.action === 'start') {
|
|
279
|
+
const data = ensureTaskFile(filePath);
|
|
280
|
+
let tasks;
|
|
281
|
+
try {
|
|
282
|
+
tasks = data.tasks.map(normalizeTask);
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
return { output: null, error: 'Failed to parse task file.' };
|
|
286
|
+
}
|
|
287
|
+
if (!input.id)
|
|
288
|
+
return { output: null, error: 'ID is required for start action' };
|
|
289
|
+
const idx = tasks.findIndex((t) => t.id === input.id);
|
|
290
|
+
if (idx === -1)
|
|
291
|
+
return { output: null, error: `Task with id "${input.id}" not found` };
|
|
292
|
+
tasks[idx].status = 'in_progress';
|
|
293
|
+
data.tasks[idx] = tasks[idx];
|
|
294
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
295
|
+
return { output: tasks[idx] };
|
|
296
|
+
}
|
|
297
|
+
if (input.action === 'reorder') {
|
|
298
|
+
const data = ensureTaskFile(filePath);
|
|
299
|
+
let tasks;
|
|
300
|
+
try {
|
|
301
|
+
tasks = data.tasks.map(normalizeTask);
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
return { output: null, error: 'Failed to parse task file.' };
|
|
305
|
+
}
|
|
306
|
+
const ids = input.ids;
|
|
307
|
+
if (!ids || !ids.length)
|
|
308
|
+
return { output: null, error: 'IDs array is required for reorder action' };
|
|
309
|
+
const existingIds = new Set(tasks.map((t) => t.id));
|
|
310
|
+
const validIds = ids.filter((id) => existingIds.has(id));
|
|
311
|
+
if (validIds.length !== tasks.length) {
|
|
312
|
+
return { output: null, error: `Not all task IDs exist. Missing: ${ids.filter((id) => !existingIds.has(id)).join(', ')}` };
|
|
313
|
+
}
|
|
314
|
+
tasks.sort((a, b) => validIds.indexOf(a.id) - validIds.indexOf(b.id));
|
|
315
|
+
tasks.forEach((t, i) => { t.order = i; });
|
|
316
|
+
data.tasks = tasks;
|
|
317
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
318
|
+
return { output: { reordered: true, count: validIds.length } };
|
|
319
|
+
}
|
|
320
|
+
return { output: null, error: `Unknown action: ${input.action}` };
|
|
321
|
+
});
|
|
322
|
+
//# sourceMappingURL=todo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todo.js","sourceRoot":"","sources":["../../src/todo.ts"],"names":[],"mappings":"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"}
|
package/dist/src/tool.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ export interface ToolResult {
|
|
|
20
20
|
export interface ToolContext {
|
|
21
21
|
cwd: string;
|
|
22
22
|
settings: CurieSettings;
|
|
23
|
+
sessionId?: string;
|
|
23
24
|
}
|
|
24
25
|
export declare function expandPath(p: string): string;
|
|
25
26
|
/** Set the global cwd used by all tools when not provided at call time. */
|
package/dist/src/tool.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,IAAI;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CACzG;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,aAAa,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK5C;AAID,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE9C;AAmCD,wBAAgB,UAAU,CAAC,MAAM,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,EAClE,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,CAAC,EAC1E,GAAG,CAAC,EAAE,MAAM,GACX,IAAI,GAAG;IAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;CAAE,CAqCxE"}
|
package/dist/src/tool.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import path from 'node:path';
|
|
2
3
|
import { homedir } from 'node:os';
|
|
3
4
|
export function expandPath(p) {
|
|
4
5
|
if (p.startsWith('~/') || p === '~') {
|
|
5
|
-
return homedir()
|
|
6
|
+
return path.join(homedir(), p.slice(1));
|
|
6
7
|
}
|
|
7
8
|
return p;
|
|
8
9
|
}
|
|
@@ -36,6 +37,11 @@ const KEY_ALIASES = {
|
|
|
36
37
|
regex: 'regex', // already matched
|
|
37
38
|
// Bash
|
|
38
39
|
command: 'command', // already matched
|
|
40
|
+
// Reminder / Task
|
|
41
|
+
scheduledAt: 'scheduled_at',
|
|
42
|
+
// WebSearch
|
|
43
|
+
blockedDomains: 'blocked_domains',
|
|
44
|
+
allowedDomains: 'allowed_domains',
|
|
39
45
|
};
|
|
40
46
|
export function createTool(name, description, schema, execute, cwd) {
|
|
41
47
|
const jsonSchema = zodToJsonSchema(schema);
|
|
@@ -47,7 +53,7 @@ export function createTool(name, description, schema, execute, cwd) {
|
|
|
47
53
|
return {
|
|
48
54
|
definition: def,
|
|
49
55
|
validate: (raw) => schema.parse(raw),
|
|
50
|
-
async execute(input, settings, toolCwd) {
|
|
56
|
+
async execute(input, settings, toolCwd, sessionId) {
|
|
51
57
|
// Normalize input: strip null/undefined values and map camelCase
|
|
52
58
|
// key aliases to their snake_case equivalents. LLMs (especially local
|
|
53
59
|
// models) frequently normalize snake_case schema keys to camelCase.
|
|
@@ -63,7 +69,7 @@ export function createTool(name, description, schema, execute, cwd) {
|
|
|
63
69
|
}
|
|
64
70
|
try {
|
|
65
71
|
const parsed = schema.parse(normalized);
|
|
66
|
-
return execute(parsed, { cwd: toolCwd ?? cwd ?? _globalCwd ?? '', settings });
|
|
72
|
+
return execute(parsed, { cwd: toolCwd ?? cwd ?? _globalCwd ?? '', settings, sessionId });
|
|
67
73
|
}
|
|
68
74
|
catch (err) {
|
|
69
75
|
if (err instanceof z.ZodError) {
|
package/dist/src/tool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/tool.ts"],"names":[],"mappings":"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"}
|
package/dist/src/web-search.js
CHANGED
|
@@ -7,11 +7,11 @@ const WebSearchSchema = z.object({
|
|
|
7
7
|
allowed_domains: z.array(z.string()).optional().describe('Only return results from these domains'),
|
|
8
8
|
});
|
|
9
9
|
export const webSearchTool = createTool('WebSearch', 'Search the web using Brave Search API. Returns titles, URLs, and snippets.', WebSearchSchema, async (input, ctx) => {
|
|
10
|
-
const apiKey = ctx.settings.
|
|
10
|
+
const apiKey = ctx.settings.brave_search_api_key;
|
|
11
11
|
if (!apiKey) {
|
|
12
12
|
return {
|
|
13
13
|
output: null,
|
|
14
|
-
error: '
|
|
14
|
+
error: 'brave_search_api_key is not configured in settings.json',
|
|
15
15
|
};
|
|
16
16
|
}
|
|
17
17
|
const count = Math.min(input.count ?? 10, 20);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const wikiTool: import("./tool.js").Tool & {
|
|
2
|
+
validate: (raw: Record<string, unknown>) => {
|
|
3
|
+
op: "init" | "list_sources" | "list_pages" | "page_get" | "page_put" | "index_get" | "index_upsert" | "log_append" | "search" | "graph" | "lint_report";
|
|
4
|
+
slug?: string | undefined;
|
|
5
|
+
content?: string | undefined;
|
|
6
|
+
query?: string | undefined;
|
|
7
|
+
title?: string | undefined;
|
|
8
|
+
summary?: string | undefined;
|
|
9
|
+
category?: string | undefined;
|
|
10
|
+
date?: string | undefined;
|
|
11
|
+
prefix?: "INGEST" | "QUERY" | "LINT" | "EDIT" | undefined;
|
|
12
|
+
line?: string | undefined;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=wiki.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki.d.ts","sourceRoot":"","sources":["../../src/wiki.ts"],"names":[],"mappings":"AAoCA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;CA0FpB,CAAC"}
|
package/dist/src/wiki.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { createTool } from './tool.js';
|
|
3
|
+
// Ops that require slug
|
|
4
|
+
const SlugOps = ['page_get', 'page_put', 'index_upsert'];
|
|
5
|
+
// Ops that require content
|
|
6
|
+
const ContentOps = ['page_put'];
|
|
7
|
+
const WikiSchema = z.object({
|
|
8
|
+
op: z.enum([
|
|
9
|
+
'init',
|
|
10
|
+
'list_sources',
|
|
11
|
+
'list_pages',
|
|
12
|
+
'page_get',
|
|
13
|
+
'page_put',
|
|
14
|
+
'index_get',
|
|
15
|
+
'index_upsert',
|
|
16
|
+
'log_append',
|
|
17
|
+
'search',
|
|
18
|
+
'graph',
|
|
19
|
+
'lint_report',
|
|
20
|
+
]).describe('Operation: init (scaffold wiki), list_sources, list_pages, page_get, page_put, ' +
|
|
21
|
+
'index_get, index_upsert, log_append, search, graph (backlink graph), lint_report'),
|
|
22
|
+
slug: z.string().optional().describe('Page slug relative to pages/ (e.g. concepts/topic)'),
|
|
23
|
+
content: z.string().optional().describe('Markdown content for page_put'),
|
|
24
|
+
query: z.string().optional().describe('Search query for the search op'),
|
|
25
|
+
title: z.string().optional().describe('Page title for index_upsert'),
|
|
26
|
+
summary: z.string().optional().describe('One-line summary for index_upsert'),
|
|
27
|
+
category: z.string().optional().describe('Category for index_upsert (e.g. Concepts, Entities, Summaries)'),
|
|
28
|
+
date: z.string().optional().describe('Date for index_upsert (YYYY-MM-DD)'),
|
|
29
|
+
prefix: z.enum(['INGEST', 'QUERY', 'LINT', 'EDIT']).optional().describe('Log prefix for log_append'),
|
|
30
|
+
line: z.string().optional().describe('Detail line for log_append'),
|
|
31
|
+
});
|
|
32
|
+
export const wikiTool = createTool('Wiki', 'Operate on the curie-agent knowledge wiki: scaffold, read/write pages, update the index, ' +
|
|
33
|
+
'append to the log, search content, build the backlink graph, or run a deterministic lint ' +
|
|
34
|
+
'report. The Ingest/Query/Lint *workflows* are not single calls — compose this tool with ' +
|
|
35
|
+
'Read/WebFetch under the WIKI.md procedure.', WikiSchema, async (input, ctx) => {
|
|
36
|
+
// Lazy import to avoid loading @curie-agent/wiki at startup when unused
|
|
37
|
+
const { WikiManager, initWiki } = await import('@curie-agent/wiki');
|
|
38
|
+
const rawWiki = ctx.settings.wiki;
|
|
39
|
+
const settingsForWiki = rawWiki
|
|
40
|
+
? { wiki: { path: rawWiki.path ?? '', autoLint: (rawWiki.autoLint ?? 'off') } }
|
|
41
|
+
: undefined;
|
|
42
|
+
switch (input.op) {
|
|
43
|
+
case 'init': {
|
|
44
|
+
const root = initWiki(settingsForWiki);
|
|
45
|
+
return { output: { message: `Wiki initialized at ${root}`, root } };
|
|
46
|
+
}
|
|
47
|
+
default: {
|
|
48
|
+
const wm = new WikiManager(settingsForWiki);
|
|
49
|
+
wm.ensureStructure();
|
|
50
|
+
switch (input.op) {
|
|
51
|
+
case 'list_sources':
|
|
52
|
+
return { output: wm.listRawSources() };
|
|
53
|
+
case 'list_pages':
|
|
54
|
+
return { output: wm.listPages() };
|
|
55
|
+
case 'page_get': {
|
|
56
|
+
if (!input.slug)
|
|
57
|
+
return { output: null, error: 'slug is required for page_get' };
|
|
58
|
+
const content = wm.readPage(input.slug);
|
|
59
|
+
if (content === null)
|
|
60
|
+
return { output: null, error: `Page not found: ${input.slug}` };
|
|
61
|
+
return { output: content };
|
|
62
|
+
}
|
|
63
|
+
case 'page_put': {
|
|
64
|
+
if (!input.slug)
|
|
65
|
+
return { output: null, error: 'slug is required for page_put' };
|
|
66
|
+
if (input.content === undefined)
|
|
67
|
+
return { output: null, error: 'content is required for page_put' };
|
|
68
|
+
wm.writePage(input.slug, input.content);
|
|
69
|
+
return { output: { message: `Page written: ${input.slug}` } };
|
|
70
|
+
}
|
|
71
|
+
case 'index_get':
|
|
72
|
+
return { output: wm.readIndex() };
|
|
73
|
+
case 'index_upsert': {
|
|
74
|
+
if (!input.slug)
|
|
75
|
+
return { output: null, error: 'slug is required for index_upsert' };
|
|
76
|
+
wm.upsertIndexEntry({
|
|
77
|
+
slug: input.slug,
|
|
78
|
+
title: input.title ?? input.slug.split('/').pop() ?? input.slug,
|
|
79
|
+
summary: input.summary ?? '',
|
|
80
|
+
category: input.category ?? 'Other',
|
|
81
|
+
date: input.date,
|
|
82
|
+
});
|
|
83
|
+
return { output: { message: `Index updated: ${input.slug}` } };
|
|
84
|
+
}
|
|
85
|
+
case 'log_append': {
|
|
86
|
+
if (!input.prefix)
|
|
87
|
+
return { output: null, error: 'prefix is required for log_append' };
|
|
88
|
+
const title = input.title ?? input.query ?? 'entry';
|
|
89
|
+
wm.appendLog(input.prefix, title, input.line);
|
|
90
|
+
return { output: { message: `Log appended: [${input.prefix}] ${title}` } };
|
|
91
|
+
}
|
|
92
|
+
case 'search': {
|
|
93
|
+
if (!input.query)
|
|
94
|
+
return { output: null, error: 'query is required for search' };
|
|
95
|
+
return { output: wm.search(input.query) };
|
|
96
|
+
}
|
|
97
|
+
case 'graph':
|
|
98
|
+
return { output: wm.graph() };
|
|
99
|
+
case 'lint_report': {
|
|
100
|
+
const report = wm.lintReport();
|
|
101
|
+
return { output: report };
|
|
102
|
+
}
|
|
103
|
+
default:
|
|
104
|
+
return { output: null, error: `Unknown op: ${String(input.op)}` };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
//# sourceMappingURL=wiki.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki.js","sourceRoot":"","sources":["../../src/wiki.ts"],"names":[],"mappings":"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"}
|
package/dist/src/write.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/write.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,SAAS;;;;;
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/write.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,SAAS;;;;;CAoCrB,CAAC"}
|
package/dist/src/write.js
CHANGED
|
@@ -7,10 +7,13 @@ const WriteSchema = z.object({
|
|
|
7
7
|
file_path: z.string().describe('The absolute path to the file to write'),
|
|
8
8
|
content: z.string().describe('The content to write to the file'),
|
|
9
9
|
});
|
|
10
|
-
export const writeTool = createTool('Write', 'Writes a file to the local filesystem. Creates new files or overwrites existing ones.'
|
|
10
|
+
export const writeTool = createTool('Write', 'Writes a file to the local filesystem. Creates new files or overwrites existing ones. ' +
|
|
11
|
+
'Use this for any content too large to deliver inline — research reports, summaries, essays, generated documents. ' +
|
|
12
|
+
'For very long content (>500 lines), write a skeleton first with placeholder headings, ' +
|
|
13
|
+
'then fill each section using the Edit tool so each individual tool call stays small and fits within output limits.', WriteSchema, async (input, ctx) => {
|
|
11
14
|
let filePath;
|
|
12
|
-
if (ctx.settings.
|
|
13
|
-
const check = resolveSafePath(input.file_path, ctx.cwd, parseAllowlist(ctx.settings.
|
|
15
|
+
if (ctx.settings.safety?.path_guard !== 'off') {
|
|
16
|
+
const check = resolveSafePath(input.file_path, ctx.cwd, parseAllowlist(ctx.settings.safety?.path_allowlist ?? ''));
|
|
14
17
|
if ('error' in check)
|
|
15
18
|
return { output: null, error: check.error };
|
|
16
19
|
filePath = check.path;
|
package/dist/src/write.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAoB,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAEzF,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;IACxE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;CACjE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CACjC,OAAO,EACP,
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAoB,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAEzF,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;IACxE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;CACjE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CACjC,OAAO,EACP,wFAAwF;IACxF,mHAAmH;IACnH,wFAAwF;IACxF,oHAAoH,EACpH,WAAW,EACX,KAAK,EAAE,KAAK,EAAE,GAAgB,EAAE,EAAE;IAChC,IAAI,QAAgB,CAAC;IAErB,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,KAAK,KAAK,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,eAAe,CAC3B,KAAK,CAAC,SAAS,EACf,GAAG,CAAC,GAAG,EACP,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,IAAI,EAAE,CAAC,CAC1D,CAAC;QACF,IAAI,OAAO,IAAI,KAAK;YAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QAClE,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEnD,OAAO;QACL,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;SACjD;KACF,CAAC;AACJ,CAAC,CACF,CAAC"}
|