@convai/web-sdk 1.8.0-beta.6 → 1.8.0-beta.7
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 +285 -1
- package/dist/core/ConvaiClient.d.ts +59 -2
- package/dist/core/ConvaiClient.d.ts.map +1 -1
- package/dist/core/ConvaiClient.js +457 -6
- package/dist/core/ConvaiClient.js.map +1 -1
- package/dist/core/MessageHandler.d.ts +11 -0
- package/dist/core/MessageHandler.d.ts.map +1 -1
- package/dist/core/MessageHandler.js +325 -30
- package/dist/core/MessageHandler.js.map +1 -1
- package/dist/core/SSESession.js +2 -2
- package/dist/core/SSESession.js.map +1 -1
- package/dist/core/connectRequest.d.ts +38 -3
- package/dist/core/connectRequest.d.ts.map +1 -1
- package/dist/core/connectRequest.js +57 -11
- package/dist/core/connectRequest.js.map +1 -1
- package/dist/core/index.d.ts +3 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/logicalTurn.d.ts +4 -1
- package/dist/core/logicalTurn.d.ts.map +1 -1
- package/dist/core/logicalTurn.js +35 -4
- package/dist/core/logicalTurn.js.map +1 -1
- package/dist/core/modelOutput.d.ts +40 -0
- package/dist/core/modelOutput.d.ts.map +1 -0
- package/dist/core/modelOutput.js +187 -0
- package/dist/core/modelOutput.js.map +1 -0
- package/dist/core/publishedChat.d.ts +9 -0
- package/dist/core/publishedChat.d.ts.map +1 -0
- package/dist/core/publishedChat.js +13 -0
- package/dist/core/publishedChat.js.map +1 -0
- package/dist/core/types.d.ts +225 -25
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/embed/ConvaiChatElement.d.ts +27 -0
- package/dist/embed/ConvaiChatElement.d.ts.map +1 -0
- package/dist/embed/ConvaiChatElement.js +300 -0
- package/dist/embed/ConvaiChatElement.js.map +1 -0
- package/dist/embed/browser.d.ts +3 -0
- package/dist/embed/browser.d.ts.map +1 -0
- package/dist/embed/browser.js +5 -0
- package/dist/embed/browser.js.map +1 -0
- package/dist/embed/chat-embed-v1.js +100 -0
- package/dist/embed/chat-embed-v1.js.map +7 -0
- package/dist/embed/index.d.ts +9 -0
- package/dist/embed/index.d.ts.map +1 -0
- package/dist/embed/index.js +9 -0
- package/dist/embed/index.js.map +1 -0
- package/dist/embed/publicationApi.d.ts +23 -0
- package/dist/embed/publicationApi.d.ts.map +1 -0
- package/dist/embed/publicationApi.js +141 -0
- package/dist/embed/publicationApi.js.map +1 -0
- package/dist/react/components/ConvaiWidget.d.ts +11 -1
- package/dist/react/components/ConvaiWidget.d.ts.map +1 -1
- package/dist/react/components/ConvaiWidget.js +67 -11
- package/dist/react/components/ConvaiWidget.js.map +1 -1
- package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.d.ts +1 -1
- package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.d.ts.map +1 -1
- package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.js +2 -2
- package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.js.map +1 -1
- package/dist/react/hooks/useConvaiClient.d.ts +2 -0
- package/dist/react/hooks/useConvaiClient.d.ts.map +1 -1
- package/dist/react/hooks/useConvaiClient.js +8 -0
- package/dist/react/hooks/useConvaiClient.js.map +1 -1
- package/dist/react/index.d.ts +1 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/vanilla/ConvaiWidget.d.ts.map +1 -1
- package/dist/vanilla/ConvaiWidget.js +153 -32
- package/dist/vanilla/ConvaiWidget.js.map +1 -1
- package/dist/vanilla/WidgetEventSubscriptions.d.ts +15 -0
- package/dist/vanilla/WidgetEventSubscriptions.d.ts.map +1 -0
- package/dist/vanilla/WidgetEventSubscriptions.js +37 -0
- package/dist/vanilla/WidgetEventSubscriptions.js.map +1 -0
- package/dist/vanilla/index.d.ts +1 -1
- package/dist/vanilla/index.d.ts.map +1 -1
- package/dist/vanilla/index.js +1 -1
- package/dist/vanilla/index.js.map +1 -1
- package/dist/vanilla/types.d.ts +8 -1
- package/dist/vanilla/types.d.ts.map +1 -1
- package/dist/vanilla/types.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +19 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectRequest.js","sourceRoot":"","sources":["../../src/core/connectRequest.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"connectRequest.js","sourceRoot":"","sources":["../../src/core/connectRequest.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ClientToolDeclaration,\n ConvaiConfig,\n JsonObject,\n ProtocolCapabilitiesConfig,\n} from \"./types\";\n\nexport interface BlendshapeConnectRequestConfig {\n blendshape_provider: \"neurosync\" | \"not_provided\";\n blendshape_config: {\n enable_chunking: true;\n chunk_size: number;\n format: \"arkit\" | \"mha\" | \"cc4_extended\" | \"cc5_hd\" | \"visemes\";\n frames_buffer_duration: number;\n output_fps: number;\n deliver_chunks_ahead?: true;\n };\n}\n\nexport interface ClientToolConnectRequestDeclaration {\n name: string;\n description: string;\n input_schema: JsonObject;\n}\n\nexport interface ProtocolCapabilitiesConnectRequest {\n action_protocol_version?: 1 | 2;\n model_output_version?: 1 | 2;\n}\n\n/**\n * Serialize only explicitly selected capabilities.\n *\n * Returning undefined for an omitted or empty config keeps legacy /connect\n * request bodies unchanged, including for clients using strict wire snapshots.\n */\nexport function serializeProtocolCapabilities(\n capabilities: ProtocolCapabilitiesConfig | undefined,\n): ProtocolCapabilitiesConnectRequest | undefined {\n if (!capabilities) return undefined;\n\n const serialized: ProtocolCapabilitiesConnectRequest = {\n ...(capabilities.actionProtocolVersion !== undefined && {\n action_protocol_version: capabilities.actionProtocolVersion,\n }),\n ...(capabilities.modelOutputVersion !== undefined && {\n model_output_version: capabilities.modelOutputVersion,\n }),\n };\n\n return Object.keys(serialized).length > 0 ? serialized : undefined;\n}\n\n/** Serialize the public camelCase SDK shape to Core's snake_case wire contract. */\nexport function serializeClientTools(\n tools: ClientToolDeclaration[],\n): ClientToolConnectRequestDeclaration[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n }));\n}\n\n/** Reject unsupported action versions, downgrades, and unsolicited v2 upgrades. */\nexport function validateActionProtocolSelection(\n requestedVersion: 1 | 2 | undefined,\n selectedVersion: unknown,\n): void {\n if (\n selectedVersion != null &&\n selectedVersion !== 1 &&\n selectedVersion !== 2\n ) {\n throw new Error(\n `Core selected unsupported action protocol version: ${String(selectedVersion)}`,\n );\n }\n if (requestedVersion === 2 && selectedVersion !== 2) {\n throw new Error(\"Core did not select requested action protocol version 2\");\n }\n if (selectedVersion === 2 && requestedVersion !== 2) {\n throw new Error(\n \"Core selected action protocol version 2 without an explicit client opt-in\",\n );\n }\n}\n\n/** Reject unsupported model-output versions, downgrades, and unsolicited v2 upgrades. */\nexport function validateModelOutputVersionSelection(\n requestedVersion: 1 | 2 | undefined,\n selectedVersion: unknown,\n): 1 | 2 {\n if (\n selectedVersion != null &&\n selectedVersion !== 1 &&\n selectedVersion !== 2\n ) {\n throw new Error(\n `Core selected unsupported model output version: ${String(selectedVersion)}`,\n );\n }\n if (requestedVersion === 2 && selectedVersion !== 2) {\n throw new Error(\"Core did not select requested model output version 2\");\n }\n if (selectedVersion === 2 && requestedVersion !== 2) {\n throw new Error(\n \"Core selected model output version 2 without an explicit client opt-in\",\n );\n }\n\n return selectedVersion === 2 ? 2 : 1;\n}\n\n/**\n * Build the lipsync part of the /connect request.\n *\n * Ahead-delivery changes the client contract because frames can arrive before\n * bot-started-speaking and cancellation must be handled with owner metadata.\n * It is the default now that server support is verified; callers can fall back\n * to the legacy paced path with deliver_chunks_ahead: false.\n */\nexport function buildBlendshapeConnectConfig(\n config: Pick<ConvaiConfig, \"enableLipsync\" | \"blendshapeConfig\">,\n): BlendshapeConnectRequestConfig {\n const deliverChunksAhead =\n config.enableLipsync === true &&\n config.blendshapeConfig?.deliver_chunks_ahead !== false;\n\n return {\n blendshape_provider: config.enableLipsync ? \"neurosync\" : \"not_provided\",\n blendshape_config: {\n enable_chunking: true,\n chunk_size: 10,\n format: config.blendshapeConfig?.format || \"mha\",\n frames_buffer_duration:\n config.blendshapeConfig?.frames_buffer_duration ?? 0.1,\n // In the legacy paced path, output_fps is a delivery cadence and the SDK\n // player keeps its 60fps visual timeline. Only ahead-delivery treats\n // output_fps as a client-visible timeline override because chunks carry\n // fps metadata.\n output_fps: deliverChunksAhead\n ? config.blendshapeConfig?.output_fps ?? 60\n : 90,\n ...(deliverChunksAhead ? { deliver_chunks_ahead: true } : {}),\n },\n };\n}\n\nexport function buildEmotionConnectConfig(\n config: Pick<ConvaiConfig, \"enableEmotion\" | \"emotionConfig\">,\n): Record<string, unknown> | undefined {\n if (config.enableEmotion !== true) return undefined;\n const emotionConfig = config.emotionConfig;\n if (emotionConfig?.provider === \"nrclex\") {\n return {\n provider: emotionConfig.provider,\n min_word_threshold: emotionConfig.min_word_threshold ?? 3,\n low_intensity_threshold: emotionConfig.low_intensity_threshold ?? 0.33,\n high_intensity_threshold: emotionConfig.high_intensity_threshold ?? 0.66,\n };\n }\n return { provider: emotionConfig?.provider ?? \"llm\" };\n}\n\n/** The `action_config` block as sent on the wire; tools are already serialized. */\nexport interface ActionConnectRequestConfig {\n actions: string[];\n characters: { name: string; bio: string }[];\n objects: { name: string; description: string }[];\n current_attention_object?: string;\n tools?: ClientToolConnectRequestDeclaration[];\n}\n\nexport function buildActionConnectConfig(\n config: Pick<ConvaiConfig, \"actionConfig\">,\n): ActionConnectRequestConfig | undefined {\n const actionConfig = config.actionConfig;\n if (!actionConfig) return undefined;\n return {\n actions: actionConfig.actions,\n objects: actionConfig.objects,\n characters: actionConfig.characters,\n ...(actionConfig.current_attention_object && {\n current_attention_object: actionConfig.current_attention_object,\n }),\n ...(actionConfig.tools && { tools: serializeClientTools(actionConfig.tools) }),\n };\n}\n\n"]}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { ConvaiClient } from './ConvaiClient.js';
|
|
1
|
+
export { ActionResultAckError, ConvaiClient } from './ConvaiClient.js';
|
|
2
2
|
export * from './types.js';
|
|
3
3
|
export { getDisconnectReasonMessage } from './types.js';
|
|
4
4
|
export type { ConvaiClient as ConvaiClientType } from './ConvaiClient.js';
|
|
@@ -15,4 +15,6 @@ export { parseCharacterReference, resolveCharacterReference, isCharacterVersionS
|
|
|
15
15
|
export { BlendshapeQueue } from './BlendshapeQueue.js';
|
|
16
16
|
export type { TurnStats, BlendshapeChunkMetadata } from './BlendshapeQueue.js';
|
|
17
17
|
export { EventEmitter } from './EventEmitter.js';
|
|
18
|
+
export { ModelOutputExtensionRegistry, isJsonObject, isJsonValue, parseModelOutputMessage, } from './modelOutput.js';
|
|
19
|
+
export type { ExtensionRenderResult, ModelOutputExtensionRenderer, } from './modelOutput.js';
|
|
18
20
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGpE,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAGrD,YAAY,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,8BAA8B,EAC9B,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAG5E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EACL,4BAA4B,EAC5B,YAAY,EACZ,WAAW,EACX,uBAAuB,GACxB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,eAAe,CAAC"}
|
package/dist/core/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Main client
|
|
2
|
-
export { ConvaiClient } from './ConvaiClient.js';
|
|
2
|
+
export { ActionResultAckError, ConvaiClient } from './ConvaiClient.js';
|
|
3
3
|
// Types (including IConvaiClient interface)
|
|
4
4
|
export * from './types.js';
|
|
5
5
|
// Helper functions
|
|
@@ -20,4 +20,5 @@ export { parseCharacterReference, resolveCharacterReference, isCharacterVersionS
|
|
|
20
20
|
export { BlendshapeQueue } from './BlendshapeQueue.js';
|
|
21
21
|
// Event Emitter (for advanced usage)
|
|
22
22
|
export { EventEmitter } from './EventEmitter.js';
|
|
23
|
+
export { ModelOutputExtensionRegistry, isJsonObject, isJsonValue, parseModelOutputMessage, } from './modelOutput.js';
|
|
23
24
|
//# sourceMappingURL=index.js.map
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEpE,4CAA4C;AAC5C,cAAc,SAAS,CAAC;AAExB,mBAAmB;AACnB,OAAO,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAKrD,gCAAgC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,8BAA8B,EAC9B,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AAEnC,kDAAkD;AAClD,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAE9B,+BAA+B;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,qCAAqC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EACL,4BAA4B,EAC5B,YAAY,EACZ,WAAW,EACX,uBAAuB,GACxB,MAAM,eAAe,CAAC","sourcesContent":["// Main client\nexport { ActionResultAckError, ConvaiClient } from './ConvaiClient';\n\n// Types (including IConvaiClient interface)\nexport * from './types';\n\n// Helper functions\nexport { getDisconnectReasonMessage } from './types';\n\n// Type alias for easier usage\nexport type { ConvaiClient as ConvaiClientType } from './ConvaiClient';\n\n// Managers (for advanced usage)\nexport { AudioManager } from './AudioManager';\nexport { VideoManager } from './VideoManager';\nexport { ScreenShareManager } from './ScreenShareManager';\nexport { MessageHandler } from './MessageHandler';\nexport { MemoryManager } from './MemoryManager';\nexport { CharacterRoster } from './CharacterRoster';\nexport { ConvaiRoomError } from './ConvaiRoomError';\nexport {\n MULTI_CHARACTER_MAX_CHARACTERS,\n isRosterConfig,\n} from './rosterRequest';\nexport {\n CharacterVersionManager,\n CharacterApiError,\n DEFAULT_CHARACTER_API_URL,\n} from './CharacterVersionManager';\n\n// Character reference helpers (version selectors)\nexport {\n parseCharacterReference,\n resolveCharacterReference,\n isCharacterVersionSelector,\n isCharacterUuid,\n} from './characterReference';\n\n// Blendshape queue for lipsync\nexport { BlendshapeQueue } from './BlendshapeQueue';\nexport type { TurnStats, BlendshapeChunkMetadata } from './BlendshapeQueue';\n\n// Event Emitter (for advanced usage)\nexport { EventEmitter } from './EventEmitter';\n\nexport {\n ModelOutputExtensionRegistry,\n isJsonObject,\n isJsonValue,\n parseModelOutputMessage,\n} from './modelOutput';\nexport type {\n ExtensionRenderResult,\n ModelOutputExtensionRenderer,\n} from './modelOutput';\n"]}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/** Maximum wire size for a logical turn identifier, in UTF-8 bytes. */
|
|
2
2
|
export declare const LOGICAL_TURN_ID_MAX_UTF8_BYTES = 128;
|
|
3
|
-
/**
|
|
3
|
+
/** Maximum wire size for a model invocation identifier, in UTF-8 bytes. */
|
|
4
|
+
export declare const OUTPUT_ID_MAX_UTF8_BYTES = 128;
|
|
4
5
|
export declare function isValidLogicalTurnId(value: unknown): value is string;
|
|
6
|
+
/** Return whether a Core model invocation id is safe to retain and expose. */
|
|
7
|
+
export declare function isValidOutputId(value: unknown): value is string;
|
|
5
8
|
//# sourceMappingURL=logicalTurn.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logicalTurn.d.ts","sourceRoot":"","sources":["../../src/core/logicalTurn.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD,
|
|
1
|
+
{"version":3,"file":"logicalTurn.d.ts","sourceRoot":"","sources":["../../src/core/logicalTurn.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD,2EAA2E;AAC3E,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAoC5C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAKpE;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE/D"}
|
package/dist/core/logicalTurn.js
CHANGED
|
@@ -1,10 +1,41 @@
|
|
|
1
1
|
/** Maximum wire size for a logical turn identifier, in UTF-8 bytes. */
|
|
2
2
|
export const LOGICAL_TURN_ID_MAX_UTF8_BYTES = 128;
|
|
3
|
-
/**
|
|
4
|
-
export
|
|
3
|
+
/** Maximum wire size for a model invocation identifier, in UTF-8 bytes. */
|
|
4
|
+
export const OUTPUT_ID_MAX_UTF8_BYTES = 128;
|
|
5
|
+
/** Reject lone UTF-16 surrogates instead of silently encoding U+FFFD. */
|
|
6
|
+
function isWellFormedUtf16(value) {
|
|
7
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
8
|
+
const codeUnit = value.charCodeAt(index);
|
|
9
|
+
if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {
|
|
10
|
+
const next = value.charCodeAt(index + 1);
|
|
11
|
+
if (!(next >= 0xdc00 && next <= 0xdfff))
|
|
12
|
+
return false;
|
|
13
|
+
index += 1;
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff)
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Return whether a logical turn identifier is safe to place on the wire.
|
|
23
|
+
*
|
|
24
|
+
* Identifiers are preserved exactly. They must contain at least one
|
|
25
|
+
* non-whitespace character and fit within the bounded RTVI field.
|
|
26
|
+
*/
|
|
27
|
+
function isValidBoundedCorrelationId(value, maxUtf8Bytes) {
|
|
5
28
|
return (typeof value === "string" &&
|
|
6
29
|
value.trim().length > 0 &&
|
|
7
|
-
value
|
|
8
|
-
|
|
30
|
+
isWellFormedUtf16(value) &&
|
|
31
|
+
value.length <= maxUtf8Bytes &&
|
|
32
|
+
new TextEncoder().encode(value).byteLength <= maxUtf8Bytes);
|
|
33
|
+
}
|
|
34
|
+
export function isValidLogicalTurnId(value) {
|
|
35
|
+
return isValidBoundedCorrelationId(value, LOGICAL_TURN_ID_MAX_UTF8_BYTES);
|
|
36
|
+
}
|
|
37
|
+
/** Return whether a Core model invocation id is safe to retain and expose. */
|
|
38
|
+
export function isValidOutputId(value) {
|
|
39
|
+
return isValidBoundedCorrelationId(value, OUTPUT_ID_MAX_UTF8_BYTES);
|
|
9
40
|
}
|
|
10
41
|
//# sourceMappingURL=logicalTurn.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logicalTurn.js","sourceRoot":"","sources":["../../src/core/logicalTurn.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAElD,
|
|
1
|
+
{"version":3,"file":"logicalTurn.js","sourceRoot":"","sources":["../../src/core/logicalTurn.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAElD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAE5C,yEAAyE;AACzE,SAAS,iBAAiB,CAAC,KAAa;IACtC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,QAAQ,IAAI,MAAM,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;gBAAE,OAAO,KAAK,CAAC;YACtD,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,QAAQ,IAAI,MAAM,IAAI,QAAQ,IAAI,MAAM;YAAE,OAAO,KAAK,CAAC;IAC7D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAS,2BAA2B,CAClC,KAAc,EACd,YAAoB;IAEpB,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACvB,iBAAiB,CAAC,KAAK,CAAC;QACxB,KAAK,CAAC,MAAM,IAAI,YAAY;QAC5B,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,IAAI,YAAY,CAC3D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,2BAA2B,CAChC,KAAK,EACL,8BAA8B,CAC/B,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,2BAA2B,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;AACtE,CAAC","sourcesContent":["/** Maximum wire size for a logical turn identifier, in UTF-8 bytes. */\nexport const LOGICAL_TURN_ID_MAX_UTF8_BYTES = 128;\n\n/** Maximum wire size for a model invocation identifier, in UTF-8 bytes. */\nexport const OUTPUT_ID_MAX_UTF8_BYTES = 128;\n\n/** Reject lone UTF-16 surrogates instead of silently encoding U+FFFD. */\nfunction isWellFormedUtf16(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n if (!(next >= 0xdc00 && next <= 0xdfff)) return false;\n index += 1;\n continue;\n }\n if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff) return false;\n }\n return true;\n}\n\n/**\n * Return whether a logical turn identifier is safe to place on the wire.\n *\n * Identifiers are preserved exactly. They must contain at least one\n * non-whitespace character and fit within the bounded RTVI field.\n */\nfunction isValidBoundedCorrelationId(\n value: unknown,\n maxUtf8Bytes: number,\n): value is string {\n return (\n typeof value === \"string\" &&\n value.trim().length > 0 &&\n isWellFormedUtf16(value) &&\n value.length <= maxUtf8Bytes &&\n new TextEncoder().encode(value).byteLength <= maxUtf8Bytes\n );\n}\n\nexport function isValidLogicalTurnId(value: unknown): value is string {\n return isValidBoundedCorrelationId(\n value,\n LOGICAL_TURN_ID_MAX_UTF8_BYTES,\n );\n}\n\n/** Return whether a Core model invocation id is safe to retain and expose. */\nexport function isValidOutputId(value: unknown): value is string {\n return isValidBoundedCorrelationId(value, OUTPUT_ID_MAX_UTF8_BYTES);\n}\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { JsonObject, ModelOutputExtensionItem, ModelOutputMessage } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Normalize canonical model-output delivery across transports.
|
|
4
|
+
*
|
|
5
|
+
* LiveKit delivers the RTVI frame as a top-level message with its payload in
|
|
6
|
+
* `data`; WebSocket delivery wraps that same payload in `server-message`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function extractModelOutputPayload(value: unknown): unknown | undefined;
|
|
9
|
+
export declare function isJsonValue(value: unknown, ancestors?: Set<unknown>): value is import("./types.js").JsonValue;
|
|
10
|
+
export declare function isJsonObject(value: unknown): value is JsonObject;
|
|
11
|
+
/**
|
|
12
|
+
* Validate a canonical Core model-output message.
|
|
13
|
+
*
|
|
14
|
+
* Unknown item types and malformed executable items fail the whole envelope
|
|
15
|
+
* closed. The exact `raw` field is never parsed to discover actions.
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseModelOutputMessage(value: unknown): ModelOutputMessage | null;
|
|
18
|
+
export type ExtensionRenderResult<T> = {
|
|
19
|
+
status: "rendered";
|
|
20
|
+
value: T;
|
|
21
|
+
} | {
|
|
22
|
+
status: "fallback";
|
|
23
|
+
fallback: string;
|
|
24
|
+
} | {
|
|
25
|
+
status: "unhandled";
|
|
26
|
+
};
|
|
27
|
+
export type ModelOutputExtensionRenderer<T> = (item: ModelOutputExtensionItem) => T;
|
|
28
|
+
/**
|
|
29
|
+
* UI-framework-neutral registry for developer extension renderers.
|
|
30
|
+
*
|
|
31
|
+
* The SDK never evaluates extension payloads. Applications explicitly
|
|
32
|
+
* register a renderer for one schema/version pair and receive JSON data.
|
|
33
|
+
*/
|
|
34
|
+
export declare class ModelOutputExtensionRegistry<T> {
|
|
35
|
+
private readonly renderers;
|
|
36
|
+
register(schema: string, version: number, renderer: ModelOutputExtensionRenderer<T>): () => void;
|
|
37
|
+
render(item: ModelOutputExtensionItem): ExtensionRenderResult<T>;
|
|
38
|
+
private key;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=modelOutput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelOutput.d.ts","sourceRoot":"","sources":["../../src/core/modelOutput.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,wBAAwB,EAExB,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAcjB;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAe7E;AAUD,wBAAgB,WAAW,CACzB,KAAK,EAAE,OAAO,EACd,SAAS,GAAE,GAAG,CAAC,OAAO,CAAa,GAClC,KAAK,IAAI,OAAO,SAAS,EAAE,SAAS,CAmBtC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE;AA0DD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,GAAG,IAAI,CA6CjF;AAED,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAC/B;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAChC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC;AAE5B,MAAM,MAAM,4BAA4B,CAAC,CAAC,IAAI,CAC5C,IAAI,EAAE,wBAAwB,KAC3B,CAAC,CAAC;AAEP;;;;;GAKG;AACH,qBAAa,4BAA4B,CAAC,CAAC;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAGtB;IAEJ,QAAQ,CACN,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,4BAA4B,CAAC,CAAC,CAAC,GACxC,MAAM,IAAI;IAWb,MAAM,CAAC,IAAI,EAAE,wBAAwB,GAAG,qBAAqB,CAAC,CAAC,CAAC;IAShE,OAAO,CAAC,GAAG;CAGZ"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { isValidLogicalTurnId, isValidOutputId, } from "./logicalTurn.js";
|
|
2
|
+
function isRecord(value) {
|
|
3
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
4
|
+
return false;
|
|
5
|
+
}
|
|
6
|
+
const prototype = Object.getPrototypeOf(value);
|
|
7
|
+
return prototype === Object.prototype || prototype === null;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Normalize canonical model-output delivery across transports.
|
|
11
|
+
*
|
|
12
|
+
* LiveKit delivers the RTVI frame as a top-level message with its payload in
|
|
13
|
+
* `data`; WebSocket delivery wraps that same payload in `server-message`.
|
|
14
|
+
*/
|
|
15
|
+
export function extractModelOutputPayload(value) {
|
|
16
|
+
if (!isRecord(value))
|
|
17
|
+
return undefined;
|
|
18
|
+
if (value.type === "model-output") {
|
|
19
|
+
return isRecord(value.data)
|
|
20
|
+
? { ...value.data, type: "model-output" }
|
|
21
|
+
: value;
|
|
22
|
+
}
|
|
23
|
+
if (value.type === "server-message" &&
|
|
24
|
+
isRecord(value.data) &&
|
|
25
|
+
value.data.type === "model-output") {
|
|
26
|
+
return value.data;
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
function isOptionalString(value) {
|
|
31
|
+
return value === undefined || value === null || typeof value === "string";
|
|
32
|
+
}
|
|
33
|
+
function isNonEmptyString(value) {
|
|
34
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
35
|
+
}
|
|
36
|
+
export function isJsonValue(value, ancestors = new Set()) {
|
|
37
|
+
if (value === null ||
|
|
38
|
+
typeof value === "string" ||
|
|
39
|
+
typeof value === "boolean") {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
if (typeof value === "number")
|
|
43
|
+
return Number.isFinite(value);
|
|
44
|
+
if (typeof value !== "object")
|
|
45
|
+
return false;
|
|
46
|
+
if (ancestors.has(value))
|
|
47
|
+
return false;
|
|
48
|
+
ancestors.add(value);
|
|
49
|
+
const valid = Array.isArray(value)
|
|
50
|
+
? value.every((item) => isJsonValue(item, ancestors))
|
|
51
|
+
: isRecord(value) &&
|
|
52
|
+
Object.values(value).every((item) => isJsonValue(item, ancestors));
|
|
53
|
+
ancestors.delete(value);
|
|
54
|
+
return valid;
|
|
55
|
+
}
|
|
56
|
+
export function isJsonObject(value) {
|
|
57
|
+
return isRecord(value) && isJsonValue(value);
|
|
58
|
+
}
|
|
59
|
+
function parseModelOutputItem(value) {
|
|
60
|
+
if (!isRecord(value) || typeof value.type !== "string")
|
|
61
|
+
return null;
|
|
62
|
+
switch (value.type) {
|
|
63
|
+
case "message":
|
|
64
|
+
if (value.role !== "assistant" ||
|
|
65
|
+
(value.channel !== "final" && value.channel !== "commentary") ||
|
|
66
|
+
typeof value.content !== "string") {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
return value;
|
|
70
|
+
case "emotion":
|
|
71
|
+
if (!isNonEmptyString(value.name) ||
|
|
72
|
+
(value.scale !== 1 && value.scale !== 2 && value.scale !== 3)) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
return value;
|
|
76
|
+
case "semantic_action":
|
|
77
|
+
if (!isNonEmptyString(value.id) ||
|
|
78
|
+
!isNonEmptyString(value.name) ||
|
|
79
|
+
!isOptionalString(value.target)) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
return value;
|
|
83
|
+
case "tool_call":
|
|
84
|
+
if (!isNonEmptyString(value.id) ||
|
|
85
|
+
!isNonEmptyString(value.name) ||
|
|
86
|
+
!isOptionalString(value.target) ||
|
|
87
|
+
!isJsonObject(value.arguments)) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
return value;
|
|
91
|
+
case "extension":
|
|
92
|
+
if (!isNonEmptyString(value.schema) ||
|
|
93
|
+
!Number.isInteger(value.version) ||
|
|
94
|
+
value.version < 1 ||
|
|
95
|
+
!isJsonObject(value.payload) ||
|
|
96
|
+
!isOptionalString(value.fallback)) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
return value;
|
|
100
|
+
default:
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Validate a canonical Core model-output message.
|
|
106
|
+
*
|
|
107
|
+
* Unknown item types and malformed executable items fail the whole envelope
|
|
108
|
+
* closed. The exact `raw` field is never parsed to discover actions.
|
|
109
|
+
*/
|
|
110
|
+
export function parseModelOutputMessage(value) {
|
|
111
|
+
const hasLogicalTurnId = isRecord(value) &&
|
|
112
|
+
Object.prototype.hasOwnProperty.call(value, "logical_turn_id");
|
|
113
|
+
if (!isRecord(value) ||
|
|
114
|
+
value.type !== "model-output" ||
|
|
115
|
+
value.version !== 2 ||
|
|
116
|
+
!isValidOutputId(value.output_id) ||
|
|
117
|
+
(hasLogicalTurnId && !isValidLogicalTurnId(value.logical_turn_id)) ||
|
|
118
|
+
![
|
|
119
|
+
"text",
|
|
120
|
+
"convai-combined-json",
|
|
121
|
+
"semantic-actions-json",
|
|
122
|
+
"client-tool-calls-json",
|
|
123
|
+
].includes(value.format) ||
|
|
124
|
+
typeof value.raw !== "string" ||
|
|
125
|
+
value.final !== true ||
|
|
126
|
+
!Array.isArray(value.items)) {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
const items = value.items.map(parseModelOutputItem);
|
|
130
|
+
if (items.some((item) => item === null))
|
|
131
|
+
return null;
|
|
132
|
+
const actionItemIds = new Set();
|
|
133
|
+
for (const item of items) {
|
|
134
|
+
if (item.type !== "semantic_action" && item.type !== "tool_call")
|
|
135
|
+
continue;
|
|
136
|
+
if (actionItemIds.has(item.id))
|
|
137
|
+
return null;
|
|
138
|
+
actionItemIds.add(item.id);
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
type: "model-output",
|
|
142
|
+
version: 2,
|
|
143
|
+
output_id: value.output_id,
|
|
144
|
+
...(hasLogicalTurnId && {
|
|
145
|
+
logical_turn_id: value.logical_turn_id,
|
|
146
|
+
}),
|
|
147
|
+
format: value.format,
|
|
148
|
+
raw: value.raw,
|
|
149
|
+
items: items,
|
|
150
|
+
final: true,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* UI-framework-neutral registry for developer extension renderers.
|
|
155
|
+
*
|
|
156
|
+
* The SDK never evaluates extension payloads. Applications explicitly
|
|
157
|
+
* register a renderer for one schema/version pair and receive JSON data.
|
|
158
|
+
*/
|
|
159
|
+
export class ModelOutputExtensionRegistry {
|
|
160
|
+
constructor() {
|
|
161
|
+
this.renderers = new Map();
|
|
162
|
+
}
|
|
163
|
+
register(schema, version, renderer) {
|
|
164
|
+
if (!schema.trim() || !Number.isInteger(version) || version < 1) {
|
|
165
|
+
throw new Error("Extension schema and positive integer version are required");
|
|
166
|
+
}
|
|
167
|
+
const key = this.key(schema, version);
|
|
168
|
+
this.renderers.set(key, renderer);
|
|
169
|
+
return () => {
|
|
170
|
+
if (this.renderers.get(key) === renderer)
|
|
171
|
+
this.renderers.delete(key);
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
render(item) {
|
|
175
|
+
const renderer = this.renderers.get(this.key(item.schema, item.version));
|
|
176
|
+
if (renderer)
|
|
177
|
+
return { status: "rendered", value: renderer(item) };
|
|
178
|
+
if (item.fallback !== null && item.fallback !== undefined) {
|
|
179
|
+
return { status: "fallback", fallback: item.fallback };
|
|
180
|
+
}
|
|
181
|
+
return { status: "unhandled" };
|
|
182
|
+
}
|
|
183
|
+
key(schema, version) {
|
|
184
|
+
return `${schema}@${version}`;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=modelOutput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelOutput.js","sourceRoot":"","sources":["../../src/core/modelOutput.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n JsonObject,\n ModelOutputExtensionItem,\n ModelOutputItem,\n ModelOutputMessage,\n} from \"./types\";\nimport {\n isValidLogicalTurnId,\n isValidOutputId,\n} from \"./logicalTurn.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\n/**\n * Normalize canonical model-output delivery across transports.\n *\n * LiveKit delivers the RTVI frame as a top-level message with its payload in\n * `data`; WebSocket delivery wraps that same payload in `server-message`.\n */\nexport function extractModelOutputPayload(value: unknown): unknown | undefined {\n if (!isRecord(value)) return undefined;\n if (value.type === \"model-output\") {\n return isRecord(value.data)\n ? { ...value.data, type: \"model-output\" }\n : value;\n }\n if (\n value.type === \"server-message\" &&\n isRecord(value.data) &&\n value.data.type === \"model-output\"\n ) {\n return value.data;\n }\n return undefined;\n}\n\nfunction isOptionalString(value: unknown): value is string | null | undefined {\n return value === undefined || value === null || typeof value === \"string\";\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nexport function isJsonValue(\n value: unknown,\n ancestors: Set<unknown> = new Set(),\n): value is import(\"./types\").JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return true;\n }\n if (typeof value === \"number\") return Number.isFinite(value);\n if (typeof value !== \"object\") return false;\n if (ancestors.has(value)) return false;\n\n ancestors.add(value);\n const valid = Array.isArray(value)\n ? value.every((item) => isJsonValue(item, ancestors))\n : isRecord(value) &&\n Object.values(value).every((item) => isJsonValue(item, ancestors));\n ancestors.delete(value);\n return valid;\n}\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return isRecord(value) && isJsonValue(value);\n}\n\nfunction parseModelOutputItem(value: unknown): ModelOutputItem | null {\n if (!isRecord(value) || typeof value.type !== \"string\") return null;\n\n switch (value.type) {\n case \"message\":\n if (\n value.role !== \"assistant\" ||\n (value.channel !== \"final\" && value.channel !== \"commentary\") ||\n typeof value.content !== \"string\"\n ) {\n return null;\n }\n return value as unknown as ModelOutputItem;\n case \"emotion\":\n if (\n !isNonEmptyString(value.name) ||\n (value.scale !== 1 && value.scale !== 2 && value.scale !== 3)\n ) {\n return null;\n }\n return value as unknown as ModelOutputItem;\n case \"semantic_action\":\n if (\n !isNonEmptyString(value.id) ||\n !isNonEmptyString(value.name) ||\n !isOptionalString(value.target)\n ) {\n return null;\n }\n return value as unknown as ModelOutputItem;\n case \"tool_call\":\n if (\n !isNonEmptyString(value.id) ||\n !isNonEmptyString(value.name) ||\n !isOptionalString(value.target) ||\n !isJsonObject(value.arguments)\n ) {\n return null;\n }\n return value as unknown as ModelOutputItem;\n case \"extension\":\n if (\n !isNonEmptyString(value.schema) ||\n !Number.isInteger(value.version) ||\n (value.version as number) < 1 ||\n !isJsonObject(value.payload) ||\n !isOptionalString(value.fallback)\n ) {\n return null;\n }\n return value as unknown as ModelOutputItem;\n default:\n return null;\n }\n}\n\n/**\n * Validate a canonical Core model-output message.\n *\n * Unknown item types and malformed executable items fail the whole envelope\n * closed. The exact `raw` field is never parsed to discover actions.\n */\nexport function parseModelOutputMessage(value: unknown): ModelOutputMessage | null {\n const hasLogicalTurnId =\n isRecord(value) &&\n Object.prototype.hasOwnProperty.call(value, \"logical_turn_id\");\n if (\n !isRecord(value) ||\n value.type !== \"model-output\" ||\n value.version !== 2 ||\n !isValidOutputId(value.output_id) ||\n (hasLogicalTurnId && !isValidLogicalTurnId(value.logical_turn_id)) ||\n ![\n \"text\",\n \"convai-combined-json\",\n \"semantic-actions-json\",\n \"client-tool-calls-json\",\n ].includes(value.format as string) ||\n typeof value.raw !== \"string\" ||\n value.final !== true ||\n !Array.isArray(value.items)\n ) {\n return null;\n }\n\n const items = value.items.map(parseModelOutputItem);\n if (items.some((item) => item === null)) return null;\n\n const actionItemIds = new Set<string>();\n for (const item of items as ModelOutputItem[]) {\n if (item.type !== \"semantic_action\" && item.type !== \"tool_call\") continue;\n if (actionItemIds.has(item.id)) return null;\n actionItemIds.add(item.id);\n }\n\n return {\n type: \"model-output\",\n version: 2,\n output_id: value.output_id,\n ...(hasLogicalTurnId && {\n logical_turn_id: value.logical_turn_id as string,\n }),\n format: value.format as ModelOutputMessage[\"format\"],\n raw: value.raw,\n items: items as ModelOutputItem[],\n final: true,\n };\n}\n\nexport type ExtensionRenderResult<T> =\n | { status: \"rendered\"; value: T }\n | { status: \"fallback\"; fallback: string }\n | { status: \"unhandled\" };\n\nexport type ModelOutputExtensionRenderer<T> = (\n item: ModelOutputExtensionItem,\n) => T;\n\n/**\n * UI-framework-neutral registry for developer extension renderers.\n *\n * The SDK never evaluates extension payloads. Applications explicitly\n * register a renderer for one schema/version pair and receive JSON data.\n */\nexport class ModelOutputExtensionRegistry<T> {\n private readonly renderers = new Map<\n string,\n ModelOutputExtensionRenderer<T>\n >();\n\n register(\n schema: string,\n version: number,\n renderer: ModelOutputExtensionRenderer<T>,\n ): () => void {\n if (!schema.trim() || !Number.isInteger(version) || version < 1) {\n throw new Error(\"Extension schema and positive integer version are required\");\n }\n const key = this.key(schema, version);\n this.renderers.set(key, renderer);\n return () => {\n if (this.renderers.get(key) === renderer) this.renderers.delete(key);\n };\n }\n\n render(item: ModelOutputExtensionItem): ExtensionRenderResult<T> {\n const renderer = this.renderers.get(this.key(item.schema, item.version));\n if (renderer) return { status: \"rendered\", value: renderer(item) };\n if (item.fallback !== null && item.fallback !== undefined) {\n return { status: \"fallback\", fallback: item.fallback };\n }\n return { status: \"unhandled\" };\n }\n\n private key(schema: string, version: number): string {\n return `${schema}@${version}`;\n }\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PublishedChatConnectOptions } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* A widget obtains a new one-time launch token for every fresh session. An
|
|
4
|
+
* attempt id may only be reused while retrying that same token, which
|
|
5
|
+
* ConvaiClient handles internally. Preserve transport options but deliberately
|
|
6
|
+
* omit any caller-supplied id at this higher-level session boundary.
|
|
7
|
+
*/
|
|
8
|
+
export declare function freshPublicationGrantOptions(options?: PublishedChatConnectOptions): PublishedChatConnectOptions | undefined;
|
|
9
|
+
//# sourceMappingURL=publishedChat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publishedChat.d.ts","sourceRoot":"","sources":["../../src/core/publishedChat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAE3D;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,CAAC,EAAE,2BAA2B,GACpC,2BAA2B,GAAG,SAAS,CAKzC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A widget obtains a new one-time launch token for every fresh session. An
|
|
3
|
+
* attempt id may only be reused while retrying that same token, which
|
|
4
|
+
* ConvaiClient handles internally. Preserve transport options but deliberately
|
|
5
|
+
* omit any caller-supplied id at this higher-level session boundary.
|
|
6
|
+
*/
|
|
7
|
+
export function freshPublicationGrantOptions(options) {
|
|
8
|
+
if (!options)
|
|
9
|
+
return undefined;
|
|
10
|
+
const { connectAttemptId: _staleAttemptId, ...freshOptions } = options;
|
|
11
|
+
return freshOptions;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=publishedChat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publishedChat.js","sourceRoot":"","sources":["../../src/core/publishedChat.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAC1C,OAAqC;IAErC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAE/B,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC;IACvE,OAAO,YAAY,CAAC;AACtB,CAAC","sourcesContent":["import type { PublishedChatConnectOptions } from \"./types\";\n\n/**\n * A widget obtains a new one-time launch token for every fresh session. An\n * attempt id may only be reused while retrying that same token, which\n * ConvaiClient handles internally. Preserve transport options but deliberately\n * omit any caller-supplied id at this higher-level session boundary.\n */\nexport function freshPublicationGrantOptions(\n options?: PublishedChatConnectOptions,\n): PublishedChatConnectOptions | undefined {\n if (!options) return undefined;\n\n const { connectAttemptId: _staleAttemptId, ...freshOptions } = options;\n return freshOptions;\n}\n"]}
|