@data-club/ai-hub-server 0.0.9 → 0.0.11
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/dist/auth/encryption.d.ts +5 -5
- package/dist/auth/encryption.js +5 -5
- package/dist/auth/userView.d.ts +8 -15
- package/dist/auth/userView.d.ts.map +1 -1
- package/dist/auth/userView.js +10 -23
- package/dist/auth/userView.js.map +1 -1
- package/dist/bootstrap.d.ts +2 -8
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +2 -35
- package/dist/bootstrap.js.map +1 -1
- package/dist/db/migrate.js +6 -17
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/schema.d.ts +17 -263
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +8 -57
- package/dist/db/schema.js.map +1 -1
- package/dist/db/seed.d.ts +4 -19
- package/dist/db/seed.d.ts.map +1 -1
- package/dist/db/seed.js +6 -33
- package/dist/db/seed.js.map +1 -1
- package/dist/handlers/fetch.d.ts +6 -7
- package/dist/handlers/fetch.d.ts.map +1 -1
- package/dist/handlers/fetch.js +1 -3
- package/dist/handlers/fetch.js.map +1 -1
- package/dist/handlers/types.d.ts +5 -6
- package/dist/handlers/types.d.ts.map +1 -1
- package/dist/letta/client.d.ts +86 -263
- package/dist/letta/client.d.ts.map +1 -1
- package/dist/letta/client.js +99 -404
- package/dist/letta/client.js.map +1 -1
- package/dist/letta/index.d.ts +6 -8
- package/dist/letta/index.d.ts.map +1 -1
- package/dist/letta/index.js +5 -7
- package/dist/letta/index.js.map +1 -1
- package/dist/letta/sandbox.d.ts +45 -9
- package/dist/letta/sandbox.d.ts.map +1 -1
- package/dist/letta/sandbox.js +123 -11
- package/dist/letta/sandbox.js.map +1 -1
- package/dist/letta/types.d.ts +6 -49
- package/dist/letta/types.d.ts.map +1 -1
- package/dist/letta/types.js +5 -10
- package/dist/letta/types.js.map +1 -1
- package/dist/observability/logger.d.ts.map +1 -1
- package/dist/observability/logger.js +0 -2
- package/dist/observability/logger.js.map +1 -1
- package/dist/routes/admin/agents.d.ts.map +1 -1
- package/dist/routes/admin/agents.js +0 -40
- package/dist/routes/admin/agents.js.map +1 -1
- package/dist/routes/admin/rotatingMessages.d.ts.map +1 -1
- package/dist/routes/admin/rotatingMessages.js +37 -1
- package/dist/routes/admin/rotatingMessages.js.map +1 -1
- package/dist/routes/admin/settings.d.ts +6 -15
- package/dist/routes/admin/settings.d.ts.map +1 -1
- package/dist/routes/admin/settings.js +9 -107
- package/dist/routes/admin/settings.js.map +1 -1
- package/dist/routes/auth.d.ts +0 -4
- package/dist/routes/auth.d.ts.map +1 -1
- package/dist/routes/auth.js +1 -5
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/sessions.d.ts.map +1 -1
- package/dist/routes/sessions.js +9 -30
- package/dist/routes/sessions.js.map +1 -1
- package/dist/state/rotationRunner.d.ts +6 -0
- package/dist/state/rotationRunner.d.ts.map +1 -1
- package/dist/state/rotationRunner.js +19 -2
- package/dist/state/rotationRunner.js.map +1 -1
- package/dist/state/rotationScheduler.d.ts +2 -0
- package/dist/state/rotationScheduler.d.ts.map +1 -1
- package/dist/state/rotationScheduler.js.map +1 -1
- package/dist/state/turnRunner.d.ts.map +1 -1
- package/dist/state/turnRunner.js +1 -75
- package/dist/state/turnRunner.js.map +1 -1
- package/package.json +4 -4
- package/src/auth/encryption.ts +5 -5
- package/src/auth/userView.ts +9 -22
- package/src/bootstrap.ts +4 -43
- package/src/db/migrate.ts +6 -17
- package/src/db/schema.ts +8 -68
- package/src/db/seed.ts +6 -47
- package/src/handlers/fetch.ts +7 -10
- package/src/handlers/types.ts +5 -6
- package/src/letta/client.ts +170 -634
- package/src/letta/index.ts +8 -21
- package/src/letta/sandbox.ts +151 -11
- package/src/letta/types.ts +9 -60
- package/src/observability/logger.ts +0 -2
- package/src/routes/admin/agents.ts +0 -49
- package/src/routes/admin/rotatingMessages.ts +47 -1
- package/src/routes/admin/settings.ts +9 -113
- package/src/routes/auth.ts +1 -5
- package/src/routes/sessions.ts +11 -32
- package/src/state/rotationRunner.ts +37 -1
- package/src/state/rotationScheduler.ts +2 -0
- package/src/state/turnRunner.ts +1 -77
- package/src/letta/lettaCliShim.mjs +0 -40
- package/src/letta/settingsFileSeed.ts +0 -254
package/dist/letta/client.js
CHANGED
|
@@ -1,50 +1,44 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Letta access layer — server-less local backend.
|
|
3
3
|
*
|
|
4
|
-
* **
|
|
4
|
+
* AI Hub drives **Letta Code's local backend** through
|
|
5
|
+
* `@data-club/letta-runtime`: agent/conversation state lives on the local
|
|
6
|
+
* filesystem (`AI_HUB_LETTA_STORE_DIR`), chat turns run in an SDK-spawned
|
|
7
|
+
* Letta Code CLI subprocess, and inference is client-side (Letta Code's Pi
|
|
8
|
+
* provider layer calling Anthropic / AWS Bedrock directly). There is no
|
|
9
|
+
* Letta server and no `@letta-ai/letta-client` anywhere in this path — the
|
|
10
|
+
* server-backed implementation was removed in the local-backend migration
|
|
11
|
+
* (see docs/investigations/2026-07-01-letta-code-local-backend-migration.md).
|
|
5
12
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* `streamUserMessage`. Spawns a Letta Code CLI subprocess per turn;
|
|
13
|
-
* the CLI's internal Pi (Provider Interface) + bundled `models.json`
|
|
14
|
-
* handle model selection, reasoning-tier presets, and provider
|
|
15
|
-
* fallback routing (e.g. Anthropic → Bedrock Opus 4.7). This is what
|
|
16
|
-
* keeps ai-hub current with model releases without code changes.
|
|
13
|
+
* **MCP tools.** Letta Code is not an MCP client; with no Letta server, AI
|
|
14
|
+
* Hub is the MCP host. On the first chat turn this module connects to the
|
|
15
|
+
* servers configured in `AI_HUB_MCP_SERVERS` (`name=url,name2=url2`,
|
|
16
|
+
* Streamable HTTP) and injects their tools into every session via the
|
|
17
|
+
* runtime's `tools` option; tool executions round-trip through the SDK's
|
|
18
|
+
* `execute_external_tool` control channel in this process.
|
|
17
19
|
*
|
|
18
|
-
* **
|
|
19
|
-
*
|
|
20
|
+
* **Tool suppression.** Letta Code's bundled tools are hidden from the
|
|
21
|
+
* model via `disallowedTools` (the headless-mode equivalent of the TUI's
|
|
22
|
+
* `/toolset none`). The old `--tools ""` CLI shim is gone — emptying the
|
|
23
|
+
* CLI's tool registry also strips SDK-injected MCP tools (verified
|
|
24
|
+
* empirically), so the disallow list is the only suppression mechanism.
|
|
20
25
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* instance per `(apiKey, baseURL)` pair so super-admin connection
|
|
25
|
-
* edits propagate without restart. The Letta-Code subprocess inherits
|
|
26
|
-
* `process.env` (which must carry `LETTA_BASE_URL` + `LETTA_API_KEY` —
|
|
27
|
-
* the boot script sets these from the same decrypted DB row).
|
|
28
|
-
*
|
|
29
|
-
* @see SPECIFICATIONS.md §6.4 — Letta integration
|
|
30
|
-
* @see SPECIFICATIONS.md §6.4.1 — first-class SDK surfaces
|
|
26
|
+
* This module composes AI-Hub policy (subprocess throttle, tool
|
|
27
|
+
* disallow-lists, sandbox cwd) around the runtime; everything Letta-shaped
|
|
28
|
+
* lives in `@data-club/letta-runtime`.
|
|
31
29
|
*/
|
|
32
|
-
import {
|
|
33
|
-
import
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
import { adminSetting } from "../db/schema.js";
|
|
37
|
-
import { seedAgentToolsetNone } from "./settingsFileSeed.js";
|
|
30
|
+
import { homedir } from "node:os";
|
|
31
|
+
import { join } from "node:path";
|
|
32
|
+
import { createRequire } from "node:module";
|
|
33
|
+
import { ConversationNotFoundError, connectMcpServers, LocalLettaRuntime, parseMcpServersConfig, } from "@data-club/letta-runtime";
|
|
38
34
|
import {} from "./subprocessThrottle.js";
|
|
39
35
|
// Re-export so consumers don't need to know about the throttle module.
|
|
40
36
|
export { ServerOverloadedError, SubprocessThrottle } from "./subprocessThrottle.js";
|
|
41
37
|
/**
|
|
42
|
-
* Thrown when `forkConversation(sourceId)`
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* validation should have caught it before any user-facing session
|
|
47
|
-
* create reached the fork path).
|
|
38
|
+
* Thrown when `forkConversation(sourceId)` resolves to "no such
|
|
39
|
+
* conversation". The admin agents validator catches this and returns
|
|
40
|
+
* `400 fork_source_not_found` inline on the field; the chat route surfaces
|
|
41
|
+
* it as a 500 (admin-side validation should have caught it earlier).
|
|
48
42
|
*
|
|
49
43
|
* @see docs/server/session-sandboxes.md
|
|
50
44
|
*/
|
|
@@ -58,35 +52,32 @@ export class ForkSourceNotFoundError extends Error {
|
|
|
58
52
|
}
|
|
59
53
|
/**
|
|
60
54
|
* Letta Code's bundled tools that are ALWAYS disallowed regardless of
|
|
61
|
-
* whether a per-session sandbox is configured
|
|
62
|
-
*
|
|
63
|
-
* Includes:
|
|
64
|
-
* - Memory tools (the v1 no-memory stance keeps these forbidden; see
|
|
65
|
-
* docs/admin/agent-management.md).
|
|
66
|
-
* - Sub-agent management (`Task` / `TaskOutput` / `TaskStop` / `TodoWrite`
|
|
67
|
-
* / `Skill`) — not exposed to ai-hub end users.
|
|
68
|
-
* - Interactive tools (`AskUserQuestion` / `EnterPlanMode` /
|
|
69
|
-
* `ExitPlanMode`) — hang the headless code path.
|
|
70
|
-
* - Web tools (`WebFetch` / `WebSearch`) — operator-curated agents
|
|
71
|
-
* should reach the web through ADE-attached MCP tools, not Letta
|
|
72
|
-
* Code's defaults.
|
|
55
|
+
* whether a per-session sandbox is configured:
|
|
73
56
|
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
57
|
+
* - Memory tools — the v1 no-memory stance (memfs is off store-wide via the
|
|
58
|
+
* runtime, this is defense-in-depth).
|
|
59
|
+
* - Sub-agent / task management — not exposed to ai-hub end users.
|
|
60
|
+
* - Interactive tools — hang the headless code path.
|
|
61
|
+
* - Web tools — operator-curated agents reach the web through MCP tools.
|
|
77
62
|
*
|
|
78
|
-
*
|
|
63
|
+
* Grep-anchor: ALWAYS_DISALLOWED_TOOLS. Extend when Letta Code adds new
|
|
64
|
+
* bundled tools upstream (check the headless init message's `tools` list
|
|
65
|
+
* after a fork sync).
|
|
79
66
|
*/
|
|
80
67
|
const ALWAYS_DISALLOWED_TOOLS = [
|
|
81
68
|
// Sub-agent + task management
|
|
82
69
|
"Task",
|
|
83
70
|
"TaskOutput",
|
|
84
71
|
"TaskStop",
|
|
72
|
+
"TaskCreate",
|
|
73
|
+
"TaskGet",
|
|
74
|
+
"TaskList",
|
|
75
|
+
"TaskUpdate",
|
|
85
76
|
"TodoWrite",
|
|
77
|
+
"Agent",
|
|
86
78
|
// Skills + slash invocation
|
|
87
79
|
"Skill",
|
|
88
|
-
// Memory (
|
|
89
|
-
// no-memory stance keeps these forbidden even when a sandbox is enabled.
|
|
80
|
+
// Memory (kept forbidden even with a sandbox)
|
|
90
81
|
"memory",
|
|
91
82
|
"memory_apply_patch",
|
|
92
83
|
"memory_insert",
|
|
@@ -96,8 +87,8 @@ const ALWAYS_DISALLOWED_TOOLS = [
|
|
|
96
87
|
"AskUserQuestion",
|
|
97
88
|
"EnterPlanMode",
|
|
98
89
|
"ExitPlanMode",
|
|
99
|
-
|
|
100
|
-
//
|
|
90
|
+
"EnterWorktree",
|
|
91
|
+
// Web tools
|
|
101
92
|
"WebFetch",
|
|
102
93
|
"WebSearch",
|
|
103
94
|
];
|
|
@@ -108,7 +99,6 @@ const ALWAYS_DISALLOWED_TOOLS = [
|
|
|
108
99
|
* agent can actually use the seeded files (Step 12.5).
|
|
109
100
|
*/
|
|
110
101
|
const FILESYSTEM_TOOLS = [
|
|
111
|
-
// File / shell — every preset toolset's core set
|
|
112
102
|
"Read",
|
|
113
103
|
"Write",
|
|
114
104
|
"Edit",
|
|
@@ -122,404 +112,109 @@ const FILESYSTEM_TOOLS = [
|
|
|
122
112
|
"edit_file_lc",
|
|
123
113
|
"execute_shell_lc",
|
|
124
114
|
];
|
|
115
|
+
/** Resolves the Letta Code CLI entry (`letta.js`) from the installed fork. */
|
|
116
|
+
function resolveDefaultCliPath() {
|
|
117
|
+
const require = createRequire(import.meta.url);
|
|
118
|
+
return require.resolve("@data-club/letta-code");
|
|
119
|
+
}
|
|
125
120
|
/**
|
|
126
|
-
* Constructs the default `LettaClient` implementation
|
|
127
|
-
*
|
|
128
|
-
* Reads `admin_setting.letta_base_url` + `letta_api_key_encrypted` on
|
|
129
|
-
* each Letta-Client call (no in-flight polling — fresh-on-demand) and
|
|
130
|
-
* memoizes the underlying SDK instance against `(apiKey, baseURL)` so
|
|
131
|
-
* super-admin connection-settings edits propagate without restart.
|
|
132
|
-
*
|
|
133
|
-
* Throws on the first Letta-Client call if `admin_setting` has no
|
|
134
|
-
* `letta_base_url` or no decryptable API key.
|
|
135
|
-
*
|
|
136
|
-
* @param deps - see `CreateLettaClientDeps`.
|
|
137
|
-
* @returns the project-shaped Letta client.
|
|
138
|
-
*
|
|
139
|
-
* @see SPECIFICATIONS.md §6.4
|
|
140
|
-
* @see SPECIFICATIONS.md §11 — `admin_setting` schema
|
|
121
|
+
* Constructs the default `LettaClient` implementation over the local
|
|
122
|
+
* backend. See the module doc for the architecture.
|
|
141
123
|
*/
|
|
142
124
|
export function createDefaultLettaClient(deps) {
|
|
143
|
-
const SdkCtor = deps.sdkConstructor ?? LettaSdkDefault;
|
|
144
|
-
const resume = deps.resumeSessionFn ?? resumeSession;
|
|
145
|
-
let cached = null;
|
|
146
125
|
const envSource = deps.envSource ?? process.env;
|
|
126
|
+
const runtime = deps.runtime ??
|
|
127
|
+
new LocalLettaRuntime({
|
|
128
|
+
cliPath: envSource.AI_HUB_LETTA_CLI_PATH ?? resolveDefaultCliPath(),
|
|
129
|
+
storeDir: envSource.AI_HUB_LETTA_STORE_DIR ??
|
|
130
|
+
join(homedir(), ".letta", "lc-local-backend"),
|
|
131
|
+
memfs: false,
|
|
132
|
+
});
|
|
147
133
|
/**
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
* **API key precedence** (per the operator-spec'd model):
|
|
152
|
-
* 1. If `admin_setting.letta_api_key_encrypted` decrypts to a non-empty,
|
|
153
|
-
* non-whitespace string → use that (super-admin set it via the
|
|
154
|
-
* admin panel; DB wins over env).
|
|
155
|
-
* 2. Otherwise → fall back to `env.LETTA_API_KEY` (whitespace-trimmed).
|
|
156
|
-
* 3. Otherwise → throw — neither source has a usable value.
|
|
157
|
-
*
|
|
158
|
-
* Evaluated on every call, so:
|
|
159
|
-
* - A super-admin PATCH to /admin/settings takes effect immediately.
|
|
160
|
-
* - Clearing the value via the admin panel (empty/whitespace) falls
|
|
161
|
-
* back to env on the very next request.
|
|
162
|
-
* - A new `.env` after a restart is reflected immediately when the DB
|
|
163
|
-
* column is empty.
|
|
134
|
+
* MCP tools, connected lazily on the first chat turn and cached for the
|
|
135
|
+
* process lifetime. A failed connect is NOT cached — the next turn
|
|
136
|
+
* retries, so a briefly-down MCP server doesn't wedge the deployment.
|
|
164
137
|
*/
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
.
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
}
|
|
138
|
+
let mcpToolsPromise = null;
|
|
139
|
+
function getMcpTools() {
|
|
140
|
+
if (mcpToolsPromise === null) {
|
|
141
|
+
const servers = parseMcpServersConfig(envSource.AI_HUB_MCP_SERVERS);
|
|
142
|
+
mcpToolsPromise =
|
|
143
|
+
servers.length === 0
|
|
144
|
+
? Promise.resolve([])
|
|
145
|
+
: connectMcpServers(servers).then((bridge) => bridge.tools);
|
|
146
|
+
mcpToolsPromise.catch(() => {
|
|
147
|
+
mcpToolsPromise = null;
|
|
148
|
+
});
|
|
176
149
|
}
|
|
177
|
-
|
|
178
|
-
if (envKey && envKey.trim().length > 0) {
|
|
179
|
-
return { apiKey: envKey, source: "env" };
|
|
180
|
-
}
|
|
181
|
-
throw new Error("No Letta API key configured. Set LETTA_API_KEY in .env, OR PATCH it via /admin/settings.");
|
|
182
|
-
}
|
|
183
|
-
function getSdk() {
|
|
184
|
-
const settings = deps.db
|
|
185
|
-
.select()
|
|
186
|
-
.from(adminSetting)
|
|
187
|
-
.where(eq(adminSetting.id, 1))
|
|
188
|
-
.get();
|
|
189
|
-
if (!settings?.lettaBaseUrl) {
|
|
190
|
-
throw new Error("admin_setting.letta_base_url is empty — configure it via /admin/settings or LETTA_BASE_URL.");
|
|
191
|
-
}
|
|
192
|
-
const { apiKey } = resolveApiKey();
|
|
193
|
-
// The Letta Client SDK appends its own `/v1/...` paths, so a
|
|
194
|
-
// `letta_base_url` like `http://localhost:8283/v1` produces
|
|
195
|
-
// double-v1 calls. Strip a trailing `/v1` defensively.
|
|
196
|
-
const baseURL = settings.lettaBaseUrl.replace(/\/v1\/?$/i, "");
|
|
197
|
-
if (cached && cached.apiKey === apiKey && cached.baseURL === baseURL) {
|
|
198
|
-
return cached.sdk;
|
|
199
|
-
}
|
|
200
|
-
const sdk = new SdkCtor({ apiKey, baseURL });
|
|
201
|
-
cached = { apiKey, baseURL, sdk };
|
|
202
|
-
return sdk;
|
|
150
|
+
return mcpToolsPromise;
|
|
203
151
|
}
|
|
204
152
|
return {
|
|
205
153
|
async retrieveAgent(lettaAgentId) {
|
|
206
|
-
|
|
207
|
-
try {
|
|
208
|
-
const state = await sdk.agents.retrieve(lettaAgentId);
|
|
209
|
-
return { id: state.id, name: state.name, model: state.model ?? "" };
|
|
210
|
-
}
|
|
211
|
-
catch (err) {
|
|
212
|
-
if (err instanceof NotFoundError)
|
|
213
|
-
return null;
|
|
214
|
-
throw err;
|
|
215
|
-
}
|
|
154
|
+
return runtime.retrieveAgent(lettaAgentId);
|
|
216
155
|
},
|
|
217
156
|
async createConversation(lettaAgentId) {
|
|
218
|
-
|
|
219
|
-
const conv = await sdk.conversations.create({ agent_id: lettaAgentId });
|
|
220
|
-
return { id: conv.id };
|
|
157
|
+
return runtime.createConversation(lettaAgentId);
|
|
221
158
|
},
|
|
222
159
|
async retrieveConversation(conversationId) {
|
|
223
|
-
|
|
224
|
-
try {
|
|
225
|
-
const conv = await sdk.conversations.retrieve(conversationId);
|
|
226
|
-
return { id: conv.id, agentId: conv.agent_id };
|
|
227
|
-
}
|
|
228
|
-
catch (err) {
|
|
229
|
-
if (err instanceof NotFoundError)
|
|
230
|
-
return null;
|
|
231
|
-
throw err;
|
|
232
|
-
}
|
|
160
|
+
return runtime.retrieveConversation(conversationId);
|
|
233
161
|
},
|
|
234
162
|
async forkConversation(sourceConversationId) {
|
|
235
|
-
const sdk = getSdk();
|
|
236
163
|
try {
|
|
237
|
-
|
|
238
|
-
// We don't pass a body — defaults are fine for our use case
|
|
239
|
-
// (forked conversation is not hidden, no extra params needed).
|
|
240
|
-
const conv = await sdk.conversations.fork(sourceConversationId);
|
|
241
|
-
return { id: conv.id, agentId: conv.agent_id };
|
|
164
|
+
return await runtime.forkConversation(sourceConversationId);
|
|
242
165
|
}
|
|
243
166
|
catch (err) {
|
|
244
|
-
if (err instanceof
|
|
167
|
+
if (err instanceof ConversationNotFoundError) {
|
|
245
168
|
throw new ForkSourceNotFoundError(sourceConversationId);
|
|
246
169
|
}
|
|
247
170
|
throw err;
|
|
248
171
|
}
|
|
249
172
|
},
|
|
250
173
|
async listMessages(conversationId) {
|
|
251
|
-
|
|
252
|
-
const out = [];
|
|
253
|
-
const page = await sdk.conversations.messages.list(conversationId);
|
|
254
|
-
for await (const msg of page) {
|
|
255
|
-
out.push(msg);
|
|
256
|
-
}
|
|
257
|
-
return out;
|
|
258
|
-
},
|
|
259
|
-
async deleteMessage(lettaAgentId, messageId) {
|
|
260
|
-
const sdk = getSdk();
|
|
261
|
-
try {
|
|
262
|
-
// The typed `conversations.messages` resource is create/list-only;
|
|
263
|
-
// the message-delete capability lives on the agent-scoped REST route.
|
|
264
|
-
// Same raw-HTTP escape hatch `getRunUsageStats` uses for `sdk.get`.
|
|
265
|
-
await sdk.delete(`/v1/agents/${encodeURIComponent(lettaAgentId)}/messages/${encodeURIComponent(messageId)}`);
|
|
266
|
-
}
|
|
267
|
-
catch (err) {
|
|
268
|
-
// Already gone is fine — the goal state (message absent) is reached.
|
|
269
|
-
if (err instanceof NotFoundError)
|
|
270
|
-
return;
|
|
271
|
-
throw err;
|
|
272
|
-
}
|
|
174
|
+
return runtime.listMessages(conversationId);
|
|
273
175
|
},
|
|
274
|
-
async
|
|
275
|
-
|
|
276
|
-
try {
|
|
277
|
-
await sdk.conversations.delete(conversationId);
|
|
278
|
-
}
|
|
279
|
-
catch (err) {
|
|
280
|
-
if (err instanceof NotFoundError)
|
|
281
|
-
return;
|
|
282
|
-
throw err;
|
|
283
|
-
}
|
|
176
|
+
async deleteMessage(_lettaAgentId, _messageId) {
|
|
177
|
+
// Intentional no-op — see the interface doc.
|
|
284
178
|
},
|
|
285
|
-
async
|
|
286
|
-
|
|
287
|
-
// Two endpoints in parallel:
|
|
288
|
-
// - `/v1/runs/{id}/messages` carries persisted assistant
|
|
289
|
-
// messages — we need the LAST one's id to stamp the badge.
|
|
290
|
-
// The `usage_statistics` SDK stream event is NOT persisted
|
|
291
|
-
// here; we used to look for it but it's stream-only.
|
|
292
|
-
// - `/v1/runs/{id}/steps` carries per-LLM-call usage with the
|
|
293
|
-
// full cache breakdown (`cached_input_tokens`,
|
|
294
|
-
// `cache_write_tokens`, `reasoning_tokens`). For multi-step
|
|
295
|
-
// turns we sum across steps; for single-step turns we just
|
|
296
|
-
// read the one row.
|
|
297
|
-
//
|
|
298
|
-
// Best-effort: any failure on either side returns null and the
|
|
299
|
-
// badge just doesn't render. Never blocks the chat turn.
|
|
300
|
-
let messagesRaw;
|
|
301
|
-
let stepsRaw;
|
|
302
|
-
try {
|
|
303
|
-
[messagesRaw, stepsRaw] = await Promise.all([
|
|
304
|
-
sdk.get(`/v1/runs/${runId}/messages`),
|
|
305
|
-
sdk.get(`/v1/runs/${runId}/steps`),
|
|
306
|
-
]);
|
|
307
|
-
}
|
|
308
|
-
catch {
|
|
309
|
-
return null;
|
|
310
|
-
}
|
|
311
|
-
// Pull the last assistant message id (anchor for the badge).
|
|
312
|
-
let lastAssistantMessageId = null;
|
|
313
|
-
if (Array.isArray(messagesRaw)) {
|
|
314
|
-
for (const item of messagesRaw) {
|
|
315
|
-
if (!item || typeof item !== "object")
|
|
316
|
-
continue;
|
|
317
|
-
const m = item;
|
|
318
|
-
if (m["message_type"] === "assistant_message" && typeof m["id"] === "string") {
|
|
319
|
-
lastAssistantMessageId = m["id"];
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
// Sum tokens across steps. Missing fields stay null in the sum
|
|
324
|
-
// (the sum only goes non-null if at least one step reported it),
|
|
325
|
-
// so providers that don't expose cache_write keep it null at the
|
|
326
|
-
// top level rather than silently appearing as 0.
|
|
327
|
-
if (!Array.isArray(stepsRaw))
|
|
328
|
-
return null;
|
|
329
|
-
const sum = {
|
|
330
|
-
promptTokens: null,
|
|
331
|
-
completionTokens: null,
|
|
332
|
-
totalTokens: null,
|
|
333
|
-
cachedInputTokens: null,
|
|
334
|
-
cacheWriteTokens: null,
|
|
335
|
-
reasoningTokens: null,
|
|
336
|
-
contextTokens: null,
|
|
337
|
-
};
|
|
338
|
-
const addInto = (key, v) => {
|
|
339
|
-
if (typeof v !== "number")
|
|
340
|
-
return;
|
|
341
|
-
sum[key] = (sum[key] ?? 0) + v;
|
|
342
|
-
};
|
|
343
|
-
let anyStep = false;
|
|
344
|
-
for (const item of stepsRaw) {
|
|
345
|
-
if (!item || typeof item !== "object")
|
|
346
|
-
continue;
|
|
347
|
-
anyStep = true;
|
|
348
|
-
const s = item;
|
|
349
|
-
addInto("promptTokens", s["prompt_tokens"]);
|
|
350
|
-
addInto("completionTokens", s["completion_tokens"]);
|
|
351
|
-
addInto("totalTokens", s["total_tokens"]);
|
|
352
|
-
addInto("cachedInputTokens", s["cached_input_tokens"]);
|
|
353
|
-
addInto("cacheWriteTokens", s["cache_write_tokens"]);
|
|
354
|
-
addInto("reasoningTokens", s["reasoning_tokens"]);
|
|
355
|
-
}
|
|
356
|
-
if (!anyStep)
|
|
357
|
-
return null;
|
|
358
|
-
return {
|
|
359
|
-
lastAssistantMessageId,
|
|
360
|
-
...sum,
|
|
361
|
-
};
|
|
179
|
+
async deleteConversation(_conversationId) {
|
|
180
|
+
// Intentional no-op — see the interface doc.
|
|
362
181
|
},
|
|
363
182
|
async streamUserMessage(opts) {
|
|
364
183
|
// Throttle gate first — synchronous, throws ServerOverloadedError.
|
|
365
184
|
// Caller's chat-route catch turns that into HTTP 503.
|
|
366
185
|
const lease = deps.subprocessThrottle.acquire();
|
|
367
|
-
//
|
|
368
|
-
// (
|
|
369
|
-
//
|
|
370
|
-
// process.env at spawn time is what the CLI sends to Letta. Mutating
|
|
371
|
-
// it here on every spawn means a super-admin's PATCH to
|
|
372
|
-
// /admin/settings takes effect on the very next chat turn without
|
|
373
|
-
// a process restart — matches the same hot-reload behavior the
|
|
374
|
-
// direct-REST `getSdk()` path already had via SDK memoization on
|
|
375
|
-
// the `(apiKey, baseURL)` pair.
|
|
376
|
-
//
|
|
377
|
-
// If resolveApiKey throws (no usable value anywhere), we release
|
|
378
|
-
// the throttle lease before propagating — otherwise the slot would
|
|
379
|
-
// be leaked.
|
|
380
|
-
try {
|
|
381
|
-
const resolved = resolveApiKey();
|
|
382
|
-
process.env.LETTA_API_KEY = resolved.apiKey;
|
|
383
|
-
}
|
|
384
|
-
catch (err) {
|
|
385
|
-
lease.release();
|
|
386
|
-
throw err;
|
|
387
|
-
}
|
|
388
|
-
// Letta Code's CLI reads `LETTA_BASE_URL` from env and appends
|
|
389
|
-
// `/v1/...` to it. If the operator set the env to
|
|
390
|
-
// `http://localhost:8283/v1` (matching the Letta Client SDK's
|
|
391
|
-
// expectation), the CLI produces double-v1 URLs that 404 — the
|
|
392
|
-
// CLI surfaces this as "Failed to connect to Letta server /
|
|
393
|
-
// credentials may be invalid", which is misleading. Strip the
|
|
394
|
-
// trailing `/v1` in process.env on every spawn (idempotent —
|
|
395
|
-
// already-stripped values pass through unchanged). Operators
|
|
396
|
-
// who use the bare-host form aren't affected. (Also done in
|
|
397
|
-
// `bootstrap.ts` at boot for the primary case; this is
|
|
398
|
-
// defense-in-depth.)
|
|
399
|
-
const rawBaseUrl = process.env.LETTA_BASE_URL;
|
|
400
|
-
if (rawBaseUrl) {
|
|
401
|
-
const stripped = rawBaseUrl.replace(/\/v1\/?$/i, "");
|
|
402
|
-
if (stripped !== rawBaseUrl) {
|
|
403
|
-
process.env.LETTA_BASE_URL = stripped;
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
// Re-seed `~/.letta/settings.json` with `{toolset: "none"}` for
|
|
407
|
-
// this agent on every spawn. Necessary because concurrent CLI
|
|
408
|
-
// subprocesses race on settings-file writes (each maintains its
|
|
409
|
-
// own in-memory snapshot, writes back on exit, last-writer-wins)
|
|
410
|
-
// and the agent-registration-time seed can be wiped between
|
|
411
|
-
// spawns. Idempotent — when the entry already matches, this is
|
|
412
|
-
// a no-op (doesn't touch the file's mtime). Best-effort: a
|
|
413
|
-
// write failure logs but doesn't block the chat turn (the shim
|
|
414
|
-
// is the primary mechanism; the settings file is defense-in-
|
|
415
|
-
// depth + TUI-compatibility).
|
|
416
|
-
try {
|
|
417
|
-
seedAgentToolsetNone({
|
|
418
|
-
agentId: opts.lettaAgentId,
|
|
419
|
-
lettaBaseUrl: process.env.LETTA_BASE_URL,
|
|
420
|
-
});
|
|
421
|
-
}
|
|
422
|
-
catch {
|
|
423
|
-
// intentionally ignored — see above
|
|
424
|
-
}
|
|
425
|
-
// Point the SDK at our CLI shim. The shim injects `--tools ""`
|
|
426
|
-
// into argv before invoking the real Letta Code CLI, which
|
|
427
|
-
// mimics the TUI `/toolset none` action — both end up with an
|
|
428
|
-
// empty `toolRegistry` so the LLM sees only the agent's
|
|
429
|
-
// ADE-attached tools (no Read/Write/Bash/etc. from Letta
|
|
430
|
-
// Code's bundled presets). See `lettaCliShim.mjs` for the
|
|
431
|
-
// full rationale + traceability to the Letta Code source.
|
|
432
|
-
//
|
|
433
|
-
// This is set once per spawn (cheap — just a process.env write).
|
|
434
|
-
// We use the migration's source path so the shim is in the
|
|
435
|
-
// same repo and ships with ai-hub-server.
|
|
436
|
-
if (process.env.LETTA_CLI_PATH === undefined) {
|
|
437
|
-
const { dirname, join } = await import("node:path");
|
|
438
|
-
const { fileURLToPath } = await import("node:url");
|
|
439
|
-
const here = dirname(fileURLToPath(import.meta.url));
|
|
440
|
-
process.env.LETTA_CLI_PATH = join(here, "lettaCliShim.mjs");
|
|
441
|
-
}
|
|
442
|
-
// We send the raw user message verbatim; the admin's system prompt
|
|
443
|
-
// flows through Letta's normal channel (the agent's persisted
|
|
444
|
-
// `system` field).
|
|
445
|
-
const userContent = opts.userMessage;
|
|
446
|
-
// Step-12.5 — disallow-list composition.
|
|
447
|
-
//
|
|
448
|
-
// When the parent session has a sandbox folder (opts.cwd set), the
|
|
449
|
-
// filesystem tools are RE-ENABLED so the agent can use the seeded
|
|
450
|
-
// files. Without a sandbox, those tools stay disallowed (today's
|
|
451
|
-
// stateless agent shape; regression-locked by a snapshot test).
|
|
452
|
-
//
|
|
453
|
-
// The always-disallowed group (memory / sub-agent / interactive /
|
|
454
|
-
// web) stays disallowed regardless — the v1 no-memory stance is
|
|
455
|
-
// unchanged. See docs/server/session-sandboxes.md.
|
|
186
|
+
// Step-12.5 — disallow-list composition. With a sandbox folder
|
|
187
|
+
// (opts.cwd set) the filesystem tools are re-enabled so the agent can
|
|
188
|
+
// use the seeded files; without one they stay disallowed.
|
|
456
189
|
const disallowedTools = opts.cwd === undefined
|
|
457
190
|
? [...ALWAYS_DISALLOWED_TOOLS, ...FILESYSTEM_TOOLS]
|
|
458
191
|
: [...ALWAYS_DISALLOWED_TOOLS];
|
|
459
|
-
let
|
|
192
|
+
let handle;
|
|
460
193
|
try {
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
memfsStartup: "skip",
|
|
466
|
-
// `disallowedTools` mirrors the effect of TUI `/toolset none` —
|
|
467
|
-
// the persisted-setting approach (`~/.letta/settings.json`) is
|
|
468
|
-
// only consulted by Letta Code's interactive code path, NOT
|
|
469
|
-
// the headless `--input-format stream-json` mode the SDK uses.
|
|
470
|
-
// And `--toolset none` is rejected as a CLI arg in headless
|
|
471
|
-
// mode (only auto/codex/default/gemini accepted there).
|
|
472
|
-
//
|
|
473
|
-
// Adding tools to this list as Letta Code adds them upstream
|
|
474
|
-
// is maintenance debt — grep `ALWAYS_DISALLOWED_TOOLS` /
|
|
475
|
-
// `FILESYSTEM_TOOLS` to find the constants. The longer-term
|
|
476
|
-
// fix is upstream: either accept `--toolset none` in headless
|
|
477
|
-
// mode or expose a `--no-tools` flag. Filed against
|
|
478
|
-
// letta-ai/letta-code (TBD).
|
|
194
|
+
const tools = await getMcpTools();
|
|
195
|
+
handle = await runtime.streamTurn({
|
|
196
|
+
conversationId: opts.conversationId,
|
|
197
|
+
userMessage: opts.userMessage,
|
|
479
198
|
disallowedTools,
|
|
480
|
-
|
|
199
|
+
...(tools.length > 0 ? { tools } : {}),
|
|
481
200
|
...(opts.cwd !== undefined ? { cwd: opts.cwd } : {}),
|
|
482
201
|
});
|
|
483
|
-
await session.initialize();
|
|
484
|
-
await session.send(userContent);
|
|
485
202
|
}
|
|
486
203
|
catch (err) {
|
|
487
|
-
// Spawn / init / send failure — release lease + tear down the
|
|
488
|
-
// subprocess if we got that far, then re-throw for the caller.
|
|
489
|
-
if (session) {
|
|
490
|
-
try {
|
|
491
|
-
session.close();
|
|
492
|
-
}
|
|
493
|
-
catch {
|
|
494
|
-
// best-effort
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
204
|
lease.release();
|
|
498
205
|
throw err;
|
|
499
206
|
}
|
|
500
|
-
const activeSession = session;
|
|
501
207
|
let closed = false;
|
|
502
208
|
return {
|
|
503
|
-
events:
|
|
209
|
+
events: handle.events,
|
|
504
210
|
async abort() {
|
|
505
|
-
|
|
506
|
-
await activeSession.abort();
|
|
507
|
-
}
|
|
508
|
-
catch {
|
|
509
|
-
// The CLI may already be tearing down — swallow to keep
|
|
510
|
-
// the cancel route idempotent. `close()` still runs.
|
|
511
|
-
}
|
|
211
|
+
await handle.abort();
|
|
512
212
|
},
|
|
513
213
|
close() {
|
|
514
214
|
if (closed)
|
|
515
215
|
return;
|
|
516
216
|
closed = true;
|
|
517
|
-
|
|
518
|
-
activeSession.close();
|
|
519
|
-
}
|
|
520
|
-
catch {
|
|
521
|
-
// best-effort
|
|
522
|
-
}
|
|
217
|
+
handle.close();
|
|
523
218
|
lease.release();
|
|
524
219
|
},
|
|
525
220
|
};
|
package/dist/letta/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/letta/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/letta/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,GAMtB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAGN,MAAM,yBAAyB,CAAC;AAEjC,uEAAuE;AACvE,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAEpF;;;;;;;GAOG;AACH,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IACpB;IAA5B,YAA4B,cAAsB;QAChD,KAAK,CAAC,iCAAiC,cAAc,EAAE,CAAC,CAAC;QAD/B,mBAAc,GAAd,cAAc,CAAQ;QAEhD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,uBAAuB,GAA0B;IACrD,8BAA8B;IAC9B,MAAM;IACN,YAAY;IACZ,UAAU;IACV,YAAY;IACZ,SAAS;IACT,UAAU;IACV,YAAY;IACZ,WAAW;IACX,OAAO;IACP,4BAA4B;IAC5B,OAAO;IACP,8CAA8C;IAC9C,QAAQ;IACR,oBAAoB;IACpB,eAAe;IACf,gBAAgB;IAChB,gBAAgB;IAChB,oDAAoD;IACpD,iBAAiB;IACjB,eAAe;IACf,cAAc;IACd,eAAe;IACf,YAAY;IACZ,UAAU;IACV,WAAW;CACZ,CAAC;AAEF;;;;;GAKG;AACH,MAAM,gBAAgB,GAA0B;IAC9C,MAAM;IACN,OAAO;IACP,MAAM;IACN,YAAY;IACZ,MAAM;IACN,MAAM;IACN,MAAM;IACN,mEAAmE;IACnE,cAAc;IACd,eAAe;IACf,cAAc;IACd,kBAAkB;CACnB,CAAC;AA2IF,8EAA8E;AAC9E,SAAS,qBAAqB;IAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,OAAO,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,IAA2B;IAE3B,MAAM,SAAS,GACb,IAAI,CAAC,SAAS,IAAK,OAAO,CAAC,GAA0C,CAAC;IAExE,MAAM,OAAO,GACX,IAAI,CAAC,OAAO;QACZ,IAAI,iBAAiB,CAAC;YACpB,OAAO,EAAE,SAAS,CAAC,qBAAqB,IAAI,qBAAqB,EAAE;YACnE,QAAQ,EACN,SAAS,CAAC,sBAAsB;gBAChC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,kBAAkB,CAAC;YAC/C,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IAEL;;;;OAIG;IACH,IAAI,eAAe,GAAmC,IAAI,CAAC;IAC3D,SAAS,WAAW;QAClB,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,qBAAqB,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YACpE,eAAe;gBACb,OAAO,CAAC,MAAM,KAAK,CAAC;oBAClB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBACrB,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChE,eAAe,CAAC,KAAK,CAAC,GAAG,EAAE;gBACzB,eAAe,GAAG,IAAI,CAAC;YACzB,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,OAAO;QACL,KAAK,CAAC,aAAa,CAAC,YAAY;YAC9B,OAAO,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAC7C,CAAC;QAED,KAAK,CAAC,kBAAkB,CAAC,YAAY;YACnC,OAAO,OAAO,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;QAClD,CAAC;QAED,KAAK,CAAC,oBAAoB,CAAC,cAAc;YACvC,OAAO,OAAO,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;QACtD,CAAC;QAED,KAAK,CAAC,gBAAgB,CAAC,oBAAoB;YACzC,IAAI,CAAC;gBACH,OAAO,MAAM,OAAO,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;YAC9D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,yBAAyB,EAAE,CAAC;oBAC7C,MAAM,IAAI,uBAAuB,CAAC,oBAAoB,CAAC,CAAC;gBAC1D,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,cAAc;YAC/B,OAAO,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;QAC9C,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,aAAa,EAAE,UAAU;YAC3C,6CAA6C;QAC/C,CAAC;QAED,KAAK,CAAC,kBAAkB,CAAC,eAAe;YACtC,6CAA6C;QAC/C,CAAC;QAED,KAAK,CAAC,iBAAiB,CAAC,IAAI;YAC1B,mEAAmE;YACnE,sDAAsD;YACtD,MAAM,KAAK,GAAkB,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;YAE/D,+DAA+D;YAC/D,sEAAsE;YACtE,0DAA0D;YAC1D,MAAM,eAAe,GACnB,IAAI,CAAC,GAAG,KAAK,SAAS;gBACpB,CAAC,CAAC,CAAC,GAAG,uBAAuB,EAAE,GAAG,gBAAgB,CAAC;gBACnD,CAAC,CAAC,CAAC,GAAG,uBAAuB,CAAC,CAAC;YAEnC,IAAI,MAAkB,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;gBAClC,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;oBAChC,cAAc,EAAE,IAAI,CAAC,cAAc;oBACnC,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,eAAe;oBACf,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACtC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACrD,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,KAAK,CAAC,OAAO,EAAE,CAAC;gBAChB,MAAM,GAAG,CAAC;YACZ,CAAC;YAED,IAAI,MAAM,GAAG,KAAK,CAAC;YACnB,OAAO;gBACL,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,CAAC,KAAK;oBACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;gBACvB,CAAC;gBACD,KAAK;oBACH,IAAI,MAAM;wBAAE,OAAO;oBACnB,MAAM,GAAG,IAAI,CAAC;oBACd,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,CAAC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|