@noodleseed/assistant 1.4.0 → 1.6.0
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 +31 -8
- package/dist/{appearance-BLO7kFYB.d.cts → appearance-DowzFJjh.d.cts} +9 -0
- package/dist/{appearance-BLO7kFYB.d.ts → appearance-DowzFJjh.d.ts} +9 -0
- package/dist/{chunk-P34VLBIK.js → chunk-GTYYQNGT.js} +2 -2
- package/dist/chunk-GTYYQNGT.js.map +1 -0
- package/dist/{chunk-JIL4B5HD.js → chunk-ZKXOX67J.js} +463 -100
- package/dist/chunk-ZKXOX67J.js.map +1 -0
- package/dist/{client-nW-Zf4bU.d.ts → client-9kup0-ws.d.cts} +4 -1
- package/dist/{client-1uaN8-yl.d.cts → client-BRjZMXlk.d.ts} +4 -1
- package/dist/client.cjs +1 -1
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +2 -2
- package/dist/client.d.ts +2 -2
- package/dist/client.js +1 -1
- package/dist/index.cjs +462 -99
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +53 -4
- package/dist/index.d.ts +53 -4
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +468 -99
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +6 -4
- package/dist/react.d.ts +6 -4
- package/dist/react.js +8 -2
- package/dist/react.js.map +1 -1
- package/dist/server.d.cts +1 -1
- package/dist/server.d.ts +1 -1
- package/package.json +1 -1
- package/dist/chunk-JIL4B5HD.js.map +0 -1
- package/dist/chunk-P34VLBIK.js.map +0 -1
package/README.md
CHANGED
|
@@ -137,7 +137,7 @@ markup-looking text stays text. `presentation.panel.radius` is a bounded panel-s
|
|
|
137
137
|
not a second color or identity source. An HTTPS or packaged SVG referenced by `branding.logo`, `branding.mark`, or
|
|
138
138
|
`branding.avatar` is a bounded asset, not inline renderer markup.
|
|
139
139
|
|
|
140
|
-
If `presentation` is omitted, the
|
|
140
|
+
If `presentation` is omitted, the quiet premium baseline remains: solid panel, soft elevation, subtle
|
|
141
141
|
border/motion, medium brand-mark launcher without status or effect, undecorated header, pill composer with
|
|
142
142
|
no leading icon and an arrow-up send icon, and bubble user/plain assistant messages at comfortable width.
|
|
143
143
|
Partial objects merge with those defaults.
|
|
@@ -251,7 +251,8 @@ Backend `preferences` are the signed-in user's saved locale/time-zone choices an
|
|
|
251
251
|
message turns retry once after an expired session; the client never auto-retries interaction decisions. A
|
|
252
252
|
`tool_proposed` event carries a complete schema-projected review of the tool input and collected answers. For
|
|
253
253
|
a connector-backed tool it also identifies the exact connector version, operation, and resolved arguments;
|
|
254
|
-
confirmable flows contain at most that one connector operation.
|
|
254
|
+
Core v1 confirmable flows contain at most that one connector operation. Core v2 may route among candidate
|
|
255
|
+
actions and perform disclosed later reads, but exactly one action may be eligible. Sensitive fields may be redacted, but any
|
|
255
256
|
other truncation or omission fails closed. Accept is bound to that server-held action and claims one
|
|
256
257
|
execution attempt; drift fails closed, while decline/cancel resolve without execution. Normal terminal
|
|
257
258
|
outcomes scrub private arguments and continuations immediately. Only an accepted action still in the
|
|
@@ -301,9 +302,30 @@ replay across sessions. React applications may observe recovery and structured f
|
|
|
301
302
|
`createAssistantSession` returns the opaque token, expiry, resolved non-secret configuration, and explicit
|
|
302
303
|
turn/interaction endpoint URLs. Forward that response unchanged to the component or headless client.
|
|
303
304
|
|
|
304
|
-
The MCP server's top-level `branding` block is the
|
|
305
|
-
widgets and the assistant.
|
|
306
|
-
|
|
305
|
+
The MCP server's top-level `branding` block is the portable deployment source for identity and colors shared
|
|
306
|
+
by widgets and the assistant. The embedding application may use the typed `appearance` object when it needs
|
|
307
|
+
exact control over assistant-specific roles:
|
|
308
|
+
|
|
309
|
+
```tsx
|
|
310
|
+
<NoodleAssistant
|
|
311
|
+
sessionEndpoint="/api/assistant/session"
|
|
312
|
+
appearance={{
|
|
313
|
+
light: {
|
|
314
|
+
panel: { surface: "#FFFFFF", text: "#101828", border: "#E4E7EC" },
|
|
315
|
+
composer: { surface: "#F9FAFB", text: "#101828", border: "#D0D5DD" },
|
|
316
|
+
confirmation: { surface: "#F8FAFC", text: "#101828", border: "#CBD5E1" },
|
|
317
|
+
primaryButton: { surface: "#635BFF", text: "#FFFFFF" },
|
|
318
|
+
},
|
|
319
|
+
}}
|
|
320
|
+
onAppearanceWarning={(warning) => reportThemeWarning(warning)}
|
|
321
|
+
/>
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
The same object is available as `element.appearance`. It covers canvas, panel, header, assistant/user
|
|
325
|
+
messages, composer, suggestions, confirmation, primary/secondary buttons, launcher, code, and MCP App frame
|
|
326
|
+
roles in light and dark modes. Exact colors are preserved; insufficient contrast emits the typed
|
|
327
|
+
`assistant-appearance-warning` event. Stable public CSS variables remain available for stylesheet-based
|
|
328
|
+
integration:
|
|
307
329
|
|
|
308
330
|
```css
|
|
309
331
|
noodle-assistant {
|
|
@@ -313,8 +335,9 @@ noodle-assistant {
|
|
|
313
335
|
}
|
|
314
336
|
```
|
|
315
337
|
|
|
316
|
-
For each matching region or token, precedence is
|
|
317
|
-
then compiled server `presentation`/`branding`, then
|
|
338
|
+
For each matching region or token, precedence is the typed host appearance object, then host-provided slot
|
|
339
|
+
content or a public CSS custom property, then compiled server `presentation`/`branding`, then built-in
|
|
340
|
+
defaults. The public slots are `launcher-icon`,
|
|
318
341
|
`header-leading`, `header-actions`, `empty-state`, `composer-leading`, `composer-trailing`, and
|
|
319
342
|
`conversation-footer`; slotted host DOM replaces the renderer fallback for that region. Slots are a trusted
|
|
320
343
|
embedding-page integration API, not a way to put HTML or callbacks in deployment configuration. Internal
|
|
@@ -325,7 +348,7 @@ radius, typography, and automatic theme. `embeddedAssistant(...)` controls float
|
|
|
325
348
|
position and dimensions, mobile and launcher/header/avatar/timestamp behavior, visible labels, suggested
|
|
326
349
|
prompts, privacy/terms links, locale, and text direction.
|
|
327
350
|
Named slots cover launcher/header/composer/footer extensions. Public methods include `open`, `close`,
|
|
328
|
-
`toggle`, `focusComposer`, `sendMessage`, `updateContext`, `updateModelContext`, `respond`, `confirmTool`, and `resetSession`;
|
|
351
|
+
`toggle`, `focusComposer`, `sendMessage`, `stop`, `reconnect`, `updateContext`, `updateModelContext`, `respond`, `confirmTool`, and `resetSession`;
|
|
329
352
|
lifecycle, message, tool-proposal, interaction-resolution, view-availability, context, and error events
|
|
330
353
|
support application integration. `confirmTool(id)` remains the compatibility shorthand for
|
|
331
354
|
`respond(id, { action: 'accept' })`.
|
|
@@ -114,7 +114,16 @@ interface AssistantLabels {
|
|
|
114
114
|
readonly close: string;
|
|
115
115
|
readonly open: string;
|
|
116
116
|
readonly confirm: string;
|
|
117
|
+
readonly decline: string;
|
|
117
118
|
readonly cancel: string;
|
|
119
|
+
readonly confirmationHeading: string;
|
|
120
|
+
readonly additionalDetails: string;
|
|
121
|
+
readonly redacted: string;
|
|
122
|
+
readonly completed: string;
|
|
123
|
+
readonly stopped: string;
|
|
124
|
+
readonly copy: string;
|
|
125
|
+
readonly newMessages: string;
|
|
126
|
+
readonly reconnect: string;
|
|
118
127
|
readonly retry: string;
|
|
119
128
|
readonly unavailable: string;
|
|
120
129
|
readonly sessionExpired: string;
|
|
@@ -114,7 +114,16 @@ interface AssistantLabels {
|
|
|
114
114
|
readonly close: string;
|
|
115
115
|
readonly open: string;
|
|
116
116
|
readonly confirm: string;
|
|
117
|
+
readonly decline: string;
|
|
117
118
|
readonly cancel: string;
|
|
119
|
+
readonly confirmationHeading: string;
|
|
120
|
+
readonly additionalDetails: string;
|
|
121
|
+
readonly redacted: string;
|
|
122
|
+
readonly completed: string;
|
|
123
|
+
readonly stopped: string;
|
|
124
|
+
readonly copy: string;
|
|
125
|
+
readonly newMessages: string;
|
|
126
|
+
readonly reconnect: string;
|
|
118
127
|
readonly retry: string;
|
|
119
128
|
readonly unavailable: string;
|
|
120
129
|
readonly sessionExpired: string;
|
|
@@ -8,7 +8,7 @@ function toAssistantClientEvent(event) {
|
|
|
8
8
|
}
|
|
9
9
|
break;
|
|
10
10
|
case "tool_proposed":
|
|
11
|
-
if (hasString(value, "id") && hasString(value, "tool") && hasOptionalJson(value.arguments) && hasOptionalString(value.expiresAt) && (value.requiresConfirmation === void 0 || value.requiresConfirmation === true) && hasOptionalTurnId(value)) {
|
|
11
|
+
if (hasString(value, "id") && hasString(value, "tool") && hasOptionalString(value.title) && hasOptionalString(value.description) && hasOptionalJson(value.arguments) && (value.reviewSchema === void 0 || isRecord(value.reviewSchema)) && hasOptionalString(value.expiresAt) && (value.requiresConfirmation === void 0 || value.requiresConfirmation === true) && hasOptionalTurnId(value)) {
|
|
12
12
|
return event;
|
|
13
13
|
}
|
|
14
14
|
break;
|
|
@@ -705,4 +705,4 @@ export {
|
|
|
705
705
|
AssistantClientError,
|
|
706
706
|
createAssistantClient
|
|
707
707
|
};
|
|
708
|
-
//# sourceMappingURL=chunk-
|
|
708
|
+
//# sourceMappingURL=chunk-GTYYQNGT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/events.ts","../src/model-context.ts","../src/transport.ts","../src/client.ts"],"sourcesContent":["import type { AssistantConfiguration } from './appearance.js';\nimport type { AssistantJsonValue, AssistantModelContextUpdate } from './model-context.js';\nimport type { AssistantEvent } from './transport.js';\n\ninterface NamedEvent<Name extends string, Data> {\n readonly event: Name;\n readonly data: Data;\n}\n\ninterface TurnDetail {\n readonly turnId?: string;\n}\n\nexport interface AssistantContentDetail extends TurnDetail {\n readonly delta: string;\n}\n\nexport interface AssistantToolProposedDetail extends TurnDetail {\n readonly id: string;\n readonly tool: string;\n readonly title?: string;\n readonly description?: string;\n readonly arguments?: AssistantJsonValue;\n readonly reviewSchema?: Readonly<Record<string, unknown>>;\n readonly expiresAt?: string;\n /** Optional only for compatibility with assistant services published before named-event pinning. */\n readonly requiresConfirmation?: true;\n}\n\nexport interface AssistantInputRequestedDetail extends TurnDetail {\n readonly id: string;\n readonly message: string;\n readonly requestedSchema: Readonly<Record<string, unknown>>;\n readonly expiresAt: string;\n}\n\nexport interface AssistantInteractionResolvedDetail extends TurnDetail {\n readonly id: string;\n /** Optional only for compatibility with the original accept-only confirmation endpoint. */\n readonly action?: 'accept' | 'decline' | 'cancel';\n}\n\nexport interface AssistantToolCompletedDetail extends TurnDetail {\n readonly id: string;\n readonly tool: string;\n readonly result: AssistantJsonValue;\n readonly replayed?: true;\n}\n\nexport interface AssistantViewAvailableDetail extends TurnDetail {\n /** Model tool-call id for an immediate result, or interaction id for a confirmed result. */\n readonly id: string;\n readonly tool: string;\n readonly resourceUri: string;\n readonly title?: string;\n /** Bounded, schema-redacted public tool output; widget-only metadata is never included. */\n readonly result: AssistantJsonValue;\n readonly arguments?: AssistantJsonValue;\n readonly html?: string;\n readonly resourceMeta?: Readonly<Record<string, unknown>>;\n /** HTTPS handoff origins declared by the server; absent/empty means app links fail closed. */\n readonly allowedOpenDomains?: readonly string[];\n readonly replayed?: true;\n}\n\nexport interface AssistantErrorEventDetail extends TurnDetail {\n readonly code: string;\n readonly status?: number;\n readonly retryable?: boolean;\n}\n\nexport type AssistantContentEvent = NamedEvent<'content', AssistantContentDetail>;\nexport type AssistantToolProposedEvent = NamedEvent<'tool_proposed', AssistantToolProposedDetail>;\nexport type AssistantInputRequestedEvent = NamedEvent<\n 'input_requested',\n AssistantInputRequestedDetail\n>;\nexport type AssistantInteractionResolvedEvent = NamedEvent<\n 'interaction_resolved',\n AssistantInteractionResolvedDetail\n>;\nexport type AssistantToolCompletedEvent = NamedEvent<\n 'tool_completed',\n AssistantToolCompletedDetail\n>;\nexport type AssistantViewAvailableEvent = NamedEvent<\n 'view_available',\n AssistantViewAvailableDetail\n>;\nexport type AssistantErrorEvent = NamedEvent<'error', AssistantErrorEventDetail>;\nexport type AssistantDoneEvent = NamedEvent<'done', TurnDetail>;\n\ninterface AssistantLegacyInteractionProposedDetail {\n readonly id: string;\n readonly tool?: string;\n readonly title?: string;\n readonly arguments?: AssistantJsonValue;\n}\n\ntype AssistantContextValue = string | number | boolean | null;\n\nexport type AssistantClientLifecycleEvent =\n | NamedEvent<\n 'session_started',\n { readonly expiresAt: string; readonly configuration?: AssistantConfiguration }\n >\n | NamedEvent<'session_expired', Readonly<Record<string, never>>>\n | NamedEvent<'session_reset', Readonly<Record<string, never>>>\n | NamedEvent<\n 'context_changed',\n { readonly context: Readonly<Record<string, AssistantContextValue>> }\n >\n | NamedEvent<'model_context_changed', { readonly modelContext: AssistantModelContextUpdate }>\n | NamedEvent<'message_started', { readonly message: string }>\n | NamedEvent<'message_completed', Readonly<Record<string, never>>>\n | NamedEvent<\n 'interaction_started',\n { readonly id: string; readonly action: 'accept' | 'decline' | 'cancel' }\n >\n | NamedEvent<\n 'interaction_completed',\n { readonly id: string; readonly action: 'accept' | 'decline' | 'cancel' }\n >;\n\nexport interface AssistantUnrecognizedEvent {\n readonly event: 'unrecognized';\n readonly data: {\n readonly name: string;\n readonly payload: Readonly<Record<string, unknown>>;\n };\n}\n\n/** Closed event union for the DOM-free client; unknown future SSE names remain observable safely. */\nexport type AssistantClientEvent =\n | AssistantContentEvent\n | AssistantToolProposedEvent\n | AssistantInputRequestedEvent\n | AssistantInteractionResolvedEvent\n | AssistantToolCompletedEvent\n | AssistantViewAvailableEvent\n | AssistantErrorEvent\n | AssistantDoneEvent\n | NamedEvent<'interaction_proposed', AssistantLegacyInteractionProposedDetail>\n | AssistantClientLifecycleEvent\n | AssistantUnrecognizedEvent;\n\n/** Normalize and minimally validate generic transport frames before asserting public event types. */\nexport function toAssistantClientEvent(event: AssistantEvent): AssistantClientEvent {\n const value = event.data;\n switch (event.event) {\n case 'content':\n if (typeof value.delta === 'string' && hasOptionalTurnId(value)) {\n return event as unknown as AssistantContentEvent;\n }\n break;\n case 'tool_proposed':\n if (\n hasString(value, 'id') &&\n hasString(value, 'tool') &&\n hasOptionalString(value.title) &&\n hasOptionalString(value.description) &&\n hasOptionalJson(value.arguments) &&\n (value.reviewSchema === undefined || isRecord(value.reviewSchema)) &&\n hasOptionalString(value.expiresAt) &&\n (value.requiresConfirmation === undefined || value.requiresConfirmation === true) &&\n hasOptionalTurnId(value)\n ) {\n return event as unknown as AssistantToolProposedEvent;\n }\n break;\n case 'input_requested':\n if (\n hasString(value, 'id') &&\n hasString(value, 'message') &&\n isRecord(value.requestedSchema) &&\n hasString(value, 'expiresAt') &&\n hasOptionalTurnId(value)\n ) {\n return event as unknown as AssistantInputRequestedEvent;\n }\n break;\n case 'interaction_resolved':\n if (\n hasString(value, 'id') &&\n (value.action === undefined || isInteractionAction(value.action)) &&\n hasOptionalTurnId(value)\n ) {\n return event as unknown as AssistantInteractionResolvedEvent;\n }\n break;\n case 'tool_completed':\n if (\n hasString(value, 'id') &&\n hasString(value, 'tool') &&\n isJsonValue(value.result, 0) &&\n (value.replayed === undefined || value.replayed === true) &&\n hasOptionalTurnId(value)\n ) {\n return event as unknown as AssistantToolCompletedEvent;\n }\n break;\n case 'view_available':\n if (isViewAvailableDetail(value)) return event as unknown as AssistantViewAvailableEvent;\n break;\n case 'error':\n if (\n hasString(value, 'code') &&\n (value.status === undefined || typeof value.status === 'number') &&\n (value.retryable === undefined || typeof value.retryable === 'boolean') &&\n hasOptionalTurnId(value)\n ) {\n return event as unknown as AssistantErrorEvent;\n }\n break;\n case 'done':\n if (hasOptionalTurnId(value)) return event as AssistantDoneEvent;\n break;\n case 'interaction_proposed':\n if (\n hasString(value, 'id') &&\n (hasString(value, 'tool') || hasString(value, 'title')) &&\n hasOptionalJson(value.arguments)\n ) {\n return event as unknown as NamedEvent<\n 'interaction_proposed',\n AssistantLegacyInteractionProposedDetail\n >;\n }\n break;\n }\n return { event: 'unrecognized', data: { name: event.event, payload: value } };\n}\n\nfunction isViewAvailableDetail(value: Readonly<Record<string, unknown>>): boolean {\n return (\n hasString(value, 'id') &&\n hasString(value, 'tool') &&\n typeof value.resourceUri === 'string' &&\n value.resourceUri.startsWith('ui://') &&\n hasOptionalString(value.title) &&\n (value.replayed === undefined || value.replayed === true) &&\n isJsonValue(value.result, 0) &&\n hasOptionalJson(value.arguments) &&\n hasOptionalString(value.html) &&\n (value.resourceMeta === undefined || isRecord(value.resourceMeta)) &&\n (value.allowedOpenDomains === undefined ||\n (Array.isArray(value.allowedOpenDomains) && value.allowedOpenDomains.every(isHttpsUrl))) &&\n hasOptionalTurnId(value)\n );\n}\n\nfunction isHttpsUrl(value: unknown): boolean {\n if (typeof value !== 'string') return false;\n try {\n return new URL(value).protocol === 'https:';\n } catch {\n return false;\n }\n}\n\nfunction hasOptionalTurnId(value: Readonly<Record<string, unknown>>): boolean {\n return hasOptionalString(value.turnId);\n}\n\nfunction hasString(value: Readonly<Record<string, unknown>>, key: string): boolean {\n const entry = value[key];\n return typeof entry === 'string' && entry.length > 0;\n}\n\nfunction hasOptionalString(value: unknown): value is string | undefined {\n return value === undefined || typeof value === 'string';\n}\n\nfunction hasOptionalJson(value: unknown): boolean {\n return value === undefined || isJsonValue(value, 0);\n}\n\nfunction isInteractionAction(value: unknown): value is 'accept' | 'decline' | 'cancel' {\n return value === 'accept' || value === 'decline' || value === 'cancel';\n}\n\nfunction isJsonValue(value: unknown, depth: number): value is AssistantJsonValue {\n if (depth > 16) return false;\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true;\n if (typeof value === 'number') return Number.isFinite(value);\n if (Array.isArray(value)) {\n return value.length <= 256 && value.every((entry) => isJsonValue(entry, depth + 1));\n }\n if (!isRecord(value)) return false;\n const entries = Object.entries(value);\n return entries.length <= 256 && entries.every(([, entry]) => isJsonValue(entry, depth + 1));\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","export type AssistantJsonValue =\n | string\n | number\n | boolean\n | null\n | readonly AssistantJsonValue[]\n | { readonly [key: string]: AssistantJsonValue };\n\nexport type AssistantPageContext = Readonly<Record<string, AssistantJsonValue>>;\n\n/** MCP-Apps-shaped summary deliberately selected by the renderer for the next assistant turn. */\nexport interface AssistantModelContextUpdate {\n readonly content?: readonly { readonly type: 'text'; readonly text: string }[];\n readonly structuredContent?: Readonly<Record<string, AssistantJsonValue>>;\n}\n\nconst MAX_BYTES = 16 * 1024;\nconst MAX_DEPTH = 8;\nconst MAX_ENTRIES = 128;\nconst SENSITIVE_KEY = /(?:secret|token|api[-_]?key|password|credential|authorization|cookie)/i;\nconst CREDENTIAL_SHAPED_TEXT =\n /(?:-----BEGIN [A-Z ]*PRIVATE KEY-----|\\bsk-[A-Za-z0-9_-]{20,}\\b|\\b(?:bearer|basic)\\s+[A-Za-z0-9._~+/=-]{20,}\\b|\\b[A-Za-z0-9_-]{16,}\\.[A-Za-z0-9_-]{16,}\\.[A-Za-z0-9_-]{16,}\\b)/i;\n\n/** Validate and detach renderer-owned mutable data before retaining it in the client. */\nexport function copyAssistantModelContext(\n update: AssistantModelContextUpdate,\n): AssistantModelContextUpdate {\n const copied = copyJsonValue(update, '$', 0, new Set<object>());\n assertModelContextShape(copied);\n const encoded = JSON.stringify(copied);\n if (new TextEncoder().encode(encoded).byteLength > MAX_BYTES) {\n throw new Error('Model context must not exceed 16 KiB');\n }\n return copied;\n}\n\n/** Validate and detach application-owned page data before attaching it to a turn. */\nexport function copyAssistantPageContext(context: AssistantPageContext): AssistantPageContext {\n const copied = copyJsonValue(context, '$', 0, new Set<object>());\n if (typeof copied !== 'object' || copied === null || Array.isArray(copied)) {\n throw new Error('Page context must be a JSON object');\n }\n const encoded = JSON.stringify(copied);\n if (new TextEncoder().encode(encoded).byteLength > MAX_BYTES) {\n throw new Error('Page context must not exceed 16 KiB');\n }\n return copied as AssistantPageContext;\n}\n\nfunction assertModelContextShape(value: unknown): asserts value is AssistantModelContextUpdate {\n if (!isPlainRecord(value)) throw new Error('Model context must be a JSON object');\n for (const key of Object.keys(value)) {\n if (key !== 'content' && key !== 'structuredContent') {\n throw new Error(`Model context contains unknown field ${key}`);\n }\n }\n if (value.content !== undefined) {\n if (!Array.isArray(value.content)) throw new Error('Model context content must be an array');\n for (const part of value.content) {\n if (\n !isPlainRecord(part) ||\n Object.keys(part).some((key) => key !== 'type' && key !== 'text') ||\n part.type !== 'text' ||\n typeof part.text !== 'string'\n ) {\n throw new Error('Model context content supports text parts only');\n }\n }\n }\n if (value.structuredContent !== undefined && !isPlainRecord(value.structuredContent)) {\n throw new Error('Model context structuredContent must be an object');\n }\n}\n\nfunction copyJsonValue(\n value: unknown,\n path: string,\n depth: number,\n ancestors: Set<object>,\n): AssistantJsonValue {\n if (depth > MAX_DEPTH) throw new Error(`Model context exceeds maximum depth at ${path}`);\n if (typeof value === 'string') {\n if (CREDENTIAL_SHAPED_TEXT.test(value)) {\n throw new Error(`Model context contains credential-shaped text at ${path}`);\n }\n return value;\n }\n if (\n value === null ||\n typeof value === 'boolean' ||\n (typeof value === 'number' && Number.isFinite(value))\n ) {\n return value;\n }\n if (typeof value !== 'object') throw new Error(`Model context contains non-JSON data at ${path}`);\n if (hasToJsonProperty(value)) {\n throw new Error(`Model context must not define or inherit toJSON at ${path}`);\n }\n const prototype = Object.getPrototypeOf(value);\n if (Array.isArray(value)) {\n if (prototype !== Array.prototype) {\n throw new Error(`Model context contains a non-JSON object at ${path}`);\n }\n } else if (prototype !== Object.prototype && prototype !== null) {\n throw new Error(`Model context contains a non-JSON object at ${path}`);\n }\n if (ancestors.has(value)) throw new Error(`Model context contains a cycle at ${path}`);\n\n if (Array.isArray(value)) {\n if (value.length > MAX_ENTRIES) {\n throw new Error(`Model context has more than 128 entries at ${path}`);\n }\n const copy: AssistantJsonValue[] = [];\n ancestors.add(value);\n for (let index = 0; index < value.length; index += 1) {\n const entry = Object.hasOwn(value, index) ? value[index] : null;\n copy.push(copyJsonValue(entry, `${path}.${index}`, depth + 1, ancestors));\n }\n ancestors.delete(value);\n return copy;\n }\n\n const entries = Object.entries(value);\n if (entries.length > MAX_ENTRIES) {\n throw new Error(`Model context has more than 128 entries at ${path}`);\n }\n const copy: Record<string, AssistantJsonValue> = Object.create(null);\n ancestors.add(value);\n for (const [key, entry] of entries) {\n if (SENSITIVE_KEY.test(key)) {\n throw new Error(`Model context contains sensitive key ${path}.${key}`);\n }\n copy[key] = copyJsonValue(entry, `${path}.${key}`, depth + 1, ancestors);\n }\n ancestors.delete(value);\n return copy;\n}\n\nfunction isPlainRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction hasToJsonProperty(value: object): boolean {\n let current: object | null = value;\n const visited = new Set<object>();\n while (current !== null && !visited.has(current)) {\n visited.add(current);\n if (Object.getOwnPropertyDescriptor(current, 'toJSON') !== undefined) return true;\n current = Object.getPrototypeOf(current);\n }\n return false;\n}\n","export interface AssistantEvent {\n readonly event: string;\n readonly data: Readonly<Record<string, unknown>>;\n}\n\nexport interface AssistantErrorDetail {\n readonly code: string;\n readonly status?: number;\n readonly retryable: boolean;\n}\n\n/** A 2xx response that is not one complete, well-formed assistant event stream. */\nexport class AssistantTransportError extends Error {\n readonly code = 'invalid_response' as const;\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'AssistantTransportError';\n }\n}\n\n/**\n * Consume JSON-bearing server-sent events without buffering the whole assistant turn.\n *\n * `done` is the stream commit marker. It is delivered only after EOF proves that it was the one terminal\n * event, so truncated, duplicate-terminal, and post-terminal responses can never resolve a client turn.\n */\nexport async function consumeAssistantEvents(\n response: Response,\n onEvent: (event: AssistantEvent) => void,\n): Promise<void> {\n const stream = new AssistantEventStream(onEvent);\n if (!response.body) {\n let text: string;\n try {\n text = await response.text();\n } catch (error) {\n if (isAbortError(error)) throw error;\n throw invalidStream('assistant event stream could not be read', error);\n }\n stream.push(text);\n stream.finish(response.headers.get('content-type') ?? '');\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder('utf-8', { fatal: true });\n while (true) {\n let result: ReadableStreamReadResult<Uint8Array>;\n try {\n result = await reader.read();\n } catch (error) {\n if (isAbortError(error)) throw error;\n throw invalidStream('assistant event stream ended unexpectedly', error);\n }\n\n let chunk: string;\n try {\n chunk = decoder.decode(result.value, { stream: !result.done });\n } catch (error) {\n throw invalidStream('assistant event stream contained invalid UTF-8', error);\n }\n stream.push(chunk);\n if (result.done) break;\n }\n stream.finish(response.headers.get('content-type') ?? '');\n}\n\nclass AssistantEventStream {\n readonly #onEvent: (event: AssistantEvent) => void;\n #pending = '';\n #terminal: AssistantEvent | undefined;\n\n constructor(onEvent: (event: AssistantEvent) => void) {\n this.#onEvent = onEvent;\n }\n\n push(chunk: string): void {\n this.#pending += chunk;\n const protectedCarriageReturn = this.#pending.endsWith('\\r');\n const normalizable = protectedCarriageReturn ? this.#pending.slice(0, -1) : this.#pending;\n const frames = normalizeLineEndings(normalizable).split('\\n\\n');\n this.#pending = `${frames.pop() ?? ''}${protectedCarriageReturn ? '\\r' : ''}`;\n for (const frame of frames) this.#acceptFrame(frame);\n }\n\n finish(contentType: string): void {\n if (this.#pending.trim().length > 0) {\n throw invalidStream('assistant event stream ended with an unterminated frame');\n }\n if (!this.#terminal) {\n throw invalidStream(\n `assistant response did not contain a terminal done event (content-type: ${contentType || 'unknown'})`,\n );\n }\n this.#onEvent(this.#terminal);\n }\n\n #acceptFrame(frame: string): void {\n const event = parseFrame(frame);\n if (!event) return;\n if (this.#terminal) {\n throw invalidStream('assistant event stream contained an event after done');\n }\n if (event.event === 'done') {\n this.#terminal = event;\n return;\n }\n this.#onEvent(event);\n }\n}\n\nfunction parseFrame(frame: string): AssistantEvent | undefined {\n let event: string | undefined;\n const data: string[] = [];\n let hasFields = false;\n for (const line of frame.split('\\n')) {\n if (!line || line.startsWith(':')) continue;\n hasFields = true;\n const separator = line.indexOf(':');\n const field = separator < 0 ? line : line.slice(0, separator);\n const value = separator < 0 ? '' : line.slice(separator + 1).replace(/^ /, '');\n if (field === 'event') event = value;\n if (field === 'data') data.push(value);\n }\n if (!hasFields) return undefined;\n if (!event || data.length === 0) {\n throw invalidStream('assistant event stream contained a malformed frame');\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(data.join('\\n'));\n } catch (error) {\n throw invalidStream('assistant event stream contained malformed JSON', error);\n }\n if (event === 'done' && !isValidDonePayload(parsed)) {\n throw invalidStream('assistant event stream contained an invalid done event');\n }\n return { event, data: isRecord(parsed) ? parsed : { value: parsed } };\n}\n\nfunction normalizeLineEndings(input: string): string {\n return input.replaceAll('\\r\\n', '\\n').replaceAll('\\r', '\\n');\n}\n\nfunction isValidDonePayload(value: unknown): value is Readonly<Record<string, unknown>> {\n return (\n isRecord(value) &&\n (value.turnId === undefined || (typeof value.turnId === 'string' && value.turnId.length > 0))\n );\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction invalidStream(message: string, cause?: unknown): AssistantTransportError {\n return new AssistantTransportError(message, cause === undefined ? undefined : { cause });\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof DOMException && error.name === 'AbortError';\n}\n","import type { AssistantConfiguration } from './appearance.js';\nimport { type AssistantClientEvent, toAssistantClientEvent } from './events.js';\nimport {\n type AssistantJsonValue,\n type AssistantModelContextUpdate,\n type AssistantPageContext,\n copyAssistantModelContext,\n copyAssistantPageContext,\n} from './model-context.js';\nimport {\n type AssistantErrorDetail,\n AssistantTransportError,\n consumeAssistantEvents,\n} from './transport.js';\n\nexport type AssistantContextValue = string | number | boolean | null;\nexport type AssistantContext = Readonly<Record<string, AssistantContextValue>>;\n\nexport interface AssistantClientContext {\n readonly locale?: string;\n readonly timeZone?: string;\n}\n\nexport type {\n AssistantJsonValue,\n AssistantModelContextUpdate,\n AssistantPageContext,\n} from './model-context.js';\n\nexport type AssistantInteractionResponse =\n | { readonly action: 'accept'; readonly content?: AssistantJsonValue }\n | { readonly action: 'decline' | 'cancel' };\n\nexport interface AssistantSessionResponse {\n readonly token: string;\n readonly expiresAt: string;\n readonly endpoints: {\n readonly turns: string;\n readonly toolConfirmations: string;\n readonly interactions?: string;\n readonly apps?: string;\n };\n readonly configuration?: AssistantConfiguration;\n}\n\nexport type {\n AssistantClientEvent,\n AssistantClientLifecycleEvent,\n AssistantContentDetail,\n AssistantContentEvent,\n AssistantDoneEvent,\n AssistantErrorEvent,\n AssistantErrorEventDetail,\n AssistantInputRequestedDetail,\n AssistantInputRequestedEvent,\n AssistantInteractionResolvedDetail,\n AssistantInteractionResolvedEvent,\n AssistantToolCompletedDetail,\n AssistantToolCompletedEvent,\n AssistantToolProposedDetail,\n AssistantToolProposedEvent,\n AssistantUnrecognizedEvent,\n AssistantViewAvailableDetail,\n AssistantViewAvailableEvent,\n} from './events.js';\n\nexport interface CreateAssistantClientOptions<\n TPageContext extends AssistantPageContext = AssistantContext,\n> {\n readonly sessionEndpoint: string;\n readonly fetch?: typeof fetch;\n /** Untrusted page context sent only when exchanging a session. */\n readonly context?: AssistantContext;\n /** Untrusted presentation hints evaluated for every turn request. */\n readonly clientContext?: AssistantClientContext | (() => AssistantClientContext | undefined);\n /** Typed, untrusted application context evaluated for every turn request. */\n readonly pageContext?: TPageContext | (() => TPageContext | undefined);\n /** Latest renderer-selected summary included as untrusted data on every message turn. */\n readonly modelContext?: AssistantModelContextUpdate;\n}\n\nexport interface AssistantClient<TPageContext extends AssistantPageContext = AssistantContext> {\n subscribe(listener: (event: AssistantClientEvent) => void): () => void;\n connect(): Promise<void>;\n sendMessage(message: string): Promise<void>;\n respond(id: string, response: AssistantInteractionResponse): Promise<void>;\n updateContext(context: AssistantContext): void;\n updatePageContext(context: TPageContext): void;\n updateModelContext(update: AssistantModelContextUpdate): void;\n requestApp(method: string, params: Readonly<Record<string, unknown>>): Promise<unknown>;\n resetSession(): void;\n abort(): void;\n}\n\nexport class AssistantClientError extends Error {\n readonly detail: AssistantErrorDetail;\n\n constructor(detail: AssistantErrorDetail, message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'AssistantClientError';\n this.detail = detail;\n }\n}\n\nclass DefaultAssistantClient<TPageContext extends AssistantPageContext>\n implements AssistantClient<TPageContext>\n{\n readonly #sessionEndpoint: string;\n readonly #fetch: typeof fetch;\n readonly #listeners = new Set<(event: AssistantClientEvent) => void>();\n readonly #clientContext:\n | AssistantClientContext\n | (() => AssistantClientContext | undefined)\n | undefined;\n #pageContext: TPageContext | (() => TPageContext | undefined) | undefined;\n #session: AssistantSessionResponse | undefined;\n #context: AssistantContext | undefined;\n #modelContext: AssistantModelContextUpdate | undefined;\n #active: AbortController | undefined;\n\n constructor(options: CreateAssistantClientOptions<TPageContext>) {\n if (!options.sessionEndpoint) throw new Error('sessionEndpoint is required');\n this.#sessionEndpoint = options.sessionEndpoint;\n // Some browsers require `window.fetch` to be invoked with its global receiver. Keep the default\n // behind a closure instead of storing the unbound host method; injected test/server fetches remain exact.\n this.#fetch = options.fetch ?? ((input, init) => globalThis.fetch(input, init));\n this.#context = options.context ? { ...options.context } : undefined;\n this.#modelContext = options.modelContext\n ? copyAssistantModelContext(options.modelContext)\n : undefined;\n this.#clientContext = options.clientContext;\n this.#pageContext = options.pageContext;\n }\n\n subscribe(listener: (event: AssistantClientEvent) => void): () => void {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n }\n\n async connect(): Promise<void> {\n if (this.#session) return;\n await this.#singleFlight(async (signal) => {\n if (!this.#session) await this.#createSession(signal);\n });\n }\n\n async sendMessage(text: string): Promise<void> {\n const message = text.trim();\n if (!message) return;\n await this.#singleFlight(async (signal) => {\n await this.#sendTurn(message, true, signal, this.#modelContext);\n });\n }\n\n async respond(id: string, resolution: AssistantInteractionResponse): Promise<void> {\n if (!id) {\n throw clientError('invalid_request', 'interaction id is required', false);\n }\n await this.#singleFlight(async (signal) => {\n const session = this.#session;\n if (!session) {\n throw clientError('confirmation_expired', 'assistant session is not active', false);\n }\n const modernEndpoint = session.endpoints.interactions;\n if (!modernEndpoint && resolution.action !== 'accept') {\n throw clientError(\n 'unsupported_service',\n 'the assistant service does not support declining or cancelling interactions',\n false,\n );\n }\n const endpoint = modernEndpoint ?? session.endpoints.toolConfirmations;\n const body = modernEndpoint\n ? {\n id,\n action: resolution.action,\n ...(resolution.action === 'accept' && resolution.content !== undefined\n ? { content: resolution.content }\n : {}),\n }\n : { id };\n this.#emit({ event: 'interaction_started', data: { id, action: resolution.action } });\n const response = await this.#request(\n endpoint,\n {\n method: 'POST',\n headers: authorizedHeaders(session.token, 'text/event-stream'),\n body: JSON.stringify(body),\n signal,\n },\n 'confirmation_failed',\n );\n if (response.status === 401) {\n this.#session = undefined;\n this.#emit({ event: 'session_expired', data: {} });\n }\n if (!response.ok) {\n const serverCode = await readStableErrorCode(response);\n const expired = response.status === 401 || response.status === 409;\n throw clientError(\n serverCode ?? (expired ? 'confirmation_expired' : 'confirmation_failed'),\n `Assistant interaction failed (${response.status})`,\n false,\n response.status,\n );\n }\n await this.#consume(response);\n this.#emit({ event: 'interaction_completed', data: { id, action: resolution.action } });\n });\n }\n\n updateContext(context: AssistantContext): void {\n this.#context = { ...context };\n this.#emit({ event: 'context_changed', data: { context: this.#context } });\n }\n\n updatePageContext(context: TPageContext): void {\n this.#pageContext = copyAssistantPageContext(context) as TPageContext;\n }\n\n updateModelContext(update: AssistantModelContextUpdate): void {\n this.#modelContext = copyAssistantModelContext(update);\n this.#emit({ event: 'model_context_changed', data: { modelContext: this.#modelContext } });\n }\n\n async requestApp(method: string, params: Readonly<Record<string, unknown>>): Promise<unknown> {\n const session = this.#session;\n if (!session?.endpoints.apps) {\n throw clientError(\n 'unsupported_service',\n 'the assistant service does not support MCP Apps',\n false,\n );\n }\n const response = await this.#request(\n session.endpoints.apps,\n {\n method: 'POST',\n headers: authorizedHeaders(session.token, 'application/json'),\n body: JSON.stringify({ method, params }),\n },\n 'app_request_failed',\n );\n if (!response.ok) {\n throw clientError(\n 'app_request_failed',\n `Assistant app request failed (${response.status})`,\n false,\n response.status,\n );\n }\n return response.json();\n }\n\n resetSession(): void {\n this.#session = undefined;\n this.#emit({ event: 'session_reset', data: {} });\n }\n\n abort(): void {\n this.#active?.abort();\n }\n\n async #sendTurn(\n message: string,\n mayRetry: boolean,\n signal: AbortSignal,\n modelContext: AssistantModelContextUpdate | undefined,\n ): Promise<void> {\n const session = this.#session ?? (await this.#createSession(signal));\n if (mayRetry) this.#emit({ event: 'message_started', data: { message } });\n const clientContext = this.#resolveClientContext();\n const pageContext = this.#resolvePageContext();\n const response = await this.#request(\n session.endpoints.turns,\n {\n method: 'POST',\n headers: authorizedHeaders(session.token, 'text/event-stream'),\n body: JSON.stringify({\n message,\n ...(clientContext ? { clientContext } : {}),\n ...(pageContext === undefined ? {} : { pageContext }),\n ...(modelContext ? { modelContext } : {}),\n }),\n signal,\n },\n 'turn_failed',\n );\n if (response.status === 401 && mayRetry) {\n this.#session = undefined;\n this.#emit({ event: 'session_expired', data: {} });\n await this.#sendTurn(message, false, signal, modelContext);\n return;\n }\n if (!response.ok) {\n throw clientError(\n 'turn_failed',\n `Assistant turn failed (${response.status})`,\n false,\n response.status,\n );\n }\n await this.#consume(response);\n this.#emit({ event: 'message_completed', data: {} });\n }\n\n #resolveClientContext(): AssistantClientContext | undefined {\n let value: AssistantClientContext | undefined;\n try {\n value =\n typeof this.#clientContext === 'function' ? this.#clientContext() : this.#clientContext;\n } catch (error) {\n throw clientError(\n 'turn_failed',\n 'Assistant client context provider failed',\n false,\n undefined,\n {\n cause: error,\n },\n );\n }\n if (!value) return undefined;\n const context = {\n ...(typeof value.locale === 'string' && value.locale ? { locale: value.locale } : {}),\n ...(typeof value.timeZone === 'string' && value.timeZone ? { timeZone: value.timeZone } : {}),\n };\n return Object.keys(context).length > 0 ? context : undefined;\n }\n\n #resolvePageContext(): TPageContext | undefined {\n try {\n const value =\n typeof this.#pageContext === 'function'\n ? (this.#pageContext as () => TPageContext | undefined)()\n : this.#pageContext;\n return value === undefined ? undefined : (copyAssistantPageContext(value) as TPageContext);\n } catch (error) {\n throw clientError('turn_failed', 'Assistant page context provider failed', false, undefined, {\n cause: error,\n });\n }\n }\n\n async #createSession(signal: AbortSignal): Promise<AssistantSessionResponse> {\n const response = await this.#request(\n this.#sessionEndpoint,\n {\n method: 'POST',\n headers: { Accept: 'application/json', 'Content-Type': 'application/json' },\n body: JSON.stringify(this.#context ? { context: this.#context } : {}),\n credentials: 'same-origin',\n signal,\n },\n 'session_failed',\n );\n if (!response.ok) {\n throw clientError(\n 'session_failed',\n `Assistant session failed (${response.status})`,\n true,\n response.status,\n );\n }\n let value: unknown;\n try {\n value = await response.json();\n } catch (error) {\n throw clientError(\n 'session_failed',\n 'Assistant session returned invalid JSON',\n true,\n undefined,\n {\n cause: error,\n },\n );\n }\n const session = parseSession(value);\n this.#session = session;\n this.#emit({\n event: 'session_started',\n data: {\n expiresAt: session.expiresAt,\n ...(session.configuration ? { configuration: session.configuration } : {}),\n },\n });\n return session;\n }\n\n async #consume(response: Response): Promise<void> {\n let streamError: AssistantErrorDetail | undefined;\n try {\n await consumeAssistantEvents(response, (event) => {\n const clientEvent = toAssistantClientEvent(event);\n this.#emit(clientEvent);\n if (clientEvent.event !== 'error' || typeof clientEvent.data.code !== 'string') return;\n streamError = {\n code: clientEvent.data.code,\n ...(typeof clientEvent.data.status === 'number'\n ? { status: clientEvent.data.status }\n : {}),\n retryable: clientEvent.data.retryable === true,\n };\n });\n } catch (error) {\n if (error instanceof AssistantTransportError) {\n throw clientError(error.code, error.message, false, undefined, { cause: error });\n }\n throw error;\n }\n if (streamError) {\n throw clientError(\n streamError.code,\n `Assistant stream failed (${streamError.code})`,\n streamError.retryable,\n streamError.status,\n );\n }\n }\n\n async #request(input: string, init: RequestInit, failureCode: string): Promise<Response> {\n try {\n return await this.#fetch(input, init);\n } catch (error) {\n if (init.signal?.aborted) throw error;\n throw clientError(failureCode, 'Assistant request failed', true, undefined, { cause: error });\n }\n }\n\n async #singleFlight(operation: (signal: AbortSignal) => Promise<void>): Promise<void> {\n if (this.#active) {\n throw clientError('request_in_progress', 'an assistant request is already in progress', true);\n }\n const controller = new AbortController();\n this.#active = controller;\n try {\n await operation(controller.signal);\n } catch (error) {\n if (controller.signal.aborted) {\n throw clientError('request_aborted', 'assistant request was aborted', true, undefined, {\n cause: error,\n });\n }\n throw error;\n } finally {\n this.#active = undefined;\n }\n }\n\n #emit(event: AssistantClientEvent): void {\n for (const listener of this.#listeners) {\n try {\n listener(event);\n } catch {\n // Renderers are independent observers; one subscriber cannot change a completed request.\n }\n }\n }\n}\n\nexport function createAssistantClient<TPageContext extends AssistantPageContext = AssistantContext>(\n options: CreateAssistantClientOptions<TPageContext>,\n): AssistantClient<TPageContext> {\n return new DefaultAssistantClient(options);\n}\n\nfunction authorizedHeaders(token: string, accept: string): Readonly<Record<string, string>> {\n return {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n Accept: accept,\n };\n}\n\nfunction parseSession(value: unknown): AssistantSessionResponse {\n if (!isRecord(value) || !isRecord(value.endpoints)) {\n throw clientError('session_failed', 'Assistant session response is invalid', true);\n }\n const interactions = value.endpoints.interactions;\n const apps = value.endpoints.apps;\n if (\n typeof value.token !== 'string' ||\n typeof value.expiresAt !== 'string' ||\n typeof value.endpoints.turns !== 'string' ||\n typeof value.endpoints.toolConfirmations !== 'string' ||\n (interactions !== undefined && typeof interactions !== 'string') ||\n (apps !== undefined && typeof apps !== 'string')\n ) {\n throw clientError('session_failed', 'Assistant session response is invalid', true);\n }\n return {\n token: value.token,\n expiresAt: value.expiresAt,\n endpoints: {\n turns: value.endpoints.turns,\n toolConfirmations: value.endpoints.toolConfirmations,\n ...(typeof interactions === 'string' ? { interactions } : {}),\n ...(typeof apps === 'string' ? { apps } : {}),\n },\n ...(isRecord(value.configuration)\n ? { configuration: value.configuration as AssistantConfiguration }\n : {}),\n };\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nasync function readStableErrorCode(response: Response): Promise<string | undefined> {\n let value: unknown;\n try {\n value = await response.json();\n } catch {\n return undefined;\n }\n if (!isRecord(value) || typeof value.code !== 'string') return undefined;\n return /^[A-Za-z0-9_.-]{1,64}$/.test(value.code) ? value.code : undefined;\n}\n\nfunction clientError(\n code: string,\n message: string,\n retryable: boolean,\n status?: number,\n options?: ErrorOptions,\n): AssistantClientError {\n return new AssistantClientError(\n { code, ...(status === undefined ? {} : { status }), retryable },\n message,\n options,\n );\n}\n"],"mappings":"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","names":["copy","isRecord","isRecord"]}
|