@data-club/ai-hub-server 0.0.1

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 (248) hide show
  1. package/dist/auth/argon2.d.ts +72 -0
  2. package/dist/auth/argon2.d.ts.map +1 -0
  3. package/dist/auth/argon2.js +145 -0
  4. package/dist/auth/argon2.js.map +1 -0
  5. package/dist/auth/encryption.d.ts +52 -0
  6. package/dist/auth/encryption.d.ts.map +1 -0
  7. package/dist/auth/encryption.js +98 -0
  8. package/dist/auth/encryption.js.map +1 -0
  9. package/dist/auth/jwt.d.ts +133 -0
  10. package/dist/auth/jwt.d.ts.map +1 -0
  11. package/dist/auth/jwt.js +147 -0
  12. package/dist/auth/jwt.js.map +1 -0
  13. package/dist/auth/middleware.d.ts +101 -0
  14. package/dist/auth/middleware.d.ts.map +1 -0
  15. package/dist/auth/middleware.js +161 -0
  16. package/dist/auth/middleware.js.map +1 -0
  17. package/dist/auth/passwordPolicy.d.ts +72 -0
  18. package/dist/auth/passwordPolicy.d.ts.map +1 -0
  19. package/dist/auth/passwordPolicy.js +88 -0
  20. package/dist/auth/passwordPolicy.js.map +1 -0
  21. package/dist/auth/roleRules.d.ts +200 -0
  22. package/dist/auth/roleRules.d.ts.map +1 -0
  23. package/dist/auth/roleRules.js +365 -0
  24. package/dist/auth/roleRules.js.map +1 -0
  25. package/dist/auth/userView.d.ts +55 -0
  26. package/dist/auth/userView.d.ts.map +1 -0
  27. package/dist/auth/userView.js +77 -0
  28. package/dist/auth/userView.js.map +1 -0
  29. package/dist/bootstrap.d.ts +104 -0
  30. package/dist/bootstrap.d.ts.map +1 -0
  31. package/dist/bootstrap.js +160 -0
  32. package/dist/bootstrap.js.map +1 -0
  33. package/dist/db/connection.d.ts +39 -0
  34. package/dist/db/connection.d.ts.map +1 -0
  35. package/dist/db/connection.js +62 -0
  36. package/dist/db/connection.js.map +1 -0
  37. package/dist/db/migrate.d.ts +31 -0
  38. package/dist/db/migrate.d.ts.map +1 -0
  39. package/dist/db/migrate.js +197 -0
  40. package/dist/db/migrate.js.map +1 -0
  41. package/dist/db/schema.d.ts +1902 -0
  42. package/dist/db/schema.d.ts.map +1 -0
  43. package/dist/db/schema.js +662 -0
  44. package/dist/db/schema.js.map +1 -0
  45. package/dist/db/seed.d.ts +92 -0
  46. package/dist/db/seed.d.ts.map +1 -0
  47. package/dist/db/seed.js +160 -0
  48. package/dist/db/seed.js.map +1 -0
  49. package/dist/handlers/fetch.d.ts +89 -0
  50. package/dist/handlers/fetch.d.ts.map +1 -0
  51. package/dist/handlers/fetch.js +173 -0
  52. package/dist/handlers/fetch.js.map +1 -0
  53. package/dist/handlers/nextjs.d.ts +40 -0
  54. package/dist/handlers/nextjs.d.ts.map +1 -0
  55. package/dist/handlers/nextjs.js +42 -0
  56. package/dist/handlers/nextjs.js.map +1 -0
  57. package/dist/handlers/responses.d.ts +46 -0
  58. package/dist/handlers/responses.d.ts.map +1 -0
  59. package/dist/handlers/responses.js +74 -0
  60. package/dist/handlers/responses.js.map +1 -0
  61. package/dist/handlers/routeTable.d.ts +21 -0
  62. package/dist/handlers/routeTable.d.ts.map +1 -0
  63. package/dist/handlers/routeTable.js +133 -0
  64. package/dist/handlers/routeTable.js.map +1 -0
  65. package/dist/handlers/router.d.ts +37 -0
  66. package/dist/handlers/router.d.ts.map +1 -0
  67. package/dist/handlers/router.js +82 -0
  68. package/dist/handlers/router.js.map +1 -0
  69. package/dist/handlers/sse.d.ts +38 -0
  70. package/dist/handlers/sse.d.ts.map +1 -0
  71. package/dist/handlers/sse.js +52 -0
  72. package/dist/handlers/sse.js.map +1 -0
  73. package/dist/handlers/types.d.ts +96 -0
  74. package/dist/handlers/types.d.ts.map +1 -0
  75. package/dist/handlers/types.js +14 -0
  76. package/dist/handlers/types.js.map +1 -0
  77. package/dist/index.d.ts +25 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +24 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/letta/client.d.ts +355 -0
  82. package/dist/letta/client.d.ts.map +1 -0
  83. package/dist/letta/client.js +529 -0
  84. package/dist/letta/client.js.map +1 -0
  85. package/dist/letta/eventTranslator.d.ts +166 -0
  86. package/dist/letta/eventTranslator.d.ts.map +1 -0
  87. package/dist/letta/eventTranslator.js +532 -0
  88. package/dist/letta/eventTranslator.js.map +1 -0
  89. package/dist/letta/index.d.ts +13 -0
  90. package/dist/letta/index.d.ts.map +1 -0
  91. package/dist/letta/index.js +12 -0
  92. package/dist/letta/index.js.map +1 -0
  93. package/dist/letta/modelSettings.d.ts +176 -0
  94. package/dist/letta/modelSettings.d.ts.map +1 -0
  95. package/dist/letta/modelSettings.js +314 -0
  96. package/dist/letta/modelSettings.js.map +1 -0
  97. package/dist/letta/promptWrapping.d.ts +141 -0
  98. package/dist/letta/promptWrapping.d.ts.map +1 -0
  99. package/dist/letta/promptWrapping.js +213 -0
  100. package/dist/letta/promptWrapping.js.map +1 -0
  101. package/dist/letta/sandbox.d.ts +100 -0
  102. package/dist/letta/sandbox.d.ts.map +1 -0
  103. package/dist/letta/sandbox.js +151 -0
  104. package/dist/letta/sandbox.js.map +1 -0
  105. package/dist/letta/settingsFileSeed.d.ts +146 -0
  106. package/dist/letta/settingsFileSeed.d.ts.map +1 -0
  107. package/dist/letta/settingsFileSeed.js +177 -0
  108. package/dist/letta/settingsFileSeed.js.map +1 -0
  109. package/dist/letta/subprocessThrottle.d.ts +151 -0
  110. package/dist/letta/subprocessThrottle.d.ts.map +1 -0
  111. package/dist/letta/subprocessThrottle.js +195 -0
  112. package/dist/letta/subprocessThrottle.js.map +1 -0
  113. package/dist/letta/tpmRecovery.d.ts +202 -0
  114. package/dist/letta/tpmRecovery.d.ts.map +1 -0
  115. package/dist/letta/tpmRecovery.js +314 -0
  116. package/dist/letta/tpmRecovery.js.map +1 -0
  117. package/dist/letta/types.d.ts +54 -0
  118. package/dist/letta/types.d.ts.map +1 -0
  119. package/dist/letta/types.js +16 -0
  120. package/dist/letta/types.js.map +1 -0
  121. package/dist/observability/logger.d.ts +48 -0
  122. package/dist/observability/logger.d.ts.map +1 -0
  123. package/dist/observability/logger.js +81 -0
  124. package/dist/observability/logger.js.map +1 -0
  125. package/dist/observability/metrics.d.ts +53 -0
  126. package/dist/observability/metrics.d.ts.map +1 -0
  127. package/dist/observability/metrics.js +92 -0
  128. package/dist/observability/metrics.js.map +1 -0
  129. package/dist/routes/admin/agents.d.ts +63 -0
  130. package/dist/routes/admin/agents.d.ts.map +1 -0
  131. package/dist/routes/admin/agents.js +461 -0
  132. package/dist/routes/admin/agents.js.map +1 -0
  133. package/dist/routes/admin/rotatingMessages.d.ts +51 -0
  134. package/dist/routes/admin/rotatingMessages.d.ts.map +1 -0
  135. package/dist/routes/admin/rotatingMessages.js +292 -0
  136. package/dist/routes/admin/rotatingMessages.js.map +1 -0
  137. package/dist/routes/admin/sessions.d.ts +61 -0
  138. package/dist/routes/admin/sessions.d.ts.map +1 -0
  139. package/dist/routes/admin/sessions.js +232 -0
  140. package/dist/routes/admin/sessions.js.map +1 -0
  141. package/dist/routes/admin/settings.d.ts +110 -0
  142. package/dist/routes/admin/settings.d.ts.map +1 -0
  143. package/dist/routes/admin/settings.js +401 -0
  144. package/dist/routes/admin/settings.js.map +1 -0
  145. package/dist/routes/admin/users.d.ts +115 -0
  146. package/dist/routes/admin/users.d.ts.map +1 -0
  147. package/dist/routes/admin/users.js +374 -0
  148. package/dist/routes/admin/users.js.map +1 -0
  149. package/dist/routes/agents.d.ts +30 -0
  150. package/dist/routes/agents.d.ts.map +1 -0
  151. package/dist/routes/agents.js +55 -0
  152. package/dist/routes/agents.js.map +1 -0
  153. package/dist/routes/auth.d.ts +121 -0
  154. package/dist/routes/auth.d.ts.map +1 -0
  155. package/dist/routes/auth.js +422 -0
  156. package/dist/routes/auth.js.map +1 -0
  157. package/dist/routes/chat.d.ts +97 -0
  158. package/dist/routes/chat.d.ts.map +1 -0
  159. package/dist/routes/chat.js +484 -0
  160. package/dist/routes/chat.js.map +1 -0
  161. package/dist/routes/featureToggles.d.ts +34 -0
  162. package/dist/routes/featureToggles.d.ts.map +1 -0
  163. package/dist/routes/featureToggles.js +47 -0
  164. package/dist/routes/featureToggles.js.map +1 -0
  165. package/dist/routes/health.d.ts +24 -0
  166. package/dist/routes/health.d.ts.map +1 -0
  167. package/dist/routes/health.js +37 -0
  168. package/dist/routes/health.js.map +1 -0
  169. package/dist/routes/metrics.d.ts +35 -0
  170. package/dist/routes/metrics.d.ts.map +1 -0
  171. package/dist/routes/metrics.js +106 -0
  172. package/dist/routes/metrics.js.map +1 -0
  173. package/dist/routes/sessions.d.ts +161 -0
  174. package/dist/routes/sessions.d.ts.map +1 -0
  175. package/dist/routes/sessions.js +1501 -0
  176. package/dist/routes/sessions.js.map +1 -0
  177. package/dist/routes/stubs.d.ts +25 -0
  178. package/dist/routes/stubs.d.ts.map +1 -0
  179. package/dist/routes/stubs.js +25 -0
  180. package/dist/routes/stubs.js.map +1 -0
  181. package/dist/state/cron.d.ts +58 -0
  182. package/dist/state/cron.d.ts.map +1 -0
  183. package/dist/state/cron.js +160 -0
  184. package/dist/state/cron.js.map +1 -0
  185. package/dist/state/rotationRunner.d.ts +96 -0
  186. package/dist/state/rotationRunner.d.ts.map +1 -0
  187. package/dist/state/rotationRunner.js +246 -0
  188. package/dist/state/rotationRunner.js.map +1 -0
  189. package/dist/state/rotationScheduler.d.ts +76 -0
  190. package/dist/state/rotationScheduler.d.ts.map +1 -0
  191. package/dist/state/rotationScheduler.js +124 -0
  192. package/dist/state/rotationScheduler.js.map +1 -0
  193. package/dist/state/turnRegistry.d.ts +95 -0
  194. package/dist/state/turnRegistry.d.ts.map +1 -0
  195. package/dist/state/turnRegistry.js +149 -0
  196. package/dist/state/turnRegistry.js.map +1 -0
  197. package/dist/state/turnRunner.d.ts +134 -0
  198. package/dist/state/turnRunner.d.ts.map +1 -0
  199. package/dist/state/turnRunner.js +476 -0
  200. package/dist/state/turnRunner.js.map +1 -0
  201. package/package.json +47 -0
  202. package/src/auth/argon2.ts +152 -0
  203. package/src/auth/encryption.ts +110 -0
  204. package/src/auth/jwt.ts +217 -0
  205. package/src/auth/middleware.ts +250 -0
  206. package/src/auth/passwordPolicy.ts +99 -0
  207. package/src/auth/roleRules.ts +497 -0
  208. package/src/auth/userView.ts +88 -0
  209. package/src/bootstrap.ts +254 -0
  210. package/src/db/connection.ts +75 -0
  211. package/src/db/migrate.ts +212 -0
  212. package/src/db/schema.ts +750 -0
  213. package/src/db/seed.ts +236 -0
  214. package/src/handlers/fetch.ts +251 -0
  215. package/src/handlers/nextjs.ts +49 -0
  216. package/src/handlers/responses.ts +95 -0
  217. package/src/handlers/routeTable.ts +188 -0
  218. package/src/handlers/router.ts +96 -0
  219. package/src/handlers/sse.ts +55 -0
  220. package/src/handlers/types.ts +104 -0
  221. package/src/index.ts +60 -0
  222. package/src/letta/client.ts +860 -0
  223. package/src/letta/eventTranslator.ts +667 -0
  224. package/src/letta/index.ts +46 -0
  225. package/src/letta/lettaCliShim.mjs +40 -0
  226. package/src/letta/sandbox.ts +167 -0
  227. package/src/letta/settingsFileSeed.ts +254 -0
  228. package/src/letta/subprocessThrottle.ts +251 -0
  229. package/src/letta/types.ts +65 -0
  230. package/src/observability/logger.ts +103 -0
  231. package/src/observability/metrics.ts +114 -0
  232. package/src/routes/admin/agents.ts +574 -0
  233. package/src/routes/admin/rotatingMessages.ts +351 -0
  234. package/src/routes/admin/sessions.ts +283 -0
  235. package/src/routes/admin/settings.ts +463 -0
  236. package/src/routes/admin/users.ts +455 -0
  237. package/src/routes/agents.ts +66 -0
  238. package/src/routes/auth.ts +513 -0
  239. package/src/routes/chat.ts +534 -0
  240. package/src/routes/featureToggles.ts +52 -0
  241. package/src/routes/health.ts +44 -0
  242. package/src/routes/metrics.ts +111 -0
  243. package/src/routes/sessions.ts +1878 -0
  244. package/src/state/cron.ts +179 -0
  245. package/src/state/rotationRunner.ts +326 -0
  246. package/src/state/rotationScheduler.ts +164 -0
  247. package/src/state/turnRegistry.ts +210 -0
  248. package/src/state/turnRunner.ts +588 -0
@@ -0,0 +1,532 @@
1
+ /**
2
+ * Pure function: Letta Code SDK message → ai-hub SSE events (§9).
3
+ *
4
+ * Input type: `SDKMessage` (Letta Code SDK's stdin/stdout JSON wire
5
+ * shape). Output type: ai-hub's stable SSE events from §9.
6
+ *
7
+ * The translator has **no I/O** — it takes one `SDKMessage` and the
8
+ * current translation state (running text length, open tool-call ids)
9
+ * and returns zero or more ai-hub event payloads + the next state.
10
+ * Persistence, `seq` assignment, and SSE writing are the caller's
11
+ * responsibility (see `state/turnRunner.ts`).
12
+ *
13
+ * ## SDK message variants we handle
14
+ *
15
+ * - `assistant` — streaming chunk of assistant text. Same `uuid` across
16
+ * chunks of one logical assistant message; different `uuid` signals a
17
+ * new logical step (multi-step turn). Emits `assistant_delta`.
18
+ * - `reasoning` — same as `assistant` but for the reasoning channel.
19
+ * Emits `reasoning_delta`. Phase → `model_reasoning`.
20
+ * - `tool_call` — incremental tool-call event. Same `toolCallId` across
21
+ * chunks; `rawArguments` carries one chunk of the partial JSON
22
+ * arguments. First sighting emits `tool_call_started`; subsequent
23
+ * sightings (or first sighting with a non-empty `rawArguments`) emit
24
+ * `tool_call_input_delta`. Phase → `model_tool_input`.
25
+ * - `tool_result` — one event per call. Emits `tool_call_dispatched`
26
+ * (if not already emitted for this id, with the assembled JSON input)
27
+ * then `tool_call_result` (success or error variant).
28
+ * - `result` — terminal. `success: true` → `assistant_message_complete`
29
+ * followed by `stream_end {done}`. `success: false` with
30
+ * `errorCode: "interrupted"` → `stream_end {cancelled}`. Any other
31
+ * failure → `error` + `stream_end {error}`.
32
+ * - `error` — non-terminal error inside the stream (rare; Letta Code
33
+ * surfaces most errors through the terminal `result` event). Emits
34
+ * `error` and does NOT change phase — the runner decides whether the
35
+ * turn fails based on subsequent events.
36
+ * - `retry` — Letta Code's internal retry notice (its own TPM
37
+ * recovery). We drop it; users don't need to see it in v1.x.
38
+ * - `init` — never appears on `stream()`; it's the return of
39
+ * `session.initialize()`. We don't process it here.
40
+ * - `stream_event` — only emitted when `--include-partial-messages` is
41
+ * set on the CLI. We don't enable that flag.
42
+ *
43
+ * @see SPECIFICATIONS.md §9 — wire protocol
44
+ * @see SPECIFICATIONS.md §10 — state machine
45
+ */
46
+ /** Builds the per-turn initial state. */
47
+ export function initialTranslatorState() {
48
+ return {
49
+ status: "running",
50
+ phase: "model_text",
51
+ assistantText: "",
52
+ reasoningText: "",
53
+ openToolCalls: new Set(),
54
+ toolCallArguments: new Map(),
55
+ dispatchedToolCalls: new Set(),
56
+ assistantMessageUuid: null,
57
+ };
58
+ }
59
+ /* ────────────────────────────────────────────────────────────────────────── */
60
+ /* Entry point */
61
+ /* ────────────────────────────────────────────────────────────────────────── */
62
+ /**
63
+ * Translates one SDK message into zero-or-more ai-hub events.
64
+ *
65
+ * Pure: no I/O, no module state, no clocks (the caller stamps
66
+ * timestamps).
67
+ *
68
+ * @param msg - the Letta Code SDK message.
69
+ * @param state - the translator state.
70
+ * @returns the events to emit + the next state.
71
+ */
72
+ export function translateSdkMessage(msg, state) {
73
+ // Mid-stream step-boundary detection. A turn that runs in multiple
74
+ // steps (reasoning + tool + assistant text, then reasoning + tool +
75
+ // assistant text again …) produces multiple logical assistant
76
+ // messages within one streaming response. The boundary fires when
77
+ // we've already accumulated assistant text and the next event is
78
+ // either:
79
+ //
80
+ // - a `reasoning` chunk (new step's reasoning starting), or
81
+ // - a `tool_call` chunk (new step's first tool call), or
82
+ // - an `assistant` chunk with a different `uuid` than the one
83
+ // currently being assembled.
84
+ if (isStepBoundary(msg, state)) {
85
+ const boundaryEvents = finalizeAssistantMessageMidStream(state);
86
+ const fresh = resetForNewStep(state);
87
+ const inner = translateInner(msg, fresh);
88
+ return {
89
+ events: [...boundaryEvents, ...inner.events],
90
+ state: inner.state,
91
+ };
92
+ }
93
+ return translateInner(msg, state);
94
+ }
95
+ /**
96
+ * Returns true when `msg` signals that the current logical assistant
97
+ * step is done and a new one is starting. Triggers only when the
98
+ * translator already has accumulated assistant text — otherwise there's
99
+ * nothing to finalize and the message just enters the current step.
100
+ */
101
+ function isStepBoundary(msg, state) {
102
+ if (state.assistantText.length === 0)
103
+ return false;
104
+ switch (msg.type) {
105
+ case "reasoning":
106
+ case "tool_call":
107
+ return true;
108
+ case "assistant":
109
+ return (state.assistantMessageUuid !== null &&
110
+ msg.uuid !== state.assistantMessageUuid);
111
+ default:
112
+ return false;
113
+ }
114
+ }
115
+ /**
116
+ * Resets the per-step accumulators for a new logical step. Carries
117
+ * `status`/`phase` through — the next event will set them via its
118
+ * variant translator.
119
+ */
120
+ function resetForNewStep(state) {
121
+ return {
122
+ ...state,
123
+ assistantText: "",
124
+ reasoningText: "",
125
+ openToolCalls: new Set(),
126
+ toolCallArguments: new Map(),
127
+ dispatchedToolCalls: new Set(),
128
+ assistantMessageUuid: null,
129
+ };
130
+ }
131
+ /**
132
+ * Mid-stream sibling of `finalizeAssistantMessage`. Emits the same
133
+ * `assistant_message_complete` for the accumulated step but snapshots
134
+ * the state as `{ status: "running", phase: <current> }` — the turn
135
+ * isn't done yet, only this logical step is. Returns empty when no
136
+ * assistant text was accumulated.
137
+ */
138
+ function finalizeAssistantMessageMidStream(state) {
139
+ if (state.assistantText.length === 0)
140
+ return [];
141
+ const message = {
142
+ id: state.assistantMessageUuid ?? "",
143
+ role: "assistant",
144
+ content: state.assistantText,
145
+ created_at: new Date().toISOString(),
146
+ };
147
+ return [
148
+ {
149
+ event: "assistant_message_complete",
150
+ data: { message },
151
+ state: snapshot(state),
152
+ },
153
+ ];
154
+ }
155
+ /** The original per-variant switch — extracted so the entry-point can
156
+ * wrap it with the step-boundary check above. */
157
+ function translateInner(msg, state) {
158
+ switch (msg.type) {
159
+ case "assistant":
160
+ return translateAssistant(msg, state);
161
+ case "reasoning":
162
+ return translateReasoning(msg, state);
163
+ case "tool_call":
164
+ return translateToolCall(msg, state);
165
+ case "tool_result":
166
+ return translateToolResult(msg, state);
167
+ case "error":
168
+ return translateError(msg, state);
169
+ case "result":
170
+ case "init":
171
+ case "retry":
172
+ case "stream_event":
173
+ default:
174
+ // `result` is terminal — the runner detects it and calls
175
+ // `finalizeAssistantMessage` + `finalizeTerminal` itself. The
176
+ // others are either no-ops (`init` never appears in stream();
177
+ // `retry` is internal; `stream_event` requires a flag we don't
178
+ // set) or unknown future variants we pass through.
179
+ return { events: [], state };
180
+ }
181
+ }
182
+ /* ── per-variant translators ──────────────────────────────────────────────── */
183
+ /**
184
+ * `assistant` → `assistant_delta`. Each chunk carries the **delta** text
185
+ * in `content` (not cumulative); we forward the delta verbatim and
186
+ * accumulate the full text in `assistantText` for the eventual
187
+ * `assistant_message_complete`.
188
+ */
189
+ function translateAssistant(msg, state) {
190
+ if (!msg.content || msg.content.length === 0) {
191
+ return { events: [], state };
192
+ }
193
+ const next = {
194
+ ...state,
195
+ status: "running",
196
+ phase: "model_text",
197
+ assistantText: state.assistantText + msg.content,
198
+ assistantMessageUuid: state.assistantMessageUuid ?? msg.uuid,
199
+ };
200
+ return {
201
+ events: [
202
+ {
203
+ event: "assistant_delta",
204
+ data: { delta: msg.content },
205
+ state: snapshot(next),
206
+ },
207
+ ],
208
+ state: next,
209
+ };
210
+ }
211
+ /**
212
+ * `reasoning` → `reasoning_delta`. Phase transitions to
213
+ * `model_reasoning` while the block is in flight; the next non-
214
+ * reasoning message drives it back to `model_text`.
215
+ */
216
+ function translateReasoning(msg, state) {
217
+ if (!msg.content || msg.content.length === 0) {
218
+ return { events: [], state };
219
+ }
220
+ const next = {
221
+ ...state,
222
+ status: "running",
223
+ phase: "model_reasoning",
224
+ reasoningText: state.reasoningText + msg.content,
225
+ };
226
+ return {
227
+ events: [
228
+ {
229
+ event: "reasoning_delta",
230
+ data: { delta: msg.content },
231
+ state: snapshot(next),
232
+ },
233
+ ],
234
+ state: next,
235
+ };
236
+ }
237
+ /**
238
+ * `tool_call` → `tool_call_started` on first sighting of the id, then
239
+ * `tool_call_input_delta` for each chunk of `rawArguments`. The
240
+ * SDK delivers tool-call arguments in multiple chunks (e.g. 3 events
241
+ * for `{"path": "/etc/hostname"}`) sharing the same `toolCallId`.
242
+ *
243
+ * We accumulate `rawArguments` per id so `translateToolResult` can
244
+ * include the assembled parsed input in `tool_call_dispatched`.
245
+ */
246
+ function translateToolCall(msg, state) {
247
+ const id = msg.toolCallId;
248
+ if (!id)
249
+ return { events: [], state };
250
+ const events = [];
251
+ let next = {
252
+ ...state,
253
+ status: "running",
254
+ phase: "model_tool_input",
255
+ };
256
+ if (!next.openToolCalls.has(id)) {
257
+ events.push({
258
+ event: "tool_call_started",
259
+ data: { tool_call_id: id, tool_name: msg.toolName },
260
+ state: snapshot(next),
261
+ });
262
+ const opened = new Set(next.openToolCalls);
263
+ opened.add(id);
264
+ next = { ...next, openToolCalls: opened };
265
+ }
266
+ // Per-chunk rawArguments accumulation. The 1st event sometimes
267
+ // arrives with toolInput={raw:""} and no rawArguments; subsequent
268
+ // events carry chunks of the JSON args string.
269
+ const chunk = msg.rawArguments ?? "";
270
+ if (chunk.length > 0) {
271
+ const accumulated = (next.toolCallArguments.get(id) ?? "") + chunk;
272
+ const nextArgs = new Map(next.toolCallArguments);
273
+ nextArgs.set(id, accumulated);
274
+ next = { ...next, toolCallArguments: nextArgs };
275
+ events.push({
276
+ event: "tool_call_input_delta",
277
+ data: { tool_call_id: id, partial_json: chunk },
278
+ state: snapshot(next),
279
+ });
280
+ }
281
+ return { events, state: next };
282
+ }
283
+ /**
284
+ * `tool_result` → `tool_call_dispatched` (if not already) +
285
+ * `tool_call_result`.
286
+ *
287
+ * Phase transitions: `model_tool_input` → `tool_executing` (on
288
+ * dispatched) → `model_text` (after the result lands). Per §10.3 a
289
+ * tool error does NOT fail the turn — phase reverts to `model_text`
290
+ * either way.
291
+ */
292
+ function translateToolResult(msg, state) {
293
+ const id = msg.toolCallId;
294
+ if (!id)
295
+ return { events: [], state };
296
+ const events = [];
297
+ let next = { ...state };
298
+ if (!next.dispatchedToolCalls.has(id)) {
299
+ const assembled = next.toolCallArguments.get(id);
300
+ events.push({
301
+ event: "tool_call_dispatched",
302
+ data: {
303
+ tool_call_id: id,
304
+ input: tryParseJson(assembled),
305
+ },
306
+ state: snapshot({ ...next, phase: "tool_executing" }),
307
+ });
308
+ const dispatched = new Set(next.dispatchedToolCalls);
309
+ dispatched.add(id);
310
+ next = {
311
+ ...next,
312
+ phase: "tool_executing",
313
+ dispatchedToolCalls: dispatched,
314
+ };
315
+ }
316
+ if (msg.isError) {
317
+ events.push({
318
+ event: "tool_call_result",
319
+ data: {
320
+ tool_call_id: id,
321
+ error: { code: "tool_error", message: msg.content ?? "" },
322
+ },
323
+ state: snapshot({ ...next, phase: "model_text" }),
324
+ });
325
+ }
326
+ else {
327
+ events.push({
328
+ event: "tool_call_result",
329
+ data: { tool_call_id: id, output: msg.content ?? "" },
330
+ state: snapshot({ ...next, phase: "model_text" }),
331
+ });
332
+ }
333
+ next = { ...next, phase: "model_text" };
334
+ return { events, state: next };
335
+ }
336
+ /**
337
+ * `error` SDK message → `error` SSE event.
338
+ *
339
+ * Letta Code surfaces most errors through the terminal `result` event
340
+ * (see `finalizeTerminal`), but a few error conditions also produce a
341
+ * mid-stream `error` event with `stopReason` and an optional
342
+ * `apiError`. We pass them through as ai-hub `error` events; the
343
+ * runner decides whether the turn should fail (it typically does, but
344
+ * the terminal `result` event is the authoritative signal).
345
+ */
346
+ function translateError(msg, state) {
347
+ const code = classifyErrorCode(msg.errorCode, msg.stopReason);
348
+ return {
349
+ events: [
350
+ {
351
+ event: "error",
352
+ data: {
353
+ code,
354
+ message: msg.message ?? "Letta Code reported an error.",
355
+ },
356
+ state: snapshot(state),
357
+ },
358
+ ],
359
+ state,
360
+ };
361
+ }
362
+ /* ────────────────────────────────────────────────────────────────────────── */
363
+ /* Finalizers */
364
+ /* ────────────────────────────────────────────────────────────────────────── */
365
+ /**
366
+ * Emits the closing `assistant_message_complete` event for a turn that
367
+ * accumulated assistant text. Called by the runner exactly once when
368
+ * the terminal `result` SDK message arrives — but only when the turn
369
+ * succeeded. For a cancelled / failed turn we still emit it (the user
370
+ * deserves to see whatever partial text was generated), but the
371
+ * snapshot reflects the terminal status.
372
+ *
373
+ * @param state - the translator state at end-of-stream.
374
+ * @param terminalStatus - the status to snapshot into the envelope.
375
+ * @returns the closing events (empty if no assistant text was produced).
376
+ */
377
+ export function finalizeAssistantMessage(state, terminalStatus = "done") {
378
+ if (state.assistantText.length === 0)
379
+ return [];
380
+ const message = {
381
+ id: state.assistantMessageUuid ?? "",
382
+ role: "assistant",
383
+ content: state.assistantText,
384
+ created_at: new Date().toISOString(),
385
+ };
386
+ return [
387
+ {
388
+ event: "assistant_message_complete",
389
+ data: { message },
390
+ state: snapshot({ ...state, status: terminalStatus, phase: null }),
391
+ },
392
+ ];
393
+ }
394
+ /**
395
+ * Interprets the terminal SDK `result` message into the right closing
396
+ * sequence: `assistant_message_complete` (if any) + the final
397
+ * `stream_end` with the appropriate reason. Pure function — no I/O.
398
+ *
399
+ * Behavior matrix:
400
+ *
401
+ * | result.success | result.errorCode | Emitted closing events |
402
+ * |---|---|---|
403
+ * | true | — | assistant_message_complete + stream_end{done} |
404
+ * | false | "interrupted" | assistant_message_complete (with partial text, if any) + stream_end{cancelled} |
405
+ * | false | anything else | (assistant_message_complete if partial text) + error + stream_end{error} |
406
+ *
407
+ * @param msg - the terminal SDK result message.
408
+ * @param state - the translator state right before the result arrived.
409
+ * @returns the events to emit + the (terminal) state.
410
+ */
411
+ export function finalizeTerminal(msg, state) {
412
+ if (msg.success) {
413
+ const completion = finalizeAssistantMessage(state, "done");
414
+ const finalState = { ...state, status: "done", phase: null };
415
+ return {
416
+ events: [
417
+ ...completion,
418
+ {
419
+ event: "stream_end",
420
+ data: { reason: "done" },
421
+ state: snapshot(finalState),
422
+ },
423
+ ],
424
+ state: finalState,
425
+ };
426
+ }
427
+ if (msg.errorCode === "interrupted") {
428
+ const completion = finalizeAssistantMessage(state, "cancelled");
429
+ const finalState = { ...state, status: "cancelled", phase: null };
430
+ return {
431
+ events: [
432
+ ...completion,
433
+ {
434
+ event: "stream_end",
435
+ data: { reason: "cancelled" },
436
+ state: snapshot(finalState),
437
+ },
438
+ ],
439
+ state: finalState,
440
+ };
441
+ }
442
+ // Any other failure (llm_api_error, max_steps, protocol_error,
443
+ // stream_closed, …) is a hard fail. Still emit the partial assistant
444
+ // text if any was produced, then the error and stream_end.
445
+ const partial = finalizeAssistantMessage(state, "failed");
446
+ const finalState = { ...state, status: "failed", phase: null };
447
+ const code = classifyErrorCode(msg.errorCode, msg.stopReason);
448
+ return {
449
+ events: [
450
+ ...partial,
451
+ {
452
+ event: "error",
453
+ data: {
454
+ code,
455
+ message: msg.errorDetail ?? msg.error ?? "Letta Code reported a terminal error.",
456
+ },
457
+ state: snapshot(finalState),
458
+ },
459
+ {
460
+ event: "stream_end",
461
+ data: { reason: "error" },
462
+ state: snapshot(finalState),
463
+ },
464
+ ],
465
+ state: finalState,
466
+ };
467
+ }
468
+ /* ────────────────────────────────────────────────────────────────────────── */
469
+ /* Internal helpers */
470
+ /* ────────────────────────────────────────────────────────────────────────── */
471
+ /** Snapshots `(status, phase)` for the SSE event envelope. */
472
+ function snapshot(state) {
473
+ return { status: state.status, phase: state.phase };
474
+ }
475
+ /**
476
+ * Best-effort JSON parse. Returns `undefined` on failure so the
477
+ * `tool_call_dispatched.data.input` is null-shaped rather than
478
+ * throwing. If `raw` is `undefined` we also return `undefined` —
479
+ * happens when the tool was called with no args at all.
480
+ */
481
+ function tryParseJson(raw) {
482
+ if (raw === undefined || raw === "")
483
+ return undefined;
484
+ try {
485
+ return JSON.parse(raw);
486
+ }
487
+ catch {
488
+ return raw;
489
+ }
490
+ }
491
+ /**
492
+ * Maps the SDK's `errorCode` + `stopReason` strings onto ai-hub's
493
+ * stable `error.code` enum.
494
+ *
495
+ * SDK error codes we know about:
496
+ * - `approval_conflict` — non-fatal approval flow snag; treat as `internal`
497
+ * (ai-hub doesn't surface approvals to end-users in v1).
498
+ * - `protocol_error` — SDK ↔ CLI wire-shape mismatch; `internal`.
499
+ * - `llm_api_error` — the underlying LLM call failed; `provider_error`.
500
+ * - `max_steps` — agent hit its step ceiling; `internal` for now (a
501
+ * `max_steps` ai-hub code is a future v1.x enhancement).
502
+ * - `interrupted` — handled separately in `finalizeTerminal`.
503
+ * - `stream_closed` — SDK pump closed early; `internal`.
504
+ * - `error` (generic) — fall back to `stopReason` sniffing.
505
+ *
506
+ * The set of legitimate ai-hub `error.code` values lives in
507
+ * `@data-club/ai-hub` (§9.4). We keep `tpm_exhausted` reserved for
508
+ * future use (it is no longer emitted post-migration — the recovery
509
+ * loop is gone — but we keep the enum value so a future restore can
510
+ * use it without protocol-version churn).
511
+ */
512
+ function classifyErrorCode(errorCode, stopReason) {
513
+ if (errorCode === "llm_api_error")
514
+ return "provider_error";
515
+ if (errorCode === "approval_conflict" || errorCode === "approval_conflict_terminal")
516
+ return "internal";
517
+ if (errorCode === "protocol_error" || errorCode === "stream_closed")
518
+ return "internal";
519
+ if (errorCode === "max_steps")
520
+ return "internal";
521
+ if (errorCode && errorCode !== "error" && errorCode !== "interrupted")
522
+ return "internal";
523
+ // Fall back on stopReason heuristics. Future Letta Code versions may
524
+ // expose richer error codes; we'll extend the map here.
525
+ const l = (stopReason ?? "").toLowerCase();
526
+ if (l.includes("rate") || l.includes("limit") || l.includes("429"))
527
+ return "tpm_exhausted";
528
+ if (l.includes("provider") || l.includes("upstream") || l.includes("llm"))
529
+ return "provider_error";
530
+ return "internal";
531
+ }
532
+ //# sourceMappingURL=eventTranslator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventTranslator.js","sourceRoot":"","sources":["../../src/letta/eventTranslator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Public exports for the `letta/` module — the single entry point the rest
3
+ * of the server uses to reach Letta. Per §6.4, **every Letta interaction
4
+ * goes through `LettaClient`**; no raw HTTP, no other entry points.
5
+ *
6
+ * @see SPECIFICATIONS.md §6.4
7
+ */
8
+ export { createDefaultLettaClient, type CreateLettaClientDeps, type LettaClient, type StreamUserMessageOpts, } from "./client.js";
9
+ export { finalizeAssistantMessage, finalizeTerminal, initialTranslatorState, translateSdkMessage, type TranslateStep, type TranslatorState, type UnsequencedEvent, } from "./eventTranslator.js";
10
+ export { ServerOverloadedError, SubprocessThrottle, readThrottleConfigFromEnv, type ThrottleConfig, type ThrottleLease, } from "./subprocessThrottle.js";
11
+ export { seedAgentToolsetNone, type SeedOutcome, type ToolsetPreference, } from "./settingsFileSeed.js";
12
+ export type { LettaAssistantMessage, LettaHiddenReasoningMessage, LettaMessage, LettaReasoningMessage, LettaSdk, LettaStreamEvent, LettaToolCallMessage, LettaToolReturnMessage, LettaUserMessage, } from "./types.js";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/letta/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,wBAAwB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAChB,KAAK,qBAAqB,GAC3B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,yBAAyB,EACzB,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,iBAAiB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,qBAAqB,EACrB,2BAA2B,EAC3B,YAAY,EACZ,qBAAqB,EACrB,QAAQ,EACR,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Public exports for the `letta/` module — the single entry point the rest
3
+ * of the server uses to reach Letta. Per §6.4, **every Letta interaction
4
+ * goes through `LettaClient`**; no raw HTTP, no other entry points.
5
+ *
6
+ * @see SPECIFICATIONS.md §6.4
7
+ */
8
+ export { createDefaultLettaClient, } from "./client.js";
9
+ export { finalizeAssistantMessage, finalizeTerminal, initialTranslatorState, translateSdkMessage, } from "./eventTranslator.js";
10
+ export { ServerOverloadedError, SubprocessThrottle, readThrottleConfigFromEnv, } from "./subprocessThrottle.js";
11
+ export { seedAgentToolsetNone, } from "./settingsFileSeed.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/letta/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,wBAAwB,GAIzB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,GAIpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,yBAAyB,GAG1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,oBAAoB,GAGrB,MAAM,uBAAuB,CAAC"}