@memberjunction/ai-agents 6.2.0-edge.3 → 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 (104) hide show
  1. package/README.md +6 -0
  2. package/dist/AgentRunner.d.ts +49 -2
  3. package/dist/AgentRunner.d.ts.map +1 -1
  4. package/dist/AgentRunner.js +114 -21
  5. package/dist/AgentRunner.js.map +1 -1
  6. package/dist/ConversationCompactionManager.d.ts +2 -0
  7. package/dist/ConversationCompactionManager.d.ts.map +1 -1
  8. package/dist/ConversationCompactionManager.js +2 -2
  9. package/dist/ConversationCompactionManager.js.map +1 -1
  10. package/dist/ConversationToolManager.d.ts +13 -2
  11. package/dist/ConversationToolManager.d.ts.map +1 -1
  12. package/dist/ConversationToolManager.js +19 -3
  13. package/dist/ConversationToolManager.js.map +1 -1
  14. package/dist/KnowledgeAgent.d.ts.map +1 -1
  15. package/dist/KnowledgeAgent.js +6 -1
  16. package/dist/KnowledgeAgent.js.map +1 -1
  17. package/dist/MJAIAgentRequestEntityServer.d.ts +6 -0
  18. package/dist/MJAIAgentRequestEntityServer.d.ts.map +1 -1
  19. package/dist/MJAIAgentRequestEntityServer.js +26 -1
  20. package/dist/MJAIAgentRequestEntityServer.js.map +1 -1
  21. package/dist/agent-run-watchdog.d.ts +65 -5
  22. package/dist/agent-run-watchdog.d.ts.map +1 -1
  23. package/dist/agent-run-watchdog.js +143 -28
  24. package/dist/agent-run-watchdog.js.map +1 -1
  25. package/dist/agent-types/loop-agent-prompt-params.d.ts +7 -0
  26. package/dist/agent-types/loop-agent-prompt-params.d.ts.map +1 -1
  27. package/dist/agent-types/loop-agent-prompt-params.js +1 -0
  28. package/dist/agent-types/loop-agent-prompt-params.js.map +1 -1
  29. package/dist/artifact-tools/SearchResultSetToolLibrary.js +4 -4
  30. package/dist/artifact-tools/SearchResultSetToolLibrary.js.map +1 -1
  31. package/dist/base-agent.d.ts +275 -18
  32. package/dist/base-agent.d.ts.map +1 -1
  33. package/dist/base-agent.js +761 -216
  34. package/dist/base-agent.js.map +1 -1
  35. package/dist/client-tool-results.d.ts +45 -0
  36. package/dist/client-tool-results.d.ts.map +1 -0
  37. package/dist/client-tool-results.js +94 -0
  38. package/dist/client-tool-results.js.map +1 -0
  39. package/dist/index.d.ts +5 -0
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +5 -0
  42. package/dist/index.js.map +1 -1
  43. package/dist/prior-turn-tool-result-cache.d.ts +31 -12
  44. package/dist/prior-turn-tool-result-cache.d.ts.map +1 -1
  45. package/dist/prior-turn-tool-result-cache.js +59 -16
  46. package/dist/prior-turn-tool-result-cache.js.map +1 -1
  47. package/dist/realtime/bridge-realtime-session-factory.d.ts +44 -2
  48. package/dist/realtime/bridge-realtime-session-factory.d.ts.map +1 -1
  49. package/dist/realtime/bridge-realtime-session-factory.js +68 -20
  50. package/dist/realtime/bridge-realtime-session-factory.js.map +1 -1
  51. package/dist/realtime/bridge-realtime-usage-recorder.d.ts +81 -0
  52. package/dist/realtime/bridge-realtime-usage-recorder.d.ts.map +1 -0
  53. package/dist/realtime/bridge-realtime-usage-recorder.js +194 -0
  54. package/dist/realtime/bridge-realtime-usage-recorder.js.map +1 -0
  55. package/dist/realtime/client-only-channel-server.d.ts +83 -0
  56. package/dist/realtime/client-only-channel-server.d.ts.map +1 -0
  57. package/dist/realtime/client-only-channel-server.js +107 -0
  58. package/dist/realtime/client-only-channel-server.js.map +1 -0
  59. package/dist/realtime/identity-verification-channel-server.d.ts +50 -0
  60. package/dist/realtime/identity-verification-channel-server.d.ts.map +1 -0
  61. package/dist/realtime/identity-verification-channel-server.js +66 -0
  62. package/dist/realtime/identity-verification-channel-server.js.map +1 -0
  63. package/dist/realtime/interactive-component-channel-server.d.ts +39 -0
  64. package/dist/realtime/interactive-component-channel-server.d.ts.map +1 -0
  65. package/dist/realtime/interactive-component-channel-server.js +55 -0
  66. package/dist/realtime/interactive-component-channel-server.js.map +1 -0
  67. package/dist/realtime/realtime-avatar-resolution.d.ts +194 -0
  68. package/dist/realtime/realtime-avatar-resolution.d.ts.map +1 -0
  69. package/dist/realtime/realtime-avatar-resolution.js +208 -0
  70. package/dist/realtime/realtime-avatar-resolution.js.map +1 -0
  71. package/dist/realtime/realtime-channel-policy.d.ts +81 -0
  72. package/dist/realtime/realtime-channel-policy.d.ts.map +1 -0
  73. package/dist/realtime/realtime-channel-policy.js +91 -0
  74. package/dist/realtime/realtime-channel-policy.js.map +1 -0
  75. package/dist/realtime/realtime-channel-server-host.d.ts +14 -0
  76. package/dist/realtime/realtime-channel-server-host.d.ts.map +1 -1
  77. package/dist/realtime/realtime-channel-server-host.js +35 -0
  78. package/dist/realtime/realtime-channel-server-host.js.map +1 -1
  79. package/dist/realtime/realtime-client-session-service.d.ts +430 -30
  80. package/dist/realtime/realtime-client-session-service.d.ts.map +1 -1
  81. package/dist/realtime/realtime-client-session-service.js +766 -111
  82. package/dist/realtime/realtime-client-session-service.js.map +1 -1
  83. package/dist/realtime/realtime-coagent-config.d.ts +94 -15
  84. package/dist/realtime/realtime-coagent-config.d.ts.map +1 -1
  85. package/dist/realtime/realtime-coagent-config.js +109 -4
  86. package/dist/realtime/realtime-coagent-config.js.map +1 -1
  87. package/dist/realtime/realtime-recording-store.d.ts +136 -16
  88. package/dist/realtime/realtime-recording-store.d.ts.map +1 -1
  89. package/dist/realtime/realtime-recording-store.js +505 -39
  90. package/dist/realtime/realtime-recording-store.js.map +1 -1
  91. package/dist/realtime/realtime-session-runner.js +4 -4
  92. package/dist/realtime/realtime-session-runner.js.map +1 -1
  93. package/dist/realtime/realtime-vendor-resolution.d.ts +9 -0
  94. package/dist/realtime/realtime-vendor-resolution.d.ts.map +1 -1
  95. package/dist/realtime/realtime-vendor-resolution.js +16 -5
  96. package/dist/realtime/realtime-vendor-resolution.js.map +1 -1
  97. package/dist/realtime/realtime-video-output-gate.d.ts +83 -0
  98. package/dist/realtime/realtime-video-output-gate.d.ts.map +1 -0
  99. package/dist/realtime/realtime-video-output-gate.js +79 -0
  100. package/dist/realtime/realtime-video-output-gate.js.map +1 -0
  101. package/dist/tool-result-format.d.ts +14 -0
  102. package/dist/tool-result-format.d.ts.map +1 -1
  103. package/dist/tool-result-format.js.map +1 -1
  104. package/package.json +19 -19
@@ -0,0 +1,107 @@
1
+ /**
2
+ * @fileoverview A generic server half for channels that run entirely in the browser.
3
+ *
4
+ * `MJ: AI Agent Channels.ServerPluginClass` is `NOT NULL`: every channel in the registry names a server plugin, even a
5
+ * channel whose verbs, state and surface all live in the client. Without this class each such channel (an Open App's
6
+ * form channel, a game, a component host) would hand-write the same empty plugin. A client-only channel instead
7
+ * points its registry row at this one:
8
+ *
9
+ * ```json
10
+ * { "fields": { "Name": "YourChannel", "ServerPluginClass": "ClientOnlyChannelServer", "ClientPluginClass": "YourChannel", ... } }
11
+ * ```
12
+ *
13
+ * The plugin takes its channel name from the registry row it was resolved for (see {@link ClientOnlyChannelServer.BindChannelName}),
14
+ * so one registered class serves any number of channels and `RealtimeChannelServerHost` never reports a name mismatch.
15
+ *
16
+ * ## What it does
17
+ *
18
+ * - Completes the registry pairing, so the channel is discoverable, scoped and killable like every other.
19
+ * - Contributes **no server tools** (`GetServerToolDefinitions()` is `[]`): every verb executes in the browser.
20
+ * - Does **not interpret or rewrite** a state-of-record save (`OnChannelStateSave` returns `null`, which the host reads as
21
+ * "keep what the client sent").
22
+ *
23
+ * ## What it does not do
24
+ *
25
+ * - **It does not decide scope.** Whether the channel is in a session at all is resolved by the channel-scoping cascade
26
+ * (`channels.include` / `exclude` / the registry's `IsActive` kill switch) BEFORE the host creates any plugin, so there is
27
+ * nothing left for a plugin to validate.
28
+ * - **It does not stop a save.** The host treats a plugin's `null` (and any thrown error) as "persist the original", so a
29
+ * server plugin cannot refuse state. Whether anything is persisted is decided by the CLIENT: a channel with no state of
30
+ * record (`SerializeState()` returns `null`, so it never requests a save) persists nothing. A channel that does request
31
+ * saves, such as an `AngularComponentChannel`, has its state stored on the session's channel row as submitted; if that state
32
+ * must not be stored, validate or redact it in a server plugin of your own (return a replacement) or do not save it.
33
+ * - **It does not authorize anything.** If the channel's verbs call server operations, those operations are the security
34
+ * boundary (they run on the session's own principal); a client-only channel adds no door of its own.
35
+ *
36
+ * Use a dedicated server plugin instead when the channel needs server tools, a server-side state normalizer, or
37
+ * session-lifecycle work.
38
+ *
39
+ * @module @memberjunction/ai-agents
40
+ * @author MemberJunction.com
41
+ */
42
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
43
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
44
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
45
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
46
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
47
+ };
48
+ import { BaseRealtimeChannelServer } from '@memberjunction/ai';
49
+ import { RegisterClass } from '@memberjunction/global';
50
+ /** The `ServerPluginClass` key a client-only channel's registry row uses. */
51
+ export const CLIENT_ONLY_CHANNEL_SERVER_KEY = 'ClientOnlyChannelServer';
52
+ /**
53
+ * Generic server half for a channel that runs entirely in the browser. One instance per realtime session (created by
54
+ * `RealtimeChannelServerHost` from the channel registry; never construct directly).
55
+ *
56
+ * Subclass it only to pin a fixed {@link ChannelName} under a key of your own (as the built-in Interactive Component and
57
+ * Identity Verification channels do, so their existing registry keys keep resolving); an Open App should simply use the
58
+ * registered `ClientOnlyChannelServer` key.
59
+ */
60
+ let ClientOnlyChannelServer = class ClientOnlyChannelServer extends BaseRealtimeChannelServer {
61
+ constructor() {
62
+ super(...arguments);
63
+ this.boundChannelName = null;
64
+ }
65
+ /**
66
+ * The channel this instance serves: the registry row's `Name`, once the host has bound it; `''` before that. A subclass
67
+ * that pins a fixed name overrides it.
68
+ */
69
+ get ChannelName() {
70
+ return this.boundChannelName ?? '';
71
+ }
72
+ /**
73
+ * Tells the plugin which registry row it was resolved for. Called by `RealtimeChannelServerHost` right after it creates
74
+ * the instance, so a single registered class can serve any client-only channel.
75
+ *
76
+ * @param channelName The registry row's `Name`.
77
+ */
78
+ BindChannelName(channelName) {
79
+ this.boundChannelName = channelName;
80
+ }
81
+ /** No server-executed tools: every verb runs in the browser. */
82
+ GetServerToolDefinitions() {
83
+ return [];
84
+ }
85
+ /**
86
+ * Does not interpret or rewrite a state save. `null` means "persist what the client submitted" (the host cannot refuse a
87
+ * save through a plugin; see the file comment).
88
+ *
89
+ * @returns `null`.
90
+ */
91
+ async OnChannelStateSave() {
92
+ return null;
93
+ }
94
+ };
95
+ ClientOnlyChannelServer = __decorate([
96
+ RegisterClass(BaseRealtimeChannelServer, CLIENT_ONLY_CHANNEL_SERVER_KEY)
97
+ ], ClientOnlyChannelServer);
98
+ export { ClientOnlyChannelServer };
99
+ /**
100
+ * Tree-shaking prevention for {@link ClientOnlyChannelServer}'s `@RegisterClass` registration. Called from a static code
101
+ * path in the server host (and, for the Interactive Component and Identity Verification plugins, from their own load
102
+ * functions) so the registration always executes.
103
+ */
104
+ export function LoadClientOnlyChannelServer() {
105
+ // no-op: the import + call create a static reference bundlers cannot eliminate
106
+ }
107
+ //# sourceMappingURL=client-only-channel-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-only-channel-server.js","sourceRoot":"","sources":["../../src/realtime/client-only-channel-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;;;;;;;AAEH,OAAO,EAAE,yBAAyB,EAA0B,MAAM,oBAAoB,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,8BAA8B,GAAG,yBAAyB,CAAC;AAExE;;;;;;;GAOG;AAEI,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,yBAAyB;IAA/D;;QACK,qBAAgB,GAAkB,IAAI,CAAC;IAkCnD,CAAC;IAhCG;;;OAGG;IACH,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACI,eAAe,CAAC,WAAmB;QACtC,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC;IACxC,CAAC;IAED,gEAAgE;IAChD,wBAAwB;QACpC,OAAO,EAAE,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACa,KAAK,CAAC,kBAAkB;QACpC,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ,CAAA;AAnCY,uBAAuB;IADnC,aAAa,CAAC,yBAAyB,EAAE,8BAA8B,CAAC;GAC5D,uBAAuB,CAmCnC;;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B;IACvC,+EAA+E;AACnF,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @fileoverview Server-side channel plugin for the **Identity Verification** channel — the generic,
3
+ * opt-in channel through which a realtime agent helps a person (often an anonymous widget guest) prove
4
+ * they control an email address without leaving the call.
5
+ *
6
+ * Paired with the browser's `IdentityVerificationChannel` client plugin through the seeded
7
+ * `MJ: AI Agent Channels` row (`Name: 'IdentityVerification'`,
8
+ * `ServerPluginClass: 'IdentityVerificationChannelServer'`, `ClientPluginClass: 'IdentityVerificationChannel'`).
9
+ *
10
+ * **Why the server half is intentionally thin, and validates nothing beyond scope.** The channel's verbs
11
+ * are executed in the browser, which then calls the verification operations
12
+ * (`RequestRealtimeSessionVerification`, `SubmitRealtimeSessionVerificationCode`) on the session's own
13
+ * principal. Those operations — not this plugin — are the security boundary: domain policy, rate limits,
14
+ * code hashing, expiry and deadline extension all live in the verification service, and the server never
15
+ * trusts anything the client says about verification state. A server tool here would only be a second,
16
+ * weaker door to the same room, and a state of record would put an email address (PII) onto the session's
17
+ * channel row for no benefit — the session's verification state is already stored, hashed where it must
18
+ * be, on the session itself. So the plugin completes the registry pairing (so the channel is discoverable
19
+ * and scoped like every other) and contributes no server tools and no persisted state.
20
+ *
21
+ * "Scope" is the only thing that applies server-side: whether the channel is in a session at all is decided
22
+ * by the channel-scoping cascade (`channels.config.IdentityVerification`, opt-in by default) and the
23
+ * registry's kill switch, both resolved before this plugin is ever created.
24
+ *
25
+ * @module @memberjunction/ai-agents
26
+ * @author MemberJunction.com
27
+ */
28
+ import { ClientOnlyChannelServer } from './client-only-channel-server.js';
29
+ /** The stable channel name, matching the seeded `MJ: AI Agent Channels` row. */
30
+ export declare const IDENTITY_VERIFICATION_CHANNEL_NAME = "IdentityVerification";
31
+ /**
32
+ * Server half of the Identity Verification channel. One instance per realtime session (created by
33
+ * `RealtimeChannelServerHost` from the channel registry; never construct directly).
34
+ *
35
+ * A {@link ClientOnlyChannelServer} that pins the channel's name under its own, already-seeded registry key
36
+ * (`IdentityVerificationChannelServer`), so the existing row keeps resolving. It contributes no server tools and does not
37
+ * rewrite saves. The channel's state is a name and an email in a form: the client plugin has no state of record (it never
38
+ * requests a save), so no email address reaches the channel row. A server plugin cannot refuse a save, so that guarantee
39
+ * rests on the client plugin continuing not to request one.
40
+ */
41
+ export declare class IdentityVerificationChannelServer extends ClientOnlyChannelServer {
42
+ /** Matches the seeded `MJ: AI Agent Channels` row's `Name`. */
43
+ get ChannelName(): string;
44
+ }
45
+ /**
46
+ * Tree-shaking prevention for {@link IdentityVerificationChannelServer}'s `@RegisterClass` registration.
47
+ * Called from a static code path in the server host so the registration always executes.
48
+ */
49
+ export declare function LoadIdentityVerificationChannelServer(): void;
50
+ //# sourceMappingURL=identity-verification-channel-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-verification-channel-server.d.ts","sourceRoot":"","sources":["../../src/realtime/identity-verification-channel-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,EAAE,uBAAuB,EAA+B,MAAM,8BAA8B,CAAC;AAEpG,gFAAgF;AAChF,eAAO,MAAM,kCAAkC,yBAAyB,CAAC;AAEzE;;;;;;;;;GASG;AACH,qBACa,iCAAkC,SAAQ,uBAAuB;IAC1E,+DAA+D;IAC/D,IAAoB,WAAW,IAAI,MAAM,CAExC;CACJ;AAED;;;GAGG;AACH,wBAAgB,qCAAqC,IAAI,IAAI,CAE5D"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * @fileoverview Server-side channel plugin for the **Identity Verification** channel — the generic,
3
+ * opt-in channel through which a realtime agent helps a person (often an anonymous widget guest) prove
4
+ * they control an email address without leaving the call.
5
+ *
6
+ * Paired with the browser's `IdentityVerificationChannel` client plugin through the seeded
7
+ * `MJ: AI Agent Channels` row (`Name: 'IdentityVerification'`,
8
+ * `ServerPluginClass: 'IdentityVerificationChannelServer'`, `ClientPluginClass: 'IdentityVerificationChannel'`).
9
+ *
10
+ * **Why the server half is intentionally thin, and validates nothing beyond scope.** The channel's verbs
11
+ * are executed in the browser, which then calls the verification operations
12
+ * (`RequestRealtimeSessionVerification`, `SubmitRealtimeSessionVerificationCode`) on the session's own
13
+ * principal. Those operations — not this plugin — are the security boundary: domain policy, rate limits,
14
+ * code hashing, expiry and deadline extension all live in the verification service, and the server never
15
+ * trusts anything the client says about verification state. A server tool here would only be a second,
16
+ * weaker door to the same room, and a state of record would put an email address (PII) onto the session's
17
+ * channel row for no benefit — the session's verification state is already stored, hashed where it must
18
+ * be, on the session itself. So the plugin completes the registry pairing (so the channel is discoverable
19
+ * and scoped like every other) and contributes no server tools and no persisted state.
20
+ *
21
+ * "Scope" is the only thing that applies server-side: whether the channel is in a session at all is decided
22
+ * by the channel-scoping cascade (`channels.config.IdentityVerification`, opt-in by default) and the
23
+ * registry's kill switch, both resolved before this plugin is ever created.
24
+ *
25
+ * @module @memberjunction/ai-agents
26
+ * @author MemberJunction.com
27
+ */
28
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
29
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
30
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
31
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
32
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
33
+ };
34
+ import { BaseRealtimeChannelServer } from '@memberjunction/ai';
35
+ import { RegisterClass } from '@memberjunction/global';
36
+ import { ClientOnlyChannelServer, LoadClientOnlyChannelServer } from './client-only-channel-server.js';
37
+ /** The stable channel name, matching the seeded `MJ: AI Agent Channels` row. */
38
+ export const IDENTITY_VERIFICATION_CHANNEL_NAME = 'IdentityVerification';
39
+ /**
40
+ * Server half of the Identity Verification channel. One instance per realtime session (created by
41
+ * `RealtimeChannelServerHost` from the channel registry; never construct directly).
42
+ *
43
+ * A {@link ClientOnlyChannelServer} that pins the channel's name under its own, already-seeded registry key
44
+ * (`IdentityVerificationChannelServer`), so the existing row keeps resolving. It contributes no server tools and does not
45
+ * rewrite saves. The channel's state is a name and an email in a form: the client plugin has no state of record (it never
46
+ * requests a save), so no email address reaches the channel row. A server plugin cannot refuse a save, so that guarantee
47
+ * rests on the client plugin continuing not to request one.
48
+ */
49
+ let IdentityVerificationChannelServer = class IdentityVerificationChannelServer extends ClientOnlyChannelServer {
50
+ /** Matches the seeded `MJ: AI Agent Channels` row's `Name`. */
51
+ get ChannelName() {
52
+ return IDENTITY_VERIFICATION_CHANNEL_NAME;
53
+ }
54
+ };
55
+ IdentityVerificationChannelServer = __decorate([
56
+ RegisterClass(BaseRealtimeChannelServer, 'IdentityVerificationChannelServer')
57
+ ], IdentityVerificationChannelServer);
58
+ export { IdentityVerificationChannelServer };
59
+ /**
60
+ * Tree-shaking prevention for {@link IdentityVerificationChannelServer}'s `@RegisterClass` registration.
61
+ * Called from a static code path in the server host so the registration always executes.
62
+ */
63
+ export function LoadIdentityVerificationChannelServer() {
64
+ LoadClientOnlyChannelServer();
65
+ }
66
+ //# sourceMappingURL=identity-verification-channel-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-verification-channel-server.js","sourceRoot":"","sources":["../../src/realtime/identity-verification-channel-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;;;;;;;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAEpG,gFAAgF;AAChF,MAAM,CAAC,MAAM,kCAAkC,GAAG,sBAAsB,CAAC;AAEzE;;;;;;;;;GASG;AAEI,IAAM,iCAAiC,GAAvC,MAAM,iCAAkC,SAAQ,uBAAuB;IAC1E,+DAA+D;IAC/D,IAAoB,WAAW;QAC3B,OAAO,kCAAkC,CAAC;IAC9C,CAAC;CACJ,CAAA;AALY,iCAAiC;IAD7C,aAAa,CAAC,yBAAyB,EAAE,mCAAmC,CAAC;GACjE,iCAAiC,CAK7C;;AAED;;;GAGG;AACH,MAAM,UAAU,qCAAqC;IACjD,2BAA2B,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @fileoverview Server-side channel plugin for the **Interactive Component** channel, the one that shows the user
3
+ * any component artifact next to the call and lets the agent operate it.
4
+ *
5
+ * Paired with the browser's `RealtimeInteractiveComponentChannel` client plugin through the
6
+ * `MJ: AI Agent Channels` row `Name: 'InteractiveComponent'`
7
+ * (`ServerPluginClass: 'InteractiveComponentChannelServer'`, `ClientPluginClass: 'RealtimeInteractiveComponentChannel'`).
8
+ *
9
+ * **Why the server half is intentionally thin.** The channel's work happens where the component runs, in the
10
+ * browser: the client plugin loads the artifact through the signed-in user's own session, renders it, derives the
11
+ * agent's actions from the component's spec and drives it. Its contract is not known until a component is open,
12
+ * so there is nothing to declare to the model as a native server tool; every action reaches the browser through
13
+ * the stable `ContextTool` proxy. The server half exists to complete the channel registry pairing (so the channel
14
+ * is discoverable and loadable like every other) and to say, explicitly, that it holds nothing: no server tools and
15
+ * no state of record. Open components are live-only and are not restored when a session resumes.
16
+ *
17
+ * @module @memberjunction/ai-agents
18
+ */
19
+ import { ClientOnlyChannelServer } from './client-only-channel-server.js';
20
+ /** The stable channel name, matching the `MJ: AI Agent Channels` row. */
21
+ export declare const INTERACTIVE_COMPONENT_CHANNEL_NAME = "InteractiveComponent";
22
+ /**
23
+ * Server half of the Interactive Component channel. One instance per realtime session (created by
24
+ * `RealtimeChannelServerHost` from the channel registry; never construct directly).
25
+ *
26
+ * A {@link ClientOnlyChannelServer} that pins the channel's name under its own, already-seeded registry key
27
+ * (`InteractiveComponentChannelServer`), so the existing row keeps resolving. It contributes no server tools and does not
28
+ * rewrite saves; the client plugin is live-only (`SerializeState()` returns `null`), so nothing is ever persisted.
29
+ */
30
+ export declare class InteractiveComponentChannelServer extends ClientOnlyChannelServer {
31
+ /** Matches the `MJ: AI Agent Channels` row's `Name`. */
32
+ get ChannelName(): string;
33
+ }
34
+ /**
35
+ * Tree-shaking prevention for {@link InteractiveComponentChannelServer}'s `@RegisterClass` registration. Called from a
36
+ * static code path in the server host so the registration always executes.
37
+ */
38
+ export declare function LoadInteractiveComponentChannelServer(): void;
39
+ //# sourceMappingURL=interactive-component-channel-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive-component-channel-server.d.ts","sourceRoot":"","sources":["../../src/realtime/interactive-component-channel-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,EAAE,uBAAuB,EAA+B,MAAM,8BAA8B,CAAC;AAEpG,yEAAyE;AACzE,eAAO,MAAM,kCAAkC,yBAAyB,CAAC;AAEzE;;;;;;;GAOG;AACH,qBACa,iCAAkC,SAAQ,uBAAuB;IAC1E,wDAAwD;IACxD,IAAoB,WAAW,IAAI,MAAM,CAExC;CACJ;AAED;;;GAGG;AACH,wBAAgB,qCAAqC,IAAI,IAAI,CAE5D"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @fileoverview Server-side channel plugin for the **Interactive Component** channel, the one that shows the user
3
+ * any component artifact next to the call and lets the agent operate it.
4
+ *
5
+ * Paired with the browser's `RealtimeInteractiveComponentChannel` client plugin through the
6
+ * `MJ: AI Agent Channels` row `Name: 'InteractiveComponent'`
7
+ * (`ServerPluginClass: 'InteractiveComponentChannelServer'`, `ClientPluginClass: 'RealtimeInteractiveComponentChannel'`).
8
+ *
9
+ * **Why the server half is intentionally thin.** The channel's work happens where the component runs, in the
10
+ * browser: the client plugin loads the artifact through the signed-in user's own session, renders it, derives the
11
+ * agent's actions from the component's spec and drives it. Its contract is not known until a component is open,
12
+ * so there is nothing to declare to the model as a native server tool; every action reaches the browser through
13
+ * the stable `ContextTool` proxy. The server half exists to complete the channel registry pairing (so the channel
14
+ * is discoverable and loadable like every other) and to say, explicitly, that it holds nothing: no server tools and
15
+ * no state of record. Open components are live-only and are not restored when a session resumes.
16
+ *
17
+ * @module @memberjunction/ai-agents
18
+ */
19
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
20
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
21
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
22
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
23
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
24
+ };
25
+ import { BaseRealtimeChannelServer } from '@memberjunction/ai';
26
+ import { RegisterClass } from '@memberjunction/global';
27
+ import { ClientOnlyChannelServer, LoadClientOnlyChannelServer } from './client-only-channel-server.js';
28
+ /** The stable channel name, matching the `MJ: AI Agent Channels` row. */
29
+ export const INTERACTIVE_COMPONENT_CHANNEL_NAME = 'InteractiveComponent';
30
+ /**
31
+ * Server half of the Interactive Component channel. One instance per realtime session (created by
32
+ * `RealtimeChannelServerHost` from the channel registry; never construct directly).
33
+ *
34
+ * A {@link ClientOnlyChannelServer} that pins the channel's name under its own, already-seeded registry key
35
+ * (`InteractiveComponentChannelServer`), so the existing row keeps resolving. It contributes no server tools and does not
36
+ * rewrite saves; the client plugin is live-only (`SerializeState()` returns `null`), so nothing is ever persisted.
37
+ */
38
+ let InteractiveComponentChannelServer = class InteractiveComponentChannelServer extends ClientOnlyChannelServer {
39
+ /** Matches the `MJ: AI Agent Channels` row's `Name`. */
40
+ get ChannelName() {
41
+ return INTERACTIVE_COMPONENT_CHANNEL_NAME;
42
+ }
43
+ };
44
+ InteractiveComponentChannelServer = __decorate([
45
+ RegisterClass(BaseRealtimeChannelServer, 'InteractiveComponentChannelServer')
46
+ ], InteractiveComponentChannelServer);
47
+ export { InteractiveComponentChannelServer };
48
+ /**
49
+ * Tree-shaking prevention for {@link InteractiveComponentChannelServer}'s `@RegisterClass` registration. Called from a
50
+ * static code path in the server host so the registration always executes.
51
+ */
52
+ export function LoadInteractiveComponentChannelServer() {
53
+ LoadClientOnlyChannelServer();
54
+ }
55
+ //# sourceMappingURL=interactive-component-channel-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive-component-channel-server.js","sourceRoot":"","sources":["../../src/realtime/interactive-component-channel-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;;;;;;;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAEpG,yEAAyE;AACzE,MAAM,CAAC,MAAM,kCAAkC,GAAG,sBAAsB,CAAC;AAEzE;;;;;;;GAOG;AAEI,IAAM,iCAAiC,GAAvC,MAAM,iCAAkC,SAAQ,uBAAuB;IAC1E,wDAAwD;IACxD,IAAoB,WAAW;QAC3B,OAAO,kCAAkC,CAAC;IAC9C,CAAC;CACJ,CAAA;AALY,iCAAiC;IAD7C,aAAa,CAAC,yBAAyB,EAAE,mCAAmC,CAAC;GACjE,iCAAiC,CAK7C;;AAED;;;GAGG;AACH,MAAM,UAAU,qCAAqC;IACjD,2BAA2B,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * @fileoverview Which live avatar, if any, a realtime session asks for, and the voice that goes with it.
3
+ *
4
+ * A persona is a voice and a face: its Audio binding on a vendor is a voice, its Video binding an avatar. A session asks
5
+ * for an avatar when the voiced agent's video setting is on (`realtime.video.enabled`), the model's Video/Output row
6
+ * doesn't turn video off (`IsSupported` false: reason `endpoint`), and a face resolves:
7
+ * 1. `realtime.video.avatarId`, accepted only when it names an Active Video binding the model supports on the vendor;
8
+ * 2. else the voiced (target) agent's personas, default first, the first with a face;
9
+ * 3. else the co-agent's personas, the same way;
10
+ * 4. else none. The model's own first persona is never used: an agent with no persona gets no face.
11
+ *
12
+ * A call's avatar pick (the runtime override's `realtime.video.avatarId`) can't turn the video setting on: with the
13
+ * setting off the session asks for none, and says why (reason `video-off`), since the pick asked for one.
14
+ *
15
+ * Where the session runs can rule the avatar out before any of that: nobody sees an avatar on a phone call (reason
16
+ * `phone`), or in an app that shows no agent video (reason `host`: the app said so at mint), so such a session asks for
17
+ * none ({@link WithoutUnseenAvatar}) and keeps only the persona's voice.
18
+ *
19
+ * Whether the session can render the avatar is otherwise the driver's call (its endpoint profile); this only decides
20
+ * which one to ask for. Once the driver has minted the session, {@link ResolveRealtimeAvatarStatus} merges the two into
21
+ * the status the call gets, so a call that shows no avatar can say why. A server-side session gets its status from
22
+ * {@link ResolveBridgedAvatarStatus}, so a meeting can say why too, including when the prep asked its driver for none
23
+ * and when its driver renders no avatar and ignored the request.
24
+ *
25
+ * @module @memberjunction/ai-agents
26
+ */
27
+ import type { RealtimeAvatarSettings, RealtimeAvatarStatus, RealtimeAvatarUnavailableReason } from '@memberjunction/ai';
28
+ import type { ResolvedAgentPersona, ResolvedModelPersona } from '@memberjunction/ai-engine-base';
29
+ import type { RealtimeCoAgentConfig } from './realtime-coagent-config.js';
30
+ import type { RealtimeVideoOutputRow } from './realtime-video-output-gate.js';
31
+ /** The persona lookups the resolution needs: `AIEngine` provides them; tests pass a fake. */
32
+ export interface RealtimeAvatarPersonaSource {
33
+ GetModelPersonas(modelId: string, modalityName?: string, vendorId?: string): ResolvedModelPersona[];
34
+ GetAgentPersonas(agentId: string): ResolvedAgentPersona[];
35
+ }
36
+ /** What the session needs to know to resolve its avatar. */
37
+ export interface RealtimeAvatarResolutionInput {
38
+ /** The session's effective realtime configuration. */
39
+ EffectiveConfig: RealtimeCoAgentConfig | null | undefined;
40
+ /** The voiced (target) agent, when there is one. */
41
+ TargetAgentID?: string | null;
42
+ /** The co-agent voicing it. */
43
+ CoAgentID: string;
44
+ /** The resolved realtime model. */
45
+ ModelID: string;
46
+ /** The AI vendor serving it. Bindings on other vendors don't count. */
47
+ VendorID?: string | null;
48
+ /**
49
+ * The model's Video/Output row (`ReadRealtimeVideoOutputRow`). `'unsupported'` turns video off: no avatar, reason
50
+ * `endpoint`. `'supported'`, `'unstated'` or absent leave it to the driver's endpoint profile at the mint.
51
+ */
52
+ VideoOutputRow?: RealtimeVideoOutputRow;
53
+ /**
54
+ * Whether the call picked an avatar (its runtime override names `realtime.video.avatarId`). With the agent's video
55
+ * setting off, the pick is dropped with reason `video-off`; absent or `false`, the session asks for nothing then.
56
+ */
57
+ AvatarPicked?: boolean;
58
+ }
59
+ /**
60
+ * Why nobody would see an avatar in a session, whatever its model renders: `'phone'`, a phone call; `'host'`, an app that
61
+ * shows no agent video. Such a session asks the model for none.
62
+ */
63
+ export type RealtimeAvatarUnseenReason = Extract<RealtimeAvatarUnavailableReason, 'phone' | 'host'>;
64
+ /** Which avatar to ask for, and its persona's voice; or why there is none. */
65
+ export interface RealtimeAvatarResolution {
66
+ /**
67
+ * The avatar to ask for. Absent when the video setting is off, the model's row turns video off, no face resolves, or
68
+ * nobody in the session would see it.
69
+ */
70
+ Avatar?: RealtimeAvatarSettings;
71
+ /**
72
+ * The avatar persona's voice on the same vendor, when it has one. Kept when nobody would see the avatar, so the agent
73
+ * sounds the same on a phone call, or in an app without agent video, as in a call that shows its face.
74
+ */
75
+ Voice?: string;
76
+ /**
77
+ * Why there is no avatar although the video setting is on or the call picked one: nobody in the session would see it
78
+ * (`phone`, `host`), the call picked one and the agent's video setting is off (`video-off`), the model's Video/Output
79
+ * row turns video off (`endpoint`), the requested avatar is not a face the model has on the vendor (`unknown-avatar`),
80
+ * or no persona has one (`no-binding`).
81
+ */
82
+ Reason?: RealtimeAvatarUnseenReason | Extract<RealtimeAvatarUnavailableReason, 'video-off' | 'endpoint' | 'unknown-avatar' | 'no-binding'>;
83
+ }
84
+ /** What says, before any model is asked, whether anyone in a session could see an avatar. */
85
+ export interface RealtimeAvatarViewers {
86
+ /** `true` when the session is a phone call: the caller hears the agent and sees no video. */
87
+ PhoneCall?: boolean;
88
+ /**
89
+ * `false` when the app showing the call shows no agent video (none of its channels shows it). Absent or `true`: it
90
+ * may show it.
91
+ */
92
+ ShowsAgentVideo?: boolean;
93
+ }
94
+ /**
95
+ * Why nobody would see an avatar in a session, whatever its model renders, or `undefined` when someone could. A phone
96
+ * call says `phone` whatever app relays it.
97
+ *
98
+ * @param viewers What the session says about who is on the other end.
99
+ */
100
+ export declare function ResolveAvatarUnseenReason(viewers: RealtimeAvatarViewers): RealtimeAvatarUnseenReason | undefined;
101
+ /** What says whether a session could show an avatar at all: who is on the other end, and where the session runs. */
102
+ export interface RealtimeAvatarSessionShape extends RealtimeAvatarViewers {
103
+ /** `true` for a server-side (bridged or agent-run) session; absent for a browser session. */
104
+ ServerSide?: boolean;
105
+ /** `'room'` when the session's host publishes the avatar into a room. */
106
+ AvatarDelivery?: 'room';
107
+ }
108
+ /**
109
+ * Whether a session could show an avatar at all: a browser session whose app may show agent video, or a server-side
110
+ * one whose host publishes the avatar into a room. A phone call or an app without agent video
111
+ * ({@link ResolveAvatarUnseenReason}), or a server-side session whose host can't publish video, can't.
112
+ *
113
+ * @param session What the session says about its viewers and where it runs.
114
+ */
115
+ export declare function RealtimeSessionCanShowAvatar(session: RealtimeAvatarSessionShape): boolean;
116
+ /**
117
+ * A resolution without its avatar request when nobody in the session would see the avatar
118
+ * ({@link ResolveAvatarUnseenReason}), so the driver is never asked to render video that nobody sees. The reason replaces
119
+ * any other, since no model or face could change it; the persona's voice stays. A resolution that asked for nothing
120
+ * (the video setting is off) stays as it is, so the call gets no notice.
121
+ *
122
+ * @param resolution The session's avatar resolution.
123
+ * @param viewers What the session says about who is on the other end.
124
+ */
125
+ export declare function WithoutUnseenAvatar(resolution: RealtimeAvatarResolution, viewers: RealtimeAvatarViewers): RealtimeAvatarResolution;
126
+ /** What a server-side (bridged) session's avatar status is made from, once its driver has opened it. */
127
+ export interface RealtimeBridgedAvatarStatusInput {
128
+ /** The session's avatar resolution (`RealtimeSessionParamsPrep.AvatarResolution`); absent when the prep made none. */
129
+ Resolution: RealtimeAvatarResolution | undefined;
130
+ /**
131
+ * Whether the session's host publishes the avatar into a room (`PrepareClientSessionInput.AvatarDelivery` `'room'`).
132
+ * Without it nothing on the server shows an avatar.
133
+ */
134
+ RoomDelivery: boolean;
135
+ /**
136
+ * Whether the session's model shows avatars (`RealtimeModelShowsAvatar`: its Video/Output row and its driver's
137
+ * endpoint). Asked only in a session whose host publishes the avatar, when the driver had nothing to report: the prep
138
+ * asked it for no avatar for a reason other than who would see it, or asked it for one and it reported nothing.
139
+ */
140
+ ModelShowsAvatar: () => boolean;
141
+ /** What the driver reported when it opened the session (`IRealtimeSession.AvatarStatus`). */
142
+ DriverStatus: RealtimeAvatarStatus | undefined;
143
+ }
144
+ /**
145
+ * The avatar status a server-side (bridged) session reports, which its host shows (the LiveKit room puts it on the
146
+ * agent's bot as `mj.agentAvatar`). A status the driver reported about the avatar it was asked for stands: the driver
147
+ * decided. A session whose prep asked for none because the video setting is off keeps the driver's status (none).
148
+ * Otherwise the driver had nothing to report, because the prep asked it for no avatar for a reason, or because it renders
149
+ * no avatar and ignored the request, so the status says why, asked for and not granted:
150
+ * 1. `phone` (or `host`): nobody would see the avatar, whatever renders it; or `video-off`: the agent's video setting
151
+ * dropped the call's pick;
152
+ * 2. `bridged` when the host publishes no avatar into a room, which is what a driver asked there says (the LiveKit room
153
+ * then names its own reason, such as `decoder-missing`);
154
+ * 3. `endpoint` when the model shows no avatar, as a browser call says ({@link ResolveRealtimeAvatarStatus});
155
+ * 4. else the prep's reason: `endpoint` (the model's Video/Output row), `unknown-avatar` or `no-binding`. A driver that
156
+ * was asked for the avatar on a model that shows avatars and reported nothing gives no reason, so there is no status.
157
+ *
158
+ * @param input The resolution, whether the host publishes the avatar, the model's capability and the driver's status.
159
+ * @returns The status for the session; `undefined` when the session asked for no avatar, or its driver reported nothing
160
+ * about one on a model that shows avatars.
161
+ */
162
+ export declare function ResolveBridgedAvatarStatus(input: RealtimeBridgedAvatarStatusInput): RealtimeAvatarStatus | undefined;
163
+ /**
164
+ * Resolves the avatar a session asks for (see the file header for the order).
165
+ *
166
+ * @param input The session's configuration, agents, model and vendor.
167
+ * @param personas The persona lookups (`AIEngine.Instance`).
168
+ */
169
+ export declare function ResolveRealtimeAvatar(input: RealtimeAvatarResolutionInput, personas: RealtimeAvatarPersonaSource): RealtimeAvatarResolution;
170
+ /** What a session's avatar status is made from, once the driver has minted it. */
171
+ export interface RealtimeAvatarStatusInput {
172
+ /** The session's avatar resolution: an avatar, a reason there is none, or neither when the agent asked for none. */
173
+ Resolution: RealtimeAvatarResolution;
174
+ /**
175
+ * Whether the resolved model shows avatars (`RealtimeModelShowsAvatar`): its Video/Output row allows video or it has
176
+ * none, and its driver renders avatars on its endpoint (`BaseRealtimeModel.SupportsAvatarOutput`).
177
+ */
178
+ ModelSupportsAvatarOutput: boolean;
179
+ /** The driver's decision at mint (`ClientRealtimeSessionConfig.AvatarStatus`), when it reported one. */
180
+ DriverStatus?: RealtimeAvatarStatus;
181
+ }
182
+ /**
183
+ * The status a call gets about the avatar its agent asked for. Nothing when the agent asked for none (its video
184
+ * setting is off, and the call picked none). Otherwise audio only when nobody in the session would see it
185
+ * ({@link RealtimeAvatarUnseenReason}) or the agent's video setting dropped the call's pick (`video-off`), whatever the
186
+ * model renders; then `endpoint` when the model shows no avatar (its Video/Output row turns video off, or it
187
+ * renders none on its endpoint), whatever driver serves it; then the resolution's reason (`unknown-avatar`,
188
+ * `no-binding`); else the driver's own decision (granted, or `custom-disabled` and the like).
189
+ *
190
+ * @param input The resolution, the model's capability and the driver's decision.
191
+ * @returns The status for the call, or `undefined` when the session asked for no avatar or the driver reported none.
192
+ */
193
+ export declare function ResolveRealtimeAvatarStatus(input: RealtimeAvatarStatusInput): RealtimeAvatarStatus | undefined;
194
+ //# sourceMappingURL=realtime-avatar-resolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime-avatar-resolution.d.ts","sourceRoot":"","sources":["../../src/realtime/realtime-avatar-resolution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AACxH,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAEjG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAE3E,6FAA6F;AAC7F,MAAM,WAAW,2BAA2B;IACxC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAAC;IACpG,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAAC;CAC7D;AAED,4DAA4D;AAC5D,MAAM,WAAW,6BAA6B;IAC1C,sDAAsD;IACtD,eAAe,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1D,oDAAoD;IACpD,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;OAGG;IACH,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,MAAM,0BAA0B,GAAG,OAAO,CAAC,+BAA+B,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC;AAEpG,8EAA8E;AAC9E,MAAM,WAAW,wBAAwB;IACrC;;;OAGG;IACH,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,MAAM,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAAC,+BAA+B,EAAE,WAAW,GAAG,UAAU,GAAG,gBAAgB,GAAG,YAAY,CAAC,CAAC;CAC9I;AAED,6FAA6F;AAC7F,MAAM,WAAW,qBAAqB;IAClC,6FAA6F;IAC7F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,qBAAqB,GAAG,0BAA0B,GAAG,SAAS,CAKhH;AAED,oHAAoH;AACpH,MAAM,WAAW,0BAA2B,SAAQ,qBAAqB;IACrE,6FAA6F;IAC7F,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAKzF;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,wBAAwB,EAAE,OAAO,EAAE,qBAAqB,GAAG,wBAAwB,CAMlI;AAED,wGAAwG;AACxG,MAAM,WAAW,gCAAgC;IAC7C,sHAAsH;IACtH,UAAU,EAAE,wBAAwB,GAAG,SAAS,CAAC;IACjD;;;OAGG;IACH,YAAY,EAAE,OAAO,CAAC;IACtB;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,OAAO,CAAC;IAChC,6FAA6F;IAC7F,YAAY,EAAE,oBAAoB,GAAG,SAAS,CAAC;CAClD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,gCAAgC,GAAG,oBAAoB,GAAG,SAAS,CAQpH;AAiCD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,6BAA6B,EAAE,QAAQ,EAAE,2BAA2B,GAAG,wBAAwB,CAsB3I;AAiBD,kFAAkF;AAClF,MAAM,WAAW,yBAAyB;IACtC,oHAAoH;IACpH,UAAU,EAAE,wBAAwB,CAAC;IACrC;;;OAGG;IACH,yBAAyB,EAAE,OAAO,CAAC;IACnC,wGAAwG;IACxG,YAAY,CAAC,EAAE,oBAAoB,CAAC;CACvC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,yBAAyB,GAAG,oBAAoB,GAAG,SAAS,CAe9G"}