@curie-agent/core 0.1.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 (54) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/src/channel-registry.d.ts +26 -0
  3. package/dist/src/channel-registry.d.ts.map +1 -0
  4. package/dist/src/channel-registry.js +100 -0
  5. package/dist/src/channel-registry.js.map +1 -0
  6. package/dist/src/channel-router.d.ts +28 -0
  7. package/dist/src/channel-router.d.ts.map +1 -0
  8. package/dist/src/channel-router.js +52 -0
  9. package/dist/src/channel-router.js.map +1 -0
  10. package/dist/src/cron-manager.d.ts +73 -0
  11. package/dist/src/cron-manager.d.ts.map +1 -0
  12. package/dist/src/cron-manager.js +322 -0
  13. package/dist/src/cron-manager.js.map +1 -0
  14. package/dist/src/event-bus.d.ts +105 -0
  15. package/dist/src/event-bus.d.ts.map +1 -0
  16. package/dist/src/event-bus.js +56 -0
  17. package/dist/src/event-bus.js.map +1 -0
  18. package/dist/src/heartbeat-delivery.d.ts +27 -0
  19. package/dist/src/heartbeat-delivery.d.ts.map +1 -0
  20. package/dist/src/heartbeat-delivery.js +37 -0
  21. package/dist/src/heartbeat-delivery.js.map +1 -0
  22. package/dist/src/heartbeat-executor.d.ts +35 -0
  23. package/dist/src/heartbeat-executor.d.ts.map +1 -0
  24. package/dist/src/heartbeat-executor.js +174 -0
  25. package/dist/src/heartbeat-executor.js.map +1 -0
  26. package/dist/src/index.d.ts +26 -0
  27. package/dist/src/index.d.ts.map +1 -0
  28. package/dist/src/index.js +15 -0
  29. package/dist/src/index.js.map +1 -0
  30. package/dist/src/permission.d.ts +21 -0
  31. package/dist/src/permission.d.ts.map +1 -0
  32. package/dist/src/permission.js +69 -0
  33. package/dist/src/permission.js.map +1 -0
  34. package/dist/src/reminder-parser.d.ts +12 -0
  35. package/dist/src/reminder-parser.d.ts.map +1 -0
  36. package/dist/src/reminder-parser.js +164 -0
  37. package/dist/src/reminder-parser.js.map +1 -0
  38. package/dist/src/session-store.d.ts +32 -0
  39. package/dist/src/session-store.d.ts.map +1 -0
  40. package/dist/src/session-store.js +112 -0
  41. package/dist/src/session-store.js.map +1 -0
  42. package/dist/src/settings.d.ts +45 -0
  43. package/dist/src/settings.d.ts.map +1 -0
  44. package/dist/src/settings.js +133 -0
  45. package/dist/src/settings.js.map +1 -0
  46. package/dist/src/telegram-gateway.d.ts +35 -0
  47. package/dist/src/telegram-gateway.d.ts.map +1 -0
  48. package/dist/src/telegram-gateway.js +145 -0
  49. package/dist/src/telegram-gateway.js.map +1 -0
  50. package/dist/src/turn-loop.d.ts +145 -0
  51. package/dist/src/turn-loop.d.ts.map +1 -0
  52. package/dist/src/turn-loop.js +393 -0
  53. package/dist/src/turn-loop.js.map +1 -0
  54. package/package.json +33 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-loop.d.ts","sourceRoot":"","sources":["../../src/turn-loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,393 @@
1
+ import { EventBus } from './event-bus.js';
2
+ import { SessionStore } from './session-store.js';
3
+ import { PermissionEngine } from './permission.js';
4
+ // The provider's stream() returns a CancelableIterable with a cancel() method
5
+ // that synchronously aborts the underlying HTTP connection (e.g., Anthropic's
6
+ // stream.abort()). The TurnLoop wires this cancel() to the AbortSignal's abort
7
+ // event so pressing Esc closes the stream immediately instead of waiting for
8
+ // the next SSE event from the server.
9
+ export class TurnLoop {
10
+ bus;
11
+ store;
12
+ permission;
13
+ config;
14
+ abort = false;
15
+ abortController = null;
16
+ messages = [];
17
+ activeSessionId;
18
+ recoveredTurns = 0;
19
+ constructor(config, store) {
20
+ this.config = config;
21
+ this.bus = new EventBus();
22
+ this.store = store ?? new SessionStore();
23
+ this.permission = new PermissionEngine(config.permissions, config.approvalMode ?? 'auto');
24
+ }
25
+ get eventBus() {
26
+ return this.bus;
27
+ }
28
+ get sessionStore() {
29
+ return this.store;
30
+ }
31
+ getSessionId() {
32
+ return this.activeSessionId || this.config.sessionId || undefined;
33
+ }
34
+ getMessages() {
35
+ return [...this.messages];
36
+ }
37
+ cancel() {
38
+ this.abort = true;
39
+ this.abortController?.abort();
40
+ }
41
+ async evaluateHarm(toolName, input) {
42
+ const inputJson = JSON.stringify(input);
43
+ const systemPrompt = 'You are a safety evaluator. Given a tool call, determine if it is potentially harmful to the user\'s system. Harmful means: deleting files, executing arbitrary shell commands, sending data to external services, modifying system configuration, or any action that could cause data loss or security compromise. Your response must be exactly one of these two strings: APPROVE or DENY. Do not add any other text.';
44
+ const prompt = `Evaluate this tool call:\nTool: ${toolName}\nInput: ${inputJson}`;
45
+ try {
46
+ const response = await this.config.provider.check(prompt, { model: this.config.model, system: systemPrompt });
47
+ const decision = response.trim().toUpperCase();
48
+ if (decision === 'APPROVE') {
49
+ return { approved: true, reason: `LLM harm-check: APPROVE` };
50
+ }
51
+ return { approved: false, reason: `LLM harm-check: DENY — ${response.trim()}` };
52
+ }
53
+ catch {
54
+ // If LLM check fails, deny for safety
55
+ return { approved: false, reason: 'LLM harm-check failed — denied' };
56
+ }
57
+ }
58
+ reconstructMessages(events) {
59
+ const messages = [];
60
+ let currentTurn = {
61
+ assistantDeltas: [],
62
+ toolCalls: [],
63
+ toolResults: [],
64
+ };
65
+ let hasActiveTurn = false;
66
+ for (const event of events) {
67
+ if (event.type === 'user-prompt') {
68
+ if (hasActiveTurn) {
69
+ messages.push(...this.buildTurnMessages(currentTurn));
70
+ }
71
+ messages.push({ role: 'user', content: event.text });
72
+ currentTurn = { assistantDeltas: [], toolCalls: [], toolResults: [] };
73
+ hasActiveTurn = true;
74
+ continue;
75
+ }
76
+ if (!hasActiveTurn)
77
+ continue;
78
+ if (event.type === 'assistant-delta') {
79
+ currentTurn.assistantDeltas.push(event.text);
80
+ }
81
+ else if (event.type === 'tool-call') {
82
+ currentTurn.toolCalls.push({ toolCallId: event.toolCallId, name: event.name, input: event.input, thoughtSignature: event.thoughtSignature });
83
+ }
84
+ else if (event.type === 'tool-result') {
85
+ currentTurn.toolResults.push({ toolCallId: event.toolCallId, output: event.output });
86
+ }
87
+ }
88
+ if (hasActiveTurn) {
89
+ messages.push(...this.buildTurnMessages(currentTurn));
90
+ }
91
+ return messages;
92
+ }
93
+ buildTurnMessages(turn) {
94
+ const msgs = [];
95
+ // Assistant message: text blocks + tool-use blocks
96
+ const assistantBlocks = [];
97
+ for (const text of turn.assistantDeltas) {
98
+ assistantBlocks.push({ type: 'text', text });
99
+ }
100
+ for (const tc of turn.toolCalls) {
101
+ assistantBlocks.push({ type: 'tool-use', id: tc.toolCallId, name: tc.name, input: tc.input, thoughtSignature: tc.thoughtSignature });
102
+ }
103
+ if (assistantBlocks.length > 0) {
104
+ msgs.push({ role: 'assistant', content: assistantBlocks });
105
+ }
106
+ // Tool messages
107
+ for (const tr of turn.toolResults) {
108
+ const tc = turn.toolCalls.find(c => c.toolCallId === tr.toolCallId);
109
+ if (tc) {
110
+ const content = typeof tr.output === 'string' ? tr.output : JSON.stringify(tr.output);
111
+ msgs.push({ role: 'tool', toolUseId: tc.toolCallId, content });
112
+ }
113
+ }
114
+ return msgs;
115
+ }
116
+ async run(prompt) {
117
+ // Resolve the effective session ID:
118
+ // 1. Explicit resumeSessionId (from CLI: curie-agent resume <id>)
119
+ // 2. Channel sessionId (persisted per-channel session)
120
+ // 3. Most recent session (from CLI: curie-agent resume)
121
+ const effectiveSessionId = this.config.resumeSessionId
122
+ ?? this.config.sessionId
123
+ ?? (this.config.resume ? this.store.list()[0]?.id : undefined);
124
+ let session;
125
+ if (effectiveSessionId) {
126
+ const loaded = this.store.load(effectiveSessionId);
127
+ if (loaded) {
128
+ session = loaded;
129
+ }
130
+ else {
131
+ // Session ID was provided but doesn't exist on disk yet
132
+ // (e.g. ChannelRouter generates a placeholder before TurnLoop creates it)
133
+ session = this.store.create(this.config.cwd, this.config.model, this.config.provider.name);
134
+ this.activeSessionId = session.id;
135
+ }
136
+ }
137
+ else {
138
+ session = this.store.create(this.config.cwd, this.config.model, this.config.provider.name);
139
+ }
140
+ this.activeSessionId ??= session.id;
141
+ // Resume: load stored events and reconstruct messages array
142
+ if (effectiveSessionId) {
143
+ const storedEvents = this.store.loadEvents(effectiveSessionId);
144
+ const reconstructed = this.reconstructMessages(storedEvents);
145
+ this.messages = reconstructed;
146
+ this.recoveredTurns = reconstructed.filter(m => m.role !== 'user').length;
147
+ if (this.recoveredTurns > 0) {
148
+ this.bus.emit({ type: 'session-resumed', id: session.id, turnsRecovered: this.recoveredTurns, timestamp: Date.now() });
149
+ }
150
+ }
151
+ const websearchTools = new Set(['WebSearch', 'WebFetch']);
152
+ const emit = (e) => {
153
+ this.bus.emit(e);
154
+ this.store.appendEvent(session.id, e);
155
+ };
156
+ this.abort = false;
157
+ this.abortController = new AbortController();
158
+ emit({ type: 'session-start', id: session.id, model: this.config.model, provider: this.config.provider.name, cwd: this.config.cwd, timestamp: Date.now() });
159
+ emit({ type: 'user-prompt', id: session.id, text: prompt, cwd: this.config.cwd, timestamp: Date.now() });
160
+ this.messages.push({ role: 'user', content: prompt });
161
+ let turn = 0;
162
+ const maxTurns = this.config.maxTurns ?? 50;
163
+ try {
164
+ while (turn < maxTurns && !this.abort) {
165
+ turn++;
166
+ let fullText = '';
167
+ const toolCalls = [];
168
+ let totalToolCalls = 0;
169
+ let websearchToolCalls = 0;
170
+ const thinkingBlocks = [];
171
+ // Local providers (Ollama, llama.cpp) don't support Anthropic thinking blocks.
172
+ // Strip thinking blocks from message history to avoid serialization errors.
173
+ const self = this;
174
+ const isLocal = self.config.provider.name === 'local';
175
+ const streamMessages = isLocal
176
+ ? self.messages.map((m) => {
177
+ if (m.role === 'assistant' && Array.isArray(m.content)) {
178
+ return { ...m, content: m.content.filter((b) => b.type !== 'thinking') };
179
+ }
180
+ return m;
181
+ })
182
+ : self.messages;
183
+ // Capture abortController before the loop — it's always set by this point.
184
+ const abortCtrl = self.abortController;
185
+ // Start the provider stream and capture its cancel function.
186
+ // The cancel() method synchronously aborts the underlying HTTP connection
187
+ // (e.g., Anthropic's stream.abort()), making Esc feel instantaneous.
188
+ const cancelable = self.config.provider.stream({
189
+ messages: streamMessages,
190
+ tools: self.config.tools.map((t) => t.definition),
191
+ model: self.config.model,
192
+ system: self.config.system,
193
+ signal: abortCtrl.signal,
194
+ effort: self.config.effort,
195
+ });
196
+ // Wire the AbortSignal's abort event to cancel the stream immediately.
197
+ // This is what makes Esc feel instant — it calls stream.abort() on the
198
+ // underlying HTTP connection instead of waiting for the next SSE event.
199
+ abortCtrl.signal.addEventListener('abort', () => {
200
+ cancelable.cancel();
201
+ }, { once: true });
202
+ try {
203
+ for await (const event of cancelable.iterable) {
204
+ if (self.abort)
205
+ break;
206
+ switch (event.type) {
207
+ case 'text-delta':
208
+ fullText += event.text;
209
+ emit({ type: 'assistant-delta', id: session.id, text: event.text, timestamp: Date.now() });
210
+ break;
211
+ case 'thinking-block':
212
+ thinkingBlocks.push({ thinking: event.thinking, signature: event.signature });
213
+ break;
214
+ case 'tool-call':
215
+ toolCalls.push({ id: event.id, name: event.name, input: event.input, thoughtSignature: event.thoughtSignature });
216
+ emit({ type: 'tool-call', id: session.id, toolCallId: event.id, name: event.name, input: event.input, thoughtSignature: event.thoughtSignature, timestamp: Date.now() });
217
+ break;
218
+ case 'usage':
219
+ emit({ type: 'usage', id: session.id, inputTokens: event.inputTokens, outputTokens: event.outputTokens, cacheReadTokens: event.cacheReadTokens, cacheWriteTokens: event.cacheWriteTokens, timestamp: Date.now() });
220
+ break;
221
+ }
222
+ }
223
+ }
224
+ catch (err) {
225
+ // If we're cancelling via abort (Esc pressed), the provider's stream
226
+ // may throw due to the closed HTTP connection — fall through to
227
+ // the this.abort check below for clean cancellation handling.
228
+ if (this.abort) {
229
+ // Cancellation caused the error — handled below.
230
+ }
231
+ else {
232
+ const status = err?.status ?? err?.response?.status;
233
+ const msg = err instanceof Error ? err.message : String(err);
234
+ if (status === 413) {
235
+ emit({ type: 'error', id: session.id, message: `Provider returned 413 (Request Entity Too Large). The system prompt + messages exceed the local model's context window. Try: reduce AGENTS.md size, or use a larger local model. (Original: ${msg})`,
236
+ timestamp: Date.now(),
237
+ });
238
+ emit({ type: 'session-stop', id: session.id, reason: 'error', timestamp: Date.now() });
239
+ return { events: self.bus.history(), sessionId: session.id, reason: 'error' };
240
+ }
241
+ if (msg.includes('invalid string length') || msg.includes('INVALID_LENGTH')) {
242
+ emit({ type: 'error', id: session.id, message: `Provider returned "invalid string length" — the local model's response format is incompatible with the Anthropic SDK. This usually means the model doesn't fully implement the Anthropic API. Try: use a model that supports the Anthropic Messages API (e.g. llama-3.1), or switch to OpenAI-compatible provider with correct model names. (Original: ${msg})`,
243
+ timestamp: Date.now(),
244
+ });
245
+ emit({ type: 'session-stop', id: session.id, reason: 'error', timestamp: Date.now() });
246
+ return { events: self.bus.history(), sessionId: session.id, reason: 'error' };
247
+ }
248
+ throw err;
249
+ }
250
+ }
251
+ if (this.abort) {
252
+ emit({ type: 'assistant-stop', id: session.id, timestamp: Date.now() });
253
+ emit({ type: 'session-stop', id: session.id, reason: 'cancelled', timestamp: Date.now() });
254
+ return { events: this.bus.history(), sessionId: session.id, reason: 'cancelled' };
255
+ }
256
+ // Build assistant message: thinking blocks MUST come first (Anthropic
257
+ // requires them preserved when extended thinking + tool use is combined),
258
+ // then text, then tool-use blocks.
259
+ const assistantContent = [];
260
+ for (const tb of thinkingBlocks) {
261
+ assistantContent.push({ type: 'thinking', thinking: tb.thinking, signature: tb.signature });
262
+ }
263
+ if (fullText)
264
+ assistantContent.push({ type: 'text', text: fullText });
265
+ for (const tc of toolCalls) {
266
+ assistantContent.push({ type: 'tool-use', id: tc.id, name: tc.name, input: tc.input, thoughtSignature: tc.thoughtSignature });
267
+ }
268
+ if (assistantContent.length > 0) {
269
+ this.messages.push({ role: 'assistant', content: assistantContent });
270
+ }
271
+ if (toolCalls.length === 0) {
272
+ emit({ type: 'assistant-stop', id: session.id, timestamp: Date.now() });
273
+ emit({ type: 'session-stop', id: session.id, reason: 'stop', timestamp: Date.now() });
274
+ return { events: this.bus.history(), sessionId: session.id, reason: 'stop' };
275
+ }
276
+ for (const tc of toolCalls) {
277
+ if (this.abort)
278
+ break;
279
+ // --- Tool usage limits ---
280
+ const totalLimit = this.config.settings.TOOLS_PER_CALL ?? 10;
281
+ const websearchLimit = this.config.settings.WEBSEARCH_PER_CALL ?? 5;
282
+ if (totalToolCalls >= totalLimit) {
283
+ const msg = `Tool call limit reached (${totalLimit} per turn). Skipping remaining tool call(s).`;
284
+ emit({ type: 'status', id: session.id, message: msg, timestamp: Date.now() });
285
+ for (const remaining of toolCalls.slice(toolCalls.indexOf(tc))) {
286
+ this.messages.push({ role: 'tool', toolUseId: remaining.id, content: `Skipped: ${msg}` });
287
+ emit({ type: 'tool-result', id: session.id, toolCallId: remaining.id, output: null, error: msg, timestamp: Date.now() });
288
+ }
289
+ break;
290
+ }
291
+ if (websearchTools.has(tc.name) && websearchToolCalls >= websearchLimit) {
292
+ const msg = `WebSearch/WebFetch limit reached (${websearchLimit} per turn). Skipping remaining tool call(s).`;
293
+ emit({ type: 'status', id: session.id, message: msg, timestamp: Date.now() });
294
+ for (const remaining of toolCalls.slice(toolCalls.indexOf(tc))) {
295
+ this.messages.push({ role: 'tool', toolUseId: remaining.id, content: `Skipped: ${msg}` });
296
+ emit({ type: 'tool-result', id: session.id, toolCallId: remaining.id, output: null, error: msg, timestamp: Date.now() });
297
+ }
298
+ break;
299
+ }
300
+ // --- End tool usage limits ---
301
+ const permResult = this.permission.check(tc.name, tc.input);
302
+ emit({
303
+ type: 'approval-request',
304
+ id: session.id,
305
+ toolCallId: tc.id,
306
+ name: tc.name,
307
+ input: tc.input,
308
+ decision: permResult.decision,
309
+ timestamp: Date.now(),
310
+ });
311
+ if (permResult.decision === 'deny') {
312
+ emit({ type: 'approval-decision', id: session.id, toolCallId: tc.id, decision: 'deny', timestamp: Date.now() });
313
+ this.messages.push({ role: 'tool', toolUseId: tc.id, content: `Tool call denied: ${permResult.reason}` });
314
+ continue;
315
+ }
316
+ // Track approval status for display in tool result messages.
317
+ let toolApproved = true;
318
+ let toolDecisionBy = 'auto';
319
+ if (permResult.decision === 'ask') {
320
+ const ask = this.config.onApprovalAsk;
321
+ // In auto mode: evaluate harm with LLM before asking user.
322
+ let approved = false;
323
+ let decisionBy = 'user';
324
+ if (this.permission['mode'] === 'auto' && ask) {
325
+ const harm = await this.evaluateHarm(tc.name, tc.input);
326
+ if (harm.approved) {
327
+ approved = true;
328
+ decisionBy = 'llm';
329
+ }
330
+ else {
331
+ // LLM denied — ask user for final decision
332
+ approved = await ask({ name: tc.name, input: tc.input, reason: harm.reason });
333
+ decisionBy = 'user';
334
+ }
335
+ }
336
+ else {
337
+ approved = ask
338
+ ? await ask({ name: tc.name, input: tc.input, reason: permResult.reason })
339
+ : true; // no callback wired — treat as allow to preserve old behavior
340
+ decisionBy = approved ? 'user' : 'user';
341
+ }
342
+ emit({
343
+ type: 'approval-decision',
344
+ id: session.id,
345
+ toolCallId: tc.id,
346
+ decision: approved ? 'allow' : 'deny',
347
+ by: decisionBy,
348
+ timestamp: Date.now(),
349
+ });
350
+ if (!approved) {
351
+ this.messages.push({ role: 'tool', toolUseId: tc.id, content: decisionBy === 'llm' ? `Tool call denied by LLM harm-check: ${tc.name}` : 'Tool call denied by user.' });
352
+ continue;
353
+ }
354
+ toolApproved = approved;
355
+ toolDecisionBy = decisionBy === 'llm' ? 'llm' : 'user';
356
+ }
357
+ totalToolCalls++;
358
+ if (websearchTools.has(tc.name))
359
+ websearchToolCalls++;
360
+ const tool = this.config.tools.find((t) => t.definition.name === tc.name);
361
+ if (!tool) {
362
+ emit({ type: 'tool-result', id: session.id, toolCallId: tc.id, output: null, error: `Unknown tool: ${tc.name}`, timestamp: Date.now() });
363
+ this.messages.push({ role: 'tool', toolUseId: tc.id, content: `Unknown tool: ${tc.name}` });
364
+ continue;
365
+ }
366
+ try {
367
+ const result = await tool.execute(tc.input, this.config.settings);
368
+ emit({ type: 'tool-result', id: session.id, toolCallId: tc.id, output: result.output, error: result.error, timestamp: Date.now() });
369
+ const outputStr = result.error ? `Error: ${result.error}` : JSON.stringify(result.output);
370
+ const decisionLabel = toolDecisionBy === 'llm' ? 'LLM-approved' : toolDecisionBy === 'user' ? 'Approved by user' : 'Auto Approved';
371
+ this.messages.push({ role: 'tool', toolUseId: tc.id, content: `${tc.name}: ${decisionLabel} — ${outputStr}` });
372
+ }
373
+ catch (err) {
374
+ const msg = err instanceof Error ? err.message : String(err);
375
+ emit({ type: 'tool-result', id: session.id, toolCallId: tc.id, output: null, error: msg, timestamp: Date.now() });
376
+ const decisionLabel = toolDecisionBy === 'llm' ? 'LLM-approved' : toolDecisionBy === 'user' ? 'Approved by user' : 'Auto Approved';
377
+ this.messages.push({ role: 'tool', toolUseId: tc.id, content: `${tc.name}: ${decisionLabel} — Error: ${msg}` });
378
+ }
379
+ }
380
+ }
381
+ emit({ type: 'assistant-stop', id: session.id, timestamp: Date.now() });
382
+ emit({ type: 'session-stop', id: session.id, reason: 'max-turns', timestamp: Date.now() });
383
+ return { events: this.bus.history(), sessionId: session.id, reason: 'max-turns' };
384
+ }
385
+ catch (err) {
386
+ const msg = err instanceof Error ? err.message : String(err);
387
+ emit({ type: 'error', id: session.id, message: msg, timestamp: Date.now() });
388
+ emit({ type: 'session-stop', id: session.id, reason: 'error', timestamp: Date.now() });
389
+ return { events: this.bus.history(), sessionId: session.id, reason: 'error' };
390
+ }
391
+ }
392
+ }
393
+ //# sourceMappingURL=turn-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-loop.js","sourceRoot":"","sources":["../../src/turn-loop.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@curie-agent/core",
3
+ "version": "0.1.0",
4
+ "publish": true,
5
+ "type": "module",
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "main": "./dist/src/index.js",
10
+ "types": "./dist/src/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/src/index.js",
14
+ "types": "./dist/src/index.d.ts"
15
+ }
16
+ },
17
+ "scripts": {
18
+ "build": "tsc --project tsconfig.json",
19
+ "dev": "tsc --watch --project tsconfig.json",
20
+ "typecheck": "tsc --noEmit --project tsconfig.json",
21
+ "lint": "eslint src/",
22
+ "test": "vitest run",
23
+ "clean": "npx rimraf dist"
24
+ },
25
+ "dependencies": {
26
+ "grammy": "^1.42.0",
27
+ "zod": "^4.4.3"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^22.0.0",
31
+ "typescript": "^6.0.3"
32
+ }
33
+ }