@curie-agent/tools 0.2.4 → 0.2.5
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.js +2 -2
- 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 +42 -13
- 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 +27 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +8 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/read.d.ts.map +1 -1
- package/dist/src/read.js +3 -9
- 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/write.js +2 -2
- package/dist/src/write.js.map +1 -1
- package/package.json +10 -10
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export function createSpawnAgentTool(config) {
|
|
2
|
+
const { subagentExecutor, provider, cwd, settings, model } = config;
|
|
3
|
+
return {
|
|
4
|
+
definition: {
|
|
5
|
+
name: 'spawn_agent',
|
|
6
|
+
description: 'Spawn a subagent to work on a task in parallel. The subagent runs with its own TurnLoop and streams output back to the parent session. Returns the agent ID for tracking.',
|
|
7
|
+
inputSchema: JSON.stringify({
|
|
8
|
+
type: 'object',
|
|
9
|
+
required: ['prompt'],
|
|
10
|
+
properties: {
|
|
11
|
+
prompt: {
|
|
12
|
+
type: 'string',
|
|
13
|
+
description: 'The task instruction for the subagent',
|
|
14
|
+
},
|
|
15
|
+
mode: {
|
|
16
|
+
type: 'string',
|
|
17
|
+
enum: ['plan', 'edit', 'auto', 'yolo'],
|
|
18
|
+
description: 'Approval mode override (default: inherits from parent session)',
|
|
19
|
+
},
|
|
20
|
+
effort: {
|
|
21
|
+
type: 'string',
|
|
22
|
+
enum: ['low', 'medium', 'high', 'max', 'auto'],
|
|
23
|
+
description: 'Reasoning effort override (default: inherits from parent)',
|
|
24
|
+
},
|
|
25
|
+
tools: {
|
|
26
|
+
type: 'array',
|
|
27
|
+
items: { type: 'string' },
|
|
28
|
+
description: 'Subset of tool names to allow. Empty or omitted = all parent tools.',
|
|
29
|
+
},
|
|
30
|
+
model: {
|
|
31
|
+
type: 'string',
|
|
32
|
+
description: 'Model override for this subagent (e.g. "anthropic/claude-sonnet-4-6")',
|
|
33
|
+
},
|
|
34
|
+
provider: {
|
|
35
|
+
type: 'string',
|
|
36
|
+
enum: ['anthropic', 'openai', 'google', 'ollama', 'openrouter'],
|
|
37
|
+
description: 'Provider to use for this subagent (default: inherits from parent)',
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
}),
|
|
41
|
+
},
|
|
42
|
+
async execute(input) {
|
|
43
|
+
const prompt = input.prompt;
|
|
44
|
+
if (!prompt) {
|
|
45
|
+
return { output: null, error: 'spawn_agent requires a "prompt" argument' };
|
|
46
|
+
}
|
|
47
|
+
const mode = input.mode;
|
|
48
|
+
const effort = input.effort;
|
|
49
|
+
const tools = input.tools;
|
|
50
|
+
const modelOverride = input.model;
|
|
51
|
+
const providerName = input.provider;
|
|
52
|
+
try {
|
|
53
|
+
// If a specific provider is requested, create a settings override
|
|
54
|
+
const spawnSettings = providerName
|
|
55
|
+
? { ...settings, current_provider: providerName }
|
|
56
|
+
: settings;
|
|
57
|
+
const handle = await subagentExecutor.spawn({
|
|
58
|
+
provider,
|
|
59
|
+
model: modelOverride || model,
|
|
60
|
+
tools: [{
|
|
61
|
+
definition: { name: 'noop', description: 'Placeholder', inputSchema: '{}' },
|
|
62
|
+
execute: async () => ({ output: null }),
|
|
63
|
+
}],
|
|
64
|
+
cwd,
|
|
65
|
+
settings,
|
|
66
|
+
prompt,
|
|
67
|
+
providerName: providerName || undefined,
|
|
68
|
+
mode,
|
|
69
|
+
effort,
|
|
70
|
+
allowedTools: tools,
|
|
71
|
+
type: 'subagent',
|
|
72
|
+
});
|
|
73
|
+
return {
|
|
74
|
+
output: {
|
|
75
|
+
agentId: handle.agentId,
|
|
76
|
+
prompt: handle.prompt,
|
|
77
|
+
status: handle.status,
|
|
78
|
+
sessionId: handle.sessionId,
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
84
|
+
return { output: null, error: `Failed to spawn subagent: ${msg}` };
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=spawn-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn-agent.js","sourceRoot":"","sources":["../../src/spawn-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CreateScheduledTask tool — schedules the LLM agent to execute an instruction at a specific time.
|
|
3
|
+
* Migrated from CronManager to TaskManager (mode='auto').
|
|
4
|
+
*/
|
|
5
|
+
export declare const scheduledTaskTool: import("./tool.js").Tool & {
|
|
6
|
+
validate: (raw: Record<string, unknown>) => {
|
|
7
|
+
instruction: string;
|
|
8
|
+
scheduled_at: string;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/task.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,eAAO,MAAM,iBAAiB;;;;;CA2C7B,CAAC"}
|
package/dist/src/task.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CreateScheduledTask tool — schedules the LLM agent to execute an instruction at a specific time.
|
|
3
|
+
* Migrated from CronManager to TaskManager (mode='auto').
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { createTool } from './tool.js';
|
|
7
|
+
import { TaskManager } from '@curie-agent/core';
|
|
8
|
+
const taskManager = new TaskManager();
|
|
9
|
+
const CreateScheduledTaskSchema = z.object({
|
|
10
|
+
instruction: z.string().describe('What the agent should do when the scheduled task executes'),
|
|
11
|
+
scheduled_at: z.string().describe('ISO 8601 datetime with timezone offset (e.g. "2026-05-03T07:55:00+02:00")'),
|
|
12
|
+
});
|
|
13
|
+
export const scheduledTaskTool = createTool('CreateScheduledTask', 'Schedules a task for the agent to autonomously execute at a specified time. The agent will run the instruction using available tools and deliver results.', CreateScheduledTaskSchema, async (input, ctx) => {
|
|
14
|
+
let dateStr = input.scheduled_at.trim();
|
|
15
|
+
const hasTimezone = /[Zz]|[+-]\d{2}(:?\d{2})?$/.test(dateStr);
|
|
16
|
+
if (!hasTimezone) {
|
|
17
|
+
const date = new Date();
|
|
18
|
+
const offsetMinutes = -date.getTimezoneOffset();
|
|
19
|
+
const sign = offsetMinutes >= 0 ? '+' : '-';
|
|
20
|
+
const absMinutes = Math.abs(offsetMinutes);
|
|
21
|
+
const hours = String(Math.floor(absMinutes / 60)).padStart(2, '0');
|
|
22
|
+
const mins = String(absMinutes % 60).padStart(2, '0');
|
|
23
|
+
dateStr = `${dateStr}${sign}:${mins}`;
|
|
24
|
+
}
|
|
25
|
+
const scheduledAt = new Date(dateStr).getTime();
|
|
26
|
+
if (isNaN(scheduledAt)) {
|
|
27
|
+
return {
|
|
28
|
+
output: null,
|
|
29
|
+
error: `Invalid datetime: "${input.scheduled_at}". Use ISO 8601 format with timezone offset.`,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
taskManager.load();
|
|
33
|
+
const task = taskManager.create({
|
|
34
|
+
title: input.instruction,
|
|
35
|
+
mode: 'auto',
|
|
36
|
+
scope: 'personal',
|
|
37
|
+
scheduled_at: scheduledAt,
|
|
38
|
+
});
|
|
39
|
+
return {
|
|
40
|
+
output: {
|
|
41
|
+
id: task.id,
|
|
42
|
+
instruction: task.title,
|
|
43
|
+
scheduledAt: task.scheduled_at ? new Date(task.scheduled_at).toLocaleString() : '—',
|
|
44
|
+
status: task.status,
|
|
45
|
+
mode: task.mode,
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/task.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAoB,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;IAC7F,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2EAA2E,CAAC;CAC/G,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CACzC,qBAAqB,EACrB,2JAA2J,EAC3J,yBAAyB,EACzB,KAAK,EAAE,KAAK,EAAE,GAAgB,EAAE,EAAE;IAChC,IAAI,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IACxC,MAAM,WAAW,GAAG,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACtD,OAAO,GAAG,GAAG,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IAChD,IAAI,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,sBAAsB,KAAK,CAAC,YAAY,8CAA8C;SAC9F,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,IAAI,EAAE,CAAC;IACnB,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC;QAC9B,KAAK,EAAE,KAAK,CAAC,WAAW;QACxB,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,UAAU;QACjB,YAAY,EAAE,WAAW;KAC1B,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE;YACN,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,WAAW,EAAE,IAAI,CAAC,KAAK;YACvB,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,GAAG;YACnF,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB;KACF,CAAC;AACJ,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
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 'manual').
|
|
5
|
+
*/
|
|
6
|
+
export declare const todoTool: import("./tool.js").Tool & {
|
|
7
|
+
validate: (raw: Record<string, unknown>) => {
|
|
8
|
+
action: "edit" | "list" | "add" | "remove" | "complete" | "cancel" | "start" | "reorder";
|
|
9
|
+
scope: "personal" | "project";
|
|
10
|
+
id?: string | undefined;
|
|
11
|
+
title?: string | undefined;
|
|
12
|
+
description?: string | undefined;
|
|
13
|
+
status?: "backlog" | "todo" | "in_progress" | "done" | "canceled" | undefined;
|
|
14
|
+
priority?: "low" | "medium" | "high" | "critical" | undefined;
|
|
15
|
+
tags?: string[] | undefined;
|
|
16
|
+
ids?: string[] | undefined;
|
|
17
|
+
filter_status?: "backlog" | "todo" | "in_progress" | "done" | "canceled" | undefined;
|
|
18
|
+
filter_priority?: "low" | "medium" | "high" | "critical" | undefined;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=todo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todo.d.ts","sourceRoot":"","sources":["../../src/todo.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoJH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;CA8KpB,CAAC"}
|
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 'manual').
|
|
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 = ['manual', 'auto', 'notify'];
|
|
40
|
+
const rawMode = String(obj.mode ?? '');
|
|
41
|
+
const mode = (validModes.includes(rawMode) ? rawMode : 'manual');
|
|
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), auto (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: 'manual', // default — new fields are always manual 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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AA6BlC,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,IAAI,UAAU,GAAG,EAAE,CAAC;AAEpB,2EAA2E;AAC3E,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,UAAU,GAAG,GAAG,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,MAAoB;IAC3C,MAAM,GAAG,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,CAA4B,CAAC;IAC9D,yDAAyD;IACzD,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC;IACtB,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,WAAW,GAA2B;IAC1C,cAAc;IACd,QAAQ,EAAE,WAAW;IACrB,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;IACvB,UAAU,EAAE,aAAa;IACzB,QAAQ;IACR,OAAO,EAAE,SAAS,EAAE,kBAAkB;IACtC,OAAO;IACP,OAAO,EAAE,SAAS,EAAE,kBAAkB;IACtC,OAAO;IACP,KAAK,EAAE,OAAO,EAAE,kBAAkB;IAClC,OAAO;IACP,OAAO,EAAE,SAAS,EAAE,kBAAkB;IACtC,kBAAkB;IAClB,WAAW,EAAE,cAAc;IAC3B,YAAY;IACZ,cAAc,EAAE,iBAAiB;IACjC,cAAc,EAAE,iBAAiB;CAClC,CAAC;AAEF,MAAM,UAAU,UAAU,CACxB,IAAY,EACZ,WAAmB,EACnB,MAAc,EACd,OAA0E,EAC1E,GAAY;IAEZ,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAE3C,MAAM,GAAG,GAAY;QACnB,IAAI;QACJ,WAAW;QACX,WAAW,EAAE,UAAoC;KAClD,CAAC;IAEF,OAAO;QACL,UAAU,EAAE,GAAG;QACf,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;QACpC,KAAK,CAAC,OAAO,CAAC,KAA8B,EAAE,QAAuB,EAAE,OAAgB,EAAE,SAAkB;YACzG,iEAAiE;YACjE,sEAAsE;YACtE,oEAAoE;YACpE,MAAM,UAAU,GAA4B,EAAE,CAAC;YAC/C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;oBAAE,SAAS;gBAC5C,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACtC,kFAAkF;gBAClF,IAAI,CAAC,CAAC,SAAS,IAAI,UAAU,CAAC,EAAE,CAAC;oBAC/B,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAoB,CAAC;gBAC3D,OAAO,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG,IAAI,UAAU,IAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3F,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;oBAC9B,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACtF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,8BAA8B,IAAI,MAAM,OAAO,EAAE,EAAE,CAAC;gBACpF,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
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);
|