@convai/web-sdk 1.8.0-beta.8 → 1.8.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.
Files changed (113) hide show
  1. package/README.md +45 -213
  2. package/dist/core/ConvaiClient.d.ts +1 -190
  3. package/dist/core/ConvaiClient.d.ts.map +1 -1
  4. package/dist/core/ConvaiClient.js +286 -1306
  5. package/dist/core/ConvaiClient.js.map +1 -1
  6. package/dist/core/MessageHandler.d.ts +1 -19
  7. package/dist/core/MessageHandler.d.ts.map +1 -1
  8. package/dist/core/MessageHandler.js +27 -378
  9. package/dist/core/MessageHandler.js.map +1 -1
  10. package/dist/core/connectRequest.d.ts +4 -17
  11. package/dist/core/connectRequest.d.ts.map +1 -1
  12. package/dist/core/connectRequest.js +17 -28
  13. package/dist/core/connectRequest.js.map +1 -1
  14. package/dist/core/index.d.ts +1 -8
  15. package/dist/core/index.d.ts.map +1 -1
  16. package/dist/core/index.js +1 -13
  17. package/dist/core/index.js.map +1 -1
  18. package/dist/core/logicalTurn.d.ts +6 -4
  19. package/dist/core/logicalTurn.d.ts.map +1 -1
  20. package/dist/core/logicalTurn.js +4 -29
  21. package/dist/core/logicalTurn.js.map +1 -1
  22. package/dist/core/modelOutput.d.ts.map +1 -1
  23. package/dist/core/modelOutput.js +2 -2
  24. package/dist/core/modelOutput.js.map +1 -1
  25. package/dist/core/types.d.ts +22 -860
  26. package/dist/core/types.d.ts.map +1 -1
  27. package/dist/core/types.js.map +1 -1
  28. package/dist/embed/ConvaiChatElement.d.ts +1 -77
  29. package/dist/embed/ConvaiChatElement.d.ts.map +1 -1
  30. package/dist/embed/ConvaiChatElement.js +54 -433
  31. package/dist/embed/ConvaiChatElement.js.map +1 -1
  32. package/dist/embed/chat-embed-v1.js +35 -136
  33. package/dist/embed/chat-embed-v1.js.map +4 -4
  34. package/dist/react/components/ConvaiWidget.d.ts.map +1 -1
  35. package/dist/react/components/ConvaiWidget.js +1 -6
  36. package/dist/react/components/ConvaiWidget.js.map +1 -1
  37. package/dist/react/components/rtc-widget/components/AudioVisualizer.d.ts.map +1 -1
  38. package/dist/react/components/rtc-widget/components/AudioVisualizer.js +1 -28
  39. package/dist/react/components/rtc-widget/components/AudioVisualizer.js.map +1 -1
  40. package/dist/react/components/rtc-widget/components/MarkdownRenderer.d.ts +0 -7
  41. package/dist/react/components/rtc-widget/components/MarkdownRenderer.d.ts.map +1 -1
  42. package/dist/react/components/rtc-widget/components/MarkdownRenderer.js +46 -135
  43. package/dist/react/components/rtc-widget/components/MarkdownRenderer.js.map +1 -1
  44. package/dist/react/components/rtc-widget/components/UserMessage.js +1 -1
  45. package/dist/react/components/rtc-widget/components/UserMessage.js.map +1 -1
  46. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.d.ts.map +1 -1
  47. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js +49 -93
  48. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js.map +1 -1
  49. package/dist/react/hooks/useConvaiClient.d.ts.map +1 -1
  50. package/dist/react/hooks/useConvaiClient.js +2 -17
  51. package/dist/react/hooks/useConvaiClient.js.map +1 -1
  52. package/dist/react/index.d.ts +1 -4
  53. package/dist/react/index.d.ts.map +1 -1
  54. package/dist/react/index.js +1 -8
  55. package/dist/react/index.js.map +1 -1
  56. package/dist/vanilla/AudioRenderer.d.ts +1 -3
  57. package/dist/vanilla/AudioRenderer.d.ts.map +1 -1
  58. package/dist/vanilla/AudioRenderer.js +2 -8
  59. package/dist/vanilla/AudioRenderer.js.map +1 -1
  60. package/dist/vanilla/ConvaiWidget.d.ts.map +1 -1
  61. package/dist/vanilla/ConvaiWidget.js +302 -1122
  62. package/dist/vanilla/ConvaiWidget.js.map +1 -1
  63. package/dist/vanilla/WidgetEventSubscriptions.d.ts +1 -1
  64. package/dist/vanilla/WidgetEventSubscriptions.d.ts.map +1 -1
  65. package/dist/vanilla/WidgetEventSubscriptions.js +0 -5
  66. package/dist/vanilla/WidgetEventSubscriptions.js.map +1 -1
  67. package/dist/vanilla/icons.d.ts.map +1 -1
  68. package/dist/vanilla/icons.js +15 -62
  69. package/dist/vanilla/icons.js.map +1 -1
  70. package/dist/vanilla/index.d.ts +2 -6
  71. package/dist/vanilla/index.d.ts.map +1 -1
  72. package/dist/vanilla/index.js +1 -5
  73. package/dist/vanilla/index.js.map +1 -1
  74. package/dist/vanilla/styles.d.ts +1 -18
  75. package/dist/vanilla/styles.d.ts.map +1 -1
  76. package/dist/vanilla/styles.js +29 -141
  77. package/dist/vanilla/styles.js.map +1 -1
  78. package/dist/vanilla/types.d.ts +0 -74
  79. package/dist/vanilla/types.d.ts.map +1 -1
  80. package/dist/vanilla/types.js.map +1 -1
  81. package/dist/version.d.ts +1 -1
  82. package/dist/version.d.ts.map +1 -1
  83. package/dist/version.js +1 -1
  84. package/dist/version.js.map +1 -1
  85. package/package.json +17 -44
  86. package/dist/core/CharacterRoster.d.ts +0 -84
  87. package/dist/core/CharacterRoster.d.ts.map +0 -1
  88. package/dist/core/CharacterRoster.js +0 -348
  89. package/dist/core/CharacterRoster.js.map +0 -1
  90. package/dist/core/CharacterVersionManager.d.ts +0 -100
  91. package/dist/core/CharacterVersionManager.d.ts.map +0 -1
  92. package/dist/core/CharacterVersionManager.js +0 -227
  93. package/dist/core/CharacterVersionManager.js.map +0 -1
  94. package/dist/core/ConvaiRoomError.d.ts +0 -48
  95. package/dist/core/ConvaiRoomError.d.ts.map +0 -1
  96. package/dist/core/ConvaiRoomError.js +0 -111
  97. package/dist/core/ConvaiRoomError.js.map +0 -1
  98. package/dist/core/SSESession.d.ts +0 -59
  99. package/dist/core/SSESession.d.ts.map +0 -1
  100. package/dist/core/SSESession.js +0 -289
  101. package/dist/core/SSESession.js.map +0 -1
  102. package/dist/core/characterReference.d.ts +0 -40
  103. package/dist/core/characterReference.d.ts.map +0 -1
  104. package/dist/core/characterReference.js +0 -72
  105. package/dist/core/characterReference.js.map +0 -1
  106. package/dist/core/rosterRequest.d.ts +0 -57
  107. package/dist/core/rosterRequest.d.ts.map +0 -1
  108. package/dist/core/rosterRequest.js +0 -210
  109. package/dist/core/rosterRequest.js.map +0 -1
  110. package/dist/utils/inlineMarkdown.d.ts +0 -60
  111. package/dist/utils/inlineMarkdown.d.ts.map +0 -1
  112. package/dist/utils/inlineMarkdown.js +0 -183
  113. package/dist/utils/inlineMarkdown.js.map +0 -1
@@ -1,41 +1,16 @@
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
- /** 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
3
  /**
22
4
  * Return whether a logical turn identifier is safe to place on the wire.
23
5
  *
24
6
  * Identifiers are preserved exactly. They must contain at least one
25
7
  * non-whitespace character and fit within the bounded RTVI field.
26
8
  */
27
- function isValidBoundedCorrelationId(value, maxUtf8Bytes) {
9
+ export function isValidLogicalTurnId(value) {
28
10
  return (typeof value === "string" &&
29
11
  value.trim().length > 0 &&
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);
12
+ value.length <= LOGICAL_TURN_ID_MAX_UTF8_BYTES &&
13
+ new TextEncoder().encode(value).byteLength <=
14
+ LOGICAL_TURN_ID_MAX_UTF8_BYTES);
40
15
  }
41
16
  //# 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,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"]}
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;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACvB,KAAK,CAAC,MAAM,IAAI,8BAA8B;QAC9C,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU;YACxC,8BAA8B,CACjC,CAAC;AACJ,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/**\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 */\nexport function isValidLogicalTurnId(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n value.trim().length > 0 &&\n value.length <= LOGICAL_TURN_ID_MAX_UTF8_BYTES &&\n new TextEncoder().encode(value).byteLength <=\n LOGICAL_TURN_ID_MAX_UTF8_BYTES\n );\n}\n"]}
@@ -1 +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"}
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;AAWjB;;;;;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"}
@@ -1,4 +1,4 @@
1
- import { isValidLogicalTurnId, isValidOutputId, } from "./logicalTurn.js";
1
+ import { isValidLogicalTurnId } from "./logicalTurn.js";
2
2
  function isRecord(value) {
3
3
  if (typeof value !== "object" || value === null || Array.isArray(value)) {
4
4
  return false;
@@ -113,7 +113,7 @@ export function parseModelOutputMessage(value) {
113
113
  if (!isRecord(value) ||
114
114
  value.type !== "model-output" ||
115
115
  value.version !== 2 ||
116
- !isValidOutputId(value.output_id) ||
116
+ !isNonEmptyString(value.output_id) ||
117
117
  (hasLogicalTurnId && !isValidLogicalTurnId(value.logical_turn_id)) ||
118
118
  ![
119
119
  "text",
@@ -1 +1 @@
1
- {"version":3,"file":"modelOutput.js","sourceRoot":"","sources":["../../src/core/modelOutput.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,oBAAoB,EACpB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAE1B,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/C,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAC9D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAClC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YACzB,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE;YACzC,CAAC,CAAC,KAAK,CAAC;IACZ,CAAC;IACD,IACE,KAAK,CAAC,IAAI,KAAK,gBAAgB;QAC/B,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,EAClC,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;AAC5E,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,KAAc,EACd,YAA0B,IAAI,GAAG,EAAE;IAEnC,IACE,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,KAAK,SAAS,EAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAChC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACrD,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YACf,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IACvE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEpE,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,SAAS;YACZ,IACE,KAAK,CAAC,IAAI,KAAK,WAAW;gBAC1B,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,YAAY,CAAC;gBAC7D,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EACjC,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAmC,CAAC;QAC7C,KAAK,SAAS;YACZ,IACE,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC7B,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,EAC7D,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAmC,CAAC;QAC7C,KAAK,iBAAiB;YACpB,IACE,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC7B,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,EAC/B,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAmC,CAAC;QAC7C,KAAK,WAAW;YACd,IACE,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC7B,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC/B,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,EAC9B,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAmC,CAAC;QAC7C,KAAK,WAAW;YACd,IACE,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC/B,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC/B,KAAK,CAAC,OAAkB,GAAG,CAAC;gBAC7B,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC5B,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,EACjC,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAmC,CAAC;QAC7C;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,MAAM,gBAAgB,GACpB,QAAQ,CAAC,KAAK,CAAC;QACf,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;IACjE,IACE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAChB,KAAK,CAAC,IAAI,KAAK,cAAc;QAC7B,KAAK,CAAC,OAAO,KAAK,CAAC;QACnB,CAAC,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC;QACjC,CAAC,gBAAgB,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAClE,CAAC;YACC,MAAM;YACN,sBAAsB;YACtB,uBAAuB;YACvB,wBAAwB;SACzB,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAgB,CAAC;QAClC,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;QAC7B,KAAK,CAAC,KAAK,KAAK,IAAI;QACpB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAC3B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACpD,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAErD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,KAA0B,EAAE,CAAC;QAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;YAAE,SAAS;QAC3E,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5C,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,GAAG,CAAC,gBAAgB,IAAI;YACtB,eAAe,EAAE,KAAK,CAAC,eAAyB;SACjD,CAAC;QACF,MAAM,EAAE,KAAK,CAAC,MAAsC;QACpD,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,KAAK,EAAE,KAA0B;QACjC,KAAK,EAAE,IAAI;KACZ,CAAC;AACJ,CAAC;AAWD;;;;;GAKG;AACH,MAAM,OAAO,4BAA4B;IAAzC;QACmB,cAAS,GAAG,IAAI,GAAG,EAGjC,CAAC;IA6BN,CAAC;IA3BC,QAAQ,CACN,MAAc,EACd,OAAe,EACf,QAAyC;QAEzC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE;YACV,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ;gBAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvE,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,IAA8B;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACzE,IAAI,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnE,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC1D,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzD,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACjC,CAAC;IAEO,GAAG,CAAC,MAAc,EAAE,OAAe;QACzC,OAAO,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC;IAChC,CAAC;CACF","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"]}
1
+ {"version":3,"file":"modelOutput.js","sourceRoot":"","sources":["../../src/core/modelOutput.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/C,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAC9D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAClC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YACzB,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE;YACzC,CAAC,CAAC,KAAK,CAAC;IACZ,CAAC;IACD,IACE,KAAK,CAAC,IAAI,KAAK,gBAAgB;QAC/B,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,EAClC,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;AAC5E,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,KAAc,EACd,YAA0B,IAAI,GAAG,EAAE;IAEnC,IACE,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,KAAK,SAAS,EAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAChC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACrD,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YACf,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IACvE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEpE,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,SAAS;YACZ,IACE,KAAK,CAAC,IAAI,KAAK,WAAW;gBAC1B,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,YAAY,CAAC;gBAC7D,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EACjC,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAmC,CAAC;QAC7C,KAAK,SAAS;YACZ,IACE,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC7B,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,EAC7D,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAmC,CAAC;QAC7C,KAAK,iBAAiB;YACpB,IACE,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC7B,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,EAC/B,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAmC,CAAC;QAC7C,KAAK,WAAW;YACd,IACE,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC7B,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC/B,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,EAC9B,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAmC,CAAC;QAC7C,KAAK,WAAW;YACd,IACE,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC/B,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC/B,KAAK,CAAC,OAAkB,GAAG,CAAC;gBAC7B,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC5B,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,EACjC,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAmC,CAAC;QAC7C;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,MAAM,gBAAgB,GACpB,QAAQ,CAAC,KAAK,CAAC;QACf,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;IACjE,IACE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAChB,KAAK,CAAC,IAAI,KAAK,cAAc;QAC7B,KAAK,CAAC,OAAO,KAAK,CAAC;QACnB,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC;QAClC,CAAC,gBAAgB,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAClE,CAAC;YACC,MAAM;YACN,sBAAsB;YACtB,uBAAuB;YACvB,wBAAwB;SACzB,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAgB,CAAC;QAClC,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;QAC7B,KAAK,CAAC,KAAK,KAAK,IAAI;QACpB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAC3B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACpD,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAErD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,KAA0B,EAAE,CAAC;QAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;YAAE,SAAS;QAC3E,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5C,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,GAAG,CAAC,gBAAgB,IAAI;YACtB,eAAe,EAAE,KAAK,CAAC,eAAyB;SACjD,CAAC;QACF,MAAM,EAAE,KAAK,CAAC,MAAsC;QACpD,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,KAAK,EAAE,KAA0B;QACjC,KAAK,EAAE,IAAI;KACZ,CAAC;AACJ,CAAC;AAWD;;;;;GAKG;AACH,MAAM,OAAO,4BAA4B;IAAzC;QACmB,cAAS,GAAG,IAAI,GAAG,EAGjC,CAAC;IA6BN,CAAC;IA3BC,QAAQ,CACN,MAAc,EACd,OAAe,EACf,QAAyC;QAEzC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE;YACV,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ;gBAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvE,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,IAA8B;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACzE,IAAI,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnE,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC1D,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzD,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACjC,CAAC;IAEO,GAAG,CAAC,MAAc,EAAE,OAAe;QACzC,OAAO,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC;IAChC,CAAC;CACF","sourcesContent":["import type {\n JsonObject,\n ModelOutputExtensionItem,\n ModelOutputItem,\n ModelOutputMessage,\n} from \"./types\";\nimport { isValidLogicalTurnId } 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 !isNonEmptyString(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"]}