@letta-ai/letta-code-sdk 0.0.4 → 0.0.5
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 +38 -78
- package/dist/index.d.ts +53 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +119 -68
- package/dist/index.js.map +7 -7
- package/dist/session.d.ts +16 -5
- package/dist/session.d.ts.map +1 -1
- package/dist/transport.d.ts +2 -4
- package/dist/transport.d.ts.map +1 -1
- package/dist/types.d.ts +75 -17
- package/dist/types.d.ts.map +1 -1
- package/dist/validation.d.ts +8 -5
- package/dist/validation.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/@letta-ai/letta-code-sdk) [](https://discord.gg/letta)
|
|
4
4
|
|
|
5
5
|
> [!TIP]
|
|
6
|
-
> Check out [**LettaBot**](https://github.com/letta-ai/lettabot) and [**Letta Cowork**](github.com/letta-ai/letta-cowork), two open-source apps built on the **Letta Code SDK**.
|
|
6
|
+
> Check out [**LettaBot**](https://github.com/letta-ai/lettabot) and [**Letta Cowork**](https://github.com/letta-ai/letta-cowork), two open-source apps built on the **Letta Code SDK**.
|
|
7
7
|
|
|
8
8
|
The SDK interface to [**Letta Code**](https://github.com/letta-ai/letta-code). Build agents with persistent memory that learn over time.
|
|
9
9
|
|
|
@@ -43,8 +43,11 @@ const result2 = await prompt('Run: echo hello', agentId);
|
|
|
43
43
|
```typescript
|
|
44
44
|
import { createAgent, resumeSession } from '@letta-ai/letta-code-sdk';
|
|
45
45
|
|
|
46
|
-
// Create an agent (has default conversation)
|
|
47
|
-
const agentId = await createAgent(
|
|
46
|
+
// Create an agent with custom memory (has default conversation)
|
|
47
|
+
const agentId = await createAgent({
|
|
48
|
+
memory: ['persona'],
|
|
49
|
+
persona: 'You are a helpful coding assistant for TypeScript projects'
|
|
50
|
+
});
|
|
48
51
|
|
|
49
52
|
// Resume the default conversation
|
|
50
53
|
await using session = resumeSession(agentId);
|
|
@@ -156,62 +159,7 @@ createSession(agentId, {
|
|
|
156
159
|
- `codex` - Basic Codex
|
|
157
160
|
- `gemini` - Basic Gemini
|
|
158
161
|
|
|
159
|
-
### Memory Blocks
|
|
160
|
-
|
|
161
|
-
Configure which memory blocks the session uses:
|
|
162
|
-
|
|
163
|
-
```typescript
|
|
164
|
-
// Use default blocks (persona, human, project)
|
|
165
|
-
createSession(agentId);
|
|
166
|
-
|
|
167
|
-
// Use specific preset blocks
|
|
168
|
-
createSession(agentId, {
|
|
169
|
-
memory: ['project', 'persona'] // Only these blocks
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
// Use custom blocks
|
|
173
|
-
createSession(agentId, {
|
|
174
|
-
memory: [
|
|
175
|
-
{ label: 'context', value: 'API documentation for Acme Corp...' },
|
|
176
|
-
{ label: 'rules', value: 'Always use TypeScript. Prefer functional patterns.' }
|
|
177
|
-
]
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
// No optional blocks (only core skills blocks)
|
|
181
|
-
createSession(agentId, {
|
|
182
|
-
memory: []
|
|
183
|
-
});
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
### Convenience Props
|
|
187
|
-
|
|
188
|
-
Quickly customize common memory blocks:
|
|
189
|
-
|
|
190
|
-
```typescript
|
|
191
|
-
createSession(agentId, {
|
|
192
|
-
persona: 'You are a senior Python developer who writes clean, tested code.',
|
|
193
|
-
human: 'Name: Alice. Prefers concise responses.',
|
|
194
|
-
project: 'FastAPI backend for a todo app using PostgreSQL.'
|
|
195
|
-
});
|
|
196
|
-
```
|
|
197
162
|
|
|
198
|
-
### Tool Execution
|
|
199
|
-
|
|
200
|
-
Execute tools with automatic permission handling:
|
|
201
|
-
|
|
202
|
-
```typescript
|
|
203
|
-
import { createAgent, createSession } from '@letta-ai/letta-code-sdk';
|
|
204
|
-
|
|
205
|
-
// Create agent and run commands
|
|
206
|
-
const agentId = await createAgent();
|
|
207
|
-
const session = createSession(agentId, {
|
|
208
|
-
allowedTools: ['Glob', 'Bash'],
|
|
209
|
-
permissionMode: 'bypassPermissions',
|
|
210
|
-
cwd: '/path/to/project'
|
|
211
|
-
});
|
|
212
|
-
await session.send('List all TypeScript files');
|
|
213
|
-
for await (const msg of session.stream()) { /* ... */ }
|
|
214
|
-
```
|
|
215
163
|
|
|
216
164
|
## API Reference
|
|
217
165
|
|
|
@@ -219,12 +167,10 @@ for await (const msg of session.stream()) { /* ... */ }
|
|
|
219
167
|
|
|
220
168
|
| Function | Description |
|
|
221
169
|
|----------|-------------|
|
|
222
|
-
| `createAgent()` | Create new agent with default
|
|
223
|
-
| `createSession()` | New conversation on
|
|
224
|
-
| `createSession(agentId)` | New conversation on specified agent |
|
|
170
|
+
| `createAgent(options?)` | Create new agent with custom memory/prompt. No options = blank agent with default memory blocks. Returns `agentId` |
|
|
171
|
+
| `createSession(agentId?, options?)` | New conversation on specified agent. No agentId = uses LRU agent (or creates "Memo" if none exists) |
|
|
225
172
|
| `resumeSession(id, options?)` | Resume session - pass `agent-xxx` for default conv, `conv-xxx` for specific conv |
|
|
226
|
-
| `prompt(message)` | One-shot query with default agent (like `letta -p`) |
|
|
227
|
-
| `prompt(message, agentId)` | One-shot query with specific agent |
|
|
173
|
+
| `prompt(message, agentId?)` | One-shot query with default/specified agent (like `letta -p`) |
|
|
228
174
|
|
|
229
175
|
### Session
|
|
230
176
|
|
|
@@ -239,24 +185,38 @@ for await (const msg of session.stream()) { /* ... */ }
|
|
|
239
185
|
|
|
240
186
|
### Options
|
|
241
187
|
|
|
188
|
+
**CreateAgentOptions** (for `createAgent()` - full control):
|
|
189
|
+
|
|
242
190
|
```typescript
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
191
|
+
// Create blank agent
|
|
192
|
+
await createAgent();
|
|
193
|
+
|
|
194
|
+
// Create agent with custom memory and system prompt
|
|
195
|
+
await createAgent({
|
|
196
|
+
model: 'claude-sonnet-4',
|
|
197
|
+
systemPrompt: 'You are a helpful Python expert.',
|
|
198
|
+
memory: [
|
|
199
|
+
{ label: 'persona', value: 'You are a senior Python developer' },
|
|
200
|
+
{ label: 'project', value: 'FastAPI backend for a todo app' }
|
|
201
|
+
]
|
|
202
|
+
});
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**CreateSessionOptions** (for `createSession()` / `resumeSession()` - runtime options):
|
|
206
|
+
|
|
207
|
+
```typescript
|
|
208
|
+
// Start session with permissions
|
|
209
|
+
createSession(agentId, {
|
|
210
|
+
permissionMode: 'bypassPermissions',
|
|
211
|
+
allowedTools: ['Bash', 'Glob'],
|
|
212
|
+
cwd: '/path/to/project'
|
|
213
|
+
});
|
|
258
214
|
```
|
|
259
215
|
|
|
216
|
+
**Available system prompt presets:**
|
|
217
|
+
- `default` / `letta-claude`, `letta-codex`, `letta-gemini` - Full Letta Code prompts
|
|
218
|
+
- `claude`, `codex`, `gemini` - Basic (no skills/memory instructions)
|
|
219
|
+
|
|
260
220
|
### Message Types
|
|
261
221
|
|
|
262
222
|
```typescript
|
package/dist/index.d.ts
CHANGED
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
* ```
|
|
29
29
|
*/
|
|
30
30
|
import { Session } from "./session.js";
|
|
31
|
-
import type {
|
|
32
|
-
export type {
|
|
31
|
+
import type { CreateSessionOptions, CreateAgentOptions, SDKResultMessage } from "./types.js";
|
|
32
|
+
export type { CreateSessionOptions, CreateAgentOptions, SDKMessage, SDKInitMessage, SDKAssistantMessage, SDKToolCallMessage, SDKToolResultMessage, SDKReasoningMessage, SDKResultMessage, SDKStreamEventMessage, PermissionMode, CanUseToolCallback, CanUseToolResponse, CanUseToolResponseAllow, CanUseToolResponseDeny, TextContent, ImageContent, MessageContentItem, SendMessage, } from "./types.js";
|
|
33
33
|
export { Session } from "./session.js";
|
|
34
34
|
/**
|
|
35
35
|
* Create a new agent with a default conversation.
|
|
@@ -37,13 +37,21 @@ export { Session } from "./session.js";
|
|
|
37
37
|
*
|
|
38
38
|
* @example
|
|
39
39
|
* ```typescript
|
|
40
|
+
* // Create agent with default settings
|
|
40
41
|
* const agentId = await createAgent();
|
|
41
42
|
*
|
|
43
|
+
* // Create agent with custom memory
|
|
44
|
+
* const agentId = await createAgent({
|
|
45
|
+
* memory: ['persona', 'project'],
|
|
46
|
+
* persona: 'You are a helpful coding assistant',
|
|
47
|
+
* model: 'claude-sonnet-4'
|
|
48
|
+
* });
|
|
49
|
+
*
|
|
42
50
|
* // Then resume the default conversation:
|
|
43
51
|
* const session = resumeSession(agentId);
|
|
44
52
|
* ```
|
|
45
53
|
*/
|
|
46
|
-
export declare function createAgent(): Promise<string>;
|
|
54
|
+
export declare function createAgent(options?: CreateAgentOptions): Promise<string>;
|
|
47
55
|
/**
|
|
48
56
|
* Create a new conversation (session).
|
|
49
57
|
*
|
|
@@ -59,7 +67,7 @@ export declare function createAgent(): Promise<string>;
|
|
|
59
67
|
* await using session = createSession(agentId);
|
|
60
68
|
* ```
|
|
61
69
|
*/
|
|
62
|
-
export declare function createSession(agentId?: string, options?:
|
|
70
|
+
export declare function createSession(agentId?: string, options?: CreateSessionOptions): Session;
|
|
63
71
|
/**
|
|
64
72
|
* Resume an existing session.
|
|
65
73
|
*
|
|
@@ -78,7 +86,7 @@ export declare function createSession(agentId?: string, options?: SessionOptions
|
|
|
78
86
|
* await using session = resumeSession('conv-xxx');
|
|
79
87
|
* ```
|
|
80
88
|
*/
|
|
81
|
-
export declare function resumeSession(id: string, options?:
|
|
89
|
+
export declare function resumeSession(id: string, options?: CreateSessionOptions): Session;
|
|
82
90
|
/**
|
|
83
91
|
* One-shot prompt convenience function.
|
|
84
92
|
*
|
|
@@ -92,4 +100,44 @@ export declare function resumeSession(id: string, options?: SessionOptions): Ses
|
|
|
92
100
|
* ```
|
|
93
101
|
*/
|
|
94
102
|
export declare function prompt(message: string, agentId?: string): Promise<SDKResultMessage>;
|
|
103
|
+
import type { ImageContent } from "./types.js";
|
|
104
|
+
/**
|
|
105
|
+
* Create image content from a file path.
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```typescript
|
|
109
|
+
* await session.send([
|
|
110
|
+
* { type: "text", text: "What's in this image?" },
|
|
111
|
+
* imageFromFile("./screenshot.png")
|
|
112
|
+
* ]);
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export declare function imageFromFile(filePath: string): ImageContent;
|
|
116
|
+
/**
|
|
117
|
+
* Create image content from base64 data.
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```typescript
|
|
121
|
+
* const base64 = fs.readFileSync("image.png").toString("base64");
|
|
122
|
+
* await session.send([
|
|
123
|
+
* { type: "text", text: "Describe this" },
|
|
124
|
+
* imageFromBase64(base64, "image/png")
|
|
125
|
+
* ]);
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
export declare function imageFromBase64(data: string, media_type?: ImageContent["source"]["media_type"]): ImageContent;
|
|
129
|
+
/**
|
|
130
|
+
* Create image content from a URL.
|
|
131
|
+
* Fetches the image and converts to base64.
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* ```typescript
|
|
135
|
+
* const img = await imageFromURL("https://example.com/image.png");
|
|
136
|
+
* await session.send([
|
|
137
|
+
* { type: "text", text: "What's this?" },
|
|
138
|
+
* img
|
|
139
|
+
* ]);
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
export declare function imageFromURL(url: string): Promise<ImageContent>;
|
|
95
143
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAI7F,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,EAEtB,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAMnF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAO3F;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAOT;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CA+B3B;AAOD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAa5D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAe,GAC7D,YAAY,CAKd;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAqBrE"}
|
package/dist/index.js
CHANGED
|
@@ -137,15 +137,6 @@ class SubprocessTransport {
|
|
|
137
137
|
"--input-format",
|
|
138
138
|
"stream-json"
|
|
139
139
|
];
|
|
140
|
-
if (this.options.conversationId && this.options.conversationId !== "default" && this.options.agentId) {
|
|
141
|
-
throw new Error("Cannot use both 'conversationId' and 'agentId'. " + "When resuming a conversation, the agent is derived automatically.");
|
|
142
|
-
}
|
|
143
|
-
if (this.options.conversationId === "default" && !this.options.agentId) {
|
|
144
|
-
throw new Error("conversationId 'default' requires agentId. " + "Use resumeSession(agentId, { defaultConversation: true }) instead.");
|
|
145
|
-
}
|
|
146
|
-
if (this.options.defaultConversation && !this.options.agentId) {
|
|
147
|
-
throw new Error("'defaultConversation' requires agentId. " + "Use resumeSession(agentId, { defaultConversation: true }).");
|
|
148
|
-
}
|
|
149
140
|
if (this.options.conversationId) {
|
|
150
141
|
args.push("--conversation", this.options.conversationId);
|
|
151
142
|
} else if (this.options.agentId) {
|
|
@@ -165,7 +156,20 @@ class SubprocessTransport {
|
|
|
165
156
|
}
|
|
166
157
|
if (this.options.systemPrompt !== undefined) {
|
|
167
158
|
if (typeof this.options.systemPrompt === "string") {
|
|
168
|
-
|
|
159
|
+
const validPresets = [
|
|
160
|
+
"default",
|
|
161
|
+
"letta-claude",
|
|
162
|
+
"letta-codex",
|
|
163
|
+
"letta-gemini",
|
|
164
|
+
"claude",
|
|
165
|
+
"codex",
|
|
166
|
+
"gemini"
|
|
167
|
+
];
|
|
168
|
+
if (validPresets.includes(this.options.systemPrompt)) {
|
|
169
|
+
args.push("--system", this.options.systemPrompt);
|
|
170
|
+
} else {
|
|
171
|
+
args.push("--system-custom", this.options.systemPrompt);
|
|
172
|
+
}
|
|
169
173
|
} else {
|
|
170
174
|
args.push("--system", this.options.systemPrompt.preset);
|
|
171
175
|
if (this.options.systemPrompt.append) {
|
|
@@ -188,11 +192,13 @@ class SubprocessTransport {
|
|
|
188
192
|
memoryBlocksJson.push(item);
|
|
189
193
|
}
|
|
190
194
|
}
|
|
191
|
-
if (presetNames.length > 0) {
|
|
192
|
-
args.push("--init-blocks", presetNames.join(","));
|
|
193
|
-
}
|
|
194
195
|
if (memoryBlocksJson.length > 0) {
|
|
195
196
|
args.push("--memory-blocks", JSON.stringify(memoryBlocksJson));
|
|
197
|
+
if (presetNames.length > 0) {
|
|
198
|
+
console.warn("[letta-code-sdk] Using custom memory blocks. " + `Preset blocks are ignored when custom blocks are provided: ${presetNames.join(", ")}`);
|
|
199
|
+
}
|
|
200
|
+
} else if (presetNames.length > 0) {
|
|
201
|
+
args.push("--init-blocks", presetNames.join(","));
|
|
196
202
|
}
|
|
197
203
|
}
|
|
198
204
|
}
|
|
@@ -203,9 +209,6 @@ class SubprocessTransport {
|
|
|
203
209
|
if (this.options.human !== undefined) {
|
|
204
210
|
args.push("--block-value", `human=${this.options.human}`);
|
|
205
211
|
}
|
|
206
|
-
if (this.options.project !== undefined) {
|
|
207
|
-
args.push("--block-value", `project=${this.options.project}`);
|
|
208
|
-
}
|
|
209
212
|
}
|
|
210
213
|
if (this.options.permissionMode === "bypassPermissions") {
|
|
211
214
|
args.push("--yolo");
|
|
@@ -248,54 +251,6 @@ class SubprocessTransport {
|
|
|
248
251
|
}
|
|
249
252
|
}
|
|
250
253
|
|
|
251
|
-
// src/validation.ts
|
|
252
|
-
function getBlockLabels(memory) {
|
|
253
|
-
return memory.map((item) => {
|
|
254
|
-
if (typeof item === "string")
|
|
255
|
-
return item;
|
|
256
|
-
if ("label" in item)
|
|
257
|
-
return item.label;
|
|
258
|
-
return null;
|
|
259
|
-
}).filter((label) => label !== null);
|
|
260
|
-
}
|
|
261
|
-
function validateSessionOptions(options) {
|
|
262
|
-
if (options.memory !== undefined) {
|
|
263
|
-
const blockLabels = getBlockLabels(options.memory);
|
|
264
|
-
if (options.persona !== undefined && !blockLabels.includes("persona")) {
|
|
265
|
-
throw new Error("Cannot set 'persona' value - block not included in 'memory'. " + "Either add 'persona' to memory array or remove the persona option.");
|
|
266
|
-
}
|
|
267
|
-
if (options.human !== undefined && !blockLabels.includes("human")) {
|
|
268
|
-
throw new Error("Cannot set 'human' value - block not included in 'memory'. " + "Either add 'human' to memory array or remove the human option.");
|
|
269
|
-
}
|
|
270
|
-
if (options.project !== undefined && !blockLabels.includes("project")) {
|
|
271
|
-
throw new Error("Cannot set 'project' value - block not included in 'memory'. " + "Either add 'project' to memory array or remove the project option.");
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
if (options.systemPrompt !== undefined && typeof options.systemPrompt === "object") {
|
|
275
|
-
const validPresets = [
|
|
276
|
-
"default",
|
|
277
|
-
"letta-claude",
|
|
278
|
-
"letta-codex",
|
|
279
|
-
"letta-gemini",
|
|
280
|
-
"claude",
|
|
281
|
-
"codex",
|
|
282
|
-
"gemini"
|
|
283
|
-
];
|
|
284
|
-
if (!validPresets.includes(options.systemPrompt.preset)) {
|
|
285
|
-
throw new Error(`Invalid system prompt preset '${options.systemPrompt.preset}'. ` + `Valid presets: ${validPresets.join(", ")}`);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
if (options.conversationId && options.newConversation) {
|
|
289
|
-
throw new Error("Cannot use both 'conversationId' and 'newConversation'. " + "Use conversationId to resume a specific conversation, or newConversation to create a new one.");
|
|
290
|
-
}
|
|
291
|
-
if (options.defaultConversation && options.conversationId) {
|
|
292
|
-
throw new Error("Cannot use both 'defaultConversation' and 'conversationId'. " + "Use defaultConversation with agentId, or conversationId alone.");
|
|
293
|
-
}
|
|
294
|
-
if (options.defaultConversation && options.newConversation) {
|
|
295
|
-
throw new Error("Cannot use both 'defaultConversation' and 'newConversation'.");
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
|
|
299
254
|
// src/session.ts
|
|
300
255
|
class Session {
|
|
301
256
|
options;
|
|
@@ -306,7 +261,6 @@ class Session {
|
|
|
306
261
|
initialized = false;
|
|
307
262
|
constructor(options = {}) {
|
|
308
263
|
this.options = options;
|
|
309
|
-
validateSessionOptions(options);
|
|
310
264
|
this.transport = new SubprocessTransport(options);
|
|
311
265
|
}
|
|
312
266
|
async initialize() {
|
|
@@ -514,14 +468,74 @@ class Session {
|
|
|
514
468
|
}
|
|
515
469
|
}
|
|
516
470
|
|
|
471
|
+
// src/validation.ts
|
|
472
|
+
function getBlockLabels(memory) {
|
|
473
|
+
return memory.map((item) => {
|
|
474
|
+
if (typeof item === "string")
|
|
475
|
+
return item;
|
|
476
|
+
if ("label" in item)
|
|
477
|
+
return item.label;
|
|
478
|
+
return null;
|
|
479
|
+
}).filter((label) => label !== null);
|
|
480
|
+
}
|
|
481
|
+
function validateSystemPromptPreset(preset) {
|
|
482
|
+
const validPresets = [
|
|
483
|
+
"default",
|
|
484
|
+
"letta-claude",
|
|
485
|
+
"letta-codex",
|
|
486
|
+
"letta-gemini",
|
|
487
|
+
"claude",
|
|
488
|
+
"codex",
|
|
489
|
+
"gemini"
|
|
490
|
+
];
|
|
491
|
+
if (!validPresets.includes(preset)) {
|
|
492
|
+
throw new Error(`Invalid system prompt preset '${preset}'. ` + `Valid presets: ${validPresets.join(", ")}`);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
function validateCreateSessionOptions(options) {
|
|
496
|
+
if (options.systemPrompt !== undefined) {
|
|
497
|
+
validateSystemPromptPreset(options.systemPrompt);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
function validateCreateAgentOptions(options) {
|
|
501
|
+
if (options.memory !== undefined) {
|
|
502
|
+
const blockLabels = getBlockLabels(options.memory);
|
|
503
|
+
if (options.persona !== undefined && !blockLabels.includes("persona")) {
|
|
504
|
+
throw new Error("Cannot set 'persona' value - block not included in 'memory'. " + "Either add 'persona' to memory array or remove the persona option.");
|
|
505
|
+
}
|
|
506
|
+
if (options.human !== undefined && !blockLabels.includes("human")) {
|
|
507
|
+
throw new Error("Cannot set 'human' value - block not included in 'memory'. " + "Either add 'human' to memory array or remove the human option.");
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
if (options.systemPrompt !== undefined && typeof options.systemPrompt === "object") {
|
|
511
|
+
validateSystemPromptPreset(options.systemPrompt.preset);
|
|
512
|
+
} else if (options.systemPrompt !== undefined && typeof options.systemPrompt === "string") {
|
|
513
|
+
const validPresets = [
|
|
514
|
+
"default",
|
|
515
|
+
"letta-claude",
|
|
516
|
+
"letta-codex",
|
|
517
|
+
"letta-gemini",
|
|
518
|
+
"claude",
|
|
519
|
+
"codex",
|
|
520
|
+
"gemini"
|
|
521
|
+
];
|
|
522
|
+
if (validPresets.includes(options.systemPrompt)) {
|
|
523
|
+
validateSystemPromptPreset(options.systemPrompt);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
517
528
|
// src/index.ts
|
|
518
|
-
|
|
519
|
-
|
|
529
|
+
import { readFileSync } from "node:fs";
|
|
530
|
+
async function createAgent(options = {}) {
|
|
531
|
+
validateCreateAgentOptions(options);
|
|
532
|
+
const session = new Session({ ...options, createOnly: true });
|
|
520
533
|
const initMsg = await session.initialize();
|
|
521
534
|
session.close();
|
|
522
535
|
return initMsg.agentId;
|
|
523
536
|
}
|
|
524
537
|
function createSession(agentId, options = {}) {
|
|
538
|
+
validateCreateSessionOptions(options);
|
|
525
539
|
if (agentId) {
|
|
526
540
|
return new Session({ ...options, agentId, newConversation: true });
|
|
527
541
|
} else {
|
|
@@ -529,6 +543,7 @@ function createSession(agentId, options = {}) {
|
|
|
529
543
|
}
|
|
530
544
|
}
|
|
531
545
|
function resumeSession(id, options = {}) {
|
|
546
|
+
validateCreateSessionOptions(options);
|
|
532
547
|
if (id.startsWith("conv-")) {
|
|
533
548
|
return new Session({ ...options, conversationId: id });
|
|
534
549
|
} else {
|
|
@@ -560,12 +575,48 @@ async function prompt(message, agentId) {
|
|
|
560
575
|
session.close();
|
|
561
576
|
}
|
|
562
577
|
}
|
|
578
|
+
function imageFromFile(filePath) {
|
|
579
|
+
const data = readFileSync(filePath).toString("base64");
|
|
580
|
+
const ext = filePath.toLowerCase();
|
|
581
|
+
const media_type = ext.endsWith(".png") ? "image/png" : ext.endsWith(".gif") ? "image/gif" : ext.endsWith(".webp") ? "image/webp" : "image/jpeg";
|
|
582
|
+
return {
|
|
583
|
+
type: "image",
|
|
584
|
+
source: { type: "base64", media_type, data }
|
|
585
|
+
};
|
|
586
|
+
}
|
|
587
|
+
function imageFromBase64(data, media_type = "image/png") {
|
|
588
|
+
return {
|
|
589
|
+
type: "image",
|
|
590
|
+
source: { type: "base64", media_type, data }
|
|
591
|
+
};
|
|
592
|
+
}
|
|
593
|
+
async function imageFromURL(url) {
|
|
594
|
+
const response = await fetch(url);
|
|
595
|
+
const buffer = await response.arrayBuffer();
|
|
596
|
+
const data = Buffer.from(buffer).toString("base64");
|
|
597
|
+
const contentType = response.headers.get("content-type");
|
|
598
|
+
let media_type = "image/png";
|
|
599
|
+
if (contentType?.includes("jpeg") || contentType?.includes("jpg") || url.match(/\.jpe?g$/i)) {
|
|
600
|
+
media_type = "image/jpeg";
|
|
601
|
+
} else if (contentType?.includes("gif") || url.endsWith(".gif")) {
|
|
602
|
+
media_type = "image/gif";
|
|
603
|
+
} else if (contentType?.includes("webp") || url.endsWith(".webp")) {
|
|
604
|
+
media_type = "image/webp";
|
|
605
|
+
}
|
|
606
|
+
return {
|
|
607
|
+
type: "image",
|
|
608
|
+
source: { type: "base64", media_type, data }
|
|
609
|
+
};
|
|
610
|
+
}
|
|
563
611
|
export {
|
|
564
612
|
resumeSession,
|
|
565
613
|
prompt,
|
|
614
|
+
imageFromURL,
|
|
615
|
+
imageFromFile,
|
|
616
|
+
imageFromBase64,
|
|
566
617
|
createSession,
|
|
567
618
|
createAgent,
|
|
568
619
|
Session
|
|
569
620
|
};
|
|
570
621
|
|
|
571
|
-
//# debugId=
|
|
622
|
+
//# debugId=D4FF4806F62B360664756E2164756E21
|
package/dist/index.js.map
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/transport.ts", "../src/
|
|
3
|
+
"sources": ["../src/transport.ts", "../src/session.ts", "../src/validation.ts", "../src/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * SubprocessTransport\n *\n * Spawns the Letta Code CLI and communicates via stdin/stdout JSON streams.\n */\n\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { createInterface, type Interface } from \"node:readline\";\nimport type { SessionOptions, WireMessage } from \"./types.js\";\n\nexport class SubprocessTransport {\n private process: ChildProcess | null = null;\n private stdout: Interface | null = null;\n private messageQueue: WireMessage[] = [];\n private messageResolvers: Array<(msg: WireMessage) => void> = [];\n private closed = false;\n private agentId?: string;\n\n constructor(\n private options: SessionOptions & { agentId?: string } = {}\n ) {}\n\n /**\n * Start the CLI subprocess\n */\n async connect(): Promise<void> {\n const args = this.buildArgs();\n\n // Find the CLI - use the installed letta-code package\n const cliPath = await this.findCli();\n if (process.env.DEBUG) {\n console.log(\"[letta-code-sdk] Using CLI:\", cliPath);\n console.log(\"[letta-code-sdk] Args:\", args.join(\" \"));\n }\n\n this.process = spawn(\"node\", [cliPath, ...args], {\n cwd: this.options.cwd || process.cwd(),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env },\n });\n\n if (!this.process.stdout || !this.process.stdin) {\n throw new Error(\"Failed to create subprocess pipes\");\n }\n\n // Set up stdout reading\n this.stdout = createInterface({\n input: this.process.stdout,\n crlfDelay: Infinity,\n });\n\n this.stdout.on(\"line\", (line) => {\n if (!line.trim()) return;\n try {\n const msg = JSON.parse(line) as WireMessage;\n this.handleMessage(msg);\n } catch {\n // Ignore non-JSON lines (stderr leakage, etc.)\n }\n });\n\n // Log stderr for debugging (CLI errors, auth failures, etc.)\n if (this.process.stderr) {\n this.process.stderr.on(\"data\", (data: Buffer) => {\n const msg = data.toString().trim();\n if (msg) {\n console.error(\"[letta-code-sdk] CLI stderr:\", msg);\n }\n });\n }\n\n // Handle process exit\n this.process.on(\"close\", (code) => {\n this.closed = true;\n if (code !== 0 && code !== null) {\n console.error(`[letta-code-sdk] CLI process exited with code ${code}`);\n }\n });\n\n this.process.on(\"error\", (err) => {\n console.error(\"[letta-code-sdk] CLI process error:\", err);\n this.closed = true;\n });\n }\n\n /**\n * Send a message to the CLI via stdin\n */\n async write(data: object): Promise<void> {\n if (!this.process?.stdin || this.closed) {\n throw new Error(\"Transport not connected\");\n }\n this.process.stdin.write(JSON.stringify(data) + \"\\n\");\n }\n\n /**\n * Read the next message from the CLI\n */\n async read(): Promise<WireMessage | null> {\n // Return queued message if available\n if (this.messageQueue.length > 0) {\n return this.messageQueue.shift()!;\n }\n\n // If closed, no more messages\n if (this.closed) {\n return null;\n }\n\n // Wait for next message\n return new Promise((resolve) => {\n this.messageResolvers.push(resolve);\n });\n }\n\n /**\n * Async iterator for messages\n */\n async *messages(): AsyncGenerator<WireMessage> {\n while (true) {\n const msg = await this.read();\n if (msg === null) break;\n yield msg;\n }\n }\n\n /**\n * Close the transport\n */\n close(): void {\n if (this.process) {\n this.process.stdin?.end();\n this.process.kill();\n this.process = null;\n }\n this.closed = true;\n\n // Resolve any pending readers with null\n for (const resolve of this.messageResolvers) {\n resolve(null as unknown as WireMessage);\n }\n this.messageResolvers = [];\n }\n\n get isClosed(): boolean {\n return this.closed;\n }\n\n private handleMessage(msg: WireMessage): void {\n // Track agent_id from init message\n if (msg.type === \"system\" && \"subtype\" in msg && msg.subtype === \"init\") {\n this.agentId = (msg as unknown as { agent_id: string }).agent_id;\n }\n\n // If someone is waiting for a message, give it to them\n if (this.messageResolvers.length > 0) {\n const resolve = this.messageResolvers.shift()!;\n resolve(msg);\n } else {\n // Otherwise queue it\n this.messageQueue.push(msg);\n }\n }\n\n private buildArgs(): string[] {\n const args: string[] = [\n \"--output-format\",\n \"stream-json\",\n \"--input-format\",\n \"stream-json\",\n ];\n\n // Validate conversation + agent combinations\n // (These require agentId context, so can't be in validateSessionOptions)\n \n // conversationId (non-default) cannot be used with agentId\n if (this.options.conversationId && \n this.options.conversationId !== \"default\" && \n this.options.agentId) {\n throw new Error(\n \"Cannot use both 'conversationId' and 'agentId'. \" +\n \"When resuming a conversation, the agent is derived automatically.\"\n );\n }\n\n // conversationId: \"default\" requires agentId\n if (this.options.conversationId === \"default\" && !this.options.agentId) {\n throw new Error(\n \"conversationId 'default' requires agentId. \" +\n \"Use resumeSession(agentId, { defaultConversation: true }) instead.\"\n );\n }\n\n // defaultConversation requires agentId\n if (this.options.defaultConversation && !this.options.agentId) {\n throw new Error(\n \"'defaultConversation' requires agentId. \" +\n \"Use resumeSession(agentId, { defaultConversation: true }).\"\n );\n }\n\n // Conversation and agent handling\n if (this.options.conversationId) {\n // Resume specific conversation (derives agent automatically)\n args.push(\"--conversation\", this.options.conversationId);\n } else if (this.options.agentId) {\n // Resume existing agent\n args.push(\"--agent\", this.options.agentId);\n if (this.options.newConversation) {\n // Create new conversation on this agent\n args.push(\"--new\");\n } else if (this.options.defaultConversation) {\n // Use agent's default conversation explicitly\n args.push(\"--default\");\n }\n } else if (this.options.promptMode) {\n // prompt() without agentId: no agent flags\n // Headless will use LRU agent or create Memo (like `letta -p \"msg\"`)\n } else if (this.options.createOnly) {\n // createAgent() - explicitly create new agent\n args.push(\"--new-agent\");\n } else if (this.options.newConversation) {\n // createSession() without agentId - LRU agent + new conversation\n args.push(\"--new\");\n }\n // else: no agent flags = default behavior (LRU agent, default conversation)\n\n // Model\n if (this.options.model) {\n args.push(\"-m\", this.options.model);\n }\n\n // System prompt configuration\n if (this.options.systemPrompt !== undefined) {\n if (typeof this.options.systemPrompt === \"string\") {\n // Raw string → --system-custom\n args.push(\"--system-custom\", this.options.systemPrompt);\n } else {\n // Preset object → --system (+ optional --system-append)\n args.push(\"--system\", this.options.systemPrompt.preset);\n if (this.options.systemPrompt.append) {\n args.push(\"--system-append\", this.options.systemPrompt.append);\n }\n }\n }\n\n // Memory blocks (only for new agents)\n if (this.options.memory !== undefined && !this.options.agentId) {\n if (this.options.memory.length === 0) {\n // Empty array → no memory blocks (just core)\n args.push(\"--init-blocks\", \"\");\n } else {\n // Separate preset names from custom/reference blocks\n const presetNames: string[] = [];\n const memoryBlocksJson: Array<\n | { label: string; value: string }\n | { blockId: string }\n > = [];\n\n for (const item of this.options.memory) {\n if (typeof item === \"string\") {\n // Preset name\n presetNames.push(item);\n } else if (\"blockId\" in item) {\n // Block reference - pass to --memory-blocks\n memoryBlocksJson.push(item as { blockId: string });\n } else {\n // CreateBlock\n memoryBlocksJson.push(item as { label: string; value: string });\n }\n }\n\n // Add preset names via --init-blocks\n if (presetNames.length > 0) {\n args.push(\"--init-blocks\", presetNames.join(\",\"));\n }\n\n // Add custom blocks and block references via --memory-blocks\n if (memoryBlocksJson.length > 0) {\n args.push(\"--memory-blocks\", JSON.stringify(memoryBlocksJson));\n }\n }\n }\n\n // Convenience props for block values (only for new agents)\n if (!this.options.agentId) {\n if (this.options.persona !== undefined) {\n args.push(\"--block-value\", `persona=${this.options.persona}`);\n }\n if (this.options.human !== undefined) {\n args.push(\"--block-value\", `human=${this.options.human}`);\n }\n if (this.options.project !== undefined) {\n args.push(\"--block-value\", `project=${this.options.project}`);\n }\n }\n\n // Permission mode\n if (this.options.permissionMode === \"bypassPermissions\") {\n args.push(\"--yolo\");\n } else if (this.options.permissionMode === \"acceptEdits\") {\n args.push(\"--accept-edits\");\n }\n\n // Allowed tools\n if (this.options.allowedTools) {\n args.push(\"--allowedTools\", this.options.allowedTools.join(\",\"));\n }\n\n return args;\n }\n\n private async findCli(): Promise<string> {\n // Try multiple resolution strategies\n const { existsSync } = await import(\"node:fs\");\n const { dirname, join } = await import(\"node:path\");\n const { fileURLToPath } = await import(\"node:url\");\n\n // Strategy 1: Check LETTA_CLI_PATH env var\n if (process.env.LETTA_CLI_PATH && existsSync(process.env.LETTA_CLI_PATH)) {\n return process.env.LETTA_CLI_PATH;\n }\n\n // Strategy 2: Try to resolve from node_modules\n // Note: resolve the package main export (not /letta.js subpath) because\n // the package.json \"exports\" field doesn't expose the subpath directly.\n try {\n const { createRequire } = await import(\"node:module\");\n const require = createRequire(import.meta.url);\n const resolved = require.resolve(\"@letta-ai/letta-code\");\n if (existsSync(resolved)) {\n return resolved;\n }\n } catch {\n // Continue to next strategy\n }\n\n // Strategy 3: Check relative to this file (for local file: deps)\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const localPaths = [\n join(__dirname, \"../../@letta-ai/letta-code/letta.js\"),\n join(__dirname, \"../../../letta-code-prod/letta.js\"),\n join(__dirname, \"../../../letta-code/letta.js\"),\n ];\n\n for (const p of localPaths) {\n if (existsSync(p)) {\n return p;\n }\n }\n\n throw new Error(\n \"Letta Code CLI not found. Set LETTA_CLI_PATH or install @letta-ai/letta-code.\"\n );\n }\n}\n",
|
|
6
|
-
"/**\n * SDK Validation\n *\n * Validates SessionOptions before spawning the CLI.\n */\n\nimport type { SessionOptions, MemoryItem, CreateBlock } from \"./types.js\";\n\n/**\n * Extract block labels from memory items.\n */\nfunction getBlockLabels(memory: MemoryItem[]): string[] {\n return memory\n .map((item) => {\n if (typeof item === \"string\") return item; // preset name\n if (\"label\" in item) return (item as CreateBlock).label; // CreateBlock\n return null; // blockId - no label to check\n })\n .filter((label): label is string => label !== null);\n}\n\n/**\n * Validate SessionOptions before spawning CLI.\n * Throws an error if validation fails.\n */\nexport function validateSessionOptions(options: SessionOptions): void {\n // If memory is specified, validate that convenience props match included blocks\n if (options.memory !== undefined) {\n const blockLabels = getBlockLabels(options.memory);\n\n if (options.persona !== undefined && !blockLabels.includes(\"persona\")) {\n throw new Error(\n \"Cannot set 'persona' value - block not included in 'memory'. \" +\n \"Either add 'persona' to memory array or remove the persona option.\"\n );\n }\n\n if (options.human !== undefined && !blockLabels.includes(\"human\")) {\n throw new Error(\n \"Cannot set 'human' value - block not included in 'memory'. \" +\n \"Either add 'human' to memory array or remove the human option.\"\n );\n }\n\n if (options.project !== undefined && !blockLabels.includes(\"project\")) {\n throw new Error(\n \"Cannot set 'project' value - block not included in 'memory'. \" +\n \"Either add 'project' to memory array or remove the project option.\"\n );\n }\n }\n\n // Validate systemPrompt preset if provided\n if (\n options.systemPrompt !== undefined &&\n typeof options.systemPrompt === \"object\"\n ) {\n const validPresets = [\n \"default\",\n \"letta-claude\",\n \"letta-codex\",\n \"letta-gemini\",\n \"claude\",\n \"codex\",\n \"gemini\",\n ];\n if (!validPresets.includes(options.systemPrompt.preset)) {\n throw new Error(\n `Invalid system prompt preset '${options.systemPrompt.preset}'. ` +\n `Valid presets: ${validPresets.join(\", \")}`\n );\n }\n }\n\n // Validate conversation options\n if (options.conversationId && options.newConversation) {\n throw new Error(\n \"Cannot use both 'conversationId' and 'newConversation'. \" +\n \"Use conversationId to resume a specific conversation, or newConversation to create a new one.\"\n );\n }\n\n if (options.defaultConversation && options.conversationId) {\n throw new Error(\n \"Cannot use both 'defaultConversation' and 'conversationId'. \" +\n \"Use defaultConversation with agentId, or conversationId alone.\"\n );\n }\n\n if (options.defaultConversation && options.newConversation) {\n throw new Error(\n \"Cannot use both 'defaultConversation' and 'newConversation'.\"\n );\n }\n\n // Note: Validations that require agentId context happen in transport.ts buildArgs()\n // because agentId is passed separately to resumeSession(), not in SessionOptions\n}\n",
|
|
7
|
-
"/**\n * Session\n *\n * Represents a conversation session with a Letta agent.\n * Implements the V2 API pattern: send() / receive()\n */\n\nimport { SubprocessTransport } from \"./transport.js\";\nimport type {\n SessionOptions,\n SDKMessage,\n SDKInitMessage,\n SDKAssistantMessage,\n SDKResultMessage,\n WireMessage,\n ControlRequest,\n CanUseToolControlRequest,\n CanUseToolResponse,\n CanUseToolResponseAllow,\n CanUseToolResponseDeny,\n} from \"./types.js\";\nimport { validateSessionOptions } from \"./validation.js\";\n\nexport class Session implements AsyncDisposable {\n private transport: SubprocessTransport;\n private _agentId: string | null = null;\n private _sessionId: string | null = null;\n private _conversationId: string | null = null;\n private initialized = false;\n\n constructor(\n private options: SessionOptions & { agentId?: string } = {}\n ) {\n // Validate options before creating transport\n validateSessionOptions(options);\n this.transport = new SubprocessTransport(options);\n }\n\n /**\n * Initialize the session (called automatically on first send)\n */\n async initialize(): Promise<SDKInitMessage> {\n if (this.initialized) {\n throw new Error(\"Session already initialized\");\n }\n\n await this.transport.connect();\n\n // Send initialize control request\n await this.transport.write({\n type: \"control_request\",\n request_id: \"init_1\",\n request: { subtype: \"initialize\" },\n });\n\n // Wait for init message\n for await (const msg of this.transport.messages()) {\n if (msg.type === \"system\" && \"subtype\" in msg && msg.subtype === \"init\") {\n const initMsg = msg as WireMessage & {\n agent_id: string;\n session_id: string;\n conversation_id: string;\n model: string;\n tools: string[];\n };\n this._agentId = initMsg.agent_id;\n this._sessionId = initMsg.session_id;\n this._conversationId = initMsg.conversation_id;\n this.initialized = true;\n\n return {\n type: \"init\",\n agentId: initMsg.agent_id,\n sessionId: initMsg.session_id,\n conversationId: initMsg.conversation_id,\n model: initMsg.model,\n tools: initMsg.tools,\n };\n }\n }\n\n throw new Error(\"Failed to initialize session - no init message received\");\n }\n\n /**\n * Send a message to the agent\n */\n async send(message: string): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n await this.transport.write({\n type: \"user\",\n message: { role: \"user\", content: message },\n });\n }\n\n /**\n * Stream messages from the agent\n */\n async *stream(): AsyncGenerator<SDKMessage> {\n for await (const wireMsg of this.transport.messages()) {\n // Handle CLI → SDK control requests (e.g., can_use_tool)\n if (wireMsg.type === \"control_request\") {\n const controlReq = wireMsg as ControlRequest;\n if (controlReq.request.subtype === \"can_use_tool\") {\n await this.handleCanUseTool(\n controlReq.request_id,\n controlReq.request as CanUseToolControlRequest\n );\n continue;\n }\n }\n\n const sdkMsg = this.transformMessage(wireMsg);\n if (sdkMsg) {\n yield sdkMsg;\n\n // Stop on result message\n if (sdkMsg.type === \"result\") {\n break;\n }\n }\n }\n }\n\n /**\n * Handle can_use_tool control request from CLI (Claude SDK compatible format)\n */\n private async handleCanUseTool(\n requestId: string,\n req: CanUseToolControlRequest\n ): Promise<void> {\n let response: CanUseToolResponse;\n\n // If bypassPermissions mode, auto-allow all tools\n if (this.options.permissionMode === \"bypassPermissions\") {\n response = {\n behavior: \"allow\",\n updatedInput: null,\n updatedPermissions: [],\n } satisfies CanUseToolResponseAllow;\n } else if (this.options.canUseTool) {\n try {\n const result = await this.options.canUseTool(req.tool_name, req.input);\n if (result.behavior === \"allow\") {\n response = {\n behavior: \"allow\",\n updatedInput: result.updatedInput ?? null,\n updatedPermissions: [], // TODO: not implemented\n } satisfies CanUseToolResponseAllow;\n } else {\n response = {\n behavior: \"deny\",\n message: result.message ?? \"Denied by canUseTool callback\",\n interrupt: false, // TODO: not wired up yet\n } satisfies CanUseToolResponseDeny;\n }\n } catch (err) {\n response = {\n behavior: \"deny\",\n message: err instanceof Error ? err.message : \"Callback error\",\n interrupt: false,\n };\n }\n } else {\n // No callback registered - deny by default\n response = {\n behavior: \"deny\",\n message: \"No canUseTool callback registered\",\n interrupt: false,\n };\n }\n\n // Send control_response (Claude SDK compatible format)\n await this.transport.write({\n type: \"control_response\",\n response: {\n subtype: \"success\",\n request_id: requestId,\n response,\n },\n });\n }\n\n /**\n * Abort the current operation (interrupt without closing the session)\n */\n async abort(): Promise<void> {\n await this.transport.write({\n type: \"control_request\",\n request_id: `interrupt-${Date.now()}`,\n request: { subtype: \"interrupt\" },\n });\n }\n\n /**\n * Close the session\n */\n close(): void {\n this.transport.close();\n }\n\n /**\n * Get the agent ID (available after initialization)\n */\n get agentId(): string | null {\n return this._agentId;\n }\n\n /**\n * Get the session ID (available after initialization)\n */\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n /**\n * Get the conversation ID (available after initialization)\n */\n get conversationId(): string | null {\n return this._conversationId;\n }\n\n /**\n * AsyncDisposable implementation for `await using`\n */\n async [Symbol.asyncDispose](): Promise<void> {\n this.close();\n }\n\n /**\n * Transform wire message to SDK message\n */\n private transformMessage(wireMsg: WireMessage): SDKMessage | null {\n // Init message\n if (wireMsg.type === \"system\" && \"subtype\" in wireMsg && wireMsg.subtype === \"init\") {\n const msg = wireMsg as WireMessage & {\n agent_id: string;\n session_id: string;\n conversation_id: string;\n model: string;\n tools: string[];\n };\n return {\n type: \"init\",\n agentId: msg.agent_id,\n sessionId: msg.session_id,\n conversationId: msg.conversation_id,\n model: msg.model,\n tools: msg.tools,\n };\n }\n\n // Handle message types (all have type: \"message\" with message_type field)\n if (wireMsg.type === \"message\" && \"message_type\" in wireMsg) {\n const msg = wireMsg as WireMessage & {\n message_type: string;\n uuid: string;\n // assistant_message fields\n content?: string;\n // tool_call_message fields\n tool_call?: { name: string; arguments: string; tool_call_id: string };\n tool_calls?: Array<{ name: string; arguments: string; tool_call_id: string }>;\n // tool_return_message fields\n tool_call_id?: string;\n tool_return?: string;\n status?: \"success\" | \"error\";\n // reasoning_message fields\n reasoning?: string;\n };\n\n // Assistant message\n if (msg.message_type === \"assistant_message\" && msg.content) {\n return {\n type: \"assistant\",\n content: msg.content,\n uuid: msg.uuid,\n };\n }\n\n // Tool call message\n if (msg.message_type === \"tool_call_message\") {\n const toolCall = msg.tool_calls?.[0] || msg.tool_call;\n if (toolCall) {\n let toolInput: Record<string, unknown> = {};\n try {\n toolInput = JSON.parse(toolCall.arguments);\n } catch {\n toolInput = { raw: toolCall.arguments };\n }\n return {\n type: \"tool_call\",\n toolCallId: toolCall.tool_call_id,\n toolName: toolCall.name,\n toolInput,\n uuid: msg.uuid,\n };\n }\n }\n\n // Tool return message\n if (msg.message_type === \"tool_return_message\" && msg.tool_call_id) {\n return {\n type: \"tool_result\",\n toolCallId: msg.tool_call_id,\n content: msg.tool_return || \"\",\n isError: msg.status === \"error\",\n uuid: msg.uuid,\n };\n }\n\n // Reasoning message\n if (msg.message_type === \"reasoning_message\" && msg.reasoning) {\n return {\n type: \"reasoning\",\n content: msg.reasoning,\n uuid: msg.uuid,\n };\n }\n }\n\n // Stream event (partial message updates)\n if (wireMsg.type === \"stream_event\") {\n const msg = wireMsg as WireMessage & {\n event: {\n type: string;\n index?: number;\n delta?: { type?: string; text?: string; reasoning?: string };\n content_block?: { type?: string; text?: string };\n };\n uuid: string;\n };\n return {\n type: \"stream_event\",\n event: msg.event,\n uuid: msg.uuid,\n };\n }\n\n // Result message\n if (wireMsg.type === \"result\") {\n const msg = wireMsg as WireMessage & {\n subtype: string;\n result?: string;\n duration_ms: number;\n total_cost_usd?: number;\n conversation_id: string;\n };\n return {\n type: \"result\",\n success: msg.subtype === \"success\",\n result: msg.result,\n error: msg.subtype !== \"success\" ? msg.subtype : undefined,\n durationMs: msg.duration_ms,\n totalCostUsd: msg.total_cost_usd,\n conversationId: msg.conversation_id,\n };\n }\n\n // Skip other message types (system_message, user_message, etc.)\n return null;\n }\n}\n",
|
|
8
|
-
"/**\n * Letta Code SDK\n *\n * Programmatic control of Letta Code CLI with persistent agent memory.\n *\n * @example\n * ```typescript\n * import { createAgent, createSession, resumeSession, prompt } from '@letta-ai/letta-code-sdk';\n *\n * // Start session with default agent + new conversation (like `letta`)\n * const session = createSession();\n *\n * // Create a new agent explicitly\n * const agentId = await createAgent();\n *\n * // Resume default conversation on an agent\n * const session = resumeSession(agentId);\n *\n * // Resume specific conversation\n * const session = resumeSession('conv-xxx');\n *\n * // Create new conversation on specific agent\n * const session = createSession(agentId);\n *\n * // One-shot prompt (uses default agent)\n * const result = await prompt('Hello');\n * const result = await prompt('Hello', agentId); // specific agent\n * ```\n */\n\nimport { Session } from \"./session.js\";\nimport type {
|
|
5
|
+
"/**\n * SubprocessTransport\n *\n * Spawns the Letta Code CLI and communicates via stdin/stdout JSON streams.\n */\n\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { createInterface, type Interface } from \"node:readline\";\nimport type { InternalSessionOptions, WireMessage } from \"./types.js\";\n\nexport class SubprocessTransport {\n private process: ChildProcess | null = null;\n private stdout: Interface | null = null;\n private messageQueue: WireMessage[] = [];\n private messageResolvers: Array<(msg: WireMessage) => void> = [];\n private closed = false;\n private agentId?: string;\n\n constructor(\n private options: InternalSessionOptions = {}\n ) {}\n\n /**\n * Start the CLI subprocess\n */\n async connect(): Promise<void> {\n const args = this.buildArgs();\n\n // Find the CLI - use the installed letta-code package\n const cliPath = await this.findCli();\n if (process.env.DEBUG) {\n console.log(\"[letta-code-sdk] Using CLI:\", cliPath);\n console.log(\"[letta-code-sdk] Args:\", args.join(\" \"));\n }\n\n this.process = spawn(\"node\", [cliPath, ...args], {\n cwd: this.options.cwd || process.cwd(),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env },\n });\n\n if (!this.process.stdout || !this.process.stdin) {\n throw new Error(\"Failed to create subprocess pipes\");\n }\n\n // Set up stdout reading\n this.stdout = createInterface({\n input: this.process.stdout,\n crlfDelay: Infinity,\n });\n\n this.stdout.on(\"line\", (line) => {\n if (!line.trim()) return;\n try {\n const msg = JSON.parse(line) as WireMessage;\n this.handleMessage(msg);\n } catch {\n // Ignore non-JSON lines (stderr leakage, etc.)\n }\n });\n\n // Log stderr for debugging (CLI errors, auth failures, etc.)\n if (this.process.stderr) {\n this.process.stderr.on(\"data\", (data: Buffer) => {\n const msg = data.toString().trim();\n if (msg) {\n console.error(\"[letta-code-sdk] CLI stderr:\", msg);\n }\n });\n }\n\n // Handle process exit\n this.process.on(\"close\", (code) => {\n this.closed = true;\n if (code !== 0 && code !== null) {\n console.error(`[letta-code-sdk] CLI process exited with code ${code}`);\n }\n });\n\n this.process.on(\"error\", (err) => {\n console.error(\"[letta-code-sdk] CLI process error:\", err);\n this.closed = true;\n });\n }\n\n /**\n * Send a message to the CLI via stdin\n */\n async write(data: object): Promise<void> {\n if (!this.process?.stdin || this.closed) {\n throw new Error(\"Transport not connected\");\n }\n this.process.stdin.write(JSON.stringify(data) + \"\\n\");\n }\n\n /**\n * Read the next message from the CLI\n */\n async read(): Promise<WireMessage | null> {\n // Return queued message if available\n if (this.messageQueue.length > 0) {\n return this.messageQueue.shift()!;\n }\n\n // If closed, no more messages\n if (this.closed) {\n return null;\n }\n\n // Wait for next message\n return new Promise((resolve) => {\n this.messageResolvers.push(resolve);\n });\n }\n\n /**\n * Async iterator for messages\n */\n async *messages(): AsyncGenerator<WireMessage> {\n while (true) {\n const msg = await this.read();\n if (msg === null) break;\n yield msg;\n }\n }\n\n /**\n * Close the transport\n */\n close(): void {\n if (this.process) {\n this.process.stdin?.end();\n this.process.kill();\n this.process = null;\n }\n this.closed = true;\n\n // Resolve any pending readers with null\n for (const resolve of this.messageResolvers) {\n resolve(null as unknown as WireMessage);\n }\n this.messageResolvers = [];\n }\n\n get isClosed(): boolean {\n return this.closed;\n }\n\n private handleMessage(msg: WireMessage): void {\n // Track agent_id from init message\n if (msg.type === \"system\" && \"subtype\" in msg && msg.subtype === \"init\") {\n this.agentId = (msg as unknown as { agent_id: string }).agent_id;\n }\n\n // If someone is waiting for a message, give it to them\n if (this.messageResolvers.length > 0) {\n const resolve = this.messageResolvers.shift()!;\n resolve(msg);\n } else {\n // Otherwise queue it\n this.messageQueue.push(msg);\n }\n }\n\n private buildArgs(): string[] {\n const args: string[] = [\n \"--output-format\",\n \"stream-json\",\n \"--input-format\",\n \"stream-json\",\n ];\n\n // Note: All validation happens in validateInternalSessionOptions() called from Session constructor\n\n // Conversation and agent handling\n if (this.options.conversationId) {\n // Resume specific conversation (derives agent automatically)\n args.push(\"--conversation\", this.options.conversationId);\n } else if (this.options.agentId) {\n // Resume existing agent\n args.push(\"--agent\", this.options.agentId);\n if (this.options.newConversation) {\n // Create new conversation on this agent\n args.push(\"--new\");\n } else if (this.options.defaultConversation) {\n // Use agent's default conversation explicitly\n args.push(\"--default\");\n }\n } else if (this.options.promptMode) {\n // prompt() without agentId: no agent flags\n // Headless will use LRU agent or create Memo (like `letta -p \"msg\"`)\n } else if (this.options.createOnly) {\n // createAgent() - explicitly create new agent\n args.push(\"--new-agent\");\n } else if (this.options.newConversation) {\n // createSession() without agentId - LRU agent + new conversation\n args.push(\"--new\");\n }\n // else: no agent flags = default behavior (LRU agent, default conversation)\n\n // Model\n if (this.options.model) {\n args.push(\"-m\", this.options.model);\n }\n\n // System prompt configuration\n if (this.options.systemPrompt !== undefined) {\n if (typeof this.options.systemPrompt === \"string\") {\n // Check if it's a valid preset name or custom string\n const validPresets = [\n \"default\",\n \"letta-claude\",\n \"letta-codex\",\n \"letta-gemini\",\n \"claude\",\n \"codex\",\n \"gemini\",\n ];\n if (validPresets.includes(this.options.systemPrompt)) {\n // Preset name → --system\n args.push(\"--system\", this.options.systemPrompt);\n } else {\n // Custom string → --system-custom\n args.push(\"--system-custom\", this.options.systemPrompt);\n }\n } else {\n // Preset object → --system (+ optional --system-append)\n args.push(\"--system\", this.options.systemPrompt.preset);\n if (this.options.systemPrompt.append) {\n args.push(\"--system-append\", this.options.systemPrompt.append);\n }\n }\n }\n\n // Memory blocks (only for new agents)\n if (this.options.memory !== undefined && !this.options.agentId) {\n if (this.options.memory.length === 0) {\n // Empty array → no memory blocks (just core)\n args.push(\"--init-blocks\", \"\");\n } else {\n // Separate preset names from custom/reference blocks\n const presetNames: string[] = [];\n const memoryBlocksJson: Array<\n | { label: string; value: string }\n | { blockId: string }\n > = [];\n\n for (const item of this.options.memory) {\n if (typeof item === \"string\") {\n // Preset name\n presetNames.push(item);\n } else if (\"blockId\" in item) {\n // Block reference - pass to --memory-blocks\n memoryBlocksJson.push(item as { blockId: string });\n } else {\n // CreateBlock\n memoryBlocksJson.push(item as { label: string; value: string });\n }\n }\n\n // NOTE: When custom blocks are provided via --memory-blocks, they define the complete\n // memory configuration. Preset blocks (--init-blocks) cannot be mixed with custom blocks.\n if (memoryBlocksJson.length > 0) {\n // Use custom blocks only\n args.push(\"--memory-blocks\", JSON.stringify(memoryBlocksJson));\n if (presetNames.length > 0) {\n console.warn(\n \"[letta-code-sdk] Using custom memory blocks. \" +\n `Preset blocks are ignored when custom blocks are provided: ${presetNames.join(\", \")}`\n );\n }\n } else if (presetNames.length > 0) {\n // Use presets only\n args.push(\"--init-blocks\", presetNames.join(\",\"));\n }\n }\n }\n\n // Convenience props for block values (only for new agents)\n if (!this.options.agentId) {\n if (this.options.persona !== undefined) {\n args.push(\"--block-value\", `persona=${this.options.persona}`);\n }\n if (this.options.human !== undefined) {\n args.push(\"--block-value\", `human=${this.options.human}`);\n }\n }\n\n // Permission mode\n if (this.options.permissionMode === \"bypassPermissions\") {\n args.push(\"--yolo\");\n } else if (this.options.permissionMode === \"acceptEdits\") {\n args.push(\"--accept-edits\");\n }\n\n // Allowed tools\n if (this.options.allowedTools) {\n args.push(\"--allowedTools\", this.options.allowedTools.join(\",\"));\n }\n\n return args;\n }\n\n private async findCli(): Promise<string> {\n // Try multiple resolution strategies\n const { existsSync } = await import(\"node:fs\");\n const { dirname, join } = await import(\"node:path\");\n const { fileURLToPath } = await import(\"node:url\");\n\n // Strategy 1: Check LETTA_CLI_PATH env var\n if (process.env.LETTA_CLI_PATH && existsSync(process.env.LETTA_CLI_PATH)) {\n return process.env.LETTA_CLI_PATH;\n }\n\n // Strategy 2: Try to resolve from node_modules\n // Note: resolve the package main export (not /letta.js subpath) because\n // the package.json \"exports\" field doesn't expose the subpath directly.\n try {\n const { createRequire } = await import(\"node:module\");\n const require = createRequire(import.meta.url);\n const resolved = require.resolve(\"@letta-ai/letta-code\");\n if (existsSync(resolved)) {\n return resolved;\n }\n } catch {\n // Continue to next strategy\n }\n\n // Strategy 3: Check relative to this file (for local file: deps)\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const localPaths = [\n join(__dirname, \"../../@letta-ai/letta-code/letta.js\"),\n join(__dirname, \"../../../letta-code-prod/letta.js\"),\n join(__dirname, \"../../../letta-code/letta.js\"),\n ];\n\n for (const p of localPaths) {\n if (existsSync(p)) {\n return p;\n }\n }\n\n throw new Error(\n \"Letta Code CLI not found. Set LETTA_CLI_PATH or install @letta-ai/letta-code.\"\n );\n }\n}\n",
|
|
6
|
+
"/**\n * Session\n *\n * Represents a conversation session with a Letta agent.\n * Implements the V2 API pattern: send() / receive()\n */\n\nimport { SubprocessTransport } from \"./transport.js\";\nimport type {\n InternalSessionOptions,\n SDKMessage,\n SDKInitMessage,\n SDKAssistantMessage,\n SDKResultMessage,\n WireMessage,\n ControlRequest,\n CanUseToolControlRequest,\n CanUseToolResponse,\n CanUseToolResponseAllow,\n CanUseToolResponseDeny,\n SendMessage,\n} from \"./types.js\";\n\n\nexport class Session implements AsyncDisposable {\n private transport: SubprocessTransport;\n private _agentId: string | null = null;\n private _sessionId: string | null = null;\n private _conversationId: string | null = null;\n private initialized = false;\n\n constructor(\n private options: InternalSessionOptions = {}\n ) {\n // Note: Validation happens in public API functions (createSession, createAgent, etc.)\n this.transport = new SubprocessTransport(options);\n }\n\n /**\n * Initialize the session (called automatically on first send)\n */\n async initialize(): Promise<SDKInitMessage> {\n if (this.initialized) {\n throw new Error(\"Session already initialized\");\n }\n\n await this.transport.connect();\n\n // Send initialize control request\n await this.transport.write({\n type: \"control_request\",\n request_id: \"init_1\",\n request: { subtype: \"initialize\" },\n });\n\n // Wait for init message\n for await (const msg of this.transport.messages()) {\n if (msg.type === \"system\" && \"subtype\" in msg && msg.subtype === \"init\") {\n const initMsg = msg as WireMessage & {\n agent_id: string;\n session_id: string;\n conversation_id: string;\n model: string;\n tools: string[];\n };\n this._agentId = initMsg.agent_id;\n this._sessionId = initMsg.session_id;\n this._conversationId = initMsg.conversation_id;\n this.initialized = true;\n\n return {\n type: \"init\",\n agentId: initMsg.agent_id,\n sessionId: initMsg.session_id,\n conversationId: initMsg.conversation_id,\n model: initMsg.model,\n tools: initMsg.tools,\n };\n }\n }\n\n throw new Error(\"Failed to initialize session - no init message received\");\n }\n\n /**\n * Send a message to the agent\n * \n * @param message - Text string or multimodal content array\n * \n * @example\n * // Simple text\n * await session.send(\"Hello!\");\n * \n * @example\n * // With image\n * await session.send([\n * { type: \"text\", text: \"What's in this image?\" },\n * { type: \"image\", source: { type: \"base64\", mediaType: \"image/png\", data: \"...\" } }\n * ]);\n */\n async send(message: SendMessage): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n await this.transport.write({\n type: \"user\",\n message: { role: \"user\", content: message },\n });\n }\n\n /**\n * Stream messages from the agent\n */\n async *stream(): AsyncGenerator<SDKMessage> {\n for await (const wireMsg of this.transport.messages()) {\n // Handle CLI → SDK control requests (e.g., can_use_tool)\n if (wireMsg.type === \"control_request\") {\n const controlReq = wireMsg as ControlRequest;\n if (controlReq.request.subtype === \"can_use_tool\") {\n await this.handleCanUseTool(\n controlReq.request_id,\n controlReq.request as CanUseToolControlRequest\n );\n continue;\n }\n }\n\n const sdkMsg = this.transformMessage(wireMsg);\n if (sdkMsg) {\n yield sdkMsg;\n\n // Stop on result message\n if (sdkMsg.type === \"result\") {\n break;\n }\n }\n }\n }\n\n /**\n * Handle can_use_tool control request from CLI (Claude SDK compatible format)\n */\n private async handleCanUseTool(\n requestId: string,\n req: CanUseToolControlRequest\n ): Promise<void> {\n let response: CanUseToolResponse;\n\n // If bypassPermissions mode, auto-allow all tools\n if (this.options.permissionMode === \"bypassPermissions\") {\n response = {\n behavior: \"allow\",\n updatedInput: null,\n updatedPermissions: [],\n } satisfies CanUseToolResponseAllow;\n } else if (this.options.canUseTool) {\n try {\n const result = await this.options.canUseTool(req.tool_name, req.input);\n if (result.behavior === \"allow\") {\n response = {\n behavior: \"allow\",\n updatedInput: result.updatedInput ?? null,\n updatedPermissions: [], // TODO: not implemented\n } satisfies CanUseToolResponseAllow;\n } else {\n response = {\n behavior: \"deny\",\n message: result.message ?? \"Denied by canUseTool callback\",\n interrupt: false, // TODO: not wired up yet\n } satisfies CanUseToolResponseDeny;\n }\n } catch (err) {\n response = {\n behavior: \"deny\",\n message: err instanceof Error ? err.message : \"Callback error\",\n interrupt: false,\n };\n }\n } else {\n // No callback registered - deny by default\n response = {\n behavior: \"deny\",\n message: \"No canUseTool callback registered\",\n interrupt: false,\n };\n }\n\n // Send control_response (Claude SDK compatible format)\n await this.transport.write({\n type: \"control_response\",\n response: {\n subtype: \"success\",\n request_id: requestId,\n response,\n },\n });\n }\n\n /**\n * Abort the current operation (interrupt without closing the session)\n */\n async abort(): Promise<void> {\n await this.transport.write({\n type: \"control_request\",\n request_id: `interrupt-${Date.now()}`,\n request: { subtype: \"interrupt\" },\n });\n }\n\n /**\n * Close the session\n */\n close(): void {\n this.transport.close();\n }\n\n /**\n * Get the agent ID (available after initialization)\n */\n get agentId(): string | null {\n return this._agentId;\n }\n\n /**\n * Get the session ID (available after initialization)\n */\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n /**\n * Get the conversation ID (available after initialization)\n */\n get conversationId(): string | null {\n return this._conversationId;\n }\n\n /**\n * AsyncDisposable implementation for `await using`\n */\n async [Symbol.asyncDispose](): Promise<void> {\n this.close();\n }\n\n /**\n * Transform wire message to SDK message\n */\n private transformMessage(wireMsg: WireMessage): SDKMessage | null {\n // Init message\n if (wireMsg.type === \"system\" && \"subtype\" in wireMsg && wireMsg.subtype === \"init\") {\n const msg = wireMsg as WireMessage & {\n agent_id: string;\n session_id: string;\n conversation_id: string;\n model: string;\n tools: string[];\n };\n return {\n type: \"init\",\n agentId: msg.agent_id,\n sessionId: msg.session_id,\n conversationId: msg.conversation_id,\n model: msg.model,\n tools: msg.tools,\n };\n }\n\n // Handle message types (all have type: \"message\" with message_type field)\n if (wireMsg.type === \"message\" && \"message_type\" in wireMsg) {\n const msg = wireMsg as WireMessage & {\n message_type: string;\n uuid: string;\n // assistant_message fields\n content?: string;\n // tool_call_message fields\n tool_call?: { name: string; arguments: string; tool_call_id: string };\n tool_calls?: Array<{ name: string; arguments: string; tool_call_id: string }>;\n // tool_return_message fields\n tool_call_id?: string;\n tool_return?: string;\n status?: \"success\" | \"error\";\n // reasoning_message fields\n reasoning?: string;\n };\n\n // Assistant message\n if (msg.message_type === \"assistant_message\" && msg.content) {\n return {\n type: \"assistant\",\n content: msg.content,\n uuid: msg.uuid,\n };\n }\n\n // Tool call message\n if (msg.message_type === \"tool_call_message\") {\n const toolCall = msg.tool_calls?.[0] || msg.tool_call;\n if (toolCall) {\n let toolInput: Record<string, unknown> = {};\n try {\n toolInput = JSON.parse(toolCall.arguments);\n } catch {\n toolInput = { raw: toolCall.arguments };\n }\n return {\n type: \"tool_call\",\n toolCallId: toolCall.tool_call_id,\n toolName: toolCall.name,\n toolInput,\n uuid: msg.uuid,\n };\n }\n }\n\n // Tool return message\n if (msg.message_type === \"tool_return_message\" && msg.tool_call_id) {\n return {\n type: \"tool_result\",\n toolCallId: msg.tool_call_id,\n content: msg.tool_return || \"\",\n isError: msg.status === \"error\",\n uuid: msg.uuid,\n };\n }\n\n // Reasoning message\n if (msg.message_type === \"reasoning_message\" && msg.reasoning) {\n return {\n type: \"reasoning\",\n content: msg.reasoning,\n uuid: msg.uuid,\n };\n }\n }\n\n // Stream event (partial message updates)\n if (wireMsg.type === \"stream_event\") {\n const msg = wireMsg as WireMessage & {\n event: {\n type: string;\n index?: number;\n delta?: { type?: string; text?: string; reasoning?: string };\n content_block?: { type?: string; text?: string };\n };\n uuid: string;\n };\n return {\n type: \"stream_event\",\n event: msg.event,\n uuid: msg.uuid,\n };\n }\n\n // Result message\n if (wireMsg.type === \"result\") {\n const msg = wireMsg as WireMessage & {\n subtype: string;\n result?: string;\n duration_ms: number;\n total_cost_usd?: number;\n conversation_id: string;\n };\n return {\n type: \"result\",\n success: msg.subtype === \"success\",\n result: msg.result,\n error: msg.subtype !== \"success\" ? msg.subtype : undefined,\n durationMs: msg.duration_ms,\n totalCostUsd: msg.total_cost_usd,\n conversationId: msg.conversation_id,\n };\n }\n\n // Skip other message types (system_message, user_message, etc.)\n return null;\n }\n}\n",
|
|
7
|
+
"/**\n * SDK Validation\n *\n * Validates user-provided options before spawning the CLI.\n */\n\nimport type { \n CreateSessionOptions,\n CreateAgentOptions,\n MemoryItem, \n CreateBlock,\n SystemPromptPreset \n} from \"./types.js\";\n\n/**\n * Extract block labels from memory items.\n */\nfunction getBlockLabels(memory: MemoryItem[]): string[] {\n return memory\n .map((item) => {\n if (typeof item === \"string\") return item; // preset name\n if (\"label\" in item) return (item as CreateBlock).label; // CreateBlock\n return null; // blockId - no label to check\n })\n .filter((label): label is string => label !== null);\n}\n\n/**\n * Validate systemPrompt preset value.\n */\nfunction validateSystemPromptPreset(preset: string): void {\n const validPresets = [\n \"default\",\n \"letta-claude\",\n \"letta-codex\",\n \"letta-gemini\",\n \"claude\",\n \"codex\",\n \"gemini\",\n ];\n if (!validPresets.includes(preset)) {\n throw new Error(\n `Invalid system prompt preset '${preset}'. ` +\n `Valid presets: ${validPresets.join(\", \")}`\n );\n }\n}\n\n/**\n * Validate CreateSessionOptions (used by createSession and resumeSession).\n */\nexport function validateCreateSessionOptions(options: CreateSessionOptions): void {\n // Validate systemPrompt preset if provided\n if (options.systemPrompt !== undefined) {\n validateSystemPromptPreset(options.systemPrompt);\n }\n}\n\n/**\n * Validate CreateAgentOptions (used by createAgent).\n */\nexport function validateCreateAgentOptions(options: CreateAgentOptions): void {\n // Validate memory/persona consistency\n if (options.memory !== undefined) {\n const blockLabels = getBlockLabels(options.memory);\n\n if (options.persona !== undefined && !blockLabels.includes(\"persona\")) {\n throw new Error(\n \"Cannot set 'persona' value - block not included in 'memory'. \" +\n \"Either add 'persona' to memory array or remove the persona option.\"\n );\n }\n\n if (options.human !== undefined && !blockLabels.includes(\"human\")) {\n throw new Error(\n \"Cannot set 'human' value - block not included in 'memory'. \" +\n \"Either add 'human' to memory array or remove the human option.\"\n );\n }\n }\n\n // Validate systemPrompt preset if provided as preset object\n if (\n options.systemPrompt !== undefined &&\n typeof options.systemPrompt === \"object\"\n ) {\n validateSystemPromptPreset(options.systemPrompt.preset);\n } else if (\n options.systemPrompt !== undefined &&\n typeof options.systemPrompt === \"string\"\n ) {\n // Check if it's a preset name (if so, validate it)\n const validPresets = [\n \"default\",\n \"letta-claude\",\n \"letta-codex\",\n \"letta-gemini\",\n \"claude\",\n \"codex\",\n \"gemini\",\n ] as const;\n if (validPresets.includes(options.systemPrompt as SystemPromptPreset)) {\n validateSystemPromptPreset(options.systemPrompt);\n }\n // If not a preset, it's a custom string - no validation needed\n }\n}\n",
|
|
8
|
+
"/**\n * Letta Code SDK\n *\n * Programmatic control of Letta Code CLI with persistent agent memory.\n *\n * @example\n * ```typescript\n * import { createAgent, createSession, resumeSession, prompt } from '@letta-ai/letta-code-sdk';\n *\n * // Start session with default agent + new conversation (like `letta`)\n * const session = createSession();\n *\n * // Create a new agent explicitly\n * const agentId = await createAgent();\n *\n * // Resume default conversation on an agent\n * const session = resumeSession(agentId);\n *\n * // Resume specific conversation\n * const session = resumeSession('conv-xxx');\n *\n * // Create new conversation on specific agent\n * const session = createSession(agentId);\n *\n * // One-shot prompt (uses default agent)\n * const result = await prompt('Hello');\n * const result = await prompt('Hello', agentId); // specific agent\n * ```\n */\n\nimport { Session } from \"./session.js\";\nimport type { CreateSessionOptions, CreateAgentOptions, SDKResultMessage } from \"./types.js\";\nimport { validateCreateSessionOptions, validateCreateAgentOptions } from \"./validation.js\";\n\n// Re-export types\nexport type {\n CreateSessionOptions,\n CreateAgentOptions,\n SDKMessage,\n SDKInitMessage,\n SDKAssistantMessage,\n SDKToolCallMessage,\n SDKToolResultMessage,\n SDKReasoningMessage,\n SDKResultMessage,\n SDKStreamEventMessage,\n PermissionMode,\n CanUseToolCallback,\n CanUseToolResponse,\n CanUseToolResponseAllow,\n CanUseToolResponseDeny,\n // Multimodal content types\n TextContent,\n ImageContent,\n MessageContentItem,\n SendMessage,\n} from \"./types.js\";\n\nexport { Session } from \"./session.js\";\n\n/**\n * Create a new agent with a default conversation.\n * Returns the agentId which can be used with resumeSession or createSession.\n *\n * @example\n * ```typescript\n * // Create agent with default settings\n * const agentId = await createAgent();\n *\n * // Create agent with custom memory\n * const agentId = await createAgent({\n * memory: ['persona', 'project'],\n * persona: 'You are a helpful coding assistant',\n * model: 'claude-sonnet-4'\n * });\n *\n * // Then resume the default conversation:\n * const session = resumeSession(agentId);\n * ```\n */\nexport async function createAgent(options: CreateAgentOptions = {}): Promise<string> {\n validateCreateAgentOptions(options);\n const session = new Session({ ...options, createOnly: true });\n const initMsg = await session.initialize();\n session.close();\n return initMsg.agentId;\n}\n\n/**\n * Create a new conversation (session).\n *\n * - Without agentId: uses default/LRU agent with new conversation (like `letta`)\n * - With agentId: creates new conversation on specified agent\n *\n * @example\n * ```typescript\n * // New conversation on default agent (like `letta`)\n * await using session = createSession();\n *\n * // New conversation on specific agent\n * await using session = createSession(agentId);\n * ```\n */\nexport function createSession(agentId?: string, options: CreateSessionOptions = {}): Session {\n validateCreateSessionOptions(options);\n if (agentId) {\n return new Session({ ...options, agentId, newConversation: true });\n } else {\n return new Session({ ...options, newConversation: true });\n }\n}\n\n/**\n * Resume an existing session.\n *\n * - Pass an agent ID (agent-xxx) to resume the default conversation\n * - Pass a conversation ID (conv-xxx) to resume a specific conversation\n *\n * The default conversation always exists after createAgent, so you can:\n * `createAgent()` → `resumeSession(agentId)` without needing createSession first.\n *\n * @example\n * ```typescript\n * // Resume default conversation\n * await using session = resumeSession(agentId);\n *\n * // Resume specific conversation\n * await using session = resumeSession('conv-xxx');\n * ```\n */\nexport function resumeSession(\n id: string,\n options: CreateSessionOptions = {}\n): Session {\n validateCreateSessionOptions(options);\n if (id.startsWith(\"conv-\")) {\n return new Session({ ...options, conversationId: id });\n } else {\n return new Session({ ...options, agentId: id, defaultConversation: true });\n }\n}\n\n/**\n * One-shot prompt convenience function.\n *\n * - Without agentId: uses default agent (like `letta -p`), new conversation\n * - With agentId: uses specific agent, new conversation\n *\n * @example\n * ```typescript\n * const result = await prompt('What is 2+2?'); // default agent\n * const result = await prompt('What is the capital of France?', agentId); // specific agent\n * ```\n */\nexport async function prompt(\n message: string,\n agentId?: string\n): Promise<SDKResultMessage> {\n // Use default agent behavior (like letta -p) when no agentId specified\n const session = agentId\n ? createSession(agentId)\n : new Session({ promptMode: true });\n\n try {\n await session.send(message);\n\n let result: SDKResultMessage | null = null;\n for await (const msg of session.stream()) {\n if (msg.type === \"result\") {\n result = msg;\n break;\n }\n }\n\n if (!result) {\n return {\n type: \"result\",\n success: false,\n error: \"No result received\",\n durationMs: 0,\n conversationId: session.conversationId,\n };\n }\n\n return result;\n } finally {\n session.close();\n }\n}\n\n// ═══════════════════════════════════════════════════════════════\n// IMAGE HELPERS\n// ═══════════════════════════════════════════════════════════════\n\nimport { readFileSync } from \"node:fs\";\nimport type { ImageContent } from \"./types.js\";\n\n/**\n * Create image content from a file path.\n * \n * @example\n * ```typescript\n * await session.send([\n * { type: \"text\", text: \"What's in this image?\" },\n * imageFromFile(\"./screenshot.png\")\n * ]);\n * ```\n */\nexport function imageFromFile(filePath: string): ImageContent {\n const data = readFileSync(filePath).toString(\"base64\");\n const ext = filePath.toLowerCase();\n const media_type: ImageContent[\"source\"][\"media_type\"] = \n ext.endsWith(\".png\") ? \"image/png\"\n : ext.endsWith(\".gif\") ? \"image/gif\"\n : ext.endsWith(\".webp\") ? \"image/webp\"\n : \"image/jpeg\";\n \n return {\n type: \"image\",\n source: { type: \"base64\", media_type, data }\n };\n}\n\n/**\n * Create image content from base64 data.\n * \n * @example\n * ```typescript\n * const base64 = fs.readFileSync(\"image.png\").toString(\"base64\");\n * await session.send([\n * { type: \"text\", text: \"Describe this\" },\n * imageFromBase64(base64, \"image/png\")\n * ]);\n * ```\n */\nexport function imageFromBase64(\n data: string,\n media_type: ImageContent[\"source\"][\"media_type\"] = \"image/png\"\n): ImageContent {\n return {\n type: \"image\",\n source: { type: \"base64\", media_type, data }\n };\n}\n\n/**\n * Create image content from a URL.\n * Fetches the image and converts to base64.\n * \n * @example\n * ```typescript\n * const img = await imageFromURL(\"https://example.com/image.png\");\n * await session.send([\n * { type: \"text\", text: \"What's this?\" },\n * img\n * ]);\n * ```\n */\nexport async function imageFromURL(url: string): Promise<ImageContent> {\n const response = await fetch(url);\n const buffer = await response.arrayBuffer();\n const data = Buffer.from(buffer).toString(\"base64\");\n \n // Detect media type from content-type header or URL\n const contentType = response.headers.get(\"content-type\");\n let media_type: ImageContent[\"source\"][\"media_type\"] = \"image/png\";\n \n if (contentType?.includes(\"jpeg\") || contentType?.includes(\"jpg\") || url.match(/\\.jpe?g$/i)) {\n media_type = \"image/jpeg\";\n } else if (contentType?.includes(\"gif\") || url.endsWith(\".gif\")) {\n media_type = \"image/gif\";\n } else if (contentType?.includes(\"webp\") || url.endsWith(\".webp\")) {\n media_type = \"image/webp\";\n }\n \n return {\n type: \"image\",\n source: { type: \"base64\", media_type, data }\n };\n}\n"
|
|
9
9
|
],
|
|
10
|
-
"mappings": "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",
|
|
11
|
-
"debugId": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "D4FF4806F62B360664756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|
package/dist/session.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Represents a conversation session with a Letta agent.
|
|
5
5
|
* Implements the V2 API pattern: send() / receive()
|
|
6
6
|
*/
|
|
7
|
-
import type {
|
|
7
|
+
import type { InternalSessionOptions, SDKMessage, SDKInitMessage, SendMessage } from "./types.js";
|
|
8
8
|
export declare class Session implements AsyncDisposable {
|
|
9
9
|
private options;
|
|
10
10
|
private transport;
|
|
@@ -12,17 +12,28 @@ export declare class Session implements AsyncDisposable {
|
|
|
12
12
|
private _sessionId;
|
|
13
13
|
private _conversationId;
|
|
14
14
|
private initialized;
|
|
15
|
-
constructor(options?:
|
|
16
|
-
agentId?: string;
|
|
17
|
-
});
|
|
15
|
+
constructor(options?: InternalSessionOptions);
|
|
18
16
|
/**
|
|
19
17
|
* Initialize the session (called automatically on first send)
|
|
20
18
|
*/
|
|
21
19
|
initialize(): Promise<SDKInitMessage>;
|
|
22
20
|
/**
|
|
23
21
|
* Send a message to the agent
|
|
22
|
+
*
|
|
23
|
+
* @param message - Text string or multimodal content array
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* // Simple text
|
|
27
|
+
* await session.send("Hello!");
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* // With image
|
|
31
|
+
* await session.send([
|
|
32
|
+
* { type: "text", text: "What's in this image?" },
|
|
33
|
+
* { type: "image", source: { type: "base64", mediaType: "image/png", data: "..." } }
|
|
34
|
+
* ]);
|
|
24
35
|
*/
|
|
25
|
-
send(message:
|
|
36
|
+
send(message: SendMessage): Promise<void>;
|
|
26
37
|
/**
|
|
27
38
|
* Stream messages from the agent
|
|
28
39
|
*/
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,sBAAsB,EACtB,UAAU,EACV,cAAc,EASd,WAAW,EACZ,MAAM,YAAY,CAAC;AAGpB,qBAAa,OAAQ,YAAW,eAAe;IAQ3C,OAAO,CAAC,OAAO;IAPjB,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,WAAW,CAAS;gBAGlB,OAAO,GAAE,sBAA2B;IAM9C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC;IA2C3C;;;;;;;;;;;;;;;OAeG;IACG,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/C;;OAEG;IACI,MAAM,IAAI,cAAc,CAAC,UAAU,CAAC;IA0B3C;;OAEG;YACW,gBAAgB;IAwD9B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,GAAG,IAAI,CAE3B;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAE7B;IAED;;OAEG;IACH,IAAI,cAAc,IAAI,MAAM,GAAG,IAAI,CAElC;IAED;;OAEG;IACG,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5C;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAiIzB"}
|
package/dist/transport.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Spawns the Letta Code CLI and communicates via stdin/stdout JSON streams.
|
|
5
5
|
*/
|
|
6
|
-
import type {
|
|
6
|
+
import type { InternalSessionOptions, WireMessage } from "./types.js";
|
|
7
7
|
export declare class SubprocessTransport {
|
|
8
8
|
private options;
|
|
9
9
|
private process;
|
|
@@ -12,9 +12,7 @@ export declare class SubprocessTransport {
|
|
|
12
12
|
private messageResolvers;
|
|
13
13
|
private closed;
|
|
14
14
|
private agentId?;
|
|
15
|
-
constructor(options?:
|
|
16
|
-
agentId?: string;
|
|
17
|
-
});
|
|
15
|
+
constructor(options?: InternalSessionOptions);
|
|
18
16
|
/**
|
|
19
17
|
* Start the CLI subprocess
|
|
20
18
|
*/
|
package/dist/transport.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEtE,qBAAa,mBAAmB;IAS5B,OAAO,CAAC,OAAO;IARjB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,gBAAgB,CAAyC;IACjE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAC,CAAS;gBAGf,OAAO,GAAE,sBAA2B;IAG9C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4D9B;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAiBzC;;OAEG;IACI,QAAQ,IAAI,cAAc,CAAC,WAAW,CAAC;IAQ9C;;OAEG;IACH,KAAK,IAAI,IAAI;IAeb,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,SAAS;YA2IH,OAAO;CA4CtB"}
|
package/dist/types.d.ts
CHANGED
|
@@ -6,6 +6,32 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export type { WireMessage, SystemInitMessage, MessageWire, ResultMessage, ErrorMessage, StreamEvent, ControlRequest, ControlResponse, CanUseToolControlRequest, CanUseToolResponse, CanUseToolResponseAllow, CanUseToolResponseDeny, SystemPromptPresetConfig, CreateBlock, } from "@letta-ai/letta-code/protocol";
|
|
8
8
|
import type { CreateBlock, CanUseToolResponse } from "@letta-ai/letta-code/protocol";
|
|
9
|
+
/**
|
|
10
|
+
* Text content in a message
|
|
11
|
+
*/
|
|
12
|
+
export interface TextContent {
|
|
13
|
+
type: "text";
|
|
14
|
+
text: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Image content in a message (base64 encoded)
|
|
18
|
+
*/
|
|
19
|
+
export interface ImageContent {
|
|
20
|
+
type: "image";
|
|
21
|
+
source: {
|
|
22
|
+
type: "base64";
|
|
23
|
+
media_type: "image/png" | "image/jpeg" | "image/gif" | "image/webp";
|
|
24
|
+
data: string;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* A single content item (text or image)
|
|
29
|
+
*/
|
|
30
|
+
export type MessageContentItem = TextContent | ImageContent;
|
|
31
|
+
/**
|
|
32
|
+
* What send() accepts - either a simple string or multimodal content array
|
|
33
|
+
*/
|
|
34
|
+
export type SendMessage = string | MessageContentItem[];
|
|
9
35
|
/**
|
|
10
36
|
* Available system prompt presets.
|
|
11
37
|
*/
|
|
@@ -35,32 +61,69 @@ export type MemoryItem = string | CreateBlock | BlockReference;
|
|
|
35
61
|
/**
|
|
36
62
|
* Default memory block preset names.
|
|
37
63
|
*/
|
|
38
|
-
export type MemoryPreset = "persona" | "human" | "
|
|
64
|
+
export type MemoryPreset = "persona" | "human" | "skills" | "loaded_skills";
|
|
39
65
|
/**
|
|
40
66
|
* Callback for custom permission handling.
|
|
41
67
|
*/
|
|
42
68
|
export type CanUseToolCallback = (toolName: string, toolInput: Record<string, unknown>) => Promise<CanUseToolResponse> | CanUseToolResponse;
|
|
43
69
|
/**
|
|
44
|
-
*
|
|
70
|
+
* Internal session options used by Session/Transport classes.
|
|
71
|
+
* Not user-facing - use CreateSessionOptions or CreateAgentOptions instead.
|
|
72
|
+
* @internal
|
|
45
73
|
*/
|
|
46
|
-
export interface
|
|
74
|
+
export interface InternalSessionOptions {
|
|
75
|
+
agentId?: string;
|
|
76
|
+
conversationId?: string;
|
|
77
|
+
newConversation?: boolean;
|
|
78
|
+
defaultConversation?: boolean;
|
|
79
|
+
createOnly?: boolean;
|
|
80
|
+
promptMode?: boolean;
|
|
81
|
+
model?: string;
|
|
82
|
+
systemPrompt?: SystemPromptConfig;
|
|
83
|
+
memory?: MemoryItem[];
|
|
84
|
+
persona?: string;
|
|
85
|
+
human?: string;
|
|
86
|
+
allowedTools?: string[];
|
|
87
|
+
permissionMode?: PermissionMode;
|
|
88
|
+
canUseTool?: CanUseToolCallback;
|
|
89
|
+
cwd?: string;
|
|
90
|
+
}
|
|
91
|
+
export type PermissionMode = "default" | "acceptEdits" | "bypassPermissions";
|
|
92
|
+
/**
|
|
93
|
+
* Options for createSession() and resumeSession() - restricted to options that can be applied to existing agents (LRU/Memo).
|
|
94
|
+
* For creating new agents with custom memory/persona, use createAgent().
|
|
95
|
+
*/
|
|
96
|
+
export interface CreateSessionOptions {
|
|
97
|
+
/** Model to use (e.g., "claude-sonnet-4-20250514") - updates the agent's LLM config */
|
|
98
|
+
model?: string;
|
|
99
|
+
/** System prompt preset (only presets, no custom strings or append) - updates the agent */
|
|
100
|
+
systemPrompt?: SystemPromptPreset;
|
|
101
|
+
/** List of allowed tool names */
|
|
102
|
+
allowedTools?: string[];
|
|
103
|
+
/** Permission mode */
|
|
104
|
+
permissionMode?: PermissionMode;
|
|
105
|
+
/** Working directory for the CLI process */
|
|
106
|
+
cwd?: string;
|
|
107
|
+
/** Custom permission callback - called when tool needs approval */
|
|
108
|
+
canUseTool?: CanUseToolCallback;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Options for createAgent() - full control over agent creation.
|
|
112
|
+
*/
|
|
113
|
+
export interface CreateAgentOptions {
|
|
47
114
|
/** Model to use (e.g., "claude-sonnet-4-20250514") */
|
|
48
115
|
model?: string;
|
|
49
|
-
/** @internal */ conversationId?: string;
|
|
50
|
-
/** @internal */ newConversation?: boolean;
|
|
51
|
-
/** @internal */ defaultConversation?: boolean;
|
|
52
|
-
/** @internal */ createOnly?: boolean;
|
|
53
|
-
/** @internal */ promptMode?: boolean;
|
|
54
116
|
/**
|
|
55
117
|
* System prompt configuration.
|
|
56
118
|
* - string: Use as the complete system prompt
|
|
119
|
+
* - SystemPromptPreset: Use a preset
|
|
57
120
|
* - { type: 'preset', preset, append? }: Use a preset with optional appended text
|
|
58
121
|
*/
|
|
59
|
-
systemPrompt?:
|
|
122
|
+
systemPrompt?: string | SystemPromptPreset | SystemPromptPresetConfigSDK;
|
|
60
123
|
/**
|
|
61
124
|
* Memory block configuration. Each item can be:
|
|
62
|
-
* - string: Preset block name ("
|
|
63
|
-
* - CreateBlock: Custom block definition
|
|
125
|
+
* - string: Preset block name ("persona", "human", "skills", "loaded_skills")
|
|
126
|
+
* - CreateBlock: Custom block definition (e.g., { label: "project", value: "..." })
|
|
64
127
|
* - { blockId: string }: Reference to existing shared block
|
|
65
128
|
*/
|
|
66
129
|
memory?: MemoryItem[];
|
|
@@ -68,20 +131,15 @@ export interface SessionOptions {
|
|
|
68
131
|
persona?: string;
|
|
69
132
|
/** Convenience: Set human block value directly */
|
|
70
133
|
human?: string;
|
|
71
|
-
/** Convenience: Set project block value directly */
|
|
72
|
-
project?: string;
|
|
73
134
|
/** List of allowed tool names */
|
|
74
135
|
allowedTools?: string[];
|
|
75
136
|
/** Permission mode */
|
|
76
137
|
permissionMode?: PermissionMode;
|
|
77
|
-
/** Working directory */
|
|
138
|
+
/** Working directory for the CLI process */
|
|
78
139
|
cwd?: string;
|
|
79
|
-
/** Maximum conversation turns */
|
|
80
|
-
maxTurns?: number;
|
|
81
140
|
/** Custom permission callback - called when tool needs approval */
|
|
82
141
|
canUseTool?: CanUseToolCallback;
|
|
83
142
|
}
|
|
84
|
-
export type PermissionMode = "default" | "acceptEdits" | "bypassPermissions";
|
|
85
143
|
/**
|
|
86
144
|
* SDK message types - clean wrappers around wire types
|
|
87
145
|
*/
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,WAAW,EACX,cAAc,EACd,eAAe,EACf,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,EAEtB,wBAAwB,EACxB,WAAW,GACZ,MAAM,+BAA+B,CAAC;AAGvC,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAMrF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAC1B,SAAS,GACT,cAAc,GACd,aAAa,GACb,cAAc,GACd,QAAQ,GACR,OAAO,GACP,QAAQ,CAAC;AAEb;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,2BAA2B,CAAC;AAMtE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,WAAW,GACX,cAAc,CAAC;AAEnB;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/validation.d.ts
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SDK Validation
|
|
3
3
|
*
|
|
4
|
-
* Validates
|
|
4
|
+
* Validates user-provided options before spawning the CLI.
|
|
5
5
|
*/
|
|
6
|
-
import type {
|
|
6
|
+
import type { CreateSessionOptions, CreateAgentOptions } from "./types.js";
|
|
7
7
|
/**
|
|
8
|
-
* Validate
|
|
9
|
-
* Throws an error if validation fails.
|
|
8
|
+
* Validate CreateSessionOptions (used by createSession and resumeSession).
|
|
10
9
|
*/
|
|
11
|
-
export declare function
|
|
10
|
+
export declare function validateCreateSessionOptions(options: CreateSessionOptions): void;
|
|
11
|
+
/**
|
|
12
|
+
* Validate CreateAgentOptions (used by createAgent).
|
|
13
|
+
*/
|
|
14
|
+
export declare function validateCreateAgentOptions(options: CreateAgentOptions): void;
|
|
12
15
|
//# sourceMappingURL=validation.d.ts.map
|
package/dist/validation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EAInB,MAAM,YAAY,CAAC;AAoCpB;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAKhF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CA6C5E"}
|