@letta-ai/letta-code-sdk 0.1.0 → 0.1.2

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
@@ -50,6 +50,25 @@ for await (const msg of session.stream()) {
50
50
 
51
51
  By default, `resumeSession(agentId)` continues the agent’s default conversation. To start a fresh thread, use `createSession(agentId)` (see docs).
52
52
 
53
+ ## Session configuration
54
+
55
+ The SDK surfaces the same runtime controls as Letta Code CLI for skills, reminders, and sleeptime:
56
+
57
+ ```ts
58
+ import { createSession } from "@letta-ai/letta-code-sdk";
59
+
60
+ const session = createSession("agent-123", {
61
+ skillSources: ["project", "global"], // [] disables all skills (--no-skills)
62
+ systemInfoReminder: false, // maps to --no-system-info-reminder
63
+ sleeptime: {
64
+ trigger: "step-count", // off | step-count | compaction-event
65
+ behavior: "reminder", // reminder | auto-launch
66
+ stepCount: 8,
67
+ },
68
+ memfs: true, // true -> --memfs, false -> --no-memfs
69
+ });
70
+ ```
71
+
53
72
  ## Links
54
73
 
55
74
  - Docs: https://docs.letta.com/letta-code-sdk
package/dist/index.d.ts CHANGED
@@ -29,7 +29,7 @@
29
29
  */
30
30
  import { Session } from "./session.js";
31
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, AgentTool, AgentToolResult, AgentToolResultContent, AgentToolUpdateCallback, AnyAgentTool, } from "./types.js";
32
+ export type { CreateSessionOptions, CreateAgentOptions, SDKMessage, SDKInitMessage, SDKAssistantMessage, SDKToolCallMessage, SDKToolResultMessage, SDKReasoningMessage, SDKResultMessage, SDKStreamEventMessage, SDKErrorMessage, SDKRetryMessage, SkillSource, SleeptimeOptions, SleeptimeTrigger, SleeptimeBehavior, EffectiveSleeptimeSettings, PermissionMode, CanUseToolCallback, CanUseToolResponse, CanUseToolResponseAllow, CanUseToolResponseDeny, TextContent, ImageContent, MessageContentItem, SendMessage, ListMessagesOptions, ListMessagesResult, AgentTool, AgentToolResult, AgentToolResultContent, AgentToolUpdateCallback, AnyAgentTool, } from "./types.js";
33
33
  export { Session } from "./session.js";
34
34
  export { jsonResult, readStringParam, readNumberParam, readBooleanParam, readStringArrayParam, } from "./tool-helpers.js";
35
35
  /**
@@ -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,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,EAEX,SAAS,EACT,eAAe,EACf,sBAAsB,EACtB,uBAAuB,EACvB,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EACL,UAAU,EACV,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;;;;;;;;;;;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"}
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,eAAe,EACf,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,0BAA0B,EAC1B,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,EAEtB,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,WAAW,EAEX,mBAAmB,EACnB,kBAAkB,EAElB,SAAS,EACT,eAAe,EACf,sBAAsB,EACtB,uBAAuB,EACvB,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EACL,UAAU,EACV,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;;;;;;;;;;;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
@@ -24,6 +24,133 @@ function sdkLog(tag, ...args) {
24
24
  if (process.env.DEBUG_SDK)
25
25
  console.error(`[SDK-Transport] [${tag}]`, ...args);
26
26
  }
27
+ function buildCliArgs(options) {
28
+ const args = [
29
+ "--output-format",
30
+ "stream-json",
31
+ "--input-format",
32
+ "stream-json"
33
+ ];
34
+ if (options.conversationId) {
35
+ args.push("--conversation", options.conversationId);
36
+ } else if (options.agentId) {
37
+ args.push("--agent", options.agentId);
38
+ if (options.newConversation) {
39
+ args.push("--new");
40
+ } else if (options.defaultConversation) {
41
+ args.push("--default");
42
+ }
43
+ } else if (options.createOnly) {
44
+ args.push("--new-agent");
45
+ } else if (options.newConversation) {
46
+ args.push("--new");
47
+ }
48
+ if (options.model) {
49
+ args.push("-m", options.model);
50
+ }
51
+ if (options.includePartialMessages) {
52
+ args.push("--include-partial-messages");
53
+ }
54
+ if (options.embedding) {
55
+ args.push("--embedding", options.embedding);
56
+ }
57
+ if (options.systemPrompt !== undefined) {
58
+ if (typeof options.systemPrompt === "string") {
59
+ const validPresets = [
60
+ "default",
61
+ "letta-claude",
62
+ "letta-codex",
63
+ "letta-gemini",
64
+ "claude",
65
+ "codex",
66
+ "gemini"
67
+ ];
68
+ if (validPresets.includes(options.systemPrompt)) {
69
+ args.push("--system", options.systemPrompt);
70
+ } else {
71
+ args.push("--system-custom", options.systemPrompt);
72
+ }
73
+ } else {
74
+ args.push("--system", options.systemPrompt.preset);
75
+ if (options.systemPrompt.append) {
76
+ args.push("--system-append", options.systemPrompt.append);
77
+ }
78
+ }
79
+ }
80
+ if (options.memory !== undefined && !options.agentId) {
81
+ if (options.memory.length === 0) {
82
+ args.push("--init-blocks", "");
83
+ } else {
84
+ const presetNames = [];
85
+ const memoryBlocksJson = [];
86
+ for (const item of options.memory) {
87
+ if (typeof item === "string") {
88
+ presetNames.push(item);
89
+ } else if ("blockId" in item) {
90
+ memoryBlocksJson.push(item);
91
+ } else {
92
+ memoryBlocksJson.push(item);
93
+ }
94
+ }
95
+ if (memoryBlocksJson.length > 0) {
96
+ args.push("--memory-blocks", JSON.stringify(memoryBlocksJson));
97
+ if (presetNames.length > 0) {
98
+ console.warn("[letta-code-sdk] Using custom memory blocks. " + `Preset blocks are ignored when custom blocks are provided: ${presetNames.join(", ")}`);
99
+ }
100
+ } else if (presetNames.length > 0) {
101
+ args.push("--init-blocks", presetNames.join(","));
102
+ }
103
+ }
104
+ }
105
+ if (!options.agentId) {
106
+ if (options.persona !== undefined) {
107
+ args.push("--block-value", `persona=${options.persona}`);
108
+ }
109
+ if (options.human !== undefined) {
110
+ args.push("--block-value", `human=${options.human}`);
111
+ }
112
+ }
113
+ if (options.permissionMode === "bypassPermissions") {
114
+ args.push("--yolo");
115
+ } else if (options.permissionMode && options.permissionMode !== "default") {
116
+ args.push("--permission-mode", options.permissionMode);
117
+ }
118
+ if (options.allowedTools) {
119
+ args.push("--allowedTools", options.allowedTools.join(","));
120
+ }
121
+ if (options.disallowedTools) {
122
+ args.push("--disallowedTools", options.disallowedTools.join(","));
123
+ }
124
+ if (options.tags && options.tags.length > 0) {
125
+ args.push("--tags", options.tags.join(","));
126
+ }
127
+ if (options.memfs === true) {
128
+ args.push("--memfs");
129
+ } else if (options.memfs === false) {
130
+ args.push("--no-memfs");
131
+ }
132
+ if (options.skillSources !== undefined) {
133
+ const sources = [...new Set(options.skillSources)];
134
+ if (sources.length === 0) {
135
+ args.push("--no-skills");
136
+ } else {
137
+ args.push("--skill-sources", sources.join(","));
138
+ }
139
+ }
140
+ if (options.systemInfoReminder === false) {
141
+ args.push("--no-system-info-reminder");
142
+ }
143
+ if (options.sleeptime?.trigger !== undefined) {
144
+ args.push("--reflection-trigger", options.sleeptime.trigger);
145
+ }
146
+ if (options.sleeptime?.behavior !== undefined) {
147
+ args.push("--reflection-behavior", options.sleeptime.behavior);
148
+ }
149
+ if (options.sleeptime?.stepCount !== undefined) {
150
+ args.push("--reflection-step-count", String(options.sleeptime.stepCount));
151
+ }
152
+ return args;
153
+ }
27
154
 
28
155
  class SubprocessTransport {
29
156
  options;
@@ -169,106 +296,7 @@ class SubprocessTransport {
169
296
  }
170
297
  }
171
298
  buildArgs() {
172
- const args = [
173
- "--output-format",
174
- "stream-json",
175
- "--input-format",
176
- "stream-json"
177
- ];
178
- if (this.options.conversationId) {
179
- args.push("--conversation", this.options.conversationId);
180
- } else if (this.options.agentId) {
181
- args.push("--agent", this.options.agentId);
182
- if (this.options.newConversation) {
183
- args.push("--new");
184
- } else if (this.options.defaultConversation) {
185
- args.push("--default");
186
- }
187
- } else if (this.options.createOnly) {
188
- args.push("--new-agent");
189
- } else if (this.options.newConversation) {
190
- args.push("--new");
191
- }
192
- if (this.options.model) {
193
- args.push("-m", this.options.model);
194
- }
195
- if (this.options.embedding) {
196
- args.push("--embedding", this.options.embedding);
197
- }
198
- if (this.options.systemPrompt !== undefined) {
199
- if (typeof this.options.systemPrompt === "string") {
200
- const validPresets = [
201
- "default",
202
- "letta-claude",
203
- "letta-codex",
204
- "letta-gemini",
205
- "claude",
206
- "codex",
207
- "gemini"
208
- ];
209
- if (validPresets.includes(this.options.systemPrompt)) {
210
- args.push("--system", this.options.systemPrompt);
211
- } else {
212
- args.push("--system-custom", this.options.systemPrompt);
213
- }
214
- } else {
215
- args.push("--system", this.options.systemPrompt.preset);
216
- if (this.options.systemPrompt.append) {
217
- args.push("--system-append", this.options.systemPrompt.append);
218
- }
219
- }
220
- }
221
- if (this.options.memory !== undefined && !this.options.agentId) {
222
- if (this.options.memory.length === 0) {
223
- args.push("--init-blocks", "");
224
- } else {
225
- const presetNames = [];
226
- const memoryBlocksJson = [];
227
- for (const item of this.options.memory) {
228
- if (typeof item === "string") {
229
- presetNames.push(item);
230
- } else if ("blockId" in item) {
231
- memoryBlocksJson.push(item);
232
- } else {
233
- memoryBlocksJson.push(item);
234
- }
235
- }
236
- if (memoryBlocksJson.length > 0) {
237
- args.push("--memory-blocks", JSON.stringify(memoryBlocksJson));
238
- if (presetNames.length > 0) {
239
- console.warn("[letta-code-sdk] Using custom memory blocks. " + `Preset blocks are ignored when custom blocks are provided: ${presetNames.join(", ")}`);
240
- }
241
- } else if (presetNames.length > 0) {
242
- args.push("--init-blocks", presetNames.join(","));
243
- }
244
- }
245
- }
246
- if (!this.options.agentId) {
247
- if (this.options.persona !== undefined) {
248
- args.push("--block-value", `persona=${this.options.persona}`);
249
- }
250
- if (this.options.human !== undefined) {
251
- args.push("--block-value", `human=${this.options.human}`);
252
- }
253
- }
254
- if (this.options.permissionMode === "bypassPermissions") {
255
- args.push("--yolo");
256
- } else if (this.options.permissionMode && this.options.permissionMode !== "default") {
257
- args.push("--permission-mode", this.options.permissionMode);
258
- }
259
- if (this.options.allowedTools) {
260
- args.push("--allowedTools", this.options.allowedTools.join(","));
261
- }
262
- if (this.options.disallowedTools) {
263
- args.push("--disallowedTools", this.options.disallowedTools.join(","));
264
- }
265
- if (this.options.tags && this.options.tags.length > 0) {
266
- args.push("--tags", this.options.tags.join(","));
267
- }
268
- if (this.options.memfs) {
269
- args.push("--memfs");
270
- }
271
- return args;
299
+ return buildCliArgs(this.options);
272
300
  }
273
301
  async findCli() {
274
302
  const { existsSync } = await import("node:fs");
@@ -336,6 +364,7 @@ class Session {
336
364
  pumpPromise = null;
337
365
  pumpClosed = false;
338
366
  droppedStreamMessages = 0;
367
+ controlResponseWaiters = new Map;
339
368
  constructor(options = {}) {
340
369
  this.options = options;
341
370
  this.transport = new SubprocessTransport(options);
@@ -389,7 +418,15 @@ class Session {
389
418
  sessionId: initMsg.session_id,
390
419
  conversationId: initMsg.conversation_id,
391
420
  model: initMsg.model,
392
- tools: allTools
421
+ tools: allTools,
422
+ memfsEnabled: initMsg.memfs_enabled,
423
+ skillSources: initMsg.skill_sources,
424
+ systemInfoReminderEnabled: initMsg.system_info_reminder_enabled,
425
+ sleeptime: initMsg.reflection_trigger && initMsg.reflection_behavior && typeof initMsg.reflection_step_count === "number" ? {
426
+ trigger: initMsg.reflection_trigger,
427
+ behavior: initMsg.reflection_behavior,
428
+ stepCount: initMsg.reflection_step_count
429
+ } : undefined
393
430
  };
394
431
  }
395
432
  }
@@ -457,6 +494,18 @@ class Session {
457
494
  }
458
495
  continue;
459
496
  }
497
+ if (wireMsg.type === "control_response") {
498
+ const respMsg = wireMsg;
499
+ const requestId = respMsg.response?.request_id;
500
+ if (requestId && this.controlResponseWaiters.has(requestId)) {
501
+ const resolve = this.controlResponseWaiters.get(requestId);
502
+ this.controlResponseWaiters.delete(requestId);
503
+ resolve(respMsg.response);
504
+ } else {
505
+ sessionLog("pump", `DROPPED unmatched control_response: request_id=${requestId ?? "N/A"}`);
506
+ }
507
+ continue;
508
+ }
460
509
  const sdkMsg = this.transformMessage(wireMsg);
461
510
  if (sdkMsg) {
462
511
  this.enqueueStreamMessage(sdkMsg);
@@ -515,6 +564,10 @@ class Session {
515
564
  resolve(msg);
516
565
  }
517
566
  this.streamResolvers = [];
567
+ for (const resolve of this.controlResponseWaiters.values()) {
568
+ resolve({ subtype: "error", error: "session closed" });
569
+ }
570
+ this.controlResponseWaiters.clear();
518
571
  }
519
572
  async registerExternalTools() {
520
573
  const toolDefs = Array.from(this.externalTools.values()).map((tool) => ({
@@ -668,6 +721,40 @@ class Session {
668
721
  request: { subtype: "interrupt" }
669
722
  });
670
723
  }
724
+ async listMessages(options = {}) {
725
+ if (!this.initialized) {
726
+ throw new Error("Session must be initialized before calling listMessages()");
727
+ }
728
+ const requestId = `list-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
729
+ const responsePromise = new Promise((resolve) => {
730
+ this.controlResponseWaiters.set(requestId, resolve);
731
+ });
732
+ await this.transport.write({
733
+ type: "control_request",
734
+ request_id: requestId,
735
+ request: {
736
+ subtype: "list_messages",
737
+ ...options.conversationId ? { conversation_id: options.conversationId } : {},
738
+ ...options.before ? { before: options.before } : {},
739
+ ...options.after ? { after: options.after } : {},
740
+ ...options.order ? { order: options.order } : {},
741
+ ...options.limit !== undefined ? { limit: options.limit } : {}
742
+ }
743
+ });
744
+ const resp = await responsePromise;
745
+ if (!resp) {
746
+ throw new Error("Session closed before listMessages response arrived");
747
+ }
748
+ if (resp.subtype === "error") {
749
+ throw new Error(resp.error ?? "listMessages failed");
750
+ }
751
+ const payload = resp.response;
752
+ return {
753
+ messages: payload?.messages ?? [],
754
+ nextBefore: payload?.next_before ?? null,
755
+ hasMore: payload?.has_more ?? false
756
+ };
757
+ }
671
758
  close() {
672
759
  sessionLog("close", `closing session (agent=${this._agentId}, conversation=${this._conversationId})`);
673
760
  this.transport.close();
@@ -695,7 +782,15 @@ class Session {
695
782
  sessionId: msg.session_id,
696
783
  conversationId: msg.conversation_id,
697
784
  model: msg.model,
698
- tools: msg.tools
785
+ tools: msg.tools,
786
+ memfsEnabled: msg.memfs_enabled,
787
+ skillSources: msg.skill_sources,
788
+ systemInfoReminderEnabled: msg.system_info_reminder_enabled,
789
+ sleeptime: msg.reflection_trigger && msg.reflection_behavior && typeof msg.reflection_step_count === "number" ? {
790
+ trigger: msg.reflection_trigger,
791
+ behavior: msg.reflection_behavior,
792
+ stepCount: msg.reflection_step_count
793
+ } : undefined
699
794
  };
700
795
  }
701
796
  if (wireMsg.type === "message" && "message_type" in wireMsg) {
@@ -707,7 +802,7 @@ class Session {
707
802
  uuid: msg.uuid
708
803
  };
709
804
  }
710
- if (msg.message_type === "tool_call_message") {
805
+ if (msg.message_type === "tool_call_message" || msg.message_type === "approval_request_message") {
711
806
  const toolCall = msg.tool_calls?.[0] || msg.tool_call;
712
807
  if (toolCall) {
713
808
  let toolInput = {};
@@ -763,11 +858,38 @@ class Session {
763
858
  conversationId: msg.conversation_id
764
859
  };
765
860
  }
861
+ if (wireMsg.type === "error") {
862
+ const msg = wireMsg;
863
+ return {
864
+ type: "error",
865
+ message: msg.message,
866
+ stopReason: msg.stop_reason,
867
+ runId: msg.run_id,
868
+ apiError: msg.api_error
869
+ };
870
+ }
871
+ if (wireMsg.type === "retry") {
872
+ const msg = wireMsg;
873
+ return {
874
+ type: "retry",
875
+ reason: msg.reason,
876
+ attempt: msg.attempt,
877
+ maxAttempts: msg.max_attempts,
878
+ delayMs: msg.delay_ms,
879
+ runId: msg.run_id
880
+ };
881
+ }
766
882
  return null;
767
883
  }
768
884
  }
769
885
 
770
886
  // src/validation.ts
887
+ var VALID_SKILL_SOURCES = [
888
+ "bundled",
889
+ "global",
890
+ "agent",
891
+ "project"
892
+ ];
771
893
  function getBlockLabels(memory) {
772
894
  return memory.map((item) => {
773
895
  if (typeof item === "string")
@@ -791,10 +913,36 @@ function validateSystemPromptPreset(preset) {
791
913
  throw new Error(`Invalid system prompt preset '${preset}'. ` + `Valid presets: ${validPresets.join(", ")}`);
792
914
  }
793
915
  }
916
+ function validateSkillSources(sources) {
917
+ if (sources === undefined) {
918
+ return;
919
+ }
920
+ for (const source of sources) {
921
+ if (!VALID_SKILL_SOURCES.includes(source)) {
922
+ throw new Error(`Invalid skill source '${source}'. Valid values: ${VALID_SKILL_SOURCES.join(", ")}`);
923
+ }
924
+ }
925
+ }
926
+ function validateSleeptimeOptions(sleeptime) {
927
+ if (sleeptime === undefined) {
928
+ return;
929
+ }
930
+ if (sleeptime.trigger !== undefined && !["off", "step-count", "compaction-event"].includes(sleeptime.trigger)) {
931
+ throw new Error(`Invalid sleeptime.trigger '${String(sleeptime.trigger)}'. Valid values: off, step-count, compaction-event`);
932
+ }
933
+ if (sleeptime.behavior !== undefined && !["reminder", "auto-launch"].includes(sleeptime.behavior)) {
934
+ throw new Error(`Invalid sleeptime.behavior '${String(sleeptime.behavior)}'. Valid values: reminder, auto-launch`);
935
+ }
936
+ if (sleeptime.stepCount !== undefined && (!Number.isInteger(sleeptime.stepCount) || sleeptime.stepCount <= 0)) {
937
+ throw new Error("Invalid sleeptime.stepCount. Expected a positive integer.");
938
+ }
939
+ }
794
940
  function validateCreateSessionOptions(options) {
795
941
  if (options.systemPrompt !== undefined) {
796
942
  validateSystemPromptPreset(options.systemPrompt);
797
943
  }
944
+ validateSkillSources(options.skillSources);
945
+ validateSleeptimeOptions(options.sleeptime);
798
946
  }
799
947
  function validateCreateAgentOptions(options) {
800
948
  if (options.memory !== undefined) {
@@ -822,6 +970,8 @@ function validateCreateAgentOptions(options) {
822
970
  validateSystemPromptPreset(options.systemPrompt);
823
971
  }
824
972
  }
973
+ validateSkillSources(options.skillSources);
974
+ validateSleeptimeOptions(options.sleeptime);
825
975
  }
826
976
  // src/tool-helpers.ts
827
977
  function jsonResult(payload) {
@@ -1014,4 +1164,4 @@ export {
1014
1164
  Session
1015
1165
  };
1016
1166
 
1017
- //# debugId=EBF6AB2D6E3DB54E64756E2164756E21
1167
+ //# debugId=CF8C45377A21CFA464756E2164756E21
package/dist/index.js.map CHANGED
@@ -2,14 +2,14 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/transport.ts", "../src/interactiveToolPolicy.ts", "../src/session.ts", "../src/validation.ts", "../src/tool-helpers.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 { InternalSessionOptions, WireMessage } from \"./types.js\";\n\n// All logging gated behind DEBUG_SDK env var\nfunction sdkLog(tag: string, ...args: unknown[]) {\n if (process.env.DEBUG_SDK) console.error(`[SDK-Transport] [${tag}]`, ...args);\n}\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 | null) => void> = [];\n private closed = false;\n private agentId?: string;\n private wireMessageCount = 0;\n private lastMessageAt = 0;\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 sdkLog(\"connect\", `CLI: ${cliPath}`);\n sdkLog(\"connect\", `args: ${args.join(\" \")}`);\n sdkLog(\"connect\", `cwd: ${this.options.cwd || process.cwd()}`);\n sdkLog(\"connect\", `permissionMode: ${this.options.permissionMode || \"default\"}`);\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 const pid = this.process.pid;\n sdkLog(\"connect\", `CLI process spawned, pid=${pid}`);\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 // Non-JSON line from CLI stdout - could be important debug info\n sdkLog(\"stdout\", `[non-JSON] ${line.slice(0, 500)}`);\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 //\n // BUG FIX: When the CLI subprocess exits while read() has a pending\n // resolver waiting for the next message, that resolver would never fire.\n // The messages() async generator would be stuck in `await this.read()`\n // forever, causing session.stream() to hang, which deadlocks the\n // caller's processing mutex. Resolving pending readers with null on\n // process exit lets messages() break out of its loop cleanly.\n this.process.on(\"close\", (code, signal) => {\n if (code !== 0 && code !== null) {\n console.error(`[letta-code-sdk] CLI process exited with code ${code}`);\n }\n sdkLog(\"close\", `CLI process exited: pid=${pid} code=${code} signal=${signal} wireMessages=${this.wireMessageCount} msSinceLastMsg=${this.lastMessageAt ? Date.now() - this.lastMessageAt : 0} pendingResolvers=${this.messageResolvers.length} queueLen=${this.messageQueue.length}`);\n this.closed = true;\n // Flush pending readers so they don't hang forever (see comment above)\n for (const resolve of this.messageResolvers) {\n resolve(null);\n }\n this.messageResolvers = [];\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 const err = new Error(`Transport not connected (closed=${this.closed}, pid=${this.process?.pid}, stdin=${!!this.process?.stdin})`);\n sdkLog(\"write\", err.message);\n throw err;\n }\n const payload = data as Record<string, unknown>;\n sdkLog(\"write\", `type=${payload.type} subtype=${(payload.request as Record<string, unknown>)?.subtype || (payload.response as Record<string, unknown>)?.subtype || \"N/A\"}`);\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 sdkLog(\"read\", `returning null (closed), total wireMessages=${this.wireMessageCount}`);\n return null;\n }\n\n // Wait for next message\n sdkLog(\"read\", `waiting for next message (resolvers=${this.messageResolvers.length + 1}, queue=${this.messageQueue.length})`);\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) {\n sdkLog(\"messages\", `iterator ending (closed=${this.closed}, wireMessages=${this.wireMessageCount})`);\n break;\n }\n yield msg;\n }\n }\n\n /**\n * Close the transport\n */\n close(): void {\n sdkLog(\"close\", `explicit close called (wireMessages=${this.wireMessageCount}, pendingResolvers=${this.messageResolvers.length}, pid=${this.process?.pid})`);\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);\n }\n this.messageResolvers = [];\n }\n\n get isClosed(): boolean {\n return this.closed;\n }\n\n private handleMessage(msg: WireMessage): void {\n this.wireMessageCount++;\n this.lastMessageAt = Date.now();\n\n // Compact log of every wire message for traceability\n const wirePayload = msg as unknown as Record<string, unknown>;\n const msgType = wirePayload.message_type || wirePayload.subtype || \"\";\n sdkLog(\"wire\", `#${this.wireMessageCount} type=${msg.type} ${msgType ? `msg_type=${msgType}` : \"\"} resolvers=${this.messageResolvers.length} queue=${this.messageQueue.length}`);\n\n // Always log critical message types (result, errors, approval)\n if (msg.type === \"result\") {\n const result = wirePayload as unknown as { subtype?: string; result?: string; duration_ms?: number; stop_reason?: string };\n sdkLog(\"wire\", `RESULT: subtype=${result.subtype} stop_reason=${result.stop_reason || \"N/A\"} duration=${result.duration_ms}ms resultLen=${result.result?.length || 0}`);\n }\n\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 sdkLog(\"wire\", `INIT: agent_id=${this.agentId}`);\n }\n\n // Log control requests (approval flow)\n if (msg.type === \"control_request\") {\n const req = wirePayload as unknown as { request_id?: string; request?: { subtype?: string; tool_name?: string } };\n sdkLog(\"wire\", `CONTROL_REQUEST: id=${req.request_id} subtype=${req.request?.subtype} tool=${req.request?.tool_name || \"N/A\"}`);\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.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 // Embedding model\n if (this.options.embedding) {\n args.push(\"--embedding\", this.options.embedding);\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 // Keep using alias for backwards compatibility\n args.push(\"--yolo\");\n } else if (\n this.options.permissionMode &&\n this.options.permissionMode !== \"default\"\n ) {\n args.push(\"--permission-mode\", this.options.permissionMode);\n }\n\n // Allowed tools\n if (this.options.allowedTools) {\n args.push(\"--allowedTools\", this.options.allowedTools.join(\",\"));\n }\n if (this.options.disallowedTools) {\n args.push(\"--disallowedTools\", this.options.disallowedTools.join(\",\"));\n }\n\n // Tags\n if (this.options.tags && this.options.tags.length > 0) {\n args.push(\"--tags\", this.options.tags.join(\",\"));\n }\n\n // Memory filesystem\n if (this.options.memfs) {\n args.push(\"--memfs\");\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",
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\n// All logging gated behind DEBUG_SDK env var\nfunction sdkLog(tag: string, ...args: unknown[]) {\n if (process.env.DEBUG_SDK) console.error(`[SDK-Transport] [${tag}]`, ...args);\n}\n\n/**\n * Build the CLI argument array for a given set of session options.\n *\n * Exported as a pure function for testing — this IS the real production code\n * path. SubprocessTransport.buildArgs() delegates here.\n */\nexport function buildCliArgs(options: InternalSessionOptions): string[] {\n const args: string[] = [\n \"--output-format\",\n \"stream-json\",\n \"--input-format\",\n \"stream-json\",\n ];\n\n // Conversation and agent handling\n if (options.conversationId) {\n args.push(\"--conversation\", options.conversationId);\n } else if (options.agentId) {\n args.push(\"--agent\", options.agentId);\n if (options.newConversation) {\n args.push(\"--new\");\n } else if (options.defaultConversation) {\n args.push(\"--default\");\n }\n } else if (options.createOnly) {\n args.push(\"--new-agent\");\n } else if (options.newConversation) {\n args.push(\"--new\");\n }\n\n // Model\n if (options.model) {\n args.push(\"-m\", options.model);\n }\n\n // Partial message streaming\n if (options.includePartialMessages) {\n args.push(\"--include-partial-messages\");\n }\n\n // Embedding model\n if (options.embedding) {\n args.push(\"--embedding\", options.embedding);\n }\n\n // System prompt configuration\n if (options.systemPrompt !== undefined) {\n if (typeof options.systemPrompt === \"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(options.systemPrompt)) {\n args.push(\"--system\", options.systemPrompt);\n } else {\n args.push(\"--system-custom\", options.systemPrompt);\n }\n } else {\n args.push(\"--system\", options.systemPrompt.preset);\n if (options.systemPrompt.append) {\n args.push(\"--system-append\", options.systemPrompt.append);\n }\n }\n }\n\n // Memory blocks (only for new agents)\n if (options.memory !== undefined && !options.agentId) {\n if (options.memory.length === 0) {\n args.push(\"--init-blocks\", \"\");\n } else {\n const presetNames: string[] = [];\n const memoryBlocksJson: Array<\n | { label: string; value: string }\n | { blockId: string }\n > = [];\n\n for (const item of options.memory) {\n if (typeof item === \"string\") {\n presetNames.push(item);\n } else if (\"blockId\" in item) {\n memoryBlocksJson.push(item as { blockId: string });\n } else {\n memoryBlocksJson.push(item as { label: string; value: string });\n }\n }\n\n if (memoryBlocksJson.length > 0) {\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 args.push(\"--init-blocks\", presetNames.join(\",\"));\n }\n }\n }\n\n // Convenience props for block values (only for new agents)\n if (!options.agentId) {\n if (options.persona !== undefined) {\n args.push(\"--block-value\", `persona=${options.persona}`);\n }\n if (options.human !== undefined) {\n args.push(\"--block-value\", `human=${options.human}`);\n }\n }\n\n // Permission mode\n if (options.permissionMode === \"bypassPermissions\") {\n args.push(\"--yolo\");\n } else if (options.permissionMode && options.permissionMode !== \"default\") {\n args.push(\"--permission-mode\", options.permissionMode);\n }\n\n // Allowed / disallowed tools\n if (options.allowedTools) {\n args.push(\"--allowedTools\", options.allowedTools.join(\",\"));\n }\n if (options.disallowedTools) {\n args.push(\"--disallowedTools\", options.disallowedTools.join(\",\"));\n }\n\n // Tags\n if (options.tags && options.tags.length > 0) {\n args.push(\"--tags\", options.tags.join(\",\"));\n }\n\n // Memory filesystem\n if (options.memfs === true) {\n args.push(\"--memfs\");\n } else if (options.memfs === false) {\n args.push(\"--no-memfs\");\n }\n\n // Skills sources\n if (options.skillSources !== undefined) {\n const sources = [...new Set(options.skillSources)];\n if (sources.length === 0) {\n args.push(\"--no-skills\");\n } else {\n args.push(\"--skill-sources\", sources.join(\",\"));\n }\n }\n\n // Session context reminder toggle\n if (options.systemInfoReminder === false) {\n args.push(\"--no-system-info-reminder\");\n }\n\n // Sleeptime / reflection settings\n if (options.sleeptime?.trigger !== undefined) {\n args.push(\"--reflection-trigger\", options.sleeptime.trigger);\n }\n if (options.sleeptime?.behavior !== undefined) {\n args.push(\"--reflection-behavior\", options.sleeptime.behavior);\n }\n if (options.sleeptime?.stepCount !== undefined) {\n args.push(\"--reflection-step-count\", String(options.sleeptime.stepCount));\n }\n\n return args;\n}\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 | null) => void> = [];\n private closed = false;\n private agentId?: string;\n private wireMessageCount = 0;\n private lastMessageAt = 0;\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 sdkLog(\"connect\", `CLI: ${cliPath}`);\n sdkLog(\"connect\", `args: ${args.join(\" \")}`);\n sdkLog(\"connect\", `cwd: ${this.options.cwd || process.cwd()}`);\n sdkLog(\"connect\", `permissionMode: ${this.options.permissionMode || \"default\"}`);\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 const pid = this.process.pid;\n sdkLog(\"connect\", `CLI process spawned, pid=${pid}`);\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 // Non-JSON line from CLI stdout - could be important debug info\n sdkLog(\"stdout\", `[non-JSON] ${line.slice(0, 500)}`);\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 //\n // BUG FIX: When the CLI subprocess exits while read() has a pending\n // resolver waiting for the next message, that resolver would never fire.\n // The messages() async generator would be stuck in `await this.read()`\n // forever, causing session.stream() to hang, which deadlocks the\n // caller's processing mutex. Resolving pending readers with null on\n // process exit lets messages() break out of its loop cleanly.\n this.process.on(\"close\", (code, signal) => {\n if (code !== 0 && code !== null) {\n console.error(`[letta-code-sdk] CLI process exited with code ${code}`);\n }\n sdkLog(\"close\", `CLI process exited: pid=${pid} code=${code} signal=${signal} wireMessages=${this.wireMessageCount} msSinceLastMsg=${this.lastMessageAt ? Date.now() - this.lastMessageAt : 0} pendingResolvers=${this.messageResolvers.length} queueLen=${this.messageQueue.length}`);\n this.closed = true;\n // Flush pending readers so they don't hang forever (see comment above)\n for (const resolve of this.messageResolvers) {\n resolve(null);\n }\n this.messageResolvers = [];\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 const err = new Error(`Transport not connected (closed=${this.closed}, pid=${this.process?.pid}, stdin=${!!this.process?.stdin})`);\n sdkLog(\"write\", err.message);\n throw err;\n }\n const payload = data as Record<string, unknown>;\n sdkLog(\"write\", `type=${payload.type} subtype=${(payload.request as Record<string, unknown>)?.subtype || (payload.response as Record<string, unknown>)?.subtype || \"N/A\"}`);\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 sdkLog(\"read\", `returning null (closed), total wireMessages=${this.wireMessageCount}`);\n return null;\n }\n\n // Wait for next message\n sdkLog(\"read\", `waiting for next message (resolvers=${this.messageResolvers.length + 1}, queue=${this.messageQueue.length})`);\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) {\n sdkLog(\"messages\", `iterator ending (closed=${this.closed}, wireMessages=${this.wireMessageCount})`);\n break;\n }\n yield msg;\n }\n }\n\n /**\n * Close the transport\n */\n close(): void {\n sdkLog(\"close\", `explicit close called (wireMessages=${this.wireMessageCount}, pendingResolvers=${this.messageResolvers.length}, pid=${this.process?.pid})`);\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);\n }\n this.messageResolvers = [];\n }\n\n get isClosed(): boolean {\n return this.closed;\n }\n\n private handleMessage(msg: WireMessage): void {\n this.wireMessageCount++;\n this.lastMessageAt = Date.now();\n\n // Compact log of every wire message for traceability\n const wirePayload = msg as unknown as Record<string, unknown>;\n const msgType = wirePayload.message_type || wirePayload.subtype || \"\";\n sdkLog(\"wire\", `#${this.wireMessageCount} type=${msg.type} ${msgType ? `msg_type=${msgType}` : \"\"} resolvers=${this.messageResolvers.length} queue=${this.messageQueue.length}`);\n\n // Always log critical message types (result, errors, approval)\n if (msg.type === \"result\") {\n const result = wirePayload as unknown as { subtype?: string; result?: string; duration_ms?: number; stop_reason?: string };\n sdkLog(\"wire\", `RESULT: subtype=${result.subtype} stop_reason=${result.stop_reason || \"N/A\"} duration=${result.duration_ms}ms resultLen=${result.result?.length || 0}`);\n }\n\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 sdkLog(\"wire\", `INIT: agent_id=${this.agentId}`);\n }\n\n // Log control requests (approval flow)\n if (msg.type === \"control_request\") {\n const req = wirePayload as unknown as { request_id?: string; request?: { subtype?: string; tool_name?: string } };\n sdkLog(\"wire\", `CONTROL_REQUEST: id=${req.request_id} subtype=${req.request?.subtype} tool=${req.request?.tool_name || \"N/A\"}`);\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 return buildCliArgs(this.options);\n }\n\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
6
  "// Interactive tool policy for SDK permission callbacks.\n// Centralizes behavior so transport/session logic doesn't hardcode names inline.\n\nconst INTERACTIVE_APPROVAL_TOOLS = new Set([\n \"AskUserQuestion\",\n \"EnterPlanMode\",\n \"ExitPlanMode\",\n]);\n\nconst RUNTIME_USER_INPUT_TOOLS = new Set([\"AskUserQuestion\", \"ExitPlanMode\"]);\n\nconst HEADLESS_AUTO_ALLOW_TOOLS = new Set([\"EnterPlanMode\"]);\n\nexport function isInteractiveApprovalTool(toolName: string): boolean {\n return INTERACTIVE_APPROVAL_TOOLS.has(toolName);\n}\n\nexport function requiresRuntimeUserInput(toolName: string): boolean {\n return RUNTIME_USER_INPUT_TOOLS.has(toolName);\n}\n\nexport function isHeadlessAutoAllowTool(toolName: string): boolean {\n return HEADLESS_AUTO_ALLOW_TOOLS.has(toolName);\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 InternalSessionOptions,\n SDKMessage,\n SDKInitMessage,\n SDKAssistantMessage,\n SDKResultMessage,\n WireMessage,\n ControlRequest,\n CanUseToolControlRequest,\n CanUseToolResponse,\n CanUseToolResponseAllow,\n CanUseToolResponseDeny,\n SendMessage,\n AnyAgentTool,\n ExecuteExternalToolRequest,\n} from \"./types.js\";\nimport {\n isHeadlessAutoAllowTool,\n requiresRuntimeUserInput,\n} from \"./interactiveToolPolicy.js\";\n\n\n// All logging gated behind DEBUG_SDK env var\nfunction sessionLog(tag: string, ...args: unknown[]) {\n if (process.env.DEBUG_SDK) console.error(`[SDK-Session] [${tag}]`, ...args);\n}\n\nconst MAX_BUFFERED_STREAM_MESSAGES = 100;\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 private externalTools: Map<string, AnyAgentTool> = new Map();\n private streamQueue: SDKMessage[] = [];\n private streamResolvers: Array<(msg: SDKMessage | null) => void> = [];\n private pumpPromise: Promise<void> | null = null;\n private pumpClosed = false;\n private droppedStreamMessages = 0;\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 // Store external tools in a map for quick lookup\n if (options.tools) {\n for (const tool of options.tools) {\n this.externalTools.set(tool.name, tool);\n }\n }\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 sessionLog(\"init\", \"connecting transport...\");\n await this.transport.connect();\n sessionLog(\"init\", \"transport connected, sending initialize request\");\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 sessionLog(\"init\", \"waiting for init message from CLI...\");\n for await (const msg of this.transport.messages()) {\n sessionLog(\"init\", `received wire message: type=${msg.type}`);\n\n if (msg.type === \"control_request\") {\n const handled = await this.handleControlRequest(msg as ControlRequest);\n if (!handled) {\n const wireMsgAny = msg as unknown as Record<string, unknown>;\n sessionLog(\"init\", `DROPPED unsupported control_request: subtype=${(wireMsgAny.request as Record<string, unknown>)?.subtype || \"N/A\"}`);\n }\n continue;\n }\n\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 this.startBackgroundPump();\n\n // Register external tools with CLI\n if (this.externalTools.size > 0) {\n await this.registerExternalTools();\n }\n\n // Include external tool names in the tools list\n const allTools = [\n ...initMsg.tools,\n ...Array.from(this.externalTools.keys()),\n ];\n\n sessionLog(\"init\", `initialized: agent=${initMsg.agent_id} conversation=${initMsg.conversation_id} model=${initMsg.model} tools=${allTools.length} (${this.externalTools.size} external)`);\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: allTools,\n };\n }\n }\n\n sessionLog(\"init\", \"ERROR: transport closed before init message received\");\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 sessionLog(\"send\", \"auto-initializing (not yet initialized)\");\n await this.initialize();\n }\n\n const preview = typeof message === \"string\"\n ? message.slice(0, 100)\n : Array.isArray(message) ? `[multimodal: ${message.length} parts]` : String(message).slice(0, 100);\n sessionLog(\"send\", `sending message: ${preview}${typeof message === \"string\" && message.length > 100 ? \"...\" : \"\"}`);\n\n await this.transport.write({\n type: \"user\",\n message: { role: \"user\", content: message },\n });\n sessionLog(\"send\", \"message written to transport\");\n }\n\n /**\n * Stream messages from the agent\n */\n async *stream(): AsyncGenerator<SDKMessage> {\n const streamStart = Date.now();\n let yieldCount = 0;\n let gotResult = false;\n\n this.startBackgroundPump();\n sessionLog(\"stream\", `starting stream (agent=${this._agentId}, conversation=${this._conversationId})`);\n\n while (true) {\n const sdkMsg = await this.nextBufferedMessage();\n if (!sdkMsg) {\n break;\n }\n\n yieldCount++;\n sessionLog(\"stream\", `yield #${yieldCount}: type=${sdkMsg.type}${sdkMsg.type === \"result\" ? ` success=${(sdkMsg as SDKResultMessage).success} error=${(sdkMsg as SDKResultMessage).error || \"none\"}` : \"\"}`);\n yield sdkMsg;\n\n // Stop on result message\n if (sdkMsg.type === \"result\") {\n gotResult = true;\n break;\n }\n }\n\n const elapsed = Date.now() - streamStart;\n sessionLog(\"stream\", `stream ended: duration=${elapsed}ms yielded=${yieldCount} dropped=${this.droppedStreamMessages} gotResult=${gotResult}`);\n if (!gotResult) {\n sessionLog(\"stream\", \"WARNING: stream ended WITHOUT a result message -- transport may have closed unexpectedly\");\n }\n }\n\n private startBackgroundPump(): void {\n if (this.pumpPromise) {\n return;\n }\n\n this.pumpClosed = false;\n this.pumpPromise = this.runBackgroundPump()\n .catch((err) => {\n sessionLog(\"pump\", `ERROR: ${err instanceof Error ? err.message : String(err)}`);\n })\n .finally(() => {\n this.pumpClosed = true;\n this.resolveAllStreamWaiters(null);\n });\n }\n\n private async runBackgroundPump(): Promise<void> {\n sessionLog(\"pump\", \"background pump started\");\n\n for await (const wireMsg of this.transport.messages()) {\n if (wireMsg.type === \"control_request\") {\n const handled = await this.handleControlRequest(wireMsg as ControlRequest);\n if (!handled) {\n const wireMsgAny = wireMsg as unknown as Record<string, unknown>;\n sessionLog(\"pump\", `DROPPED unsupported control_request: subtype=${(wireMsgAny.request as Record<string, unknown>)?.subtype || \"N/A\"}`);\n }\n continue;\n }\n\n const sdkMsg = this.transformMessage(wireMsg);\n if (sdkMsg) {\n this.enqueueStreamMessage(sdkMsg);\n } else {\n const wireMsgAny = wireMsg as unknown as Record<string, unknown>;\n sessionLog(\"pump\", `DROPPED wire message: type=${wireMsg.type} message_type=${wireMsgAny.message_type || \"N/A\"} subtype=${wireMsgAny.subtype || \"N/A\"}`);\n }\n }\n\n sessionLog(\"pump\", \"background pump ended\");\n }\n\n private async handleControlRequest(controlReq: ControlRequest): Promise<boolean> {\n // Widen to string to allow SDK-extension subtypes not in the protocol union\n const subtype: string = controlReq.request.subtype;\n sessionLog(\"pump\", `control_request: subtype=${subtype} tool=${(controlReq.request as CanUseToolControlRequest).tool_name || \"N/A\"}`);\n\n if (subtype === \"can_use_tool\") {\n await this.handleCanUseTool(\n controlReq.request_id,\n controlReq.request as CanUseToolControlRequest\n );\n return true;\n }\n\n if (subtype === \"execute_external_tool\") {\n // SDK extension: not in protocol ControlRequestBody union, extract fields via Record\n const rawReq = controlReq.request as Record<string, unknown>;\n await this.handleExecuteExternalTool(\n controlReq.request_id,\n {\n subtype: \"execute_external_tool\",\n tool_call_id: rawReq.tool_call_id as string,\n tool_name: rawReq.tool_name as string,\n input: rawReq.input as Record<string, unknown>,\n }\n );\n return true;\n }\n\n return false;\n }\n\n private enqueueStreamMessage(msg: SDKMessage): void {\n if (this.streamResolvers.length > 0) {\n const resolve = this.streamResolvers.shift()!;\n resolve(msg);\n return;\n }\n\n if (this.streamQueue.length >= MAX_BUFFERED_STREAM_MESSAGES) {\n this.streamQueue.shift();\n this.droppedStreamMessages++;\n sessionLog(\"pump\", `stream queue overflow: dropped oldest message (total_dropped=${this.droppedStreamMessages}, max=${MAX_BUFFERED_STREAM_MESSAGES})`);\n }\n\n this.streamQueue.push(msg);\n }\n\n private async nextBufferedMessage(): Promise<SDKMessage | null> {\n if (this.streamQueue.length > 0) {\n return this.streamQueue.shift()!;\n }\n\n if (this.pumpClosed) {\n return null;\n }\n\n return new Promise((resolve) => {\n this.streamResolvers.push(resolve);\n });\n }\n\n private resolveAllStreamWaiters(msg: SDKMessage | null): void {\n for (const resolve of this.streamResolvers) {\n resolve(msg);\n }\n this.streamResolvers = [];\n }\n\n /**\n * Register external tools with the CLI\n */\n private async registerExternalTools(): Promise<void> {\n const toolDefs = Array.from(this.externalTools.values()).map((tool) => ({\n name: tool.name,\n label: tool.label,\n description: tool.description,\n // Convert TypeBox schema to plain JSON Schema\n parameters: this.schemaToJsonSchema(tool.parameters),\n }));\n\n sessionLog(\"registerTools\", `registering ${toolDefs.length} external tools: ${toolDefs.map(t => t.name).join(\", \")}`);\n\n await this.transport.write({\n type: \"control_request\",\n request_id: `register_tools_${Date.now()}`,\n request: {\n subtype: \"register_external_tools\",\n tools: toolDefs,\n },\n });\n }\n\n /**\n * Convert TypeBox schema to JSON Schema\n */\n private schemaToJsonSchema(schema: unknown): Record<string, unknown> {\n // TypeBox schemas are already JSON Schema compatible\n // Just need to extract the schema object\n if (schema && typeof schema === \"object\") {\n // TypeBox schemas have these JSON Schema properties\n const s = schema as Record<string, unknown>;\n return {\n type: s.type,\n properties: s.properties,\n required: s.required,\n additionalProperties: s.additionalProperties,\n description: s.description,\n };\n }\n return { type: \"object\" };\n }\n\n /**\n * Handle execute_external_tool control request from CLI\n */\n private async handleExecuteExternalTool(\n requestId: string,\n req: ExecuteExternalToolRequest\n ): Promise<void> {\n const tool = this.externalTools.get(req.tool_name);\n \n if (!tool) {\n // Tool not found - send error result\n sessionLog(\"executeExternalTool\", `ERROR: unknown tool ${req.tool_name}`);\n await this.transport.write({\n type: \"control_response\",\n response: {\n subtype: \"external_tool_result\",\n request_id: requestId,\n tool_call_id: req.tool_call_id,\n content: [{ type: \"text\", text: `Unknown external tool: ${req.tool_name}` }],\n is_error: true,\n },\n });\n return;\n }\n\n try {\n sessionLog(\"executeExternalTool\", `executing ${req.tool_name} (call_id=${req.tool_call_id})`);\n // Execute the tool\n const result = await tool.execute(req.tool_call_id, req.input);\n \n // Send success result\n await this.transport.write({\n type: \"control_response\",\n response: {\n subtype: \"external_tool_result\",\n request_id: requestId,\n tool_call_id: req.tool_call_id,\n content: result.content,\n is_error: false,\n },\n });\n sessionLog(\"executeExternalTool\", `${req.tool_name} completed successfully`);\n } catch (err) {\n // Send error result\n const errorMessage = err instanceof Error ? err.message : String(err);\n sessionLog(\"executeExternalTool\", `${req.tool_name} failed: ${errorMessage}`);\n await this.transport.write({\n type: \"control_response\",\n response: {\n subtype: \"external_tool_result\",\n request_id: requestId,\n tool_call_id: req.tool_call_id,\n content: [{ type: \"text\", text: `Tool execution error: ${errorMessage}` }],\n is_error: true,\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 const toolName = req.tool_name;\n const hasCallback = typeof this.options.canUseTool === \"function\";\n const toolNeedsRuntimeUserInput = requiresRuntimeUserInput(toolName);\n const autoAllowWithoutCallback =\n isHeadlessAutoAllowTool(toolName);\n\n sessionLog(\"canUseTool\", `tool=${toolName} mode=${this.options.permissionMode || \"default\"} requestId=${requestId}`);\n\n // Tools that require runtime user input cannot be auto-allowed without a callback.\n if (toolNeedsRuntimeUserInput && !hasCallback) {\n response = {\n behavior: \"deny\",\n message: \"No canUseTool callback registered\",\n interrupt: false,\n };\n } else if (\n this.options.permissionMode === \"bypassPermissions\" &&\n !toolNeedsRuntimeUserInput\n ) {\n // bypassPermissions auto-allows non-interactive tools.\n sessionLog(\"canUseTool\", `AUTO-ALLOW ${toolName} (bypassPermissions)`);\n response = {\n behavior: \"allow\",\n updatedInput: null,\n updatedPermissions: [],\n } satisfies CanUseToolResponseAllow;\n } else if (hasCallback) {\n try {\n const result = await this.options.canUseTool!(toolName, 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 if (autoAllowWithoutCallback) {\n // Default headless behavior matches Claude: EnterPlanMode can proceed\n // without requiring a callback in bidirectional mode.\n sessionLog(\"canUseTool\", `AUTO-ALLOW ${toolName} (default behavior)`);\n response = {\n behavior: \"allow\",\n updatedInput: null,\n updatedPermissions: [],\n } satisfies CanUseToolResponseAllow;\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 const responseBehavior = \"behavior\" in response ? response.behavior : \"unknown\";\n sessionLog(\"canUseTool\", `responding: requestId=${requestId} behavior=${responseBehavior}`);\n await this.transport.write({\n type: \"control_response\",\n response: {\n subtype: \"success\",\n request_id: requestId,\n response,\n },\n });\n sessionLog(\"canUseTool\", `response sent for ${toolName}`);\n }\n\n /**\n * Abort the current operation (interrupt without closing the session)\n */\n async abort(): Promise<void> {\n sessionLog(\"abort\", `aborting session (agent=${this._agentId})`);\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 sessionLog(\"close\", `closing session (agent=${this._agentId}, conversation=${this._conversationId})`);\n this.transport.close();\n this.pumpClosed = true;\n this.resolveAllStreamWaiters(null);\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 stop_reason?: 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 stopReason: msg.stop_reason,\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 * 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",
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 InternalSessionOptions,\n SDKMessage,\n SDKInitMessage,\n SDKAssistantMessage,\n SDKResultMessage,\n MessageWire,\n WireMessage,\n ControlRequest,\n CanUseToolControlRequest,\n CanUseToolResponse,\n CanUseToolResponseAllow,\n CanUseToolResponseDeny,\n SendMessage,\n AnyAgentTool,\n ExecuteExternalToolRequest,\n ListMessagesOptions,\n ListMessagesResult,\n} from \"./types.js\";\nimport {\n isHeadlessAutoAllowTool,\n requiresRuntimeUserInput,\n} from \"./interactiveToolPolicy.js\";\n\n\n// All logging gated behind DEBUG_SDK env var\nfunction sessionLog(tag: string, ...args: unknown[]) {\n if (process.env.DEBUG_SDK) console.error(`[SDK-Session] [${tag}]`, ...args);\n}\n\nconst MAX_BUFFERED_STREAM_MESSAGES = 100;\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 private externalTools: Map<string, AnyAgentTool> = new Map();\n private streamQueue: SDKMessage[] = [];\n private streamResolvers: Array<(msg: SDKMessage | null) => void> = [];\n private pumpPromise: Promise<void> | null = null;\n private pumpClosed = false;\n private droppedStreamMessages = 0;\n // Waiters for SDK-initiated control requests (e.g., listMessages).\n // Keyed by request_id; pump resolves the matching waiter when it sees\n // a control_response with that request_id instead of queuing it as a stream msg.\n private controlResponseWaiters = new Map<\n string,\n (response: { subtype: string; response?: unknown; error?: string }) => void\n >();\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 // Store external tools in a map for quick lookup\n if (options.tools) {\n for (const tool of options.tools) {\n this.externalTools.set(tool.name, tool);\n }\n }\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 sessionLog(\"init\", \"connecting transport...\");\n await this.transport.connect();\n sessionLog(\"init\", \"transport connected, sending initialize request\");\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 sessionLog(\"init\", \"waiting for init message from CLI...\");\n for await (const msg of this.transport.messages()) {\n sessionLog(\"init\", `received wire message: type=${msg.type}`);\n\n if (msg.type === \"control_request\") {\n const handled = await this.handleControlRequest(msg as ControlRequest);\n if (!handled) {\n const wireMsgAny = msg as unknown as Record<string, unknown>;\n sessionLog(\"init\", `DROPPED unsupported control_request: subtype=${(wireMsgAny.request as Record<string, unknown>)?.subtype || \"N/A\"}`);\n }\n continue;\n }\n\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 memfs_enabled?: boolean;\n skill_sources?: Array<\"bundled\" | \"global\" | \"agent\" | \"project\">;\n system_info_reminder_enabled?: boolean;\n reflection_trigger?: \"off\" | \"step-count\" | \"compaction-event\";\n reflection_behavior?: \"reminder\" | \"auto-launch\";\n reflection_step_count?: number;\n };\n this._agentId = initMsg.agent_id;\n this._sessionId = initMsg.session_id;\n this._conversationId = initMsg.conversation_id;\n this.initialized = true;\n this.startBackgroundPump();\n\n // Register external tools with CLI\n if (this.externalTools.size > 0) {\n await this.registerExternalTools();\n }\n\n // Include external tool names in the tools list\n const allTools = [\n ...initMsg.tools,\n ...Array.from(this.externalTools.keys()),\n ];\n\n sessionLog(\"init\", `initialized: agent=${initMsg.agent_id} conversation=${initMsg.conversation_id} model=${initMsg.model} tools=${allTools.length} (${this.externalTools.size} external)`);\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: allTools,\n memfsEnabled: initMsg.memfs_enabled,\n skillSources: initMsg.skill_sources,\n systemInfoReminderEnabled: initMsg.system_info_reminder_enabled,\n sleeptime:\n initMsg.reflection_trigger &&\n initMsg.reflection_behavior &&\n typeof initMsg.reflection_step_count === \"number\"\n ? {\n trigger: initMsg.reflection_trigger,\n behavior: initMsg.reflection_behavior,\n stepCount: initMsg.reflection_step_count,\n }\n : undefined,\n };\n }\n }\n\n sessionLog(\"init\", \"ERROR: transport closed before init message received\");\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 sessionLog(\"send\", \"auto-initializing (not yet initialized)\");\n await this.initialize();\n }\n\n const preview = typeof message === \"string\"\n ? message.slice(0, 100)\n : Array.isArray(message) ? `[multimodal: ${message.length} parts]` : String(message).slice(0, 100);\n sessionLog(\"send\", `sending message: ${preview}${typeof message === \"string\" && message.length > 100 ? \"...\" : \"\"}`);\n\n await this.transport.write({\n type: \"user\",\n message: { role: \"user\", content: message },\n });\n sessionLog(\"send\", \"message written to transport\");\n }\n\n /**\n * Stream messages from the agent\n */\n async *stream(): AsyncGenerator<SDKMessage> {\n const streamStart = Date.now();\n let yieldCount = 0;\n let gotResult = false;\n\n this.startBackgroundPump();\n sessionLog(\"stream\", `starting stream (agent=${this._agentId}, conversation=${this._conversationId})`);\n\n while (true) {\n const sdkMsg = await this.nextBufferedMessage();\n if (!sdkMsg) {\n break;\n }\n\n yieldCount++;\n sessionLog(\"stream\", `yield #${yieldCount}: type=${sdkMsg.type}${sdkMsg.type === \"result\" ? ` success=${(sdkMsg as SDKResultMessage).success} error=${(sdkMsg as SDKResultMessage).error || \"none\"}` : \"\"}`);\n yield sdkMsg;\n\n // Stop on result message\n if (sdkMsg.type === \"result\") {\n gotResult = true;\n break;\n }\n }\n\n const elapsed = Date.now() - streamStart;\n sessionLog(\"stream\", `stream ended: duration=${elapsed}ms yielded=${yieldCount} dropped=${this.droppedStreamMessages} gotResult=${gotResult}`);\n if (!gotResult) {\n sessionLog(\"stream\", \"WARNING: stream ended WITHOUT a result message -- transport may have closed unexpectedly\");\n }\n }\n\n private startBackgroundPump(): void {\n if (this.pumpPromise) {\n return;\n }\n\n this.pumpClosed = false;\n this.pumpPromise = this.runBackgroundPump()\n .catch((err) => {\n sessionLog(\"pump\", `ERROR: ${err instanceof Error ? err.message : String(err)}`);\n })\n .finally(() => {\n this.pumpClosed = true;\n this.resolveAllStreamWaiters(null);\n });\n }\n\n private async runBackgroundPump(): Promise<void> {\n sessionLog(\"pump\", \"background pump started\");\n\n for await (const wireMsg of this.transport.messages()) {\n if (wireMsg.type === \"control_request\") {\n const handled = await this.handleControlRequest(wireMsg as ControlRequest);\n if (!handled) {\n const wireMsgAny = wireMsg as unknown as Record<string, unknown>;\n sessionLog(\"pump\", `DROPPED unsupported control_request: subtype=${(wireMsgAny.request as Record<string, unknown>)?.subtype || \"N/A\"}`);\n }\n continue;\n }\n\n // Route control_response to a registered waiter (e.g., from listMessages).\n // Unmatched control_responses are logged and dropped — they never reach the stream.\n if (wireMsg.type === \"control_response\") {\n const respMsg = wireMsg as unknown as {\n response: { subtype: string; request_id?: string; response?: unknown; error?: string };\n };\n const requestId = respMsg.response?.request_id;\n if (requestId && this.controlResponseWaiters.has(requestId)) {\n const resolve = this.controlResponseWaiters.get(requestId)!;\n this.controlResponseWaiters.delete(requestId);\n resolve(respMsg.response);\n } else {\n sessionLog(\"pump\", `DROPPED unmatched control_response: request_id=${requestId ?? \"N/A\"}`);\n }\n continue;\n }\n\n const sdkMsg = this.transformMessage(wireMsg);\n if (sdkMsg) {\n this.enqueueStreamMessage(sdkMsg);\n } else {\n const wireMsgAny = wireMsg as unknown as Record<string, unknown>;\n sessionLog(\"pump\", `DROPPED wire message: type=${wireMsg.type} message_type=${wireMsgAny.message_type || \"N/A\"} subtype=${wireMsgAny.subtype || \"N/A\"}`);\n }\n }\n\n sessionLog(\"pump\", \"background pump ended\");\n }\n\n private async handleControlRequest(controlReq: ControlRequest): Promise<boolean> {\n // Widen to string to allow SDK-extension subtypes not in the protocol union\n const subtype: string = controlReq.request.subtype;\n sessionLog(\"pump\", `control_request: subtype=${subtype} tool=${(controlReq.request as CanUseToolControlRequest).tool_name || \"N/A\"}`);\n\n if (subtype === \"can_use_tool\") {\n await this.handleCanUseTool(\n controlReq.request_id,\n controlReq.request as CanUseToolControlRequest\n );\n return true;\n }\n\n if (subtype === \"execute_external_tool\") {\n // SDK extension: not in protocol ControlRequestBody union, extract fields via Record\n const rawReq = controlReq.request as Record<string, unknown>;\n await this.handleExecuteExternalTool(\n controlReq.request_id,\n {\n subtype: \"execute_external_tool\",\n tool_call_id: rawReq.tool_call_id as string,\n tool_name: rawReq.tool_name as string,\n input: rawReq.input as Record<string, unknown>,\n }\n );\n return true;\n }\n\n return false;\n }\n\n private enqueueStreamMessage(msg: SDKMessage): void {\n if (this.streamResolvers.length > 0) {\n const resolve = this.streamResolvers.shift()!;\n resolve(msg);\n return;\n }\n\n if (this.streamQueue.length >= MAX_BUFFERED_STREAM_MESSAGES) {\n this.streamQueue.shift();\n this.droppedStreamMessages++;\n sessionLog(\"pump\", `stream queue overflow: dropped oldest message (total_dropped=${this.droppedStreamMessages}, max=${MAX_BUFFERED_STREAM_MESSAGES})`);\n }\n\n this.streamQueue.push(msg);\n }\n\n private async nextBufferedMessage(): Promise<SDKMessage | null> {\n if (this.streamQueue.length > 0) {\n return this.streamQueue.shift()!;\n }\n\n if (this.pumpClosed) {\n return null;\n }\n\n return new Promise((resolve) => {\n this.streamResolvers.push(resolve);\n });\n }\n\n private resolveAllStreamWaiters(msg: SDKMessage | null): void {\n for (const resolve of this.streamResolvers) {\n resolve(msg);\n }\n this.streamResolvers = [];\n // Also cancel any in-flight control request waiters (e.g., listMessages)\n for (const resolve of this.controlResponseWaiters.values()) {\n resolve({ subtype: \"error\", error: \"session closed\" });\n }\n this.controlResponseWaiters.clear();\n }\n\n /**\n * Register external tools with the CLI\n */\n private async registerExternalTools(): Promise<void> {\n const toolDefs = Array.from(this.externalTools.values()).map((tool) => ({\n name: tool.name,\n label: tool.label,\n description: tool.description,\n // Convert TypeBox schema to plain JSON Schema\n parameters: this.schemaToJsonSchema(tool.parameters),\n }));\n\n sessionLog(\"registerTools\", `registering ${toolDefs.length} external tools: ${toolDefs.map(t => t.name).join(\", \")}`);\n\n await this.transport.write({\n type: \"control_request\",\n request_id: `register_tools_${Date.now()}`,\n request: {\n subtype: \"register_external_tools\",\n tools: toolDefs,\n },\n });\n }\n\n /**\n * Convert TypeBox schema to JSON Schema\n */\n private schemaToJsonSchema(schema: unknown): Record<string, unknown> {\n // TypeBox schemas are already JSON Schema compatible\n // Just need to extract the schema object\n if (schema && typeof schema === \"object\") {\n // TypeBox schemas have these JSON Schema properties\n const s = schema as Record<string, unknown>;\n return {\n type: s.type,\n properties: s.properties,\n required: s.required,\n additionalProperties: s.additionalProperties,\n description: s.description,\n };\n }\n return { type: \"object\" };\n }\n\n /**\n * Handle execute_external_tool control request from CLI\n */\n private async handleExecuteExternalTool(\n requestId: string,\n req: ExecuteExternalToolRequest\n ): Promise<void> {\n const tool = this.externalTools.get(req.tool_name);\n \n if (!tool) {\n // Tool not found - send error result\n sessionLog(\"executeExternalTool\", `ERROR: unknown tool ${req.tool_name}`);\n await this.transport.write({\n type: \"control_response\",\n response: {\n subtype: \"external_tool_result\",\n request_id: requestId,\n tool_call_id: req.tool_call_id,\n content: [{ type: \"text\", text: `Unknown external tool: ${req.tool_name}` }],\n is_error: true,\n },\n });\n return;\n }\n\n try {\n sessionLog(\"executeExternalTool\", `executing ${req.tool_name} (call_id=${req.tool_call_id})`);\n // Execute the tool\n const result = await tool.execute(req.tool_call_id, req.input);\n \n // Send success result\n await this.transport.write({\n type: \"control_response\",\n response: {\n subtype: \"external_tool_result\",\n request_id: requestId,\n tool_call_id: req.tool_call_id,\n content: result.content,\n is_error: false,\n },\n });\n sessionLog(\"executeExternalTool\", `${req.tool_name} completed successfully`);\n } catch (err) {\n // Send error result\n const errorMessage = err instanceof Error ? err.message : String(err);\n sessionLog(\"executeExternalTool\", `${req.tool_name} failed: ${errorMessage}`);\n await this.transport.write({\n type: \"control_response\",\n response: {\n subtype: \"external_tool_result\",\n request_id: requestId,\n tool_call_id: req.tool_call_id,\n content: [{ type: \"text\", text: `Tool execution error: ${errorMessage}` }],\n is_error: true,\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 const toolName = req.tool_name;\n const hasCallback = typeof this.options.canUseTool === \"function\";\n const toolNeedsRuntimeUserInput = requiresRuntimeUserInput(toolName);\n const autoAllowWithoutCallback =\n isHeadlessAutoAllowTool(toolName);\n\n sessionLog(\"canUseTool\", `tool=${toolName} mode=${this.options.permissionMode || \"default\"} requestId=${requestId}`);\n\n // Tools that require runtime user input cannot be auto-allowed without a callback.\n if (toolNeedsRuntimeUserInput && !hasCallback) {\n response = {\n behavior: \"deny\",\n message: \"No canUseTool callback registered\",\n interrupt: false,\n };\n } else if (\n this.options.permissionMode === \"bypassPermissions\" &&\n !toolNeedsRuntimeUserInput\n ) {\n // bypassPermissions auto-allows non-interactive tools.\n sessionLog(\"canUseTool\", `AUTO-ALLOW ${toolName} (bypassPermissions)`);\n response = {\n behavior: \"allow\",\n updatedInput: null,\n updatedPermissions: [],\n } satisfies CanUseToolResponseAllow;\n } else if (hasCallback) {\n try {\n const result = await this.options.canUseTool!(toolName, 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 if (autoAllowWithoutCallback) {\n // Default headless behavior matches Claude: EnterPlanMode can proceed\n // without requiring a callback in bidirectional mode.\n sessionLog(\"canUseTool\", `AUTO-ALLOW ${toolName} (default behavior)`);\n response = {\n behavior: \"allow\",\n updatedInput: null,\n updatedPermissions: [],\n } satisfies CanUseToolResponseAllow;\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 const responseBehavior = \"behavior\" in response ? response.behavior : \"unknown\";\n sessionLog(\"canUseTool\", `responding: requestId=${requestId} behavior=${responseBehavior}`);\n await this.transport.write({\n type: \"control_response\",\n response: {\n subtype: \"success\",\n request_id: requestId,\n response,\n },\n });\n sessionLog(\"canUseTool\", `response sent for ${toolName}`);\n }\n\n /**\n * Abort the current operation (interrupt without closing the session)\n */\n async abort(): Promise<void> {\n sessionLog(\"abort\", `aborting session (agent=${this._agentId})`);\n await this.transport.write({\n type: \"control_request\",\n request_id: `interrupt-${Date.now()}`,\n request: { subtype: \"interrupt\" },\n });\n }\n\n /**\n * Fetch a page of conversation messages via the CLI control protocol.\n *\n * The session must be initialized before calling this method.\n * Safe to call concurrently with an active stream() — the pump routes\n * matching control_response messages to this waiter without touching the\n * stream queue.\n */\n async listMessages(options: ListMessagesOptions = {}): Promise<ListMessagesResult> {\n if (!this.initialized) {\n throw new Error(\"Session must be initialized before calling listMessages()\");\n }\n\n const requestId = `list-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n\n const responsePromise = new Promise<{\n subtype: string;\n response?: unknown;\n error?: string;\n }>((resolve) => {\n this.controlResponseWaiters.set(requestId, resolve);\n });\n\n await this.transport.write({\n type: \"control_request\",\n request_id: requestId,\n request: {\n subtype: \"list_messages\",\n ...(options.conversationId ? { conversation_id: options.conversationId } : {}),\n ...(options.before ? { before: options.before } : {}),\n ...(options.after ? { after: options.after } : {}),\n ...(options.order ? { order: options.order } : {}),\n ...(options.limit !== undefined ? { limit: options.limit } : {}),\n },\n });\n\n // Race against session close (pump sets pumpClosed and resolves all waiters with null)\n const resp = await responsePromise;\n\n if (!resp) {\n throw new Error(\"Session closed before listMessages response arrived\");\n }\n if (resp.subtype === \"error\") {\n throw new Error(resp.error ?? \"listMessages failed\");\n }\n\n const payload = resp.response as {\n messages?: unknown[];\n next_before?: string | null;\n has_more?: boolean;\n } | undefined;\n\n return {\n messages: payload?.messages ?? [],\n nextBefore: payload?.next_before ?? null,\n hasMore: payload?.has_more ?? false,\n };\n }\n\n /**\n * Close the session\n */\n close(): void {\n sessionLog(\"close\", `closing session (agent=${this._agentId}, conversation=${this._conversationId})`);\n this.transport.close();\n this.pumpClosed = true;\n this.resolveAllStreamWaiters(null);\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 | MessageWire): 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 memfs_enabled?: boolean;\n skill_sources?: Array<\"bundled\" | \"global\" | \"agent\" | \"project\">;\n system_info_reminder_enabled?: boolean;\n reflection_trigger?: \"off\" | \"step-count\" | \"compaction-event\";\n reflection_behavior?: \"reminder\" | \"auto-launch\";\n reflection_step_count?: number;\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 memfsEnabled: msg.memfs_enabled,\n skillSources: msg.skill_sources,\n systemInfoReminderEnabled: msg.system_info_reminder_enabled,\n sleeptime:\n msg.reflection_trigger &&\n msg.reflection_behavior &&\n typeof msg.reflection_step_count === \"number\"\n ? {\n trigger: msg.reflection_trigger,\n behavior: msg.reflection_behavior,\n stepCount: msg.reflection_step_count,\n }\n : undefined,\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 (tool_call_message = auto-executed, approval_request_message = needs approval)\n if (msg.message_type === \"tool_call_message\" || msg.message_type === \"approval_request_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 stop_reason?: 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 stopReason: msg.stop_reason,\n durationMs: msg.duration_ms,\n totalCostUsd: msg.total_cost_usd,\n conversationId: msg.conversation_id,\n };\n }\n\n // Error message — carries the actual error detail from the CLI.\n // The subsequent type=result only has the opaque string \"error\";\n // this message has the human-readable description and API error.\n if (wireMsg.type === \"error\") {\n const msg = wireMsg as WireMessage & {\n message: string;\n stop_reason: string;\n run_id?: string;\n api_error?: Record<string, unknown>;\n };\n return {\n type: \"error\" as const,\n message: msg.message,\n stopReason: msg.stop_reason,\n runId: msg.run_id,\n apiError: msg.api_error,\n };\n }\n\n // Retry message — the CLI is retrying after a transient failure.\n if (wireMsg.type === \"retry\") {\n const msg = wireMsg as WireMessage & {\n reason: string;\n attempt: number;\n max_attempts: number;\n delay_ms: number;\n run_id?: string;\n };\n return {\n type: \"retry\" as const,\n reason: msg.reason,\n attempt: msg.attempt,\n maxAttempts: msg.max_attempts,\n delayMs: msg.delay_ms,\n runId: msg.run_id,\n };\n }\n\n // Skip other message types (system_message, user_message, etc.)\n return null;\n }\n}\n",
8
+ "/**\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 SkillSource,\n SleeptimeOptions,\n} from \"./types.js\";\n\nconst VALID_SKILL_SOURCES: SkillSource[] = [\n \"bundled\",\n \"global\",\n \"agent\",\n \"project\",\n];\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\nfunction validateSkillSources(sources: SkillSource[] | undefined): void {\n if (sources === undefined) {\n return;\n }\n\n for (const source of sources) {\n if (!VALID_SKILL_SOURCES.includes(source)) {\n throw new Error(\n `Invalid skill source '${source}'. Valid values: ${VALID_SKILL_SOURCES.join(\", \")}`\n );\n }\n }\n}\n\nfunction validateSleeptimeOptions(sleeptime: SleeptimeOptions | undefined): void {\n if (sleeptime === undefined) {\n return;\n }\n\n if (\n sleeptime.trigger !== undefined &&\n ![\"off\", \"step-count\", \"compaction-event\"].includes(sleeptime.trigger)\n ) {\n throw new Error(\n `Invalid sleeptime.trigger '${String(sleeptime.trigger)}'. Valid values: off, step-count, compaction-event`\n );\n }\n\n if (\n sleeptime.behavior !== undefined &&\n ![\"reminder\", \"auto-launch\"].includes(sleeptime.behavior)\n ) {\n throw new Error(\n `Invalid sleeptime.behavior '${String(sleeptime.behavior)}'. Valid values: reminder, auto-launch`\n );\n }\n\n if (\n sleeptime.stepCount !== undefined &&\n (!Number.isInteger(sleeptime.stepCount) || sleeptime.stepCount <= 0)\n ) {\n throw new Error(\n \"Invalid sleeptime.stepCount. Expected a positive integer.\"\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 validateSkillSources(options.skillSources);\n validateSleeptimeOptions(options.sleeptime);\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 validateSkillSources(options.skillSources);\n validateSleeptimeOptions(options.sleeptime);\n}\n",
9
9
  "/**\n * Tool Helpers\n * \n * Helper functions for creating tool results and parsing parameters.\n * Matches the API from pi-coding-agent.\n */\n\nimport type { AgentToolResult } from \"./types.js\";\n\n/**\n * Create a JSON tool result\n */\nexport function jsonResult(payload: unknown): AgentToolResult<unknown> {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(payload, null, 2),\n },\n ],\n details: payload,\n };\n}\n\n/**\n * Options for reading string parameters\n */\nexport interface StringParamOptions {\n required?: boolean;\n trim?: boolean;\n label?: string;\n allowEmpty?: boolean;\n}\n\n/**\n * Read a string parameter from tool args\n */\nexport function readStringParam(\n params: Record<string, unknown>,\n key: string,\n options?: StringParamOptions & { required: true },\n): string;\nexport function readStringParam(\n params: Record<string, unknown>,\n key: string,\n options?: StringParamOptions,\n): string | undefined;\nexport function readStringParam(\n params: Record<string, unknown>,\n key: string,\n options: StringParamOptions = {},\n): string | undefined {\n const { required = false, trim = true, label = key, allowEmpty = false } = options;\n const raw = params[key];\n if (typeof raw !== \"string\") {\n if (required) throw new Error(`${label} required`);\n return undefined;\n }\n const value = trim ? raw.trim() : raw;\n if (!value && !allowEmpty) {\n if (required) throw new Error(`${label} required`);\n return undefined;\n }\n return value;\n}\n\n/**\n * Read a number parameter from tool args\n */\nexport function readNumberParam(\n params: Record<string, unknown>,\n key: string,\n options: { required?: boolean; label?: string; integer?: boolean } = {},\n): number | undefined {\n const { required = false, label = key, integer = false } = options;\n const raw = params[key];\n let value: number | undefined;\n if (typeof raw === \"number\" && Number.isFinite(raw)) {\n value = raw;\n } else if (typeof raw === \"string\") {\n const trimmed = raw.trim();\n if (trimmed) {\n const parsed = Number.parseFloat(trimmed);\n if (Number.isFinite(parsed)) value = parsed;\n }\n }\n if (value === undefined) {\n if (required) throw new Error(`${label} required`);\n return undefined;\n }\n return integer ? Math.trunc(value) : value;\n}\n\n/**\n * Read a boolean parameter from tool args\n */\nexport function readBooleanParam(\n params: Record<string, unknown>,\n key: string,\n options: { required?: boolean; label?: string } = {},\n): boolean | undefined {\n const { required = false, label = key } = options;\n const raw = params[key];\n if (typeof raw === \"boolean\") {\n return raw;\n }\n if (typeof raw === \"string\") {\n const lower = raw.toLowerCase().trim();\n if (lower === \"true\" || lower === \"1\" || lower === \"yes\") return true;\n if (lower === \"false\" || lower === \"0\" || lower === \"no\") return false;\n }\n if (required) throw new Error(`${label} required`);\n return undefined;\n}\n\n/**\n * Read a string array parameter from tool args\n */\nexport function readStringArrayParam(\n params: Record<string, unknown>,\n key: string,\n options: StringParamOptions = {},\n): string[] | undefined {\n const { required = false, label = key } = options;\n const raw = params[key];\n if (Array.isArray(raw)) {\n const values = raw\n .filter((entry): entry is string => typeof entry === \"string\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n if (values.length === 0) {\n if (required) throw new Error(`${label} required`);\n return undefined;\n }\n return values;\n }\n if (typeof raw === \"string\") {\n const value = raw.trim();\n if (!value) {\n if (required) throw new Error(`${label} required`);\n return undefined;\n }\n return [value];\n }\n if (required) throw new Error(`${label} required`);\n return undefined;\n}\n",
10
- "/**\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 // Tool types\n AgentTool,\n AgentToolResult,\n AgentToolResultContent,\n AgentToolUpdateCallback,\n AnyAgentTool,\n} from \"./types.js\";\n\nexport { Session } from \"./session.js\";\n\n// Tool helpers\nexport {\n jsonResult,\n readStringParam,\n readNumberParam,\n readBooleanParam,\n readStringArrayParam,\n} from \"./tool-helpers.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 : createSession();\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"
10
+ "/**\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 SDKErrorMessage,\n SDKRetryMessage,\n SkillSource,\n SleeptimeOptions,\n SleeptimeTrigger,\n SleeptimeBehavior,\n EffectiveSleeptimeSettings,\n PermissionMode,\n CanUseToolCallback,\n CanUseToolResponse,\n CanUseToolResponseAllow,\n CanUseToolResponseDeny,\n // Multimodal content types\n TextContent,\n ImageContent,\n MessageContentItem,\n SendMessage,\n // List messages API\n ListMessagesOptions,\n ListMessagesResult,\n // Tool types\n AgentTool,\n AgentToolResult,\n AgentToolResultContent,\n AgentToolUpdateCallback,\n AnyAgentTool,\n} from \"./types.js\";\n\nexport { Session } from \"./session.js\";\n\n// Tool helpers\nexport {\n jsonResult,\n readStringParam,\n readNumberParam,\n readBooleanParam,\n readStringArrayParam,\n} from \"./tool-helpers.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 : createSession();\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"
11
11
  ],
12
- "mappings": "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",
13
- "debugId": "EBF6AB2D6E3DB54E64756E2164756E21",
12
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAMA;AACA;AAIA,SAAS,MAAM,CAAC,QAAgB,MAAiB;AAAA,EAC/C,IAAI,QAAQ,IAAI;AAAA,IAAW,QAAQ,MAAM,oBAAoB,QAAQ,GAAG,IAAI;AAAA;AASvE,SAAS,YAAY,CAAC,SAA2C;AAAA,EACtE,MAAM,OAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAGA,IAAI,QAAQ,gBAAgB;AAAA,IAC1B,KAAK,KAAK,kBAAkB,QAAQ,cAAc;AAAA,EACpD,EAAO,SAAI,QAAQ,SAAS;AAAA,IAC1B,KAAK,KAAK,WAAW,QAAQ,OAAO;AAAA,IACpC,IAAI,QAAQ,iBAAiB;AAAA,MAC3B,KAAK,KAAK,OAAO;AAAA,IACnB,EAAO,SAAI,QAAQ,qBAAqB;AAAA,MACtC,KAAK,KAAK,WAAW;AAAA,IACvB;AAAA,EACF,EAAO,SAAI,QAAQ,YAAY;AAAA,IAC7B,KAAK,KAAK,aAAa;AAAA,EACzB,EAAO,SAAI,QAAQ,iBAAiB;AAAA,IAClC,KAAK,KAAK,OAAO;AAAA,EACnB;AAAA,EAGA,IAAI,QAAQ,OAAO;AAAA,IACjB,KAAK,KAAK,MAAM,QAAQ,KAAK;AAAA,EAC/B;AAAA,EAGA,IAAI,QAAQ,wBAAwB;AAAA,IAClC,KAAK,KAAK,4BAA4B;AAAA,EACxC;AAAA,EAGA,IAAI,QAAQ,WAAW;AAAA,IACrB,KAAK,KAAK,eAAe,QAAQ,SAAS;AAAA,EAC5C;AAAA,EAGA,IAAI,QAAQ,iBAAiB,WAAW;AAAA,IACtC,IAAI,OAAO,QAAQ,iBAAiB,UAAU;AAAA,MAC5C,MAAM,eAAe;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,IAAI,aAAa,SAAS,QAAQ,YAAY,GAAG;AAAA,QAC/C,KAAK,KAAK,YAAY,QAAQ,YAAY;AAAA,MAC5C,EAAO;AAAA,QACL,KAAK,KAAK,mBAAmB,QAAQ,YAAY;AAAA;AAAA,IAErD,EAAO;AAAA,MACL,KAAK,KAAK,YAAY,QAAQ,aAAa,MAAM;AAAA,MACjD,IAAI,QAAQ,aAAa,QAAQ;AAAA,QAC/B,KAAK,KAAK,mBAAmB,QAAQ,aAAa,MAAM;AAAA,MAC1D;AAAA;AAAA,EAEJ;AAAA,EAGA,IAAI,QAAQ,WAAW,aAAa,CAAC,QAAQ,SAAS;AAAA,IACpD,IAAI,QAAQ,OAAO,WAAW,GAAG;AAAA,MAC/B,KAAK,KAAK,iBAAiB,EAAE;AAAA,IAC/B,EAAO;AAAA,MACL,MAAM,cAAwB,CAAC;AAAA,MAC/B,MAAM,mBAGF,CAAC;AAAA,MAEL,WAAW,QAAQ,QAAQ,QAAQ;AAAA,QACjC,IAAI,OAAO,SAAS,UAAU;AAAA,UAC5B,YAAY,KAAK,IAAI;AAAA,QACvB,EAAO,SAAI,aAAa,MAAM;AAAA,UAC5B,iBAAiB,KAAK,IAA2B;AAAA,QACnD,EAAO;AAAA,UACL,iBAAiB,KAAK,IAAwC;AAAA;AAAA,MAElE;AAAA,MAEA,IAAI,iBAAiB,SAAS,GAAG;AAAA,QAC/B,KAAK,KAAK,mBAAmB,KAAK,UAAU,gBAAgB,CAAC;AAAA,QAC7D,IAAI,YAAY,SAAS,GAAG;AAAA,UAC1B,QAAQ,KACN,kDACA,8DAA8D,YAAY,KAAK,IAAI,GACrF;AAAA,QACF;AAAA,MACF,EAAO,SAAI,YAAY,SAAS,GAAG;AAAA,QACjC,KAAK,KAAK,iBAAiB,YAAY,KAAK,GAAG,CAAC;AAAA,MAClD;AAAA;AAAA,EAEJ;AAAA,EAGA,IAAI,CAAC,QAAQ,SAAS;AAAA,IACpB,IAAI,QAAQ,YAAY,WAAW;AAAA,MACjC,KAAK,KAAK,iBAAiB,WAAW,QAAQ,SAAS;AAAA,IACzD;AAAA,IACA,IAAI,QAAQ,UAAU,WAAW;AAAA,MAC/B,KAAK,KAAK,iBAAiB,SAAS,QAAQ,OAAO;AAAA,IACrD;AAAA,EACF;AAAA,EAGA,IAAI,QAAQ,mBAAmB,qBAAqB;AAAA,IAClD,KAAK,KAAK,QAAQ;AAAA,EACpB,EAAO,SAAI,QAAQ,kBAAkB,QAAQ,mBAAmB,WAAW;AAAA,IACzE,KAAK,KAAK,qBAAqB,QAAQ,cAAc;AAAA,EACvD;AAAA,EAGA,IAAI,QAAQ,cAAc;AAAA,IACxB,KAAK,KAAK,kBAAkB,QAAQ,aAAa,KAAK,GAAG,CAAC;AAAA,EAC5D;AAAA,EACA,IAAI,QAAQ,iBAAiB;AAAA,IAC3B,KAAK,KAAK,qBAAqB,QAAQ,gBAAgB,KAAK,GAAG,CAAC;AAAA,EAClE;AAAA,EAGA,IAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAAA,IAC3C,KAAK,KAAK,UAAU,QAAQ,KAAK,KAAK,GAAG,CAAC;AAAA,EAC5C;AAAA,EAGA,IAAI,QAAQ,UAAU,MAAM;AAAA,IAC1B,KAAK,KAAK,SAAS;AAAA,EACrB,EAAO,SAAI,QAAQ,UAAU,OAAO;AAAA,IAClC,KAAK,KAAK,YAAY;AAAA,EACxB;AAAA,EAGA,IAAI,QAAQ,iBAAiB,WAAW;AAAA,IACtC,MAAM,UAAU,CAAC,GAAG,IAAI,IAAI,QAAQ,YAAY,CAAC;AAAA,IACjD,IAAI,QAAQ,WAAW,GAAG;AAAA,MACxB,KAAK,KAAK,aAAa;AAAA,IACzB,EAAO;AAAA,MACL,KAAK,KAAK,mBAAmB,QAAQ,KAAK,GAAG,CAAC;AAAA;AAAA,EAElD;AAAA,EAGA,IAAI,QAAQ,uBAAuB,OAAO;AAAA,IACxC,KAAK,KAAK,2BAA2B;AAAA,EACvC;AAAA,EAGA,IAAI,QAAQ,WAAW,YAAY,WAAW;AAAA,IAC5C,KAAK,KAAK,wBAAwB,QAAQ,UAAU,OAAO;AAAA,EAC7D;AAAA,EACA,IAAI,QAAQ,WAAW,aAAa,WAAW;AAAA,IAC7C,KAAK,KAAK,yBAAyB,QAAQ,UAAU,QAAQ;AAAA,EAC/D;AAAA,EACA,IAAI,QAAQ,WAAW,cAAc,WAAW;AAAA,IAC9C,KAAK,KAAK,2BAA2B,OAAO,QAAQ,UAAU,SAAS,CAAC;AAAA,EAC1E;AAAA,EAEA,OAAO;AAAA;AAAA;AAGF,MAAM,oBAAoB;AAAA,EAWrB;AAAA,EAVF,UAA+B;AAAA,EAC/B,SAA2B;AAAA,EAC3B,eAA8B,CAAC;AAAA,EAC/B,mBAA6D,CAAC;AAAA,EAC9D,SAAS;AAAA,EACT;AAAA,EACA,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAExB,WAAW,CACD,UAAkC,CAAC,GAC3C;AAAA,IADQ;AAAA;AAAA,OAMJ,QAAO,GAAkB;AAAA,IAC7B,MAAM,OAAO,KAAK,UAAU;AAAA,IAG5B,MAAM,UAAU,MAAM,KAAK,QAAQ;AAAA,IACnC,OAAO,WAAW,QAAQ,SAAS;AAAA,IACnC,OAAO,WAAW,SAAS,KAAK,KAAK,GAAG,GAAG;AAAA,IAC3C,OAAO,WAAW,QAAQ,KAAK,QAAQ,OAAO,QAAQ,IAAI,GAAG;AAAA,IAC7D,OAAO,WAAW,mBAAmB,KAAK,QAAQ,kBAAkB,WAAW;AAAA,IAE/E,KAAK,UAAU,MAAM,QAAQ,CAAC,SAAS,GAAG,IAAI,GAAG;AAAA,MAC/C,KAAK,KAAK,QAAQ,OAAO,QAAQ,IAAI;AAAA,MACrC,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,KAAK,KAAK,QAAQ,IAAI;AAAA,IACxB,CAAC;AAAA,IAED,MAAM,MAAM,KAAK,QAAQ;AAAA,IACzB,OAAO,WAAW,4BAA4B,KAAK;AAAA,IAEnD,IAAI,CAAC,KAAK,QAAQ,UAAU,CAAC,KAAK,QAAQ,OAAO;AAAA,MAC/C,MAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAAA,IAGA,KAAK,SAAS,gBAAgB;AAAA,MAC5B,OAAO,KAAK,QAAQ;AAAA,MACpB,WAAW;AAAA,IACb,CAAC;AAAA,IAED,KAAK,OAAO,GAAG,QAAQ,CAAC,SAAS;AAAA,MAC/B,IAAI,CAAC,KAAK,KAAK;AAAA,QAAG;AAAA,MAClB,IAAI;AAAA,QACF,MAAM,MAAM,KAAK,MAAM,IAAI;AAAA,QAC3B,KAAK,cAAc,GAAG;AAAA,QACtB,MAAM;AAAA,QAEN,OAAO,UAAU,cAAc,KAAK,MAAM,GAAG,GAAG,GAAG;AAAA;AAAA,KAEtD;AAAA,IAGD,IAAI,KAAK,QAAQ,QAAQ;AAAA,MACvB,KAAK,QAAQ,OAAO,GAAG,QAAQ,CAAC,SAAiB;AAAA,QAC/C,MAAM,MAAM,KAAK,SAAS,EAAE,KAAK;AAAA,QACjC,IAAI,KAAK;AAAA,UACP,QAAQ,MAAM,gCAAgC,GAAG;AAAA,QACnD;AAAA,OACD;AAAA,IACH;AAAA,IAUA,KAAK,QAAQ,GAAG,SAAS,CAAC,MAAM,WAAW;AAAA,MACzC,IAAI,SAAS,KAAK,SAAS,MAAM;AAAA,QAC/B,QAAQ,MAAM,iDAAiD,MAAM;AAAA,MACvE;AAAA,MACA,OAAO,SAAS,2BAA2B,YAAY,eAAe,uBAAuB,KAAK,mCAAmC,KAAK,gBAAgB,KAAK,IAAI,IAAI,KAAK,gBAAgB,sBAAsB,KAAK,iBAAiB,mBAAmB,KAAK,aAAa,QAAQ;AAAA,MACrR,KAAK,SAAS;AAAA,MAEd,WAAW,WAAW,KAAK,kBAAkB;AAAA,QAC3C,QAAQ,IAAI;AAAA,MACd;AAAA,MACA,KAAK,mBAAmB,CAAC;AAAA,KAC1B;AAAA,IAED,KAAK,QAAQ,GAAG,SAAS,CAAC,QAAQ;AAAA,MAChC,QAAQ,MAAM,uCAAuC,GAAG;AAAA,MACxD,KAAK,SAAS;AAAA,KACf;AAAA;AAAA,OAMG,MAAK,CAAC,MAA6B;AAAA,IACvC,IAAI,CAAC,KAAK,SAAS,SAAS,KAAK,QAAQ;AAAA,MACvC,MAAM,MAAM,IAAI,MAAM,mCAAmC,KAAK,eAAe,KAAK,SAAS,cAAc,CAAC,CAAC,KAAK,SAAS,QAAQ;AAAA,MACjI,OAAO,SAAS,IAAI,OAAO;AAAA,MAC3B,MAAM;AAAA,IACR;AAAA,IACA,MAAM,UAAU;AAAA,IAChB,OAAO,SAAS,QAAQ,QAAQ,gBAAiB,QAAQ,SAAqC,WAAY,QAAQ,UAAsC,WAAW,OAAO;AAAA,IAC1K,KAAK,QAAQ,MAAM,MAAM,KAAK,UAAU,IAAI,IAAI;AAAA,CAAI;AAAA;AAAA,OAMhD,KAAI,GAAgC;AAAA,IAExC,IAAI,KAAK,aAAa,SAAS,GAAG;AAAA,MAChC,OAAO,KAAK,aAAa,MAAM;AAAA,IACjC;AAAA,IAGA,IAAI,KAAK,QAAQ;AAAA,MACf,OAAO,QAAQ,+CAA+C,KAAK,kBAAkB;AAAA,MACrF,OAAO;AAAA,IACT;AAAA,IAGA,OAAO,QAAQ,uCAAuC,KAAK,iBAAiB,SAAS,YAAY,KAAK,aAAa,SAAS;AAAA,IAC5H,OAAO,IAAI,QAAQ,CAAC,YAAY;AAAA,MAC9B,KAAK,iBAAiB,KAAK,OAAO;AAAA,KACnC;AAAA;AAAA,SAMI,QAAQ,GAAgC;AAAA,IAC7C,OAAO,MAAM;AAAA,MACX,MAAM,MAAM,MAAM,KAAK,KAAK;AAAA,MAC5B,IAAI,QAAQ,MAAM;AAAA,QAChB,OAAO,YAAY,2BAA2B,KAAK,wBAAwB,KAAK,mBAAmB;AAAA,QACnG;AAAA,MACF;AAAA,MACA,MAAM;AAAA,IACR;AAAA;AAAA,EAMF,KAAK,GAAS;AAAA,IACZ,OAAO,SAAS,uCAAuC,KAAK,sCAAsC,KAAK,iBAAiB,eAAe,KAAK,SAAS,MAAM;AAAA,IAC3J,IAAI,KAAK,SAAS;AAAA,MAChB,KAAK,QAAQ,OAAO,IAAI;AAAA,MACxB,KAAK,QAAQ,KAAK;AAAA,MAClB,KAAK,UAAU;AAAA,IACjB;AAAA,IACA,KAAK,SAAS;AAAA,IAGd,WAAW,WAAW,KAAK,kBAAkB;AAAA,MAC3C,QAAQ,IAAI;AAAA,IACd;AAAA,IACA,KAAK,mBAAmB,CAAC;AAAA;AAAA,MAGvB,QAAQ,GAAY;AAAA,IACtB,OAAO,KAAK;AAAA;AAAA,EAGN,aAAa,CAAC,KAAwB;AAAA,IAC5C,KAAK;AAAA,IACL,KAAK,gBAAgB,KAAK,IAAI;AAAA,IAG9B,MAAM,cAAc;AAAA,IACpB,MAAM,UAAU,YAAY,gBAAgB,YAAY,WAAW;AAAA,IACnE,OAAO,QAAQ,IAAI,KAAK,yBAAyB,IAAI,QAAQ,UAAU,YAAY,YAAY,gBAAgB,KAAK,iBAAiB,gBAAgB,KAAK,aAAa,QAAQ;AAAA,IAG/K,IAAI,IAAI,SAAS,UAAU;AAAA,MACzB,MAAM,SAAS;AAAA,MACf,OAAO,QAAQ,mBAAmB,OAAO,uBAAuB,OAAO,eAAe,kBAAkB,OAAO,2BAA2B,OAAO,QAAQ,UAAU,GAAG;AAAA,IACxK;AAAA,IAGA,IAAI,IAAI,SAAS,YAAY,aAAa,OAAO,IAAI,YAAY,QAAQ;AAAA,MACvE,KAAK,UAAW,IAAwC;AAAA,MACxD,OAAO,QAAQ,kBAAkB,KAAK,SAAS;AAAA,IACjD;AAAA,IAGA,IAAI,IAAI,SAAS,mBAAmB;AAAA,MAClC,MAAM,MAAM;AAAA,MACZ,OAAO,QAAQ,uBAAuB,IAAI,sBAAsB,IAAI,SAAS,gBAAgB,IAAI,SAAS,aAAa,OAAO;AAAA,IAChI;AAAA,IAGA,IAAI,KAAK,iBAAiB,SAAS,GAAG;AAAA,MACpC,MAAM,UAAU,KAAK,iBAAiB,MAAM;AAAA,MAC5C,QAAQ,GAAG;AAAA,IACb,EAAO;AAAA,MAEL,KAAK,aAAa,KAAK,GAAG;AAAA;AAAA;AAAA,EAItB,SAAS,GAAa;AAAA,IAC5B,OAAO,aAAa,KAAK,OAAO;AAAA;AAAA,OAKpB,QAAO,GAAoB;AAAA,IAEvC,QAAQ,eAAe,MAAa;AAAA,IACpC,QAAQ,SAAS,SAAS,MAAa;AAAA,IACvC,QAAQ,kBAAkB,MAAa;AAAA,IAGvC,IAAI,QAAQ,IAAI,kBAAkB,WAAW,QAAQ,IAAI,cAAc,GAAG;AAAA,MACxE,OAAO,QAAQ,IAAI;AAAA,IACrB;AAAA,IAKA,IAAI;AAAA,MACF,QAAQ,kCAAkB,MAAa;AAAA,MACvC,MAAM,WAAU,eAAc,YAAY,GAAG;AAAA,MAC7C,MAAM,WAAW,SAAQ,QAAQ,sBAAsB;AAAA,MACvD,IAAI,WAAW,QAAQ,GAAG;AAAA,QACxB,OAAO;AAAA,MACT;AAAA,MACA,MAAM;AAAA,IAKR,MAAM,cAAa,cAAc,YAAY,GAAG;AAAA,IAChD,MAAM,aAAY,QAAQ,WAAU;AAAA,IACpC,MAAM,aAAa;AAAA,MACjB,KAAK,YAAW,qCAAqC;AAAA,MACrD,KAAK,YAAW,mCAAmC;AAAA,MACnD,KAAK,YAAW,8BAA8B;AAAA,IAChD;AAAA,IAEA,WAAW,KAAK,YAAY;AAAA,MAC1B,IAAI,WAAW,CAAC,GAAG;AAAA,QACjB,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,MAAM,IAAI,MACR,+EACF;AAAA;AAEJ;;;ACrbA,IAAM,6BAA6B,IAAI,IAAI;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,2BAA2B,IAAI,IAAI,CAAC,mBAAmB,cAAc,CAAC;AAE5E,IAAM,4BAA4B,IAAI,IAAI,CAAC,eAAe,CAAC;AAMpD,SAAS,wBAAwB,CAAC,UAA2B;AAAA,EAClE,OAAO,yBAAyB,IAAI,QAAQ;AAAA;AAGvC,SAAS,uBAAuB,CAAC,UAA2B;AAAA,EACjE,OAAO,0BAA0B,IAAI,QAAQ;AAAA;;;ACY/C,SAAS,UAAU,CAAC,QAAgB,MAAiB;AAAA,EACnD,IAAI,QAAQ,IAAI;AAAA,IAAW,QAAQ,MAAM,kBAAkB,QAAQ,GAAG,IAAI;AAAA;AAG5E,IAAM,+BAA+B;AAAA;AAE9B,MAAM,QAAmC;AAAA,EAqBpC;AAAA,EApBF;AAAA,EACA,WAA0B;AAAA,EAC1B,aAA4B;AAAA,EAC5B,kBAAiC;AAAA,EACjC,cAAc;AAAA,EACd,gBAA2C,IAAI;AAAA,EAC/C,cAA4B,CAAC;AAAA,EAC7B,kBAA2D,CAAC;AAAA,EAC5D,cAAoC;AAAA,EACpC,aAAa;AAAA,EACb,wBAAwB;AAAA,EAIxB,yBAAyB,IAAI;AAAA,EAKrC,WAAW,CACD,UAAkC,CAAC,GAC3C;AAAA,IADQ;AAAA,IAGR,KAAK,YAAY,IAAI,oBAAoB,OAAO;AAAA,IAGhD,IAAI,QAAQ,OAAO;AAAA,MACjB,WAAW,QAAQ,QAAQ,OAAO;AAAA,QAChC,KAAK,cAAc,IAAI,KAAK,MAAM,IAAI;AAAA,MACxC;AAAA,IACF;AAAA;AAAA,OAMI,WAAU,GAA4B;AAAA,IAC1C,IAAI,KAAK,aAAa;AAAA,MACpB,MAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AAAA,IAEA,WAAW,QAAQ,yBAAyB;AAAA,IAC5C,MAAM,KAAK,UAAU,QAAQ;AAAA,IAC7B,WAAW,QAAQ,iDAAiD;AAAA,IAGpE,MAAM,KAAK,UAAU,MAAM;AAAA,MACzB,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,SAAS,EAAE,SAAS,aAAa;AAAA,IACnC,CAAC;AAAA,IAGD,WAAW,QAAQ,sCAAsC;AAAA,IACzD,iBAAiB,OAAO,KAAK,UAAU,SAAS,GAAG;AAAA,MACjD,WAAW,QAAQ,+BAA+B,IAAI,MAAM;AAAA,MAE5D,IAAI,IAAI,SAAS,mBAAmB;AAAA,QAClC,MAAM,UAAU,MAAM,KAAK,qBAAqB,GAAqB;AAAA,QACrE,IAAI,CAAC,SAAS;AAAA,UACZ,MAAM,aAAa;AAAA,UACnB,WAAW,QAAQ,gDAAiD,WAAW,SAAqC,WAAW,OAAO;AAAA,QACxI;AAAA,QACA;AAAA,MACF;AAAA,MAEA,IAAI,IAAI,SAAS,YAAY,aAAa,OAAO,IAAI,YAAY,QAAQ;AAAA,QACvE,MAAM,UAAU;AAAA,QAahB,KAAK,WAAW,QAAQ;AAAA,QACxB,KAAK,aAAa,QAAQ;AAAA,QAC1B,KAAK,kBAAkB,QAAQ;AAAA,QAC/B,KAAK,cAAc;AAAA,QACnB,KAAK,oBAAoB;AAAA,QAGzB,IAAI,KAAK,cAAc,OAAO,GAAG;AAAA,UAC/B,MAAM,KAAK,sBAAsB;AAAA,QACnC;AAAA,QAGA,MAAM,WAAW;AAAA,UACf,GAAG,QAAQ;AAAA,UACX,GAAG,MAAM,KAAK,KAAK,cAAc,KAAK,CAAC;AAAA,QACzC;AAAA,QAEA,WAAW,QAAQ,sBAAsB,QAAQ,yBAAyB,QAAQ,yBAAyB,QAAQ,eAAe,SAAS,WAAW,KAAK,cAAc,gBAAgB;AAAA,QAEzL,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,QAAQ;AAAA,UACjB,WAAW,QAAQ;AAAA,UACnB,gBAAgB,QAAQ;AAAA,UACxB,OAAO,QAAQ;AAAA,UACf,OAAO;AAAA,UACP,cAAc,QAAQ;AAAA,UACtB,cAAc,QAAQ;AAAA,UACtB,2BAA2B,QAAQ;AAAA,UACnC,WACE,QAAQ,sBACR,QAAQ,uBACR,OAAO,QAAQ,0BAA0B,WACrC;AAAA,YACE,SAAS,QAAQ;AAAA,YACjB,UAAU,QAAQ;AAAA,YAClB,WAAW,QAAQ;AAAA,UACrB,IACA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,IAEA,WAAW,QAAQ,sDAAsD;AAAA,IACzE,MAAM,IAAI,MAAM,yDAAyD;AAAA;AAAA,OAmBrE,KAAI,CAAC,SAAqC;AAAA,IAC9C,IAAI,CAAC,KAAK,aAAa;AAAA,MACrB,WAAW,QAAQ,yCAAyC;AAAA,MAC5D,MAAM,KAAK,WAAW;AAAA,IACxB;AAAA,IAEA,MAAM,UAAU,OAAO,YAAY,WAC/B,QAAQ,MAAM,GAAG,GAAG,IACpB,MAAM,QAAQ,OAAO,IAAI,gBAAgB,QAAQ,kBAAkB,OAAO,OAAO,EAAE,MAAM,GAAG,GAAG;AAAA,IACnG,WAAW,QAAQ,oBAAoB,UAAU,OAAO,YAAY,YAAY,QAAQ,SAAS,MAAM,QAAQ,IAAI;AAAA,IAEnH,MAAM,KAAK,UAAU,MAAM;AAAA,MACzB,MAAM;AAAA,MACN,SAAS,EAAE,MAAM,QAAQ,SAAS,QAAQ;AAAA,IAC5C,CAAC;AAAA,IACD,WAAW,QAAQ,8BAA8B;AAAA;AAAA,SAM5C,MAAM,GAA+B;AAAA,IAC1C,MAAM,cAAc,KAAK,IAAI;AAAA,IAC7B,IAAI,aAAa;AAAA,IACjB,IAAI,YAAY;AAAA,IAEhB,KAAK,oBAAoB;AAAA,IACzB,WAAW,UAAU,0BAA0B,KAAK,0BAA0B,KAAK,kBAAkB;AAAA,IAErG,OAAO,MAAM;AAAA,MACX,MAAM,SAAS,MAAM,KAAK,oBAAoB;AAAA,MAC9C,IAAI,CAAC,QAAQ;AAAA,QACX;AAAA,MACF;AAAA,MAEA;AAAA,MACA,WAAW,UAAU,UAAU,oBAAoB,OAAO,OAAO,OAAO,SAAS,WAAW,YAAa,OAA4B,iBAAkB,OAA4B,SAAS,WAAW,IAAI;AAAA,MAC3M,MAAM;AAAA,MAGN,IAAI,OAAO,SAAS,UAAU;AAAA,QAC5B,YAAY;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,UAAU,KAAK,IAAI,IAAI;AAAA,IAC7B,WAAW,UAAU,0BAA0B,qBAAqB,sBAAsB,KAAK,mCAAmC,WAAW;AAAA,IAC7I,IAAI,CAAC,WAAW;AAAA,MACd,WAAW,UAAU,0FAA0F;AAAA,IACjH;AAAA;AAAA,EAGM,mBAAmB,GAAS;AAAA,IAClC,IAAI,KAAK,aAAa;AAAA,MACpB;AAAA,IACF;AAAA,IAEA,KAAK,aAAa;AAAA,IAClB,KAAK,cAAc,KAAK,kBAAkB,EACvC,MAAM,CAAC,QAAQ;AAAA,MACd,WAAW,QAAQ,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG;AAAA,KAChF,EACA,QAAQ,MAAM;AAAA,MACb,KAAK,aAAa;AAAA,MAClB,KAAK,wBAAwB,IAAI;AAAA,KAClC;AAAA;AAAA,OAGS,kBAAiB,GAAkB;AAAA,IAC/C,WAAW,QAAQ,yBAAyB;AAAA,IAE5C,iBAAiB,WAAW,KAAK,UAAU,SAAS,GAAG;AAAA,MACrD,IAAI,QAAQ,SAAS,mBAAmB;AAAA,QACtC,MAAM,UAAU,MAAM,KAAK,qBAAqB,OAAyB;AAAA,QACzE,IAAI,CAAC,SAAS;AAAA,UACZ,MAAM,aAAa;AAAA,UACnB,WAAW,QAAQ,gDAAiD,WAAW,SAAqC,WAAW,OAAO;AAAA,QACxI;AAAA,QACA;AAAA,MACF;AAAA,MAIA,IAAI,QAAQ,SAAS,oBAAoB;AAAA,QACvC,MAAM,UAAU;AAAA,QAGhB,MAAM,YAAY,QAAQ,UAAU;AAAA,QACpC,IAAI,aAAa,KAAK,uBAAuB,IAAI,SAAS,GAAG;AAAA,UAC3D,MAAM,UAAU,KAAK,uBAAuB,IAAI,SAAS;AAAA,UACzD,KAAK,uBAAuB,OAAO,SAAS;AAAA,UAC5C,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,EAAO;AAAA,UACL,WAAW,QAAQ,kDAAkD,aAAa,OAAO;AAAA;AAAA,QAE3F;AAAA,MACF;AAAA,MAEA,MAAM,SAAS,KAAK,iBAAiB,OAAO;AAAA,MAC5C,IAAI,QAAQ;AAAA,QACV,KAAK,qBAAqB,MAAM;AAAA,MAClC,EAAO;AAAA,QACL,MAAM,aAAa;AAAA,QACnB,WAAW,QAAQ,8BAA8B,QAAQ,qBAAqB,WAAW,gBAAgB,iBAAiB,WAAW,WAAW,OAAO;AAAA;AAAA,IAE3J;AAAA,IAEA,WAAW,QAAQ,uBAAuB;AAAA;AAAA,OAG9B,qBAAoB,CAAC,YAA8C;AAAA,IAE/E,MAAM,UAAkB,WAAW,QAAQ;AAAA,IAC3C,WAAW,QAAQ,4BAA4B,gBAAiB,WAAW,QAAqC,aAAa,OAAO;AAAA,IAEpI,IAAI,YAAY,gBAAgB;AAAA,MAC9B,MAAM,KAAK,iBACT,WAAW,YACX,WAAW,OACb;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,YAAY,yBAAyB;AAAA,MAEvC,MAAM,SAAS,WAAW;AAAA,MAC1B,MAAM,KAAK,0BACT,WAAW,YACX;AAAA,QACE,SAAS;AAAA,QACT,cAAc,OAAO;AAAA,QACrB,WAAW,OAAO;AAAA,QAClB,OAAO,OAAO;AAAA,MAChB,CACF;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAEA,OAAO;AAAA;AAAA,EAGD,oBAAoB,CAAC,KAAuB;AAAA,IAClD,IAAI,KAAK,gBAAgB,SAAS,GAAG;AAAA,MACnC,MAAM,UAAU,KAAK,gBAAgB,MAAM;AAAA,MAC3C,QAAQ,GAAG;AAAA,MACX;AAAA,IACF;AAAA,IAEA,IAAI,KAAK,YAAY,UAAU,8BAA8B;AAAA,MAC3D,KAAK,YAAY,MAAM;AAAA,MACvB,KAAK;AAAA,MACL,WAAW,QAAQ,gEAAgE,KAAK,8BAA8B,+BAA+B;AAAA,IACvJ;AAAA,IAEA,KAAK,YAAY,KAAK,GAAG;AAAA;AAAA,OAGb,oBAAmB,GAA+B;AAAA,IAC9D,IAAI,KAAK,YAAY,SAAS,GAAG;AAAA,MAC/B,OAAO,KAAK,YAAY,MAAM;AAAA,IAChC;AAAA,IAEA,IAAI,KAAK,YAAY;AAAA,MACnB,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,IAAI,QAAQ,CAAC,YAAY;AAAA,MAC9B,KAAK,gBAAgB,KAAK,OAAO;AAAA,KAClC;AAAA;AAAA,EAGK,uBAAuB,CAAC,KAA8B;AAAA,IAC5D,WAAW,WAAW,KAAK,iBAAiB;AAAA,MAC1C,QAAQ,GAAG;AAAA,IACb;AAAA,IACA,KAAK,kBAAkB,CAAC;AAAA,IAExB,WAAW,WAAW,KAAK,uBAAuB,OAAO,GAAG;AAAA,MAC1D,QAAQ,EAAE,SAAS,SAAS,OAAO,iBAAiB,CAAC;AAAA,IACvD;AAAA,IACA,KAAK,uBAAuB,MAAM;AAAA;AAAA,OAMtB,sBAAqB,GAAkB;AAAA,IACnD,MAAM,WAAW,MAAM,KAAK,KAAK,cAAc,OAAO,CAAC,EAAE,IAAI,CAAC,UAAU;AAAA,MACtE,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAElB,YAAY,KAAK,mBAAmB,KAAK,UAAU;AAAA,IACrD,EAAE;AAAA,IAEF,WAAW,iBAAiB,eAAe,SAAS,0BAA0B,SAAS,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI,GAAG;AAAA,IAEpH,MAAM,KAAK,UAAU,MAAM;AAAA,MACzB,MAAM;AAAA,MACN,YAAY,kBAAkB,KAAK,IAAI;AAAA,MACvC,SAAS;AAAA,QACP,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA;AAAA,EAMK,kBAAkB,CAAC,QAA0C;AAAA,IAGnE,IAAI,UAAU,OAAO,WAAW,UAAU;AAAA,MAExC,MAAM,IAAI;AAAA,MACV,OAAO;AAAA,QACL,MAAM,EAAE;AAAA,QACR,YAAY,EAAE;AAAA,QACd,UAAU,EAAE;AAAA,QACZ,sBAAsB,EAAE;AAAA,QACxB,aAAa,EAAE;AAAA,MACjB;AAAA,IACF;AAAA,IACA,OAAO,EAAE,MAAM,SAAS;AAAA;AAAA,OAMZ,0BAAyB,CACrC,WACA,KACe;AAAA,IACf,MAAM,OAAO,KAAK,cAAc,IAAI,IAAI,SAAS;AAAA,IAEjD,IAAI,CAAC,MAAM;AAAA,MAET,WAAW,uBAAuB,uBAAuB,IAAI,WAAW;AAAA,MACxE,MAAM,KAAK,UAAU,MAAM;AAAA,QACzB,MAAM;AAAA,QACN,UAAU;AAAA,UACR,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,cAAc,IAAI;AAAA,UAClB,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,0BAA0B,IAAI,YAAY,CAAC;AAAA,UAC3E,UAAU;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IAEA,IAAI;AAAA,MACF,WAAW,uBAAuB,aAAa,IAAI,sBAAsB,IAAI,eAAe;AAAA,MAE5F,MAAM,SAAS,MAAM,KAAK,QAAQ,IAAI,cAAc,IAAI,KAAK;AAAA,MAG7D,MAAM,KAAK,UAAU,MAAM;AAAA,QACzB,MAAM;AAAA,QACN,UAAU;AAAA,UACR,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,cAAc,IAAI;AAAA,UAClB,SAAS,OAAO;AAAA,UAChB,UAAU;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,MACD,WAAW,uBAAuB,GAAG,IAAI,kCAAkC;AAAA,MAC3E,OAAO,KAAK;AAAA,MAEZ,MAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACpE,WAAW,uBAAuB,GAAG,IAAI,qBAAqB,cAAc;AAAA,MAC5E,MAAM,KAAK,UAAU,MAAM;AAAA,QACzB,MAAM;AAAA,QACN,UAAU;AAAA,UACR,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,cAAc,IAAI;AAAA,UAClB,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,yBAAyB,eAAe,CAAC;AAAA,UACzE,UAAU;AAAA,QACZ;AAAA,MACF,CAAC;AAAA;AAAA;AAAA,OAOS,iBAAgB,CAC5B,WACA,KACe;AAAA,IACf,IAAI;AAAA,IACJ,MAAM,WAAW,IAAI;AAAA,IACrB,MAAM,cAAc,OAAO,KAAK,QAAQ,eAAe;AAAA,IACvD,MAAM,4BAA4B,yBAAyB,QAAQ;AAAA,IACnE,MAAM,2BACJ,wBAAwB,QAAQ;AAAA,IAElC,WAAW,cAAc,QAAQ,iBAAiB,KAAK,QAAQ,kBAAkB,uBAAuB,WAAW;AAAA,IAGnH,IAAI,6BAA6B,CAAC,aAAa;AAAA,MAC7C,WAAW;AAAA,QACT,UAAU;AAAA,QACV,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF,EAAO,SACL,KAAK,QAAQ,mBAAmB,uBAChC,CAAC,2BACD;AAAA,MAEA,WAAW,cAAc,cAAc,8BAA8B;AAAA,MACrE,WAAW;AAAA,QACT,UAAU;AAAA,QACV,cAAc;AAAA,QACd,oBAAoB,CAAC;AAAA,MACvB;AAAA,IACF,EAAO,SAAI,aAAa;AAAA,MACtB,IAAI;AAAA,QACF,MAAM,SAAS,MAAM,KAAK,QAAQ,WAAY,UAAU,IAAI,KAAK;AAAA,QACjE,IAAI,OAAO,aAAa,SAAS;AAAA,UAC/B,WAAW;AAAA,YACT,UAAU;AAAA,YACV,cAAc,OAAO,gBAAgB;AAAA,YACrC,oBAAoB,CAAC;AAAA,UACvB;AAAA,QACF,EAAO;AAAA,UACL,WAAW;AAAA,YACT,UAAU;AAAA,YACV,SAAS,OAAO,WAAW;AAAA,YAC3B,WAAW;AAAA,UACb;AAAA;AAAA,QAEF,OAAO,KAAK;AAAA,QACZ,WAAW;AAAA,UACT,UAAU;AAAA,UACV,SAAS,eAAe,QAAQ,IAAI,UAAU;AAAA,UAC9C,WAAW;AAAA,QACb;AAAA;AAAA,IAEJ,EAAO,SAAI,0BAA0B;AAAA,MAGnC,WAAW,cAAc,cAAc,6BAA6B;AAAA,MACpE,WAAW;AAAA,QACT,UAAU;AAAA,QACV,cAAc;AAAA,QACd,oBAAoB,CAAC;AAAA,MACvB;AAAA,IACF,EAAO;AAAA,MAEL,WAAW;AAAA,QACT,UAAU;AAAA,QACV,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA;AAAA,IAIF,MAAM,mBAAmB,cAAc,WAAW,SAAS,WAAW;AAAA,IACtE,WAAW,cAAc,yBAAyB,sBAAsB,kBAAkB;AAAA,IAC1F,MAAM,KAAK,UAAU,MAAM;AAAA,MACzB,MAAM;AAAA,MACN,UAAU;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,QACZ;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IACD,WAAW,cAAc,qBAAqB,UAAU;AAAA;AAAA,OAMpD,MAAK,GAAkB;AAAA,IAC3B,WAAW,SAAS,2BAA2B,KAAK,WAAW;AAAA,IAC/D,MAAM,KAAK,UAAU,MAAM;AAAA,MACzB,MAAM;AAAA,MACN,YAAY,aAAa,KAAK,IAAI;AAAA,MAClC,SAAS,EAAE,SAAS,YAAY;AAAA,IAClC,CAAC;AAAA;AAAA,OAWG,aAAY,CAAC,UAA+B,CAAC,GAAgC;AAAA,IACjF,IAAI,CAAC,KAAK,aAAa;AAAA,MACrB,MAAM,IAAI,MAAM,2DAA2D;AAAA,IAC7E;AAAA,IAEA,MAAM,YAAY,QAAQ,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AAAA,IAE7E,MAAM,kBAAkB,IAAI,QAIzB,CAAC,YAAY;AAAA,MACd,KAAK,uBAAuB,IAAI,WAAW,OAAO;AAAA,KACnD;AAAA,IAED,MAAM,KAAK,UAAU,MAAM;AAAA,MACzB,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,SAAS;AAAA,QACP,SAAS;AAAA,WACL,QAAQ,iBAAiB,EAAE,iBAAiB,QAAQ,eAAe,IAAI,CAAC;AAAA,WACxE,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,WAC/C,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,WAC5C,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,WAC5C,QAAQ,UAAU,YAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,MAChE;AAAA,IACF,CAAC;AAAA,IAGD,MAAM,OAAO,MAAM;AAAA,IAEnB,IAAI,CAAC,MAAM;AAAA,MACT,MAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AAAA,IACA,IAAI,KAAK,YAAY,SAAS;AAAA,MAC5B,MAAM,IAAI,MAAM,KAAK,SAAS,qBAAqB;AAAA,IACrD;AAAA,IAEA,MAAM,UAAU,KAAK;AAAA,IAMrB,OAAO;AAAA,MACL,UAAU,SAAS,YAAY,CAAC;AAAA,MAChC,YAAY,SAAS,eAAe;AAAA,MACpC,SAAS,SAAS,YAAY;AAAA,IAChC;AAAA;AAAA,EAMF,KAAK,GAAS;AAAA,IACZ,WAAW,SAAS,0BAA0B,KAAK,0BAA0B,KAAK,kBAAkB;AAAA,IACpG,KAAK,UAAU,MAAM;AAAA,IACrB,KAAK,aAAa;AAAA,IAClB,KAAK,wBAAwB,IAAI;AAAA;AAAA,MAM/B,OAAO,GAAkB;AAAA,IAC3B,OAAO,KAAK;AAAA;AAAA,MAMV,SAAS,GAAkB;AAAA,IAC7B,OAAO,KAAK;AAAA;AAAA,MAMV,cAAc,GAAkB;AAAA,IAClC,OAAO,KAAK;AAAA;AAAA,QAMP,OAAO,aAAa,GAAkB;AAAA,IAC3C,KAAK,MAAM;AAAA;AAAA,EAML,gBAAgB,CAAC,SAAuD;AAAA,IAE9E,IAAI,QAAQ,SAAS,YAAY,aAAa,WAAW,QAAQ,YAAY,QAAQ;AAAA,MACnF,MAAM,MAAM;AAAA,MAaZ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,IAAI;AAAA,QACb,WAAW,IAAI;AAAA,QACf,gBAAgB,IAAI;AAAA,QACpB,OAAO,IAAI;AAAA,QACX,OAAO,IAAI;AAAA,QACX,cAAc,IAAI;AAAA,QAClB,cAAc,IAAI;AAAA,QAClB,2BAA2B,IAAI;AAAA,QAC/B,WACE,IAAI,sBACJ,IAAI,uBACJ,OAAO,IAAI,0BAA0B,WACjC;AAAA,UACE,SAAS,IAAI;AAAA,UACb,UAAU,IAAI;AAAA,UACd,WAAW,IAAI;AAAA,QACjB,IACA;AAAA,MACR;AAAA,IACF;AAAA,IAGA,IAAI,QAAQ,SAAS,aAAa,kBAAkB,SAAS;AAAA,MAC3D,MAAM,MAAM;AAAA,MAiBZ,IAAI,IAAI,iBAAiB,uBAAuB,IAAI,SAAS;AAAA,QAC3D,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,IAAI;AAAA,UACb,MAAM,IAAI;AAAA,QACZ;AAAA,MACF;AAAA,MAGA,IAAI,IAAI,iBAAiB,uBAAuB,IAAI,iBAAiB,4BAA4B;AAAA,QAC/F,MAAM,WAAW,IAAI,aAAa,MAAM,IAAI;AAAA,QAC5C,IAAI,UAAU;AAAA,UACZ,IAAI,YAAqC,CAAC;AAAA,UAC1C,IAAI;AAAA,YACF,YAAY,KAAK,MAAM,SAAS,SAAS;AAAA,YACzC,MAAM;AAAA,YACN,YAAY,EAAE,KAAK,SAAS,UAAU;AAAA;AAAA,UAExC,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY,SAAS;AAAA,YACrB,UAAU,SAAS;AAAA,YACnB;AAAA,YACA,MAAM,IAAI;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,MAGA,IAAI,IAAI,iBAAiB,yBAAyB,IAAI,cAAc;AAAA,QAClE,OAAO;AAAA,UACL,MAAM;AAAA,UACN,YAAY,IAAI;AAAA,UAChB,SAAS,IAAI,eAAe;AAAA,UAC5B,SAAS,IAAI,WAAW;AAAA,UACxB,MAAM,IAAI;AAAA,QACZ;AAAA,MACF;AAAA,MAGA,IAAI,IAAI,iBAAiB,uBAAuB,IAAI,WAAW;AAAA,QAC7D,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,IAAI;AAAA,UACb,MAAM,IAAI;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,IAGA,IAAI,QAAQ,SAAS,gBAAgB;AAAA,MACnC,MAAM,MAAM;AAAA,MASZ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,IAAI;AAAA,QACX,MAAM,IAAI;AAAA,MACZ;AAAA,IACF;AAAA,IAGA,IAAI,QAAQ,SAAS,UAAU;AAAA,MAC7B,MAAM,MAAM;AAAA,MAQZ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,IAAI,YAAY;AAAA,QACzB,QAAQ,IAAI;AAAA,QACZ,OAAO,IAAI,YAAY,YAAY,IAAI,UAAU;AAAA,QACjD,YAAY,IAAI;AAAA,QAChB,YAAY,IAAI;AAAA,QAChB,cAAc,IAAI;AAAA,QAClB,gBAAgB,IAAI;AAAA,MACtB;AAAA,IACF;AAAA,IAKA,IAAI,QAAQ,SAAS,SAAS;AAAA,MAC5B,MAAM,MAAM;AAAA,MAMZ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,IAAI;AAAA,QACb,YAAY,IAAI;AAAA,QAChB,OAAO,IAAI;AAAA,QACX,UAAU,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,IAGA,IAAI,QAAQ,SAAS,SAAS;AAAA,MAC5B,MAAM,MAAM;AAAA,MAOZ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,IAAI;AAAA,QACZ,SAAS,IAAI;AAAA,QACb,aAAa,IAAI;AAAA,QACjB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI;AAAA,MACb;AAAA,IACF;AAAA,IAGA,OAAO;AAAA;AAEX;;;AC50BA,IAAM,sBAAqC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKA,SAAS,cAAc,CAAC,QAAgC;AAAA,EACtD,OAAO,OACJ,IAAI,CAAC,SAAS;AAAA,IACb,IAAI,OAAO,SAAS;AAAA,MAAU,OAAO;AAAA,IACrC,IAAI,WAAW;AAAA,MAAM,OAAQ,KAAqB;AAAA,IAClD,OAAO;AAAA,GACR,EACA,OAAO,CAAC,UAA2B,UAAU,IAAI;AAAA;AAMtD,SAAS,0BAA0B,CAAC,QAAsB;AAAA,EACxD,MAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,IAAI,CAAC,aAAa,SAAS,MAAM,GAAG;AAAA,IAClC,MAAM,IAAI,MACR,iCAAiC,cAC/B,kBAAkB,aAAa,KAAK,IAAI,GAC5C;AAAA,EACF;AAAA;AAGF,SAAS,oBAAoB,CAAC,SAA0C;AAAA,EACtE,IAAI,YAAY,WAAW;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,WAAW,UAAU,SAAS;AAAA,IAC5B,IAAI,CAAC,oBAAoB,SAAS,MAAM,GAAG;AAAA,MACzC,MAAM,IAAI,MACR,yBAAyB,0BAA0B,oBAAoB,KAAK,IAAI,GAClF;AAAA,IACF;AAAA,EACF;AAAA;AAGF,SAAS,wBAAwB,CAAC,WAA+C;AAAA,EAC/E,IAAI,cAAc,WAAW;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,IACE,UAAU,YAAY,aACtB,CAAC,CAAC,OAAO,cAAc,kBAAkB,EAAE,SAAS,UAAU,OAAO,GACrE;AAAA,IACA,MAAM,IAAI,MACR,8BAA8B,OAAO,UAAU,OAAO,qDACxD;AAAA,EACF;AAAA,EAEA,IACE,UAAU,aAAa,aACvB,CAAC,CAAC,YAAY,aAAa,EAAE,SAAS,UAAU,QAAQ,GACxD;AAAA,IACA,MAAM,IAAI,MACR,+BAA+B,OAAO,UAAU,QAAQ,yCAC1D;AAAA,EACF;AAAA,EAEA,IACE,UAAU,cAAc,cACvB,CAAC,OAAO,UAAU,UAAU,SAAS,KAAK,UAAU,aAAa,IAClE;AAAA,IACA,MAAM,IAAI,MACR,2DACF;AAAA,EACF;AAAA;AAMK,SAAS,4BAA4B,CAAC,SAAqC;AAAA,EAEhF,IAAI,QAAQ,iBAAiB,WAAW;AAAA,IACtC,2BAA2B,QAAQ,YAAY;AAAA,EACjD;AAAA,EAEA,qBAAqB,QAAQ,YAAY;AAAA,EACzC,yBAAyB,QAAQ,SAAS;AAAA;AAMrC,SAAS,0BAA0B,CAAC,SAAmC;AAAA,EAE5E,IAAI,QAAQ,WAAW,WAAW;AAAA,IAChC,MAAM,cAAc,eAAe,QAAQ,MAAM;AAAA,IAEjD,IAAI,QAAQ,YAAY,aAAa,CAAC,YAAY,SAAS,SAAS,GAAG;AAAA,MACrE,MAAM,IAAI,MACR,kEACE,oEACJ;AAAA,IACF;AAAA,IAEA,IAAI,QAAQ,UAAU,aAAa,CAAC,YAAY,SAAS,OAAO,GAAG;AAAA,MACjE,MAAM,IAAI,MACR,gEACE,gEACJ;AAAA,IACF;AAAA,EACF;AAAA,EAGA,IACE,QAAQ,iBAAiB,aACzB,OAAO,QAAQ,iBAAiB,UAChC;AAAA,IACA,2BAA2B,QAAQ,aAAa,MAAM;AAAA,EACxD,EAAO,SACL,QAAQ,iBAAiB,aACzB,OAAO,QAAQ,iBAAiB,UAChC;AAAA,IAEA,MAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,aAAa,SAAS,QAAQ,YAAkC,GAAG;AAAA,MACrE,2BAA2B,QAAQ,YAAY;AAAA,IACjD;AAAA,EAEF;AAAA,EAEA,qBAAqB,QAAQ,YAAY;AAAA,EACzC,yBAAyB,QAAQ,SAAS;AAAA;;AC3JrC,SAAS,UAAU,CAAC,SAA4C;AAAA,EACrE,OAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,MACvC;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX;AAAA;AA0BK,SAAS,eAAe,CAC7B,QACA,KACA,UAA8B,CAAC,GACX;AAAA,EACpB,QAAQ,WAAW,OAAO,OAAO,MAAM,QAAQ,KAAK,aAAa,UAAU;AAAA,EAC3E,MAAM,MAAM,OAAO;AAAA,EACnB,IAAI,OAAO,QAAQ,UAAU;AAAA,IAC3B,IAAI;AAAA,MAAU,MAAM,IAAI,MAAM,GAAG,gBAAgB;AAAA,IACjD;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,OAAO,IAAI,KAAK,IAAI;AAAA,EAClC,IAAI,CAAC,SAAS,CAAC,YAAY;AAAA,IACzB,IAAI;AAAA,MAAU,MAAM,IAAI,MAAM,GAAG,gBAAgB;AAAA,IACjD;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAMF,SAAS,eAAe,CAC7B,QACA,KACA,UAAqE,CAAC,GAClD;AAAA,EACpB,QAAQ,WAAW,OAAO,QAAQ,KAAK,UAAU,UAAU;AAAA,EAC3D,MAAM,MAAM,OAAO;AAAA,EACnB,IAAI;AAAA,EACJ,IAAI,OAAO,QAAQ,YAAY,OAAO,SAAS,GAAG,GAAG;AAAA,IACnD,QAAQ;AAAA,EACV,EAAO,SAAI,OAAO,QAAQ,UAAU;AAAA,IAClC,MAAM,UAAU,IAAI,KAAK;AAAA,IACzB,IAAI,SAAS;AAAA,MACX,MAAM,SAAS,OAAO,WAAW,OAAO;AAAA,MACxC,IAAI,OAAO,SAAS,MAAM;AAAA,QAAG,QAAQ;AAAA,IACvC;AAAA,EACF;AAAA,EACA,IAAI,UAAU,WAAW;AAAA,IACvB,IAAI;AAAA,MAAU,MAAM,IAAI,MAAM,GAAG,gBAAgB;AAAA,IACjD;AAAA,EACF;AAAA,EACA,OAAO,UAAU,KAAK,MAAM,KAAK,IAAI;AAAA;AAMhC,SAAS,gBAAgB,CAC9B,QACA,KACA,UAAkD,CAAC,GAC9B;AAAA,EACrB,QAAQ,WAAW,OAAO,QAAQ,QAAQ;AAAA,EAC1C,MAAM,MAAM,OAAO;AAAA,EACnB,IAAI,OAAO,QAAQ,WAAW;AAAA,IAC5B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,QAAQ,UAAU;AAAA,IAC3B,MAAM,QAAQ,IAAI,YAAY,EAAE,KAAK;AAAA,IACrC,IAAI,UAAU,UAAU,UAAU,OAAO,UAAU;AAAA,MAAO,OAAO;AAAA,IACjE,IAAI,UAAU,WAAW,UAAU,OAAO,UAAU;AAAA,MAAM,OAAO;AAAA,EACnE;AAAA,EACA,IAAI;AAAA,IAAU,MAAM,IAAI,MAAM,GAAG,gBAAgB;AAAA,EACjD;AAAA;AAMK,SAAS,oBAAoB,CAClC,QACA,KACA,UAA8B,CAAC,GACT;AAAA,EACtB,QAAQ,WAAW,OAAO,QAAQ,QAAQ;AAAA,EAC1C,MAAM,MAAM,OAAO;AAAA,EACnB,IAAI,MAAM,QAAQ,GAAG,GAAG;AAAA,IACtB,MAAM,SAAS,IACZ,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,EAC5D,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO;AAAA,IACjB,IAAI,OAAO,WAAW,GAAG;AAAA,MACvB,IAAI;AAAA,QAAU,MAAM,IAAI,MAAM,GAAG,gBAAgB;AAAA,MACjD;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,QAAQ,UAAU;AAAA,IAC3B,MAAM,QAAQ,IAAI,KAAK;AAAA,IACvB,IAAI,CAAC,OAAO;AAAA,MACV,IAAI;AAAA,QAAU,MAAM,IAAI,MAAM,GAAG,gBAAgB;AAAA,MACjD;AAAA,IACF;AAAA,IACA,OAAO,CAAC,KAAK;AAAA,EACf;AAAA,EACA,IAAI;AAAA,IAAU,MAAM,IAAI,MAAM,GAAG,gBAAgB;AAAA,EACjD;AAAA;;;AC0EF;AAlHA,eAAsB,WAAW,CAAC,UAA8B,CAAC,GAAoB;AAAA,EACnF,2BAA2B,OAAO;AAAA,EAClC,MAAM,UAAU,IAAI,QAAQ,KAAK,SAAS,YAAY,KAAK,CAAC;AAAA,EAC5D,MAAM,UAAU,MAAM,QAAQ,WAAW;AAAA,EACzC,QAAQ,MAAM;AAAA,EACd,OAAO,QAAQ;AAAA;AAkBV,SAAS,aAAa,CAAC,SAAkB,UAAgC,CAAC,GAAY;AAAA,EAC3F,6BAA6B,OAAO;AAAA,EACpC,IAAI,SAAS;AAAA,IACX,OAAO,IAAI,QAAQ,KAAK,SAAS,SAAS,iBAAiB,KAAK,CAAC;AAAA,EACnE,EAAO;AAAA,IACL,OAAO,IAAI,QAAQ,KAAK,SAAS,iBAAiB,KAAK,CAAC;AAAA;AAAA;AAsBrD,SAAS,aAAa,CAC3B,IACA,UAAgC,CAAC,GACxB;AAAA,EACT,6BAA6B,OAAO;AAAA,EACpC,IAAI,GAAG,WAAW,OAAO,GAAG;AAAA,IAC1B,OAAO,IAAI,QAAQ,KAAK,SAAS,gBAAgB,GAAG,CAAC;AAAA,EACvD,EAAO;AAAA,IACL,OAAO,IAAI,QAAQ,KAAK,SAAS,SAAS,IAAI,qBAAqB,KAAK,CAAC;AAAA;AAAA;AAgB7E,eAAsB,MAAM,CAC1B,SACA,SAC2B;AAAA,EAE3B,MAAM,UAAU,UACZ,cAAc,OAAO,IACrB,cAAc;AAAA,EAElB,IAAI;AAAA,IACF,MAAM,QAAQ,KAAK,OAAO;AAAA,IAE1B,IAAI,SAAkC;AAAA,IACtC,iBAAiB,OAAO,QAAQ,OAAO,GAAG;AAAA,MACxC,IAAI,IAAI,SAAS,UAAU;AAAA,QACzB,SAAS;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IAAI,CAAC,QAAQ;AAAA,MACX,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,gBAAgB,QAAQ;AAAA,MAC1B;AAAA,IACF;AAAA,IAEA,OAAO;AAAA,YACP;AAAA,IACA,QAAQ,MAAM;AAAA;AAAA;AAsBX,SAAS,aAAa,CAAC,UAAgC;AAAA,EAC5D,MAAM,OAAO,aAAa,QAAQ,EAAE,SAAS,QAAQ;AAAA,EACrD,MAAM,MAAM,SAAS,YAAY;AAAA,EACjC,MAAM,aACJ,IAAI,SAAS,MAAM,IAAI,cACrB,IAAI,SAAS,MAAM,IAAI,cACvB,IAAI,SAAS,OAAO,IAAI,eACxB;AAAA,EAEJ,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,EAAE,MAAM,UAAU,YAAY,KAAK;AAAA,EAC7C;AAAA;AAeK,SAAS,eAAe,CAC7B,MACA,aAAmD,aACrC;AAAA,EACd,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,EAAE,MAAM,UAAU,YAAY,KAAK;AAAA,EAC7C;AAAA;AAgBF,eAAsB,YAAY,CAAC,KAAoC;AAAA,EACrE,MAAM,WAAW,MAAM,MAAM,GAAG;AAAA,EAChC,MAAM,SAAS,MAAM,SAAS,YAAY;AAAA,EAC1C,MAAM,OAAO,OAAO,KAAK,MAAM,EAAE,SAAS,QAAQ;AAAA,EAGlD,MAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AAAA,EACvD,IAAI,aAAmD;AAAA,EAEvD,IAAI,aAAa,SAAS,MAAM,KAAK,aAAa,SAAS,KAAK,KAAK,IAAI,MAAM,WAAW,GAAG;AAAA,IAC3F,aAAa;AAAA,EACf,EAAO,SAAI,aAAa,SAAS,KAAK,KAAK,IAAI,SAAS,MAAM,GAAG;AAAA,IAC/D,aAAa;AAAA,EACf,EAAO,SAAI,aAAa,SAAS,MAAM,KAAK,IAAI,SAAS,OAAO,GAAG;AAAA,IACjE,aAAa;AAAA,EACf;AAAA,EAEA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,EAAE,MAAM,UAAU,YAAY,KAAK;AAAA,EAC7C;AAAA;",
13
+ "debugId": "CF8C45377A21CFA464756E2164756E21",
14
14
  "names": []
15
15
  }
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 { InternalSessionOptions, SDKMessage, SDKInitMessage, SendMessage } from "./types.js";
7
+ import type { InternalSessionOptions, SDKMessage, SDKInitMessage, SendMessage, ListMessagesOptions, ListMessagesResult } from "./types.js";
8
8
  export declare class Session implements AsyncDisposable {
9
9
  private options;
10
10
  private transport;
@@ -18,6 +18,7 @@ export declare class Session implements AsyncDisposable {
18
18
  private pumpPromise;
19
19
  private pumpClosed;
20
20
  private droppedStreamMessages;
21
+ private controlResponseWaiters;
21
22
  constructor(options?: InternalSessionOptions);
22
23
  /**
23
24
  * Initialize the session (called automatically on first send)
@@ -70,6 +71,15 @@ export declare class Session implements AsyncDisposable {
70
71
  * Abort the current operation (interrupt without closing the session)
71
72
  */
72
73
  abort(): Promise<void>;
74
+ /**
75
+ * Fetch a page of conversation messages via the CLI control protocol.
76
+ *
77
+ * The session must be initialized before calling this method.
78
+ * Safe to call concurrently with an active stream() — the pump routes
79
+ * matching control_response messages to this waiter without touching the
80
+ * stream queue.
81
+ */
82
+ listMessages(options?: ListMessagesOptions): Promise<ListMessagesResult>;
73
83
  /**
74
84
  * Close the session
75
85
  */
@@ -1 +1 @@
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,EAGZ,MAAM,YAAY,CAAC;AAcpB,qBAAa,OAAQ,YAAW,eAAe;IAc3C,OAAO,CAAC,OAAO;IAbjB,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,eAAe,CAA+C;IACtE,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,qBAAqB,CAAK;gBAGxB,OAAO,GAAE,sBAA2B;IAa9C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC;IAwE3C;;;;;;;;;;;;;;;OAeG;IACG,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB/C;;OAEG;IACI,MAAM,IAAI,cAAc,CAAC,UAAU,CAAC;IAgC3C,OAAO,CAAC,mBAAmB;YAgBb,iBAAiB;YAyBjB,oBAAoB;IA+BlC,OAAO,CAAC,oBAAoB;YAgBd,mBAAmB;IAcjC,OAAO,CAAC,uBAAuB;IAO/B;;OAEG;YACW,qBAAqB;IAqBnC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;YACW,yBAAyB;IAwDvC;;OAEG;YACW,gBAAgB;IAsF9B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;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;CAmIzB"}
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,EAUd,WAAW,EAGX,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAcpB,qBAAa,OAAQ,YAAW,eAAe;IAqB3C,OAAO,CAAC,OAAO;IApBjB,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,eAAe,CAA+C;IACtE,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,qBAAqB,CAAK;IAIlC,OAAO,CAAC,sBAAsB,CAG1B;gBAGM,OAAO,GAAE,sBAA2B;IAa9C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC;IA2F3C;;;;;;;;;;;;;;;OAeG;IACG,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB/C;;OAEG;IACI,MAAM,IAAI,cAAc,CAAC,UAAU,CAAC;IAgC3C,OAAO,CAAC,mBAAmB;YAgBb,iBAAiB;YA0CjB,oBAAoB;IA+BlC,OAAO,CAAC,oBAAoB;YAgBd,mBAAmB;IAcjC,OAAO,CAAC,uBAAuB;IAY/B;;OAEG;YACW,qBAAqB;IAqBnC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;YACW,yBAAyB;IAwDvC;;OAEG;YACW,gBAAgB;IAsF9B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B;;;;;;;OAOG;IACG,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmDlF;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;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;CA4LzB"}
@@ -4,6 +4,13 @@
4
4
  * Spawns the Letta Code CLI and communicates via stdin/stdout JSON streams.
5
5
  */
6
6
  import type { InternalSessionOptions, WireMessage } from "./types.js";
7
+ /**
8
+ * Build the CLI argument array for a given set of session options.
9
+ *
10
+ * Exported as a pure function for testing — this IS the real production code
11
+ * path. SubprocessTransport.buildArgs() delegates here.
12
+ */
13
+ export declare function buildCliArgs(options: InternalSessionOptions): string[];
7
14
  export declare class SubprocessTransport {
8
15
  private options;
9
16
  private process;
@@ -1 +1 @@
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;AAOtE,qBAAa,mBAAmB;IAW5B,OAAO,CAAC,OAAO;IAVjB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,gBAAgB,CAAgD;IACxE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,aAAa,CAAK;gBAGhB,OAAO,GAAE,sBAA2B;IAG9C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA6E9B;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWxC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAmBzC;;OAEG;IACI,QAAQ,IAAI,cAAc,CAAC,WAAW,CAAC;IAW9C;;OAEG;IACH,KAAK,IAAI,IAAI;IAgBb,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,OAAO,CAAC,aAAa;IAqCrB,OAAO,CAAC,SAAS;YA8JH,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;AAOtE;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,EAAE,CAmKtE;AAED,qBAAa,mBAAmB;IAW5B,OAAO,CAAC,OAAO;IAVjB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,gBAAgB,CAAgD;IACxE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,aAAa,CAAK;gBAGhB,OAAO,GAAE,sBAA2B;IAG9C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA6E9B;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWxC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAmBzC;;OAEG;IACI,QAAQ,IAAI,cAAc,CAAC,WAAW,CAAC;IAW9C;;OAEG;IACH,KAAK,IAAI,IAAI;IAgBb,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,OAAO,CAAC,aAAa;IAqCrB,OAAO,CAAC,SAAS;YAMH,OAAO;CA4CtB"}
package/dist/types.d.ts CHANGED
@@ -32,6 +32,26 @@ export type MessageContentItem = TextContent | ImageContent;
32
32
  * What send() accepts - either a simple string or multimodal content array
33
33
  */
34
34
  export type SendMessage = string | MessageContentItem[];
35
+ export type SkillSource = "bundled" | "global" | "agent" | "project";
36
+ export type SleeptimeTrigger = "off" | "step-count" | "compaction-event";
37
+ export type SleeptimeBehavior = "reminder" | "auto-launch";
38
+ /**
39
+ * Sleeptime settings exposed through SDK options.
40
+ * Any omitted fields preserve server/CLI defaults.
41
+ */
42
+ export interface SleeptimeOptions {
43
+ trigger?: SleeptimeTrigger;
44
+ behavior?: SleeptimeBehavior;
45
+ stepCount?: number;
46
+ }
47
+ /**
48
+ * Fully-resolved sleeptime settings emitted by init messages.
49
+ */
50
+ export interface EffectiveSleeptimeSettings {
51
+ trigger: SleeptimeTrigger;
52
+ behavior: SleeptimeBehavior;
53
+ stepCount: number;
54
+ }
35
55
  /**
36
56
  * Available system prompt presets.
37
57
  */
@@ -124,12 +144,17 @@ export interface InternalSessionOptions {
124
144
  human?: string;
125
145
  tags?: string[];
126
146
  memfs?: boolean;
147
+ skillSources?: SkillSource[];
148
+ systemInfoReminder?: boolean;
149
+ sleeptime?: SleeptimeOptions;
127
150
  allowedTools?: string[];
128
151
  disallowedTools?: string[];
129
152
  permissionMode?: PermissionMode;
130
153
  canUseTool?: CanUseToolCallback;
131
154
  tools?: AnyAgentTool[];
132
155
  cwd?: string;
156
+ /** If true, pass --include-partial-messages to CLI for token-level stream_event chunks */
157
+ includePartialMessages?: boolean;
133
158
  }
134
159
  export type PermissionMode = "default" | "acceptEdits" | "plan" | "bypassPermissions";
135
160
  /**
@@ -149,6 +174,25 @@ export interface CreateSessionOptions {
149
174
  permissionMode?: PermissionMode;
150
175
  /** Working directory for the CLI process */
151
176
  cwd?: string;
177
+ /**
178
+ * Enable/disable memory filesystem for this agent before running.
179
+ * true -> `--memfs`, false -> `--no-memfs`, undefined -> leave unchanged.
180
+ */
181
+ memfs?: boolean;
182
+ /**
183
+ * Restrict available skills by source.
184
+ * Empty array disables all skills (`--no-skills`).
185
+ */
186
+ skillSources?: SkillSource[];
187
+ /**
188
+ * Toggle first-turn system info reminder (device/git/cwd context).
189
+ * false -> `--no-system-info-reminder`.
190
+ */
191
+ systemInfoReminder?: boolean;
192
+ /**
193
+ * Configure sleeptime (reflection) settings, equivalent to `/sleeptime`.
194
+ */
195
+ sleeptime?: SleeptimeOptions;
152
196
  /** Custom permission callback - called when tool needs approval */
153
197
  canUseTool?: CanUseToolCallback;
154
198
  /**
@@ -156,6 +200,11 @@ export interface CreateSessionOptions {
156
200
  * These tools are registered with the CLI and executed when the LLM calls them.
157
201
  */
158
202
  tools?: AnyAgentTool[];
203
+ /**
204
+ * If true, pass --include-partial-messages to CLI to receive token-level
205
+ * stream_event chunks for incremental assistant/reasoning rendering.
206
+ */
207
+ includePartialMessages?: boolean;
159
208
  }
160
209
  /**
161
210
  * Options for createAgent() - full control over agent creation.
@@ -205,6 +254,20 @@ export interface CreateAgentOptions {
205
254
  * Maps to Letta Code CLI `--memfs` during agent creation.
206
255
  */
207
256
  memfs?: boolean;
257
+ /**
258
+ * Restrict available skills by source.
259
+ * Empty array disables all skills (`--no-skills`).
260
+ */
261
+ skillSources?: SkillSource[];
262
+ /**
263
+ * Toggle first-turn system info reminder (device/git/cwd context).
264
+ * false -> `--no-system-info-reminder`.
265
+ */
266
+ systemInfoReminder?: boolean;
267
+ /**
268
+ * Configure sleeptime (reflection) settings, equivalent to `/sleeptime`.
269
+ */
270
+ sleeptime?: SleeptimeOptions;
208
271
  }
209
272
  /**
210
273
  * SDK message types - clean wrappers around wire types
@@ -216,6 +279,10 @@ export interface SDKInitMessage {
216
279
  conversationId: string;
217
280
  model: string;
218
281
  tools: string[];
282
+ memfsEnabled?: boolean;
283
+ skillSources?: SkillSource[];
284
+ systemInfoReminderEnabled?: boolean;
285
+ sleeptime?: EffectiveSleeptimeSettings;
219
286
  }
220
287
  export interface SDKAssistantMessage {
221
288
  type: "assistant";
@@ -268,8 +335,67 @@ export interface SDKStreamEventMessage {
268
335
  };
269
336
  uuid: string;
270
337
  }
338
+ /**
339
+ * Error message from the CLI — carries the actual error detail that
340
+ * would otherwise be lost (the subsequent `type=result` only has
341
+ * the opaque string "error" as its error field).
342
+ */
343
+ export interface SDKErrorMessage {
344
+ type: "error";
345
+ /** Human-readable error description from the CLI */
346
+ message: string;
347
+ /** Why the run stopped (e.g. "error", "llm_api_error", "max_steps") */
348
+ stopReason: string;
349
+ /** Run that produced the error, if available */
350
+ runId?: string;
351
+ /** Nested Letta API error when the error originated server-side */
352
+ apiError?: Record<string, unknown>;
353
+ }
354
+ /**
355
+ * Retry message — the CLI is retrying after a transient failure.
356
+ * Emitted before each retry attempt so consumers can log / display progress.
357
+ */
358
+ export interface SDKRetryMessage {
359
+ type: "retry";
360
+ /** The stop reason that triggered the retry */
361
+ reason: string;
362
+ /** Current attempt number (1-based) */
363
+ attempt: number;
364
+ /** Maximum attempts before giving up */
365
+ maxAttempts: number;
366
+ /** Delay in ms before the next attempt */
367
+ delayMs: number;
368
+ /** Run that triggered the retry, if available */
369
+ runId?: string;
370
+ }
271
371
  /** Union of all SDK message types */
272
- export type SDKMessage = SDKInitMessage | SDKAssistantMessage | SDKToolCallMessage | SDKToolResultMessage | SDKReasoningMessage | SDKResultMessage | SDKStreamEventMessage;
372
+ export type SDKMessage = SDKInitMessage | SDKAssistantMessage | SDKToolCallMessage | SDKToolResultMessage | SDKReasoningMessage | SDKResultMessage | SDKStreamEventMessage | SDKErrorMessage | SDKRetryMessage;
373
+ /**
374
+ * Options for session.listMessages().
375
+ */
376
+ export interface ListMessagesOptions {
377
+ /** Explicit conversation ID (e.g. "conv-123"). If omitted, uses agent default. */
378
+ conversationId?: string;
379
+ /** Return messages before this message ID (cursor for older pages). */
380
+ before?: string;
381
+ /** Return messages after this message ID (cursor for newer pages). */
382
+ after?: string;
383
+ /** Sort order. Defaults to "desc" (newest first). */
384
+ order?: "asc" | "desc";
385
+ /** Max messages per page. Defaults to 50. */
386
+ limit?: number;
387
+ }
388
+ /**
389
+ * Result from session.listMessages().
390
+ * `messages` are raw Letta API message objects in the requested order.
391
+ */
392
+ export interface ListMessagesResult {
393
+ messages: unknown[];
394
+ /** ID of the oldest message in this page; use as `before` for the next page. */
395
+ nextBefore?: string | null;
396
+ /** Whether more pages exist in the requested direction. */
397
+ hasMore?: boolean;
398
+ }
273
399
  /**
274
400
  * Request to execute an external tool (CLI → SDK)
275
401
  */
@@ -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 +1 @@
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"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EAMnB,MAAM,YAAY,CAAC;AA0FpB;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAQhF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAgD5E"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@letta-ai/letta-code-sdk",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "SDK for programmatic control of Letta Code CLI",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -26,7 +26,7 @@
26
26
  "url": "https://github.com/letta-ai/letta-code-sdk"
27
27
  },
28
28
  "dependencies": {
29
- "@letta-ai/letta-code": "0.15.3"
29
+ "@letta-ai/letta-code": "0.16.4"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/bun": "latest",