@amodalai/react 0.1.9 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/client/chat-api.d.ts +2 -3
- package/dist/client/chat-api.d.ts.map +1 -1
- package/dist/client/runtime-client.d.ts +3 -3
- package/dist/client/runtime-client.d.ts.map +1 -1
- package/dist/client.js +10 -10
- package/dist/client.js.map +1 -1
- package/dist/event-bus-h26clqbZ.js.map +1 -1
- package/dist/provider.d.ts +4 -4
- package/dist/provider.d.ts.map +1 -1
- package/dist/react.js +73 -73
- package/dist/react.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/widget.js +2 -2
- package/dist/widget.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -24,8 +24,7 @@ export declare function createSession(serverUrl: string, user: {
|
|
|
24
24
|
}, token?: string): Promise<SessionInfo>;
|
|
25
25
|
export interface SessionHistoryItem {
|
|
26
26
|
id: string;
|
|
27
|
-
|
|
28
|
-
app_id?: string;
|
|
27
|
+
app_id: string;
|
|
29
28
|
title?: string;
|
|
30
29
|
tags: string[];
|
|
31
30
|
status: string;
|
|
@@ -47,7 +46,7 @@ export interface SessionDetail extends SessionHistoryItem {
|
|
|
47
46
|
}>;
|
|
48
47
|
}
|
|
49
48
|
/**
|
|
50
|
-
* List past sessions for the authenticated
|
|
49
|
+
* List past sessions for the authenticated app.
|
|
51
50
|
*/
|
|
52
51
|
export declare function listSessions(serverUrl: string, token?: string | null, tags?: string[]): Promise<SessionHistoryItem[]>;
|
|
53
52
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-api.d.ts","sourceRoot":"","sources":["../../src/client/chat-api.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAuB,UAAU,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,EAC1B,MAAM,CAAC,EAAE,WAAW,EACpB,KAAK,CAAC,EAAE,MAAM,GACb,cAAc,CAAC,QAAQ,CAAC,CAkB1B;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EACnC,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,CAyBtB;AAMD,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,
|
|
1
|
+
{"version":3,"file":"chat-api.d.ts","sourceRoot":"","sources":["../../src/client/chat-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SSEEvent, TaskStatus, StoreDefinitionInfo, StoreListResult, StoreDocumentResult } from '../types';
|
|
2
2
|
export interface RuntimeClientOptions {
|
|
3
3
|
runtimeUrl: string;
|
|
4
|
-
|
|
4
|
+
appId: string;
|
|
5
5
|
getToken?: () => string | Promise<string> | null | undefined;
|
|
6
6
|
}
|
|
7
7
|
/**
|
|
@@ -10,7 +10,7 @@ export interface RuntimeClientOptions {
|
|
|
10
10
|
*/
|
|
11
11
|
export declare class RuntimeClient {
|
|
12
12
|
private readonly runtimeUrl;
|
|
13
|
-
private readonly
|
|
13
|
+
private readonly appId;
|
|
14
14
|
private readonly getToken?;
|
|
15
15
|
constructor(options: RuntimeClientOptions);
|
|
16
16
|
private authHeaders;
|
|
@@ -25,7 +25,7 @@ export declare class RuntimeClient {
|
|
|
25
25
|
/**
|
|
26
26
|
* Start a fire-and-forget task via POST /task.
|
|
27
27
|
*/
|
|
28
|
-
startTask(prompt: string,
|
|
28
|
+
startTask(prompt: string, appToken?: string): Promise<{
|
|
29
29
|
task_id: string;
|
|
30
30
|
}>;
|
|
31
31
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-client.d.ts","sourceRoot":"","sources":["../../src/client/runtime-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,mBAAmB,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAGhH,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,
|
|
1
|
+
{"version":3,"file":"runtime-client.d.ts","sourceRoot":"","sources":["../../src/client/runtime-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,mBAAmB,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAGhH,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;CAC9D;AAED;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAoD;gBAElE,OAAO,EAAE,oBAAoB;YAM3B,WAAW;IAWzB;;OAEG;IACI,UAAU,CACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB,GACA,cAAc,CAAC,QAAQ,CAAC;IAqB3B;;OAEG;IACG,SAAS,CACb,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IA0B/B;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAiBxD;;OAEG;IACI,UAAU,CACf,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,WAAW,GACnB,cAAc,CAAC,QAAQ,CAAC;IAW3B;;OAEG;IACG,SAAS,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAcrE;;OAEG;IACG,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB,GACA,OAAO,CAAC,eAAe,CAAC;IA4B3B;;OAEG;IACG,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,mBAAmB,CAAC;CAehC"}
|
package/dist/client.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var g = Object.defineProperty;
|
|
2
|
-
var
|
|
3
|
-
var n = (h, s, t) =>
|
|
4
|
-
import { b as
|
|
2
|
+
var p = (h, s, t) => s in h ? g(h, s, { enumerable: !0, configurable: !0, writable: !0, value: t }) : h[s] = t;
|
|
3
|
+
var n = (h, s, t) => p(h, typeof s != "symbol" ? s + "" : s, t);
|
|
4
|
+
import { b as k, e as w, s as f, T as y, W as S, a as b } from "./event-bus-h26clqbZ.js";
|
|
5
5
|
import { c as A, g as T, l as B, p as P, u as N } from "./event-bus-h26clqbZ.js";
|
|
6
6
|
/**
|
|
7
7
|
* @license
|
|
@@ -11,9 +11,9 @@ import { c as A, g as T, l as B, p as P, u as N } from "./event-bus-h26clqbZ.js"
|
|
|
11
11
|
class x {
|
|
12
12
|
constructor(s) {
|
|
13
13
|
n(this, "runtimeUrl");
|
|
14
|
-
n(this, "
|
|
14
|
+
n(this, "appId");
|
|
15
15
|
n(this, "getToken");
|
|
16
|
-
this.runtimeUrl = s.runtimeUrl.replace(/\/$/, ""), this.
|
|
16
|
+
this.runtimeUrl = s.runtimeUrl.replace(/\/$/, ""), this.appId = s.appId, this.getToken = s.getToken;
|
|
17
17
|
}
|
|
18
18
|
async authHeaders() {
|
|
19
19
|
const s = {};
|
|
@@ -29,11 +29,11 @@ class x {
|
|
|
29
29
|
async *chatStream(s, t) {
|
|
30
30
|
const e = `${this.runtimeUrl}/chat`, a = {
|
|
31
31
|
message: s,
|
|
32
|
-
|
|
32
|
+
app_id: this.appId
|
|
33
33
|
};
|
|
34
34
|
t != null && t.sessionId && (a.session_id = t.sessionId), t != null && t.context && (a.context = t.context);
|
|
35
35
|
const o = await this.authHeaders();
|
|
36
|
-
yield*
|
|
36
|
+
yield* k(e, a, {
|
|
37
37
|
signal: t == null ? void 0 : t.signal,
|
|
38
38
|
headers: o
|
|
39
39
|
});
|
|
@@ -44,9 +44,9 @@ class x {
|
|
|
44
44
|
async startTask(s, t) {
|
|
45
45
|
const e = `${this.runtimeUrl}/task`, a = await this.authHeaders(), o = {
|
|
46
46
|
prompt: s,
|
|
47
|
-
|
|
47
|
+
app_id: this.appId
|
|
48
48
|
};
|
|
49
|
-
t && (o.
|
|
49
|
+
t && (o.app_token = t);
|
|
50
50
|
const l = await fetch(e, {
|
|
51
51
|
method: "POST",
|
|
52
52
|
headers: { "Content-Type": "application/json", ...a },
|
|
@@ -488,7 +488,7 @@ export {
|
|
|
488
488
|
B as listSessions,
|
|
489
489
|
P as parseSSELine,
|
|
490
490
|
f as streamChat,
|
|
491
|
-
|
|
491
|
+
k as streamSSE,
|
|
492
492
|
w as streamSSEGet,
|
|
493
493
|
N as updateSession
|
|
494
494
|
};
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sources":["../src/client/runtime-client.ts","../src/client/ChatStream.ts","../src/client/ChatClient.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport type { SSEEvent, TaskStatus, StoreDefinitionInfo, StoreListResult, StoreDocumentResult } from '../types';\nimport { streamSSE, streamSSEGet } from './sse-client';\n\nexport interface RuntimeClientOptions {\n runtimeUrl: string;\n tenantId: string;\n getToken?: () => string | Promise<string> | null | undefined;\n}\n\n/**\n * Client for the Amodal runtime's repo routes.\n * Targets POST /chat, POST /task, GET /task/:id, GET /task/:id/stream.\n */\nexport class RuntimeClient {\n private readonly runtimeUrl: string;\n private readonly tenantId: string;\n private readonly getToken?: () => string | Promise<string> | null | undefined;\n\n constructor(options: RuntimeClientOptions) {\n this.runtimeUrl = options.runtimeUrl.replace(/\\/$/, '');\n this.tenantId = options.tenantId;\n this.getToken = options.getToken;\n }\n\n private async authHeaders(): Promise<Record<string, string>> {\n const headers: Record<string, string> = {};\n if (this.getToken) {\n const token = await this.getToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n }\n return headers;\n }\n\n /**\n * Stream a chat message via POST /chat.\n */\n async *chatStream(\n message: string,\n options?: {\n sessionId?: string;\n context?: Record<string, unknown>;\n signal?: AbortSignal;\n },\n ): AsyncGenerator<SSEEvent> {\n const url = `${this.runtimeUrl}/chat`;\n const body: Record<string, unknown> = {\n message,\n tenant_id: this.tenantId,\n };\n if (options?.sessionId) {\n body['session_id'] = options.sessionId;\n }\n if (options?.context) {\n body['context'] = options.context;\n }\n\n const headers = await this.authHeaders();\n\n yield* streamSSE(url, body, {\n signal: options?.signal,\n headers,\n });\n }\n\n /**\n * Start a fire-and-forget task via POST /task.\n */\n async startTask(\n prompt: string,\n tenantToken?: string,\n ): Promise<{ task_id: string }> {\n const url = `${this.runtimeUrl}/task`;\n const headers = await this.authHeaders();\n\n const body: Record<string, unknown> = {\n prompt,\n tenant_id: this.tenantId,\n };\n if (tenantToken) {\n body['tenant_token'] = tenantToken;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new Error(`Start task failed: ${String(response.status)} ${response.statusText}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as { task_id: string };\n }\n\n /**\n * Get task status via GET /task/:id.\n */\n async getTaskStatus(taskId: string): Promise<TaskStatus> {\n const url = `${this.runtimeUrl}/task/${taskId}`;\n const headers = await this.authHeaders();\n\n const response = await fetch(url, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Get task status failed: ${String(response.status)} ${response.statusText}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as TaskStatus;\n }\n\n /**\n * Stream task events via GET /task/:id/stream.\n */\n async *streamTask(\n taskId: string,\n signal?: AbortSignal,\n ): AsyncGenerator<SSEEvent> {\n const url = `${this.runtimeUrl}/task/${taskId}/stream`;\n const headers = await this.authHeaders();\n\n yield* streamSSEGet(url, { signal, headers });\n }\n\n // ---------------------------------------------------------------------------\n // Store API\n // ---------------------------------------------------------------------------\n\n /**\n * List all store definitions with document counts.\n */\n async getStores(signal?: AbortSignal): Promise<StoreDefinitionInfo[]> {\n const url = `${this.runtimeUrl}/api/stores`;\n const headers = await this.authHeaders();\n\n const response = await fetch(url, { headers, signal });\n if (!response.ok) {\n throw new Error(`Failed to fetch stores: ${String(response.status)}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n const body = (await response.json()) as { stores: StoreDefinitionInfo[] };\n return body.stores;\n }\n\n /**\n * List documents from a store with optional filtering.\n */\n async getStoreDocuments(\n storeName: string,\n options?: {\n filter?: Record<string, unknown>;\n sort?: string;\n limit?: number;\n offset?: number;\n signal?: AbortSignal;\n },\n ): Promise<StoreListResult> {\n const params = new URLSearchParams();\n if (options?.filter) {\n params.set('filter', JSON.stringify(options.filter));\n }\n if (options?.sort) {\n params.set('sort', options.sort);\n }\n if (options?.limit !== undefined) {\n params.set('limit', String(options.limit));\n }\n if (options?.offset !== undefined) {\n params.set('offset', String(options.offset));\n }\n\n const qs = params.toString();\n const url = `${this.runtimeUrl}/api/stores/${storeName}${qs ? `?${qs}` : ''}`;\n const headers = await this.authHeaders();\n\n const response = await fetch(url, { headers, signal: options?.signal });\n if (!response.ok) {\n throw new Error(`Failed to fetch store documents: ${String(response.status)}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as StoreListResult;\n }\n\n /**\n * Get a single document by key, optionally with version history.\n */\n async getStoreDocument(\n storeName: string,\n key: string,\n signal?: AbortSignal,\n ): Promise<StoreDocumentResult> {\n const url = `${this.runtimeUrl}/api/stores/${storeName}/${encodeURIComponent(key)}`;\n const headers = await this.authHeaders();\n\n const response = await fetch(url, { headers, signal });\n if (!response.ok) {\n if (response.status === 404) {\n return { document: null, history: [] };\n }\n throw new Error(`Failed to fetch store document: ${String(response.status)}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as StoreDocumentResult;\n }\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport type {\n SSEEvent,\n ToolCallInfo,\n KBProposalInfo,\n AskUserQuestion,\n} from '../types';\nimport type { ChatStreamRequest } from './chat-api';\nimport { streamChat } from './chat-api';\n\n/**\n * Full response from a completed chat stream.\n */\nexport interface ChatResponse {\n text: string;\n toolCalls: ToolCallInfo[];\n skillsUsed: string[];\n kbProposals: KBProposalInfo[];\n}\n\ntype StreamEventHandler<T> = (data: T) => void;\n\n/**\n * A streaming chat response handle.\n * Register `.on()` handlers then the stream starts automatically.\n */\nexport class ChatStream {\n private handlers: {\n text: Array<StreamEventHandler<{ text: string }>>;\n tool_call: Array<StreamEventHandler<{ tool: string; params: Record<string, unknown>; toolId: string }>>;\n tool_result: Array<StreamEventHandler<{ tool: string; data: unknown; duration_ms?: number; toolId: string }>>;\n skill_activated: Array<StreamEventHandler<{ name: string }>>;\n kb_proposal: Array<StreamEventHandler<KBProposalInfo>>;\n widget: Array<StreamEventHandler<{ widgetType: string; data: Record<string, unknown> }>>;\n ask_user: Array<StreamEventHandler<{ askId: string; questions: AskUserQuestion[] }>>;\n error: Array<StreamEventHandler<{ message: string }>>;\n done: Array<StreamEventHandler<ChatResponse>>;\n } = {\n text: [],\n tool_call: [],\n tool_result: [],\n skill_activated: [],\n kb_proposal: [],\n widget: [],\n ask_user: [],\n error: [],\n done: [],\n };\n\n private abortController: AbortController;\n private started = false;\n private response: ChatResponse = {\n text: '',\n toolCalls: [],\n skillsUsed: [],\n kbProposals: [],\n };\n private toolCallNames = new Map<string, string>();\n\n private token?: string;\n\n constructor(\n private serverUrl: string,\n private request: ChatStreamRequest,\n token?: string,\n ) {\n this.abortController = new AbortController();\n this.token = token;\n // Start on next microtick so .on() calls can register first\n queueMicrotask(() => this.start());\n }\n\n on(event: 'text', handler: StreamEventHandler<{ text: string }>): this;\n on(event: 'tool_call', handler: StreamEventHandler<{ tool: string; params: Record<string, unknown>; toolId: string }>): this;\n on(event: 'tool_result', handler: StreamEventHandler<{ tool: string; data: unknown; duration_ms?: number; toolId: string }>): this;\n on(event: 'skill_activated', handler: StreamEventHandler<{ name: string }>): this;\n on(event: 'kb_proposal', handler: StreamEventHandler<KBProposalInfo>): this;\n on(event: 'widget', handler: StreamEventHandler<{ widgetType: string; data: Record<string, unknown> }>): this;\n on(event: 'ask_user', handler: StreamEventHandler<{ askId: string; questions: AskUserQuestion[] }>): this;\n on(event: 'error', handler: StreamEventHandler<{ message: string }>): this;\n on(event: 'done', handler: StreamEventHandler<ChatResponse>): this;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- overload implementation requires broad type\n on(event: string, handler: StreamEventHandler<any>): this {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- overload dispatch key narrowing\n const key = event as keyof typeof this.handlers;\n if (key in this.handlers) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- overload dispatch\n (this.handlers[key] as Array<StreamEventHandler<unknown>>).push(handler);\n }\n return this;\n }\n\n /** Cancel the stream. */\n abort(): void {\n this.abortController.abort();\n }\n\n private async start(): Promise<void> {\n if (this.started) return;\n this.started = true;\n\n try {\n const stream = streamChat(\n this.serverUrl,\n this.request,\n this.abortController.signal,\n this.token,\n );\n\n for await (const event of stream) {\n this.processEvent(event);\n }\n\n // Emit done\n for (const handler of this.handlers.done) {\n handler(this.response);\n }\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n for (const handler of this.handlers.error) {\n handler({ message });\n }\n }\n }\n }\n\n private processEvent(event: SSEEvent): void {\n switch (event.type) {\n case 'text_delta':\n this.response.text += event.content;\n for (const handler of this.handlers.text) {\n handler({ text: event.content });\n }\n break;\n case 'tool_call_start':\n this.toolCallNames.set(event.tool_id, event.tool_name);\n for (const handler of this.handlers.tool_call) {\n handler({ tool: event.tool_name, params: event.parameters, toolId: event.tool_id });\n }\n this.response.toolCalls.push({\n toolId: event.tool_id,\n toolName: event.tool_name,\n parameters: event.parameters,\n status: 'running',\n });\n break;\n case 'tool_call_result': {\n const toolName = this.toolCallNames.get(event.tool_id) ?? '';\n for (const handler of this.handlers.tool_result) {\n handler({ tool: toolName, data: event.result, duration_ms: event.duration_ms, toolId: event.tool_id });\n }\n // Update status in response\n const tc = this.response.toolCalls.find((t) => t.toolId === event.tool_id);\n if (tc) {\n tc.status = event.status;\n tc.result = event.result;\n tc.duration_ms = event.duration_ms;\n tc.error = event.error;\n }\n break;\n }\n case 'skill_activated':\n this.response.skillsUsed.push(event.skill);\n for (const handler of this.handlers.skill_activated) {\n handler({ name: event.skill });\n }\n break;\n case 'kb_proposal': {\n const proposal: KBProposalInfo = {\n scope: event.scope,\n title: event.title,\n reasoning: event.reasoning,\n };\n this.response.kbProposals.push(proposal);\n for (const handler of this.handlers.kb_proposal) {\n handler(proposal);\n }\n break;\n }\n case 'ask_user':\n for (const handler of this.handlers.ask_user) {\n handler({ askId: event.ask_id, questions: event.questions });\n }\n break;\n case 'widget':\n for (const handler of this.handlers.widget) {\n handler({ widgetType: event.widget_type, data: event.data });\n }\n break;\n case 'error':\n for (const handler of this.handlers.error) {\n handler({ message: event.message });\n }\n break;\n case 'init':\n case 'done':\n // Init handled by ChatClient, done triggers after loop\n break;\n default:\n break;\n }\n }\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { TypedEventEmitter } from './EventEmitter';\nimport { ChatStream } from './ChatStream';\nimport type { ChatResponse } from './ChatStream';\nimport { createSession, streamChat } from './chat-api';\nimport type { ChatUser, ChatMessage, AssistantTextMessage, ToolCallInfo, KBProposalInfo } from '../types';\nimport { WidgetEventBus } from '../events/event-bus';\nimport type { WidgetEvent, EntityExtractor, ToolExecutedEvent, SkillActivatedEvent, WidgetRenderedEvent, KBProposalEvent } from '../events/types';\n\n/**\n * Configuration for the ChatClient.\n */\nexport interface ChatClientConfig {\n serverUrl: string;\n user: ChatUser;\n /** Bearer token (API key or JWT) for authenticated requests. */\n token?: string;\n /** Custom entity extractors. If provided, replaces the default extractor. */\n entityExtractors?: EntityExtractor[];\n}\n\n/**\n * Events emitted by the ChatClient.\n */\nexport interface ClientEvents {\n connected: undefined;\n disconnected: undefined;\n reconnecting: number;\n message: ChatMessage;\n streaming_start: undefined;\n streaming_end: undefined;\n error: Error;\n tool_executed: ToolExecutedEvent;\n skill_activated: SkillActivatedEvent;\n widget_rendered: WidgetRenderedEvent;\n kb_proposal_received: KBProposalEvent;\n entity_referenced: WidgetEvent;\n}\n\nlet msgCounter = 0;\nfunction makeId(): string {\n msgCounter++;\n return `msg-${Date.now()}-${String(msgCounter)}`;\n}\n\n/**\n * Headless chat client for framework-agnostic integrations.\n * Manages session lifecycle, message history, and SSE streaming.\n */\nexport class ChatClient extends TypedEventEmitter<ClientEvents> {\n private config: ChatClientConfig;\n private sessionId: string | null = null;\n private _messages: ChatMessage[] = [];\n private _isConnected = false;\n private _isStreaming = false;\n private connectAttempt = 0;\n private maxReconnectAttempts = 3;\n private _eventBus: WidgetEventBus;\n\n constructor(config: ChatClientConfig) {\n super();\n this.config = config;\n this._eventBus = new WidgetEventBus();\n if (config.entityExtractors) {\n this._eventBus.setExtractors(config.entityExtractors);\n }\n // Forward entity_referenced events from bus to client events\n this._eventBus.on('entity_referenced', (e) => {\n this.emit('entity_referenced', e);\n });\n }\n\n /** The widget event bus. Subscribe to agent-driven events here. */\n get events(): WidgetEventBus {\n return this._eventBus;\n }\n\n /** Whether the client has an active session. */\n get isConnected(): boolean {\n return this._isConnected;\n }\n\n /** Whether a response is currently streaming. */\n get isStreaming(): boolean {\n return this._isStreaming;\n }\n\n /** Current session ID, or null if not connected. */\n getSessionId(): string | null {\n return this.sessionId;\n }\n\n /** Readonly message history. */\n get messages(): readonly ChatMessage[] {\n return this._messages;\n }\n\n /** Establish a session with the server. */\n async connect(): Promise<void> {\n try {\n const session = await createSession(\n this.config.serverUrl,\n this.config.user,\n this.config.token,\n );\n this.sessionId = session.session_id;\n this._isConnected = true;\n this.connectAttempt = 0;\n this.emit('connected', undefined);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.emit('error', error);\n throw error;\n }\n }\n\n /** Disconnect and clean up. */\n async disconnect(): Promise<void> {\n this.sessionId = null;\n this._isConnected = false;\n this._isStreaming = false;\n this.emit('disconnected', undefined);\n }\n\n /** Clear message history. */\n clearHistory(): void {\n this._messages = [];\n }\n\n /**\n * Send a message and wait for the full response.\n * Auto-connects if not already connected.\n */\n async send(text: string): Promise<ChatResponse> {\n if (!this._isConnected) {\n await this.connect();\n }\n\n // Add user message\n const userMsg: ChatMessage = {\n type: 'user',\n id: makeId(),\n text,\n timestamp: new Date().toISOString(),\n };\n this._messages.push(userMsg);\n this.emit('message', userMsg);\n\n // Create assistant message placeholder\n const assistantMsg: AssistantTextMessage = {\n type: 'assistant_text',\n id: makeId(),\n text: '',\n toolCalls: [],\n confirmations: [],\n skillActivations: [],\n kbProposals: [],\n widgets: [],\n contentBlocks: [],\n timestamp: new Date().toISOString(),\n };\n this._messages.push(assistantMsg);\n this.emit('message', assistantMsg);\n\n this._isStreaming = true;\n this.emit('streaming_start', undefined);\n\n try {\n const response = await this.streamInternal(text, assistantMsg);\n return response;\n } catch (err) {\n // Try reconnection\n if (this.connectAttempt < this.maxReconnectAttempts) {\n return await this.reconnectAndRetry(text, assistantMsg);\n }\n throw err;\n } finally {\n this._isStreaming = false;\n this.emit('streaming_end', undefined);\n }\n }\n\n /**\n * Stream a message, returning a ChatStream handle for event-based consumption.\n */\n stream(text: string): ChatStream {\n // Add user message\n const userMsg: ChatMessage = {\n type: 'user',\n id: makeId(),\n text,\n timestamp: new Date().toISOString(),\n };\n this._messages.push(userMsg);\n this.emit('message', userMsg);\n\n this._isStreaming = true;\n this.emit('streaming_start', undefined);\n\n const chatStream = new ChatStream(this.config.serverUrl, {\n message: text,\n session_id: this.sessionId ?? undefined,\n role: this.config.user.role,\n }, this.config.token);\n\n // Track streaming state\n chatStream.on('done', (response) => {\n // Add assistant message to history\n const assistantMsg: AssistantTextMessage = {\n type: 'assistant_text',\n id: makeId(),\n text: response.text,\n toolCalls: response.toolCalls,\n confirmations: [],\n skillActivations: response.skillsUsed,\n kbProposals: response.kbProposals,\n widgets: [],\n contentBlocks: [],\n timestamp: new Date().toISOString(),\n };\n this._messages.push(assistantMsg);\n this.emit('message', assistantMsg);\n this._isStreaming = false;\n this.emit('streaming_end', undefined);\n });\n\n chatStream.on('error', (err) => {\n this._isStreaming = false;\n this.emit('streaming_end', undefined);\n this.emit('error', new Error(err.message));\n });\n\n return chatStream;\n }\n\n private async streamInternal(\n text: string,\n assistantMsg: AssistantTextMessage,\n ): Promise<ChatResponse> {\n const response: ChatResponse = {\n text: '',\n toolCalls: [],\n skillsUsed: [],\n kbProposals: [],\n };\n\n const pendingToolCalls = new Map<string, { toolName: string; parameters: Record<string, unknown> }>();\n\n const stream = streamChat(\n this.config.serverUrl,\n {\n message: text,\n session_id: this.sessionId ?? undefined,\n role: this.config.user.role,\n },\n undefined,\n this.config.token,\n );\n\n for await (const event of stream) {\n switch (event.type) {\n case 'init':\n this.sessionId = event.session_id;\n break;\n case 'text_delta':\n response.text += event.content;\n assistantMsg.text += event.content;\n break;\n case 'tool_call_start': {\n const tc: ToolCallInfo = {\n toolId: event.tool_id,\n toolName: event.tool_name,\n parameters: event.parameters,\n status: 'running',\n };\n response.toolCalls.push(tc);\n assistantMsg.toolCalls = [...assistantMsg.toolCalls, tc];\n pendingToolCalls.set(event.tool_id, {\n toolName: event.tool_name,\n parameters: event.parameters,\n });\n break;\n }\n case 'tool_call_result': {\n const existing = response.toolCalls.find((t) => t.toolId === event.tool_id);\n if (existing) {\n existing.status = event.status;\n existing.result = event.result;\n existing.duration_ms = event.duration_ms;\n existing.error = event.error;\n }\n assistantMsg.toolCalls = assistantMsg.toolCalls.map((t) =>\n t.toolId === event.tool_id\n ? { ...t, status: event.status, result: event.result, duration_ms: event.duration_ms, error: event.error }\n : t,\n );\n\n const pending = pendingToolCalls.get(event.tool_id);\n pendingToolCalls.delete(event.tool_id);\n const toolEvent: ToolExecutedEvent = {\n type: 'tool_executed',\n toolName: pending?.toolName ?? '',\n toolId: event.tool_id,\n parameters: pending?.parameters ?? {},\n status: event.status,\n result: event.result,\n duration_ms: event.duration_ms,\n error: event.error,\n timestamp: event.timestamp,\n };\n this._eventBus.processEvent(toolEvent);\n this.emit('tool_executed', toolEvent);\n break;\n }\n case 'skill_activated': {\n response.skillsUsed.push(event.skill);\n assistantMsg.skillActivations = [...assistantMsg.skillActivations, event.skill];\n const skillEvent: SkillActivatedEvent = {\n type: 'skill_activated',\n skill: event.skill,\n timestamp: event.timestamp,\n };\n this._eventBus.processEvent(skillEvent);\n this.emit('skill_activated', skillEvent);\n break;\n }\n case 'kb_proposal': {\n const proposal: KBProposalInfo = {\n scope: event.scope,\n title: event.title,\n reasoning: event.reasoning,\n };\n response.kbProposals.push(proposal);\n assistantMsg.kbProposals = [...assistantMsg.kbProposals, proposal];\n const kbEvent: KBProposalEvent = {\n type: 'kb_proposal',\n proposal,\n timestamp: event.timestamp,\n };\n this._eventBus.processEvent(kbEvent);\n this.emit('kb_proposal_received', kbEvent);\n break;\n }\n case 'widget': {\n const widgetEvent: WidgetRenderedEvent = {\n type: 'widget_rendered',\n widgetType: event.widget_type,\n data: event.data,\n timestamp: event.timestamp,\n };\n this._eventBus.processEvent(widgetEvent);\n this.emit('widget_rendered', widgetEvent);\n break;\n }\n case 'error':\n throw new Error(event.message);\n case 'done':\n break;\n default:\n break;\n }\n }\n\n return response;\n }\n\n private async reconnectAndRetry(\n text: string,\n assistantMsg: AssistantTextMessage,\n ): Promise<ChatResponse> {\n this.connectAttempt++;\n this.emit('reconnecting', this.connectAttempt);\n\n // Exponential backoff: 100ms, 200ms, 400ms\n const delay = 100 * Math.pow(2, this.connectAttempt - 1);\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n try {\n await this.connect();\n return await this.streamInternal(text, assistantMsg);\n } catch (err) {\n if (this.connectAttempt < this.maxReconnectAttempts) {\n return this.reconnectAndRetry(text, assistantMsg);\n }\n throw err;\n }\n }\n}\n"],"names":["RuntimeClient","options","__publicField","headers","token","message","url","body","streamSSE","prompt","tenantToken","response","taskId","signal","streamSSEGet","storeName","params","qs","key","ChatStream","serverUrl","request","event","handler","stream","streamChat","err","toolName","tc","t","proposal","msgCounter","makeId","ChatClient","TypedEventEmitter","config","WidgetEventBus","session","createSession","error","text","userMsg","assistantMsg","chatStream","pendingToolCalls","existing","pending","toolEvent","skillEvent","kbEvent","widgetEvent","delay","resolve"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sources":["../src/client/runtime-client.ts","../src/client/ChatStream.ts","../src/client/ChatClient.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport type { SSEEvent, TaskStatus, StoreDefinitionInfo, StoreListResult, StoreDocumentResult } from '../types';\nimport { streamSSE, streamSSEGet } from './sse-client';\n\nexport interface RuntimeClientOptions {\n runtimeUrl: string;\n appId: string;\n getToken?: () => string | Promise<string> | null | undefined;\n}\n\n/**\n * Client for the Amodal runtime's repo routes.\n * Targets POST /chat, POST /task, GET /task/:id, GET /task/:id/stream.\n */\nexport class RuntimeClient {\n private readonly runtimeUrl: string;\n private readonly appId: string;\n private readonly getToken?: () => string | Promise<string> | null | undefined;\n\n constructor(options: RuntimeClientOptions) {\n this.runtimeUrl = options.runtimeUrl.replace(/\\/$/, '');\n this.appId = options.appId;\n this.getToken = options.getToken;\n }\n\n private async authHeaders(): Promise<Record<string, string>> {\n const headers: Record<string, string> = {};\n if (this.getToken) {\n const token = await this.getToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n }\n return headers;\n }\n\n /**\n * Stream a chat message via POST /chat.\n */\n async *chatStream(\n message: string,\n options?: {\n sessionId?: string;\n context?: Record<string, unknown>;\n signal?: AbortSignal;\n },\n ): AsyncGenerator<SSEEvent> {\n const url = `${this.runtimeUrl}/chat`;\n const body: Record<string, unknown> = {\n message,\n app_id: this.appId,\n };\n if (options?.sessionId) {\n body['session_id'] = options.sessionId;\n }\n if (options?.context) {\n body['context'] = options.context;\n }\n\n const headers = await this.authHeaders();\n\n yield* streamSSE(url, body, {\n signal: options?.signal,\n headers,\n });\n }\n\n /**\n * Start a fire-and-forget task via POST /task.\n */\n async startTask(\n prompt: string,\n appToken?: string,\n ): Promise<{ task_id: string }> {\n const url = `${this.runtimeUrl}/task`;\n const headers = await this.authHeaders();\n\n const body: Record<string, unknown> = {\n prompt,\n app_id: this.appId,\n };\n if (appToken) {\n body['app_token'] = appToken;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new Error(`Start task failed: ${String(response.status)} ${response.statusText}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as { task_id: string };\n }\n\n /**\n * Get task status via GET /task/:id.\n */\n async getTaskStatus(taskId: string): Promise<TaskStatus> {\n const url = `${this.runtimeUrl}/task/${taskId}`;\n const headers = await this.authHeaders();\n\n const response = await fetch(url, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Get task status failed: ${String(response.status)} ${response.statusText}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as TaskStatus;\n }\n\n /**\n * Stream task events via GET /task/:id/stream.\n */\n async *streamTask(\n taskId: string,\n signal?: AbortSignal,\n ): AsyncGenerator<SSEEvent> {\n const url = `${this.runtimeUrl}/task/${taskId}/stream`;\n const headers = await this.authHeaders();\n\n yield* streamSSEGet(url, { signal, headers });\n }\n\n // ---------------------------------------------------------------------------\n // Store API\n // ---------------------------------------------------------------------------\n\n /**\n * List all store definitions with document counts.\n */\n async getStores(signal?: AbortSignal): Promise<StoreDefinitionInfo[]> {\n const url = `${this.runtimeUrl}/api/stores`;\n const headers = await this.authHeaders();\n\n const response = await fetch(url, { headers, signal });\n if (!response.ok) {\n throw new Error(`Failed to fetch stores: ${String(response.status)}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n const body = (await response.json()) as { stores: StoreDefinitionInfo[] };\n return body.stores;\n }\n\n /**\n * List documents from a store with optional filtering.\n */\n async getStoreDocuments(\n storeName: string,\n options?: {\n filter?: Record<string, unknown>;\n sort?: string;\n limit?: number;\n offset?: number;\n signal?: AbortSignal;\n },\n ): Promise<StoreListResult> {\n const params = new URLSearchParams();\n if (options?.filter) {\n params.set('filter', JSON.stringify(options.filter));\n }\n if (options?.sort) {\n params.set('sort', options.sort);\n }\n if (options?.limit !== undefined) {\n params.set('limit', String(options.limit));\n }\n if (options?.offset !== undefined) {\n params.set('offset', String(options.offset));\n }\n\n const qs = params.toString();\n const url = `${this.runtimeUrl}/api/stores/${storeName}${qs ? `?${qs}` : ''}`;\n const headers = await this.authHeaders();\n\n const response = await fetch(url, { headers, signal: options?.signal });\n if (!response.ok) {\n throw new Error(`Failed to fetch store documents: ${String(response.status)}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as StoreListResult;\n }\n\n /**\n * Get a single document by key, optionally with version history.\n */\n async getStoreDocument(\n storeName: string,\n key: string,\n signal?: AbortSignal,\n ): Promise<StoreDocumentResult> {\n const url = `${this.runtimeUrl}/api/stores/${storeName}/${encodeURIComponent(key)}`;\n const headers = await this.authHeaders();\n\n const response = await fetch(url, { headers, signal });\n if (!response.ok) {\n if (response.status === 404) {\n return { document: null, history: [] };\n }\n throw new Error(`Failed to fetch store document: ${String(response.status)}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as StoreDocumentResult;\n }\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport type {\n SSEEvent,\n ToolCallInfo,\n KBProposalInfo,\n AskUserQuestion,\n} from '../types';\nimport type { ChatStreamRequest } from './chat-api';\nimport { streamChat } from './chat-api';\n\n/**\n * Full response from a completed chat stream.\n */\nexport interface ChatResponse {\n text: string;\n toolCalls: ToolCallInfo[];\n skillsUsed: string[];\n kbProposals: KBProposalInfo[];\n}\n\ntype StreamEventHandler<T> = (data: T) => void;\n\n/**\n * A streaming chat response handle.\n * Register `.on()` handlers then the stream starts automatically.\n */\nexport class ChatStream {\n private handlers: {\n text: Array<StreamEventHandler<{ text: string }>>;\n tool_call: Array<StreamEventHandler<{ tool: string; params: Record<string, unknown>; toolId: string }>>;\n tool_result: Array<StreamEventHandler<{ tool: string; data: unknown; duration_ms?: number; toolId: string }>>;\n skill_activated: Array<StreamEventHandler<{ name: string }>>;\n kb_proposal: Array<StreamEventHandler<KBProposalInfo>>;\n widget: Array<StreamEventHandler<{ widgetType: string; data: Record<string, unknown> }>>;\n ask_user: Array<StreamEventHandler<{ askId: string; questions: AskUserQuestion[] }>>;\n error: Array<StreamEventHandler<{ message: string }>>;\n done: Array<StreamEventHandler<ChatResponse>>;\n } = {\n text: [],\n tool_call: [],\n tool_result: [],\n skill_activated: [],\n kb_proposal: [],\n widget: [],\n ask_user: [],\n error: [],\n done: [],\n };\n\n private abortController: AbortController;\n private started = false;\n private response: ChatResponse = {\n text: '',\n toolCalls: [],\n skillsUsed: [],\n kbProposals: [],\n };\n private toolCallNames = new Map<string, string>();\n\n private token?: string;\n\n constructor(\n private serverUrl: string,\n private request: ChatStreamRequest,\n token?: string,\n ) {\n this.abortController = new AbortController();\n this.token = token;\n // Start on next microtick so .on() calls can register first\n queueMicrotask(() => this.start());\n }\n\n on(event: 'text', handler: StreamEventHandler<{ text: string }>): this;\n on(event: 'tool_call', handler: StreamEventHandler<{ tool: string; params: Record<string, unknown>; toolId: string }>): this;\n on(event: 'tool_result', handler: StreamEventHandler<{ tool: string; data: unknown; duration_ms?: number; toolId: string }>): this;\n on(event: 'skill_activated', handler: StreamEventHandler<{ name: string }>): this;\n on(event: 'kb_proposal', handler: StreamEventHandler<KBProposalInfo>): this;\n on(event: 'widget', handler: StreamEventHandler<{ widgetType: string; data: Record<string, unknown> }>): this;\n on(event: 'ask_user', handler: StreamEventHandler<{ askId: string; questions: AskUserQuestion[] }>): this;\n on(event: 'error', handler: StreamEventHandler<{ message: string }>): this;\n on(event: 'done', handler: StreamEventHandler<ChatResponse>): this;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- overload implementation requires broad type\n on(event: string, handler: StreamEventHandler<any>): this {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- overload dispatch key narrowing\n const key = event as keyof typeof this.handlers;\n if (key in this.handlers) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- overload dispatch\n (this.handlers[key] as Array<StreamEventHandler<unknown>>).push(handler);\n }\n return this;\n }\n\n /** Cancel the stream. */\n abort(): void {\n this.abortController.abort();\n }\n\n private async start(): Promise<void> {\n if (this.started) return;\n this.started = true;\n\n try {\n const stream = streamChat(\n this.serverUrl,\n this.request,\n this.abortController.signal,\n this.token,\n );\n\n for await (const event of stream) {\n this.processEvent(event);\n }\n\n // Emit done\n for (const handler of this.handlers.done) {\n handler(this.response);\n }\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n for (const handler of this.handlers.error) {\n handler({ message });\n }\n }\n }\n }\n\n private processEvent(event: SSEEvent): void {\n switch (event.type) {\n case 'text_delta':\n this.response.text += event.content;\n for (const handler of this.handlers.text) {\n handler({ text: event.content });\n }\n break;\n case 'tool_call_start':\n this.toolCallNames.set(event.tool_id, event.tool_name);\n for (const handler of this.handlers.tool_call) {\n handler({ tool: event.tool_name, params: event.parameters, toolId: event.tool_id });\n }\n this.response.toolCalls.push({\n toolId: event.tool_id,\n toolName: event.tool_name,\n parameters: event.parameters,\n status: 'running',\n });\n break;\n case 'tool_call_result': {\n const toolName = this.toolCallNames.get(event.tool_id) ?? '';\n for (const handler of this.handlers.tool_result) {\n handler({ tool: toolName, data: event.result, duration_ms: event.duration_ms, toolId: event.tool_id });\n }\n // Update status in response\n const tc = this.response.toolCalls.find((t) => t.toolId === event.tool_id);\n if (tc) {\n tc.status = event.status;\n tc.result = event.result;\n tc.duration_ms = event.duration_ms;\n tc.error = event.error;\n }\n break;\n }\n case 'skill_activated':\n this.response.skillsUsed.push(event.skill);\n for (const handler of this.handlers.skill_activated) {\n handler({ name: event.skill });\n }\n break;\n case 'kb_proposal': {\n const proposal: KBProposalInfo = {\n scope: event.scope,\n title: event.title,\n reasoning: event.reasoning,\n };\n this.response.kbProposals.push(proposal);\n for (const handler of this.handlers.kb_proposal) {\n handler(proposal);\n }\n break;\n }\n case 'ask_user':\n for (const handler of this.handlers.ask_user) {\n handler({ askId: event.ask_id, questions: event.questions });\n }\n break;\n case 'widget':\n for (const handler of this.handlers.widget) {\n handler({ widgetType: event.widget_type, data: event.data });\n }\n break;\n case 'error':\n for (const handler of this.handlers.error) {\n handler({ message: event.message });\n }\n break;\n case 'init':\n case 'done':\n // Init handled by ChatClient, done triggers after loop\n break;\n default:\n break;\n }\n }\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { TypedEventEmitter } from './EventEmitter';\nimport { ChatStream } from './ChatStream';\nimport type { ChatResponse } from './ChatStream';\nimport { createSession, streamChat } from './chat-api';\nimport type { ChatUser, ChatMessage, AssistantTextMessage, ToolCallInfo, KBProposalInfo } from '../types';\nimport { WidgetEventBus } from '../events/event-bus';\nimport type { WidgetEvent, EntityExtractor, ToolExecutedEvent, SkillActivatedEvent, WidgetRenderedEvent, KBProposalEvent } from '../events/types';\n\n/**\n * Configuration for the ChatClient.\n */\nexport interface ChatClientConfig {\n serverUrl: string;\n user: ChatUser;\n /** Bearer token (API key or JWT) for authenticated requests. */\n token?: string;\n /** Custom entity extractors. If provided, replaces the default extractor. */\n entityExtractors?: EntityExtractor[];\n}\n\n/**\n * Events emitted by the ChatClient.\n */\nexport interface ClientEvents {\n connected: undefined;\n disconnected: undefined;\n reconnecting: number;\n message: ChatMessage;\n streaming_start: undefined;\n streaming_end: undefined;\n error: Error;\n tool_executed: ToolExecutedEvent;\n skill_activated: SkillActivatedEvent;\n widget_rendered: WidgetRenderedEvent;\n kb_proposal_received: KBProposalEvent;\n entity_referenced: WidgetEvent;\n}\n\nlet msgCounter = 0;\nfunction makeId(): string {\n msgCounter++;\n return `msg-${Date.now()}-${String(msgCounter)}`;\n}\n\n/**\n * Headless chat client for framework-agnostic integrations.\n * Manages session lifecycle, message history, and SSE streaming.\n */\nexport class ChatClient extends TypedEventEmitter<ClientEvents> {\n private config: ChatClientConfig;\n private sessionId: string | null = null;\n private _messages: ChatMessage[] = [];\n private _isConnected = false;\n private _isStreaming = false;\n private connectAttempt = 0;\n private maxReconnectAttempts = 3;\n private _eventBus: WidgetEventBus;\n\n constructor(config: ChatClientConfig) {\n super();\n this.config = config;\n this._eventBus = new WidgetEventBus();\n if (config.entityExtractors) {\n this._eventBus.setExtractors(config.entityExtractors);\n }\n // Forward entity_referenced events from bus to client events\n this._eventBus.on('entity_referenced', (e) => {\n this.emit('entity_referenced', e);\n });\n }\n\n /** The widget event bus. Subscribe to agent-driven events here. */\n get events(): WidgetEventBus {\n return this._eventBus;\n }\n\n /** Whether the client has an active session. */\n get isConnected(): boolean {\n return this._isConnected;\n }\n\n /** Whether a response is currently streaming. */\n get isStreaming(): boolean {\n return this._isStreaming;\n }\n\n /** Current session ID, or null if not connected. */\n getSessionId(): string | null {\n return this.sessionId;\n }\n\n /** Readonly message history. */\n get messages(): readonly ChatMessage[] {\n return this._messages;\n }\n\n /** Establish a session with the server. */\n async connect(): Promise<void> {\n try {\n const session = await createSession(\n this.config.serverUrl,\n this.config.user,\n this.config.token,\n );\n this.sessionId = session.session_id;\n this._isConnected = true;\n this.connectAttempt = 0;\n this.emit('connected', undefined);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.emit('error', error);\n throw error;\n }\n }\n\n /** Disconnect and clean up. */\n async disconnect(): Promise<void> {\n this.sessionId = null;\n this._isConnected = false;\n this._isStreaming = false;\n this.emit('disconnected', undefined);\n }\n\n /** Clear message history. */\n clearHistory(): void {\n this._messages = [];\n }\n\n /**\n * Send a message and wait for the full response.\n * Auto-connects if not already connected.\n */\n async send(text: string): Promise<ChatResponse> {\n if (!this._isConnected) {\n await this.connect();\n }\n\n // Add user message\n const userMsg: ChatMessage = {\n type: 'user',\n id: makeId(),\n text,\n timestamp: new Date().toISOString(),\n };\n this._messages.push(userMsg);\n this.emit('message', userMsg);\n\n // Create assistant message placeholder\n const assistantMsg: AssistantTextMessage = {\n type: 'assistant_text',\n id: makeId(),\n text: '',\n toolCalls: [],\n confirmations: [],\n skillActivations: [],\n kbProposals: [],\n widgets: [],\n contentBlocks: [],\n timestamp: new Date().toISOString(),\n };\n this._messages.push(assistantMsg);\n this.emit('message', assistantMsg);\n\n this._isStreaming = true;\n this.emit('streaming_start', undefined);\n\n try {\n const response = await this.streamInternal(text, assistantMsg);\n return response;\n } catch (err) {\n // Try reconnection\n if (this.connectAttempt < this.maxReconnectAttempts) {\n return await this.reconnectAndRetry(text, assistantMsg);\n }\n throw err;\n } finally {\n this._isStreaming = false;\n this.emit('streaming_end', undefined);\n }\n }\n\n /**\n * Stream a message, returning a ChatStream handle for event-based consumption.\n */\n stream(text: string): ChatStream {\n // Add user message\n const userMsg: ChatMessage = {\n type: 'user',\n id: makeId(),\n text,\n timestamp: new Date().toISOString(),\n };\n this._messages.push(userMsg);\n this.emit('message', userMsg);\n\n this._isStreaming = true;\n this.emit('streaming_start', undefined);\n\n const chatStream = new ChatStream(this.config.serverUrl, {\n message: text,\n session_id: this.sessionId ?? undefined,\n role: this.config.user.role,\n }, this.config.token);\n\n // Track streaming state\n chatStream.on('done', (response) => {\n // Add assistant message to history\n const assistantMsg: AssistantTextMessage = {\n type: 'assistant_text',\n id: makeId(),\n text: response.text,\n toolCalls: response.toolCalls,\n confirmations: [],\n skillActivations: response.skillsUsed,\n kbProposals: response.kbProposals,\n widgets: [],\n contentBlocks: [],\n timestamp: new Date().toISOString(),\n };\n this._messages.push(assistantMsg);\n this.emit('message', assistantMsg);\n this._isStreaming = false;\n this.emit('streaming_end', undefined);\n });\n\n chatStream.on('error', (err) => {\n this._isStreaming = false;\n this.emit('streaming_end', undefined);\n this.emit('error', new Error(err.message));\n });\n\n return chatStream;\n }\n\n private async streamInternal(\n text: string,\n assistantMsg: AssistantTextMessage,\n ): Promise<ChatResponse> {\n const response: ChatResponse = {\n text: '',\n toolCalls: [],\n skillsUsed: [],\n kbProposals: [],\n };\n\n const pendingToolCalls = new Map<string, { toolName: string; parameters: Record<string, unknown> }>();\n\n const stream = streamChat(\n this.config.serverUrl,\n {\n message: text,\n session_id: this.sessionId ?? undefined,\n role: this.config.user.role,\n },\n undefined,\n this.config.token,\n );\n\n for await (const event of stream) {\n switch (event.type) {\n case 'init':\n this.sessionId = event.session_id;\n break;\n case 'text_delta':\n response.text += event.content;\n assistantMsg.text += event.content;\n break;\n case 'tool_call_start': {\n const tc: ToolCallInfo = {\n toolId: event.tool_id,\n toolName: event.tool_name,\n parameters: event.parameters,\n status: 'running',\n };\n response.toolCalls.push(tc);\n assistantMsg.toolCalls = [...assistantMsg.toolCalls, tc];\n pendingToolCalls.set(event.tool_id, {\n toolName: event.tool_name,\n parameters: event.parameters,\n });\n break;\n }\n case 'tool_call_result': {\n const existing = response.toolCalls.find((t) => t.toolId === event.tool_id);\n if (existing) {\n existing.status = event.status;\n existing.result = event.result;\n existing.duration_ms = event.duration_ms;\n existing.error = event.error;\n }\n assistantMsg.toolCalls = assistantMsg.toolCalls.map((t) =>\n t.toolId === event.tool_id\n ? { ...t, status: event.status, result: event.result, duration_ms: event.duration_ms, error: event.error }\n : t,\n );\n\n const pending = pendingToolCalls.get(event.tool_id);\n pendingToolCalls.delete(event.tool_id);\n const toolEvent: ToolExecutedEvent = {\n type: 'tool_executed',\n toolName: pending?.toolName ?? '',\n toolId: event.tool_id,\n parameters: pending?.parameters ?? {},\n status: event.status,\n result: event.result,\n duration_ms: event.duration_ms,\n error: event.error,\n timestamp: event.timestamp,\n };\n this._eventBus.processEvent(toolEvent);\n this.emit('tool_executed', toolEvent);\n break;\n }\n case 'skill_activated': {\n response.skillsUsed.push(event.skill);\n assistantMsg.skillActivations = [...assistantMsg.skillActivations, event.skill];\n const skillEvent: SkillActivatedEvent = {\n type: 'skill_activated',\n skill: event.skill,\n timestamp: event.timestamp,\n };\n this._eventBus.processEvent(skillEvent);\n this.emit('skill_activated', skillEvent);\n break;\n }\n case 'kb_proposal': {\n const proposal: KBProposalInfo = {\n scope: event.scope,\n title: event.title,\n reasoning: event.reasoning,\n };\n response.kbProposals.push(proposal);\n assistantMsg.kbProposals = [...assistantMsg.kbProposals, proposal];\n const kbEvent: KBProposalEvent = {\n type: 'kb_proposal',\n proposal,\n timestamp: event.timestamp,\n };\n this._eventBus.processEvent(kbEvent);\n this.emit('kb_proposal_received', kbEvent);\n break;\n }\n case 'widget': {\n const widgetEvent: WidgetRenderedEvent = {\n type: 'widget_rendered',\n widgetType: event.widget_type,\n data: event.data,\n timestamp: event.timestamp,\n };\n this._eventBus.processEvent(widgetEvent);\n this.emit('widget_rendered', widgetEvent);\n break;\n }\n case 'error':\n throw new Error(event.message);\n case 'done':\n break;\n default:\n break;\n }\n }\n\n return response;\n }\n\n private async reconnectAndRetry(\n text: string,\n assistantMsg: AssistantTextMessage,\n ): Promise<ChatResponse> {\n this.connectAttempt++;\n this.emit('reconnecting', this.connectAttempt);\n\n // Exponential backoff: 100ms, 200ms, 400ms\n const delay = 100 * Math.pow(2, this.connectAttempt - 1);\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n try {\n await this.connect();\n return await this.streamInternal(text, assistantMsg);\n } catch (err) {\n if (this.connectAttempt < this.maxReconnectAttempts) {\n return this.reconnectAndRetry(text, assistantMsg);\n }\n throw err;\n }\n }\n}\n"],"names":["RuntimeClient","options","__publicField","headers","token","message","url","body","streamSSE","prompt","appToken","response","taskId","signal","streamSSEGet","storeName","params","qs","key","ChatStream","serverUrl","request","event","handler","stream","streamChat","err","toolName","tc","t","proposal","msgCounter","makeId","ChatClient","TypedEventEmitter","config","WidgetEventBus","session","createSession","error","text","userMsg","assistantMsg","chatStream","pendingToolCalls","existing","pending","toolEvent","skillEvent","kbEvent","widgetEvent","delay","resolve"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-bus-h26clqbZ.js","sources":["../src/client/sse-client.ts","../src/client/chat-api.ts","../src/client/EventEmitter.ts","../src/events/entity-extractor.ts","../src/events/event-bus.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport type { SSEEvent } from '../types';\n\n/**\n * Parse a single SSE data line into a typed event.\n * Returns null for non-data lines or empty data.\n */\nexport function parseSSELine(line: string): SSEEvent | null {\n if (!line.startsWith('data: ')) return null;\n const json = line.slice(6).trim();\n if (json.length === 0) return null;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- SSE event from server\n return JSON.parse(json) as SSEEvent;\n}\n\nexport interface StreamSSEOptions {\n signal?: AbortSignal;\n headers?: Record<string, string>;\n}\n\n/**\n * Streams SSE events from a POST endpoint.\n * Uses fetch + ReadableStream (not EventSource, which only supports GET).\n */\nexport async function* streamSSE(\n url: string,\n body: Record<string, unknown>,\n options?: StreamSSEOptions,\n): AsyncGenerator<SSEEvent> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options?.headers,\n };\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: options?.signal,\n });\n\n if (!response.ok) {\n throw new Error(`SSE request failed: ${String(response.status)} ${response.statusText}`);\n }\n\n yield* readSSEStream(response);\n}\n\n/**\n * Streams SSE events from a GET endpoint (e.g., task streaming).\n */\nexport async function* streamSSEGet(\n url: string,\n options?: StreamSSEOptions,\n): AsyncGenerator<SSEEvent> {\n const response = await fetch(url, {\n method: 'GET',\n headers: options?.headers,\n signal: options?.signal,\n });\n\n if (!response.ok) {\n throw new Error(`SSE request failed: ${String(response.status)} ${response.statusText}`);\n }\n\n yield* readSSEStream(response);\n}\n\n/**\n * Reads SSE events from a Response body stream.\n */\nasync function* readSSEStream(response: Response): AsyncGenerator<SSEEvent> {\n const body = response.body;\n if (!body) {\n throw new Error('Response body is null');\n }\n\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length === 0) continue;\n const event = parseSSELine(trimmed);\n if (event) {\n yield event;\n }\n }\n }\n\n // Process any remaining buffer\n if (buffer.trim().length > 0) {\n const event = parseSSELine(buffer.trim());\n if (event) {\n yield event;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport type { SSEEvent } from '../types';\nimport { streamSSE } from './sse-client';\n\nexport interface ChatStreamRequest {\n message: string;\n session_id?: string;\n role?: string;\n session_type?: string;\n deploy_id?: string;\n}\n\nexport interface SessionInfo {\n session_id: string;\n role: string;\n}\n\n/**\n * Streams chat responses from the API server's SSE endpoint.\n * Delegates to the shared streamSSE utility.\n */\nexport async function* streamChat(\n serverUrl: string,\n request: ChatStreamRequest,\n signal?: AbortSignal,\n token?: string,\n): AsyncGenerator<SSEEvent> {\n const url = `${serverUrl}/chat/stream`;\n\n const headers: Record<string, string> = {};\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n const body: Record<string, unknown> = { message: request.message };\n if (request.session_id) body['session_id'] = request.session_id;\n if (request.role) body['role'] = request.role;\n if (request.session_type) body['session_type'] = request.session_type;\n if (request.deploy_id) body['deploy_id'] = request.deploy_id;\n\n yield* streamSSE(url, body, {\n signal,\n headers,\n });\n}\n\n/**\n * Creates a new chat session on the server.\n */\nexport async function createSession(\n serverUrl: string,\n user: { id: string; role?: string },\n token?: string,\n): Promise<SessionInfo> {\n const url = `${serverUrl}/sessions`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n const body: Record<string, string> = { user_id: user.id };\n if (user.role) body['role'] = user.role;\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new Error(`Session creation failed: ${String(response.status)} ${response.statusText}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as SessionInfo;\n}\n\n// ---------------------------------------------------------------------------\n// Session history API\n// ---------------------------------------------------------------------------\n\nexport interface SessionHistoryItem {\n id: string;\n tenant_id: string;\n app_id?: string;\n title?: string;\n tags: string[];\n status: string;\n session_type?: string;\n message_count: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface SessionDetail extends SessionHistoryItem {\n messages: Array<{\n type: string;\n id: string;\n text: string;\n timestamp: string;\n toolCalls?: Array<Record<string, unknown>>;\n skillActivations?: string[];\n widgets?: Array<Record<string, unknown>>;\n contentBlocks?: Array<Record<string, unknown>>;\n }>;\n}\n\nfunction authHeaders(token?: string | null): Record<string, string> {\n const headers: Record<string, string> = {};\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n return headers;\n}\n\n/**\n * List past sessions for the authenticated tenant.\n */\nexport async function listSessions(\n serverUrl: string,\n token?: string | null,\n tags?: string[],\n): Promise<SessionHistoryItem[]> {\n const qs = tags && tags.length > 0 ? `?tags=${tags.join(',')}` : '';\n const url = `${serverUrl}/sessions/history${qs}`;\n\n const response = await fetch(url, { headers: authHeaders(token) });\n if (!response.ok) {\n throw new Error(`List sessions failed: ${String(response.status)} ${response.statusText}`);\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as SessionHistoryItem[];\n}\n\n/**\n * Get a single session with full message history.\n */\nexport async function getSessionHistory(\n serverUrl: string,\n sessionId: string,\n token?: string | null,\n): Promise<SessionDetail> {\n const url = `${serverUrl}/sessions/history/${sessionId}`;\n\n const response = await fetch(url, { headers: authHeaders(token) });\n if (!response.ok) {\n throw new Error(`Get session failed: ${String(response.status)} ${response.statusText}`);\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as SessionDetail;\n}\n\n/**\n * Update session title and/or tags.\n */\nexport async function updateSession(\n serverUrl: string,\n sessionId: string,\n updates: { title?: string; tags?: string[] },\n token?: string | null,\n): Promise<SessionDetail> {\n const url = `${serverUrl}/sessions/history/${sessionId}`;\n\n const response = await fetch(url, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n ...authHeaders(token),\n },\n body: JSON.stringify(updates),\n });\n if (!response.ok) {\n throw new Error(`Update session failed: ${String(response.status)} ${response.statusText}`);\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as SessionDetail;\n}\n\n/**\n * Creates a configured chat client instance.\n */\nexport function createChatClient(serverUrl: string, token?: string) {\n return {\n stream: (request: ChatStreamRequest, signal?: AbortSignal) =>\n streamChat(serverUrl, request, signal, token),\n createSession: (user: { id: string; role?: string }) =>\n createSession(serverUrl, user, token),\n listSessions: (tags?: string[]) => listSessions(serverUrl, token, tags),\n getSessionHistory: (sessionId: string) => getSessionHistory(serverUrl, sessionId, token),\n updateSession: (sessionId: string, updates: { title?: string; tags?: string[] }) =>\n updateSession(serverUrl, sessionId, updates, token),\n };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\n/**\n * Minimal typed event emitter with no external dependencies.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- generic event map constraint\nexport class TypedEventEmitter<Events extends Record<string, any>> {\n private listeners = new Map<keyof Events, Set<(data: never) => void>>();\n\n on<K extends keyof Events>(event: K, listener: (data: Events[K]) => void): this {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(listener as (data: never) => void);\n return this;\n }\n\n off<K extends keyof Events>(event: K, listener: (data: Events[K]) => void): this {\n const set = this.listeners.get(event);\n if (set) {\n set.delete(listener as (data: never) => void);\n if (set.size === 0) {\n this.listeners.delete(event);\n }\n }\n return this;\n }\n\n protected emit<K extends keyof Events>(event: K, data: Events[K]): void {\n const set = this.listeners.get(event);\n if (set) {\n for (const listener of set) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- generic event dispatch\n (listener as (data: Events[K]) => void)(data);\n }\n }\n }\n\n removeAllListeners(): this {\n this.listeners.clear();\n return this;\n }\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport type { EntityReference, WidgetEvent } from './types';\n\n/**\n * Default entity extractor. Inspects agent-driven events and extracts entity\n * references from known widget data shapes and tool parameters.\n */\nexport function defaultEntityExtractor(event: WidgetEvent): EntityReference[] {\n const entities: EntityReference[] = [];\n\n if (event.type === 'widget_rendered') {\n extractFromWidget(event.widgetType, event.data, entities);\n }\n\n if (event.type === 'tool_executed') {\n extractFromToolParams(event.parameters, entities);\n }\n\n return entities;\n}\n\nfunction extractFromWidget(\n widgetType: string,\n data: Record<string, unknown>,\n entities: EntityReference[],\n): void {\n switch (widgetType) {\n case 'entity-card': {\n if (typeof data['mac'] === 'string') {\n entities.push({\n entityType: 'device',\n entityId: data['mac'],\n source: 'widget:entity-card',\n });\n }\n if (typeof data['zone'] === 'string') {\n entities.push({\n entityType: 'zone',\n entityId: data['zone'],\n source: 'widget:entity-card',\n });\n }\n break;\n }\n case 'entity-list': {\n const devices = data['devices'];\n if (Array.isArray(devices)) {\n for (const device of devices) {\n if (typeof device === 'object' && device !== null && 'mac' in device && typeof device['mac'] === 'string') {\n entities.push({\n entityType: 'device',\n entityId: device['mac'],\n source: 'widget:entity-list',\n });\n }\n }\n }\n break;\n }\n case 'scope-map': {\n const zones = data['highlight_zones'];\n if (Array.isArray(zones)) {\n for (const zone of zones) {\n if (typeof zone === 'string') {\n entities.push({\n entityType: 'zone',\n entityId: zone,\n source: 'widget:scope-map',\n });\n }\n }\n }\n const devices = data['highlight_devices'];\n if (Array.isArray(devices)) {\n for (const mac of devices) {\n if (typeof mac === 'string') {\n entities.push({\n entityType: 'device',\n entityId: mac,\n source: 'widget:scope-map',\n });\n }\n }\n }\n break;\n }\n case 'alert-card': {\n const alertId = data['alert_id'] ?? data['id'];\n if (typeof alertId === 'string') {\n entities.push({\n entityType: 'alert',\n entityId: alertId,\n source: 'widget:alert-card',\n });\n }\n break;\n }\n default:\n break;\n }\n}\n\nfunction extractFromToolParams(\n parameters: Record<string, unknown>,\n entities: EntityReference[],\n): void {\n if (typeof parameters['zone'] === 'string') {\n entities.push({\n entityType: 'zone',\n entityId: parameters['zone'],\n source: 'tool:parameter',\n });\n }\n if (typeof parameters['mac'] === 'string') {\n entities.push({\n entityType: 'device',\n entityId: parameters['mac'],\n source: 'tool:parameter',\n });\n }\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { TypedEventEmitter } from '../client/EventEmitter';\nimport { defaultEntityExtractor } from './entity-extractor';\nimport type { WidgetEventMap, WidgetEvent, EntityExtractor, EntityReferencedEvent } from './types';\n\n/**\n * Event bus for widget events. Emits both agent-driven events (from SSE stream)\n * and user interaction events (hover/click on entities in the chat).\n *\n * Subscribing to `'*'` receives all events.\n */\nexport class WidgetEventBus extends TypedEventEmitter<WidgetEventMap> {\n private extractors: EntityExtractor[] = [defaultEntityExtractor];\n\n /**\n * Process an agent-driven event: emit on its typed channel + '*',\n * then run entity extractors and emit entity_referenced for each found entity.\n */\n processEvent(event: WidgetEvent): void {\n // Emit on the typed channel\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- event type matches map key\n this.emit(event.type as keyof WidgetEventMap, event as never);\n this.emit('*', event);\n\n // Run entity extractors only for agent-driven events (not interaction events, not entity_referenced)\n if (\n event.type === 'tool_executed' ||\n event.type === 'skill_activated' ||\n event.type === 'widget_rendered' ||\n event.type === 'kb_proposal'\n ) {\n for (const extractor of this.extractors) {\n const entities = extractor(event);\n for (const entity of entities) {\n const refEvent: EntityReferencedEvent = {\n type: 'entity_referenced',\n entity,\n sourceEvent: event,\n timestamp: new Date().toISOString(),\n };\n this.emit('entity_referenced', refEvent);\n this.emit('*', refEvent);\n }\n }\n }\n }\n\n /**\n * Emit an interaction event (entity_hovered, entity_unhovered, entity_clicked).\n * These are emitted on their typed channel + '*' without running extractors,\n * since interaction events already carry their EntityReference.\n */\n emitInteraction(event: WidgetEvent): void {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- event type matches map key\n this.emit(event.type as keyof WidgetEventMap, event as never);\n this.emit('*', event);\n }\n\n /** Add a custom entity extractor. */\n addExtractor(fn: EntityExtractor): void {\n this.extractors.push(fn);\n }\n\n /** Replace all entity extractors (including the default). */\n setExtractors(fns: EntityExtractor[]): void {\n this.extractors = [...fns];\n }\n}\n"],"names":["parseSSELine","line","json","streamSSE","url","body","options","headers","response","readSSEStream","streamSSEGet","reader","decoder","buffer","done","value","lines","trimmed","event","streamChat","serverUrl","request","signal","token","createSession","user","authHeaders","listSessions","tags","qs","getSessionHistory","sessionId","updateSession","updates","createChatClient","TypedEventEmitter","__publicField","listener","set","data","defaultEntityExtractor","entities","extractFromWidget","extractFromToolParams","widgetType","devices","device","zones","zone","mac","alertId","parameters","WidgetEventBus","extractor","entity","refEvent","fn","fns"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"event-bus-h26clqbZ.js","sources":["../src/client/sse-client.ts","../src/client/chat-api.ts","../src/client/EventEmitter.ts","../src/events/entity-extractor.ts","../src/events/event-bus.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport type { SSEEvent } from '../types';\n\n/**\n * Parse a single SSE data line into a typed event.\n * Returns null for non-data lines or empty data.\n */\nexport function parseSSELine(line: string): SSEEvent | null {\n if (!line.startsWith('data: ')) return null;\n const json = line.slice(6).trim();\n if (json.length === 0) return null;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- SSE event from server\n return JSON.parse(json) as SSEEvent;\n}\n\nexport interface StreamSSEOptions {\n signal?: AbortSignal;\n headers?: Record<string, string>;\n}\n\n/**\n * Streams SSE events from a POST endpoint.\n * Uses fetch + ReadableStream (not EventSource, which only supports GET).\n */\nexport async function* streamSSE(\n url: string,\n body: Record<string, unknown>,\n options?: StreamSSEOptions,\n): AsyncGenerator<SSEEvent> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options?.headers,\n };\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: options?.signal,\n });\n\n if (!response.ok) {\n throw new Error(`SSE request failed: ${String(response.status)} ${response.statusText}`);\n }\n\n yield* readSSEStream(response);\n}\n\n/**\n * Streams SSE events from a GET endpoint (e.g., task streaming).\n */\nexport async function* streamSSEGet(\n url: string,\n options?: StreamSSEOptions,\n): AsyncGenerator<SSEEvent> {\n const response = await fetch(url, {\n method: 'GET',\n headers: options?.headers,\n signal: options?.signal,\n });\n\n if (!response.ok) {\n throw new Error(`SSE request failed: ${String(response.status)} ${response.statusText}`);\n }\n\n yield* readSSEStream(response);\n}\n\n/**\n * Reads SSE events from a Response body stream.\n */\nasync function* readSSEStream(response: Response): AsyncGenerator<SSEEvent> {\n const body = response.body;\n if (!body) {\n throw new Error('Response body is null');\n }\n\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length === 0) continue;\n const event = parseSSELine(trimmed);\n if (event) {\n yield event;\n }\n }\n }\n\n // Process any remaining buffer\n if (buffer.trim().length > 0) {\n const event = parseSSELine(buffer.trim());\n if (event) {\n yield event;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport type { SSEEvent } from '../types';\nimport { streamSSE } from './sse-client';\n\nexport interface ChatStreamRequest {\n message: string;\n session_id?: string;\n role?: string;\n session_type?: string;\n deploy_id?: string;\n}\n\nexport interface SessionInfo {\n session_id: string;\n role: string;\n}\n\n/**\n * Streams chat responses from the API server's SSE endpoint.\n * Delegates to the shared streamSSE utility.\n */\nexport async function* streamChat(\n serverUrl: string,\n request: ChatStreamRequest,\n signal?: AbortSignal,\n token?: string,\n): AsyncGenerator<SSEEvent> {\n const url = `${serverUrl}/chat/stream`;\n\n const headers: Record<string, string> = {};\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n const body: Record<string, unknown> = { message: request.message };\n if (request.session_id) body['session_id'] = request.session_id;\n if (request.role) body['role'] = request.role;\n if (request.session_type) body['session_type'] = request.session_type;\n if (request.deploy_id) body['deploy_id'] = request.deploy_id;\n\n yield* streamSSE(url, body, {\n signal,\n headers,\n });\n}\n\n/**\n * Creates a new chat session on the server.\n */\nexport async function createSession(\n serverUrl: string,\n user: { id: string; role?: string },\n token?: string,\n): Promise<SessionInfo> {\n const url = `${serverUrl}/sessions`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n const body: Record<string, string> = { user_id: user.id };\n if (user.role) body['role'] = user.role;\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new Error(`Session creation failed: ${String(response.status)} ${response.statusText}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as SessionInfo;\n}\n\n// ---------------------------------------------------------------------------\n// Session history API\n// ---------------------------------------------------------------------------\n\nexport interface SessionHistoryItem {\n id: string;\n app_id: string;\n title?: string;\n tags: string[];\n status: string;\n session_type?: string;\n message_count: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface SessionDetail extends SessionHistoryItem {\n messages: Array<{\n type: string;\n id: string;\n text: string;\n timestamp: string;\n toolCalls?: Array<Record<string, unknown>>;\n skillActivations?: string[];\n widgets?: Array<Record<string, unknown>>;\n contentBlocks?: Array<Record<string, unknown>>;\n }>;\n}\n\nfunction authHeaders(token?: string | null): Record<string, string> {\n const headers: Record<string, string> = {};\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n return headers;\n}\n\n/**\n * List past sessions for the authenticated app.\n */\nexport async function listSessions(\n serverUrl: string,\n token?: string | null,\n tags?: string[],\n): Promise<SessionHistoryItem[]> {\n const qs = tags && tags.length > 0 ? `?tags=${tags.join(',')}` : '';\n const url = `${serverUrl}/sessions/history${qs}`;\n\n const response = await fetch(url, { headers: authHeaders(token) });\n if (!response.ok) {\n throw new Error(`List sessions failed: ${String(response.status)} ${response.statusText}`);\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as SessionHistoryItem[];\n}\n\n/**\n * Get a single session with full message history.\n */\nexport async function getSessionHistory(\n serverUrl: string,\n sessionId: string,\n token?: string | null,\n): Promise<SessionDetail> {\n const url = `${serverUrl}/sessions/history/${sessionId}`;\n\n const response = await fetch(url, { headers: authHeaders(token) });\n if (!response.ok) {\n throw new Error(`Get session failed: ${String(response.status)} ${response.statusText}`);\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as SessionDetail;\n}\n\n/**\n * Update session title and/or tags.\n */\nexport async function updateSession(\n serverUrl: string,\n sessionId: string,\n updates: { title?: string; tags?: string[] },\n token?: string | null,\n): Promise<SessionDetail> {\n const url = `${serverUrl}/sessions/history/${sessionId}`;\n\n const response = await fetch(url, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n ...authHeaders(token),\n },\n body: JSON.stringify(updates),\n });\n if (!response.ok) {\n throw new Error(`Update session failed: ${String(response.status)} ${response.statusText}`);\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as SessionDetail;\n}\n\n/**\n * Creates a configured chat client instance.\n */\nexport function createChatClient(serverUrl: string, token?: string) {\n return {\n stream: (request: ChatStreamRequest, signal?: AbortSignal) =>\n streamChat(serverUrl, request, signal, token),\n createSession: (user: { id: string; role?: string }) =>\n createSession(serverUrl, user, token),\n listSessions: (tags?: string[]) => listSessions(serverUrl, token, tags),\n getSessionHistory: (sessionId: string) => getSessionHistory(serverUrl, sessionId, token),\n updateSession: (sessionId: string, updates: { title?: string; tags?: string[] }) =>\n updateSession(serverUrl, sessionId, updates, token),\n };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\n/**\n * Minimal typed event emitter with no external dependencies.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- generic event map constraint\nexport class TypedEventEmitter<Events extends Record<string, any>> {\n private listeners = new Map<keyof Events, Set<(data: never) => void>>();\n\n on<K extends keyof Events>(event: K, listener: (data: Events[K]) => void): this {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(listener as (data: never) => void);\n return this;\n }\n\n off<K extends keyof Events>(event: K, listener: (data: Events[K]) => void): this {\n const set = this.listeners.get(event);\n if (set) {\n set.delete(listener as (data: never) => void);\n if (set.size === 0) {\n this.listeners.delete(event);\n }\n }\n return this;\n }\n\n protected emit<K extends keyof Events>(event: K, data: Events[K]): void {\n const set = this.listeners.get(event);\n if (set) {\n for (const listener of set) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- generic event dispatch\n (listener as (data: Events[K]) => void)(data);\n }\n }\n }\n\n removeAllListeners(): this {\n this.listeners.clear();\n return this;\n }\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport type { EntityReference, WidgetEvent } from './types';\n\n/**\n * Default entity extractor. Inspects agent-driven events and extracts entity\n * references from known widget data shapes and tool parameters.\n */\nexport function defaultEntityExtractor(event: WidgetEvent): EntityReference[] {\n const entities: EntityReference[] = [];\n\n if (event.type === 'widget_rendered') {\n extractFromWidget(event.widgetType, event.data, entities);\n }\n\n if (event.type === 'tool_executed') {\n extractFromToolParams(event.parameters, entities);\n }\n\n return entities;\n}\n\nfunction extractFromWidget(\n widgetType: string,\n data: Record<string, unknown>,\n entities: EntityReference[],\n): void {\n switch (widgetType) {\n case 'entity-card': {\n if (typeof data['mac'] === 'string') {\n entities.push({\n entityType: 'device',\n entityId: data['mac'],\n source: 'widget:entity-card',\n });\n }\n if (typeof data['zone'] === 'string') {\n entities.push({\n entityType: 'zone',\n entityId: data['zone'],\n source: 'widget:entity-card',\n });\n }\n break;\n }\n case 'entity-list': {\n const devices = data['devices'];\n if (Array.isArray(devices)) {\n for (const device of devices) {\n if (typeof device === 'object' && device !== null && 'mac' in device && typeof device['mac'] === 'string') {\n entities.push({\n entityType: 'device',\n entityId: device['mac'],\n source: 'widget:entity-list',\n });\n }\n }\n }\n break;\n }\n case 'scope-map': {\n const zones = data['highlight_zones'];\n if (Array.isArray(zones)) {\n for (const zone of zones) {\n if (typeof zone === 'string') {\n entities.push({\n entityType: 'zone',\n entityId: zone,\n source: 'widget:scope-map',\n });\n }\n }\n }\n const devices = data['highlight_devices'];\n if (Array.isArray(devices)) {\n for (const mac of devices) {\n if (typeof mac === 'string') {\n entities.push({\n entityType: 'device',\n entityId: mac,\n source: 'widget:scope-map',\n });\n }\n }\n }\n break;\n }\n case 'alert-card': {\n const alertId = data['alert_id'] ?? data['id'];\n if (typeof alertId === 'string') {\n entities.push({\n entityType: 'alert',\n entityId: alertId,\n source: 'widget:alert-card',\n });\n }\n break;\n }\n default:\n break;\n }\n}\n\nfunction extractFromToolParams(\n parameters: Record<string, unknown>,\n entities: EntityReference[],\n): void {\n if (typeof parameters['zone'] === 'string') {\n entities.push({\n entityType: 'zone',\n entityId: parameters['zone'],\n source: 'tool:parameter',\n });\n }\n if (typeof parameters['mac'] === 'string') {\n entities.push({\n entityType: 'device',\n entityId: parameters['mac'],\n source: 'tool:parameter',\n });\n }\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { TypedEventEmitter } from '../client/EventEmitter';\nimport { defaultEntityExtractor } from './entity-extractor';\nimport type { WidgetEventMap, WidgetEvent, EntityExtractor, EntityReferencedEvent } from './types';\n\n/**\n * Event bus for widget events. Emits both agent-driven events (from SSE stream)\n * and user interaction events (hover/click on entities in the chat).\n *\n * Subscribing to `'*'` receives all events.\n */\nexport class WidgetEventBus extends TypedEventEmitter<WidgetEventMap> {\n private extractors: EntityExtractor[] = [defaultEntityExtractor];\n\n /**\n * Process an agent-driven event: emit on its typed channel + '*',\n * then run entity extractors and emit entity_referenced for each found entity.\n */\n processEvent(event: WidgetEvent): void {\n // Emit on the typed channel\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- event type matches map key\n this.emit(event.type as keyof WidgetEventMap, event as never);\n this.emit('*', event);\n\n // Run entity extractors only for agent-driven events (not interaction events, not entity_referenced)\n if (\n event.type === 'tool_executed' ||\n event.type === 'skill_activated' ||\n event.type === 'widget_rendered' ||\n event.type === 'kb_proposal'\n ) {\n for (const extractor of this.extractors) {\n const entities = extractor(event);\n for (const entity of entities) {\n const refEvent: EntityReferencedEvent = {\n type: 'entity_referenced',\n entity,\n sourceEvent: event,\n timestamp: new Date().toISOString(),\n };\n this.emit('entity_referenced', refEvent);\n this.emit('*', refEvent);\n }\n }\n }\n }\n\n /**\n * Emit an interaction event (entity_hovered, entity_unhovered, entity_clicked).\n * These are emitted on their typed channel + '*' without running extractors,\n * since interaction events already carry their EntityReference.\n */\n emitInteraction(event: WidgetEvent): void {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- event type matches map key\n this.emit(event.type as keyof WidgetEventMap, event as never);\n this.emit('*', event);\n }\n\n /** Add a custom entity extractor. */\n addExtractor(fn: EntityExtractor): void {\n this.extractors.push(fn);\n }\n\n /** Replace all entity extractors (including the default). */\n setExtractors(fns: EntityExtractor[]): void {\n this.extractors = [...fns];\n }\n}\n"],"names":["parseSSELine","line","json","streamSSE","url","body","options","headers","response","readSSEStream","streamSSEGet","reader","decoder","buffer","done","value","lines","trimmed","event","streamChat","serverUrl","request","signal","token","createSession","user","authHeaders","listSessions","tags","qs","getSessionHistory","sessionId","updateSession","updates","createChatClient","TypedEventEmitter","__publicField","listener","set","data","defaultEntityExtractor","entities","extractFromWidget","extractFromToolParams","widgetType","devices","device","zones","zone","mac","alertId","parameters","WidgetEventBus","extractor","entity","refEvent","fn","fns"],"mappings":"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"}
|
package/dist/provider.d.ts
CHANGED
|
@@ -3,8 +3,8 @@ import { RuntimeClient } from './client/runtime-client';
|
|
|
3
3
|
export interface AmodalProviderProps {
|
|
4
4
|
/** Base URL of the Amodal runtime server (e.g., "http://localhost:3001"). */
|
|
5
5
|
runtimeUrl: string;
|
|
6
|
-
/**
|
|
7
|
-
|
|
6
|
+
/** App identifier sent in every request body. */
|
|
7
|
+
appId: string;
|
|
8
8
|
/** Optional async token getter for auth headers. */
|
|
9
9
|
getToken?: () => string | Promise<string> | null | undefined;
|
|
10
10
|
children: ReactNode;
|
|
@@ -12,12 +12,12 @@ export interface AmodalProviderProps {
|
|
|
12
12
|
interface AmodalContextValue {
|
|
13
13
|
client: RuntimeClient;
|
|
14
14
|
runtimeUrl: string;
|
|
15
|
-
|
|
15
|
+
appId: string;
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
18
|
* Provides a RuntimeClient to all child hooks and components.
|
|
19
19
|
*/
|
|
20
|
-
export declare function AmodalProvider({ runtimeUrl,
|
|
20
|
+
export declare function AmodalProvider({ runtimeUrl, appId, getToken, children }: AmodalProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
21
21
|
/**
|
|
22
22
|
* Access the RuntimeClient and config from the nearest AmodalProvider.
|
|
23
23
|
* Throws if called outside of an AmodalProvider.
|
package/dist/provider.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAClC,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAClC,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7D,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,UAAU,kBAAkB;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,mBAAmB,2CAY5F;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,kBAAkB,CAMrD"}
|