@memberjunction/ai-agents 6.2.0-edge.2 → 6.2.0-edge.4

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 (148) hide show
  1. package/README.md +6 -0
  2. package/dist/AgentDecisionService.d.ts +8 -1
  3. package/dist/AgentDecisionService.d.ts.map +1 -1
  4. package/dist/AgentDecisionService.js +4 -0
  5. package/dist/AgentDecisionService.js.map +1 -1
  6. package/dist/AgentRunner.d.ts +51 -2
  7. package/dist/AgentRunner.d.ts.map +1 -1
  8. package/dist/AgentRunner.js +121 -23
  9. package/dist/AgentRunner.js.map +1 -1
  10. package/dist/ConversationCompactionManager.d.ts +9 -1
  11. package/dist/ConversationCompactionManager.d.ts.map +1 -1
  12. package/dist/ConversationCompactionManager.js +6 -3
  13. package/dist/ConversationCompactionManager.js.map +1 -1
  14. package/dist/ConversationToolManager.d.ts +13 -2
  15. package/dist/ConversationToolManager.d.ts.map +1 -1
  16. package/dist/ConversationToolManager.js +19 -3
  17. package/dist/ConversationToolManager.js.map +1 -1
  18. package/dist/KnowledgeAgent.d.ts.map +1 -1
  19. package/dist/KnowledgeAgent.js +6 -1
  20. package/dist/KnowledgeAgent.js.map +1 -1
  21. package/dist/MJAIAgentRequestEntityServer.d.ts +6 -0
  22. package/dist/MJAIAgentRequestEntityServer.d.ts.map +1 -1
  23. package/dist/MJAIAgentRequestEntityServer.js +26 -1
  24. package/dist/MJAIAgentRequestEntityServer.js.map +1 -1
  25. package/dist/PayloadFeedbackManager.d.ts +3 -0
  26. package/dist/PayloadFeedbackManager.d.ts.map +1 -1
  27. package/dist/PayloadFeedbackManager.js +2 -1
  28. package/dist/PayloadFeedbackManager.js.map +1 -1
  29. package/dist/agent-run-watchdog.d.ts +65 -5
  30. package/dist/agent-run-watchdog.d.ts.map +1 -1
  31. package/dist/agent-run-watchdog.js +143 -28
  32. package/dist/agent-run-watchdog.js.map +1 -1
  33. package/dist/agent-types/loop-agent-prompt-params.d.ts +7 -0
  34. package/dist/agent-types/loop-agent-prompt-params.d.ts.map +1 -1
  35. package/dist/agent-types/loop-agent-prompt-params.js +1 -0
  36. package/dist/agent-types/loop-agent-prompt-params.js.map +1 -1
  37. package/dist/agent-types/loop-agent-type.d.ts +20 -0
  38. package/dist/agent-types/loop-agent-type.d.ts.map +1 -1
  39. package/dist/agent-types/loop-agent-type.js +73 -2
  40. package/dist/agent-types/loop-agent-type.js.map +1 -1
  41. package/dist/artifact-tools/SearchResultSetToolLibrary.js +4 -4
  42. package/dist/artifact-tools/SearchResultSetToolLibrary.js.map +1 -1
  43. package/dist/base-agent.d.ts +310 -26
  44. package/dist/base-agent.d.ts.map +1 -1
  45. package/dist/base-agent.js +867 -244
  46. package/dist/base-agent.js.map +1 -1
  47. package/dist/client-tool-results.d.ts +45 -0
  48. package/dist/client-tool-results.d.ts.map +1 -0
  49. package/dist/client-tool-results.js +94 -0
  50. package/dist/client-tool-results.js.map +1 -0
  51. package/dist/index.d.ts +9 -0
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +9 -0
  54. package/dist/index.js.map +1 -1
  55. package/dist/native-tools/action-tool-builder.d.ts +14 -0
  56. package/dist/native-tools/action-tool-builder.d.ts.map +1 -1
  57. package/dist/native-tools/action-tool-builder.js +62 -7
  58. package/dist/native-tools/action-tool-builder.js.map +1 -1
  59. package/dist/native-tools/control-tools.d.ts +17 -1
  60. package/dist/native-tools/control-tools.d.ts.map +1 -1
  61. package/dist/native-tools/control-tools.js +40 -3
  62. package/dist/native-tools/control-tools.js.map +1 -1
  63. package/dist/prior-turn-tool-result-cache.d.ts +31 -12
  64. package/dist/prior-turn-tool-result-cache.d.ts.map +1 -1
  65. package/dist/prior-turn-tool-result-cache.js +59 -16
  66. package/dist/prior-turn-tool-result-cache.js.map +1 -1
  67. package/dist/realtime/bridge-host-params.d.ts +22 -0
  68. package/dist/realtime/bridge-host-params.d.ts.map +1 -0
  69. package/dist/realtime/bridge-host-params.js +53 -0
  70. package/dist/realtime/bridge-host-params.js.map +1 -0
  71. package/dist/realtime/bridge-realtime-session-factory.d.ts +63 -3
  72. package/dist/realtime/bridge-realtime-session-factory.d.ts.map +1 -1
  73. package/dist/realtime/bridge-realtime-session-factory.js +83 -22
  74. package/dist/realtime/bridge-realtime-session-factory.js.map +1 -1
  75. package/dist/realtime/bridge-realtime-usage-recorder.d.ts +81 -0
  76. package/dist/realtime/bridge-realtime-usage-recorder.d.ts.map +1 -0
  77. package/dist/realtime/bridge-realtime-usage-recorder.js +194 -0
  78. package/dist/realtime/bridge-realtime-usage-recorder.js.map +1 -0
  79. package/dist/realtime/bridge-session-transcript-sink.d.ts +37 -0
  80. package/dist/realtime/bridge-session-transcript-sink.d.ts.map +1 -0
  81. package/dist/realtime/bridge-session-transcript-sink.js +58 -0
  82. package/dist/realtime/bridge-session-transcript-sink.js.map +1 -0
  83. package/dist/realtime/client-only-channel-server.d.ts +83 -0
  84. package/dist/realtime/client-only-channel-server.d.ts.map +1 -0
  85. package/dist/realtime/client-only-channel-server.js +107 -0
  86. package/dist/realtime/client-only-channel-server.js.map +1 -0
  87. package/dist/realtime/identity-verification-channel-server.d.ts +50 -0
  88. package/dist/realtime/identity-verification-channel-server.d.ts.map +1 -0
  89. package/dist/realtime/identity-verification-channel-server.js +66 -0
  90. package/dist/realtime/identity-verification-channel-server.js.map +1 -0
  91. package/dist/realtime/interactive-component-channel-server.d.ts +39 -0
  92. package/dist/realtime/interactive-component-channel-server.d.ts.map +1 -0
  93. package/dist/realtime/interactive-component-channel-server.js +55 -0
  94. package/dist/realtime/interactive-component-channel-server.js.map +1 -0
  95. package/dist/realtime/realtime-avatar-resolution.d.ts +194 -0
  96. package/dist/realtime/realtime-avatar-resolution.d.ts.map +1 -0
  97. package/dist/realtime/realtime-avatar-resolution.js +208 -0
  98. package/dist/realtime/realtime-avatar-resolution.js.map +1 -0
  99. package/dist/realtime/realtime-channel-policy.d.ts +81 -0
  100. package/dist/realtime/realtime-channel-policy.d.ts.map +1 -0
  101. package/dist/realtime/realtime-channel-policy.js +91 -0
  102. package/dist/realtime/realtime-channel-policy.js.map +1 -0
  103. package/dist/realtime/realtime-channel-server-host.d.ts +14 -0
  104. package/dist/realtime/realtime-channel-server-host.d.ts.map +1 -1
  105. package/dist/realtime/realtime-channel-server-host.js +35 -0
  106. package/dist/realtime/realtime-channel-server-host.js.map +1 -1
  107. package/dist/realtime/realtime-client-session-service.d.ts +493 -30
  108. package/dist/realtime/realtime-client-session-service.d.ts.map +1 -1
  109. package/dist/realtime/realtime-client-session-service.js +825 -98
  110. package/dist/realtime/realtime-client-session-service.js.map +1 -1
  111. package/dist/realtime/realtime-coagent-config.d.ts +94 -15
  112. package/dist/realtime/realtime-coagent-config.d.ts.map +1 -1
  113. package/dist/realtime/realtime-coagent-config.js +109 -4
  114. package/dist/realtime/realtime-coagent-config.js.map +1 -1
  115. package/dist/realtime/realtime-coagent-resolution.d.ts +90 -0
  116. package/dist/realtime/realtime-coagent-resolution.d.ts.map +1 -0
  117. package/dist/realtime/realtime-coagent-resolution.js +186 -0
  118. package/dist/realtime/realtime-coagent-resolution.js.map +1 -0
  119. package/dist/realtime/realtime-delegation-narrator.d.ts +97 -0
  120. package/dist/realtime/realtime-delegation-narrator.d.ts.map +1 -0
  121. package/dist/realtime/realtime-delegation-narrator.js +162 -0
  122. package/dist/realtime/realtime-delegation-narrator.js.map +1 -0
  123. package/dist/realtime/realtime-recording-store.d.ts +136 -16
  124. package/dist/realtime/realtime-recording-store.d.ts.map +1 -1
  125. package/dist/realtime/realtime-recording-store.js +505 -39
  126. package/dist/realtime/realtime-recording-store.js.map +1 -1
  127. package/dist/realtime/realtime-session-runner.d.ts +2 -82
  128. package/dist/realtime/realtime-session-runner.d.ts.map +1 -1
  129. package/dist/realtime/realtime-session-runner.js +16 -191
  130. package/dist/realtime/realtime-session-runner.js.map +1 -1
  131. package/dist/realtime/realtime-vendor-resolution.d.ts +9 -0
  132. package/dist/realtime/realtime-vendor-resolution.d.ts.map +1 -1
  133. package/dist/realtime/realtime-vendor-resolution.js +16 -5
  134. package/dist/realtime/realtime-vendor-resolution.js.map +1 -1
  135. package/dist/realtime/realtime-video-output-gate.d.ts +83 -0
  136. package/dist/realtime/realtime-video-output-gate.d.ts.map +1 -0
  137. package/dist/realtime/realtime-video-output-gate.js +79 -0
  138. package/dist/realtime/realtime-video-output-gate.js.map +1 -0
  139. package/dist/rubric-evaluation-agent-runner.js +17 -8
  140. package/dist/rubric-evaluation-agent-runner.js.map +1 -1
  141. package/dist/self-check.d.ts +6 -3
  142. package/dist/self-check.d.ts.map +1 -1
  143. package/dist/self-check.js +3 -3
  144. package/dist/self-check.js.map +1 -1
  145. package/dist/tool-result-format.d.ts +14 -0
  146. package/dist/tool-result-format.d.ts.map +1 -1
  147. package/dist/tool-result-format.js.map +1 -1
  148. package/package.json +19 -19
@@ -20,6 +20,13 @@ import { CarryForwardStepRecord } from './tool-result-format.js';
20
20
  * - Entries are keyed by conversation AND agent, mirroring the DB path's `AgentID`
21
21
  * filter — in a multi-agent conversation, agent B must never inherit agent A's
22
22
  * results labeled "your previous turn".
23
+ * - Entries are also keyed by branch, mirroring the DB path's branch-path filter — a
24
+ * run never inherits results from a run whose reply row is off its path. A branch with
25
+ * no entry yet falls back to the DB path, which can return a trunk run from before the fork.
26
+ * - Entries carry the reply row of the run that stored them. When a save on this server
27
+ * marks that row replaced (`ReplacedAt` set by an in-place rerun of its turn), the entry
28
+ * is no longer served, just as the DB path leaves out runs whose reply row is replaced:
29
+ * a replaced answer's tool results are never carried forward.
23
30
  * - Values are the raw completed-`Tool`-step `OutputData` projections; eligibility is
24
31
  * still decided downstream by `BuildPriorTurnToolResultsMessage` via `toolFamily`,
25
32
  * identical for cached and DB-loaded records.
@@ -38,9 +45,14 @@ import { CarryForwardStepRecord } from './tool-result-format.js';
38
45
  * the TTL bounds the staleness window, and each node self-heals on its next completed
39
46
  * run for that conversation — so the fallback keeps the default single-node deployment
40
47
  * exact while multi-node degrades gracefully rather than paying the queries every turn.
48
+ * The replaced-row rule has the same limit: a replacement saved on another server is not
49
+ * seen here, so this node can still serve that run's entry until it expires or is replaced.
41
50
  */
42
51
  export declare class PriorTurnToolResultCache extends BaseSingleton<PriorTurnToolResultCache> {
43
- /** Protected per the {@link BaseSingleton} contract — obtain via {@link Instance}. */
52
+ /**
53
+ * Protected per the {@link BaseSingleton} contract — obtain via {@link Instance}. Listens for
54
+ * entity saves on this server to learn which conversation details were replaced.
55
+ */
44
56
  protected constructor();
45
57
  /** Process-wide singleton accessor (Global Object Store backed, bundler-duplication safe). */
46
58
  static get Instance(): PriorTurnToolResultCache;
@@ -51,21 +63,28 @@ export declare class PriorTurnToolResultCache extends BaseSingleton<PriorTurnToo
51
63
  * bounding the multi-node staleness window described above.
52
64
  */
53
65
  private cache;
54
- /**
55
- * Cache key: normalized conversation + agent, so agent B never inherits agent A's
56
- * results in a multi-agent conversation. `::` is safe (UUIDs cannot contain it).
57
- */
66
+ /** Normalized ids of conversation details replaced by an in-place rerun, seen on this server. */
67
+ private replacedDetails;
68
+ /** Key: conversation, agent and branch ('trunk' when none), so an entry serves only runs on the branch that stored it. */
58
69
  private static buildKey;
59
70
  /**
60
71
  * Returns the carry-forward records of this agent's most recent settled root run in
61
- * the conversation on this node — `[]` means "settled with no tool results" (a
62
- * valid, query-skipping answer); `undefined` means "not known here, ask the
63
- * database".
72
+ * the conversation on this node, on one branch path (`branchId` null is the trunk) —
73
+ * `[]` means "settled with no tool results" (a valid, query-skipping answer);
74
+ * `undefined` means "not known here, ask the database". An entry whose run's reply row
75
+ * was replaced is dropped and reads as `undefined`.
76
+ */
77
+ Get(conversationId: string, agentId: string, branchId: string | null): CarryForwardStepRecord[] | undefined;
78
+ /**
79
+ * Records a settled root run's carry-forward projections (empty array included) for one branch path.
80
+ * `sourceDetailId` is the run's reply row; the entry is not served once that row is replaced.
64
81
  */
65
- Get(conversationId: string, agentId: string): CarryForwardStepRecord[] | undefined;
66
- /** Records a settled root run's carry-forward projections (empty array included). */
67
- Set(conversationId: string, agentId: string, steps: CarryForwardStepRecord[]): void;
68
- /** Drops every entry — test isolation hook. */
82
+ Set(conversationId: string, agentId: string, branchId: string | null, steps: CarryForwardStepRecord[], sourceDetailId?: string | null): void;
83
+ /** Records that an in-place rerun replaced a conversation detail; entries whose run replied with it are no longer served. */
84
+ MarkDetailReplaced(detailId: string): void;
85
+ /** Drops every entry and every replaced-detail mark — test isolation hook. */
69
86
  Clear(): void;
87
+ /** Marks a conversation detail replaced when a save on this server leaves its `ReplacedAt` set. */
88
+ private onGlobalEvent;
70
89
  }
71
90
  //# sourceMappingURL=prior-turn-tool-result-cache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prior-turn-tool-result-cache.d.ts","sourceRoot":"","sources":["../src/prior-turn-tool-result-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA6B,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,qBAAa,wBAAyB,SAAQ,aAAa,CAAC,wBAAwB,CAAC;IACjF,sFAAsF;IACtF,SAAS;IAIT,8FAA8F;IAC9F,WAAkB,QAAQ,IAAI,wBAAwB,CAErD;IAED;;;;;OAKG;IACH,OAAO,CAAC,KAAK,CAGV;IAEH;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ;IAIvB;;;;;OAKG;IACI,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,sBAAsB,EAAE,GAAG,SAAS;IAIzF,qFAAqF;IAC9E,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,EAAE,GAAG,IAAI;IAI1F,+CAA+C;IACxC,KAAK,IAAI,IAAI;CAGvB"}
1
+ {"version":3,"file":"prior-turn-tool-result-cache.d.ts","sourceRoot":"","sources":["../src/prior-turn-tool-result-cache.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAkE,MAAM,wBAAwB,CAAC;AACvH,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAS9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,qBAAa,wBAAyB,SAAQ,aAAa,CAAC,wBAAwB,CAAC;IACjF;;;OAGG;IACH,SAAS;IAKT,8FAA8F;IAC9F,WAAkB,QAAQ,IAAI,wBAAwB,CAErD;IAED;;;;;OAKG;IACH,OAAO,CAAC,KAAK,CAGV;IAEH,iGAAiG;IACjG,OAAO,CAAC,eAAe,CAAmD;IAE1E,0HAA0H;IAC1H,OAAO,CAAC,MAAM,CAAC,QAAQ;IAIvB;;;;;;OAMG;IACI,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,sBAAsB,EAAE,GAAG,SAAS;IAalH;;;OAGG;IACI,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,cAAc,GAAE,MAAM,GAAG,IAAW,GAAG,IAAI;IAIzJ,6HAA6H;IACtH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIjD,8EAA8E;IACvE,KAAK,IAAI,IAAI;IAKpB,mGAAmG;IACnG,OAAO,CAAC,aAAa;CAUxB"}
@@ -1,4 +1,6 @@
1
- import { BaseSingleton, MJLruCache, NormalizeUUID } from '@memberjunction/global';
1
+ import { BaseEntity } from '@memberjunction/core';
2
+ import { ConversationEngine, MJConversationDetailEntity } from '@memberjunction/core-entities';
3
+ import { BaseSingleton, MJEventType, MJGlobal, MJLruCache, NormalizeUUID } from '@memberjunction/global';
2
4
  /**
3
5
  * Process-wide cache of the most recent settled root run's Tool-step results per
4
6
  * conversation + agent, keeping the prior-turn carry-forward check off the database on
@@ -19,6 +21,13 @@ import { BaseSingleton, MJLruCache, NormalizeUUID } from '@memberjunction/global
19
21
  * - Entries are keyed by conversation AND agent, mirroring the DB path's `AgentID`
20
22
  * filter — in a multi-agent conversation, agent B must never inherit agent A's
21
23
  * results labeled "your previous turn".
24
+ * - Entries are also keyed by branch, mirroring the DB path's branch-path filter — a
25
+ * run never inherits results from a run whose reply row is off its path. A branch with
26
+ * no entry yet falls back to the DB path, which can return a trunk run from before the fork.
27
+ * - Entries carry the reply row of the run that stored them. When a save on this server
28
+ * marks that row replaced (`ReplacedAt` set by an in-place rerun of its turn), the entry
29
+ * is no longer served, just as the DB path leaves out runs whose reply row is replaced:
30
+ * a replaced answer's tool results are never carried forward.
22
31
  * - Values are the raw completed-`Tool`-step `OutputData` projections; eligibility is
23
32
  * still decided downstream by `BuildPriorTurnToolResultsMessage` via `toolFamily`,
24
33
  * identical for cached and DB-loaded records.
@@ -37,9 +46,14 @@ import { BaseSingleton, MJLruCache, NormalizeUUID } from '@memberjunction/global
37
46
  * the TTL bounds the staleness window, and each node self-heals on its next completed
38
47
  * run for that conversation — so the fallback keeps the default single-node deployment
39
48
  * exact while multi-node degrades gracefully rather than paying the queries every turn.
49
+ * The replaced-row rule has the same limit: a replacement saved on another server is not
50
+ * seen here, so this node can still serve that run's entry until it expires or is replaced.
40
51
  */
41
52
  export class PriorTurnToolResultCache extends BaseSingleton {
42
- /** Protected per the {@link BaseSingleton} contract — obtain via {@link Instance}. */
53
+ /**
54
+ * Protected per the {@link BaseSingleton} contract — obtain via {@link Instance}. Listens for
55
+ * entity saves on this server to learn which conversation details were replaced.
56
+ */
43
57
  constructor() {
44
58
  super();
45
59
  /**
@@ -52,34 +66,63 @@ export class PriorTurnToolResultCache extends BaseSingleton {
52
66
  maxSize: 500,
53
67
  ttlMs: 30 * 60 * 1000
54
68
  });
69
+ /** Normalized ids of conversation details replaced by an in-place rerun, seen on this server. */
70
+ this.replacedDetails = new MJLruCache({ maxSize: 5000 });
71
+ MJGlobal.Instance.GetEventListener(false).subscribe(event => this.onGlobalEvent(event));
55
72
  }
56
73
  /** Process-wide singleton accessor (Global Object Store backed, bundler-duplication safe). */
57
74
  static get Instance() {
58
75
  return super.getInstance();
59
76
  }
77
+ /** Key: conversation, agent and branch ('trunk' when none), so an entry serves only runs on the branch that stored it. */
78
+ static buildKey(conversationId, agentId, branchId) {
79
+ return `${NormalizeUUID(conversationId)}::${NormalizeUUID(agentId)}::${branchId ? NormalizeUUID(branchId) : 'trunk'}`;
80
+ }
60
81
  /**
61
- * Cache key: normalized conversation + agent, so agent B never inherits agent A's
62
- * results in a multi-agent conversation. `::` is safe (UUIDs cannot contain it).
82
+ * Returns the carry-forward records of this agent's most recent settled root run in
83
+ * the conversation on this node, on one branch path (`branchId` null is the trunk) —
84
+ * `[]` means "settled with no tool results" (a valid, query-skipping answer);
85
+ * `undefined` means "not known here, ask the database". An entry whose run's reply row
86
+ * was replaced is dropped and reads as `undefined`.
63
87
  */
64
- static buildKey(conversationId, agentId) {
65
- return `${NormalizeUUID(conversationId)}::${NormalizeUUID(agentId)}`;
88
+ Get(conversationId, agentId, branchId) {
89
+ const key = PriorTurnToolResultCache.buildKey(conversationId, agentId, branchId);
90
+ const entry = this.cache.Get(key);
91
+ if (!entry) {
92
+ return undefined;
93
+ }
94
+ if (entry.SourceDetailID && this.replacedDetails.Has(NormalizeUUID(entry.SourceDetailID))) {
95
+ this.cache.Delete(key);
96
+ return undefined;
97
+ }
98
+ return entry.Steps;
66
99
  }
67
100
  /**
68
- * Returns the carry-forward records of this agent's most recent settled root run in
69
- * the conversation on this node — `[]` means "settled with no tool results" (a
70
- * valid, query-skipping answer); `undefined` means "not known here, ask the
71
- * database".
101
+ * Records a settled root run's carry-forward projections (empty array included) for one branch path.
102
+ * `sourceDetailId` is the run's reply row; the entry is not served once that row is replaced.
72
103
  */
73
- Get(conversationId, agentId) {
74
- return this.cache.Get(PriorTurnToolResultCache.buildKey(conversationId, agentId));
104
+ Set(conversationId, agentId, branchId, steps, sourceDetailId = null) {
105
+ this.cache.Set(PriorTurnToolResultCache.buildKey(conversationId, agentId, branchId), { Steps: steps, SourceDetailID: sourceDetailId });
75
106
  }
76
- /** Records a settled root run's carry-forward projections (empty array included). */
77
- Set(conversationId, agentId, steps) {
78
- this.cache.Set(PriorTurnToolResultCache.buildKey(conversationId, agentId), steps);
107
+ /** Records that an in-place rerun replaced a conversation detail; entries whose run replied with it are no longer served. */
108
+ MarkDetailReplaced(detailId) {
109
+ this.replacedDetails.Set(NormalizeUUID(detailId), true);
79
110
  }
80
- /** Drops every entry — test isolation hook. */
111
+ /** Drops every entry and every replaced-detail mark — test isolation hook. */
81
112
  Clear() {
82
113
  this.cache.Clear();
114
+ this.replacedDetails.Clear();
115
+ }
116
+ /** Marks a conversation detail replaced when a save on this server leaves its `ReplacedAt` set. */
117
+ onGlobalEvent(event) {
118
+ if (event.event !== MJEventType.ComponentEvent || event.eventCode !== BaseEntity.BaseEventCode) {
119
+ return;
120
+ }
121
+ const entityEvent = event.args;
122
+ const detail = entityEvent?.baseEntity;
123
+ if (entityEvent?.type === 'save' && detail instanceof MJConversationDetailEntity && ConversationEngine.IsReplacedRow(detail)) {
124
+ this.MarkDetailReplaced(detail.ID);
125
+ }
83
126
  }
84
127
  }
85
128
  //# sourceMappingURL=prior-turn-tool-result-cache.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prior-turn-tool-result-cache.js","sourceRoot":"","sources":["../src/prior-turn-tool-result-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGlF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,OAAO,wBAAyB,SAAQ,aAAuC;IACjF,sFAAsF;IACtF;QACI,KAAK,EAAE,CAAC;QAQZ;;;;;WAKG;QACK,UAAK,GAAG,IAAI,UAAU,CAAmC;YAC7D,OAAO,EAAE,GAAG;YACZ,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;SACxB,CAAC,CAAC;IAhBH,CAAC;IAED,8FAA8F;IACvF,MAAM,KAAK,QAAQ;QACtB,OAAO,KAAK,CAAC,WAAW,EAA4B,CAAC;IACzD,CAAC;IAaD;;;OAGG;IACK,MAAM,CAAC,QAAQ,CAAC,cAAsB,EAAE,OAAe;QAC3D,OAAO,GAAG,aAAa,CAAC,cAAc,CAAC,KAAK,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;IACzE,CAAC;IAED;;;;;OAKG;IACI,GAAG,CAAC,cAAsB,EAAE,OAAe;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;IACtF,CAAC;IAED,qFAAqF;IAC9E,GAAG,CAAC,cAAsB,EAAE,OAAe,EAAE,KAA+B;QAC/E,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IACtF,CAAC;IAED,+CAA+C;IACxC,KAAK;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACJ"}
1
+ {"version":3,"file":"prior-turn-tool-result-cache.js","sourceRoot":"","sources":["../src/prior-turn-tool-result-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAwB,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAgB,MAAM,wBAAwB,CAAC;AAUvH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,MAAM,OAAO,wBAAyB,SAAQ,aAAuC;IACjF;;;OAGG;IACH;QACI,KAAK,EAAE,CAAC;QASZ;;;;;WAKG;QACK,UAAK,GAAG,IAAI,UAAU,CAAyB;YACnD,OAAO,EAAE,GAAG;YACZ,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;SACxB,CAAC,CAAC;QAEH,iGAAiG;QACzF,oBAAe,GAAG,IAAI,UAAU,CAAe,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QApBtE,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5F,CAAC;IAED,8FAA8F;IACvF,MAAM,KAAK,QAAQ;QACtB,OAAO,KAAK,CAAC,WAAW,EAA4B,CAAC;IACzD,CAAC;IAgBD,0HAA0H;IAClH,MAAM,CAAC,QAAQ,CAAC,cAAsB,EAAE,OAAe,EAAE,QAAuB;QACpF,OAAO,GAAG,aAAa,CAAC,cAAc,CAAC,KAAK,aAAa,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC1H,CAAC;IAED;;;;;;OAMG;IACI,GAAG,CAAC,cAAsB,EAAE,OAAe,EAAE,QAAuB;QACvE,MAAM,GAAG,GAAG,wBAAwB,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACjF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,IAAI,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;YACxF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,CAAC;IACvB,CAAC;IAED;;;OAGG;IACI,GAAG,CAAC,cAAsB,EAAE,OAAe,EAAE,QAAuB,EAAE,KAA+B,EAAE,iBAAgC,IAAI;QAC9I,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;IAC3I,CAAC;IAED,6HAA6H;IACtH,kBAAkB,CAAC,QAAgB;QACtC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED,8EAA8E;IACvE,KAAK;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;IAED,mGAAmG;IAC3F,aAAa,CAAC,KAAc;QAChC,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW,CAAC,cAAc,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,CAAC,aAAa,EAAE,CAAC;YAC7F,OAAO;QACX,CAAC;QACD,MAAM,WAAW,GAAgC,KAAK,CAAC,IAAI,CAAC;QAC5D,MAAM,MAAM,GAAG,WAAW,EAAE,UAAU,CAAC;QACvC,IAAI,WAAW,EAAE,IAAI,KAAK,MAAM,IAAI,MAAM,YAAY,0BAA0B,IAAI,kBAAkB,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3H,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC;IACL,CAAC;CACJ"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @fileoverview Type guards for the host-supplied extras that ride `ExecuteAgentParams.data` into a bridged
3
+ * realtime session (`realtimeHostTools`, `realtimeHostFraming`, `realtimePriorTranscript`, `conversationId`).
4
+ *
5
+ * `data` is an open bag, so a value of the wrong shape is possible (a host bug, a stale caller). A malformed
6
+ * value is ignored and logged rather than thrown on, so one bad optional extra cannot fail a call.
7
+ *
8
+ * @module @memberjunction/ai-agents
9
+ * @author MemberJunction.com
10
+ */
11
+ import type { RealtimeToolDefinition } from '@memberjunction/ai';
12
+ /**
13
+ * Reads `data.realtimeHostTools`. Absent yields `undefined`; a value that is not an array of well-formed tool
14
+ * definitions is ignored (logged) as a whole, so the model never sees a half-valid tool set.
15
+ */
16
+ export declare function ReadHostTools(value: unknown): RealtimeToolDefinition[] | undefined;
17
+ /**
18
+ * Reads a trimmed, non-empty string from the data bag. Absent or blank yields `undefined`; a non-string value is
19
+ * ignored and logged under `name`.
20
+ */
21
+ export declare function ReadTrimmedString(value: unknown, name: string): string | undefined;
22
+ //# sourceMappingURL=bridge-host-params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-host-params.d.ts","sourceRoot":"","sources":["../../src/realtime/bridge-host-params.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAkBjE;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,EAAE,GAAG,SAAS,CASlF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASlF"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @fileoverview Type guards for the host-supplied extras that ride `ExecuteAgentParams.data` into a bridged
3
+ * realtime session (`realtimeHostTools`, `realtimeHostFraming`, `realtimePriorTranscript`, `conversationId`).
4
+ *
5
+ * `data` is an open bag, so a value of the wrong shape is possible (a host bug, a stale caller). A malformed
6
+ * value is ignored and logged rather than thrown on, so one bad optional extra cannot fail a call.
7
+ *
8
+ * @module @memberjunction/ai-agents
9
+ * @author MemberJunction.com
10
+ */
11
+ import { LogError } from '@memberjunction/core';
12
+ /** Whether a value is a well-formed tool definition (a name, a description, and an object parameter schema). */
13
+ function isToolDefinition(value) {
14
+ if (typeof value !== 'object' || value === null) {
15
+ return false;
16
+ }
17
+ const candidate = value;
18
+ return (typeof candidate.Name === 'string' &&
19
+ candidate.Name.trim().length > 0 &&
20
+ typeof candidate.Description === 'string' &&
21
+ typeof candidate.ParametersSchema === 'object' &&
22
+ candidate.ParametersSchema !== null &&
23
+ !Array.isArray(candidate.ParametersSchema));
24
+ }
25
+ /**
26
+ * Reads `data.realtimeHostTools`. Absent yields `undefined`; a value that is not an array of well-formed tool
27
+ * definitions is ignored (logged) as a whole, so the model never sees a half-valid tool set.
28
+ */
29
+ export function ReadHostTools(value) {
30
+ if (value === undefined || value === null) {
31
+ return undefined;
32
+ }
33
+ if (!Array.isArray(value) || !value.every(isToolDefinition)) {
34
+ LogError('[BridgeRealtime] ignoring malformed realtimeHostTools (expected an array of { Name, Description, ParametersSchema }).');
35
+ return undefined;
36
+ }
37
+ return value.length > 0 ? value : undefined;
38
+ }
39
+ /**
40
+ * Reads a trimmed, non-empty string from the data bag. Absent or blank yields `undefined`; a non-string value is
41
+ * ignored and logged under `name`.
42
+ */
43
+ export function ReadTrimmedString(value, name) {
44
+ if (value === undefined || value === null) {
45
+ return undefined;
46
+ }
47
+ if (typeof value !== 'string') {
48
+ LogError(`[BridgeRealtime] ignoring ${name}: expected a string, got ${typeof value}.`);
49
+ return undefined;
50
+ }
51
+ return value.trim() || undefined;
52
+ }
53
+ //# sourceMappingURL=bridge-host-params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-host-params.js","sourceRoot":"","sources":["../../src/realtime/bridge-host-params.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,gHAAgH;AAChH,SAAS,gBAAgB,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,SAAS,GAAG,KAA+D,CAAC;IAClF,OAAO,CACH,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ;QAClC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAChC,OAAO,SAAS,CAAC,WAAW,KAAK,QAAQ;QACzC,OAAO,SAAS,CAAC,gBAAgB,KAAK,QAAQ;QAC9C,SAAS,CAAC,gBAAgB,KAAK,IAAI;QACnC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAC7C,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IACxC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC1D,QAAQ,CAAC,uHAAuH,CAAC,CAAC;QAClI,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAc,EAAE,IAAY;IAC1D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,QAAQ,CAAC,6BAA6B,IAAI,4BAA4B,OAAO,KAAK,GAAG,CAAC,CAAC;QACvF,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;AACrC,CAAC"}
@@ -16,8 +16,9 @@
16
16
  * @module @memberjunction/ai-agents
17
17
  * @author MemberJunction.com
18
18
  */
19
- import { IRealtimeSession, RealtimeVoiceOption, AIAPIKeyResolver } from '@memberjunction/ai';
19
+ import { IRealtimeSession, ChatMessage, RealtimeVoiceOption, RealtimeToolDefinition, AIAPIKeyResolver } from '@memberjunction/ai';
20
20
  import { IMetadataProvider, UserInfo } from '@memberjunction/core';
21
+ import { RealtimeHostToolsResolver } from './realtime-client-session-service.js';
21
22
  /**
22
23
  * The context a bridge passes to {@link CreateBridgeRealtimeSession}. Structurally compatible with the
23
24
  * LiveKit coordinator's `RealtimeSessionStartContext` (and any future bridge's equivalent) so this factory
@@ -64,6 +65,40 @@ export interface BridgeRealtimeSessionContext {
64
65
  MeetingMode?: boolean;
65
66
  /** The names the agent answers to (display name + aliases) — phrasing for the meeting prompt only. */
66
67
  SelfNames?: string[];
68
+ /**
69
+ * Tools the host declares and executes itself (a phone call's `transfer_call` / `send_dtmf` / `end_call`).
70
+ * Added to the model's tool set; executed through the runtime's local tool handler
71
+ * (see `GetBridgeRealtimeRuntime`).
72
+ */
73
+ HostTools?: RealtimeToolDefinition[];
74
+ /**
75
+ * Optional callback that allows the host to resolve host tools dynamically based on
76
+ * the model, vendor, and driver actually resolved for the session, before session opening.
77
+ */
78
+ ResolveHostTools?: RealtimeHostToolsResolver;
79
+ /** Host-authored instructions appended to the system prompt (e.g. the phone-call and caller framing). */
80
+ HostFraming?: string;
81
+ /**
82
+ * Role-tagged transcript lines (`User: …` / `Assistant: …`) of the conversation so far, framed into the
83
+ * prompt as "earlier in this conversation". Set when a lost model session is re-opened mid-call so the new
84
+ * session remembers what was said.
85
+ */
86
+ PriorTranscript?: string;
87
+ /** Earlier turns to seed the model's context. Defaults to none (a fresh call has no history). */
88
+ ConversationMessages?: ChatMessage[];
89
+ /** The `MJ: Conversations` row the session writes to — stamped on the co-agent observability run. */
90
+ ConversationID?: string;
91
+ /**
92
+ * `'room'` when the bridge's bot can publish the agent's avatar into the room (the LiveKit coordinator asks its native
93
+ * module first). Flows to the session's avatar request, so the driver may render it. Absent: audio only.
94
+ */
95
+ AvatarDelivery?: 'room';
96
+ /**
97
+ * `true` when the session is a phone call (a carrier call, or a SIP call in a LiveKit room). Flows to
98
+ * `params.data.realtimePhoneCall`: the session then asks the driver for no avatar (the caller sees no video) and
99
+ * reports `phone` as its avatar status.
100
+ */
101
+ PhoneCall?: boolean;
67
102
  }
68
103
  /**
69
104
  * Opens a raw {@link IRealtimeSession} for the agent named in `ctx`. Bind this onto a bridge's
@@ -88,20 +123,45 @@ export declare function CreateBridgeRealtimeSession(ctx: BridgeRealtimeSessionCo
88
123
  * @param provider The metadata provider (required — skipped without it).
89
124
  */
90
125
  export declare function FinalizeBridgeCoAgentRuns(agentSessionID: string, success: boolean, contextUser?: UserInfo, provider?: IMetadataProvider): Promise<void>;
126
+ /**
127
+ * A voice the dev model/voice picker offers: one per persona, or one per voice only the driver declares. Two personas can
128
+ * share a voice `ID` (a voice, and the same voice with a face), so {@link PersonaID} tells them apart. A persona voice also
129
+ * carries the avatar that comes with it and the persona's preview image; a voice only the driver declares carries none of
130
+ * the three.
131
+ */
132
+ export interface RealtimeModelVoiceOption extends RealtimeVoiceOption {
133
+ /** The persona this voice belongs to (`MJ: AI Personas.ID`). Absent for a voice only the driver declares. */
134
+ PersonaID?: string;
135
+ /**
136
+ * The avatar that comes with this voice: the `APIName` of the persona's preset Video binding on the model's vendor,
137
+ * which is what `realtime.video.avatarId` takes. Absent when the persona has no such binding there, or only a custom
138
+ * one (custom avatars are not supported), and on a model that shows no avatar there (its Video/Output row turns
139
+ * video off, or its driver renders none on that vendor's endpoint).
140
+ */
141
+ AvatarID?: string;
142
+ /** The persona's preview image (`MJ: AI Personas.PreviewImageURL`), when it has one. */
143
+ PreviewImageURL?: string;
144
+ }
91
145
  /** An active Realtime model paired with the voices its driver supports — for the dev model/voice picker. */
92
146
  export interface RealtimeModelVoices {
93
147
  /** The `MJ: AI Models` row id. */
94
148
  ModelID: string;
95
149
  /** The model's display name. */
96
150
  ModelName: string;
97
- /** The provider-native voices the model's driver declares (empty when it declares none). */
98
- Voices: RealtimeVoiceOption[];
151
+ /** The model's persona voices on its vendor, then the driver's other voices (empty when there are none). */
152
+ Voices: RealtimeModelVoiceOption[];
99
153
  }
100
154
  /**
101
155
  * Enumerates the active Realtime models with each driver's supported voices — the source for the dev
102
156
  * model/voice picker. Only models with an Active vendor + resolvable API key + ClassFactory driver are
103
157
  * returned (a model you can't actually run isn't worth offering). Voices come from the driver
104
158
  * ({@link BaseRealtimeModel.SupportedVoices}) — the near-term, driver-owned source of truth.
159
+ * A persona voice whose persona also has a preset Video binding on the same vendor names that avatar
160
+ * ({@link RealtimeModelVoiceOption.AvatarID}), when the model shows avatars on that vendor
161
+ * ({@link RealtimeModelShowsAvatar}: its Video/Output row allows video or it has none, and the driver
162
+ * renders avatars on its endpoint); driver voices never do. So the picker marks a voice "Comes with an
163
+ * avatar" only where a call can show one. A persona with a face doesn't stand in for its plain voice, so
164
+ * the plain voice is listed too.
105
165
  *
106
166
  * @param contextUser The user the engine config runs as (server-side).
107
167
  * @param provider The request-scoped metadata provider (multi-provider safe).
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-realtime-session-factory.d.ts","sourceRoot":"","sources":["../../src/realtime/bridge-realtime-session-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,gBAAgB,EAAkC,mBAAmB,EAAE,gBAAgB,EAAwB,MAAM,oBAAoB,CAAC;AACnJ,OAAO,EAAE,iBAAiB,EAAY,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAQ7E;;;;GAIG;AACH,MAAM,WAAW,4BAA4B;IACzC,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oGAAoG;IACpG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB,oGAAoG;IACpG,gBAAgB,CAAC,EAAE,iBAAiB,CAAC;IACrC;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sGAAsG;IACtG,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,CAAC,GAAG,EAAE,4BAA4B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA8E9G;AA8BD;;;;;;;;;;;GAWG;AACH,wBAAsB,yBAAyB,CAC3C,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,OAAO,EAChB,WAAW,CAAC,EAAE,QAAQ,EACtB,QAAQ,CAAC,EAAE,iBAAiB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,4GAA4G;AAC5G,MAAM,WAAW,mBAAmB;IAChC,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,4FAA4F;IAC5F,MAAM,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,CACxC,WAAW,CAAC,EAAE,QAAQ,EACtB,QAAQ,CAAC,EAAE,iBAAiB,EAC5B,aAAa,GAAE,gBAAyC,GACzD,OAAO,CAAC,mBAAmB,EAAE,CAAC,CA8ChC"}
1
+ {"version":3,"file":"bridge-realtime-session-factory.d.ts","sourceRoot":"","sources":["../../src/realtime/bridge-realtime-session-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAqB,mBAAmB,EAAE,sBAAsB,EAAE,gBAAgB,EAAwB,MAAM,oBAAoB,CAAC;AAC3K,OAAO,EAAE,iBAAiB,EAAY,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAM7E,OAAO,EAAgC,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAI5G;;;;GAIG;AACH,MAAM,WAAW,4BAA4B;IACzC,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oGAAoG;IACpG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB,oGAAoG;IACpG,gBAAgB,CAAC,EAAE,iBAAiB,CAAC;IACrC;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sGAAsG;IACtG,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB;;;;OAIG;IACH,SAAS,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACrC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,yBAAyB,CAAC;IAC7C,yGAAyG;IACzG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iGAAiG;IACjG,oBAAoB,CAAC,EAAE,WAAW,EAAE,CAAC;IACrC,qGAAqG;IACrG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,CAAC,GAAG,EAAE,4BAA4B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+E9G;AAmDD;;;;;;;;;;;GAWG;AACH,wBAAsB,yBAAyB,CAC3C,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,OAAO,EAChB,WAAW,CAAC,EAAE,QAAQ,EACtB,QAAQ,CAAC,EAAE,iBAAiB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;;;;GAKG;AACH,MAAM,WAAW,wBAAyB,SAAQ,mBAAmB;IACjE,6GAA6G;IAC7G,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wFAAwF;IACxF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,4GAA4G;AAC5G,MAAM,WAAW,mBAAmB;IAChC,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,4GAA4G;IAC5G,MAAM,EAAE,wBAAwB,EAAE,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,sBAAsB,CACxC,WAAW,CAAC,EAAE,QAAQ,EACtB,QAAQ,CAAC,EAAE,iBAAiB,EAC5B,aAAa,GAAE,gBAAyC,GACzD,OAAO,CAAC,mBAAmB,EAAE,CAAC,CA+BhC"}
@@ -18,11 +18,12 @@
18
18
  */
19
19
  import { BaseRealtimeModel, MakeAIAPIKeyResolver } from '@memberjunction/ai';
20
20
  import { Metadata } from '@memberjunction/core';
21
- import { MJGlobal, UUIDsEqual } from '@memberjunction/global';
21
+ import { MJGlobal, UUIDsEqual, IndexByUUID } from '@memberjunction/global';
22
22
  import { AIEngine } from '@memberjunction/aiengine';
23
23
  import { BaseAgent } from '../base-agent.js';
24
24
  import { RealtimeClientSessionService } from './realtime-client-session-service.js';
25
25
  import { SelectRealtimeVendorForModel } from './realtime-vendor-resolution.js';
26
+ import { RealtimeModelShowsAvatar } from './realtime-video-output-gate.js';
26
27
  /**
27
28
  * Opens a raw {@link IRealtimeSession} for the agent named in `ctx`. Bind this onto a bridge's
28
29
  * session-factory seam (e.g. `LiveKitAgentRoomCoordinator.Instance.SetSessionFactory(CreateBridgeRealtimeSession)`).
@@ -97,8 +98,9 @@ export async function CreateBridgeRealtimeSession(ctx) {
97
98
  agent,
98
99
  contextUser: ctx.ContextUser,
99
100
  provider,
100
- // A fresh bridge session starts with no prior turns; memory context degrades gracefully to empty.
101
- conversationMessages: [],
101
+ // A fresh bridge session starts with no prior turns; memory context degrades gracefully to empty. A
102
+ // re-opened session (model-drop recovery) is given what was said so far via PriorTranscript instead.
103
+ conversationMessages: ctx.ConversationMessages ?? [],
102
104
  // Realtime extras ride params.data: the TARGET agent the co-agent voices via `invoke-target-agent`
103
105
  // (without it the co-agent stays idle), plus optional per-session dev overrides for the model/voice
104
106
  // so two agents in the same room can sound distinct. Omitted keys are simply absent.
@@ -127,9 +129,30 @@ function buildRealtimeData(ctx) {
127
129
  if (ctx.MeetingMode === true) {
128
130
  data.realtimeMeetingMode = true;
129
131
  }
132
+ if (ctx.HostTools && ctx.HostTools.length > 0) {
133
+ data.realtimeHostTools = ctx.HostTools;
134
+ }
135
+ if (ctx.ResolveHostTools) {
136
+ data.resolveHostTools = ctx.ResolveHostTools;
137
+ }
138
+ if (ctx.HostFraming && ctx.HostFraming.trim().length > 0) {
139
+ data.realtimeHostFraming = ctx.HostFraming.trim();
140
+ }
141
+ if (ctx.PriorTranscript && ctx.PriorTranscript.trim().length > 0) {
142
+ data.realtimePriorTranscript = ctx.PriorTranscript.trim();
143
+ }
144
+ if (ctx.ConversationID && ctx.ConversationID.trim().length > 0) {
145
+ data.conversationId = ctx.ConversationID.trim();
146
+ }
130
147
  if (ctx.SelfNames && ctx.SelfNames.length > 0) {
131
148
  data.realtimeSelfNames = ctx.SelfNames;
132
149
  }
150
+ if (ctx.AvatarDelivery === 'room') {
151
+ data.realtimeAvatarDelivery = 'room';
152
+ }
153
+ if (ctx.PhoneCall === true) {
154
+ data.realtimePhoneCall = true;
155
+ }
133
156
  return Object.keys(data).length > 0 ? data : undefined;
134
157
  }
135
158
  /**
@@ -155,6 +178,12 @@ export async function FinalizeBridgeCoAgentRuns(agentSessionID, success, context
155
178
  * model/voice picker. Only models with an Active vendor + resolvable API key + ClassFactory driver are
156
179
  * returned (a model you can't actually run isn't worth offering). Voices come from the driver
157
180
  * ({@link BaseRealtimeModel.SupportedVoices}) — the near-term, driver-owned source of truth.
181
+ * A persona voice whose persona also has a preset Video binding on the same vendor names that avatar
182
+ * ({@link RealtimeModelVoiceOption.AvatarID}), when the model shows avatars on that vendor
183
+ * ({@link RealtimeModelShowsAvatar}: its Video/Output row allows video or it has none, and the driver
184
+ * renders avatars on its endpoint); driver voices never do. So the picker marks a voice "Comes with an
185
+ * avatar" only where a call can show one. A persona with a face doesn't stand in for its plain voice, so
186
+ * the plain voice is listed too.
158
187
  *
159
188
  * @param contextUser The user the engine config runs as (server-side).
160
189
  * @param provider The request-scoped metadata provider (multi-provider safe).
@@ -176,30 +205,62 @@ export async function GetRealtimeModelVoices(contextUser, provider, resolveAPIKe
176
205
  if (!driverClass) {
177
206
  continue; // no active vendor with a resolvable key — not runnable, so omit
178
207
  }
179
- // 1. Consult metadata first (Personas & PersonaVendors carry curated names/descriptions)
180
- const modelPersonas = AIEngine.Instance.GetModelPersonas(model.ID, 'Audio', selection.VendorID);
181
- const voices = modelPersonas.map((rp) => ({
182
- ID: rp.PersonaVendor.APIName,
183
- Name: rp.Persona.Name,
184
- }));
185
- // Collect explicitly excluded voice IDs (IsSupported === false) for this model and vendor
186
- const excludedVoiceApiNames = new Set(AIEngine.Instance.GetModelPersonaExclusions(model.ID, 'Audio', selection.VendorID)
187
- .map((name) => name.toLowerCase()));
188
- // 2. Union with driver SupportedVoices: append any driver voices not already present or explicitly excluded
189
208
  const instance = MJGlobal.Instance.ClassFactory.CreateInstance(BaseRealtimeModel, driverClass, resolveAPIKey(driverClass));
190
- for (const dv of instance?.SupportedVoices ?? []) {
191
- const dvIdLower = dv.ID.toLowerCase();
192
- if (excludedVoiceApiNames.has(dvIdLower)) {
193
- continue;
194
- }
195
- if (!voices.some((v) => v.ID.toLowerCase() === dvIdLower)) {
196
- voices.push(dv);
197
- }
198
- }
209
+ // 1. Consult metadata first (Personas & PersonaVendors carry curated names/descriptions, and avatars where the
210
+ // model shows them on this vendor)
211
+ const showsAvatar = instance ? RealtimeModelShowsAvatar({ ModelID: model.ID, APIName: selection.APIName, Model: instance }, AIEngine.Instance) : false;
212
+ const voices = personaVoiceOptions(model.ID, selection.VendorID, showsAvatar);
213
+ // 2. Union with driver SupportedVoices: append the driver voices no persona offers plainly, unless excluded
214
+ appendDriverVoices(voices, instance?.SupportedVoices ?? [], model.ID, selection.VendorID);
199
215
  out.push({ ModelID: model.ID, ModelName: model.Name ?? '', Voices: voices });
200
216
  }
201
217
  return out;
202
218
  }
219
+ /**
220
+ * Appends the driver's voices that no persona already offers as a plain voice (without a face), skipping the ones the
221
+ * model explicitly excludes (`IsSupported === false`). A persona with a face doesn't stand in for its plain voice, so the
222
+ * voice stays pickable without the face. Driver voices have no persona: no avatar, no image.
223
+ */
224
+ function appendDriverVoices(voices, driverVoices, modelID, vendorID) {
225
+ const excluded = new Set(AIEngine.Instance.GetModelPersonaExclusions(modelID, 'Audio', vendorID).map((name) => name.toLowerCase()));
226
+ for (const dv of driverVoices) {
227
+ const id = dv.ID.toLowerCase();
228
+ if (!excluded.has(id) && !voices.some((v) => !v.AvatarID && v.ID.toLowerCase() === id)) {
229
+ voices.push({ ID: dv.ID, Name: dv.Name });
230
+ }
231
+ }
232
+ }
233
+ /**
234
+ * The model's persona voices on a vendor, one per persona, in persona order. On a model that shows avatars there, a
235
+ * persona whose preset Video binding on the same vendor the model supports carries that binding's `APIName` as its avatar
236
+ * (the face the session asks for when the voice is picked); a binding on any other vendor doesn't count, nor does a custom
237
+ * one, and with no vendor there is nothing to match. On a model that shows none, no voice comes with an avatar.
238
+ *
239
+ * @param showsAvatar Whether the model shows avatars on this vendor ({@link RealtimeModelShowsAvatar}).
240
+ */
241
+ function personaVoiceOptions(modelID, vendorID, showsAvatar) {
242
+ const faces = vendorID && showsAvatar ? AIEngine.Instance.GetModelPersonas(modelID, 'Video', vendorID).filter(isPresetFace) : [];
243
+ // First face per persona wins, as faces.find() would.
244
+ const facesByPersona = IndexByUUID(faces, (f) => f.Persona.ID);
245
+ return AIEngine.Instance.GetModelPersonas(modelID, 'Audio', vendorID).map((voice) => {
246
+ const face = facesByPersona.Get(voice.Persona.ID);
247
+ const image = voice.Persona.PreviewImageURL?.trim();
248
+ return {
249
+ ID: voice.PersonaVendor.APIName,
250
+ Name: voice.Persona.Name,
251
+ PersonaID: voice.Persona.ID,
252
+ ...(face ? { AvatarID: face.PersonaVendor.APIName.trim() } : {}),
253
+ ...(image ? { PreviewImageURL: image } : {}),
254
+ };
255
+ });
256
+ }
257
+ /**
258
+ * Whether a Video binding is a face a picked voice can bring: a preset (`Avatar.Kind` absent or `'preset'`). Custom avatars
259
+ * are not supported, so a session asking for one would stay audio only.
260
+ */
261
+ function isPresetFace(face) {
262
+ return (face.PersonaVendor.VendorSettingsObject?.Avatar?.Kind ?? 'preset') !== 'custom';
263
+ }
203
264
  /** Resolves the agent entity from the engine cache by id (preferred), then by case-insensitive name. */
204
265
  function resolveAgentEntity(ctx) {
205
266
  const agents = AIEngine.Instance.Agents;
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-realtime-session-factory.js","sourceRoot":"","sources":["../../src/realtime/bridge-realtime-session-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAiC,iBAAiB,EAAyC,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACnJ,OAAO,EAAqB,QAAQ,EAAY,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAiB,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAkD5E;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,GAAiC;IAC/E,MAAM,QAAQ,GAAG,GAAG,CAAC,gBAAgB,IAAI,QAAQ,CAAC,QAAQ,CAAC;IAC3D,MAAM,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAEjE,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACX,4DAA4D,GAAG,CAAC,OAAO,IAAI,EAAE,MAAM;YAC/E,cAAc,GAAG,CAAC,SAAS,IAAI,EAAE,0DAA0D,CAClG,CAAC;IACN,CAAC;IAED,iGAAiG;IACjG,EAAE;IACF,8DAA8D;IAC9D,EAAE;IACF,8FAA8F;IAC9F,gGAAgG;IAChG,+FAA+F;IAC/F,4EAA4E;IAC5E,EAAE;IACF,gGAAgG;IAChG,0FAA0F;IAC1F,6FAA6F;IAC7F,8FAA8F;IAC9F,4EAA4E;IAC5E,wFAAwF;IACxF,uDAAuD;IACvD,EAAE;IACF,4EAA4E;IAC5E,wFAAwF;IACxF,qFAAqF;IACrF,mFAAmF;IACnF,EAAE;IACF,8FAA8F;IAC9F,gGAAgG;IAChG,+FAA+F;IAC/F,yBAAyB;IACzB,EAAE;IACF,+FAA+F;IAC/F,iGAAiG;IACjG,qCAAqC;IACrC,oFAAoF;IACpF,2FAA2F;IAC3F,mFAAmF;IACnF,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAC3D,IAAI,QAA0B,CAAC;IAC/B,IAAI,WAAW,EAAE,CAAC;QACd,8FAA8F;QAC9F,uEAAuE;QACvE,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,iBAAiB,CAAY,SAAS,EAAE,WAAW,CAAC,CAAC;QACvG,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACX,wEAAwE,WAAW,IAAI;gBACnF,WAAW,KAAK,CAAC,IAAI,iEAAiE;gBACtF,uDAAuD,CAC9D,CAAC;QACN,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,gFAAgF;QAChF,6EAA6E;QAC7E,6FAA6F;QAC7F,qDAAqD;QACrD,QAAQ,GAAG,IAAI,SAAS,EAAE,CAAC;IAC/B,CAAC;IAED,OAAO,QAAQ,CAAC,0BAA0B,CAAC;QACvC,KAAK;QACL,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,QAAQ;QACR,kGAAkG;QAClG,oBAAoB,EAAE,EAAmB;QACzC,mGAAmG;QACnG,oGAAoG;QACpG,qFAAqF;QACrF,IAAI,EAAE,iBAAiB,CAAC,GAAG,CAAC;KAC/B,CAAC,CAAC;AACP,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,GAAiC;IACxD,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;QACpB,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;IAC3C,CAAC;IACD,IAAI,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7D,4FAA4F;QAC5F,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IACpD,CAAC;IACD,IAAI,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/D,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;IACtD,CAAC;IACD,IAAI,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IACpC,CAAC;IACD,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC,SAAS,CAAC;IAC3C,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC3C,cAAsB,EACtB,OAAgB,EAChB,WAAsB,EACtB,QAA4B;IAE5B,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,OAAO,CAAC,uFAAuF;IACnG,CAAC;IACD,MAAM,IAAI,4BAA4B,EAAE,CAAC,4BAA4B,CAAC,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AAC1H,CAAC;AAYD;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CACxC,WAAsB,EACtB,QAA4B,EAC5B,gBAAkC,oBAAoB,EAAE;IAExD,MAAM,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,CAAC,CAA4B,EAAW,EAAE,CACzD,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC;IACnE,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM;SAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;SACtD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;IAE7D,MAAM,GAAG,GAA0B,EAAE,CAAC;IACtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,4BAA4B,CAAC,KAAK,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QACxE,MAAM,WAAW,GAAG,SAAS,EAAE,WAAW,IAAI,IAAI,CAAC;QACnD,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,SAAS,CAAC,iEAAiE;QAC/E,CAAC;QAED,yFAAyF;QACzF,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChG,MAAM,MAAM,GAA0B,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC7D,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO;YAC5B,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI;SACxB,CAAC,CAAC,CAAC;QAEJ,0FAA0F;QAC1F,MAAM,qBAAqB,GAAG,IAAI,GAAG,CACjC,QAAQ,CAAC,QAAQ,CAAC,yBAAyB,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC;aAC7E,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CACzC,CAAC;QAEF,4GAA4G;QAC5G,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAC1D,iBAAiB,EAAE,WAAW,EAAE,aAAa,CAAC,WAAW,CAAC,CAC7D,CAAC;QACF,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,eAAe,IAAI,EAAE,EAAE,CAAC;YAC/C,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;YACtC,IAAI,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACvC,SAAS;YACb,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC;gBACxD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpB,CAAC;QACL,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,wGAAwG;AACxG,SAAS,kBAAkB,CAAC,GAAiC;IACzD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,OAAiB,CAAC,CAAC,CAAC;QACzE,IAAI,IAAI,EAAE,CAAC;YACP,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IACD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAClD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"bridge-realtime-session-factory.js","sourceRoot":"","sources":["../../src/realtime/bridge-realtime-session-factory.ts"],"names":[],"mappings":"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"}