@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.
- package/dist/auth/argon2.d.ts +72 -0
- package/dist/auth/argon2.d.ts.map +1 -0
- package/dist/auth/argon2.js +145 -0
- package/dist/auth/argon2.js.map +1 -0
- package/dist/auth/encryption.d.ts +52 -0
- package/dist/auth/encryption.d.ts.map +1 -0
- package/dist/auth/encryption.js +98 -0
- package/dist/auth/encryption.js.map +1 -0
- package/dist/auth/jwt.d.ts +133 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/jwt.js +147 -0
- package/dist/auth/jwt.js.map +1 -0
- package/dist/auth/middleware.d.ts +101 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +161 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/passwordPolicy.d.ts +72 -0
- package/dist/auth/passwordPolicy.d.ts.map +1 -0
- package/dist/auth/passwordPolicy.js +88 -0
- package/dist/auth/passwordPolicy.js.map +1 -0
- package/dist/auth/roleRules.d.ts +200 -0
- package/dist/auth/roleRules.d.ts.map +1 -0
- package/dist/auth/roleRules.js +365 -0
- package/dist/auth/roleRules.js.map +1 -0
- package/dist/auth/userView.d.ts +55 -0
- package/dist/auth/userView.d.ts.map +1 -0
- package/dist/auth/userView.js +77 -0
- package/dist/auth/userView.js.map +1 -0
- package/dist/bootstrap.d.ts +104 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +160 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/db/connection.d.ts +39 -0
- package/dist/db/connection.d.ts.map +1 -0
- package/dist/db/connection.js +62 -0
- package/dist/db/connection.js.map +1 -0
- package/dist/db/migrate.d.ts +31 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +197 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/schema.d.ts +1902 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +662 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/seed.d.ts +92 -0
- package/dist/db/seed.d.ts.map +1 -0
- package/dist/db/seed.js +160 -0
- package/dist/db/seed.js.map +1 -0
- package/dist/handlers/fetch.d.ts +89 -0
- package/dist/handlers/fetch.d.ts.map +1 -0
- package/dist/handlers/fetch.js +173 -0
- package/dist/handlers/fetch.js.map +1 -0
- package/dist/handlers/nextjs.d.ts +40 -0
- package/dist/handlers/nextjs.d.ts.map +1 -0
- package/dist/handlers/nextjs.js +42 -0
- package/dist/handlers/nextjs.js.map +1 -0
- package/dist/handlers/responses.d.ts +46 -0
- package/dist/handlers/responses.d.ts.map +1 -0
- package/dist/handlers/responses.js +74 -0
- package/dist/handlers/responses.js.map +1 -0
- package/dist/handlers/routeTable.d.ts +21 -0
- package/dist/handlers/routeTable.d.ts.map +1 -0
- package/dist/handlers/routeTable.js +133 -0
- package/dist/handlers/routeTable.js.map +1 -0
- package/dist/handlers/router.d.ts +37 -0
- package/dist/handlers/router.d.ts.map +1 -0
- package/dist/handlers/router.js +82 -0
- package/dist/handlers/router.js.map +1 -0
- package/dist/handlers/sse.d.ts +38 -0
- package/dist/handlers/sse.d.ts.map +1 -0
- package/dist/handlers/sse.js +52 -0
- package/dist/handlers/sse.js.map +1 -0
- package/dist/handlers/types.d.ts +96 -0
- package/dist/handlers/types.d.ts.map +1 -0
- package/dist/handlers/types.js +14 -0
- package/dist/handlers/types.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/letta/client.d.ts +355 -0
- package/dist/letta/client.d.ts.map +1 -0
- package/dist/letta/client.js +529 -0
- package/dist/letta/client.js.map +1 -0
- package/dist/letta/eventTranslator.d.ts +166 -0
- package/dist/letta/eventTranslator.d.ts.map +1 -0
- package/dist/letta/eventTranslator.js +532 -0
- package/dist/letta/eventTranslator.js.map +1 -0
- package/dist/letta/index.d.ts +13 -0
- package/dist/letta/index.d.ts.map +1 -0
- package/dist/letta/index.js +12 -0
- package/dist/letta/index.js.map +1 -0
- package/dist/letta/modelSettings.d.ts +176 -0
- package/dist/letta/modelSettings.d.ts.map +1 -0
- package/dist/letta/modelSettings.js +314 -0
- package/dist/letta/modelSettings.js.map +1 -0
- package/dist/letta/promptWrapping.d.ts +141 -0
- package/dist/letta/promptWrapping.d.ts.map +1 -0
- package/dist/letta/promptWrapping.js +213 -0
- package/dist/letta/promptWrapping.js.map +1 -0
- package/dist/letta/sandbox.d.ts +100 -0
- package/dist/letta/sandbox.d.ts.map +1 -0
- package/dist/letta/sandbox.js +151 -0
- package/dist/letta/sandbox.js.map +1 -0
- package/dist/letta/settingsFileSeed.d.ts +146 -0
- package/dist/letta/settingsFileSeed.d.ts.map +1 -0
- package/dist/letta/settingsFileSeed.js +177 -0
- package/dist/letta/settingsFileSeed.js.map +1 -0
- package/dist/letta/subprocessThrottle.d.ts +151 -0
- package/dist/letta/subprocessThrottle.d.ts.map +1 -0
- package/dist/letta/subprocessThrottle.js +195 -0
- package/dist/letta/subprocessThrottle.js.map +1 -0
- package/dist/letta/tpmRecovery.d.ts +202 -0
- package/dist/letta/tpmRecovery.d.ts.map +1 -0
- package/dist/letta/tpmRecovery.js +314 -0
- package/dist/letta/tpmRecovery.js.map +1 -0
- package/dist/letta/types.d.ts +54 -0
- package/dist/letta/types.d.ts.map +1 -0
- package/dist/letta/types.js +16 -0
- package/dist/letta/types.js.map +1 -0
- package/dist/observability/logger.d.ts +48 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +81 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/metrics.d.ts +53 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +92 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/routes/admin/agents.d.ts +63 -0
- package/dist/routes/admin/agents.d.ts.map +1 -0
- package/dist/routes/admin/agents.js +461 -0
- package/dist/routes/admin/agents.js.map +1 -0
- package/dist/routes/admin/rotatingMessages.d.ts +51 -0
- package/dist/routes/admin/rotatingMessages.d.ts.map +1 -0
- package/dist/routes/admin/rotatingMessages.js +292 -0
- package/dist/routes/admin/rotatingMessages.js.map +1 -0
- package/dist/routes/admin/sessions.d.ts +61 -0
- package/dist/routes/admin/sessions.d.ts.map +1 -0
- package/dist/routes/admin/sessions.js +232 -0
- package/dist/routes/admin/sessions.js.map +1 -0
- package/dist/routes/admin/settings.d.ts +110 -0
- package/dist/routes/admin/settings.d.ts.map +1 -0
- package/dist/routes/admin/settings.js +401 -0
- package/dist/routes/admin/settings.js.map +1 -0
- package/dist/routes/admin/users.d.ts +115 -0
- package/dist/routes/admin/users.d.ts.map +1 -0
- package/dist/routes/admin/users.js +374 -0
- package/dist/routes/admin/users.js.map +1 -0
- package/dist/routes/agents.d.ts +30 -0
- package/dist/routes/agents.d.ts.map +1 -0
- package/dist/routes/agents.js +55 -0
- package/dist/routes/agents.js.map +1 -0
- package/dist/routes/auth.d.ts +121 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +422 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/chat.d.ts +97 -0
- package/dist/routes/chat.d.ts.map +1 -0
- package/dist/routes/chat.js +484 -0
- package/dist/routes/chat.js.map +1 -0
- package/dist/routes/featureToggles.d.ts +34 -0
- package/dist/routes/featureToggles.d.ts.map +1 -0
- package/dist/routes/featureToggles.js +47 -0
- package/dist/routes/featureToggles.js.map +1 -0
- package/dist/routes/health.d.ts +24 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +37 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/metrics.d.ts +35 -0
- package/dist/routes/metrics.d.ts.map +1 -0
- package/dist/routes/metrics.js +106 -0
- package/dist/routes/metrics.js.map +1 -0
- package/dist/routes/sessions.d.ts +161 -0
- package/dist/routes/sessions.d.ts.map +1 -0
- package/dist/routes/sessions.js +1501 -0
- package/dist/routes/sessions.js.map +1 -0
- package/dist/routes/stubs.d.ts +25 -0
- package/dist/routes/stubs.d.ts.map +1 -0
- package/dist/routes/stubs.js +25 -0
- package/dist/routes/stubs.js.map +1 -0
- package/dist/state/cron.d.ts +58 -0
- package/dist/state/cron.d.ts.map +1 -0
- package/dist/state/cron.js +160 -0
- package/dist/state/cron.js.map +1 -0
- package/dist/state/rotationRunner.d.ts +96 -0
- package/dist/state/rotationRunner.d.ts.map +1 -0
- package/dist/state/rotationRunner.js +246 -0
- package/dist/state/rotationRunner.js.map +1 -0
- package/dist/state/rotationScheduler.d.ts +76 -0
- package/dist/state/rotationScheduler.d.ts.map +1 -0
- package/dist/state/rotationScheduler.js +124 -0
- package/dist/state/rotationScheduler.js.map +1 -0
- package/dist/state/turnRegistry.d.ts +95 -0
- package/dist/state/turnRegistry.d.ts.map +1 -0
- package/dist/state/turnRegistry.js +149 -0
- package/dist/state/turnRegistry.js.map +1 -0
- package/dist/state/turnRunner.d.ts +134 -0
- package/dist/state/turnRunner.d.ts.map +1 -0
- package/dist/state/turnRunner.js +476 -0
- package/dist/state/turnRunner.js.map +1 -0
- package/package.json +47 -0
- package/src/auth/argon2.ts +152 -0
- package/src/auth/encryption.ts +110 -0
- package/src/auth/jwt.ts +217 -0
- package/src/auth/middleware.ts +250 -0
- package/src/auth/passwordPolicy.ts +99 -0
- package/src/auth/roleRules.ts +497 -0
- package/src/auth/userView.ts +88 -0
- package/src/bootstrap.ts +254 -0
- package/src/db/connection.ts +75 -0
- package/src/db/migrate.ts +212 -0
- package/src/db/schema.ts +750 -0
- package/src/db/seed.ts +236 -0
- package/src/handlers/fetch.ts +251 -0
- package/src/handlers/nextjs.ts +49 -0
- package/src/handlers/responses.ts +95 -0
- package/src/handlers/routeTable.ts +188 -0
- package/src/handlers/router.ts +96 -0
- package/src/handlers/sse.ts +55 -0
- package/src/handlers/types.ts +104 -0
- package/src/index.ts +60 -0
- package/src/letta/client.ts +860 -0
- package/src/letta/eventTranslator.ts +667 -0
- package/src/letta/index.ts +46 -0
- package/src/letta/lettaCliShim.mjs +40 -0
- package/src/letta/sandbox.ts +167 -0
- package/src/letta/settingsFileSeed.ts +254 -0
- package/src/letta/subprocessThrottle.ts +251 -0
- package/src/letta/types.ts +65 -0
- package/src/observability/logger.ts +103 -0
- package/src/observability/metrics.ts +114 -0
- package/src/routes/admin/agents.ts +574 -0
- package/src/routes/admin/rotatingMessages.ts +351 -0
- package/src/routes/admin/sessions.ts +283 -0
- package/src/routes/admin/settings.ts +463 -0
- package/src/routes/admin/users.ts +455 -0
- package/src/routes/agents.ts +66 -0
- package/src/routes/auth.ts +513 -0
- package/src/routes/chat.ts +534 -0
- package/src/routes/featureToggles.ts +52 -0
- package/src/routes/health.ts +44 -0
- package/src/routes/metrics.ts +111 -0
- package/src/routes/sessions.ts +1878 -0
- package/src/state/cron.ts +179 -0
- package/src/state/rotationRunner.ts +326 -0
- package/src/state/rotationScheduler.ts +164 -0
- package/src/state/turnRegistry.ts +210 -0
- 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"}
|