@data-club/ai-hub-server 0.0.8 → 0.0.10

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.
Files changed (83) hide show
  1. package/dist/auth/encryption.d.ts +5 -5
  2. package/dist/auth/encryption.js +5 -5
  3. package/dist/auth/userView.d.ts +8 -15
  4. package/dist/auth/userView.d.ts.map +1 -1
  5. package/dist/auth/userView.js +10 -23
  6. package/dist/auth/userView.js.map +1 -1
  7. package/dist/bootstrap.d.ts +2 -8
  8. package/dist/bootstrap.d.ts.map +1 -1
  9. package/dist/bootstrap.js +2 -35
  10. package/dist/bootstrap.js.map +1 -1
  11. package/dist/db/migrate.js +0 -17
  12. package/dist/db/migrate.js.map +1 -1
  13. package/dist/db/schema.d.ts +0 -263
  14. package/dist/db/schema.d.ts.map +1 -1
  15. package/dist/db/schema.js +0 -57
  16. package/dist/db/schema.js.map +1 -1
  17. package/dist/db/seed.d.ts +4 -19
  18. package/dist/db/seed.d.ts.map +1 -1
  19. package/dist/db/seed.js +6 -33
  20. package/dist/db/seed.js.map +1 -1
  21. package/dist/handlers/fetch.d.ts +6 -7
  22. package/dist/handlers/fetch.d.ts.map +1 -1
  23. package/dist/handlers/fetch.js +0 -2
  24. package/dist/handlers/fetch.js.map +1 -1
  25. package/dist/handlers/types.d.ts +5 -6
  26. package/dist/handlers/types.d.ts.map +1 -1
  27. package/dist/letta/client.d.ts +86 -263
  28. package/dist/letta/client.d.ts.map +1 -1
  29. package/dist/letta/client.js +99 -404
  30. package/dist/letta/client.js.map +1 -1
  31. package/dist/letta/index.d.ts +6 -8
  32. package/dist/letta/index.d.ts.map +1 -1
  33. package/dist/letta/index.js +5 -7
  34. package/dist/letta/index.js.map +1 -1
  35. package/dist/letta/sandbox.d.ts +45 -9
  36. package/dist/letta/sandbox.d.ts.map +1 -1
  37. package/dist/letta/sandbox.js +123 -11
  38. package/dist/letta/sandbox.js.map +1 -1
  39. package/dist/letta/types.d.ts +6 -49
  40. package/dist/letta/types.d.ts.map +1 -1
  41. package/dist/letta/types.js +5 -10
  42. package/dist/letta/types.js.map +1 -1
  43. package/dist/observability/logger.d.ts.map +1 -1
  44. package/dist/observability/logger.js +0 -2
  45. package/dist/observability/logger.js.map +1 -1
  46. package/dist/routes/admin/agents.d.ts.map +1 -1
  47. package/dist/routes/admin/agents.js +0 -40
  48. package/dist/routes/admin/agents.js.map +1 -1
  49. package/dist/routes/admin/settings.d.ts +6 -15
  50. package/dist/routes/admin/settings.d.ts.map +1 -1
  51. package/dist/routes/admin/settings.js +9 -107
  52. package/dist/routes/admin/settings.js.map +1 -1
  53. package/dist/routes/auth.d.ts +0 -4
  54. package/dist/routes/auth.d.ts.map +1 -1
  55. package/dist/routes/auth.js +1 -5
  56. package/dist/routes/auth.js.map +1 -1
  57. package/dist/routes/sessions.d.ts.map +1 -1
  58. package/dist/routes/sessions.js +9 -30
  59. package/dist/routes/sessions.js.map +1 -1
  60. package/dist/state/turnRunner.d.ts.map +1 -1
  61. package/dist/state/turnRunner.js +1 -75
  62. package/dist/state/turnRunner.js.map +1 -1
  63. package/package.json +4 -4
  64. package/src/auth/encryption.ts +5 -5
  65. package/src/auth/userView.ts +9 -22
  66. package/src/bootstrap.ts +4 -43
  67. package/src/db/migrate.ts +0 -17
  68. package/src/db/schema.ts +0 -68
  69. package/src/db/seed.ts +6 -47
  70. package/src/handlers/fetch.ts +6 -9
  71. package/src/handlers/types.ts +5 -6
  72. package/src/letta/client.ts +170 -634
  73. package/src/letta/index.ts +8 -21
  74. package/src/letta/sandbox.ts +151 -11
  75. package/src/letta/types.ts +9 -60
  76. package/src/observability/logger.ts +0 -2
  77. package/src/routes/admin/agents.ts +0 -49
  78. package/src/routes/admin/settings.ts +9 -113
  79. package/src/routes/auth.ts +1 -5
  80. package/src/routes/sessions.ts +11 -32
  81. package/src/state/turnRunner.ts +1 -77
  82. package/src/letta/lettaCliShim.mjs +0 -40
  83. package/src/letta/settingsFileSeed.ts +0 -254
@@ -1 +1 @@
1
- {"version":3,"file":"turnRunner.d.ts","sourceRoot":"","sources":["../../src/state/turnRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAMH,OAAO,KAAK,EACV,UAAU,EAGV,UAAU,EACX,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAA8C,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AASlG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAGzD,sEAAsE;AACtE,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAM3C,gCAAgC;AAChC,MAAM,WAAW,WAAW;IAC1B,sBAAsB;IACtB,EAAE,EAAE,SAAS,CAAC;IACd,oEAAoE;IACpE,WAAW,EAAE,WAAW,CAAC;IACzB,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5C;;;;;OAKG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,mFAAmF;AACnF,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACjD;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CA4VvE;AAuCD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,aAAa,CAAC,UAAU,CAAC,CAa3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,MAAM,GACb,UAAU,GAAG,IAAI,CAenB"}
1
+ {"version":3,"file":"turnRunner.d.ts","sourceRoot":"","sources":["../../src/state/turnRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAMH,OAAO,KAAK,EACV,UAAU,EAGV,UAAU,EACX,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAA8C,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AASlG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAGzD,sEAAsE;AACtE,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAM3C,gCAAgC;AAChC,MAAM,WAAW,WAAW;IAC1B,sBAAsB;IACtB,EAAE,EAAE,SAAS,CAAC;IACd,oEAAoE;IACpE,WAAW,EAAE,WAAW,CAAC;IACzB,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5C;;;;;OAKG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,mFAAmF;AACnF,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACjD;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAgRvE;AAuCD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,aAAa,CAAC,UAAU,CAAC,CAa3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,MAAM,GACb,UAAU,GAAG,IAAI,CAenB"}
@@ -35,7 +35,7 @@
35
35
  */
36
36
  import { randomUUID } from "node:crypto";
37
37
  import { eq, sql } from "drizzle-orm";
38
- import { messageUsage, turn, turnEvent } from "../db/schema.js";
38
+ import { turn, turnEvent } from "../db/schema.js";
39
39
  import { ServerOverloadedError } from "../letta/client.js";
40
40
  import { finalizeAssistantMessage, finalizeTerminal, initialTranslatorState, translateSdkMessage, } from "../letta/eventTranslator.js";
41
41
  import * as metrics from "../observability/metrics.js";
@@ -181,20 +181,8 @@ export async function runTurn(opts) {
181
181
  };
182
182
  cancelController.signal.addEventListener("abort", onCancel, { once: true });
183
183
  // Step 5 — drain the SDK message stream.
184
- // Track the last Letta run id we see — used to fetch usage stats
185
- // after the terminal `result`. The SDK strips Letta message ids
186
- // from its translated payloads, so we re-fetch via REST
187
- // (`getRunUsageStats(runId)`) to get both the usage_statistics
188
- // and the last assistant message id we'll stamp the badge on.
189
- let lastRunId = null;
190
184
  try {
191
185
  for await (const sdkMsg of handle.events) {
192
- // SDKAssistantMessage / SDKReasoningMessage / SDKToolCallMessage
193
- // each carry `runId`. Take the most recent — a multi-step turn
194
- // can have several runs, and we want the latest.
195
- if (sdkMsg.runId) {
196
- lastRunId = sdkMsg.runId;
197
- }
198
186
  if (sdkMsg.type === "result") {
199
187
  // Terminal — finalizeTerminal emits the right closing events
200
188
  // based on success / interrupted / error.
@@ -226,68 +214,6 @@ export async function runTurn(opts) {
226
214
  cancelController.signal.removeEventListener("abort", onCancel);
227
215
  metrics.lettaRequestDurationMs.set(Date.now() - lettaStartedMs);
228
216
  }
229
- // Step 5.5 — usage emission + persistence. Only fire on successful
230
- // termination (cancelled / failed turns may or may not have a
231
- // usable runId, and the badge isn't load-bearing). Best-effort:
232
- // any failure here logs and continues — we already emitted
233
- // stream_end above, so the turn is "done" from the client's POV.
234
- if (lastRunId !== null &&
235
- translatorState.status === "done") {
236
- try {
237
- const usage = await opts.lettaClient.getRunUsageStats(lastRunId);
238
- if (usage && usage.lastAssistantMessageId) {
239
- // Persist for /sessions/{id}/messages history rendering.
240
- opts.db
241
- .insert(messageUsage)
242
- .values({
243
- lettaMessageId: usage.lastAssistantMessageId,
244
- sessionId: opts.sessionId,
245
- promptTokens: usage.promptTokens,
246
- completionTokens: usage.completionTokens,
247
- totalTokens: usage.totalTokens,
248
- cachedInputTokens: usage.cachedInputTokens,
249
- cacheWriteTokens: usage.cacheWriteTokens,
250
- reasoningTokens: usage.reasoningTokens,
251
- contextTokens: usage.contextTokens,
252
- runId: lastRunId,
253
- })
254
- .onConflictDoUpdate({
255
- target: messageUsage.lettaMessageId,
256
- set: {
257
- promptTokens: usage.promptTokens,
258
- completionTokens: usage.completionTokens,
259
- totalTokens: usage.totalTokens,
260
- cachedInputTokens: usage.cachedInputTokens,
261
- cacheWriteTokens: usage.cacheWriteTokens,
262
- reasoningTokens: usage.reasoningTokens,
263
- contextTokens: usage.contextTokens,
264
- runId: lastRunId,
265
- },
266
- })
267
- .run();
268
- // Live wire event — UI can attach the badge immediately
269
- // without waiting for a /messages refetch.
270
- opts.onEvent({
271
- seq: 0, // emit() bypassed here; the stream's already drained.
272
- event: "usage",
273
- data: {
274
- letta_message_id: usage.lastAssistantMessageId,
275
- ...(usage.promptTokens !== null ? { input: usage.promptTokens } : {}),
276
- ...(usage.completionTokens !== null ? { output: usage.completionTokens } : {}),
277
- ...(usage.cachedInputTokens !== null ? { cache_read: usage.cachedInputTokens } : {}),
278
- ...(usage.cacheWriteTokens !== null ? { cache_write: usage.cacheWriteTokens } : {}),
279
- ...(usage.reasoningTokens !== null ? { reasoning: usage.reasoningTokens } : {}),
280
- ...(usage.contextTokens !== null ? { context: usage.contextTokens } : {}),
281
- ...(usage.totalTokens !== null ? { total: usage.totalTokens } : {}),
282
- },
283
- state: { status: "done", phase: null },
284
- });
285
- }
286
- }
287
- catch (err) {
288
- opts.logger.warn({ err, runId: lastRunId }, "usage-stats fetch/persist failed");
289
- }
290
- }
291
217
  publisher.close();
292
218
  opts.onEvent(null);
293
219
  metrics.chatDurationMs.set(Date.now() - startedMs);
@@ -1 +1 @@
1
- {"version":3,"file":"turnRunner.js","sourceRoot":"","sources":["../../src/state/turnRunner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"turnRunner.js","sourceRoot":"","sources":["../../src/state/turnRunner.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@data-club/ai-hub-server",
3
- "version": "0.0.8",
3
+ "version": "0.0.10",
4
4
  "description": "Server package for the data-club ai-hub: Web-Standard Fetch handlers, Letta integration, SSE wire protocol, RBAC, admin endpoints. Mounts into per-customer Next.js wrappers via createNextRouteHandler. See docs/SPECIFICATIONS.md §6.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
@@ -18,8 +18,7 @@
18
18
  "src"
19
19
  ],
20
20
  "dependencies": {
21
- "@data-club/letta-code": "^0.26.2",
22
- "@letta-ai/letta-client": "^1.11.0",
21
+ "@data-club/letta-code": "^0.27.20",
23
22
  "@letta-ai/letta-code-sdk": "0.1.14",
24
23
  "@node-rs/argon2": "^2.0.2",
25
24
  "better-sqlite3": "^11.5.0",
@@ -27,7 +26,8 @@
27
26
  "jose": "^5.9.6",
28
27
  "pino": "^9.5.0",
29
28
  "zod": "^3.23.8",
30
- "@data-club/ai-hub": "0.0.8"
29
+ "@data-club/ai-hub": "0.0.10",
30
+ "@data-club/letta-runtime": "0.0.1"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/better-sqlite3": "^7.6.12",
@@ -1,7 +1,7 @@
1
1
  /**
2
- * AES-256-GCM helpers for encrypting `admin_setting.letta_api_key_encrypted`
3
- * (§6.8). The key (`AI_HUB_ENCRYPTION_KEY`) lives in env only — separating
4
- * the key-encrypting key from the encrypted blob is the entire point.
2
+ * AES-256-GCM helpers for encrypting secrets at rest in the DB (§6.8).
3
+ * The key (`AI_HUB_ENCRYPTION_KEY`) lives in env only — separating the
4
+ * key-encrypting key from the encrypted blob is the entire point.
5
5
  *
6
6
  * Output layout (a single Buffer): `<12-byte IV><16-byte auth tag><ciphertext>`.
7
7
  * Reading code slices the same offsets back out before calling `decipher`.
@@ -32,8 +32,8 @@ const TAG_BYTES = 16;
32
32
  * `IV(12) || tag(16) || ciphertext` as a single Buffer.
33
33
  *
34
34
  * @param key - 32-byte encryption key.
35
- * @param plaintext - utf-8 string (typically the Letta API key).
36
- * @returns the binary blob to store in `admin_setting.letta_api_key_encrypted`.
35
+ * @param plaintext - utf-8 string to encrypt.
36
+ * @returns the binary blob to store in the DB.
37
37
  */
38
38
  export function encryptString(key: Buffer, plaintext: string): Buffer {
39
39
  if (key.length !== KEY_BYTES) {
@@ -2,17 +2,13 @@
2
2
  * Builds the `{ user, deployment }` envelope returned by `/auth/me`,
3
3
  * `/auth/me/preferences`, and embedded in `/auth/login`'s response.
4
4
  *
5
- * Two non-obvious concerns this module owns:
5
+ * The non-obvious concern this module owns:
6
6
  *
7
- * 1. **Per-user vs. per-deployment split.** `user` carries strictly per-user
8
- * fields (id, username, role, theme_preference, …); `deployment` carries
9
- * strictly per-deployment fields (theme_default, theme_switcher_enabled,
10
- * letta_ade_url). The split makes it impossible for a client to confuse
11
- * "this is my preference" with "this is how the deployment is configured."
12
- * 2. **Role-gated `letta_ade_url`.** The URL is only included for callers
13
- * with role `power_user` or higher (§6.3.4). For `user`-role callers it's
14
- * omitted entirely (not set to null) so the React client cannot render
15
- * a link element it shouldn't see.
7
+ * **Per-user vs. per-deployment split.** `user` carries strictly per-user
8
+ * fields (id, username, role, theme_preference, …); `deployment` carries
9
+ * strictly per-deployment fields (theme_default, theme_switcher_enabled, …).
10
+ * The split makes it impossible for a client to confuse "this is my
11
+ * preference" with "this is how the deployment is configured."
16
12
  *
17
13
  * The resolved theme is **not** computed here — the client does the simple
18
14
  * precedence calculation client-side from `user.theme_preference +
@@ -43,21 +39,17 @@ export function buildUserView(row: UserRow): AIHubUser {
43
39
  }
44
40
 
45
41
  /**
46
- * Builds the per-deployment context payload. The `letta_ade_url` field is
47
- * gated by `callerRole >= power_user` (§6.3.4).
42
+ * Builds the per-deployment context payload.
48
43
  *
49
44
  * @param settings - the `admin_setting` singleton row (pass null only when
50
45
  * the row genuinely doesn't exist — first-boot before the seed has run,
51
46
  * which shouldn't happen in practice).
52
- * @param callerRole - role from the JWT's claim, used to gate
53
- * `letta_ade_url`.
54
47
  * @returns the wire-format `AIHubDeployment`.
55
48
  */
56
49
  export function buildDeploymentView(
57
50
  settings: AdminSettingRow | null,
58
- callerRole: UserRow["role"],
59
51
  ): AIHubDeployment {
60
- const out: AIHubDeployment = {
52
+ return {
61
53
  theme_default: settings?.themeDefault ?? "light",
62
54
  theme_switcher_enabled: settings?.themeSwitcherEnabled ?? true,
63
55
  language_default: settings?.languageDefault ?? "en",
@@ -65,11 +57,6 @@ export function buildDeploymentView(
65
57
  default_agent_id: settings?.defaultAgentId ?? null,
66
58
  agent_switcher_enabled: settings?.agentSwitcherEnabled ?? true,
67
59
  };
68
- if (callerRole !== "user") {
69
- const ade = settings?.lettaAdeUrl ?? null;
70
- if (ade) out.letta_ade_url = ade;
71
- }
72
- return out;
73
60
  }
74
61
 
75
62
  /**
@@ -87,6 +74,6 @@ export function buildAuthContext(
87
74
  ): AIHubAuthContext {
88
75
  return {
89
76
  user: buildUserView(row),
90
- deployment: buildDeploymentView(settings, row.role),
77
+ deployment: buildDeploymentView(settings),
91
78
  };
92
79
  }
package/src/bootstrap.ts CHANGED
@@ -46,12 +46,6 @@ export interface EnvConfig {
46
46
  signingKeyFromEnv: Buffer | undefined;
47
47
  /** Bootstrap-only metrics scrape token (env value). */
48
48
  metricsScrapeTokenFromEnv: string | undefined;
49
- /** Letta API key from env. */
50
- lettaApiKey: string | undefined;
51
- /** Letta base URL from env. */
52
- lettaBaseUrl: string | undefined;
53
- /** Letta ADE URL override from env. */
54
- lettaAdeUrl: string | undefined;
55
49
  /** Pino log level. */
56
50
  logLevel: string;
57
51
  /** CORS origins (comma-separated). */
@@ -84,18 +78,6 @@ export function parseEnvConfig(env: EnvLike): EnvConfig {
84
78
  encryptionKey,
85
79
  signingKeyFromEnv: parseSigningKey(env.SERVICE_TOKEN_SIGNING_KEY),
86
80
  metricsScrapeTokenFromEnv: env.METRICS_SCRAPE_TOKEN || undefined,
87
- lettaApiKey: env.LETTA_API_KEY || undefined,
88
- // Letta Code's CLI reads `LETTA_BASE_URL` from process.env and
89
- // appends `/v1/...` to it. Operators who set the env value
90
- // matching the Letta Client SDK's expectation (`http://host/v1`)
91
- // would otherwise get double-v1 URLs in the spawned CLI subprocess.
92
- // Strip the trailing /v1 once at boot so both ai-hub-server's own
93
- // direct API calls (already strip defensively in `letta/client.ts`)
94
- // and Letta Code subprocess spawns see the bare host:port form.
95
- // Mutating process.env here propagates to every later subprocess
96
- // spawn — Letta Code SDK forwards `{...process.env}` verbatim.
97
- lettaBaseUrl: normalizeLettaBaseUrl(env.LETTA_BASE_URL),
98
- lettaAdeUrl: env.LETTA_ADE_URL || undefined,
99
81
  logLevel: env.LOG_LEVEL ?? "info",
100
82
  corsAllowedOrigins: env.CORS_ALLOWED_ORIGINS ?? "",
101
83
  };
@@ -112,24 +94,6 @@ export function parseEnvConfig(env: EnvLike): EnvConfig {
112
94
  * @param raw - the raw env value, if present.
113
95
  * @returns the decoded key, or undefined.
114
96
  */
115
- /**
116
- * Strips a trailing `/v1` from `LETTA_BASE_URL` and writes the cleaned
117
- * value back to `process.env` so subprocess spawns inherit the normalized
118
- * form. Idempotent — bare-host inputs pass through unchanged. Returns
119
- * the normalized value (or `undefined` when the env var is unset).
120
- *
121
- * @param raw - the raw `process.env.LETTA_BASE_URL`, possibly undefined.
122
- * @returns the normalized base URL, or undefined when unset.
123
- */
124
- function normalizeLettaBaseUrl(raw: string | undefined): string | undefined {
125
- if (!raw) return undefined;
126
- const stripped = raw.replace(/\/v1\/?$/i, "");
127
- if (stripped !== raw) {
128
- process.env.LETTA_BASE_URL = stripped;
129
- }
130
- return stripped;
131
- }
132
-
133
97
  function parseSigningKey(raw: string | undefined): Buffer | undefined {
134
98
  if (!raw) return undefined;
135
99
  const trimmed = raw.trim();
@@ -187,8 +151,8 @@ export interface BootServerOptions {
187
151
  databaseUrl?: string;
188
152
  /**
189
153
  * Override the Letta client (§6.4). Tests pass a mock so the server
190
- * never reaches a real Letta. Production omits this — the default reads
191
- * `admin_setting.letta_base_url` + decrypted API key on each use.
154
+ * never reaches a real Letta Code runtime. Production omits this — the
155
+ * default drives Letta Code's server-less local backend.
192
156
  */
193
157
  lettaClient?: LettaClient;
194
158
  }
@@ -221,9 +185,6 @@ export async function bootServer(
221
185
  encryptionKey: config.encryptionKey,
222
186
  signingKeyFromEnv: config.signingKeyFromEnv,
223
187
  metricsScrapeTokenFromEnv: config.metricsScrapeTokenFromEnv,
224
- lettaApiKey: config.lettaApiKey,
225
- lettaBaseUrl: config.lettaBaseUrl,
226
- lettaAdeUrl: config.lettaAdeUrl,
227
188
  },
228
189
  logger,
229
190
  );
@@ -236,8 +197,8 @@ export async function bootServer(
236
197
  // Pass the booted env through as the runtime fallback source. Tests
237
198
  // synthesize an env record; production uses process.env (the default
238
199
  // inside createFetchHandler). Threading it explicitly here means
239
- // bootTestServer's `env:` parameter actually reaches resolveApiKey
240
- // in letta/client.ts.
200
+ // bootTestServer's `env:` parameter actually reaches the runtime
201
+ // env consumers (letta/client.ts config, resolveFilesDir).
241
202
  envSource: env,
242
203
  ...(opts.lettaClient !== undefined ? { lettaClient: opts.lettaClient } : {}),
243
204
  });
package/src/db/migrate.ts CHANGED
@@ -145,9 +145,6 @@ const MIGRATIONS: ReadonlyArray<Migration> = [
145
145
 
146
146
  CREATE TABLE admin_setting (
147
147
  id INTEGER NOT NULL PRIMARY KEY,
148
- letta_api_key_encrypted BLOB,
149
- letta_base_url TEXT,
150
- letta_ade_url TEXT,
151
148
  feature_toggles TEXT NOT NULL DEFAULT '{}',
152
149
  theme_switcher_enabled INTEGER NOT NULL DEFAULT 1,
153
150
  theme_default TEXT NOT NULL DEFAULT 'light',
@@ -169,20 +166,6 @@ const MIGRATIONS: ReadonlyArray<Migration> = [
169
166
  CHECK (system_override IS NOT NULL OR user_override IS NOT NULL)
170
167
  );
171
168
 
172
- CREATE TABLE message_usage (
173
- letta_message_id TEXT NOT NULL PRIMARY KEY,
174
- session_id TEXT NOT NULL REFERENCES session(id) ON DELETE CASCADE,
175
- prompt_tokens INTEGER,
176
- completion_tokens INTEGER,
177
- total_tokens INTEGER,
178
- cached_input_tokens INTEGER,
179
- cache_write_tokens INTEGER,
180
- reasoning_tokens INTEGER,
181
- context_tokens INTEGER,
182
- run_id TEXT,
183
- created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
184
- );
185
- CREATE INDEX message_usage_session_idx ON message_usage(session_id);
186
169
  `,
187
170
  },
188
171
  {
package/src/db/schema.ts CHANGED
@@ -427,12 +427,6 @@ export const turnEvent = sqliteTable(
427
427
  export const adminSetting = sqliteTable("admin_setting", {
428
428
  /** Always 1 — singleton row. */
429
429
  id: integer("id").notNull().primaryKey(),
430
- /** AES-256 encrypted Letta API key. Encrypted under env `AI_HUB_ENCRYPTION_KEY`. */
431
- lettaApiKeyEncrypted: blob("letta_api_key_encrypted", { mode: "buffer" }),
432
- /** Letta server base URL (e.g. `http://localhost:8283/v1`). */
433
- lettaBaseUrl: text("letta_base_url"),
434
- /** Optional super-admin override for the "Open Letta ADE" link target (§6.3.4). */
435
- lettaAdeUrl: text("letta_ade_url"),
436
430
  /** Flat JSON blob of UI feature toggles per §8.4. Defaults to `{}`. */
437
431
  featureToggles: text("feature_toggles", { mode: "json" }).notNull().default("{}"),
438
432
  /** When false, the deployment is single-theme (§7.6). */
@@ -615,68 +609,6 @@ export type MessageOverrideRow = typeof messageOverride.$inferSelect;
615
609
  /** Insert shape for the `message_override` table. */
616
610
  export type MessageOverrideInsert = typeof messageOverride.$inferInsert;
617
611
 
618
- /* ────────────────────────────────────────────────────────────────────────── */
619
- /* message_usage */
620
- /* ────────────────────────────────────────────────────────────────────────── */
621
-
622
- /**
623
- * Provider-reported per-turn token usage, stamped on the LAST assistant
624
- * message of each turn. Surfaced to the chat UI via a hover badge so
625
- * users can see (a) total tokens consumed and (b) prompt-cache
626
- * hit/miss split (Anthropic + OpenAI + Gemini all report
627
- * `cached_input_tokens`; Anthropic also reports `cache_write_tokens`).
628
- *
629
- * The runner fetches Letta's `GET /v1/runs/{run_id}/messages` after
630
- * the turn ends, finds the `usage_statistics`-typed message, and
631
- * inserts one row here keyed by the last assistant message's Letta id.
632
- *
633
- * @see SPECIFICATIONS.md §9 — `usage` SSE event
634
- * @see docs/server/chat-sse.md — wire protocol
635
- */
636
- export const messageUsage = sqliteTable(
637
- "message_usage",
638
- {
639
- /**
640
- * Letta message id this usage belongs to — typically the LAST
641
- * assistant message of the turn that produced it.
642
- */
643
- lettaMessageId: text("letta_message_id").notNull().primaryKey(),
644
- /** Owning session; cascade-deletes when the session is hard-deleted. */
645
- sessionId: text("session_id")
646
- .notNull()
647
- .references(() => session.id, { onDelete: "cascade" }),
648
- /** Total non-cached prompt tokens (input). */
649
- promptTokens: integer("prompt_tokens"),
650
- /** Completion tokens (output). */
651
- completionTokens: integer("completion_tokens"),
652
- /** Sum reported by the provider — may differ from prompt+completion when reasoning is counted separately. */
653
- totalTokens: integer("total_tokens"),
654
- /** Prompt-cache HIT tokens. Anthropic / OpenAI / Gemini all report. */
655
- cachedInputTokens: integer("cached_input_tokens"),
656
- /** Prompt-cache WRITE tokens. Anthropic only — null elsewhere. */
657
- cacheWriteTokens: integer("cache_write_tokens"),
658
- /** Reasoning/thinking tokens. Anthropic + OpenAI o-series. */
659
- reasoningTokens: integer("reasoning_tokens"),
660
- /** Rolling context-window size estimate post-turn (Letta-side). */
661
- contextTokens: integer("context_tokens"),
662
- /** Optional Letta run id for traceback. */
663
- runId: text("run_id"),
664
- /** Stamped at insert time. */
665
- createdAt: text("created_at")
666
- .notNull()
667
- .default(sql`(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))`),
668
- },
669
- (t) => ({
670
- /** Per-session lookups when rendering /sessions/{id}/messages. */
671
- sessionIdx: index("message_usage_session_idx").on(t.sessionId),
672
- }),
673
- );
674
-
675
- /** Row shape for the `message_usage` table. */
676
- export type MessageUsageRow = typeof messageUsage.$inferSelect;
677
- /** Insert shape for the `message_usage` table. */
678
- export type MessageUsageInsert = typeof messageUsage.$inferInsert;
679
-
680
612
  /* ────────────────────────────────────────────────────────────────────────── */
681
613
  /* rotating_message */
682
614
  /* ────────────────────────────────────────────────────────────────────────── */
package/src/db/seed.ts CHANGED
@@ -13,11 +13,10 @@
13
13
  * `admin_setting` row doesn't exist, create it with theme defaults
14
14
  * (`theme_switcher_enabled = true`, `theme_default = "light"` per §7.6),
15
15
  * seed `service_token_signing_key` from env `SERVICE_TOKEN_SIGNING_KEY`
16
- * if set else random, seed `metrics_scrape_token` from env
17
- * `METRICS_SCRAPE_TOKEN` if set else random, encrypt and store the env
18
- * `LETTA_API_KEY`, and write `letta_base_url` / `letta_ade_url`. After
19
- * first boot the env vars for the signing key + metrics token are no
20
- * longer consulted — DB columns are authoritative.
16
+ * if set else random, and seed `metrics_scrape_token` from env
17
+ * `METRICS_SCRAPE_TOKEN` if set else random. After first boot the env
18
+ * vars for the signing key + metrics token are no longer consulted —
19
+ * DB columns are authoritative.
21
20
  *
22
21
  * Both run inside a single SQLite transaction so a partial failure can't
23
22
  * leave a half-seeded DB. Idempotency is enforced by the row-existence
@@ -64,20 +63,6 @@ export interface SeedInputs {
64
63
  signingKeyFromEnv?: Buffer | undefined;
65
64
  /** Optional bootstrap-only metrics token. Random when undefined (§6.10). */
66
65
  metricsScrapeTokenFromEnv?: string | undefined;
67
- /**
68
- * @deprecated Kept on the interface so existing callers compile, but
69
- * **no longer seeded into the DB**. The Letta API key is read at runtime
70
- * from `admin_setting.letta_api_key_encrypted` with a fallback to
71
- * `env.LETTA_API_KEY` when the column is empty/whitespace
72
- * (`letta/client.ts:getSdk`). Letting env stay authoritative until a
73
- * super-admin overrides it via the admin panel is the precedence
74
- * documented in env-vars.md. v2 will drop this field.
75
- */
76
- lettaApiKey?: string | undefined;
77
- /** Required — Letta base URL written into the row. */
78
- lettaBaseUrl?: string | undefined;
79
- /** Optional super-admin override for the ADE link target. */
80
- lettaAdeUrl?: string | undefined;
81
66
  }
82
67
 
83
68
  /**
@@ -122,8 +107,8 @@ export async function runFirstBootSeed(
122
107
  randomMetricsScrapeToken: null,
123
108
  };
124
109
 
125
- // Compute the password hash + encryption outside the transaction (Argon2
126
- // is async; better-sqlite3 transactions are sync).
110
+ // Compute the password hash outside the transaction (Argon2 is async;
111
+ // better-sqlite3 transactions are sync).
127
112
  const userCount = handle.raw
128
113
  .prepare("SELECT COUNT(*) as c FROM user")
129
114
  .get() as { c: number };
@@ -155,22 +140,8 @@ export async function runFirstBootSeed(
155
140
  metricsToken = randomBytes(32).toString("hex");
156
141
  report.randomMetricsScrapeToken = metricsToken;
157
142
  }
158
- // **Deliberately left NULL.** `LETTA_API_KEY` is consulted at runtime
159
- // as a fallback when this column is empty or whitespace (see
160
- // `letta/client.ts:getSdk`). Seeding it into the DB on first boot would
161
- // freeze the env value into the admin_setting row, after which
162
- // changing `.env` + restart would silently have no effect — that was
163
- // the rotation footgun before 2026-05. Leaving the column NULL by
164
- // default means env stays authoritative until a super-admin explicitly
165
- // PATCHes a value via /admin/settings; clearing the value there falls
166
- // back to env again. See docs/operations/env-vars.md for the full
167
- // precedence model.
168
- const lettaApiKeyEncrypted: Buffer | null = null;
169
143
  adminInsert = {
170
144
  id: 1,
171
- lettaApiKeyEncrypted,
172
- lettaBaseUrl: inputs.lettaBaseUrl ?? null,
173
- lettaAdeUrl: inputs.lettaAdeUrl ?? deriveLettaAdeUrl(inputs.lettaBaseUrl),
174
145
  featureToggles: {},
175
146
  themeSwitcherEnabled: true,
176
147
  themeDefault: "light",
@@ -222,15 +193,3 @@ export async function runFirstBootSeed(
222
193
 
223
194
  return report;
224
195
  }
225
-
226
- /**
227
- * Derives `letta_ade_url` from `letta_base_url` by stripping a trailing
228
- * `/v1` per §12.1. Returns `null` if the base url is itself null.
229
- *
230
- * @param baseUrl - the configured Letta base URL.
231
- * @returns the ADE URL or `null`.
232
- */
233
- function deriveLettaAdeUrl(baseUrl: string | undefined): string | null {
234
- if (!baseUrl) return null;
235
- return baseUrl.replace(/\/v1\/?$/, "");
236
- }
@@ -67,9 +67,8 @@ export interface CreateFetchHandlerOptions {
67
67
  routes?: ReadonlyArray<RouteEntry>;
68
68
  /**
69
69
  * Project-shaped Letta client. Tests pass a mock so they never call
70
- * out to a real Letta. When omitted, the default reads
71
- * `admin_setting.letta_base_url` + decrypted API key on each use and
72
- * memoizes one SDK instance per `(apiKey, baseURL)` pair.
70
+ * out to a real Letta Code runtime. When omitted, the default drives
71
+ * Letta Code's server-less local backend.
73
72
  *
74
73
  * @see SPECIFICATIONS.md §6.4
75
74
  */
@@ -85,10 +84,10 @@ export interface CreateFetchHandlerOptions {
85
84
  */
86
85
  subprocessThrottle?: SubprocessThrottle;
87
86
  /**
88
- * Env-var source for runtime fallbacks (currently: the Letta API key
89
- * when the DB column is empty see `letta/client.ts:resolveApiKey`).
90
- * Defaults to `process.env`. Tests pass the synthesized record they
91
- * boot with so the env-fallback behavior is exercisable.
87
+ * Env-var source for runtime config (Letta Code CLI path, store dir,
88
+ * MCP servers, files dir). Defaults to `process.env`. Tests pass the
89
+ * synthesized record they boot with so env-dependent behavior is
90
+ * exercisable.
92
91
  */
93
92
  envSource?: Record<string, string | undefined>;
94
93
  }
@@ -125,8 +124,6 @@ export function createFetchHandler(
125
124
  lettaClient:
126
125
  opts.lettaClient ??
127
126
  createDefaultLettaClient({
128
- db: opts.db,
129
- encryptionKey: opts.encryptionKey,
130
127
  subprocessThrottle,
131
128
  envSource,
132
129
  }),
@@ -53,12 +53,11 @@ export interface AIHubServerContext {
53
53
  */
54
54
  subprocessThrottle: SubprocessThrottle;
55
55
  /**
56
- * Env-var record used as the fallback source for the Letta API key when
57
- * the `admin_setting.letta_api_key_encrypted` column is empty (see
58
- * `letta/client.ts:resolveApiKey` for the precedence). Production passes
59
- * `process.env`; tests pass the synthesized record they boot with so
60
- * the fallback behavior is exercisable without touching the real
61
- * environment.
56
+ * Env-var record used as the runtime env source (Letta Code CLI path,
57
+ * store dir, MCP server config — see `letta/client.ts` plus
58
+ * `resolveFilesDir`). Production passes `process.env`; tests pass the
59
+ * synthesized record they boot with so env-dependent behavior is
60
+ * exercisable without touching the real environment.
62
61
  */
63
62
  envSource: Record<string, string | undefined>;
64
63
  /**