@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.
Files changed (53) hide show
  1. package/LICENSE +179 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/bash.d.ts.map +1 -1
  4. package/dist/src/bash.js +54 -27
  5. package/dist/src/bash.js.map +1 -1
  6. package/dist/src/edit.js +2 -2
  7. package/dist/src/edit.js.map +1 -1
  8. package/dist/src/glob.d.ts.map +1 -1
  9. package/dist/src/glob.js +64 -17
  10. package/dist/src/glob.js.map +1 -1
  11. package/dist/src/grep.d.ts.map +1 -1
  12. package/dist/src/grep.js +10 -2
  13. package/dist/src/grep.js.map +1 -1
  14. package/dist/src/index.d.ts +51 -10
  15. package/dist/src/index.d.ts.map +1 -1
  16. package/dist/src/index.js +10 -1
  17. package/dist/src/index.js.map +1 -1
  18. package/dist/src/read.d.ts.map +1 -1
  19. package/dist/src/read.js +4 -10
  20. package/dist/src/read.js.map +1 -1
  21. package/dist/src/reminder.d.ts +4 -0
  22. package/dist/src/reminder.d.ts.map +1 -1
  23. package/dist/src/reminder.js +31 -10
  24. package/dist/src/reminder.js.map +1 -1
  25. package/dist/src/skill.d.ts +34 -0
  26. package/dist/src/skill.d.ts.map +1 -0
  27. package/dist/src/skill.js +133 -0
  28. package/dist/src/skill.js.map +1 -0
  29. package/dist/src/spawn-agent.d.ts +13 -0
  30. package/dist/src/spawn-agent.d.ts.map +1 -0
  31. package/dist/src/spawn-agent.js +89 -0
  32. package/dist/src/spawn-agent.js.map +1 -0
  33. package/dist/src/task.d.ts +11 -0
  34. package/dist/src/task.d.ts.map +1 -0
  35. package/dist/src/task.js +49 -0
  36. package/dist/src/task.js.map +1 -0
  37. package/dist/src/todo.d.ts +21 -0
  38. package/dist/src/todo.d.ts.map +1 -0
  39. package/dist/src/todo.js +322 -0
  40. package/dist/src/todo.js.map +1 -0
  41. package/dist/src/tool.d.ts +1 -0
  42. package/dist/src/tool.d.ts.map +1 -1
  43. package/dist/src/tool.js +9 -3
  44. package/dist/src/tool.js.map +1 -1
  45. package/dist/src/web-search.js +2 -2
  46. package/dist/src/wiki.d.ts +15 -0
  47. package/dist/src/wiki.d.ts.map +1 -0
  48. package/dist/src/wiki.js +109 -0
  49. package/dist/src/wiki.js.map +1 -0
  50. package/dist/src/write.d.ts.map +1 -1
  51. package/dist/src/write.js +6 -3
  52. package/dist/src/write.js.map +1 -1
  53. package/package.json +11 -10
@@ -1,27 +1,48 @@
1
+ /**
2
+ * CreateReminder tool — schedules a notification at a specific time.
3
+ * Migrated from CronManager to TaskManager (mode='notify').
4
+ */
1
5
  import { z } from 'zod';
2
6
  import { createTool } from './tool.js';
3
- import { CronManager } from '@curie-agent/core';
4
- const CronManagerSingleton = new CronManager();
7
+ import { TaskManager } from '@curie-agent/core';
8
+ const taskManager = new TaskManager();
5
9
  const CreateReminderSchema = z.object({
6
10
  message: z.string().describe('What to remind the user about'),
7
- scheduled_at: z.string().describe('ISO 8601 datetime (e.g. "2026-05-03T07:00:00Z")'),
11
+ scheduled_at: z.string().describe('ISO 8601 datetime with the user\'s local timezone offset suffix. You MUST append the timezone offset matching the offset in the date/time context (e.g. "2026-05-03T07:00:00+02:00"). Do NOT omit the offset.'),
8
12
  });
9
- export const reminderTool = createTool('CreateReminder', 'Creates a reminder notification that will fire at the specified time.', CreateReminderSchema, async (input) => {
10
- const scheduledAt = new Date(input.scheduled_at).getTime();
13
+ export const reminderTool = createTool('CreateReminder', 'Creates a reminder notification that will fire at the specified time.', CreateReminderSchema, 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}${hours}:${mins}`;
24
+ }
25
+ const scheduledAt = new Date(dateStr).getTime();
11
26
  if (isNaN(scheduledAt)) {
12
27
  return {
13
28
  output: null,
14
- error: `Invalid datetime: "${input.scheduled_at}". Use ISO 8601 format (e.g. "2026-05-03T07:00:00Z").`,
29
+ error: `Invalid datetime: "${input.scheduled_at}". Use ISO 8601 format with timezone offset suffix.`,
15
30
  };
16
31
  }
17
- const task = CronManagerSingleton.createReminder(input.message, scheduledAt);
18
- const timeStr = new Date(scheduledAt).toLocaleString();
32
+ taskManager.load();
33
+ const task = taskManager.create({
34
+ title: input.message,
35
+ mode: 'notify',
36
+ scope: 'personal',
37
+ scheduled_at: scheduledAt,
38
+ });
19
39
  return {
20
40
  output: {
21
41
  id: task.id,
22
- message: task.message,
23
- scheduledAt: timeStr,
42
+ message: task.title,
43
+ scheduledAt: task.scheduled_at ? new Date(task.scheduled_at).toLocaleString() : '—',
24
44
  status: task.status,
45
+ mode: task.mode,
25
46
  },
26
47
  };
27
48
  });
@@ -1 +1 @@
1
- {"version":3,"file":"reminder.js","sourceRoot":"","sources":["../../src/reminder.ts"],"names":[],"mappings":"AAAA,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,oBAAoB,GAAG,IAAI,WAAW,EAAE,CAAC;AAE/C,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAC7D,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;CACrF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CACpC,gBAAgB,EAChB,uEAAuE,EACvE,oBAAoB,EACpB,KAAK,EAAE,KAAK,EAAE,EAAE;IACd,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC;IAC3D,IAAI,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,sBAAsB,KAAK,CAAC,YAAY,uDAAuD;SACvG,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,oBAAoB,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,cAAc,EAAE,CAAC;IACvD,OAAO;QACL,MAAM,EAAE;YACN,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,OAAO;YACpB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB;KACF,CAAC;AACJ,CAAC,CACF,CAAC"}
1
+ {"version":3,"file":"reminder.js","sourceRoot":"","sources":["../../src/reminder.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,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAC7D,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+MAA+M,CAAC;CACnP,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CACpC,gBAAgB,EAChB,uEAAuE,EACvE,oBAAoB,EACpB,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,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;IAChD,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,qDAAqD;SACrG,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,IAAI,EAAE,CAAC;IACnB,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC;QAC9B,KAAK,EAAE,KAAK,CAAC,OAAO;QACpB,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,UAAU;QACjB,YAAY,EAAE,WAAW;KAC1B,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE;YACN,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,OAAO,EAAE,IAAI,CAAC,KAAK;YACnB,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,34 @@
1
+ export interface ParsedSkill {
2
+ name: string;
3
+ description: string;
4
+ tools?: string[];
5
+ body: string;
6
+ filePath: string;
7
+ }
8
+ export interface SkillMetadataEntry {
9
+ name: string;
10
+ description: string;
11
+ source: 'global' | 'project';
12
+ filePath: string;
13
+ }
14
+ /** Parse `---` delimited YAML frontmatter (simple key: value only). */
15
+ export declare function parseFrontmatter(content: string): {
16
+ frontmatter: Record<string, string>;
17
+ body: string;
18
+ };
19
+ /** Discover skills in a single directory. */
20
+ export declare function discoverSkillsInDir(dir: string): ParsedSkill[];
21
+ /** Discover all skills (global + project), project overrides global by name. */
22
+ export declare function discoverAllSkills(cwd: string): ParsedSkill[];
23
+ /** Find a skill by name (case-insensitive), project first then global. */
24
+ export declare function findSkill(cwd: string, skillName: string): ParsedSkill | null;
25
+ /** Format skills as a markdown section for the system prompt. */
26
+ export declare function formatSkillsForPrompt(skills: ParsedSkill[]): string;
27
+ /** List skills with source information (for /skill slash command). */
28
+ export declare function listSkills(cwd: string): SkillMetadataEntry[];
29
+ export declare const skillTool: import("./tool.js").Tool & {
30
+ validate: (raw: Record<string, unknown>) => {
31
+ skill: string;
32
+ };
33
+ };
34
+ //# sourceMappingURL=skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/skill.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,uEAAuE;AACvE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAmBvG;AAED,6CAA6C;AAC7C,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE,CAqC9D;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE,CAY5D;AAED,0EAA0E;AAC1E,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAI5E;AAED,iEAAiE;AACjE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAgBnE;AAED,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAkB5D;AAID,eAAO,MAAM,SAAS;;;;CAerB,CAAC"}
@@ -0,0 +1,133 @@
1
+ import { z } from 'zod';
2
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { join, resolve } from 'node:path';
5
+ import { createTool } from './tool.js';
6
+ const KEBAB_CASE_RE = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;
7
+ /** Parse `---` delimited YAML frontmatter (simple key: value only). */
8
+ export function parseFrontmatter(content) {
9
+ if (!content.startsWith('---')) {
10
+ return { frontmatter: {}, body: content };
11
+ }
12
+ const endIdx = content.indexOf('---', 3);
13
+ if (endIdx === -1)
14
+ return { frontmatter: {}, body: content };
15
+ const fmBlock = content.slice(3, endIdx).trim();
16
+ const body = content.slice(endIdx + 3).trim();
17
+ const frontmatter = {};
18
+ for (const line of fmBlock.split('\n')) {
19
+ const colonIdx = line.indexOf(':');
20
+ if (colonIdx === -1)
21
+ continue;
22
+ const key = line.slice(0, colonIdx).trim();
23
+ const value = line.slice(colonIdx + 1).trim();
24
+ if (key)
25
+ frontmatter[key] = value;
26
+ }
27
+ return { frontmatter, body };
28
+ }
29
+ /** Discover skills in a single directory. */
30
+ export function discoverSkillsInDir(dir) {
31
+ const skills = [];
32
+ if (!existsSync(dir) || !statSync(dir).isDirectory())
33
+ return skills;
34
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
35
+ let skillPath = null;
36
+ if (entry.isDirectory()) {
37
+ skillPath = join(dir, entry.name, 'SKILL.md');
38
+ }
39
+ else if (/^(.+)-SKILL\.md$/i.test(entry.name)) {
40
+ skillPath = join(dir, entry.name);
41
+ }
42
+ if (!skillPath || !existsSync(skillPath))
43
+ continue;
44
+ try {
45
+ const content = readFileSync(skillPath, 'utf-8');
46
+ const { frontmatter, body } = parseFrontmatter(content);
47
+ const name = frontmatter['name'];
48
+ if (!name || !KEBAB_CASE_RE.test(name))
49
+ continue;
50
+ const tools = frontmatter['tools']
51
+ ? frontmatter['tools'].split(',').map(s => s.trim()).filter(Boolean)
52
+ : undefined;
53
+ skills.push({
54
+ name,
55
+ description: frontmatter['description'] || '',
56
+ tools,
57
+ body,
58
+ filePath: resolve(skillPath),
59
+ });
60
+ }
61
+ catch {
62
+ // skip unreadable files
63
+ }
64
+ }
65
+ return skills;
66
+ }
67
+ /** Discover all skills (global + project), project overrides global by name. */
68
+ export function discoverAllSkills(cwd) {
69
+ const globalDir = join(homedir(), '.curie-agent', 'skills');
70
+ const projectDir = join(cwd, '.curie-agent', 'skills');
71
+ const globalSkills = discoverSkillsInDir(globalDir);
72
+ const projectSkills = discoverSkillsInDir(projectDir);
73
+ const map = new Map();
74
+ for (const s of globalSkills)
75
+ map.set(s.name.toLowerCase(), s);
76
+ for (const s of projectSkills)
77
+ map.set(s.name.toLowerCase(), s);
78
+ return [...map.values()];
79
+ }
80
+ /** Find a skill by name (case-insensitive), project first then global. */
81
+ export function findSkill(cwd, skillName) {
82
+ const target = skillName.toLowerCase();
83
+ const all = discoverAllSkills(cwd);
84
+ return all.find(s => s.name.toLowerCase() === target) ?? null;
85
+ }
86
+ /** Format skills as a markdown section for the system prompt. */
87
+ export function formatSkillsForPrompt(skills) {
88
+ if (skills.length === 0)
89
+ return '';
90
+ const lines = [
91
+ '## Available Skills',
92
+ '',
93
+ 'You have access to the following skills. When the user\'s request matches a skill description,',
94
+ 'invoke the Skill tool with the skill name to load its full instructions.',
95
+ '',
96
+ '| Skill | Description |',
97
+ '|-------|-------------|',
98
+ ];
99
+ for (const s of skills) {
100
+ lines.push(`| ${s.name} | ${s.description} |`);
101
+ }
102
+ return lines.join('\n');
103
+ }
104
+ /** List skills with source information (for /skill slash command). */
105
+ export function listSkills(cwd) {
106
+ const globalDir = join(homedir(), '.curie-agent', 'skills');
107
+ const projectDir = join(cwd, '.curie-agent', 'skills');
108
+ const entries = [];
109
+ const seen = new Set();
110
+ // Global first
111
+ for (const s of discoverSkillsInDir(globalDir)) {
112
+ entries.push({ name: s.name, description: s.description, source: 'global', filePath: s.filePath });
113
+ seen.add(s.name.toLowerCase());
114
+ }
115
+ // Project skills (override display, but we keep global entry too - tool resolves project-first)
116
+ for (const s of discoverSkillsInDir(projectDir)) {
117
+ entries.push({ name: s.name, description: s.description, source: 'project', filePath: s.filePath });
118
+ }
119
+ return entries;
120
+ }
121
+ // ── Skill Tool ──
122
+ export const skillTool = createTool('Skill', 'Invoke a skill by name. Returns the skill\'s instructions which you should follow. Available skills are listed in the system prompt under "## Available Skills".', z.object({
123
+ skill: z.string().describe('The name of the skill to invoke (kebab-case identifier)'),
124
+ }), async (input, ctx) => {
125
+ const skill = findSkill(ctx.cwd, input.skill);
126
+ if (!skill) {
127
+ const all = discoverAllSkills(ctx.cwd);
128
+ const available = all.map(s => s.name).join(', ') || '(none)';
129
+ return { output: null, error: `Skill "${input.skill}" not found. Available: ${available}` };
130
+ }
131
+ return { output: skill.body };
132
+ });
133
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Tool } from '@curie-agent/core';
2
+ import { SubagentExecutor } from '@curie-agent/core';
3
+ import type { ProviderStream } from '@curie-agent/core';
4
+ import type { CurieSettings } from '@curie-agent/core';
5
+ export interface SpawnAgentToolConfig {
6
+ subagentExecutor: SubagentExecutor;
7
+ provider: ProviderStream;
8
+ cwd: string;
9
+ settings: CurieSettings;
10
+ model: string;
11
+ }
12
+ export declare function createSpawnAgentTool(config: SpawnAgentToolConfig): Tool;
13
+ //# sourceMappingURL=spawn-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn-agent.d.ts","sourceRoot":"","sources":["../../src/spawn-agent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,QAAQ,EAAE,cAAc,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CA2FvE"}
@@ -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='agent').
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"}
@@ -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='agent').
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: 'agent',
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,OAAO;QACb,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 'human').
5
+ */
6
+ export declare const todoTool: import("./tool.js").Tool & {
7
+ validate: (raw: Record<string, unknown>) => {
8
+ action: "list" | "add" | "edit" | "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"}