@kuralle-syrinx/core 4.4.0 → 4.5.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 (217) hide show
  1. package/dist/audio/alaw.d.ts +3 -0
  2. package/dist/audio/alaw.d.ts.map +1 -0
  3. package/dist/audio/alaw.js +53 -0
  4. package/dist/audio/alaw.js.map +1 -0
  5. package/dist/audio/g722.d.ts +39 -0
  6. package/dist/audio/g722.d.ts.map +1 -0
  7. package/dist/audio/g722.js +286 -0
  8. package/dist/audio/g722.js.map +1 -0
  9. package/dist/audio/index.d.ts +7 -0
  10. package/dist/audio/index.d.ts.map +1 -0
  11. package/dist/audio/index.js +8 -0
  12. package/dist/audio/index.js.map +1 -0
  13. package/dist/audio/loudness.d.ts +13 -0
  14. package/dist/audio/loudness.d.ts.map +1 -0
  15. package/dist/audio/loudness.js +65 -0
  16. package/dist/audio/loudness.js.map +1 -0
  17. package/dist/audio/mulaw.d.ts +3 -0
  18. package/dist/audio/mulaw.d.ts.map +1 -0
  19. package/dist/audio/mulaw.js +39 -0
  20. package/dist/audio/mulaw.js.map +1 -0
  21. package/dist/audio/pcm.d.ts +5 -0
  22. package/dist/audio/pcm.d.ts.map +1 -0
  23. package/dist/audio/pcm.js +40 -0
  24. package/dist/audio/pcm.js.map +1 -0
  25. package/dist/audio/resample.d.ts +12 -0
  26. package/dist/audio/resample.d.ts.map +1 -0
  27. package/dist/audio/resample.js +157 -0
  28. package/dist/audio/resample.js.map +1 -0
  29. package/dist/audio-envelope.d.ts +23 -0
  30. package/dist/audio-envelope.d.ts.map +1 -0
  31. package/dist/audio-envelope.js +114 -0
  32. package/dist/audio-envelope.js.map +1 -0
  33. package/dist/confidence-to-wait.d.ts +12 -0
  34. package/dist/confidence-to-wait.d.ts.map +1 -0
  35. package/dist/confidence-to-wait.js +18 -0
  36. package/dist/confidence-to-wait.js.map +1 -0
  37. package/dist/conversation-event.d.ts +19 -0
  38. package/dist/conversation-event.d.ts.map +1 -0
  39. package/dist/conversation-event.js +44 -0
  40. package/dist/conversation-event.js.map +1 -0
  41. package/dist/error-handler.d.ts +35 -0
  42. package/dist/error-handler.d.ts.map +1 -0
  43. package/dist/error-handler.js +136 -0
  44. package/dist/error-handler.js.map +1 -0
  45. package/dist/idle-timeout.d.ts +69 -0
  46. package/dist/idle-timeout.d.ts.map +1 -0
  47. package/dist/idle-timeout.js +149 -0
  48. package/dist/idle-timeout.js.map +1 -0
  49. package/dist/incremental-unit.d.ts +17 -0
  50. package/dist/incremental-unit.d.ts.map +1 -0
  51. package/dist/incremental-unit.js +5 -0
  52. package/dist/incremental-unit.js.map +1 -0
  53. package/dist/index.d.ts +47 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +61 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/init-chain.d.ts +35 -0
  58. package/dist/init-chain.d.ts.map +1 -0
  59. package/dist/init-chain.js +102 -0
  60. package/dist/init-chain.js.map +1 -0
  61. package/dist/init-stage-order.d.ts +5 -0
  62. package/dist/init-stage-order.d.ts.map +1 -0
  63. package/dist/init-stage-order.js +74 -0
  64. package/dist/init-stage-order.js.map +1 -0
  65. package/dist/interaction-coordinator.d.ts +45 -0
  66. package/dist/interaction-coordinator.d.ts.map +1 -0
  67. package/dist/interaction-coordinator.js +197 -0
  68. package/dist/interaction-coordinator.js.map +1 -0
  69. package/dist/interaction-policy.d.ts +103 -0
  70. package/dist/interaction-policy.d.ts.map +1 -0
  71. package/dist/interaction-policy.js +6 -0
  72. package/dist/interaction-policy.js.map +1 -0
  73. package/dist/iu-ledger.d.ts +39 -0
  74. package/dist/iu-ledger.d.ts.map +1 -0
  75. package/dist/iu-ledger.js +90 -0
  76. package/dist/iu-ledger.js.map +1 -0
  77. package/dist/latency-filler-fixtures.d.ts +7 -0
  78. package/dist/latency-filler-fixtures.d.ts.map +1 -0
  79. package/dist/latency-filler-fixtures.js +10 -0
  80. package/dist/latency-filler-fixtures.js.map +1 -0
  81. package/dist/latency-filler.d.ts +29 -0
  82. package/dist/latency-filler.d.ts.map +1 -0
  83. package/dist/latency-filler.js +102 -0
  84. package/dist/latency-filler.js.map +1 -0
  85. package/dist/mode-switcher.d.ts +24 -0
  86. package/dist/mode-switcher.d.ts.map +1 -0
  87. package/dist/mode-switcher.js +83 -0
  88. package/dist/mode-switcher.js.map +1 -0
  89. package/dist/observability-observer.d.ts +36 -0
  90. package/dist/observability-observer.d.ts.map +1 -0
  91. package/dist/observability-observer.js +141 -0
  92. package/dist/observability-observer.js.map +1 -0
  93. package/dist/observability.d.ts +68 -0
  94. package/dist/observability.d.ts.map +1 -0
  95. package/dist/observability.js +70 -0
  96. package/dist/observability.js.map +1 -0
  97. package/dist/packet-factories.d.ts +58 -0
  98. package/dist/packet-factories.d.ts.map +1 -0
  99. package/dist/packet-factories.js +181 -0
  100. package/dist/packet-factories.js.map +1 -0
  101. package/dist/packets.d.ts +532 -0
  102. package/dist/packets.d.ts.map +1 -0
  103. package/dist/packets.js +51 -0
  104. package/dist/packets.js.map +1 -0
  105. package/dist/pipeline-bus.d.ts +92 -0
  106. package/dist/pipeline-bus.d.ts.map +1 -0
  107. package/dist/pipeline-bus.js +294 -0
  108. package/dist/pipeline-bus.js.map +1 -0
  109. package/dist/plugin-contract.d.ts +73 -0
  110. package/dist/plugin-contract.d.ts.map +1 -0
  111. package/dist/plugin-contract.js +30 -0
  112. package/dist/plugin-contract.js.map +1 -0
  113. package/dist/policies/defer.d.ts +11 -0
  114. package/dist/policies/defer.d.ts.map +1 -0
  115. package/dist/policies/defer.js +13 -0
  116. package/dist/policies/defer.js.map +1 -0
  117. package/dist/policies/rule-based.d.ts +35 -0
  118. package/dist/policies/rule-based.d.ts.map +1 -0
  119. package/dist/policies/rule-based.js +130 -0
  120. package/dist/policies/rule-based.js.map +1 -0
  121. package/dist/pricing.d.ts +34 -0
  122. package/dist/pricing.d.ts.map +1 -0
  123. package/dist/pricing.js +108 -0
  124. package/dist/pricing.js.map +1 -0
  125. package/dist/primary-speaker-fixtures.d.ts +12 -0
  126. package/dist/primary-speaker-fixtures.d.ts.map +1 -0
  127. package/dist/primary-speaker-fixtures.js +37 -0
  128. package/dist/primary-speaker-fixtures.js.map +1 -0
  129. package/dist/primary-speaker-gate.d.ts +42 -0
  130. package/dist/primary-speaker-gate.d.ts.map +1 -0
  131. package/dist/primary-speaker-gate.js +178 -0
  132. package/dist/primary-speaker-gate.js.map +1 -0
  133. package/dist/provider-fallback.d.ts +28 -0
  134. package/dist/provider-fallback.d.ts.map +1 -0
  135. package/dist/provider-fallback.js +72 -0
  136. package/dist/provider-fallback.js.map +1 -0
  137. package/dist/reasoner-hedge.d.ts +21 -0
  138. package/dist/reasoner-hedge.d.ts.map +1 -0
  139. package/dist/reasoner-hedge.js +170 -0
  140. package/dist/reasoner-hedge.js.map +1 -0
  141. package/dist/reasoner-route.d.ts +24 -0
  142. package/dist/reasoner-route.d.ts.map +1 -0
  143. package/dist/reasoner-route.js +87 -0
  144. package/dist/reasoner-route.js.map +1 -0
  145. package/dist/reasoner-session-store.d.ts +18 -0
  146. package/dist/reasoner-session-store.d.ts.map +1 -0
  147. package/dist/reasoner-session-store.js +21 -0
  148. package/dist/reasoner-session-store.js.map +1 -0
  149. package/dist/reasoner.d.ts +97 -0
  150. package/dist/reasoner.d.ts.map +1 -0
  151. package/dist/reasoner.js +9 -0
  152. package/dist/reasoner.js.map +1 -0
  153. package/dist/retry.d.ts +31 -0
  154. package/dist/retry.d.ts.map +1 -0
  155. package/dist/retry.js +83 -0
  156. package/dist/retry.js.map +1 -0
  157. package/dist/scheduler.d.ts +11 -0
  158. package/dist/scheduler.d.ts.map +1 -0
  159. package/dist/scheduler.js +20 -0
  160. package/dist/scheduler.js.map +1 -0
  161. package/dist/spend-cap.d.ts +27 -0
  162. package/dist/spend-cap.d.ts.map +1 -0
  163. package/dist/spend-cap.js +38 -0
  164. package/dist/spend-cap.js.map +1 -0
  165. package/dist/tts-playout-clock.d.ts +43 -0
  166. package/dist/tts-playout-clock.d.ts.map +1 -0
  167. package/dist/tts-playout-clock.js +125 -0
  168. package/dist/tts-playout-clock.js.map +1 -0
  169. package/dist/turn-arbiter.d.ts +41 -0
  170. package/dist/turn-arbiter.d.ts.map +1 -0
  171. package/dist/turn-arbiter.js +259 -0
  172. package/dist/turn-arbiter.js.map +1 -0
  173. package/dist/voice-agent-session-util.d.ts +60 -0
  174. package/dist/voice-agent-session-util.d.ts.map +1 -0
  175. package/dist/voice-agent-session-util.js +204 -0
  176. package/dist/voice-agent-session-util.js.map +1 -0
  177. package/dist/voice-agent-session.d.ts +435 -0
  178. package/dist/voice-agent-session.d.ts.map +1 -0
  179. package/dist/voice-agent-session.js +1597 -0
  180. package/dist/voice-agent-session.js.map +1 -0
  181. package/dist/voice-text.d.ts +46 -0
  182. package/dist/voice-text.d.ts.map +1 -0
  183. package/dist/voice-text.js +209 -0
  184. package/dist/voice-text.js.map +1 -0
  185. package/package.json +19 -6
  186. package/src/audio/alaw.test.ts +87 -0
  187. package/src/audio/audio.test.ts +285 -0
  188. package/src/audio/g722.test.ts +149 -0
  189. package/src/audio/loudness.test.ts +58 -0
  190. package/src/audio-envelope.test.ts +167 -0
  191. package/src/confidence-to-wait.test.ts +21 -0
  192. package/src/error-handler.test.ts +56 -0
  193. package/src/hedge-throwing-backend.test.ts +46 -0
  194. package/src/interaction-coordinator.test.ts +529 -0
  195. package/src/iu-ledger.test.ts +276 -0
  196. package/src/latency-filler.test.ts +62 -0
  197. package/src/observability-observer.test.ts +248 -0
  198. package/src/observability.test.ts +94 -0
  199. package/src/packet-factories.test.ts +126 -0
  200. package/src/pipeline-bus.g10.test.ts +145 -0
  201. package/src/pipeline-bus.test.ts +211 -0
  202. package/src/policies/defer.test.ts +86 -0
  203. package/src/policies/rule-based.test.ts +334 -0
  204. package/src/pricing.test.ts +226 -0
  205. package/src/primary-speaker-gate.test.ts +150 -0
  206. package/src/provider-fallback.test.ts +87 -0
  207. package/src/reasoner-hedge.test.ts +361 -0
  208. package/src/reasoner-route.test.ts +248 -0
  209. package/src/reasoner.test.ts +69 -0
  210. package/src/retry.test.ts +83 -0
  211. package/src/route-throwing-spec.test.ts +44 -0
  212. package/src/spend-cap.test.ts +114 -0
  213. package/src/tts-playout-clock.test.ts +125 -0
  214. package/src/turn-arbiter.characterization.test.ts +477 -0
  215. package/src/turn-arbiter.test.ts +762 -0
  216. package/src/voice-agent-session.test.ts +4165 -0
  217. package/src/voice-text.test.ts +156 -0
@@ -0,0 +1,102 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // Syrinx Kernel v2 — Init Chain
4
+ //
5
+ // Serial initialization of pipeline components with ordered teardown on failure.
6
+ // Each step runs synchronously in order. On failure, already-initialized steps
7
+ // are torn down in reverse order.
8
+ import { Route } from "./pipeline-bus.js";
9
+ import { ErrorCategory } from "./packets.js";
10
+ // =============================================================================
11
+ // Error
12
+ // =============================================================================
13
+ export class InitializationError extends Error {
14
+ stage;
15
+ component;
16
+ constructor(stage, component, cause) {
17
+ super(`Initialization failed at ${stage}/${component}: ${cause.message}`);
18
+ this.stage = stage;
19
+ this.component = component;
20
+ this.name = "InitializationError";
21
+ }
22
+ }
23
+ // =============================================================================
24
+ // Core
25
+ // =============================================================================
26
+ /**
27
+ * Run a serial init chain. Each step runs in order. On failure:
28
+ * 1. Emits InitializationFailedPacket through the bus.
29
+ * 2. Tears down already-initialized steps in reverse order.
30
+ * 3. Throws InitializationError.
31
+ *
32
+ * On success:
33
+ * 1. Emits InitStepCompletedPacket for each step (with initMs).
34
+ * 2. Emits InitializationCompletedPacket.
35
+ */
36
+ export async function runInitChain(bus, steps) {
37
+ const initialized = [];
38
+ for (const step of steps) {
39
+ const startMs = performance.now();
40
+ try {
41
+ await step.run();
42
+ const initMs = performance.now() - startMs;
43
+ const completed = {
44
+ kind: "init.step_completed",
45
+ contextId: "",
46
+ timestampMs: Date.now(),
47
+ stage: step.stage,
48
+ component: step.name,
49
+ initMs,
50
+ };
51
+ bus.push(Route.Main, completed);
52
+ initialized.push(step);
53
+ }
54
+ catch (err) {
55
+ const error = err instanceof Error ? err : new Error(String(err));
56
+ const failed = {
57
+ kind: "init.failed",
58
+ contextId: "",
59
+ timestampMs: Date.now(),
60
+ stage: step.stage,
61
+ component: step.name,
62
+ category: ErrorCategory.InternalFault,
63
+ cause: error,
64
+ isRecoverable: false,
65
+ };
66
+ bus.push(Route.Main, failed);
67
+ // Reverse teardown of already-initialized steps
68
+ for (const done of [...initialized].reverse()) {
69
+ try {
70
+ await done.cleanup?.();
71
+ }
72
+ catch (cleanupErr) {
73
+ // Log but don't throw — cleanup failures shouldn't mask the init error
74
+ // In production, this goes to the bus as a warning
75
+ }
76
+ }
77
+ throw new InitializationError(step.stage, step.name, error);
78
+ }
79
+ }
80
+ const completed = {
81
+ kind: "init.completed",
82
+ contextId: "",
83
+ timestampMs: Date.now(),
84
+ };
85
+ bus.push(Route.Main, completed);
86
+ }
87
+ /**
88
+ * Run a reverse finalize chain. Steps are torn down in reverse order.
89
+ * Errors during teardown are logged but do not stop the chain.
90
+ * All steps get their cleanup called regardless of earlier failures.
91
+ */
92
+ export async function runFinalizeChain(steps) {
93
+ for (const step of [...steps].reverse()) {
94
+ try {
95
+ await step.cleanup?.();
96
+ }
97
+ catch {
98
+ // Log but continue — finalize must complete
99
+ }
100
+ }
101
+ }
102
+ //# sourceMappingURL=init-chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-chain.js","sourceRoot":"","sources":["../src/init-chain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { InitStage } from "./packets.js";
2
+ export declare function pluginStage(name: string): InitStage;
3
+ export declare function stageOrder(stage: InitStage): number;
4
+ export declare function isAudioStage(stage: InitStage): boolean;
5
+ //# sourceMappingURL=init-stage-order.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-stage-order.d.ts","sourceRoot":"","sources":["../src/init-stage-order.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CA4BnD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CA2BnD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAQtD"}
@@ -0,0 +1,74 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // Syrinx Kernel v2 — Init Stage Ordering
4
+ //
5
+ // Pure mapping from plugin name → init stage, and the deterministic order in
6
+ // which stages initialize (and, reversed, finalize). Extracted from
7
+ // VoiceAgentSession so the orchestrator owns chain assembly, not the ordering
8
+ // policy.
9
+ import { InitStage } from "./packets.js";
10
+ export function pluginStage(name) {
11
+ switch (name) {
12
+ case "stt":
13
+ case "deepgram":
14
+ return InitStage.STT;
15
+ case "tts":
16
+ case "cartesia":
17
+ case "elevenlabs":
18
+ return InitStage.TTS;
19
+ case "vad":
20
+ case "silero":
21
+ return InitStage.VAD;
22
+ case "eos":
23
+ case "pipecat":
24
+ return InitStage.EOS;
25
+ case "denoiser":
26
+ case "rnnoise":
27
+ return InitStage.Denoiser;
28
+ case "bridge":
29
+ case "aisdk":
30
+ return InitStage.Assistant;
31
+ case "recorder":
32
+ return InitStage.Recorder;
33
+ case "auth":
34
+ return InitStage.Auth;
35
+ default:
36
+ return InitStage.Assistant;
37
+ }
38
+ }
39
+ export function stageOrder(stage) {
40
+ switch (stage) {
41
+ case InitStage.Assistant:
42
+ return 10;
43
+ case InitStage.Conversation:
44
+ return 20;
45
+ case InitStage.Recorder:
46
+ return 30;
47
+ case InitStage.Normalizer:
48
+ return 40;
49
+ case InitStage.Auth:
50
+ return 50;
51
+ case InitStage.STT:
52
+ return 60;
53
+ case InitStage.TTS:
54
+ return 70;
55
+ case InitStage.VAD:
56
+ return 80;
57
+ case InitStage.EOS:
58
+ return 90;
59
+ case InitStage.Denoiser:
60
+ return 100;
61
+ case InitStage.Behavior:
62
+ return 110;
63
+ case InitStage.Telemetry:
64
+ return 120;
65
+ }
66
+ }
67
+ export function isAudioStage(stage) {
68
+ return (stage === InitStage.STT ||
69
+ stage === InitStage.TTS ||
70
+ stage === InitStage.VAD ||
71
+ stage === InitStage.EOS ||
72
+ stage === InitStage.Denoiser);
73
+ }
74
+ //# sourceMappingURL=init-stage-order.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-stage-order.js","sourceRoot":"","sources":["../src/init-stage-order.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,EAAE;AACF,yCAAyC;AACzC,EAAE;AACF,6EAA6E;AAC7E,oEAAoE;AACpE,8EAA8E;AAC9E,UAAU;AAEV,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,KAAK,CAAC;QACX,KAAK,UAAU;YACb,OAAO,SAAS,CAAC,GAAG,CAAC;QACvB,KAAK,KAAK,CAAC;QACX,KAAK,UAAU,CAAC;QAChB,KAAK,YAAY;YACf,OAAO,SAAS,CAAC,GAAG,CAAC;QACvB,KAAK,KAAK,CAAC;QACX,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC,GAAG,CAAC;QACvB,KAAK,KAAK,CAAC;QACX,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC,GAAG,CAAC;QACvB,KAAK,UAAU,CAAC;QAChB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC,QAAQ,CAAC;QAC5B,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO;YACV,OAAO,SAAS,CAAC,SAAS,CAAC;QAC7B,KAAK,UAAU;YACb,OAAO,SAAS,CAAC,QAAQ,CAAC;QAC5B,KAAK,MAAM;YACT,OAAO,SAAS,CAAC,IAAI,CAAC;QACxB;YACE,OAAO,SAAS,CAAC,SAAS,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAgB;IACzC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,SAAS,CAAC,SAAS;YACtB,OAAO,EAAE,CAAC;QACZ,KAAK,SAAS,CAAC,YAAY;YACzB,OAAO,EAAE,CAAC;QACZ,KAAK,SAAS,CAAC,QAAQ;YACrB,OAAO,EAAE,CAAC;QACZ,KAAK,SAAS,CAAC,UAAU;YACvB,OAAO,EAAE,CAAC;QACZ,KAAK,SAAS,CAAC,IAAI;YACjB,OAAO,EAAE,CAAC;QACZ,KAAK,SAAS,CAAC,GAAG;YAChB,OAAO,EAAE,CAAC;QACZ,KAAK,SAAS,CAAC,GAAG;YAChB,OAAO,EAAE,CAAC;QACZ,KAAK,SAAS,CAAC,GAAG;YAChB,OAAO,EAAE,CAAC;QACZ,KAAK,SAAS,CAAC,GAAG;YAChB,OAAO,EAAE,CAAC;QACZ,KAAK,SAAS,CAAC,QAAQ;YACrB,OAAO,GAAG,CAAC;QACb,KAAK,SAAS,CAAC,QAAQ;YACrB,OAAO,GAAG,CAAC;QACb,KAAK,SAAS,CAAC,SAAS;YACtB,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAgB;IAC3C,OAAO,CACL,KAAK,KAAK,SAAS,CAAC,GAAG;QACvB,KAAK,KAAK,SAAS,CAAC,GAAG;QACvB,KAAK,KAAK,SAAS,CAAC,GAAG;QACvB,KAAK,KAAK,SAAS,CAAC,GAAG;QACvB,KAAK,KAAK,SAAS,CAAC,QAAQ,CAC7B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { VadAudioPacket } from "./packets.js";
2
+ import type { TurnEndOwner } from "./packets.js";
3
+ import type { PipelineBus } from "./pipeline-bus.js";
4
+ import type { InteractionObservation, InteractionPolicy } from "./interaction-policy.js";
5
+ import type { TurnArbiter } from "./turn-arbiter.js";
6
+ import { type Scheduler } from "./scheduler.js";
7
+ export interface InteractionCaps {
8
+ readonly emitsBackchannel?: boolean;
9
+ }
10
+ export declare class InteractionCoordinator {
11
+ private readonly deps;
12
+ private readonly disposers;
13
+ private readonly pendingTakeTurns;
14
+ private readonly transcriptsByContext;
15
+ private readonly interimByContext;
16
+ private readonly scheduler;
17
+ constructor(deps: {
18
+ bus: PipelineBus;
19
+ policy: InteractionPolicy;
20
+ executor: TurnArbiter;
21
+ caps: InteractionCaps;
22
+ scheduler?: Scheduler;
23
+ isUserSpeaking?: () => boolean;
24
+ isTtsActive?: () => boolean;
25
+ hasCueAsset?: (cueId: string) => boolean;
26
+ onBackchannelEmitted?: (contextId: string) => void;
27
+ /** Session's configured endpointing owner — labels every eos this coordinator emits. */
28
+ endpointingOwner?: TurnEndOwner;
29
+ /** True when the STT force-finalize watchdog already fired for this context. */
30
+ wasForceFinalized?: (contextId: string) => boolean;
31
+ });
32
+ initialize(): void;
33
+ dispose(): void;
34
+ observe(obs: InteractionObservation): void;
35
+ observeBargeInAudio(pkt: VadAudioPacket): boolean;
36
+ private apply;
37
+ private armTakeTurn;
38
+ private handleSttInterim;
39
+ private handleSttResult;
40
+ private tryScheduleTurnComplete;
41
+ private revokePendingTakeTurn;
42
+ private applyBackchannel;
43
+ reset(contextId: string): void;
44
+ }
45
+ //# sourceMappingURL=interaction-coordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction-coordinator.d.ts","sourceRoot":"","sources":["../src/interaction-coordinator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAqC,YAAY,EAAiB,MAAM,cAAc,CAAC;AAEnG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAAuB,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC9G,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACrC;AAUD,qBAAa,sBAAsB;IAQ/B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IACnD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsC;IACvE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAwC;IAC7E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAGnB,IAAI,EAAE;QACrB,GAAG,EAAE,WAAW,CAAC;QACjB,MAAM,EAAE,iBAAiB,CAAC;QAC1B,QAAQ,EAAE,WAAW,CAAC;QACtB,IAAI,EAAE,eAAe,CAAC;QACtB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC;QAC/B,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;QAC5B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;QACzC,oBAAoB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;QACnD,wFAAwF;QACxF,gBAAgB,CAAC,EAAE,YAAY,CAAC;QAChC,gFAAgF;QAChF,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;KACpD;IAKH,UAAU,IAAI,IAAI;IAelB,OAAO,IAAI,IAAI;IAWf,OAAO,CAAC,GAAG,EAAE,sBAAsB,GAAG,IAAI;IAM1C,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO;IAajD,OAAO,CAAC,KAAK;IAoBb,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,uBAAuB;IAwC/B,OAAO,CAAC,qBAAqB;IAM7B,OAAO,CAAC,gBAAgB;IA6BxB,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAM/B"}
@@ -0,0 +1,197 @@
1
+ // SPDX-License-Identifier: MIT
2
+ import { Route } from "./pipeline-bus.js";
3
+ import { confidenceToWaitMs } from "./confidence-to-wait.js";
4
+ import { RuleBasedInteractionPolicy } from "./policies/rule-based.js";
5
+ import { TimerScheduler } from "./scheduler.js";
6
+ import * as make from "./packet-factories.js";
7
+ export class InteractionCoordinator {
8
+ deps;
9
+ disposers = [];
10
+ pendingTakeTurns = new Map();
11
+ transcriptsByContext = new Map();
12
+ interimByContext = new Map();
13
+ scheduler;
14
+ constructor(deps) {
15
+ this.deps = deps;
16
+ this.scheduler = deps.scheduler ?? new TimerScheduler();
17
+ }
18
+ initialize() {
19
+ const { bus } = this.deps;
20
+ this.disposers.push(bus.on("stt.result", (pkt) => {
21
+ this.handleSttResult(pkt);
22
+ }), bus.on("stt.interim", (pkt) => {
23
+ this.handleSttInterim(pkt);
24
+ }), bus.on("vad.speech_started", (pkt) => {
25
+ this.revokePendingTakeTurn(pkt.contextId);
26
+ }));
27
+ }
28
+ dispose() {
29
+ for (const contextId of this.pendingTakeTurns.keys()) {
30
+ this.revokePendingTakeTurn(contextId);
31
+ }
32
+ for (const dispose of this.disposers.splice(0)) {
33
+ dispose();
34
+ }
35
+ this.transcriptsByContext.clear();
36
+ this.interimByContext.clear();
37
+ }
38
+ observe(obs) {
39
+ for (const d of this.deps.policy.observe(obs)) {
40
+ this.apply(d, obs);
41
+ }
42
+ }
43
+ observeBargeInAudio(pkt) {
44
+ this.observe({
45
+ kind: "vad_barge_in_audio",
46
+ contextId: pkt.contextId,
47
+ timestampMs: pkt.timestampMs,
48
+ audio: pkt.audio,
49
+ });
50
+ if (this.deps.policy instanceof RuleBasedInteractionPolicy) {
51
+ return this.deps.policy.takeBargeInAudioConsumed();
52
+ }
53
+ return this.deps.executor.observeBargeInAudio(pkt);
54
+ }
55
+ apply(d, obs) {
56
+ switch (d.kind) {
57
+ case "take_turn":
58
+ this.armTakeTurn(obs.contextId, d.confidence, d.waitMs, obs.timestampMs);
59
+ break;
60
+ case "hold":
61
+ case "keep_listening":
62
+ this.revokePendingTakeTurn(obs.contextId);
63
+ break;
64
+ case "interrupt":
65
+ this.deps.executor.emitInterruptDetected(d.interruptedContextId);
66
+ break;
67
+ case "backchannel":
68
+ this.applyBackchannel(d, obs);
69
+ break;
70
+ default:
71
+ break;
72
+ }
73
+ }
74
+ armTakeTurn(contextId, confidence, waitMs, timestampMs) {
75
+ const existing = this.pendingTakeTurns.get(contextId);
76
+ const pending = existing ?? {
77
+ confidence,
78
+ transcripts: [...(this.transcriptsByContext.get(contextId) ?? [])],
79
+ latestInterim: this.interimByContext.get(contextId) ?? "",
80
+ finalizeRequested: false,
81
+ };
82
+ pending.confidence = confidence;
83
+ pending.waitMs = waitMs;
84
+ this.pendingTakeTurns.set(contextId, pending);
85
+ if (!pending.finalizeRequested) {
86
+ pending.finalizeRequested = true;
87
+ this.deps.bus.push(Route.Critical, make.finalizeStt(contextId, timestampMs));
88
+ }
89
+ this.tryScheduleTurnComplete(contextId);
90
+ }
91
+ handleSttInterim(pkt) {
92
+ const text = pkt.text.trim();
93
+ if (!text)
94
+ return;
95
+ this.interimByContext.set(pkt.contextId, text);
96
+ const pending = this.pendingTakeTurns.get(pkt.contextId);
97
+ if (pending)
98
+ pending.latestInterim = text;
99
+ }
100
+ handleSttResult(pkt) {
101
+ const text = pkt.text.trim();
102
+ if (!text)
103
+ return;
104
+ const transcripts = this.transcriptsByContext.get(pkt.contextId) ?? [];
105
+ if (transcripts.at(-1)?.text.trim() !== text) {
106
+ transcripts.push(pkt);
107
+ this.transcriptsByContext.set(pkt.contextId, transcripts);
108
+ }
109
+ this.interimByContext.delete(pkt.contextId);
110
+ const pending = this.pendingTakeTurns.get(pkt.contextId);
111
+ if (!pending)
112
+ return;
113
+ pending.transcripts = [...transcripts];
114
+ pending.latestInterim = "";
115
+ this.tryScheduleTurnComplete(pkt.contextId);
116
+ }
117
+ tryScheduleTurnComplete(contextId) {
118
+ const pending = this.pendingTakeTurns.get(contextId);
119
+ if (!pending)
120
+ return;
121
+ // Anchor the finalize timer at the policy's commitment even before any text
122
+ // exists — the callback reads live transcript/interim state at fire time and
123
+ // is the sole gate on whether the turn actually completes.
124
+ const delayMs = pending.waitMs ?? confidenceToWaitMs(pending.confidence);
125
+ const timerKey = takeTurnTimerKey(contextId);
126
+ this.scheduler.cancel(timerKey);
127
+ this.scheduler.schedule(timerKey, delayMs, () => {
128
+ const live = this.pendingTakeTurns.get(contextId);
129
+ if (!live)
130
+ return;
131
+ const finalText = joinTranscript(live.transcripts, live.latestInterim);
132
+ // The policy committed to this turn. Prefer real STT finals; if none ever
133
+ // arrived, fall back to the latest interim so a committed turn is never
134
+ // silently dropped. Only bail when there is genuinely nothing to commit.
135
+ if (!finalText)
136
+ return;
137
+ this.pendingTakeTurns.delete(contextId);
138
+ const transcripts = live.transcripts.length > 0
139
+ ? live.transcripts
140
+ : [{ kind: "stt.result", contextId, timestampMs: Date.now(), text: finalText, confidence: 0 }];
141
+ // The policy committed to this turn, so the endpointing decision is genuinely
142
+ // known here — label who decided and why. A force-finalize watchdog firing
143
+ // underneath us is a different diagnosis from a natural endpoint.
144
+ const configuredOwner = this.deps.endpointingOwner;
145
+ const forced = this.deps.wasForceFinalized?.(contextId) === true;
146
+ const reason = forced ? "force_finalized" : "end_of_speech";
147
+ const endpointing = configuredOwner === undefined ? undefined : { owner: configuredOwner, reason };
148
+ this.deps.bus.push(Route.Main, make.eosTurnComplete(contextId, Date.now(), finalText, transcripts, endpointing));
149
+ });
150
+ }
151
+ revokePendingTakeTurn(contextId) {
152
+ if (!this.pendingTakeTurns.has(contextId))
153
+ return;
154
+ this.scheduler.cancel(takeTurnTimerKey(contextId));
155
+ this.pendingTakeTurns.delete(contextId);
156
+ }
157
+ applyBackchannel(d, obs) {
158
+ const contextId = obs.contextId;
159
+ this.deps.bus.push(Route.Background, make.metric(contextId, "backchannel.candidate", d.cue));
160
+ if (this.deps.caps.emitsBackchannel) {
161
+ this.deps.bus.push(Route.Background, make.metric(contextId, "backchannel.suppressed_caps", d.cue));
162
+ return;
163
+ }
164
+ if (this.deps.isTtsActive?.()) {
165
+ this.deps.bus.push(Route.Background, make.metric(contextId, "backchannel.suppressed_tts_active", d.cue));
166
+ return;
167
+ }
168
+ if (this.deps.isUserSpeaking?.()) {
169
+ this.deps.bus.push(Route.Background, make.metric(contextId, "backchannel.suppressed_user_speaking", d.cue));
170
+ return;
171
+ }
172
+ if (this.deps.hasCueAsset && !this.deps.hasCueAsset(d.cue)) {
173
+ this.deps.bus.push(Route.Background, make.metric(contextId, "backchannel.suppressed_missing_asset", d.cue));
174
+ return;
175
+ }
176
+ this.deps.bus.push(Route.Main, make.interactionBackchannel(contextId, Date.now(), d.cue));
177
+ this.deps.bus.push(Route.Background, make.metric(contextId, "backchannel.emitted", d.cue));
178
+ this.deps.onBackchannelEmitted?.(contextId);
179
+ }
180
+ reset(contextId) {
181
+ this.revokePendingTakeTurn(contextId);
182
+ this.transcriptsByContext.delete(contextId);
183
+ this.interimByContext.delete(contextId);
184
+ this.deps.policy.reset(contextId);
185
+ }
186
+ }
187
+ function takeTurnTimerKey(contextId) {
188
+ return `interaction.take_turn:${contextId}`;
189
+ }
190
+ function joinTranscript(transcripts, interim) {
191
+ const segments = [
192
+ ...transcripts.map((t) => t.text.trim()),
193
+ ...(interim ? [interim.trim()] : []),
194
+ ].filter(Boolean);
195
+ return segments.join(" ").replace(/\s+/g, " ").trim();
196
+ }
197
+ //# sourceMappingURL=interaction-coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction-coordinator.js","sourceRoot":"","sources":["../src/interaction-coordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ import type { AcousticSignal } from "./packets.js";
2
+ export interface WordTiming {
3
+ readonly word: string;
4
+ readonly startMs: number;
5
+ readonly endMs: number;
6
+ readonly confidence: number;
7
+ }
8
+ export type InteractionObservation = {
9
+ readonly kind: "vad_speech_started";
10
+ readonly contextId: string;
11
+ readonly timestampMs: number;
12
+ readonly confidence: number;
13
+ readonly interruptedContextId?: string;
14
+ } | {
15
+ readonly kind: "vad_speech_activity";
16
+ readonly contextId: string;
17
+ readonly timestampMs: number;
18
+ } | {
19
+ readonly kind: "vad_speech_ended";
20
+ readonly contextId: string;
21
+ readonly timestampMs: number;
22
+ readonly hasActiveTts: boolean;
23
+ } | {
24
+ readonly kind: "vad_barge_in_audio";
25
+ readonly contextId: string;
26
+ readonly timestampMs: number;
27
+ readonly audio: Uint8Array;
28
+ } | {
29
+ readonly kind: "stt_partial";
30
+ readonly contextId: string;
31
+ readonly timestampMs: number;
32
+ readonly text: string;
33
+ readonly confidence?: number;
34
+ readonly interruptedContextId?: string;
35
+ readonly wordTimings?: readonly WordTiming[];
36
+ } | {
37
+ readonly kind: "stt_final";
38
+ readonly contextId: string;
39
+ readonly timestampMs: number;
40
+ readonly text: string;
41
+ readonly confidence?: number;
42
+ readonly interruptedContextId?: string;
43
+ readonly wordTimings?: readonly WordTiming[];
44
+ } | {
45
+ readonly kind: "audio_frame";
46
+ readonly contextId: string;
47
+ readonly timestampMs: number;
48
+ readonly audio?: Int16Array;
49
+ readonly sampleRateHz?: number;
50
+ readonly wordTimings?: readonly WordTiming[];
51
+ readonly prosody?: Float32Array;
52
+ } | {
53
+ readonly kind: "playout_tick";
54
+ readonly contextId: string;
55
+ readonly timestampMs: number;
56
+ readonly playedOutMs?: number;
57
+ readonly ttsActive?: boolean;
58
+ /** PCM queued for assistant playout. Present on audio-bearing ticks. */
59
+ readonly audio?: Int16Array;
60
+ readonly sampleRateHz?: number;
61
+ } | {
62
+ readonly kind: "delegate_state";
63
+ readonly contextId: string;
64
+ readonly timestampMs: number;
65
+ readonly delegateInFlight?: boolean;
66
+ readonly toolCallPhase?: "started" | "delayed" | "complete" | "failed";
67
+ };
68
+ export type InteractionDecision = {
69
+ readonly kind: "keep_listening";
70
+ } | {
71
+ readonly kind: "take_turn";
72
+ readonly confidence: number;
73
+ readonly waitMs?: number;
74
+ }
75
+ /** `cue` is a stable pre-cached asset id (e.g. `mm_hmm`), not free-form text. */
76
+ | {
77
+ readonly kind: "backchannel";
78
+ readonly cue: string;
79
+ } | {
80
+ readonly kind: "hold";
81
+ } | {
82
+ readonly kind: "interrupt";
83
+ readonly interruptedContextId: string;
84
+ };
85
+ export interface AcousticSignalObservation {
86
+ readonly contextId: string;
87
+ readonly timestampMs: number;
88
+ readonly signal: AcousticSignal;
89
+ readonly payload?: Readonly<Record<string, unknown>>;
90
+ }
91
+ export type AcousticSignalSink = (signal: AcousticSignalObservation) => void;
92
+ export interface InteractionPolicy {
93
+ observe(obs: InteractionObservation): readonly InteractionDecision[];
94
+ reset(contextId: string): void;
95
+ setAcousticSignalSink?(sink: AcousticSignalSink): void;
96
+ }
97
+ /** Optional lifecycle for externally supplied model policies (session-owned). */
98
+ export interface LifecycleInteractionPolicy extends InteractionPolicy {
99
+ initialize(config: Record<string, unknown>): Promise<void>;
100
+ close(): Promise<void>;
101
+ }
102
+ export declare function isLifecycleInteractionPolicy(policy: InteractionPolicy): policy is LifecycleInteractionPolicy;
103
+ //# sourceMappingURL=interaction-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction-policy.d.ts","sourceRoot":"","sources":["../src/interaction-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ // SPDX-License-Identifier: MIT
2
+ export function isLifecycleInteractionPolicy(policy) {
3
+ const candidate = policy;
4
+ return typeof candidate.initialize === "function" && typeof candidate.close === "function";
5
+ }
6
+ //# sourceMappingURL=interaction-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction-policy.js","sourceRoot":"","sources":["../src/interaction-policy.ts"],"names":[],"mappings":"AAAA,+BAA+B;AA8G/B,MAAM,UAAU,4BAA4B,CAC1C,MAAyB;IAEzB,MAAM,SAAS,GAAG,MAAoC,CAAC;IACvD,OAAO,OAAO,SAAS,CAAC,UAAU,KAAK,UAAU,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,UAAU,CAAC;AAC7F,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { IncrementalUnit, IncrementalUnitId, IuState } from "./incremental-unit.js";
2
+ export interface IuLedger {
3
+ add(iu: IncrementalUnit): void;
4
+ commit(id: IncrementalUnitId, prefix?: {
5
+ chars?: number;
6
+ ms?: number;
7
+ }): void;
8
+ revoke(id: IncrementalUnitId): void;
9
+ get(id: IncrementalUnitId): IncrementalUnit | undefined;
10
+ latest(contextId: string, kind: IncrementalUnit["kind"]): IncrementalUnit | undefined;
11
+ clear(contextId: string): void;
12
+ }
13
+ export type IuLedgerAnomaly = {
14
+ readonly kind: "terminal_op";
15
+ readonly op: "commit" | "revoke";
16
+ readonly id: IncrementalUnitId;
17
+ readonly state: IuState;
18
+ } | {
19
+ readonly kind: "unknown_iu";
20
+ readonly op: "commit" | "revoke";
21
+ readonly id: IncrementalUnitId;
22
+ };
23
+ export declare class InMemoryIuLedger implements IuLedger {
24
+ private readonly onEvent;
25
+ private readonly maxContexts;
26
+ private readonly byCtx;
27
+ constructor(onEvent?: (a: IuLedgerAnomaly) => void, maxContexts?: number);
28
+ add(iu: IncrementalUnit): void;
29
+ commit(id: IncrementalUnitId, prefix?: {
30
+ chars?: number;
31
+ ms?: number;
32
+ }): void;
33
+ revoke(id: IncrementalUnitId): void;
34
+ get(id: IncrementalUnitId): IncrementalUnit | undefined;
35
+ latest(contextId: string, kind: IncrementalUnit["kind"]): IncrementalUnit | undefined;
36
+ clear(contextId: string): void;
37
+ private ctxMap;
38
+ }
39
+ //# sourceMappingURL=iu-ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iu-ledger.d.ts","sourceRoot":"","sources":["../src/iu-ledger.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEzF,MAAM,WAAW,QAAQ;IACvB,GAAG,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9E,MAAM,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,GAAG,CAAC,EAAE,EAAE,iBAAiB,GAAG,eAAe,GAAG,SAAS,CAAC;IACxD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,eAAe,GAAG,SAAS,CAAC;IACtF,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC3H;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAEtG,qBAAa,gBAAiB,YAAW,QAAQ;IAI7C,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAJ9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmD;gBAGtD,OAAO,GAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAe,EAChD,WAAW,GAAE,MAAY;IAG5C,GAAG,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI;IAS9B,MAAM,CAAC,EAAE,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAqB7E,MAAM,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI;IAkBnC,GAAG,CAAC,EAAE,EAAE,iBAAiB,GAAG,eAAe,GAAG,SAAS;IAQvD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,eAAe,GAAG,SAAS;IAcrF,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI9B,OAAO,CAAC,MAAM;CAQf"}