@curie-agent/core 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 (111) hide show
  1. package/LICENSE +179 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/channel-router.js +1 -1
  4. package/dist/src/channel-router.js.map +1 -1
  5. package/dist/src/context.d.ts +11 -0
  6. package/dist/src/context.d.ts.map +1 -0
  7. package/dist/src/context.js +80 -0
  8. package/dist/src/context.js.map +1 -0
  9. package/dist/src/cron-manager.d.ts +27 -8
  10. package/dist/src/cron-manager.d.ts.map +1 -1
  11. package/dist/src/cron-manager.js +121 -33
  12. package/dist/src/cron-manager.js.map +1 -1
  13. package/dist/src/event-bus.d.ts +71 -0
  14. package/dist/src/event-bus.d.ts.map +1 -1
  15. package/dist/src/event-bus.js.map +1 -1
  16. package/dist/src/heartbeat-delivery.d.ts +2 -0
  17. package/dist/src/heartbeat-delivery.d.ts.map +1 -1
  18. package/dist/src/heartbeat-delivery.js +20 -3
  19. package/dist/src/heartbeat-delivery.js.map +1 -1
  20. package/dist/src/heartbeat-executor.d.ts +36 -2
  21. package/dist/src/heartbeat-executor.d.ts.map +1 -1
  22. package/dist/src/heartbeat-executor.js +32 -40
  23. package/dist/src/heartbeat-executor.js.map +1 -1
  24. package/dist/src/identity-files.d.ts +29 -0
  25. package/dist/src/identity-files.d.ts.map +1 -0
  26. package/dist/src/identity-files.js +59 -0
  27. package/dist/src/identity-files.js.map +1 -0
  28. package/dist/src/index.d.ts +19 -4
  29. package/dist/src/index.d.ts.map +1 -1
  30. package/dist/src/index.js +13 -2
  31. package/dist/src/index.js.map +1 -1
  32. package/dist/src/pricing.d.ts +29 -0
  33. package/dist/src/pricing.d.ts.map +1 -0
  34. package/dist/src/pricing.js +85 -0
  35. package/dist/src/pricing.js.map +1 -0
  36. package/dist/src/safety/command-guard.d.ts.map +1 -1
  37. package/dist/src/safety/command-guard.js +35 -1
  38. package/dist/src/safety/command-guard.js.map +1 -1
  39. package/dist/src/safety/path-guard.d.ts +7 -3
  40. package/dist/src/safety/path-guard.d.ts.map +1 -1
  41. package/dist/src/safety/path-guard.js +14 -5
  42. package/dist/src/safety/path-guard.js.map +1 -1
  43. package/dist/src/safety/snapshot.js +1 -1
  44. package/dist/src/safety/snapshot.js.map +1 -1
  45. package/dist/src/session-store.d.ts +3 -1
  46. package/dist/src/session-store.d.ts.map +1 -1
  47. package/dist/src/session-store.js +24 -1
  48. package/dist/src/session-store.js.map +1 -1
  49. package/dist/src/settings.d.ts +98 -1
  50. package/dist/src/settings.d.ts.map +1 -1
  51. package/dist/src/settings.js +363 -83
  52. package/dist/src/settings.js.map +1 -1
  53. package/dist/src/shell-detect.d.ts +12 -0
  54. package/dist/src/shell-detect.d.ts.map +1 -0
  55. package/dist/src/shell-detect.js +31 -0
  56. package/dist/src/shell-detect.js.map +1 -0
  57. package/dist/src/subagent-executor.d.ts +68 -0
  58. package/dist/src/subagent-executor.d.ts.map +1 -0
  59. package/dist/src/subagent-executor.js +289 -0
  60. package/dist/src/subagent-executor.js.map +1 -0
  61. package/dist/src/task-executor.d.ts +31 -0
  62. package/dist/src/task-executor.d.ts.map +1 -0
  63. package/dist/src/task-executor.js +91 -0
  64. package/dist/src/task-executor.js.map +1 -0
  65. package/dist/src/task-manager.d.ts +83 -0
  66. package/dist/src/task-manager.d.ts.map +1 -0
  67. package/dist/src/task-manager.js +308 -0
  68. package/dist/src/task-manager.js.map +1 -0
  69. package/dist/src/task-migration.d.ts +10 -0
  70. package/dist/src/task-migration.d.ts.map +1 -0
  71. package/dist/src/task-migration.js +144 -0
  72. package/dist/src/task-migration.js.map +1 -0
  73. package/dist/src/task-summary.d.ts +7 -0
  74. package/dist/src/task-summary.d.ts.map +1 -0
  75. package/dist/src/task-summary.js +34 -0
  76. package/dist/src/task-summary.js.map +1 -0
  77. package/dist/src/template-utils.d.ts +16 -0
  78. package/dist/src/template-utils.d.ts.map +1 -0
  79. package/dist/src/template-utils.js +72 -0
  80. package/dist/src/template-utils.js.map +1 -0
  81. package/dist/src/token-monitor.d.ts +50 -0
  82. package/dist/src/token-monitor.d.ts.map +1 -0
  83. package/dist/src/token-monitor.js +119 -0
  84. package/dist/src/token-monitor.js.map +1 -0
  85. package/dist/src/turn-loop.d.ts +10 -1
  86. package/dist/src/turn-loop.d.ts.map +1 -1
  87. package/dist/src/turn-loop.js +152 -23
  88. package/dist/src/turn-loop.js.map +1 -1
  89. package/dist/src/unified-task.d.ts +76 -0
  90. package/dist/src/unified-task.d.ts.map +1 -0
  91. package/dist/src/unified-task.js +196 -0
  92. package/dist/src/unified-task.js.map +1 -0
  93. package/package.json +16 -11
  94. package/templates/AGENTS.md +53 -0
  95. package/templates/HEARTBEAT.md +37 -0
  96. package/templates/MEMORY.md +29 -0
  97. package/templates/SOUL.md +28 -0
  98. package/templates/TOOLS.md +29 -0
  99. package/templates/USER.md +35 -0
  100. package/templates/WIKI.md +146 -0
  101. package/templates/settings.json +90 -0
  102. package/templates/skills/deep-research/SKILL.md +273 -0
  103. package/templates/skills/deep-research/references/report-structure.md +149 -0
  104. package/templates/skills/deep-research/references/topic-guides.md +151 -0
  105. package/templates/skills/planning/SKILL.md +222 -0
  106. package/templates/skills/planning/references/business.md +82 -0
  107. package/templates/skills/planning/references/creative.md +111 -0
  108. package/templates/skills/planning/references/events.md +109 -0
  109. package/templates/skills/planning/references/personal.md +107 -0
  110. package/templates/skills/planning/references/templates.md +279 -0
  111. package/templates/skills/wiki/SKILL.md +70 -0
@@ -0,0 +1,68 @@
1
+ import { type ReasoningEffort, type ProviderStream, type Tool } from './turn-loop.js';
2
+ import { EventBus } from './event-bus.js';
3
+ import { SessionStore } from './session-store.js';
4
+ import type { ApprovalMode } from './permission.js';
5
+ import type { CurieSettings } from './settings.js';
6
+ export interface SubagentConfig {
7
+ provider: ProviderStream;
8
+ model: string;
9
+ tools: Tool[];
10
+ cwd: string;
11
+ settings: CurieSettings;
12
+ prompt: string;
13
+ system?: string;
14
+ providerName?: string;
15
+ mode?: ApprovalMode;
16
+ effort?: ReasoningEffort;
17
+ maxTurns?: number;
18
+ /** Tool names to allow (subset of parent's tools). Undefined = all tools. */
19
+ allowedTools?: string[];
20
+ /** Additional context to inject into the subagent's system prompt */
21
+ context?: string;
22
+ /** Session type / entrypoint (e.g. 'subagent') */
23
+ type?: string;
24
+ /** Extra data attached to this agent — stored in handle and emitted with lifecycle events */
25
+ metadata?: Record<string, unknown>;
26
+ }
27
+ export interface SubagentHandle {
28
+ agentId: string;
29
+ sessionId: string;
30
+ prompt: string;
31
+ provider: string;
32
+ status: 'starting' | 'running' | 'waiting_tool' | 'done' | 'error' | 'cancelled';
33
+ text: string;
34
+ toolCalls: number;
35
+ errors: string[];
36
+ inputTokens: number;
37
+ outputTokens: number;
38
+ startedAt: number;
39
+ doneAt?: number;
40
+ /** Link back to a scheduled task (auto-mode tasks only). */
41
+ taskId?: string;
42
+ /** Type of spawn: 'subagent' (manual) or 'auto' (scheduled task). */
43
+ taskType?: string;
44
+ /** Extra data — passed through from spawn config. */
45
+ metadata?: Record<string, unknown>;
46
+ }
47
+ export declare class SubagentExecutor {
48
+ private eventBus;
49
+ private sessionStore;
50
+ private maxConcurrentOption?;
51
+ private agents;
52
+ private running;
53
+ private maxConcurrent;
54
+ constructor(eventBus: EventBus, sessionStore: SessionStore, maxConcurrentOption?: number | undefined);
55
+ spawn(config: SubagentConfig): Promise<SubagentHandle>;
56
+ private runSubagent;
57
+ cancel(agentId: string): boolean;
58
+ list(statusFilter?: string): SubagentHandle[];
59
+ stats(agentId: string): SubagentHandle | undefined;
60
+ /**
61
+ * Send a message to a running subagent.
62
+ * Appends the message as a user prompt to the subagent's session.
63
+ */
64
+ sendMessage(agentId: string, message: string): boolean;
65
+ shutdown(): void;
66
+ private getRunningCount;
67
+ }
68
+ //# sourceMappingURL=subagent-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-executor.d.ts","sourceRoot":"","sources":["../../src/subagent-executor.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAChG,OAAO,EAAE,QAAQ,EAAc,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAoB,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,qBAAa,gBAAgB;IAMzB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,mBAAmB,CAAC;IAP9B,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,aAAa,CAAS;gBAGpB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,mBAAmB,CAAC,EAAE,MAAM,YAAA;IAKhC,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;YAqE9C,WAAW;IAmHzB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IA+BhC,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE;IAM7C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIlD;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAgBtD,QAAQ,IAAI,IAAI;IAQhB,OAAO,CAAC,eAAe;CAGxB"}
@@ -0,0 +1,289 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { TurnLoop } from './turn-loop.js';
3
+ export class SubagentExecutor {
4
+ eventBus;
5
+ sessionStore;
6
+ maxConcurrentOption;
7
+ agents = new Map();
8
+ running = new Map();
9
+ maxConcurrent;
10
+ constructor(eventBus, sessionStore, maxConcurrentOption) {
11
+ this.eventBus = eventBus;
12
+ this.sessionStore = sessionStore;
13
+ this.maxConcurrentOption = maxConcurrentOption;
14
+ this.maxConcurrent = maxConcurrentOption ?? 5;
15
+ }
16
+ async spawn(config) {
17
+ // Enforce concurrency limit
18
+ const runningCount = this.getRunningCount();
19
+ if (runningCount >= this.maxConcurrent) {
20
+ throw new Error(`Concurrency limit reached (${this.maxConcurrent} concurrent subagents). Cancel one first.`);
21
+ }
22
+ const agentId = randomUUID();
23
+ const status = 'starting';
24
+ const handle = {
25
+ agentId,
26
+ sessionId: '',
27
+ prompt: config.prompt,
28
+ provider: config.providerName || config.provider.name,
29
+ status,
30
+ text: '',
31
+ toolCalls: 0,
32
+ errors: [],
33
+ inputTokens: 0,
34
+ outputTokens: 0,
35
+ startedAt: Date.now(),
36
+ taskId: config.metadata?.taskId,
37
+ taskType: config.metadata?.taskType,
38
+ metadata: config.metadata,
39
+ };
40
+ this.agents.set(agentId, handle);
41
+ // Emit agent-start event
42
+ this.eventBus.emit({
43
+ type: 'agent-start',
44
+ id: randomUUID(),
45
+ agentId,
46
+ sessionId: '',
47
+ prompt: config.prompt,
48
+ timestamp: Date.now(),
49
+ });
50
+ // Filter tools if allowedTools is specified
51
+ const tools = config.allowedTools
52
+ ? config.tools.filter((t) => config.allowedTools.includes(t.definition.name))
53
+ : config.tools;
54
+ // Create session for this subagent
55
+ const subSession = this.sessionStore.create(config.cwd, config.model, config.provider.name, config.type || 'subagent');
56
+ handle.sessionId = subSession.id;
57
+ // Update status to running
58
+ handle.status = 'running';
59
+ const promise = this.runSubagent({
60
+ ...config,
61
+ tools,
62
+ sessionId: subSession.id,
63
+ }).finally(() => {
64
+ this.running.delete(agentId);
65
+ });
66
+ this.running.set(agentId, promise);
67
+ return handle;
68
+ }
69
+ async runSubagent(config) {
70
+ const { agentId } = findHandle(this.agents, config.sessionId) ?? { agentId: '' };
71
+ const turnLoop = new TurnLoop({
72
+ provider: config.provider,
73
+ model: config.model,
74
+ tools: config.tools,
75
+ cwd: config.cwd,
76
+ settings: config.settings,
77
+ approvalMode: config.mode || config.settings.mode || 'auto',
78
+ effort: config.effort,
79
+ maxTurns: config.maxTurns ?? 50,
80
+ system: config.system,
81
+ sessionId: config.sessionId,
82
+ type: config.type || 'subagent',
83
+ }, this.sessionStore);
84
+ // Use config.system directly as the subagent's system prompt
85
+ const runPromise = config.system
86
+ ? createAndRunTurnLoop(turnLoop, config.prompt, config.system)
87
+ : turnLoop.run(config.prompt);
88
+ // Bridge subagent events to shared daemon EventBus
89
+ const eventTypes = [
90
+ 'assistant-delta', 'thinking-delta', 'assistant-stop',
91
+ 'tool-call', 'tool-result', 'usage', 'error',
92
+ 'session-start', 'session-stop',
93
+ ];
94
+ const unsubs = [];
95
+ let collectedText = '';
96
+ let toolCallCount = 0;
97
+ let inputTokens = 0;
98
+ let outputTokens = 0;
99
+ let errors = [];
100
+ for (const type of eventTypes) {
101
+ unsubs.push(turnLoop.eventBus.subscribe(type, (event) => {
102
+ const agentEvent = mapToAgentEvent(event, config.sessionId);
103
+ if (agentEvent) {
104
+ this.eventBus.emit(agentEvent);
105
+ }
106
+ // Collect data for handle
107
+ if (type === 'assistant-delta') {
108
+ collectedText += event.text;
109
+ }
110
+ else if (type === 'tool-call') {
111
+ toolCallCount++;
112
+ }
113
+ else if (type === 'usage') {
114
+ const u = event;
115
+ inputTokens += u.inputTokens;
116
+ outputTokens += u.outputTokens;
117
+ }
118
+ else if (type === 'error') {
119
+ errors.push(event.message);
120
+ }
121
+ }));
122
+ }
123
+ try {
124
+ const result = await runPromise;
125
+ // Update handle with collected data
126
+ const handle = this.agents.get(agentId);
127
+ if (handle) {
128
+ handle.text = collectedText;
129
+ handle.toolCalls = toolCallCount;
130
+ handle.inputTokens = inputTokens;
131
+ handle.outputTokens = outputTokens;
132
+ handle.errors = errors;
133
+ handle.doneAt = Date.now();
134
+ handle.status = result.reason === 'stop' ? 'done' : result.reason === 'cancelled' ? 'cancelled' : 'error';
135
+ }
136
+ // Emit agent-done event
137
+ this.eventBus.emit({
138
+ type: 'agent-done',
139
+ id: randomUUID(),
140
+ agentId,
141
+ sessionId: result.sessionId,
142
+ text: collectedText.slice(0, 2000),
143
+ toolCalls: toolCallCount,
144
+ errors,
145
+ durationMs: handle?.doneAt ? handle.doneAt - (handle?.startedAt || handle?.doneAt) : 0,
146
+ timestamp: Date.now(),
147
+ metadata: config.metadata,
148
+ });
149
+ }
150
+ catch (err) {
151
+ const msg = err instanceof Error ? err.message : String(err);
152
+ const handle = this.agents.get(agentId);
153
+ if (handle) {
154
+ handle.text = collectedText;
155
+ handle.toolCalls = toolCallCount;
156
+ handle.errors = [...errors, msg];
157
+ handle.status = 'error';
158
+ handle.doneAt = Date.now();
159
+ }
160
+ // Emit agent-error event
161
+ this.eventBus.emit({
162
+ type: 'agent-error',
163
+ id: randomUUID(),
164
+ agentId,
165
+ sessionId: config.sessionId,
166
+ message: msg,
167
+ timestamp: Date.now(),
168
+ metadata: config.metadata,
169
+ });
170
+ }
171
+ finally {
172
+ unsubs.forEach((u) => u());
173
+ }
174
+ }
175
+ cancel(agentId) {
176
+ const handle = this.agents.get(agentId);
177
+ if (!handle)
178
+ return false;
179
+ if (handle.status === 'done' || handle.status === 'error' || handle.status === 'cancelled') {
180
+ return false; // Already finished
181
+ }
182
+ handle.status = 'cancelled';
183
+ handle.doneAt = Date.now();
184
+ // Cancel the TurnLoop if running
185
+ const promise = this.running.get(agentId);
186
+ if (promise) {
187
+ // We need to find and cancel the TurnLoop — stored in the running promise
188
+ // For now, emit cancellation event
189
+ }
190
+ this.eventBus.emit({
191
+ type: 'agent-error',
192
+ id: randomUUID(),
193
+ agentId,
194
+ sessionId: handle.sessionId,
195
+ message: 'Cancelled by user',
196
+ code: 'cancelled',
197
+ timestamp: Date.now(),
198
+ });
199
+ return true;
200
+ }
201
+ list(statusFilter) {
202
+ const all = Array.from(this.agents.values());
203
+ if (!statusFilter)
204
+ return all;
205
+ return all.filter((a) => a.status === statusFilter);
206
+ }
207
+ stats(agentId) {
208
+ return this.agents.get(agentId);
209
+ }
210
+ /**
211
+ * Send a message to a running subagent.
212
+ * Appends the message as a user prompt to the subagent's session.
213
+ */
214
+ sendMessage(agentId, message) {
215
+ const handle = this.agents.get(agentId);
216
+ if (!handle || handle.status !== 'running')
217
+ return false;
218
+ // Append as user event to the subagent's session
219
+ this.sessionStore.appendEvent(handle.sessionId, {
220
+ type: 'user-prompt',
221
+ id: randomUUID(),
222
+ text: message,
223
+ cwd: '',
224
+ timestamp: Date.now(),
225
+ });
226
+ return true;
227
+ }
228
+ shutdown() {
229
+ for (const agentId of this.agents.keys()) {
230
+ this.cancel(agentId);
231
+ }
232
+ this.agents.clear();
233
+ this.running.clear();
234
+ }
235
+ getRunningCount() {
236
+ return [...this.agents.values()].filter((a) => a.status === 'running' || a.status === 'starting').length;
237
+ }
238
+ }
239
+ function findHandle(agents, sessionId) {
240
+ for (const handle of agents.values()) {
241
+ if (handle.sessionId === sessionId)
242
+ return handle;
243
+ }
244
+ return undefined;
245
+ }
246
+ async function createAndRunTurnLoop(turnLoop, prompt, system) {
247
+ // We need to temporarily set the system on the TurnLoop config
248
+ // Since TurnLoop doesn't expose a setSystem method, we create a new one
249
+ // Actually, the TurnLoop reads config.system directly in its run() method.
250
+ // We can't mutate it after construction, so we need a different approach.
251
+ // The TurnLoop reads this.config.system in run() at line 334:
252
+ // system: withDateContext(self.config.system)
253
+ // We need to mutate it. Since config is private, we use a workaround:
254
+ // Cast to access the private config.
255
+ const tl = turnLoop;
256
+ tl.config.system = system;
257
+ return turnLoop.run(prompt);
258
+ }
259
+ function mapToAgentEvent(event, sessionId) {
260
+ switch (event.type) {
261
+ case 'assistant-delta': {
262
+ const e = event;
263
+ return { ...e, type: 'agent-text-delta' };
264
+ }
265
+ case 'thinking-delta': {
266
+ const e = event;
267
+ return { ...e, type: 'agent-thinking-delta' };
268
+ }
269
+ case 'tool-call': {
270
+ const e = event;
271
+ return { ...e, type: 'agent-tool-call' };
272
+ }
273
+ case 'tool-result': {
274
+ const e = event;
275
+ return { ...e, type: 'agent-tool-result' };
276
+ }
277
+ case 'usage': {
278
+ const e = event;
279
+ return { ...e, type: 'agent-usage' };
280
+ }
281
+ case 'error': {
282
+ const e = event;
283
+ return { ...e, type: 'agent-error' };
284
+ }
285
+ default:
286
+ return null;
287
+ }
288
+ }
289
+ //# sourceMappingURL=subagent-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-executor.js","sourceRoot":"","sources":["../../src/subagent-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAwD,MAAM,gBAAgB,CAAC;AAiDhG,MAAM,OAAO,gBAAgB;IAMjB;IACA;IACA;IAPF,MAAM,GAAgC,IAAI,GAAG,EAAE,CAAC;IAChD,OAAO,GAA+B,IAAI,GAAG,EAAE,CAAC;IAChD,aAAa,CAAS;IAE9B,YACU,QAAkB,EAClB,YAA0B,EAC1B,mBAA4B;QAF5B,aAAQ,GAAR,QAAQ,CAAU;QAClB,iBAAY,GAAZ,YAAY,CAAc;QAC1B,wBAAmB,GAAnB,mBAAmB,CAAS;QAEpC,IAAI,CAAC,aAAa,GAAG,mBAAmB,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAsB;QAChC,4BAA4B;QAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,IAAI,YAAY,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CACb,8BAA8B,IAAI,CAAC,aAAa,2CAA2C,CAC5F,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,MAAM,MAAM,GAA6B,UAAU,CAAC;QAEpD,MAAM,MAAM,GAAmB;YAC7B,OAAO;YACP,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI;YACrD,MAAM;YACN,IAAI,EAAE,EAAE;YACR,SAAS,EAAE,CAAC;YACZ,MAAM,EAAE,EAAE;YACV,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM,EAAG,MAAM,CAAC,QAAgD,EAAE,MAA4B;YAC9F,QAAQ,EAAG,MAAM,CAAC,QAAgD,EAAE,QAA8B;YAClG,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEjC,yBAAyB;QACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,aAAa;YACnB,EAAE,EAAE,UAAU,EAAE;YAChB,OAAO;YACP,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACF,CAAC,CAAC;QAEvB,4CAA4C;QAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY;YAC/B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,YAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC9E,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAEjB,mCAAmC;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CACzC,MAAM,CAAC,GAAG,EACV,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,QAAQ,CAAC,IAAI,EACpB,MAAM,CAAC,IAAI,IAAI,UAAU,CAC1B,CAAC;QACF,MAAM,CAAC,SAAS,GAAG,UAAU,CAAC,EAAE,CAAC;QAEjC,2BAA2B;QAC3B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;QAE1B,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;YAC/B,GAAG,MAAM;YACT,KAAK;YACL,SAAS,EAAE,UAAU,CAAC,EAAE;SACzB,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,MAA8C;QACtE,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAEjF,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC;YAC5B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,YAAY,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,MAAM;YAC3D,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;YAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,UAAU;SAChC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAEtB,6DAA6D;QAC7D,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM;YAC9B,CAAC,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;YAC9D,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEhC,mDAAmD;QACnD,MAAM,UAAU,GAAoB;YAClC,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB;YACrD,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO;YAC5C,eAAe,EAAE,cAAc;SAChC,CAAC;QAEF,MAAM,MAAM,GAAsB,EAAE,CAAC;QACrC,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,MAAM,GAAa,EAAE,CAAC;QAE1B,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CACT,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,KAAY,EAAE,EAAE;gBACjD,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC5D,IAAI,UAAU,EAAE,CAAC;oBACf,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACjC,CAAC;gBAED,0BAA0B;gBAC1B,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;oBAC/B,aAAa,IAAK,KAA0B,CAAC,IAAI,CAAC;gBACpD,CAAC;qBAAM,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;oBAChC,aAAa,EAAE,CAAC;gBAClB,CAAC;qBAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC5B,MAAM,CAAC,GAAG,KAAsD,CAAC;oBACjE,WAAW,IAAI,CAAC,CAAC,WAAW,CAAC;oBAC7B,YAAY,IAAI,CAAC,CAAC,YAAY,CAAC;gBACjC,CAAC;qBAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC5B,MAAM,CAAC,IAAI,CAAE,KAA6B,CAAC,OAAO,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;YAEhC,oCAAoC;YACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,GAAG,aAAa,CAAC;gBAC5B,MAAM,CAAC,SAAS,GAAG,aAAa,CAAC;gBACjC,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;gBACjC,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;gBACnC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;gBACvB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC3B,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5G,CAAC;YAED,wBAAwB;YACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,YAAY;gBAClB,EAAE,EAAE,UAAU,EAAE;gBAChB,OAAO;gBACP,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;gBAClC,SAAS,EAAE,aAAa;gBACxB,MAAM;gBACN,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,SAAS,IAAI,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtF,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aACN,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAE7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,GAAG,aAAa,CAAC;gBAC5B,MAAM,CAAC,SAAS,GAAG,aAAa,CAAC;gBACjC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC;gBACjC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC;gBACxB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,CAAC;YAED,yBAAyB;YACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,aAAa;gBACnB,EAAE,EAAE,UAAU,EAAE;gBAChB,OAAO;gBACP,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,OAAO,EAAE,GAAG;gBACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aACN,CAAC,CAAC;QACzB,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,MAAM,CAAC,OAAe;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAE1B,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAC3F,OAAO,KAAK,CAAC,CAAC,mBAAmB;QACnC,CAAC;QAED,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC;QAC5B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE3B,iCAAiC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,OAAO,EAAE,CAAC;YACZ,0EAA0E;YAC1E,mCAAmC;QACrC,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,aAAa;YACnB,EAAE,EAAE,UAAU,EAAE;YAChB,OAAO;YACP,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,OAAO,EAAE,mBAAmB;YAC5B,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACF,CAAC,CAAC;QAEvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,YAAqB;QACxB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,YAAY;YAAE,OAAO,GAAG,CAAC;QAC9B,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,OAAe,EAAE,OAAe;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAEzD,iDAAiD;QACjD,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE;YAC9C,IAAI,EAAE,aAAa;YACnB,EAAE,EAAE,UAAU,EAAE;YAChB,IAAI,EAAE,OAAO;YACb,GAAG,EAAE,EAAE;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACF,CAAC,CAAC;QAEvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ;QACN,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAEO,eAAe;QACrB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;IAC3H,CAAC;CACF;AAED,SAAS,UAAU,CAAC,MAAmC,EAAE,SAAiB;IACxE,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACrC,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;IACpD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,QAAkB,EAAE,MAAc,EAAE,MAAc;IACpF,+DAA+D;IAC/D,wEAAwE;IACxE,2EAA2E;IAC3E,0EAA0E;IAE1E,8DAA8D;IAC9D,gDAAgD;IAChD,sEAAsE;IACtE,qCAAqC;IACrC,MAAM,EAAE,GAAG,QAAsD,CAAC;IAClE,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IAC1B,OAAO,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,eAAe,CAAC,KAAY,EAAE,SAAiB;IACtD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,CAAC,GAAG,KAAyB,CAAC;YACpC,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAsB,CAAC;QAChE,CAAC;QACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,GAAG,KAAyB,CAAC;YACpC,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAsB,CAAC;QACpE,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,CAAC,GAAG,KAA6E,CAAC;YACxF,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAsB,CAAC;QAC/D,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,CAAC,GAAG,KAAgE,CAAC;YAC3E,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAsB,CAAC;QACjE,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,CAAC,GAAG,KAAsD,CAAC;YACjE,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,aAAa,EAAsB,CAAC;QAC3D,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,CAAC,GAAG,KAA2C,CAAC;YACtD,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,aAAa,EAAsB,CAAC;QAC3D,CAAC;QACD;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { Tool, ReasoningEffort, ProviderStream } from './turn-loop.js';
2
+ import type { CurieSettings } from './settings.js';
3
+ export interface TaskExecutorConfig {
4
+ provider: ProviderStream;
5
+ model: string;
6
+ tools: Tool[];
7
+ cwd: string;
8
+ settings: CurieSettings;
9
+ effort?: ReasoningEffort;
10
+ /** Max turns for the tool-use loop (default 50). */
11
+ maxTurns?: number;
12
+ /** The task instruction/prompt. */
13
+ instruction: string;
14
+ /** System prompt for the task turn loop. */
15
+ system?: string;
16
+ }
17
+ export interface TaskResult {
18
+ sessionId: string;
19
+ text: string;
20
+ toolCalls: number;
21
+ errors: string[];
22
+ }
23
+ export declare class TaskExecutor {
24
+ private config;
25
+ private curieDir;
26
+ constructor(config: TaskExecutorConfig);
27
+ execute(): Promise<TaskResult>;
28
+ private gatherContext;
29
+ private buildPrompt;
30
+ }
31
+ //# sourceMappingURL=task-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-executor.d.ts","sourceRoot":"","sources":["../../src/task-executor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,YAAY;IAGX,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,QAAQ,CAAS;gBAEL,MAAM,EAAE,kBAAkB;IAIxC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;IAuBpC,OAAO,CAAC,aAAa;IA2CrB,OAAO,CAAC,WAAW;CAmBpB"}
@@ -0,0 +1,91 @@
1
+ import { homedir } from 'node:os';
2
+ import { join } from 'node:path';
3
+ import { readFileSync, existsSync } from 'node:fs';
4
+ import { BatchTurnLoop } from './heartbeat-executor.js';
5
+ import { readTaskSummary } from './task-summary.js';
6
+ export class TaskExecutor {
7
+ config;
8
+ curieDir;
9
+ constructor(config) {
10
+ this.config = config;
11
+ this.curieDir = join(homedir(), '.curie-agent');
12
+ }
13
+ async execute() {
14
+ const context = this.gatherContext();
15
+ const prompt = this.buildPrompt(this.config.instruction, context);
16
+ const batchResult = await new BatchTurnLoop({
17
+ provider: this.config.provider,
18
+ model: this.config.model,
19
+ tools: this.config.tools,
20
+ cwd: this.config.cwd,
21
+ settings: this.config.settings,
22
+ effort: this.config.effort,
23
+ maxTurns: this.config.maxTurns ?? 50,
24
+ system: this.config.system || `You are executing a scheduled task. Complete the task instruction using available tools. Deliver the results to the user.`,
25
+ }).run(prompt);
26
+ return {
27
+ sessionId: batchResult.sessionId,
28
+ text: batchResult.text,
29
+ toolCalls: batchResult.toolCalls,
30
+ errors: batchResult.errors,
31
+ };
32
+ }
33
+ gatherContext() {
34
+ const sections = [];
35
+ const readIf = (name, dir) => {
36
+ const path = join(dir, name);
37
+ if (existsSync(path)) {
38
+ sections.push(`=== ${name} ===\n` + readFileSync(path, 'utf-8'));
39
+ }
40
+ };
41
+ readIf('MEMORY.md', this.curieDir);
42
+ readIf('USER.md', this.curieDir);
43
+ readIf('AGENTS.md', this.curieDir);
44
+ // Read project tasks/todo file (if exists) and format as task list summary
45
+ const projectTaskPath = join(this.config.cwd, 'tasks.json');
46
+ if (!existsSync(projectTaskPath)) {
47
+ const projectLegacyPath = join(this.config.cwd, 'todo.json');
48
+ if (existsSync(projectLegacyPath)) {
49
+ sections.push(`=== Project Tasks ===\n` + readTaskSummary(projectLegacyPath));
50
+ }
51
+ }
52
+ else {
53
+ sections.push(`=== Project Tasks ===\n` + readTaskSummary(projectTaskPath));
54
+ }
55
+ // Read personal tasks/todo file from ~/.curie-agent/
56
+ const personalTaskPath = join(this.curieDir, 'tasks.json');
57
+ if (!existsSync(personalTaskPath)) {
58
+ const personalLegacyPath = join(this.curieDir, 'todo.json');
59
+ if (existsSync(personalLegacyPath)) {
60
+ sections.push(`=== Personal Tasks ===\n` + readTaskSummary(personalLegacyPath));
61
+ }
62
+ }
63
+ else {
64
+ sections.push(`=== Personal Tasks ===\n` + readTaskSummary(personalTaskPath));
65
+ }
66
+ const memoryDir = join(this.curieDir, 'memory');
67
+ if (existsSync(memoryDir)) {
68
+ sections.push(`=== Memory Directory ===\nDirectory: ${memoryDir}`);
69
+ }
70
+ return sections.join('\n\n');
71
+ }
72
+ buildPrompt(instruction, context) {
73
+ const now = new Date().toLocaleString('en-US', {
74
+ weekday: 'long', year: 'numeric', month: 'long', day: 'numeric',
75
+ hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false,
76
+ });
77
+ return [
78
+ '=== TASK INSTRUCTION ===',
79
+ instruction,
80
+ '',
81
+ '=== GATHERED CONTEXT ===',
82
+ context || '(no context files found)',
83
+ '',
84
+ '=== CURRENT TIME ===',
85
+ now,
86
+ '',
87
+ 'Execute the task instruction above. Use available tools to gather data, browse websites, read files, and produce results. Deliver a clear summary of what you accomplished.',
88
+ ].join('\n');
89
+ }
90
+ }
91
+ //# sourceMappingURL=task-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-executor.js","sourceRoot":"","sources":["../../src/task-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Unified task manager — replaces CronManager as the primary task store.
3
+ * Manages tasks across both personal (~/.curie-agent/tasks.json) and project (<cwd>/tasks.json) scopes.
4
+ */
5
+ import type { ScheduleType, TaskMode, TaskPriority, TaskScope, TaskStatus, UnifiedTask, TasksFile } from './unified-task.js';
6
+ export declare class TaskManager {
7
+ private data;
8
+ /** TTL for pruning completed tasks. */
9
+ private ttlMs;
10
+ /** File path for persistence. */
11
+ private filePath;
12
+ /** Set of task IDs currently being executed (prevents re-firing). */
13
+ private executing;
14
+ constructor(optTtlOrPath?: number | string, optFilePath?: string);
15
+ /** Reload the file from disk. */
16
+ load(): TasksFile;
17
+ /** Persist to disk. */
18
+ save(): void;
19
+ /** Create a new task with the given mode and scope. */
20
+ create(options: {
21
+ title: string;
22
+ description?: string;
23
+ mode: TaskMode;
24
+ scope: TaskScope;
25
+ priority?: TaskPriority;
26
+ tags?: string[];
27
+ scheduled_at?: number;
28
+ frequency?: {
29
+ type: ScheduleType;
30
+ value: string;
31
+ } | null;
32
+ metadata?: Record<string, unknown>;
33
+ }): UnifiedTask;
34
+ /** Update a task's status and set completed_at if terminal. */
35
+ updateTaskStatus(id: string, status: TaskStatus): boolean;
36
+ /** Advance through the manual task lifecycle (todo → in_progress → done). */
37
+ setTaskStatus(id: string, status: 'todo' | 'in_progress'): boolean;
38
+ /** Find a single task by ID. */
39
+ findTask(id: string): UnifiedTask | undefined;
40
+ /** List tasks with optional filters. */
41
+ list(options?: {
42
+ status?: TaskStatus;
43
+ mode?: TaskMode;
44
+ scope?: TaskScope;
45
+ priority?: TaskPriority;
46
+ }): UnifiedTask[];
47
+ /** Get pending scheduled tasks that are due (mode=auto or notify with scheduled_at <= now). */
48
+ getNextTasks(now?: number): UnifiedTask[];
49
+ /** Mark a task as currently executing. */
50
+ markExecuting(id: string): boolean;
51
+ /** Clear executing flag for a task. */
52
+ clearExecuting(id: string): void;
53
+ /** Cancel (soft-delete) a pending/fired task. */
54
+ cancelTask(id: string): boolean;
55
+ /** Remove completed/fired/failed tasks (hard-delete). */
56
+ clearCompleted(): number;
57
+ /** Remove a task permanently. */
58
+ removeTask(id: string): boolean;
59
+ /** Renormalize the `order` field for all tasks in scope. */
60
+ private renormalizeOrders;
61
+ /** Remove completed tasks older than the cutoff. Pending/pending-like tasks always kept. */
62
+ pruneOld(cutoff: number): number;
63
+ /** Count of pending tasks. */
64
+ get pendingCount(): number;
65
+ /** Check if a task is a recurring heartbeat (auto mode with frequency). */
66
+ isHeartbeat(task: UnifiedTask): boolean;
67
+ /** Get all pending heartbeat tasks. */
68
+ getHeartbeats(): UnifiedTask[];
69
+ /**
70
+ * Evaluate all five heartbeat schedule settings and ensure exactly one
71
+ * pending auto+frequency task exists in the store. Called after settings change.
72
+ */
73
+ rescheduleFromSettings(settings: {
74
+ HEARTBEAT_INTRADAY?: string;
75
+ HEARTBEAT_DAILY?: string;
76
+ HEARTBEAT_WEEKLY?: string;
77
+ HEARTBEAT_MONTHLY?: string;
78
+ HEARTBEAT_DREAMING?: string;
79
+ }, now?: number): void;
80
+ /** Cancel all pending heartbeat tasks. Returns count cancelled. */
81
+ cancelAllHeartbeats(): number;
82
+ }
83
+ //# sourceMappingURL=task-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-manager.d.ts","sourceRoot":"","sources":["../../src/task-manager.ts"],"names":[],"mappings":"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"}