@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.
- package/README.md +186 -0
- package/dist/conversation.d.ts +146 -0
- package/dist/conversation.d.ts.map +1 -0
- package/dist/conversation.js +239 -0
- package/dist/conversation.js.map +1 -0
- package/dist/events.d.ts +218 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +299 -0
- package/dist/events.js.map +1 -0
- package/dist/executor.d.ts +144 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +362 -0
- package/dist/executor.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/langchain.d.ts +210 -0
- package/dist/langchain.d.ts.map +1 -0
- package/dist/langchain.js +333 -0
- package/dist/langchain.js.map +1 -0
- package/dist/mcp.d.ts +208 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +266 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory.d.ts +96 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +248 -0
- package/dist/memory.js.map +1 -0
- package/dist/oauth.d.ts +158 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +344 -0
- package/dist/oauth.js.map +1 -0
- package/dist/output.d.ts +262 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +249 -0
- package/dist/output.js.map +1 -0
- package/dist/session.d.ts +212 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +347 -0
- package/dist/session.js.map +1 -0
- package/dist/tools.d.ts +125 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +195 -0
- package/dist/tools.js.map +1 -0
- 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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"}
|