@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 CHANGED
@@ -3,7 +3,7 @@
3
3
  [![npm](https://img.shields.io/npm/v/@letta-ai/letta-code-sdk.svg?style=flat-square)](https://www.npmjs.com/package/@letta-ai/letta-code-sdk) [![Discord](https://img.shields.io/badge/discord-join-blue?style=flat-square&logo=discord)](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 conversation, returns `agentId` |
223
- | `createSession()` | New conversation on default agent |
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
- interface SessionOptions {
244
- model?: string;
245
- systemPrompt?: string | { type: 'preset'; preset: string; append?: string };
246
- memory?: Array<string | CreateBlock | { blockId: string }>;
247
- persona?: string;
248
- human?: string;
249
- project?: string;
250
- cwd?: string;
251
-
252
- // Tool configuration
253
- allowedTools?: string[];
254
- permissionMode?: 'default' | 'acceptEdits' | 'bypassPermissions';
255
- canUseTool?: (toolName: string, toolInput: object) => Promise<CanUseToolResponse>;
256
- maxTurns?: number;
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 { SessionOptions, SDKResultMessage } from "./types.js";
32
- export type { SessionOptions, SDKMessage, SDKInitMessage, SDKAssistantMessage, SDKToolCallMessage, SDKToolResultMessage, SDKReasoningMessage, SDKResultMessage, SDKStreamEventMessage, PermissionMode, CanUseToolCallback, CanUseToolResponse, CanUseToolResponseAllow, CanUseToolResponseDeny, } from "./types.js";
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?: SessionOptions): Session;
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?: SessionOptions): Session;
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
@@ -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,cAAc,EAAc,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG/E,YAAY,EACV,cAAc,EACd,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,GACvB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAKnD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAMrF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAMT;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CA+B3B"}
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
- args.push("--system-custom", this.options.systemPrompt);
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
- async function createAgent() {
519
- const session = new Session({ createOnly: true });
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=9B2C0F446D80721E64756E2164756E21
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/validation.ts", "../src/session.ts", "../src/index.ts"],
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 { SessionOptions, SDKMessage, SDKResultMessage } from \"./types.js\";\n\n// Re-export types\nexport type {\n SessionOptions,\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} 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 * const agentId = await createAgent();\n *\n * // Then resume the default conversation:\n * const session = resumeSession(agentId);\n * ```\n */\nexport async function createAgent(): Promise<string> {\n const session = new Session({ 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: SessionOptions = {}): Session {\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: SessionOptions = {}\n): Session {\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"
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": "9B2C0F446D80721E64756E2164756E21",
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 { SessionOptions, SDKMessage, SDKInitMessage } from "./types.js";
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?: SessionOptions & {
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: string): Promise<void>;
36
+ send(message: SendMessage): Promise<void>;
26
37
  /**
27
38
  * Stream messages from the agent
28
39
  */
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,cAAc,EASf,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,cAAc,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO;IAO7D;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC;IA2C3C;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1C;;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"}
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"}
@@ -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 { SessionOptions, WireMessage } from "./types.js";
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?: SessionOptions & {
16
- agentId?: string;
17
- });
15
+ constructor(options?: InternalSessionOptions);
18
16
  /**
19
17
  * Start the CLI subprocess
20
18
  */
@@ -1 +1 @@
1
- {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9D,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,cAAc,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO;IAG7D;;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;YAoJH,OAAO;CA4CtB"}
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" | "project";
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
- * Options for creating a session
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 SessionOptions {
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?: SystemPromptConfig;
122
+ systemPrompt?: string | SystemPromptPreset | SystemPromptPresetConfigSDK;
60
123
  /**
61
124
  * Memory block configuration. Each item can be:
62
- * - string: Preset block name ("project", "persona", "human")
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
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,15 @@
1
1
  /**
2
2
  * SDK Validation
3
3
  *
4
- * Validates SessionOptions before spawning the CLI.
4
+ * Validates user-provided options before spawning the CLI.
5
5
  */
6
- import type { SessionOptions } from "./types.js";
6
+ import type { CreateSessionOptions, CreateAgentOptions } from "./types.js";
7
7
  /**
8
- * Validate SessionOptions before spawning CLI.
9
- * Throws an error if validation fails.
8
+ * Validate CreateSessionOptions (used by createSession and resumeSession).
10
9
  */
11
- export declare function validateSessionOptions(options: SessionOptions): void;
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
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,YAAY,CAAC;AAe1E;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAwEpE"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@letta-ai/letta-code-sdk",
3
- "version": "0.0.4",
3
+ "version": "0.0.5",
4
4
  "description": "SDK for programmatic control of Letta Code CLI",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",