@memberjunction/ng-core-entity-forms 5.40.2 → 5.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/dist/__tests__/bridge-provider-features.test.d.ts +2 -0
  2. package/dist/__tests__/bridge-provider-features.test.d.ts.map +1 -0
  3. package/dist/__tests__/bridge-provider-features.test.js +70 -0
  4. package/dist/__tests__/bridge-provider-features.test.js.map +1 -0
  5. package/dist/lib/custom/AIAgentChannels/ai-agent-channel-form.component.d.ts +17 -0
  6. package/dist/lib/custom/AIAgentChannels/ai-agent-channel-form.component.d.ts.map +1 -0
  7. package/dist/lib/custom/AIAgentChannels/ai-agent-channel-form.component.js +170 -0
  8. package/dist/lib/custom/AIAgentChannels/ai-agent-channel-form.component.js.map +1 -0
  9. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.d.ts +133 -0
  10. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.d.ts.map +1 -0
  11. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js +1190 -0
  12. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -0
  13. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +69 -0
  14. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  15. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +911 -562
  16. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  17. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
  18. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +2 -2
  19. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  20. package/dist/lib/custom/BridgeAgentIdentities/bridge-agent-identity-form.component.d.ts +20 -0
  21. package/dist/lib/custom/BridgeAgentIdentities/bridge-agent-identity-form.component.d.ts.map +1 -0
  22. package/dist/lib/custom/BridgeAgentIdentities/bridge-agent-identity-form.component.js +115 -0
  23. package/dist/lib/custom/BridgeAgentIdentities/bridge-agent-identity-form.component.js.map +1 -0
  24. package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts +50 -0
  25. package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts.map +1 -0
  26. package/dist/lib/custom/BridgeProviders/bridge-provider-features.js +75 -0
  27. package/dist/lib/custom/BridgeProviders/bridge-provider-features.js.map +1 -0
  28. package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.d.ts +48 -0
  29. package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.d.ts.map +1 -0
  30. package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js +256 -0
  31. package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js.map +1 -0
  32. package/dist/lib/custom/Entities/entity-form.component.d.ts +28 -4
  33. package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
  34. package/dist/lib/custom/Entities/entity-form.component.js +42 -12
  35. package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
  36. package/dist/lib/custom/Lists/list-form.component.d.ts +6 -0
  37. package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
  38. package/dist/lib/custom/Lists/list-form.component.js +11 -1
  39. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  40. package/dist/lib/custom/SessionBridges/session-bridge-form.component.d.ts +43 -0
  41. package/dist/lib/custom/SessionBridges/session-bridge-form.component.d.ts.map +1 -0
  42. package/dist/lib/custom/SessionBridges/session-bridge-form.component.js +278 -0
  43. package/dist/lib/custom/SessionBridges/session-bridge-form.component.js.map +1 -0
  44. package/dist/lib/custom/custom-forms.module.d.ts +32 -26
  45. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  46. package/dist/lib/custom/custom-forms.module.js +34 -1
  47. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  48. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
  49. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +284 -180
  50. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
  51. package/dist/lib/generated/Entities/MJAIAgentChannel/mjaiagentchannel.form.component.d.ts +10 -0
  52. package/dist/lib/generated/Entities/MJAIAgentChannel/mjaiagentchannel.form.component.d.ts.map +1 -0
  53. package/dist/lib/generated/Entities/MJAIAgentChannel/mjaiagentchannel.form.component.js +117 -0
  54. package/dist/lib/generated/Entities/MJAIAgentChannel/mjaiagentchannel.form.component.js.map +1 -0
  55. package/dist/lib/generated/Entities/MJAIAgentCoAgent/mjaiagentcoagent.form.component.d.ts +10 -0
  56. package/dist/lib/generated/Entities/MJAIAgentCoAgent/mjaiagentcoagent.form.component.d.ts.map +1 -0
  57. package/dist/lib/generated/Entities/MJAIAgentCoAgent/mjaiagentcoagent.form.component.js +82 -0
  58. package/dist/lib/generated/Entities/MJAIAgentCoAgent/mjaiagentcoagent.form.component.js.map +1 -0
  59. package/dist/lib/generated/Entities/MJAIAgentNote/mjaiagentnote.form.component.js +27 -25
  60. package/dist/lib/generated/Entities/MJAIAgentNote/mjaiagentnote.form.component.js.map +1 -1
  61. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.d.ts.map +1 -1
  62. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +16 -20
  63. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
  64. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.d.ts +10 -0
  65. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.d.ts.map +1 -0
  66. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js +185 -0
  67. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js.map +1 -0
  68. package/dist/lib/generated/Entities/MJAIAgentSessionBridge/mjaiagentsessionbridge.form.component.d.ts +10 -0
  69. package/dist/lib/generated/Entities/MJAIAgentSessionBridge/mjaiagentsessionbridge.form.component.d.ts.map +1 -0
  70. package/dist/lib/generated/Entities/MJAIAgentSessionBridge/mjaiagentsessionbridge.form.component.js +121 -0
  71. package/dist/lib/generated/Entities/MJAIAgentSessionBridge/mjaiagentsessionbridge.form.component.js.map +1 -0
  72. package/dist/lib/generated/Entities/MJAIAgentSessionBridgeParticipant/mjaiagentsessionbridgeparticipant.form.component.d.ts +10 -0
  73. package/dist/lib/generated/Entities/MJAIAgentSessionBridgeParticipant/mjaiagentsessionbridgeparticipant.form.component.d.ts.map +1 -0
  74. package/dist/lib/generated/Entities/MJAIAgentSessionBridgeParticipant/mjaiagentsessionbridgeparticipant.form.component.js +94 -0
  75. package/dist/lib/generated/Entities/MJAIAgentSessionBridgeParticipant/mjaiagentsessionbridgeparticipant.form.component.js.map +1 -0
  76. package/dist/lib/generated/Entities/MJAIAgentSessionChannel/mjaiagentsessionchannel.form.component.d.ts +10 -0
  77. package/dist/lib/generated/Entities/MJAIAgentSessionChannel/mjaiagentsessionchannel.form.component.d.ts.map +1 -0
  78. package/dist/lib/generated/Entities/MJAIAgentSessionChannel/mjaiagentsessionchannel.form.component.js +86 -0
  79. package/dist/lib/generated/Entities/MJAIAgentSessionChannel/mjaiagentsessionchannel.form.component.js.map +1 -0
  80. package/dist/lib/generated/Entities/MJAIAgentType/mjaiagenttype.form.component.d.ts.map +1 -1
  81. package/dist/lib/generated/Entities/MJAIAgentType/mjaiagenttype.form.component.js +37 -15
  82. package/dist/lib/generated/Entities/MJAIAgentType/mjaiagenttype.form.component.js.map +1 -1
  83. package/dist/lib/generated/Entities/MJAIBridgeAgentIdentity/mjaibridgeagentidentity.form.component.d.ts +10 -0
  84. package/dist/lib/generated/Entities/MJAIBridgeAgentIdentity/mjaibridgeagentidentity.form.component.d.ts.map +1 -0
  85. package/dist/lib/generated/Entities/MJAIBridgeAgentIdentity/mjaibridgeagentidentity.form.component.js +86 -0
  86. package/dist/lib/generated/Entities/MJAIBridgeAgentIdentity/mjaibridgeagentidentity.form.component.js.map +1 -0
  87. package/dist/lib/generated/Entities/MJAIBridgeProvider/mjaibridgeprovider.form.component.d.ts +10 -0
  88. package/dist/lib/generated/Entities/MJAIBridgeProvider/mjaibridgeprovider.form.component.d.ts.map +1 -0
  89. package/dist/lib/generated/Entities/MJAIBridgeProvider/mjaibridgeprovider.form.component.js +143 -0
  90. package/dist/lib/generated/Entities/MJAIBridgeProvider/mjaibridgeprovider.form.component.js.map +1 -0
  91. package/dist/lib/generated/Entities/MJAIBridgeProviderChannel/mjaibridgeproviderchannel.form.component.d.ts +10 -0
  92. package/dist/lib/generated/Entities/MJAIBridgeProviderChannel/mjaibridgeproviderchannel.form.component.d.ts.map +1 -0
  93. package/dist/lib/generated/Entities/MJAIBridgeProviderChannel/mjaibridgeproviderchannel.form.component.js +76 -0
  94. package/dist/lib/generated/Entities/MJAIBridgeProviderChannel/mjaibridgeproviderchannel.form.component.js.map +1 -0
  95. package/dist/lib/generated/Entities/MJAIRemoteBrowserProvider/mjairemotebrowserprovider.form.component.d.ts +10 -0
  96. package/dist/lib/generated/Entities/MJAIRemoteBrowserProvider/mjairemotebrowserprovider.form.component.d.ts.map +1 -0
  97. package/dist/lib/generated/Entities/MJAIRemoteBrowserProvider/mjairemotebrowserprovider.form.component.js +90 -0
  98. package/dist/lib/generated/Entities/MJAIRemoteBrowserProvider/mjairemotebrowserprovider.form.component.js.map +1 -0
  99. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.d.ts.map +1 -1
  100. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js +28 -10
  101. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js.map +1 -1
  102. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.d.ts.map +1 -1
  103. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js +7 -9
  104. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js.map +1 -1
  105. package/dist/lib/generated/Entities/MJScheduledJob/mjscheduledjob.form.component.js +27 -25
  106. package/dist/lib/generated/Entities/MJScheduledJob/mjscheduledjob.form.component.js.map +1 -1
  107. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  108. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +143 -107
  109. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  110. package/dist/lib/generated/generated-forms.module.d.ts +358 -343
  111. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  112. package/dist/lib/generated/generated-forms.module.js +426 -366
  113. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  114. package/dist/lib/panels/ai-agents/agent-realtime.panel.d.ts +74 -0
  115. package/dist/lib/panels/ai-agents/agent-realtime.panel.d.ts.map +1 -0
  116. package/dist/lib/panels/ai-agents/agent-realtime.panel.js +365 -0
  117. package/dist/lib/panels/ai-agents/agent-realtime.panel.js.map +1 -0
  118. package/dist/public-api.d.ts +2 -0
  119. package/dist/public-api.d.ts.map +1 -1
  120. package/dist/public-api.js +2 -0
  121. package/dist/public-api.js.map +1 -1
  122. package/package.json +36 -36
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bridge-provider-features.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-provider-features.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/bridge-provider-features.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,70 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { BRIDGE_FEATURE_GROUPS, BRIDGE_FEATURE_KEYS, isFeatureEnabled, setFeature, countEnabledFeatures, } from '../lib/custom/BridgeProviders/bridge-provider-features';
3
+ describe('bridge-provider-features', () => {
4
+ describe('layout', () => {
5
+ it('groups all 16 documented capability flags', () => {
6
+ expect(BRIDGE_FEATURE_KEYS).toHaveLength(16);
7
+ expect(BRIDGE_FEATURE_GROUPS.map(g => g.title)).toEqual([
8
+ 'Join methods',
9
+ 'Media tracks',
10
+ 'Signals & telephony',
11
+ ]);
12
+ });
13
+ it('has no duplicate keys', () => {
14
+ expect(new Set(BRIDGE_FEATURE_KEYS).size).toBe(BRIDGE_FEATURE_KEYS.length);
15
+ });
16
+ it('every feature has a label and description', () => {
17
+ for (const group of BRIDGE_FEATURE_GROUPS) {
18
+ for (const f of group.features) {
19
+ expect(f.label.length).toBeGreaterThan(0);
20
+ expect(f.description.length).toBeGreaterThan(0);
21
+ }
22
+ }
23
+ });
24
+ });
25
+ describe('isFeatureEnabled', () => {
26
+ it('returns false for null features', () => {
27
+ expect(isFeatureEnabled(null, 'AudioIn')).toBe(false);
28
+ });
29
+ it('returns false for an absent key', () => {
30
+ expect(isFeatureEnabled({}, 'AudioIn')).toBe(false);
31
+ });
32
+ it('treats explicit false as disabled', () => {
33
+ expect(isFeatureEnabled({ AudioIn: false }, 'AudioIn')).toBe(false);
34
+ });
35
+ it('returns true only for explicit true', () => {
36
+ expect(isFeatureEnabled({ AudioIn: true }, 'AudioIn')).toBe(true);
37
+ });
38
+ });
39
+ describe('setFeature', () => {
40
+ it('does not mutate the input object', () => {
41
+ const input = { AudioIn: true };
42
+ const out = setFeature(input, 'AudioOut', true);
43
+ expect(input).toEqual({ AudioIn: true });
44
+ expect(out).not.toBe(input);
45
+ });
46
+ it('enabling sets the key to true', () => {
47
+ expect(setFeature(null, 'AudioIn', true)).toEqual({ AudioIn: true });
48
+ });
49
+ it('disabling omits the key entirely (not persisted as false)', () => {
50
+ const out = setFeature({ AudioIn: true, AudioOut: true }, 'AudioIn', false);
51
+ expect(out).toEqual({ AudioOut: true });
52
+ expect('AudioIn' in out).toBe(false);
53
+ });
54
+ it('disabling an already-absent key is a no-op result', () => {
55
+ expect(setFeature({ AudioOut: true }, 'AudioIn', false)).toEqual({ AudioOut: true });
56
+ });
57
+ it('handles a null starting object when enabling', () => {
58
+ expect(setFeature(null, 'Recording', true)).toEqual({ Recording: true });
59
+ });
60
+ });
61
+ describe('countEnabledFeatures', () => {
62
+ it('returns 0 for null', () => {
63
+ expect(countEnabledFeatures(null)).toBe(0);
64
+ });
65
+ it('counts only explicit-true flags', () => {
66
+ expect(countEnabledFeatures({ AudioIn: true, AudioOut: false, Recording: true })).toBe(2);
67
+ });
68
+ });
69
+ });
70
+ //# sourceMappingURL=bridge-provider-features.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-provider-features.test.js","sourceRoot":"","sources":["../../src/__tests__/bridge-provider-features.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, it, expect } from 'vitest';\nimport {\n BRIDGE_FEATURE_GROUPS,\n BRIDGE_FEATURE_KEYS,\n isFeatureEnabled,\n setFeature,\n countEnabledFeatures,\n} from '../lib/custom/BridgeProviders/bridge-provider-features';\n\ndescribe('bridge-provider-features', () => {\n describe('layout', () => {\n it('groups all 16 documented capability flags', () => {\n expect(BRIDGE_FEATURE_KEYS).toHaveLength(16);\n expect(BRIDGE_FEATURE_GROUPS.map(g => g.title)).toEqual([\n 'Join methods',\n 'Media tracks',\n 'Signals & telephony',\n ]);\n });\n\n it('has no duplicate keys', () => {\n expect(new Set(BRIDGE_FEATURE_KEYS).size).toBe(BRIDGE_FEATURE_KEYS.length);\n });\n\n it('every feature has a label and description', () => {\n for (const group of BRIDGE_FEATURE_GROUPS) {\n for (const f of group.features) {\n expect(f.label.length).toBeGreaterThan(0);\n expect(f.description.length).toBeGreaterThan(0);\n }\n }\n });\n });\n\n describe('isFeatureEnabled', () => {\n it('returns false for null features', () => {\n expect(isFeatureEnabled(null, 'AudioIn')).toBe(false);\n });\n it('returns false for an absent key', () => {\n expect(isFeatureEnabled({}, 'AudioIn')).toBe(false);\n });\n it('treats explicit false as disabled', () => {\n expect(isFeatureEnabled({ AudioIn: false }, 'AudioIn')).toBe(false);\n });\n it('returns true only for explicit true', () => {\n expect(isFeatureEnabled({ AudioIn: true }, 'AudioIn')).toBe(true);\n });\n });\n\n describe('setFeature', () => {\n it('does not mutate the input object', () => {\n const input = { AudioIn: true };\n const out = setFeature(input, 'AudioOut', true);\n expect(input).toEqual({ AudioIn: true });\n expect(out).not.toBe(input);\n });\n\n it('enabling sets the key to true', () => {\n expect(setFeature(null, 'AudioIn', true)).toEqual({ AudioIn: true });\n });\n\n it('disabling omits the key entirely (not persisted as false)', () => {\n const out = setFeature({ AudioIn: true, AudioOut: true }, 'AudioIn', false);\n expect(out).toEqual({ AudioOut: true });\n expect('AudioIn' in out).toBe(false);\n });\n\n it('disabling an already-absent key is a no-op result', () => {\n expect(setFeature({ AudioOut: true }, 'AudioIn', false)).toEqual({ AudioOut: true });\n });\n\n it('handles a null starting object when enabling', () => {\n expect(setFeature(null, 'Recording', true)).toEqual({ Recording: true });\n });\n });\n\n describe('countEnabledFeatures', () => {\n it('returns 0 for null', () => {\n expect(countEnabledFeatures(null)).toBe(0);\n });\n it('counts only explicit-true flags', () => {\n expect(countEnabledFeatures({ AudioIn: true, AudioOut: false, Recording: true })).toBe(2);\n });\n });\n});\n"]}
@@ -0,0 +1,17 @@
1
+ import { MJAIAgentChannelEntity } from '@memberjunction/core-entities';
2
+ import { MJAIAgentChannelFormComponent } from '../../generated/Entities/MJAIAgentChannel/mjaiagentchannel.form.component';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Custom form for 'MJ: AI Agent Channels' — the pluggable channel-definition
6
+ * registry for realtime agent sessions. A light enhancement over the generated
7
+ * form: a clean header (channel icon, transport pill, active badge) above the
8
+ * standard generated field panels, with the ConfigSchema rendered as code.
9
+ */
10
+ export declare class MJAIAgentChannelFormComponentExtended extends MJAIAgentChannelFormComponent {
11
+ record: MJAIAgentChannelEntity;
12
+ /** Font Awesome icon for well-known channel definitions, generic plug otherwise. */
13
+ get ChannelIcon(): string;
14
+ static ɵfac: i0.ɵɵFactoryDeclaration<MJAIAgentChannelFormComponentExtended, never>;
15
+ static ɵcmp: i0.ɵɵComponentDeclaration<MJAIAgentChannelFormComponentExtended, "mj-ai-agent-channel-form", never, {}, {}, never, never, false, never>;
16
+ }
17
+ //# sourceMappingURL=ai-agent-channel-form.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-agent-channel-form.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgentChannels/ai-agent-channel-form.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAGvE,OAAO,EAAE,6BAA6B,EAAE,MAAM,2EAA2E,CAAC;;AAE1H;;;;;GAKG;AACH,qBAOa,qCAAsC,SAAQ,6BAA6B;IAC7E,MAAM,EAAG,sBAAsB,CAAC;IAEvC,oFAAoF;IACpF,IAAW,WAAW,IAAI,MAAM,CAS/B;yCAbQ,qCAAqC;2CAArC,qCAAqC;CAcjD"}
@@ -0,0 +1,170 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Component } from '@angular/core';
8
+ import { RegisterClass } from '@memberjunction/global';
9
+ import { BaseFormComponent } from '@memberjunction/ng-base-forms';
10
+ import { MJAIAgentChannelFormComponent } from '../../generated/Entities/MJAIAgentChannel/mjaiagentchannel.form.component';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "@angular/common";
13
+ import * as i2 from "@memberjunction/ng-base-forms";
14
+ function MJAIAgentChannelFormComponentExtended_Conditional_0_Conditional_8_Template(rf, ctx) { if (rf & 1) {
15
+ i0.ɵɵelementStart(0, "p", 7);
16
+ i0.ɵɵtext(1);
17
+ i0.ɵɵelementEnd();
18
+ } if (rf & 2) {
19
+ const ctx_r1 = i0.ɵɵnextContext(2);
20
+ i0.ɵɵadvance();
21
+ i0.ɵɵtextInterpolate(ctx_r1.record.Description);
22
+ } }
23
+ function MJAIAgentChannelFormComponentExtended_Conditional_0_Conditional_40_Template(rf, ctx) { if (rf & 1) {
24
+ const _r3 = i0.ɵɵgetCurrentView();
25
+ i0.ɵɵelementStart(0, "div")(1, "mj-explorer-entity-data-grid", 34);
26
+ i0.ɵɵlistener("Navigate", function MJAIAgentChannelFormComponentExtended_Conditional_0_Conditional_40_Template_mj_explorer_entity_data_grid_Navigate_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnFormNavigate($event)); })("AfterDataLoad", function MJAIAgentChannelFormComponentExtended_Conditional_0_Conditional_40_Template_mj_explorer_entity_data_grid_AfterDataLoad_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SetSectionRowCount("mJAIAgentSessionChannels", $event.totalRowCount)); });
27
+ i0.ɵɵelementEnd()();
28
+ } if (rf & 2) {
29
+ const ctx_r1 = i0.ɵɵnextContext(2);
30
+ i0.ɵɵadvance();
31
+ i0.ɵɵproperty("Params", ctx_r1.BuildRelationshipViewParamsByEntityName("MJ: AI Agent Session Channels", "ChannelID"))("NewRecordValues", ctx_r1.NewRecordValues("MJ: AI Agent Session Channels"))("AllowLoad", ctx_r1.IsSectionExpanded("mJAIAgentSessionChannels"))("ShowToolbar", false);
32
+ } }
33
+ function MJAIAgentChannelFormComponentExtended_Conditional_0_Template(rf, ctx) { if (rf & 1) {
34
+ const _r1 = i0.ɵɵgetCurrentView();
35
+ i0.ɵɵelementStart(0, "mj-record-form-container", 1);
36
+ i0.ɵɵlistener("Navigate", function MJAIAgentChannelFormComponentExtended_Conditional_0_Template_mj_record_form_container_Navigate_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFormNavigate($event)); })("DeleteRequested", function MJAIAgentChannelFormComponentExtended_Conditional_0_Template_mj_record_form_container_DeleteRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDeleteRequested()); })("FavoriteToggled", function MJAIAgentChannelFormComponentExtended_Conditional_0_Template_mj_record_form_container_FavoriteToggled_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFavoriteToggled()); })("HistoryRequested", function MJAIAgentChannelFormComponentExtended_Conditional_0_Template_mj_record_form_container_HistoryRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnHistoryRequested()); })("ListManagementRequested", function MJAIAgentChannelFormComponentExtended_Conditional_0_Template_mj_record_form_container_ListManagementRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnListManagementRequested()); });
37
+ i0.ɵɵelementStart(1, "div", 2)(2, "div", 3)(3, "div", 4);
38
+ i0.ɵɵelement(4, "i", 5);
39
+ i0.ɵɵelementEnd();
40
+ i0.ɵɵelementStart(5, "div", 6)(6, "h2");
41
+ i0.ɵɵtext(7);
42
+ i0.ɵɵelementEnd();
43
+ i0.ɵɵconditionalCreate(8, MJAIAgentChannelFormComponentExtended_Conditional_0_Conditional_8_Template, 2, 1, "p", 7);
44
+ i0.ɵɵelementStart(9, "div", 8)(10, "span", 9);
45
+ i0.ɵɵelement(11, "i", 10);
46
+ i0.ɵɵtext(12);
47
+ i0.ɵɵelementEnd();
48
+ i0.ɵɵelementStart(13, "span", 11);
49
+ i0.ɵɵelement(14, "i", 12);
50
+ i0.ɵɵelementStart(15, "span", 13);
51
+ i0.ɵɵtext(16);
52
+ i0.ɵɵelementEnd()();
53
+ i0.ɵɵelementStart(17, "span", 14);
54
+ i0.ɵɵelement(18, "i", 15);
55
+ i0.ɵɵelementStart(19, "span", 13);
56
+ i0.ɵɵtext(20);
57
+ i0.ɵɵelementEnd()()()()();
58
+ i0.ɵɵelementStart(21, "div", 16)(22, "span", 17);
59
+ i0.ɵɵelement(23, "i", 5);
60
+ i0.ɵɵtext(24);
61
+ i0.ɵɵelementEnd()()();
62
+ i0.ɵɵelement(25, "mj-form-panel-slot", 18);
63
+ i0.ɵɵelementStart(26, "mj-collapsible-panel", 19);
64
+ i0.ɵɵelement(27, "mj-form-field", 20)(28, "mj-form-field", 21)(29, "mj-form-field", 22);
65
+ i0.ɵɵelementEnd();
66
+ i0.ɵɵelementStart(30, "mj-collapsible-panel", 23);
67
+ i0.ɵɵelement(31, "mj-form-field", 24)(32, "mj-form-field", 25)(33, "mj-form-field", 26)(34, "mj-form-field", 27);
68
+ i0.ɵɵelementEnd();
69
+ i0.ɵɵelementStart(35, "mj-collapsible-panel", 28);
70
+ i0.ɵɵelement(36, "mj-form-field", 29)(37, "mj-form-field", 30);
71
+ i0.ɵɵelementEnd();
72
+ i0.ɵɵelement(38, "mj-form-panel-slot", 31);
73
+ i0.ɵɵelementStart(39, "mj-collapsible-panel", 32);
74
+ i0.ɵɵconditionalCreate(40, MJAIAgentChannelFormComponentExtended_Conditional_0_Conditional_40_Template, 2, 4, "div");
75
+ i0.ɵɵelementEnd();
76
+ i0.ɵɵelement(41, "mj-form-panel-slot", 33);
77
+ i0.ɵɵelementEnd();
78
+ } if (rf & 2) {
79
+ const ctx_r1 = i0.ɵɵnextContext();
80
+ i0.ɵɵproperty("Record", ctx_r1.record)("FormComponent", ctx_r1);
81
+ i0.ɵɵadvance(4);
82
+ i0.ɵɵproperty("ngClass", ctx_r1.ChannelIcon);
83
+ i0.ɵɵadvance(3);
84
+ i0.ɵɵtextInterpolate(ctx_r1.record.Name || "AI Agent Channel");
85
+ i0.ɵɵadvance();
86
+ i0.ɵɵconditional(ctx_r1.record.Description ? 8 : -1);
87
+ i0.ɵɵadvance(2);
88
+ i0.ɵɵattribute("data-transport", ctx_r1.record.TransportType);
89
+ i0.ɵɵadvance(2);
90
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.record.TransportType, " ");
91
+ i0.ɵɵadvance(4);
92
+ i0.ɵɵtextInterpolate(ctx_r1.record.ServerPluginClass);
93
+ i0.ɵɵadvance(4);
94
+ i0.ɵɵtextInterpolate(ctx_r1.record.ClientPluginClass);
95
+ i0.ɵɵadvance(2);
96
+ i0.ɵɵclassProp("active-badge--inactive", !ctx_r1.record.IsActive);
97
+ i0.ɵɵadvance();
98
+ i0.ɵɵproperty("ngClass", ctx_r1.record.IsActive ? "fa-circle-check" : "fa-circle-xmark");
99
+ i0.ɵɵadvance();
100
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.record.IsActive ? "Active" : "Inactive", " ");
101
+ i0.ɵɵadvance();
102
+ i0.ɵɵproperty("Entity", i0.ɵɵinterpolate(ctx_r1.record.EntityInfo.Name))("Record", ctx_r1.record)("FormComponent", ctx_r1)("FormContext", ctx_r1.formContext);
103
+ i0.ɵɵadvance();
104
+ i0.ɵɵproperty("Form", ctx_r1)("FormContext", ctx_r1.formContext);
105
+ i0.ɵɵadvance();
106
+ i0.ɵɵproperty("Record", ctx_r1.record)("ShowLabel", true)("EditMode", ctx_r1.EditMode)("FormContext", ctx_r1.formContext);
107
+ i0.ɵɵadvance();
108
+ i0.ɵɵproperty("Record", ctx_r1.record)("ShowLabel", true)("EditMode", ctx_r1.EditMode)("FormContext", ctx_r1.formContext);
109
+ i0.ɵɵadvance();
110
+ i0.ɵɵproperty("Record", ctx_r1.record)("ShowLabel", true)("EditMode", ctx_r1.EditMode)("FormContext", ctx_r1.formContext);
111
+ i0.ɵɵadvance();
112
+ i0.ɵɵproperty("Form", ctx_r1)("FormContext", ctx_r1.formContext);
113
+ i0.ɵɵadvance();
114
+ i0.ɵɵproperty("Record", ctx_r1.record)("ShowLabel", true)("EditMode", ctx_r1.EditMode)("FormContext", ctx_r1.formContext);
115
+ i0.ɵɵadvance();
116
+ i0.ɵɵproperty("Record", ctx_r1.record)("ShowLabel", true)("EditMode", ctx_r1.EditMode)("FormContext", ctx_r1.formContext);
117
+ i0.ɵɵadvance();
118
+ i0.ɵɵproperty("Record", ctx_r1.record)("ShowLabel", true)("EditMode", ctx_r1.EditMode)("FormContext", ctx_r1.formContext);
119
+ i0.ɵɵadvance();
120
+ i0.ɵɵproperty("Record", ctx_r1.record)("ShowLabel", true)("EditMode", ctx_r1.EditMode)("FormContext", ctx_r1.formContext);
121
+ i0.ɵɵadvance();
122
+ i0.ɵɵproperty("Form", ctx_r1)("FormContext", ctx_r1.formContext);
123
+ i0.ɵɵadvance();
124
+ i0.ɵɵproperty("Record", ctx_r1.record)("ShowLabel", true)("EditMode", ctx_r1.EditMode)("FormContext", ctx_r1.formContext);
125
+ i0.ɵɵadvance();
126
+ i0.ɵɵproperty("Record", ctx_r1.record)("ShowLabel", true)("EditMode", ctx_r1.EditMode)("FormContext", ctx_r1.formContext);
127
+ i0.ɵɵadvance();
128
+ i0.ɵɵproperty("Entity", i0.ɵɵinterpolate(ctx_r1.record.EntityInfo.Name))("Record", ctx_r1.record)("FormComponent", ctx_r1)("FormContext", ctx_r1.formContext);
129
+ i0.ɵɵadvance();
130
+ i0.ɵɵproperty("Form", ctx_r1)("FormContext", ctx_r1.formContext)("BadgeCount", ctx_r1.GetSectionRowCount("mJAIAgentSessionChannels"))("DefaultExpanded", false);
131
+ i0.ɵɵadvance();
132
+ i0.ɵɵconditional(ctx_r1.record.IsSaved ? 40 : -1);
133
+ i0.ɵɵadvance();
134
+ i0.ɵɵproperty("Entity", i0.ɵɵinterpolate(ctx_r1.record.EntityInfo.Name))("Record", ctx_r1.record)("FormComponent", ctx_r1)("FormContext", ctx_r1.formContext);
135
+ } }
136
+ /**
137
+ * Custom form for 'MJ: AI Agent Channels' — the pluggable channel-definition
138
+ * registry for realtime agent sessions. A light enhancement over the generated
139
+ * form: a clean header (channel icon, transport pill, active badge) above the
140
+ * standard generated field panels, with the ConfigSchema rendered as code.
141
+ */
142
+ let MJAIAgentChannelFormComponentExtended = class MJAIAgentChannelFormComponentExtended extends MJAIAgentChannelFormComponent {
143
+ /** Font Awesome icon for well-known channel definitions, generic plug otherwise. */
144
+ get ChannelIcon() {
145
+ switch (this.record?.Name) {
146
+ case 'VoiceAudio': return 'fa-microphone-lines';
147
+ case 'TextChat': return 'fa-comment';
148
+ case 'ClientControl': return 'fa-sliders';
149
+ case 'Whiteboard': return 'fa-chalkboard';
150
+ case 'Video': return 'fa-video';
151
+ default: return 'fa-plug';
152
+ }
153
+ }
154
+ static { this.ɵfac = /*@__PURE__*/ (() => { let ɵMJAIAgentChannelFormComponentExtended_BaseFactory; return function MJAIAgentChannelFormComponentExtended_Factory(__ngFactoryType__) { return (ɵMJAIAgentChannelFormComponentExtended_BaseFactory || (ɵMJAIAgentChannelFormComponentExtended_BaseFactory = i0.ɵɵgetInheritedFactory(MJAIAgentChannelFormComponentExtended)))(__ngFactoryType__ || MJAIAgentChannelFormComponentExtended); }; })(); }
155
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJAIAgentChannelFormComponentExtended, selectors: [["mj-ai-agent-channel-form"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [[3, "Record", "FormComponent"], [3, "Navigate", "DeleteRequested", "FavoriteToggled", "HistoryRequested", "ListManagementRequested", "Record", "FormComponent"], [1, "channel-header"], [1, "channel-header-left"], [1, "channel-icon"], [1, "fas", 3, "ngClass"], [1, "channel-info"], [1, "channel-description"], [1, "channel-meta"], [1, "transport-pill"], [1, "fas", "fa-network-wired"], ["title", "Server plugin class (resolved via ClassFactory on the server)", 1, "plugin-chip"], [1, "fas", "fa-server"], [1, "mono"], ["title", "Client plugin class (resolved via ClassFactory on the client)", 1, "plugin-chip"], [1, "fas", "fa-display"], [1, "channel-header-right"], [1, "active-badge"], ["Slot", "before-fields", 3, "Entity", "Record", "FormComponent", "FormContext"], ["SectionKey", "channelConfiguration", "SectionName", "Channel Configuration", "Icon", "fa fa-info-circle", 3, "Form", "FormContext"], ["FieldName", "Name", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "Description", "Type", "textarea", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "IsActive", "Type", "checkbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["SectionKey", "technicalImplementation", "SectionName", "Technical Implementation", "Icon", "fa fa-code", 3, "Form", "FormContext"], ["FieldName", "ServerPluginClass", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "ClientPluginClass", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "TransportType", "Type", "select", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "ConfigSchema", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["SectionKey", "systemMetadata", "SectionName", "System Metadata", "Icon", "fa fa-cog", 3, "Form", "FormContext"], ["FieldName", "__mj_CreatedAt", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "__mj_UpdatedAt", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["Slot", "after-fields", 3, "Entity", "Record", "FormComponent", "FormContext"], ["SectionKey", "mJAIAgentSessionChannels", "SectionName", "AI Agent Session Channels", "Icon", "fa fa-plug", "Variant", "related-entity", 3, "Form", "FormContext", "BadgeCount", "DefaultExpanded"], ["Slot", "after-related", 3, "Entity", "Record", "FormComponent", "FormContext"], [3, "Navigate", "AfterDataLoad", "Params", "NewRecordValues", "AllowLoad", "ShowToolbar"]], template: function MJAIAgentChannelFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
156
+ i0.ɵɵconditionalCreate(0, MJAIAgentChannelFormComponentExtended_Conditional_0_Template, 42, 75, "mj-record-form-container", 0);
157
+ } if (rf & 2) {
158
+ i0.ɵɵconditional(ctx.record ? 0 : -1);
159
+ } }, dependencies: [i1.NgClass, i2.MjFormFieldComponent, i2.MjCollapsiblePanelComponent, i2.MjRecordFormContainerComponent, i2.ExplorerEntityDataGridComponent, i2.FormPanelSlotComponent], styles: [".channel-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n margin-bottom: 16px;\n box-shadow: var(--mj-shadow-sm);\n}\n\n.channel-header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n min-width: 0;\n}\n\n.channel-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n flex-shrink: 0;\n background: var(--mj-brand-primary);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 20px;\n}\n\n.channel-info[_ngcontent-%COMP%] {\n min-width: 0;\n}\n\n.channel-info[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 22px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.channel-description[_ngcontent-%COMP%] {\n margin: 4px 0 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.channel-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-top: 10px;\n flex-wrap: wrap;\n}\n\n.transport-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 12px;\n border-radius: 14px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n}\n\n.transport-pill[data-transport=\"WebRTC\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 12%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n border-color: color-mix(in srgb, var(--mj-status-info) 25%, transparent);\n}\n\n.transport-pill[data-transport=\"WebSocket\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n}\n\n.plugin-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 12px;\n border-radius: 14px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n}\n\n.plugin-chip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 11px;\n}\n\n.mono[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n}\n\n.active-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n white-space: nowrap;\n}\n\n.active-badge--inactive[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n@media (max-width: 640px) {\n .channel-header[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n}"] }); }
160
+ };
161
+ MJAIAgentChannelFormComponentExtended = __decorate([
162
+ RegisterClass(BaseFormComponent, 'MJ: AI Agent Channels')
163
+ ], MJAIAgentChannelFormComponentExtended);
164
+ export { MJAIAgentChannelFormComponentExtended };
165
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJAIAgentChannelFormComponentExtended, [{
166
+ type: Component,
167
+ args: [{ standalone: false, selector: 'mj-ai-agent-channel-form', template: "@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <!-- Clean channel header -->\n <div class=\"channel-header\">\n <div class=\"channel-header-left\">\n <div class=\"channel-icon\">\n <i class=\"fas\" [ngClass]=\"ChannelIcon\"></i>\n </div>\n <div class=\"channel-info\">\n <h2>{{ record.Name || 'AI Agent Channel' }}</h2>\n @if (record.Description) {\n <p class=\"channel-description\">{{ record.Description }}</p>\n }\n <div class=\"channel-meta\">\n <span class=\"transport-pill\" [attr.data-transport]=\"record.TransportType\">\n <i class=\"fas fa-network-wired\"></i> {{ record.TransportType }}\n </span>\n <span class=\"plugin-chip\" title=\"Server plugin class (resolved via ClassFactory on the server)\">\n <i class=\"fas fa-server\"></i> <span class=\"mono\">{{ record.ServerPluginClass }}</span>\n </span>\n <span class=\"plugin-chip\" title=\"Client plugin class (resolved via ClassFactory on the client)\">\n <i class=\"fas fa-display\"></i> <span class=\"mono\">{{ record.ClientPluginClass }}</span>\n </span>\n </div>\n </div>\n </div>\n <div class=\"channel-header-right\">\n <span class=\"active-badge\" [class.active-badge--inactive]=\"!record.IsActive\">\n <i class=\"fas\" [ngClass]=\"record.IsActive ? 'fa-circle-check' : 'fa-circle-xmark'\"></i>\n {{ record.IsActive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n </div>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"before-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- Channel Configuration Section -->\n <mj-collapsible-panel\n SectionKey=\"channelConfiguration\"\n SectionName=\"Channel Configuration\"\n Icon=\"fa fa-info-circle\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Name\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Description\"\n Type=\"textarea\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"IsActive\"\n Type=\"checkbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Technical Implementation Section -->\n <mj-collapsible-panel\n SectionKey=\"technicalImplementation\"\n SectionName=\"Technical Implementation\"\n Icon=\"fa fa-code\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ServerPluginClass\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ClientPluginClass\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TransportType\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ConfigSchema\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- System Metadata Section -->\n <mj-collapsible-panel\n SectionKey=\"systemMetadata\"\n SectionName=\"System Metadata\"\n Icon=\"fa fa-cog\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_CreatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_UpdatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- AI Agent Session Channels (instances of this channel across sessions) -->\n <mj-collapsible-panel\n SectionKey=\"mJAIAgentSessionChannels\"\n SectionName=\"AI Agent Session Channels\"\n Icon=\"fa fa-plug\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJAIAgentSessionChannels')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: AI Agent Session Channels','ChannelID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: AI Agent Session Channels')\"\n [AllowLoad]=\"IsSectionExpanded('mJAIAgentSessionChannels')\"\n [ShowToolbar]=\"false\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJAIAgentSessionChannels', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-related\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n</mj-record-form-container>\n}\n", styles: [".channel-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n margin-bottom: 16px;\n box-shadow: var(--mj-shadow-sm);\n}\n\n.channel-header-left {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n min-width: 0;\n}\n\n.channel-icon {\n width: 48px;\n height: 48px;\n flex-shrink: 0;\n background: var(--mj-brand-primary);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 20px;\n}\n\n.channel-info {\n min-width: 0;\n}\n\n.channel-info h2 {\n margin: 0;\n font-size: 22px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.channel-description {\n margin: 4px 0 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.channel-meta {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-top: 10px;\n flex-wrap: wrap;\n}\n\n.transport-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 12px;\n border-radius: 14px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n}\n\n.transport-pill[data-transport=\"WebRTC\"] {\n background: color-mix(in srgb, var(--mj-status-info) 12%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n border-color: color-mix(in srgb, var(--mj-status-info) 25%, transparent);\n}\n\n.transport-pill[data-transport=\"WebSocket\"] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n}\n\n.plugin-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 12px;\n border-radius: 14px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n}\n\n.plugin-chip i {\n color: var(--mj-text-muted);\n font-size: 11px;\n}\n\n.mono {\n font-family: monospace;\n font-size: 12px;\n}\n\n.active-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n white-space: nowrap;\n}\n\n.active-badge--inactive {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n@media (max-width: 640px) {\n .channel-header {\n flex-direction: column;\n }\n}\n"] }]
168
+ }], null, null); })();
169
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJAIAgentChannelFormComponentExtended, { className: "MJAIAgentChannelFormComponentExtended", filePath: "src/lib/custom/AIAgentChannels/ai-agent-channel-form.component.ts", lineNumber: 20 }); })();
170
+ //# sourceMappingURL=ai-agent-channel-form.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-agent-channel-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgentChannels/ai-agent-channel-form.component.ts","../../../../src/lib/custom/AIAgentChannels/ai-agent-channel-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component } from '@angular/core';\nimport { MJAIAgentChannelEntity } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { MJAIAgentChannelFormComponent } from '../../generated/Entities/MJAIAgentChannel/mjaiagentchannel.form.component';\n\n/**\n * Custom form for 'MJ: AI Agent Channels' — the pluggable channel-definition\n * registry for realtime agent sessions. A light enhancement over the generated\n * form: a clean header (channel icon, transport pill, active badge) above the\n * standard generated field panels, with the ConfigSchema rendered as code.\n */\n@RegisterClass(BaseFormComponent, 'MJ: AI Agent Channels')\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-channel-form',\n templateUrl: './ai-agent-channel-form.component.html',\n styleUrls: ['./ai-agent-channel-form.component.css']\n})\nexport class MJAIAgentChannelFormComponentExtended extends MJAIAgentChannelFormComponent {\n public record!: MJAIAgentChannelEntity;\n\n /** Font Awesome icon for well-known channel definitions, generic plug otherwise. */\n public get ChannelIcon(): string {\n switch (this.record?.Name) {\n case 'VoiceAudio': return 'fa-microphone-lines';\n case 'TextChat': return 'fa-comment';\n case 'ClientControl': return 'fa-sliders';\n case 'Whiteboard': return 'fa-chalkboard';\n case 'Video': return 'fa-video';\n default: return 'fa-plug';\n }\n }\n}\n","@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <!-- Clean channel header -->\n <div class=\"channel-header\">\n <div class=\"channel-header-left\">\n <div class=\"channel-icon\">\n <i class=\"fas\" [ngClass]=\"ChannelIcon\"></i>\n </div>\n <div class=\"channel-info\">\n <h2>{{ record.Name || 'AI Agent Channel' }}</h2>\n @if (record.Description) {\n <p class=\"channel-description\">{{ record.Description }}</p>\n }\n <div class=\"channel-meta\">\n <span class=\"transport-pill\" [attr.data-transport]=\"record.TransportType\">\n <i class=\"fas fa-network-wired\"></i> {{ record.TransportType }}\n </span>\n <span class=\"plugin-chip\" title=\"Server plugin class (resolved via ClassFactory on the server)\">\n <i class=\"fas fa-server\"></i> <span class=\"mono\">{{ record.ServerPluginClass }}</span>\n </span>\n <span class=\"plugin-chip\" title=\"Client plugin class (resolved via ClassFactory on the client)\">\n <i class=\"fas fa-display\"></i> <span class=\"mono\">{{ record.ClientPluginClass }}</span>\n </span>\n </div>\n </div>\n </div>\n <div class=\"channel-header-right\">\n <span class=\"active-badge\" [class.active-badge--inactive]=\"!record.IsActive\">\n <i class=\"fas\" [ngClass]=\"record.IsActive ? 'fa-circle-check' : 'fa-circle-xmark'\"></i>\n {{ record.IsActive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n </div>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"before-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- Channel Configuration Section -->\n <mj-collapsible-panel\n SectionKey=\"channelConfiguration\"\n SectionName=\"Channel Configuration\"\n Icon=\"fa fa-info-circle\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Name\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Description\"\n Type=\"textarea\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"IsActive\"\n Type=\"checkbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Technical Implementation Section -->\n <mj-collapsible-panel\n SectionKey=\"technicalImplementation\"\n SectionName=\"Technical Implementation\"\n Icon=\"fa fa-code\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ServerPluginClass\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ClientPluginClass\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"TransportType\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ConfigSchema\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- System Metadata Section -->\n <mj-collapsible-panel\n SectionKey=\"systemMetadata\"\n SectionName=\"System Metadata\"\n Icon=\"fa fa-cog\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_CreatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_UpdatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- AI Agent Session Channels (instances of this channel across sessions) -->\n <mj-collapsible-panel\n SectionKey=\"mJAIAgentSessionChannels\"\n SectionName=\"AI Agent Session Channels\"\n Icon=\"fa fa-plug\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJAIAgentSessionChannels')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: AI Agent Session Channels','ChannelID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: AI Agent Session Channels')\"\n [AllowLoad]=\"IsSectionExpanded('mJAIAgentSessionChannels')\"\n [ShowToolbar]=\"false\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJAIAgentSessionChannels', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-related\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n</mj-record-form-container>\n}\n"]}
@@ -0,0 +1,133 @@
1
+ import { OnInit } from '@angular/core';
2
+ import { MJAIAgentSessionEntity } from '@memberjunction/core-entities';
3
+ import { MJAIAgentSessionFormComponent } from '../../generated/Entities/MJAIAgentSession/mjaiagentsession.form.component';
4
+ import * as i0 from "@angular/core";
5
+ /** Date values arrive as ISO strings from `ResultType: 'simple'` RunViews. */
6
+ type DateLike = Date | string;
7
+ /** Narrowed read-only row from 'MJ: AI Agent Session Channels'. */
8
+ interface SessionChannelRow {
9
+ ID: string;
10
+ ChannelID: string;
11
+ Channel: string;
12
+ Status: 'Connected' | 'Connecting' | 'Disconnected' | 'Paused';
13
+ SocketUrl: string | null;
14
+ __mj_CreatedAt: DateLike;
15
+ LastActiveAt: DateLike;
16
+ DisconnectedAt: DateLike | null;
17
+ }
18
+ /** Narrowed read-only row from 'MJ: Conversation Details' for the transcript. */
19
+ interface TranscriptRow {
20
+ ID: string;
21
+ Role: 'User' | 'AI' | 'Error';
22
+ Message: string;
23
+ Agent: string | null;
24
+ User: string | null;
25
+ __mj_CreatedAt: DateLike;
26
+ }
27
+ /** Narrowed read-only row from 'MJ: AI Prompt Runs' (the co-agent model leg). */
28
+ interface CoAgentPromptRunRow {
29
+ ID: string;
30
+ Model: string;
31
+ Status: string;
32
+ RunAt: DateLike;
33
+ CompletedAt: DateLike | null;
34
+ TokensUsed: number | null;
35
+ TokensPrompt: number | null;
36
+ TokensCompletion: number | null;
37
+ TotalCost: number | null;
38
+ }
39
+ /** A flattened node in the session run tree (depth-first order, indented by depth). */
40
+ export interface SessionRunTreeItem {
41
+ /** 'run' = AIAgentRun row, 'promptRun' = the co-agent's streaming model leg */
42
+ kind: 'run' | 'promptRun';
43
+ id: string;
44
+ entityName: string;
45
+ title: string;
46
+ subtitle: string;
47
+ status: string;
48
+ startedAt: DateLike | null;
49
+ completedAt: DateLike | null;
50
+ tokens: number | null;
51
+ cost: number | null;
52
+ depth: number;
53
+ isCoAgentRun: boolean;
54
+ }
55
+ /** Channel row decorated with its definition's transport type for display. */
56
+ export interface SessionChannelDisplayRow {
57
+ row: SessionChannelRow;
58
+ transportType: string | null;
59
+ }
60
+ /**
61
+ * Custom form for 'MJ: AI Agent Sessions' — the observability surface for
62
+ * long-lived realtime (voice) agent sessions. Mirrors the AI Agent Run form's
63
+ * visual language: header with icon / status badge / stats, config bar, and
64
+ * tabbed panes for the delegated run tree, channels, transcript, and details.
65
+ */
66
+ export declare class MJAIAgentSessionFormComponentExtended extends MJAIAgentSessionFormComponent implements OnInit {
67
+ record: MJAIAgentSessionEntity;
68
+ /** Hide the generated-section controls — this form has a fully custom layout. */
69
+ readonly ToolbarConfig: import("@memberjunction/ng-base-forms").FormToolbarConfig;
70
+ /** Sessions read best full-width, like the agent-run form. */
71
+ getDefaultFormWidthMode(): 'centered' | 'full-width';
72
+ ActiveTab: 'runs' | 'channels' | 'transcript' | 'details';
73
+ Loading: boolean;
74
+ LoadError: string | null;
75
+ RunTree: SessionRunTreeItem[];
76
+ Channels: SessionChannelDisplayRow[];
77
+ Transcript: TranscriptRow[];
78
+ DelegatedRunCount: number;
79
+ TargetAgentID: string | null;
80
+ TargetAgentName: string | null;
81
+ CoAgentPromptRun: CoAgentPromptRunRow | null;
82
+ SessionTokens: number | null;
83
+ SessionCost: number | null;
84
+ private sessionConfig;
85
+ private cachedPrettyConfig;
86
+ private navigationService;
87
+ private appManager;
88
+ ngOnInit(): Promise<void>;
89
+ /** Parses the session's Config JSON; returns an empty config on any error. */
90
+ private parseSessionConfig;
91
+ /**
92
+ * Loads everything the form shows in a single batched RunViews round trip:
93
+ * the session's run tree, its channel instances (+ channel definitions for
94
+ * transport), the transcript, and — when the Config carries observability
95
+ * ids — the co-agent prompt run and target agent name.
96
+ */
97
+ private loadSessionData;
98
+ /**
99
+ * Flattens the session's runs into a depth-first tree: root runs (no
100
+ * ParentRunID, or parent outside the session) first, children nested by
101
+ * ParentRunID. The co-agent run (Config.coAgentRunID) gets its streaming
102
+ * prompt run inserted directly beneath it as a 'promptRun' leg.
103
+ */
104
+ private buildRunTree;
105
+ private runToTreeItem;
106
+ private promptRunToTreeItem;
107
+ /**
108
+ * Session-level tokens/cost for the header stats: prefer the co-agent run's
109
+ * rollups (covers delegated children), fall back to the prompt run's
110
+ * incremental usage when the run rollups haven't been finalized yet.
111
+ */
112
+ private computeSessionUsage;
113
+ ChangeTab(tab: 'runs' | 'channels' | 'transcript' | 'details'): void;
114
+ GetStatusIcon(status: string | null): string;
115
+ GetRunStatusIcon(status: string): string;
116
+ GetChannelIcon(channelName: string | null): string;
117
+ /** Short, readable session id (first segment of the UUID). */
118
+ get ShortSessionId(): string;
119
+ /** Created → ClosedAt (terminal) or LastActiveAt (still open) duration. */
120
+ get SessionDuration(): string;
121
+ FormatDuration(start: DateLike | null, end: DateLike | null): string;
122
+ private toDate;
123
+ /** Pretty-printed session Config JSON for the Details tab (cached). */
124
+ get PrettyConfig(): string;
125
+ OpenEntityRecord(entityName: string, recordId: string | null): void;
126
+ /** Opens the linked conversation in the Chat app (same pattern as the agent-run form). */
127
+ NavigateToConversation(): void;
128
+ RefreshData(): void;
129
+ static ɵfac: i0.ɵɵFactoryDeclaration<MJAIAgentSessionFormComponentExtended, never>;
130
+ static ɵcmp: i0.ɵɵComponentDeclaration<MJAIAgentSessionFormComponentExtended, "mj-ai-agent-session-form", never, {}, {}, never, never, false, never>;
131
+ }
132
+ export {};
133
+ //# sourceMappingURL=ai-agent-session-form.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-agent-session-form.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/AIAgentSessions/ai-agent-session-form.component.ts"],"names":[],"mappings":"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"}