@tashiscool/agents 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 (46) hide show
  1. package/README.md +186 -0
  2. package/dist/conversation.d.ts +146 -0
  3. package/dist/conversation.d.ts.map +1 -0
  4. package/dist/conversation.js +239 -0
  5. package/dist/conversation.js.map +1 -0
  6. package/dist/events.d.ts +218 -0
  7. package/dist/events.d.ts.map +1 -0
  8. package/dist/events.js +299 -0
  9. package/dist/events.js.map +1 -0
  10. package/dist/executor.d.ts +144 -0
  11. package/dist/executor.d.ts.map +1 -0
  12. package/dist/executor.js +362 -0
  13. package/dist/executor.js.map +1 -0
  14. package/dist/index.d.ts +26 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +27 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/langchain.d.ts +210 -0
  19. package/dist/langchain.d.ts.map +1 -0
  20. package/dist/langchain.js +333 -0
  21. package/dist/langchain.js.map +1 -0
  22. package/dist/mcp.d.ts +208 -0
  23. package/dist/mcp.d.ts.map +1 -0
  24. package/dist/mcp.js +266 -0
  25. package/dist/mcp.js.map +1 -0
  26. package/dist/memory.d.ts +96 -0
  27. package/dist/memory.d.ts.map +1 -0
  28. package/dist/memory.js +248 -0
  29. package/dist/memory.js.map +1 -0
  30. package/dist/oauth.d.ts +158 -0
  31. package/dist/oauth.d.ts.map +1 -0
  32. package/dist/oauth.js +344 -0
  33. package/dist/oauth.js.map +1 -0
  34. package/dist/output.d.ts +262 -0
  35. package/dist/output.d.ts.map +1 -0
  36. package/dist/output.js +249 -0
  37. package/dist/output.js.map +1 -0
  38. package/dist/session.d.ts +212 -0
  39. package/dist/session.d.ts.map +1 -0
  40. package/dist/session.js +347 -0
  41. package/dist/session.js.map +1 -0
  42. package/dist/tools.d.ts +125 -0
  43. package/dist/tools.d.ts.map +1 -0
  44. package/dist/tools.js +195 -0
  45. package/dist/tools.js.map +1 -0
  46. package/package.json +45 -0
package/README.md ADDED
@@ -0,0 +1,186 @@
1
+ # @llm-utils/agents
2
+
3
+ Agent building blocks for LLM applications. Type-safe tools, token-aware memory, and structured output parsing.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pnpm add @llm-utils/agents
9
+ # or
10
+ npm install @llm-utils/agents
11
+ ```
12
+
13
+ ## Features
14
+
15
+ - **Tool Definition** - Type-safe tool/function definitions with Zod schemas
16
+ - **Memory Management** - Token-aware conversation memory with windowing
17
+ - **Output Parsing** - Parse and validate structured LLM outputs
18
+ - **Provider Agnostic** - Works with OpenAI, Anthropic, and other providers
19
+ - **Full TypeScript** - Complete type safety with generics
20
+
21
+ ## Usage
22
+
23
+ ### Define Tools
24
+
25
+ ```typescript
26
+ import { defineTool, createToolExecutor, z } from '@llm-utils/agents';
27
+
28
+ // Define a tool with Zod schema
29
+ const weatherTool = defineTool({
30
+ name: 'get_weather',
31
+ description: 'Get current weather for a location',
32
+ parameters: z.object({
33
+ location: z.string().describe('City name'),
34
+ units: z.enum(['celsius', 'fahrenheit']).optional(),
35
+ }),
36
+ execute: async ({ location, units }) => {
37
+ // Your implementation
38
+ return { temperature: 22, conditions: 'sunny' };
39
+ },
40
+ });
41
+
42
+ // Create an executor
43
+ const executor = createToolExecutor([weatherTool]);
44
+
45
+ // Get tools in provider format
46
+ const openaiTools = executor.toOpenAI();
47
+ const anthropicTools = executor.toAnthropic();
48
+
49
+ // Execute a tool call from LLM response
50
+ const result = await executor.execute({
51
+ id: 'call_123',
52
+ name: 'get_weather',
53
+ arguments: { location: 'San Francisco' },
54
+ });
55
+ ```
56
+
57
+ ### Conversation Memory
58
+
59
+ ```typescript
60
+ import { createMemory, createSlidingWindowMemory } from '@llm-utils/agents';
61
+
62
+ // Token-aware memory with automatic windowing
63
+ const memory = createMemory({
64
+ maxTokens: 4000,
65
+ systemMessage: 'You are a helpful assistant.',
66
+ preserveRecent: 3, // Always keep last 3 messages
67
+ });
68
+
69
+ // Add messages
70
+ memory.add({ role: 'user', content: 'Hello!' });
71
+ memory.add({ role: 'assistant', content: 'Hi there! How can I help?' });
72
+
73
+ // Get messages within token budget
74
+ const messages = memory.getMessages();
75
+
76
+ // Check memory stats
77
+ const stats = memory.getStats();
78
+ console.log(`Using ${stats.utilizationPercent}% of token budget`);
79
+
80
+ // Simple sliding window (last N messages)
81
+ const simpleMemory = createSlidingWindowMemory(20, 'System prompt here');
82
+ ```
83
+
84
+ ### Structured Output Parsing
85
+
86
+ ```typescript
87
+ import { parseWithSchema, createSchemaParser, Parsers, z } from '@llm-utils/agents';
88
+
89
+ // Parse with a Zod schema
90
+ const result = parseWithSchema(
91
+ llmResponse,
92
+ z.object({
93
+ answer: z.string(),
94
+ confidence: z.number(),
95
+ })
96
+ );
97
+
98
+ if (result.success) {
99
+ console.log(result.data.answer);
100
+ }
101
+
102
+ // Create a reusable parser
103
+ const analysisParser = createSchemaParser(
104
+ 'Analysis',
105
+ z.object({
106
+ sentiment: z.enum(['positive', 'negative', 'neutral']),
107
+ topics: z.array(z.string()),
108
+ summary: z.string(),
109
+ }),
110
+ 'Analyze the provided text'
111
+ );
112
+
113
+ // Get prompt instructions for the LLM
114
+ const instructions = analysisParser.getPromptInstructions();
115
+
116
+ // Parse response
117
+ const analysis = analysisParser.parseOrThrow(llmResponse);
118
+
119
+ // Use built-in parsers
120
+ const decision = Parsers.Decision.parse(llmResponse);
121
+ const sentiment = Parsers.Sentiment.parse(llmResponse);
122
+ const entities = Parsers.Entities.parse(llmResponse);
123
+ ```
124
+
125
+ ### Summary-Based Memory
126
+
127
+ ```typescript
128
+ import { createSummaryMemory } from '@llm-utils/agents';
129
+
130
+ const memory = createSummaryMemory({
131
+ maxMessages: 10,
132
+ systemMessage: 'You are an assistant.',
133
+ summarizer: async (messages) => {
134
+ // Call LLM to summarize old messages
135
+ const response = await llm.chat({
136
+ messages: [
137
+ { role: 'system', content: 'Summarize this conversation briefly.' },
138
+ ...messages,
139
+ ],
140
+ });
141
+ return response.content;
142
+ },
143
+ });
144
+
145
+ // Periodically summarize old messages
146
+ await memory.summarize();
147
+ ```
148
+
149
+ ## API Reference
150
+
151
+ ### Tools
152
+
153
+ - `defineTool(config)` - Define a tool with typed parameters
154
+ - `createToolExecutor(tools?)` - Create a tool executor
155
+ - `toOpenAITool(tool)` - Convert to OpenAI format
156
+ - `toAnthropicTool(tool)` - Convert to Anthropic format
157
+ - `zodToJsonSchema(schema)` - Convert Zod to JSON Schema
158
+
159
+ ### Memory
160
+
161
+ - `createMemory(config)` - Token-aware memory
162
+ - `createSlidingWindowMemory(size, system?)` - Simple sliding window
163
+ - `createSummaryMemory(config)` - Memory with summarization
164
+ - `estimateTokens(text)` - Rough token estimation
165
+
166
+ ### Output Parsing
167
+
168
+ - `parseWithSchema(text, schema)` - Parse and validate with Zod
169
+ - `createSchemaParser(name, schema)` - Create reusable parser
170
+ - `extractJson(text)` - Extract JSON from mixed content
171
+ - `Parsers` - Pre-built parsers for common patterns
172
+
173
+ ### Common Schemas
174
+
175
+ ```typescript
176
+ CommonSchemas.Decision // Yes/no with reasoning
177
+ CommonSchemas.Sentiment // Sentiment analysis
178
+ CommonSchemas.Entities // Entity extraction
179
+ CommonSchemas.Classification // Classification result
180
+ CommonSchemas.Summary // Text summary
181
+ CommonSchemas.ActionItems // Action item extraction
182
+ ```
183
+
184
+ ## License
185
+
186
+ MIT
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Conversation Threading
3
+ * Manage message threads with branching and revision history
4
+ */
5
+ import type { Message, MessageRole } from './memory.js';
6
+ /**
7
+ * Message with threading metadata
8
+ */
9
+ export interface ThreadedMessage extends Message {
10
+ /** Unique message ID */
11
+ id: string;
12
+ /** Parent message ID (for branching) */
13
+ parentId?: string;
14
+ /** Timestamp when created */
15
+ createdAt: Date;
16
+ /** Timestamp when last updated */
17
+ updatedAt?: Date;
18
+ /** Revision number (for edits) */
19
+ revision: number;
20
+ /** Previous revision ID (for edit history) */
21
+ previousRevisionId?: string;
22
+ /** Branch name or identifier */
23
+ branch?: string;
24
+ /** Additional metadata */
25
+ metadata?: Record<string, unknown>;
26
+ }
27
+ /**
28
+ * Conversation thread
29
+ */
30
+ export interface ConversationThread {
31
+ /** Thread ID */
32
+ id: string;
33
+ /** Thread title */
34
+ title?: string;
35
+ /** Creation timestamp */
36
+ createdAt: Date;
37
+ /** Last activity timestamp */
38
+ updatedAt: Date;
39
+ /** Root message ID */
40
+ rootMessageId?: string;
41
+ /** Current branch name */
42
+ currentBranch: string;
43
+ /** Thread metadata */
44
+ metadata?: Record<string, unknown>;
45
+ }
46
+ /**
47
+ * Thread storage adapter interface
48
+ */
49
+ export interface ThreadStorageAdapter {
50
+ /** Save a message */
51
+ saveMessage(message: ThreadedMessage): Promise<void>;
52
+ /** Get a message by ID */
53
+ getMessage(id: string): Promise<ThreadedMessage | null>;
54
+ /** Get messages by parent ID */
55
+ getMessagesByParent(parentId: string): Promise<ThreadedMessage[]>;
56
+ /** Get all messages in a thread */
57
+ getThreadMessages(threadId: string): Promise<ThreadedMessage[]>;
58
+ /** Delete a message */
59
+ deleteMessage(id: string): Promise<void>;
60
+ /** Save thread metadata */
61
+ saveThread(thread: ConversationThread): Promise<void>;
62
+ /** Get thread by ID */
63
+ getThread(id: string): Promise<ConversationThread | null>;
64
+ }
65
+ /**
66
+ * In-memory storage adapter
67
+ */
68
+ export declare class InMemoryThreadStorage implements ThreadStorageAdapter {
69
+ private messages;
70
+ private threads;
71
+ private messagesByThread;
72
+ saveMessage(message: ThreadedMessage): Promise<void>;
73
+ getMessage(id: string): Promise<ThreadedMessage | null>;
74
+ getMessagesByParent(parentId: string): Promise<ThreadedMessage[]>;
75
+ getThreadMessages(threadId: string): Promise<ThreadedMessage[]>;
76
+ deleteMessage(id: string): Promise<void>;
77
+ saveThread(thread: ConversationThread): Promise<void>;
78
+ getThread(id: string): Promise<ConversationThread | null>;
79
+ }
80
+ /**
81
+ * Conversation manager options
82
+ */
83
+ export interface ConversationManagerOptions {
84
+ /** Storage adapter */
85
+ storage?: ThreadStorageAdapter;
86
+ /** Default branch name */
87
+ defaultBranch?: string;
88
+ }
89
+ /**
90
+ * Conversation manager for threaded messages
91
+ */
92
+ export declare class ConversationManager {
93
+ private storage;
94
+ private defaultBranch;
95
+ private currentThread;
96
+ constructor(options?: ConversationManagerOptions);
97
+ /**
98
+ * Create a new conversation thread
99
+ */
100
+ createThread(title?: string): Promise<ConversationThread>;
101
+ /**
102
+ * Load an existing thread
103
+ */
104
+ loadThread(threadId: string): Promise<ConversationThread | null>;
105
+ /**
106
+ * Add a message to the current thread
107
+ */
108
+ addMessage(role: MessageRole, content: string, options?: {
109
+ parentId?: string;
110
+ branch?: string;
111
+ metadata?: Record<string, unknown>;
112
+ }): Promise<ThreadedMessage>;
113
+ /**
114
+ * Edit a message (creates a new revision)
115
+ */
116
+ editMessage(messageId: string, newContent: string): Promise<ThreadedMessage | null>;
117
+ /**
118
+ * Create a branch from a message
119
+ */
120
+ createBranch(fromMessageId: string, branchName: string): Promise<string>;
121
+ /**
122
+ * Get messages in the current thread as a linear conversation
123
+ */
124
+ getLinearHistory(branch?: string): Promise<ThreadedMessage[]>;
125
+ /**
126
+ * Get all branches from a message
127
+ */
128
+ getBranches(messageId: string): Promise<ThreadedMessage[]>;
129
+ /**
130
+ * Get revision history for a message
131
+ */
132
+ getRevisionHistory(messageId: string): Promise<ThreadedMessage[]>;
133
+ /**
134
+ * Convert to simple Message array for LLM calls
135
+ */
136
+ toMessages(branch?: string): Promise<Message[]>;
137
+ /**
138
+ * Get current thread
139
+ */
140
+ getThread(): ConversationThread | null;
141
+ }
142
+ /**
143
+ * Create a conversation manager
144
+ */
145
+ export declare function createConversationManager(options?: ConversationManagerOptions): ConversationManager;
146
+ //# sourceMappingURL=conversation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Conversation Threading
3
+ * Manage message threads with branching and revision history
4
+ */
5
+ /**
6
+ * In-memory storage adapter
7
+ */
8
+ export class InMemoryThreadStorage {
9
+ messages = new Map();
10
+ threads = new Map();
11
+ messagesByThread = new Map();
12
+ async saveMessage(message) {
13
+ this.messages.set(message.id, message);
14
+ // Track by thread if metadata includes threadId
15
+ const threadId = message.metadata?.['threadId'];
16
+ if (threadId) {
17
+ if (!this.messagesByThread.has(threadId)) {
18
+ this.messagesByThread.set(threadId, new Set());
19
+ }
20
+ this.messagesByThread.get(threadId).add(message.id);
21
+ }
22
+ }
23
+ async getMessage(id) {
24
+ return this.messages.get(id) || null;
25
+ }
26
+ async getMessagesByParent(parentId) {
27
+ const result = [];
28
+ for (const msg of this.messages.values()) {
29
+ if (msg.parentId === parentId) {
30
+ result.push(msg);
31
+ }
32
+ }
33
+ return result.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
34
+ }
35
+ async getThreadMessages(threadId) {
36
+ const messageIds = this.messagesByThread.get(threadId);
37
+ if (!messageIds)
38
+ return [];
39
+ const messages = [];
40
+ for (const id of messageIds) {
41
+ const msg = this.messages.get(id);
42
+ if (msg)
43
+ messages.push(msg);
44
+ }
45
+ return messages.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
46
+ }
47
+ async deleteMessage(id) {
48
+ const msg = this.messages.get(id);
49
+ if (msg) {
50
+ const threadId = msg.metadata?.['threadId'];
51
+ if (threadId) {
52
+ this.messagesByThread.get(threadId)?.delete(id);
53
+ }
54
+ this.messages.delete(id);
55
+ }
56
+ }
57
+ async saveThread(thread) {
58
+ this.threads.set(thread.id, thread);
59
+ }
60
+ async getThread(id) {
61
+ return this.threads.get(id) || null;
62
+ }
63
+ }
64
+ /**
65
+ * Generate a unique ID
66
+ */
67
+ function generateId() {
68
+ return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
69
+ }
70
+ /**
71
+ * Conversation manager for threaded messages
72
+ */
73
+ export class ConversationManager {
74
+ storage;
75
+ defaultBranch;
76
+ currentThread = null;
77
+ constructor(options = {}) {
78
+ this.storage = options.storage || new InMemoryThreadStorage();
79
+ this.defaultBranch = options.defaultBranch || 'main';
80
+ }
81
+ /**
82
+ * Create a new conversation thread
83
+ */
84
+ async createThread(title) {
85
+ const thread = {
86
+ id: generateId(),
87
+ title,
88
+ createdAt: new Date(),
89
+ updatedAt: new Date(),
90
+ currentBranch: this.defaultBranch,
91
+ };
92
+ await this.storage.saveThread(thread);
93
+ this.currentThread = thread;
94
+ return thread;
95
+ }
96
+ /**
97
+ * Load an existing thread
98
+ */
99
+ async loadThread(threadId) {
100
+ const thread = await this.storage.getThread(threadId);
101
+ if (thread) {
102
+ this.currentThread = thread;
103
+ }
104
+ return thread;
105
+ }
106
+ /**
107
+ * Add a message to the current thread
108
+ */
109
+ async addMessage(role, content, options = {}) {
110
+ if (!this.currentThread) {
111
+ await this.createThread();
112
+ }
113
+ const message = {
114
+ id: generateId(),
115
+ role,
116
+ content,
117
+ parentId: options.parentId,
118
+ createdAt: new Date(),
119
+ revision: 1,
120
+ branch: options.branch || this.currentThread.currentBranch,
121
+ metadata: {
122
+ ...options.metadata,
123
+ threadId: this.currentThread.id,
124
+ },
125
+ };
126
+ await this.storage.saveMessage(message);
127
+ // Update thread timestamp
128
+ this.currentThread.updatedAt = new Date();
129
+ if (!this.currentThread.rootMessageId) {
130
+ this.currentThread.rootMessageId = message.id;
131
+ }
132
+ await this.storage.saveThread(this.currentThread);
133
+ return message;
134
+ }
135
+ /**
136
+ * Edit a message (creates a new revision)
137
+ */
138
+ async editMessage(messageId, newContent) {
139
+ const original = await this.storage.getMessage(messageId);
140
+ if (!original)
141
+ return null;
142
+ const edited = {
143
+ ...original,
144
+ id: generateId(),
145
+ content: newContent,
146
+ revision: original.revision + 1,
147
+ previousRevisionId: original.id,
148
+ createdAt: new Date(),
149
+ updatedAt: new Date(),
150
+ };
151
+ await this.storage.saveMessage(edited);
152
+ return edited;
153
+ }
154
+ /**
155
+ * Create a branch from a message
156
+ */
157
+ async createBranch(fromMessageId, branchName) {
158
+ const message = await this.storage.getMessage(fromMessageId);
159
+ if (!message) {
160
+ throw new Error(`Message not found: ${fromMessageId}`);
161
+ }
162
+ if (this.currentThread) {
163
+ this.currentThread.currentBranch = branchName;
164
+ await this.storage.saveThread(this.currentThread);
165
+ }
166
+ return branchName;
167
+ }
168
+ /**
169
+ * Get messages in the current thread as a linear conversation
170
+ */
171
+ async getLinearHistory(branch) {
172
+ if (!this.currentThread)
173
+ return [];
174
+ const allMessages = await this.storage.getThreadMessages(this.currentThread.id);
175
+ // Filter by branch
176
+ const targetBranch = branch || this.currentThread.currentBranch;
177
+ const branchMessages = allMessages.filter((m) => !m.branch || m.branch === targetBranch);
178
+ // Build linear history from root
179
+ const messageMap = new Map(branchMessages.map((m) => [m.id, m]));
180
+ const result = [];
181
+ // Find root message
182
+ let current = branchMessages.find((m) => !m.parentId);
183
+ while (current) {
184
+ result.push(current);
185
+ // Find next message (child of current)
186
+ const children = branchMessages.filter((m) => m.parentId === current.id);
187
+ current = children[0]; // Take first child (most recent)
188
+ }
189
+ return result;
190
+ }
191
+ /**
192
+ * Get all branches from a message
193
+ */
194
+ async getBranches(messageId) {
195
+ return this.storage.getMessagesByParent(messageId);
196
+ }
197
+ /**
198
+ * Get revision history for a message
199
+ */
200
+ async getRevisionHistory(messageId) {
201
+ const revisions = [];
202
+ let current = await this.storage.getMessage(messageId);
203
+ while (current) {
204
+ revisions.unshift(current);
205
+ if (current.previousRevisionId) {
206
+ current = await this.storage.getMessage(current.previousRevisionId);
207
+ }
208
+ else {
209
+ break;
210
+ }
211
+ }
212
+ return revisions;
213
+ }
214
+ /**
215
+ * Convert to simple Message array for LLM calls
216
+ */
217
+ async toMessages(branch) {
218
+ const history = await this.getLinearHistory(branch);
219
+ return history.map((m) => ({
220
+ role: m.role,
221
+ content: m.content,
222
+ name: m.name,
223
+ toolCallId: m.toolCallId,
224
+ }));
225
+ }
226
+ /**
227
+ * Get current thread
228
+ */
229
+ getThread() {
230
+ return this.currentThread;
231
+ }
232
+ }
233
+ /**
234
+ * Create a conversation manager
235
+ */
236
+ export function createConversationManager(options) {
237
+ return new ConversationManager(options);
238
+ }
239
+ //# sourceMappingURL=conversation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.js","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"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"}