@happyvertical/smrt-chat 0.39.4 → 0.39.6

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/AGENTS.md CHANGED
@@ -7,8 +7,11 @@ Chat rooms, threads, and agent sessions with app-controlled tool whitelisting.
7
7
  `pnpm --dir packages/chat dev` runs a package-local SvelteKit workbench. The root
8
8
  route is an interactive chat surface with a dev-only `/api/dev-chat` endpoint:
9
9
  it uses `@happyvertical/ai` when local provider credentials are present and
10
- falls back to a deterministic local assistant otherwise. `/previews` hosts the
11
- shared component playground entries from `src/svelte/playground.ts`.
10
+ falls back to a deterministic local assistant otherwise. `/api/dev-chat-stream`
11
+ is its SSE companion (#1936) — the same provider/local-fallback resolution wired
12
+ through `createChatStreamHandler` in plain mode, so an embedded `SmrtChatBackend`
13
+ client can exercise token streaming locally. `/previews` hosts the shared
14
+ component playground entries from `src/svelte/playground.ts`.
12
15
 
13
16
  The root workbench also has a dev-only voice conversation mode. It reads voice
14
17
  gateway connection details through `/api/dev-voice/config`, streams browser mic
@@ -56,6 +59,14 @@ Voice is an input mode for the existing persona chat harness, not a separate cha
56
59
 
57
60
  The gateway bearer token proves only "this request came from the gateway"; it never authorizes the end user. The short-lived `VoiceSession` binding is the user/session proof, and untrusted gateway metadata must be validated against that binding before any chat write or tool loop. Tool execution remains fail-closed through the persona allow-list mirrored onto `AgentSession` by `bindPersonaToSession()`.
58
61
 
62
+ ## Token Streaming (SSE, #1936)
63
+
64
+ `chat-stream.ts` is the SSE seam for embeddable conversational UIs (first consumer: the Happy chat widget, `animation#5`): a client POSTs the conversation so far and receives a `text/event-stream` of `data: <json>` frames — `token` deltas as the model generates, then a final `done` frame with the message. The wire `ChatStreamEvent` union also declares `emotion` and `control` (#1921 host-page control commands) lanes for forward compatibility; the v1 engine emits `token`/`done`/`error`.
65
+
66
+ - **`runChatConversationStream({ context, messages })`** — the transport-agnostic engine (an `AsyncGenerator<ChatStreamEvent>`). Dispatches on `context.binding`: **persona-bound** runs the full `runPersonaConversationTurn` with a token sink wired through the tool loop (`onToken` → `ai.chat({ stream: true, onProgress })`), then persists via `ChatService` and emits the persisted message as `done`; **plain/unbound** streams `ai.stream()` directly and emits a synthesized (unpersisted) `done`. Streamed tokens are a live PREVIEW (a tool-call round may narrate before acting); the `done` message is authoritative. Failures surface as an in-band `error` event, never a throw (the 200 has already committed once streaming starts).
67
+ - **`createChatStreamHandler({ authorize, allowedOrigins?, allowCredentials? })`** — a Fetch-compatible handler returning `text/event-stream` (mirrors `createVoiceGatewayTurnHandler`). `authorize(request, body)` is the SOLE trust boundary and works exactly like the voice gateway: this module NEVER authorizes from the request's `session` metadata — the app validates the caller (bearer session id / cookie / same-origin) and the claimed ids against the authenticated principal, and returns an already-authorized `ChatStreamContext`. Generation caps (`model`/`maxTokens`/`maxSteps`) live on the context (server-resolved), never on the request. Cross-origin embedding uses the same fail-closed CORS posture as core `_events` (#1861): the `Origin` is echoed only when allow-listed (never `*`), credentials only when opted in.
68
+ - **Persona path reuses the harness's own gates unchanged** — persona principal, fail-closed `allowedTools` offer+execution gates, tenant binding. `onToken` is best-effort telemetry threaded through `runToolLoop`; it never changes what the loop persists or authorizes.
69
+
59
70
  ## Gotchas
60
71
 
61
72
  - **sessionContext, not context**: `context` is reserved for slug scoping. Use `getSessionContext()`/`updateSessionContext()` for agent memory.
@@ -0,0 +1,185 @@
1
+ import { AIInterface } from '@happyvertical/ai';
2
+ import { PrincipalAuditSink } from '@happyvertical/smrt-agents';
3
+ import { SmrtClassOptions } from '@happyvertical/smrt-core';
4
+ import { AgentSession } from './models/AgentSession.js';
5
+ import { ConversationPersona, PersonaRecallOptions } from './persona-conversation.js';
6
+ import { ChatService } from './services/index.js';
7
+ import { VoiceGatewayTurnMetadata } from './voice.js';
8
+ /** Max conversation messages accepted on one streaming request. */
9
+ export declare const MAX_CHAT_STREAM_MESSAGES = 50;
10
+ /** Max characters per message (matches the voice gateway text cap). */
11
+ export declare const MAX_CHAT_STREAM_CONTENT_LENGTH = 12000;
12
+ /**
13
+ * Default SSE keep-alive interval (ms). A persona turn can go quiet for tens of
14
+ * seconds during a silent tool-calling round (an LLM round-trip + an in-process
15
+ * tool op emit no tokens), and idle intermediaries (nginx / ALB / Cloudflare —
16
+ * the expected home for an embedded widget backend) drop a connection with no
17
+ * traffic. A periodic SSE comment line keeps it warm, mirroring the core
18
+ * `_events` route's `DEFAULT_EVENTS_HEARTBEAT_MS`.
19
+ */
20
+ export declare const DEFAULT_CHAT_STREAM_HEARTBEAT_MS = 15000;
21
+ /** Roles carried on the wire (a subset of the internal `ChatMessageRole`). */
22
+ export type ChatStreamRole = 'user' | 'assistant' | 'system';
23
+ /**
24
+ * A conversation message on the wire — the shape the client sends in `messages`
25
+ * and the shape the final `done` frame carries back. Kept self-contained (not
26
+ * the internal `ChatMessage` model) so the contract is stable and JSON-only.
27
+ */
28
+ export interface ChatStreamMessage {
29
+ id?: string;
30
+ role: ChatStreamRole;
31
+ content: string;
32
+ /** ISO-8601 timestamp. */
33
+ createdAt?: string;
34
+ }
35
+ /**
36
+ * Session metadata the client attaches to a turn — `VoiceGatewayTurnMetadata`-
37
+ * shaped so voice and chat share one binding vocabulary. It is UNTRUSTED input:
38
+ * the handler's `authorize` callback is responsible for validating any of these
39
+ * ids against the authenticated principal before they reach a chat write or the
40
+ * tool loop.
41
+ */
42
+ export type ChatStreamSession = VoiceGatewayTurnMetadata;
43
+ /**
44
+ * A host-page control command (#1921, smrt-ui `control-interaction.ts`) carried
45
+ * on the optional `control` lane. Kept structural here so the streaming
46
+ * contract does not hard-couple to `@happyvertical/smrt-ui/forms`' exact union:
47
+ * the client adapter (the Happy widget) executes it against its own control
48
+ * registry, where sensitivity gating and the stage→apply consent split stay
49
+ * enforced registry-side.
50
+ */
51
+ export interface ChatStreamControlCommand {
52
+ action: string;
53
+ [key: string]: unknown;
54
+ }
55
+ /**
56
+ * One frame of the stream. `token`/`done`/`error` are emitted today; `emotion`
57
+ * and `control` are part of the wire contract (so clients can rely on the union
58
+ * and a future server hook can emit them without a breaking change) but are not
59
+ * produced by the v1 engine.
60
+ */
61
+ export type ChatStreamEvent = {
62
+ type: 'token';
63
+ text: string;
64
+ } | {
65
+ type: 'emotion';
66
+ name: string;
67
+ } | {
68
+ type: 'control';
69
+ command: ChatStreamControlCommand;
70
+ } | {
71
+ type: 'done';
72
+ message: ChatStreamMessage;
73
+ } | {
74
+ type: 'error';
75
+ error: string;
76
+ };
77
+ /** The JSON body of a streaming request. */
78
+ export interface ChatStreamRequestBody {
79
+ messages?: unknown;
80
+ session?: ChatStreamSession;
81
+ }
82
+ /** The minimal `AgentSession` surface the persona turn needs. */
83
+ type StreamSessionLike = Pick<AgentSession, 'id' | 'chatRoomId' | 'systemPrompt'>;
84
+ /**
85
+ * A resolved, ALREADY-AUTHORIZED persona binding. The `authorize` callback
86
+ * produces this after validating the request against the authenticated
87
+ * principal; nothing here is taken from untrusted request metadata.
88
+ */
89
+ export interface ChatStreamPersonaBinding {
90
+ chatService: ChatService;
91
+ /** Database handle the persona turn's side-door operations run against. */
92
+ db: SmrtClassOptions['db'];
93
+ persona: ConversationPersona;
94
+ session: StreamSessionLike;
95
+ tenantId: string;
96
+ /** Thread within the bound session room to author into. */
97
+ threadId?: string | null;
98
+ /** Originating user the turn runs on behalf of (audited). */
99
+ onBehalfOfUserId?: string | null;
100
+ /** Recall configuration, or `false` to skip memory recall. */
101
+ recall?: PersonaRecallOptions | false;
102
+ /** Audit sink forwarded to the principal execution. */
103
+ audit?: PrincipalAuditSink;
104
+ /** Opt into Postgres RLS transaction wrapping. */
105
+ postgresRls?: boolean;
106
+ }
107
+ /**
108
+ * The trusted context a turn runs in. `binding` present ⇒ persona-bound; absent
109
+ * ⇒ plain `ai.stream()`. Generation caps live here (server-resolved), never on
110
+ * the request, so a caller cannot widen `maxTokens`/`maxSteps`.
111
+ */
112
+ export interface ChatStreamContext {
113
+ ai: AIInterface;
114
+ binding?: ChatStreamPersonaBinding;
115
+ /** System prompt for the PLAIN path. Ignored when `binding` is set. */
116
+ systemPrompt?: string;
117
+ model?: string;
118
+ temperature?: number;
119
+ maxTokens?: number;
120
+ maxSteps?: number;
121
+ }
122
+ /** Options for {@link runChatConversationStream}. */
123
+ export interface RunChatConversationStreamOptions {
124
+ context: ChatStreamContext;
125
+ /** The conversation so far; the last user message is this turn's prompt. */
126
+ messages: ChatStreamMessage[];
127
+ }
128
+ /** Base error carrying an HTTP status + code for the handler to render. */
129
+ export declare class ChatStreamError extends Error {
130
+ readonly status: number;
131
+ readonly code: string;
132
+ constructor(message: string, status: number, code: string);
133
+ }
134
+ /** 400 — malformed request body. */
135
+ export declare class ChatStreamBadRequestError extends ChatStreamError {
136
+ constructor(message?: string);
137
+ }
138
+ /** 401 — the request could not be authorized. */
139
+ export declare class ChatStreamUnauthorizedError extends ChatStreamError {
140
+ constructor(message?: string);
141
+ }
142
+ /**
143
+ * Run one streaming conversation turn, yielding SSE events. Dispatches on
144
+ * `context.binding`: persona-bound turns run the full harness; unbound turns
145
+ * stream `ai.stream()`. Errors surface as an in-band `error` event (the HTTP
146
+ * response has already committed to 200 once streaming starts), never a throw.
147
+ */
148
+ export declare function runChatConversationStream(options: RunChatConversationStreamOptions): AsyncGenerator<ChatStreamEvent>;
149
+ /**
150
+ * Options for {@link createChatStreamHandler}.
151
+ */
152
+ export interface ChatStreamHandlerOptions {
153
+ /**
154
+ * Resolve an ALREADY-AUTHORIZED context from the request. This is the sole
155
+ * trust boundary: validate the caller (bearer session id / cookie /
156
+ * same-origin) and the claimed `body.session` ids against the authenticated
157
+ * principal here, and return the context the turn runs in. Throw a
158
+ * {@link ChatStreamError} (or any error ⇒ 500) to reject before any byte is
159
+ * streamed.
160
+ */
161
+ authorize: (request: Request, body: ChatStreamRequestBody) => ChatStreamContext | Promise<ChatStreamContext>;
162
+ /**
163
+ * Cross-origin allowlist for the embedded widget (#1861 posture): the request
164
+ * `Origin` is echoed only when a member (never `*`). Empty/omitted ⇒
165
+ * same-origin only.
166
+ */
167
+ allowedOrigins?: string[];
168
+ /** Emit `Access-Control-Allow-Credentials: true` for an allow-listed origin. */
169
+ allowCredentials?: boolean;
170
+ /**
171
+ * SSE keep-alive interval (ms). Defaults to
172
+ * {@link DEFAULT_CHAT_STREAM_HEARTBEAT_MS}. `0` disables the heartbeat.
173
+ */
174
+ heartbeatMs?: number;
175
+ }
176
+ /**
177
+ * Build a Fetch-compatible SSE handler for the streaming contract (mirrors
178
+ * `createVoiceGatewayTurnHandler`). Returns `text/event-stream`; wire it into a
179
+ * SvelteKit `+server.ts`, a Bun/Node server, or any Fetch host.
180
+ */
181
+ export declare function createChatStreamHandler(options: ChatStreamHandlerOptions): (request: Request) => Promise<Response>;
182
+ /** SSE serialization of one event: a single `data:` frame. */
183
+ export declare function encodeChatStreamEvent(event: ChatStreamEvent): string;
184
+ export {};
185
+ //# sourceMappingURL=chat-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-stream.d.ts","sourceRoot":"","sources":["../src/chat-stream.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { acceptAppliedChange, type CaptureChatFeedbackOptions, type ChatFeedbackBase, type ChatFeedbackPersona, type ChatFeedbackResult, captureChatFeedback, correctResponse, rateResponse, rejectAppliedChange, thumbsDown, thumbsUp, } from './chat-feedback.js';
2
+ export { ChatStreamBadRequestError, type ChatStreamContext, type ChatStreamControlCommand, ChatStreamError, type ChatStreamEvent, type ChatStreamHandlerOptions, type ChatStreamMessage, type ChatStreamPersonaBinding, type ChatStreamRequestBody, type ChatStreamRole, type ChatStreamSession, ChatStreamUnauthorizedError, createChatStreamHandler, DEFAULT_CHAT_STREAM_HEARTBEAT_MS, encodeChatStreamEvent, MAX_CHAT_STREAM_CONTENT_LENGTH, MAX_CHAT_STREAM_MESSAGES, type RunChatConversationStreamOptions, runChatConversationStream, } from './chat-stream.js';
2
3
  export { AgentSession, ChatMessage, ChatParticipant, ChatReaction, ChatRoom, ChatThread, VoiceGatewayTurn, VoiceSession, } from './models/index.js';
3
4
  export { type AuthoredConversationMessages, type BindPersonaToSessionOptions, bindPersonaToSession, type ConversationPersona, type ConversationReplyService, conversationPersonaFromAgentPersona, conversationPersonaFromResolved, formatRecalledMemory, type PersonaConversationTurnOptions, type PersonaConversationTurnResult, type PersonaRecallOptions, principalBindingFor, recallPersonaMemory, resolveConversationInstructions, runPersonaConversationTurn, } from './persona-conversation.js';
4
5
  export { ChatService } from './services/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAKH,OAAO,wBAAwB,CAAC;AAehC,OAAO,EACL,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,UAAU,EACV,QAAQ,GACT,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,YAAY,EACZ,WAAW,EACX,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,YAAY,GACb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,oBAAoB,EACpB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,mCAAmC,EACnC,+BAA+B,EAC/B,oBAAoB,EACpB,KAAK,8BAA8B,EACnC,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EACzB,mBAAmB,EACnB,mBAAmB,EACnB,+BAA+B,EAC/B,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,YAAY,EACjB,oBAAoB,EACpB,WAAW,EACX,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,kBAAkB,GACxB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EACL,wBAAwB,EACxB,KAAK,6BAA6B,EAClC,sBAAsB,EACtB,6BAA6B,EAC7B,KAAK,6BAA6B,EAClC,sBAAsB,EACtB,6BAA6B,EAC7B,sBAAsB,EACtB,KAAK,8BAA8B,EACnC,2BAA2B,EAC3B,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,8BAA8B,EACnC,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,gCAAgC,EACrC,6BAA6B,EAC7B,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAKH,OAAO,wBAAwB,CAAC;AAahC,OAAO,EACL,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,UAAU,EACV,QAAQ,GACT,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,yBAAyB,EACzB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,2BAA2B,EAC3B,uBAAuB,EACvB,gCAAgC,EAChC,qBAAqB,EACrB,8BAA8B,EAC9B,wBAAwB,EACxB,KAAK,gCAAgC,EACrC,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,YAAY,EACZ,WAAW,EACX,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,YAAY,GACb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,oBAAoB,EACpB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,mCAAmC,EACnC,+BAA+B,EAC/B,oBAAoB,EACpB,KAAK,8BAA8B,EACnC,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EACzB,mBAAmB,EACnB,mBAAmB,EACnB,+BAA+B,EAC/B,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,YAAY,EACjB,oBAAoB,EACpB,WAAW,EACX,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,kBAAkB,GACxB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EACL,wBAAwB,EACxB,KAAK,6BAA6B,EAClC,sBAAsB,EACtB,6BAA6B,EAC7B,KAAK,6BAA6B,EAClC,sBAAsB,EACtB,6BAA6B,EAC7B,sBAAsB,EACtB,KAAK,8BAA8B,EACnC,2BAA2B,EAC3B,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,8BAA8B,EACnC,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,gCAAgC,EACrC,6BAA6B,EAC7B,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,YAAY,CAAC"}