@letta-ai/letta-code-sdk 0.0.3 → 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 +108 -155
- package/dist/index.d.ts +100 -53
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +168 -94
- package/dist/index.js.map +7 -7
- package/dist/session.d.ts +16 -5
- package/dist/session.d.ts.map +1 -1
- package/dist/transport.d.ts +2 -4
- package/dist/transport.d.ts.map +1 -1
- package/dist/types.d.ts +77 -43
- package/dist/types.d.ts.map +1 -1
- package/dist/validation.d.ts +8 -5
- package/dist/validation.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -35,6 +35,10 @@ class SubprocessTransport {
|
|
|
35
35
|
async connect() {
|
|
36
36
|
const args = this.buildArgs();
|
|
37
37
|
const cliPath = await this.findCli();
|
|
38
|
+
if (process.env.DEBUG) {
|
|
39
|
+
console.log("[letta-code-sdk] Using CLI:", cliPath);
|
|
40
|
+
console.log("[letta-code-sdk] Args:", args.join(" "));
|
|
41
|
+
}
|
|
38
42
|
this.process = spawn("node", [cliPath, ...args], {
|
|
39
43
|
cwd: this.options.cwd || process.cwd(),
|
|
40
44
|
stdio: ["pipe", "pipe", "pipe"],
|
|
@@ -55,11 +59,22 @@ class SubprocessTransport {
|
|
|
55
59
|
this.handleMessage(msg);
|
|
56
60
|
} catch {}
|
|
57
61
|
});
|
|
58
|
-
this.process.
|
|
62
|
+
if (this.process.stderr) {
|
|
63
|
+
this.process.stderr.on("data", (data) => {
|
|
64
|
+
const msg = data.toString().trim();
|
|
65
|
+
if (msg) {
|
|
66
|
+
console.error("[letta-code-sdk] CLI stderr:", msg);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
this.process.on("close", (code) => {
|
|
59
71
|
this.closed = true;
|
|
72
|
+
if (code !== 0 && code !== null) {
|
|
73
|
+
console.error(`[letta-code-sdk] CLI process exited with code ${code}`);
|
|
74
|
+
}
|
|
60
75
|
});
|
|
61
76
|
this.process.on("error", (err) => {
|
|
62
|
-
console.error("CLI process error:", err);
|
|
77
|
+
console.error("[letta-code-sdk] CLI process error:", err);
|
|
63
78
|
this.closed = true;
|
|
64
79
|
});
|
|
65
80
|
}
|
|
@@ -122,18 +137,7 @@ class SubprocessTransport {
|
|
|
122
137
|
"--input-format",
|
|
123
138
|
"stream-json"
|
|
124
139
|
];
|
|
125
|
-
if (this.options.conversationId
|
|
126
|
-
throw new Error("Cannot use both 'conversationId' and 'agentId'. " + "When resuming a conversation, the agent is derived automatically.");
|
|
127
|
-
}
|
|
128
|
-
if (this.options.conversationId === "default" && !this.options.agentId) {
|
|
129
|
-
throw new Error("conversationId 'default' requires agentId. " + "Use resumeSession(agentId, { defaultConversation: true }) instead.");
|
|
130
|
-
}
|
|
131
|
-
if (this.options.defaultConversation && !this.options.agentId) {
|
|
132
|
-
throw new Error("'defaultConversation' requires agentId. " + "Use resumeSession(agentId, { defaultConversation: true }).");
|
|
133
|
-
}
|
|
134
|
-
if (this.options.continue) {
|
|
135
|
-
args.push("--continue");
|
|
136
|
-
} else if (this.options.conversationId) {
|
|
140
|
+
if (this.options.conversationId) {
|
|
137
141
|
args.push("--conversation", this.options.conversationId);
|
|
138
142
|
} else if (this.options.agentId) {
|
|
139
143
|
args.push("--agent", this.options.agentId);
|
|
@@ -142,18 +146,30 @@ class SubprocessTransport {
|
|
|
142
146
|
} else if (this.options.defaultConversation) {
|
|
143
147
|
args.push("--default");
|
|
144
148
|
}
|
|
145
|
-
} else {
|
|
149
|
+
} else if (this.options.promptMode) {} else if (this.options.createOnly) {
|
|
146
150
|
args.push("--new-agent");
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
}
|
|
151
|
+
} else if (this.options.newConversation) {
|
|
152
|
+
args.push("--new");
|
|
150
153
|
}
|
|
151
154
|
if (this.options.model) {
|
|
152
155
|
args.push("-m", this.options.model);
|
|
153
156
|
}
|
|
154
157
|
if (this.options.systemPrompt !== undefined) {
|
|
155
158
|
if (typeof this.options.systemPrompt === "string") {
|
|
156
|
-
|
|
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
|
+
}
|
|
157
173
|
} else {
|
|
158
174
|
args.push("--system", this.options.systemPrompt.preset);
|
|
159
175
|
if (this.options.systemPrompt.append) {
|
|
@@ -176,11 +192,13 @@ class SubprocessTransport {
|
|
|
176
192
|
memoryBlocksJson.push(item);
|
|
177
193
|
}
|
|
178
194
|
}
|
|
179
|
-
if (presetNames.length > 0) {
|
|
180
|
-
args.push("--init-blocks", presetNames.join(","));
|
|
181
|
-
}
|
|
182
195
|
if (memoryBlocksJson.length > 0) {
|
|
183
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(","));
|
|
184
202
|
}
|
|
185
203
|
}
|
|
186
204
|
}
|
|
@@ -191,9 +209,6 @@ class SubprocessTransport {
|
|
|
191
209
|
if (this.options.human !== undefined) {
|
|
192
210
|
args.push("--block-value", `human=${this.options.human}`);
|
|
193
211
|
}
|
|
194
|
-
if (this.options.project !== undefined) {
|
|
195
|
-
args.push("--block-value", `project=${this.options.project}`);
|
|
196
|
-
}
|
|
197
212
|
}
|
|
198
213
|
if (this.options.permissionMode === "bypassPermissions") {
|
|
199
214
|
args.push("--yolo");
|
|
@@ -236,60 +251,6 @@ class SubprocessTransport {
|
|
|
236
251
|
}
|
|
237
252
|
}
|
|
238
253
|
|
|
239
|
-
// src/validation.ts
|
|
240
|
-
function getBlockLabels(memory) {
|
|
241
|
-
return memory.map((item) => {
|
|
242
|
-
if (typeof item === "string")
|
|
243
|
-
return item;
|
|
244
|
-
if ("label" in item)
|
|
245
|
-
return item.label;
|
|
246
|
-
return null;
|
|
247
|
-
}).filter((label) => label !== null);
|
|
248
|
-
}
|
|
249
|
-
function validateSessionOptions(options) {
|
|
250
|
-
if (options.memory !== undefined) {
|
|
251
|
-
const blockLabels = getBlockLabels(options.memory);
|
|
252
|
-
if (options.persona !== undefined && !blockLabels.includes("persona")) {
|
|
253
|
-
throw new Error("Cannot set 'persona' value - block not included in 'memory'. " + "Either add 'persona' to memory array or remove the persona option.");
|
|
254
|
-
}
|
|
255
|
-
if (options.human !== undefined && !blockLabels.includes("human")) {
|
|
256
|
-
throw new Error("Cannot set 'human' value - block not included in 'memory'. " + "Either add 'human' to memory array or remove the human option.");
|
|
257
|
-
}
|
|
258
|
-
if (options.project !== undefined && !blockLabels.includes("project")) {
|
|
259
|
-
throw new Error("Cannot set 'project' value - block not included in 'memory'. " + "Either add 'project' to memory array or remove the project option.");
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
if (options.systemPrompt !== undefined && typeof options.systemPrompt === "object") {
|
|
263
|
-
const validPresets = [
|
|
264
|
-
"default",
|
|
265
|
-
"letta-claude",
|
|
266
|
-
"letta-codex",
|
|
267
|
-
"letta-gemini",
|
|
268
|
-
"claude",
|
|
269
|
-
"codex",
|
|
270
|
-
"gemini"
|
|
271
|
-
];
|
|
272
|
-
if (!validPresets.includes(options.systemPrompt.preset)) {
|
|
273
|
-
throw new Error(`Invalid system prompt preset '${options.systemPrompt.preset}'. ` + `Valid presets: ${validPresets.join(", ")}`);
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
if (options.conversationId && options.newConversation) {
|
|
277
|
-
throw new Error("Cannot use both 'conversationId' and 'newConversation'. " + "Use conversationId to resume a specific conversation, or newConversation to create a new one.");
|
|
278
|
-
}
|
|
279
|
-
if (options.continue && options.conversationId) {
|
|
280
|
-
throw new Error("Cannot use both 'continue' and 'conversationId'. " + "Use continue to resume the last session, or conversationId to resume a specific conversation.");
|
|
281
|
-
}
|
|
282
|
-
if (options.continue && options.newConversation) {
|
|
283
|
-
throw new Error("Cannot use both 'continue' and 'newConversation'. " + "Use continue to resume the last session, or newConversation to create a new one.");
|
|
284
|
-
}
|
|
285
|
-
if (options.defaultConversation && options.conversationId) {
|
|
286
|
-
throw new Error("Cannot use both 'defaultConversation' and 'conversationId'. " + "Use defaultConversation with agentId, or conversationId alone.");
|
|
287
|
-
}
|
|
288
|
-
if (options.defaultConversation && options.newConversation) {
|
|
289
|
-
throw new Error("Cannot use both 'defaultConversation' and 'newConversation'.");
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
|
|
293
254
|
// src/session.ts
|
|
294
255
|
class Session {
|
|
295
256
|
options;
|
|
@@ -300,7 +261,6 @@ class Session {
|
|
|
300
261
|
initialized = false;
|
|
301
262
|
constructor(options = {}) {
|
|
302
263
|
this.options = options;
|
|
303
|
-
validateSessionOptions(options);
|
|
304
264
|
this.transport = new SubprocessTransport(options);
|
|
305
265
|
}
|
|
306
266
|
async initialize() {
|
|
@@ -361,19 +321,25 @@ class Session {
|
|
|
361
321
|
}
|
|
362
322
|
async handleCanUseTool(requestId, req) {
|
|
363
323
|
let response;
|
|
364
|
-
if (this.options.
|
|
324
|
+
if (this.options.permissionMode === "bypassPermissions") {
|
|
325
|
+
response = {
|
|
326
|
+
behavior: "allow",
|
|
327
|
+
updatedInput: null,
|
|
328
|
+
updatedPermissions: []
|
|
329
|
+
};
|
|
330
|
+
} else if (this.options.canUseTool) {
|
|
365
331
|
try {
|
|
366
332
|
const result = await this.options.canUseTool(req.tool_name, req.input);
|
|
367
|
-
if (result.allow) {
|
|
333
|
+
if (result.behavior === "allow") {
|
|
368
334
|
response = {
|
|
369
335
|
behavior: "allow",
|
|
370
|
-
updatedInput: null,
|
|
336
|
+
updatedInput: result.updatedInput ?? null,
|
|
371
337
|
updatedPermissions: []
|
|
372
338
|
};
|
|
373
339
|
} else {
|
|
374
340
|
response = {
|
|
375
341
|
behavior: "deny",
|
|
376
|
-
message: result.
|
|
342
|
+
message: result.message ?? "Denied by canUseTool callback",
|
|
377
343
|
interrupt: false
|
|
378
344
|
};
|
|
379
345
|
}
|
|
@@ -502,18 +468,90 @@ class Session {
|
|
|
502
468
|
}
|
|
503
469
|
}
|
|
504
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
|
+
|
|
505
528
|
// src/index.ts
|
|
506
|
-
|
|
507
|
-
|
|
529
|
+
import { readFileSync } from "node:fs";
|
|
530
|
+
async function createAgent(options = {}) {
|
|
531
|
+
validateCreateAgentOptions(options);
|
|
532
|
+
const session = new Session({ ...options, createOnly: true });
|
|
533
|
+
const initMsg = await session.initialize();
|
|
534
|
+
session.close();
|
|
535
|
+
return initMsg.agentId;
|
|
508
536
|
}
|
|
509
|
-
function
|
|
510
|
-
|
|
537
|
+
function createSession(agentId, options = {}) {
|
|
538
|
+
validateCreateSessionOptions(options);
|
|
539
|
+
if (agentId) {
|
|
540
|
+
return new Session({ ...options, agentId, newConversation: true });
|
|
541
|
+
} else {
|
|
542
|
+
return new Session({ ...options, newConversation: true });
|
|
543
|
+
}
|
|
511
544
|
}
|
|
512
|
-
function
|
|
513
|
-
|
|
545
|
+
function resumeSession(id, options = {}) {
|
|
546
|
+
validateCreateSessionOptions(options);
|
|
547
|
+
if (id.startsWith("conv-")) {
|
|
548
|
+
return new Session({ ...options, conversationId: id });
|
|
549
|
+
} else {
|
|
550
|
+
return new Session({ ...options, agentId: id, defaultConversation: true });
|
|
551
|
+
}
|
|
514
552
|
}
|
|
515
|
-
async function prompt(message,
|
|
516
|
-
const session = createSession(
|
|
553
|
+
async function prompt(message, agentId) {
|
|
554
|
+
const session = agentId ? createSession(agentId) : new Session({ promptMode: true });
|
|
517
555
|
try {
|
|
518
556
|
await session.send(message);
|
|
519
557
|
let result = null;
|
|
@@ -537,12 +575,48 @@ async function prompt(message, options = {}) {
|
|
|
537
575
|
session.close();
|
|
538
576
|
}
|
|
539
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
|
+
}
|
|
540
611
|
export {
|
|
541
612
|
resumeSession,
|
|
542
|
-
resumeConversation,
|
|
543
613
|
prompt,
|
|
614
|
+
imageFromURL,
|
|
615
|
+
imageFromFile,
|
|
616
|
+
imageFromBase64,
|
|
544
617
|
createSession,
|
|
618
|
+
createAgent,
|
|
545
619
|
Session
|
|
546
620
|
};
|
|
547
621
|
|
|
548
|
-
//# debugId=
|
|
622
|
+
//# debugId=D4FF4806F62B360664756E2164756E21
|
package/dist/index.js.map
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/transport.ts", "../src/
|
|
3
|
+
"sources": ["../src/transport.ts", "../src/session.ts", "../src/validation.ts", "../src/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * SubprocessTransport\n *\n * Spawns the Letta Code CLI and communicates via stdin/stdout JSON streams.\n */\n\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { createInterface, type Interface } from \"node:readline\";\nimport type { SessionOptions, WireMessage } from \"./types.js\";\n\nexport class SubprocessTransport {\n private process: ChildProcess | null = null;\n private stdout: Interface | null = null;\n private messageQueue: WireMessage[] = [];\n private messageResolvers: Array<(msg: WireMessage) => void> = [];\n private closed = false;\n private agentId?: string;\n\n constructor(\n private options: SessionOptions & { agentId?: string } = {}\n ) {}\n\n /**\n * Start the CLI subprocess\n */\n async connect(): Promise<void> {\n const args = this.buildArgs();\n\n // Find the CLI - use the installed letta-code package\n const cliPath = await this.findCli();\n\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 // Handle process exit\n this.process.on(\"close\", () => {\n this.closed = true;\n });\n\n this.process.on(\"error\", (err) => {\n console.error(\"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.continue) {\n // Resume last session (agent + conversation)\n args.push(\"--continue\");\n } else 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 {\n // Create new agent\n args.push(\"--new-agent\");\n if (this.options.newConversation) {\n // Also create new conversation (not default)\n args.push(\"--new\");\n }\n }\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.continue && options.conversationId) {\n throw new Error(\n \"Cannot use both 'continue' and 'conversationId'. \" +\n \"Use continue to resume the last session, or conversationId to resume a specific conversation.\"\n );\n }\n\n if (options.continue && options.newConversation) {\n throw new Error(\n \"Cannot use both 'continue' and 'newConversation'. \" +\n \"Use continue to resume the last session, 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 (this.options.canUseTool) {\n try {\n const result = await this.options.canUseTool(req.tool_name, req.input);\n if (result.allow) {\n response = {\n behavior: \"allow\",\n updatedInput: null, // TODO: not supported\n updatedPermissions: [], // TODO: not implemented\n } satisfies CanUseToolResponseAllow;\n } else {\n response = {\n behavior: \"deny\",\n message: result.reason ?? \"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 { createSession, prompt } from '@letta-ai/letta-code-sdk';\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": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "D4FF4806F62B360664756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|