@memberjunction/ng-conversations 6.2.0-edge.6 → 6.2.0-edge.7

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 (131) hide show
  1. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  2. package/dist/lib/components/collection/collection-view.component.js +1 -0
  3. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  4. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +174 -2
  5. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  6. package/dist/lib/components/conversation/conversation-chat-area.component.js +1266 -443
  7. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  8. package/dist/lib/components/conversation/conversation-mode-picker.component.js +2 -2
  9. package/dist/lib/components/conversation/conversation-mode-picker.component.js.map +1 -1
  10. package/dist/lib/components/conversation/conversation-remote-browser-controller.d.ts +109 -0
  11. package/dist/lib/components/conversation/conversation-remote-browser-controller.d.ts.map +1 -0
  12. package/dist/lib/components/conversation/conversation-remote-browser-controller.js +298 -0
  13. package/dist/lib/components/conversation/conversation-remote-browser-controller.js.map +1 -0
  14. package/dist/lib/components/message/agent-handoff-card.component.d.ts +102 -0
  15. package/dist/lib/components/message/agent-handoff-card.component.d.ts.map +1 -0
  16. package/dist/lib/components/message/agent-handoff-card.component.js +439 -0
  17. package/dist/lib/components/message/agent-handoff-card.component.js.map +1 -0
  18. package/dist/lib/components/message/message-input.component.d.ts +80 -53
  19. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  20. package/dist/lib/components/message/message-input.component.js +381 -277
  21. package/dist/lib/components/message/message-input.component.js.map +1 -1
  22. package/dist/lib/components/message/message-item.component.d.ts +18 -1
  23. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  24. package/dist/lib/components/message/message-item.component.js +548 -426
  25. package/dist/lib/components/message/message-item.component.js.map +1 -1
  26. package/dist/lib/components/message/message-list.component.d.ts +8 -1
  27. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  28. package/dist/lib/components/message/message-list.component.js +40 -2
  29. package/dist/lib/components/message/message-list.component.js.map +1 -1
  30. package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.js +1 -1
  31. package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.js.map +1 -1
  32. package/dist/lib/components/realtime/media/media-channel-state.d.ts +5 -0
  33. package/dist/lib/components/realtime/media/media-channel-state.d.ts.map +1 -1
  34. package/dist/lib/components/realtime/media/media-channel-state.js +27 -1
  35. package/dist/lib/components/realtime/media/media-channel-state.js.map +1 -1
  36. package/dist/lib/components/realtime/media/media-channel.d.ts.map +1 -1
  37. package/dist/lib/components/realtime/media/media-channel.js +7 -2
  38. package/dist/lib/components/realtime/media/media-channel.js.map +1 -1
  39. package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts +19 -2
  40. package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts.map +1 -1
  41. package/dist/lib/components/realtime/media/realtime-media-surface.component.js +59 -10
  42. package/dist/lib/components/realtime/media/realtime-media-surface.component.js.map +1 -1
  43. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +17 -6
  44. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
  45. package/dist/lib/components/realtime/realtime-agent-banner.component.js +61 -27
  46. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
  47. package/dist/lib/components/realtime/realtime-composer.component.d.ts +26 -3
  48. package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -1
  49. package/dist/lib/components/realtime/realtime-composer.component.js +196 -102
  50. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
  51. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +53 -15
  52. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
  53. package/dist/lib/components/realtime/realtime-session-overlay.component.js +125 -51
  54. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
  55. package/dist/lib/components/realtime/realtime-ui-config.d.ts +9 -12
  56. package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -1
  57. package/dist/lib/components/realtime/realtime-ui-config.js +38 -18
  58. package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -1
  59. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -1
  60. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +27 -4
  61. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -1
  62. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts +8 -2
  63. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts.map +1 -1
  64. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js +51 -10
  65. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js.map +1 -1
  66. package/dist/lib/components/realtime/whiteboard/whiteboard-channel-config.d.ts +46 -0
  67. package/dist/lib/components/realtime/whiteboard/whiteboard-channel-config.d.ts.map +1 -0
  68. package/dist/lib/components/realtime/whiteboard/whiteboard-channel-config.js +64 -0
  69. package/dist/lib/components/realtime/whiteboard/whiteboard-channel-config.js.map +1 -0
  70. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +131 -9
  71. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
  72. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +347 -38
  73. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -1
  74. package/dist/lib/conversations.module.d.ts +2 -1
  75. package/dist/lib/conversations.module.d.ts.map +1 -1
  76. package/dist/lib/conversations.module.js +9 -4
  77. package/dist/lib/conversations.module.js.map +1 -1
  78. package/dist/lib/events/chat-events.d.ts +5 -4
  79. package/dist/lib/events/chat-events.d.ts.map +1 -1
  80. package/dist/lib/events/chat-events.js +2 -2
  81. package/dist/lib/events/chat-events.js.map +1 -1
  82. package/dist/lib/models/agent-turn.model.d.ts +11 -7
  83. package/dist/lib/models/agent-turn.model.d.ts.map +1 -1
  84. package/dist/lib/models/agent-turn.model.js.map +1 -1
  85. package/dist/lib/services/active-tasks.service.d.ts +5 -0
  86. package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
  87. package/dist/lib/services/active-tasks.service.js +16 -0
  88. package/dist/lib/services/active-tasks.service.js.map +1 -1
  89. package/dist/lib/services/agent-state.service.d.ts.map +1 -1
  90. package/dist/lib/services/agent-state.service.js +7 -1
  91. package/dist/lib/services/agent-state.service.js.map +1 -1
  92. package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
  93. package/dist/lib/services/artifact-permission.service.js +2 -0
  94. package/dist/lib/services/artifact-permission.service.js.map +1 -1
  95. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  96. package/dist/lib/services/artifact-state.service.js +1 -0
  97. package/dist/lib/services/artifact-state.service.js.map +1 -1
  98. package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
  99. package/dist/lib/services/collection-permission.service.js +1 -0
  100. package/dist/lib/services/collection-permission.service.js.map +1 -1
  101. package/dist/lib/services/conversation-agent.service.d.ts +1 -4
  102. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  103. package/dist/lib/services/conversation-agent.service.js +7 -45
  104. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  105. package/dist/lib/services/realtime-session-review.service.d.ts +2 -1
  106. package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -1
  107. package/dist/lib/services/realtime-session-review.service.js.map +1 -1
  108. package/dist/lib/services/search.service.d.ts.map +1 -1
  109. package/dist/lib/services/search.service.js +1 -0
  110. package/dist/lib/services/search.service.js.map +1 -1
  111. package/dist/lib/utils/agent-handoff-map.d.ts +52 -0
  112. package/dist/lib/utils/agent-handoff-map.d.ts.map +1 -0
  113. package/dist/lib/utils/agent-handoff-map.js +270 -0
  114. package/dist/lib/utils/agent-handoff-map.js.map +1 -0
  115. package/dist/lib/utils/agent-turn-routing.d.ts +62 -7
  116. package/dist/lib/utils/agent-turn-routing.d.ts.map +1 -1
  117. package/dist/lib/utils/agent-turn-routing.js +147 -6
  118. package/dist/lib/utils/agent-turn-routing.js.map +1 -1
  119. package/dist/lib/utils/decision-routing.d.ts +17 -9
  120. package/dist/lib/utils/decision-routing.d.ts.map +1 -1
  121. package/dist/lib/utils/decision-routing.js +23 -14
  122. package/dist/lib/utils/decision-routing.js.map +1 -1
  123. package/dist/lib/utils/thread-replies.d.ts +34 -0
  124. package/dist/lib/utils/thread-replies.d.ts.map +1 -0
  125. package/dist/lib/utils/thread-replies.js +49 -0
  126. package/dist/lib/utils/thread-replies.js.map +1 -0
  127. package/dist/public-api.d.ts +5 -0
  128. package/dist/public-api.d.ts.map +1 -1
  129. package/dist/public-api.js +5 -0
  130. package/dist/public-api.js.map +1 -1
  131. package/package.json +36 -36
@@ -86,7 +86,6 @@ export interface SubAgentThreading {
86
86
  * difference vs. the original.
87
87
  */
88
88
  export declare class ConversationAgentService {
89
- private mentionParser;
90
89
  private agentClientService;
91
90
  /** GraphQL AI client - retained for RunAIPrompt (intent checking) which AgentClientService doesn't wrap */
92
91
  private _aiClient;
@@ -98,7 +97,7 @@ export declare class ConversationAgentService {
98
97
  /** @deprecated Use {@link IsProcessing$}. */
99
98
  get isProcessing$(): Observable<boolean>;
100
99
  private _provider;
101
- constructor(_bootstrap: ConversationsRuntimeBootstrap, mentionParser: MentionParserService, agentClientService: AgentClientService);
100
+ constructor(_bootstrap: ConversationsRuntimeBootstrap, _mentionParser: MentionParserService, agentClientService: AgentClientService);
102
101
  /**
103
102
  * The metadata provider this service uses. When unset, falls back to Metadata.Provider.
104
103
  * Setting it re-initializes the AI client and forwards the provider to the runtime's runner.
@@ -175,8 +174,6 @@ export declare class ConversationAgentService {
175
174
  * the trunk.
176
175
  */
177
176
  FindConfigurationPresetForAgent(conversationId: string, agentId: string, branchId?: string | null): Promise<string | undefined>;
178
- /** Returns the configId this message pins for `agentId`, or null when it pins none. */
179
- private readAgentConfigFromMention;
180
177
  /**
181
178
  * Clear the session for a conversation (useful when starting a new topic)
182
179
  */
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-agent.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/conversation-agent.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversation-agent.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/conversation-agent.service.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { Injectable } from '@angular/core';
2
2
  import { LogStatusEx, Metadata, RunView } from '@memberjunction/core';
3
3
  import { GraphQLAIClient } from '@memberjunction/graphql-dataprovider';
4
4
  import { coerceFailedExecuteAgentResult } from '@memberjunction/ai-core-plus';
5
- import { AIEngineBase } from '@memberjunction/ai-engine-base';
5
+ import { AIEngineBase, FindMentionPinnedPresetID } from '@memberjunction/ai-engine-base';
6
6
  import { ConversationEngine } from '@memberjunction/core-entities';
7
7
  import { MJNotificationService } from '@memberjunction/ng-notifications';
8
8
  import { ConversationsRuntime } from '@memberjunction/conversations-runtime';
@@ -12,11 +12,6 @@ import * as i0 from "@angular/core";
12
12
  import * as i1 from "./conversations-runtime-bootstrap.service";
13
13
  import * as i2 from "./mention-parser.service";
14
14
  import * as i3 from "@memberjunction/ng-agent-client";
15
- /**
16
- * Rows the configuration-preset lookup parses before giving up. The SQL prefilter is a LIKE,
17
- * so a few candidates may not be real mention blobs; this bounds how many we inspect.
18
- */
19
- const CONFIG_PRESET_CANDIDATE_ROWS = 5;
20
15
  /**
21
16
  * Cap on artifact versions listed for the intent classifier.
22
17
  *
@@ -47,7 +42,6 @@ const MAX_AGENT_ARTIFACT_VERSIONS = 40;
47
42
  * difference vs. the original.
48
43
  */
49
44
  export class ConversationAgentService {
50
- mentionParser;
51
45
  agentClientService;
52
46
  /** GraphQL AI client - retained for RunAIPrompt (intent checking) which AgentClientService doesn't wrap */
53
47
  _aiClient = null;
@@ -61,8 +55,7 @@ export class ConversationAgentService {
61
55
  return this.IsProcessing$;
62
56
  }
63
57
  _provider = null;
64
- constructor(_bootstrap, mentionParser, agentClientService) {
65
- this.mentionParser = mentionParser;
58
+ constructor(_bootstrap, _mentionParser, agentClientService) {
66
59
  this.agentClientService = agentClientService;
67
60
  // Injecting `_bootstrap` forces the runtime's INotificationAdapter +
68
61
  // IActiveTaskTracker adapters to register before any shim method runs.
@@ -217,43 +210,11 @@ export class ConversationAgentService {
217
210
  * the trunk.
218
211
  */
219
212
  async FindConfigurationPresetForAgent(conversationId, agentId, branchId) {
220
- const pathFilter = await this.branchPathFilter(conversationId, branchId);
221
- if (pathFilter == null) {
222
- return undefined;
223
- }
224
- const rv = RunView.FromMetadataProvider(this.Provider);
225
- const result = await rv.RunView({
226
- EntityName: 'MJ: Conversation Details',
227
- ExtraFilter: `${pathFilter} AND Role='User'`
228
- + ` AND Message LIKE '%"configId"%' AND Message LIKE '%${agentId}%'`,
229
- OrderBy: 'Sequence DESC',
230
- // >1 because LIKE cannot tell a mention blob from the same id appearing elsewhere in
231
- // the prose; the parse below is authoritative and picks the newest genuine match.
232
- MaxRows: CONFIG_PRESET_CANDIDATE_ROWS,
233
- Fields: ['ID', 'Message'],
234
- ResultType: 'simple'
235
- }, this.Provider.CurrentUser ?? undefined);
236
- if (!result.Success) {
237
- console.error('Failed to resolve configuration preset:', result.ErrorMessage);
238
- return undefined;
239
- }
240
- for (const row of result.Results || []) {
241
- const configurationId = this.readAgentConfigFromMention(row.Message, agentId);
242
- if (configurationId) {
243
- LogStatusEx({ message: `\u{1F3AF} Found configuration preset from @mention: ${configurationId}`, verboseOnly: true });
244
- return configurationId;
245
- }
246
- }
247
- return undefined;
248
- }
249
- /** Returns the configId this message pins for `agentId`, or null when it pins none. */
250
- readAgentConfigFromMention(message, agentId) {
251
- if (!message) {
252
- return null;
213
+ const configurationId = await FindMentionPinnedPresetID(conversationId, agentId, branchId, this.Provider.CurrentUser ?? undefined, this.Provider);
214
+ if (configurationId) {
215
+ console.log(`\u{1F3AF} Found configuration preset from @mention: ${configurationId}`);
253
216
  }
254
- const parsed = this.mentionParser.parseMentions(message, AIEngineBase.Instance.ReadableAgents, []);
255
- const mention = parsed.agentMention;
256
- return mention?.id === agentId && mention.configurationId ? mention.configurationId : null;
217
+ return configurationId;
257
218
  }
258
219
  /**
259
220
  * Clear the session for a conversation (useful when starting a new topic)
@@ -703,6 +664,7 @@ ${compactHistory}${artifactContext}
703
664
  ExtraFilter: extraFilter,
704
665
  OrderBy: orderBy,
705
666
  MaxRows: 1,
667
+ SkipTotalRowCount: true,
706
668
  Fields: ['ID', 'ArtifactID', 'VersionNumber', 'Content'],
707
669
  ResultType: 'simple'
708
670
  }, this.Provider.CurrentUser ?? undefined);
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-agent.service.js","sourceRoot":"","sources":["../../../src/lib/services/conversation-agent.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAqB,OAAO,EAAY,MAAM,sBAAsB,CAAC;AACnG,OAAO,EAAuB,eAAe,EAAkF,MAAM,sCAAsC,CAAC;AAC5K,OAAO,EAAsD,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAClI,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EACL,kBAAkB,EAInB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAGzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAG7E,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGrE,OAAO,EACL,uBAAuB,EAExB,MAAM,iCAAiC,CAAC;;;;;AAEzC;;;GAGG;AACH,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,2BAA2B,GAAG,EAAE,CAAC;AA4DvC;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,MAAM,OAAO,wBAAwB;IAmBzB;IACA;IAnBV,2GAA2G;IACnG,SAAS,GAA2B,IAAI,CAAC;IACjD,2EAA2E;IACnE,yBAAyB,GAAmC,IAAI,CAAC;IACjE,WAAW,GAAwB,IAAI,GAAG,EAAE,CAAC;IAErD,mHAAmH;IACnG,aAAa,CAAsB;IAEnD,6CAA6C;IAC7C,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAEO,SAAS,GAA6B,IAAI,CAAC;IAEnD,YACE,UAAyC,EACjC,aAAmC,EACnC,kBAAsC;QADtC,kBAAa,GAAb,aAAa,CAAsB;QACnC,uBAAkB,GAAlB,kBAAkB,CAAoB;QAE9C,qEAAqE;QACrE,uEAAuE;QACvE,IAAI,CAAC,aAAa,GAAG,oBAAoB,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC;QAC7E,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC;IAC/C,CAAC;IACD,IAAW,QAAQ,CAAC,KAA+B;QACjD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,oBAAoB,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC7D,CAAC;IAED;;;;OAIG;IACK,kBAAkB;QACxB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,QAA+B,CAAC;YACtD,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACI,KAAK,CAAC,2BAA2B;QACtC,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,yBAAyB,CAAC;QACxC,CAAC;QACD,oHAAoH;QACpH,qCAAqC;QACrC,IAAI,YAAY,CAAC,QAAQ,CAAC,uBAAuB,IAAI,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvG,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC;gBACrE,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,SAAS;gBAC9C,QAAQ;aACT,CAAC,CAAC;YACH,IAAI,CAAC,yBAAyB,GAAG,KAAK,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,8CAA8C,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3H,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxB,qBAAqB,CAAC,QAAQ,EAAE,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAClF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,2DAA2D;IACpD,KAAK,CAAC,2BAA2B;QACtC,OAAO,IAAI,CAAC,2BAA2B,EAAE,CAAC;IAC5C,CAAC;IAED;;;;;OAKG;IACH,IAAW,4BAA4B;QACrC,OAAO,IAAI,CAAC,yBAAyB,EAAE,IAAI,IAAI,IAAI,CAAC;IACtD,CAAC;IAED;;;OAGG;IACI,0BAA0B,CAAC,aAAwC;QACxE,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,yBAAyB;YAAE,OAAO,KAAK,CAAC;QACpE,OAAO,CACL,UAAU,CAAC,IAAI,CAAC,yBAAyB,CAAC,EAAE,EAAE,aAAa,CAAC;YAC5D,IAAI,CAAC,yBAAyB,CAAC,IAAI,KAAK,aAAa,CACtD,CAAC;IACJ,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,cAAc,CAClB,cAAsB,EACtB,OAAmC,EACnC,mBAAiD,EACjD,eAA2D,EAC3D,UAA2C,EAC3C,UAA2C,EAC3C,QAAkB,EAClB,iBAA4B;IAC5B,+FAA+F;IAC/F,eAA0C;IAC1C,8FAA8F;IAC9F,gBAA8B;IAC9B,0FAA0F;IAC1F,aAA6B;QAE7B,mEAAmE;QACnE,0CAA0C;QAC1C,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACpC,MAAM,IAAI,CAAC,2BAA2B,EAAE,CAAC;QAC3C,CAAC;QACD,OAAO,oBAAoB,CAAC,QAAQ,CAAC,WAAW,CAAC,cAAc,CAAC;YAC9D,cAAc;YACd,OAAO;YACP,eAAe;YACf,UAAU;YACV,UAAU;YACV,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3D,CAAC,CAAC;IACL,CAAC;IAED,8CAA8C;IAC9C,KAAK,CAAC,cAAc,CAClB,cAAsB,EACtB,OAAmC,EACnC,mBAAiD,EACjD,eAA2D,EAC3D,UAA2C,EAC3C,UAA2C,EAC3C,QAAkB,EAClB,iBAA4B,EAC5B,eAA0C,EAC1C,gBAA8B,EAC9B,aAA6B;QAE7B,OAAO,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;IACnM,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACI,KAAK,CAAC,+BAA+B,CAC1C,cAAsB,EACtB,OAAe,EACf,QAAwB;QAGxB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACzE,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAa;YAC1C,UAAU,EAAE,0BAA0B;YACtC,WAAW,EAAE,GAAG,UAAU,kBAAkB;kBACxC,uDAAuD,OAAO,IAAI;YACtE,OAAO,EAAE,eAAe;YACxB,qFAAqF;YACrF,kFAAkF;YAClF,OAAO,EAAE,4BAA4B;YACrC,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC;YACzB,UAAU,EAAE,QAAQ;SACrB,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC;QAE3C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;YAC9E,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YACvC,MAAM,eAAe,GAAG,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9E,IAAI,eAAe,EAAE,CAAC;gBACpB,WAAW,CAAC,EAAE,OAAO,EAAE,uDAAuD,eAAe,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtH,OAAO,eAAe,CAAC;YACzB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,uFAAuF;IAC/E,0BAA0B,CAAC,OAAsB,EAAE,OAAe;QACxE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACnG,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC;QACpC,OAAO,OAAO,EAAE,EAAE,KAAK,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7F,CAAC;IAGD;;OAEG;IACH,YAAY,CAAC,cAAsB;QACjC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAC1C,CAAC;IAED,4CAA4C;IAC5C,YAAY,CAAC,cAAsB;QACjC,OAAO,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACK,sBAAsB,CAAC,KAA8B,EAAE,iBAA2B;QACxF,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACzF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CACvB,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,iBAAiB,CAC9F,CAAC;QACF,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,KAAK,MAAM;YAC3C,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,wBAAwB;YACvC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,mBAAmB,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;QACzF,qBAAqB,CAAC,QAAQ,EAAE,wBAAwB,CACtD,GAAG,MAAM,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,8BAA8B,EAC7D,SAAS,EACT,IAAI,CACL,CAAC;IACJ,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,cAAc,CAClB,SAAiB,EACjB,cAAsB,EACtB,OAAmC,EACnC,mBAAiD,EACjD,SAAiB,EACjB,eAA2D,EAC3D,OAAwC,EACxC,UAA2C,EAC3C,gBAAyB,EACzB,uBAAgC,EAChC,0BAAmC,EACnC,UAA2C,EAC3C,QAAkB,EAClB,iBAA4B;IAC5B,8FAA8F;IAC9F,gBAA8B;IAC9B,wFAAwF;IACxF,SAAoC;QAEpC,IAAI,CAAC;YACH,oCAAoC;YACpC,MAAM,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAE1C,yBAAyB;YACzB,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;YAEnF,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBACxB,MAAM,QAAQ,GAAG,cAAc,SAAS,aAAa,CAAC;gBACtD,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,CAAC;gBAC5B,qBAAqB,CAAC,QAAQ,EAAE,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;gBAClF,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IAAI,iBAAiB,EAAE,MAAM,EAAE,CAAC;gBAC9B,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;YACxD,CAAC;YAED,WAAW,CAAC;gBACV,OAAO,EAAE,uBAAuB,SAAS,EAAE;gBAC3C,WAAW,EAAE,IAAI;gBACjB,cAAc,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC,0BAA0B,EAAE,CAAC;aACtG,CAAC,CAAC;YAEH,kEAAkE;YAClE,IAAI,iBAAiB,GAAuB,SAAS,CAAC;YACtD,IAAI,0BAA0B,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,4BAA4B,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBACpF,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,0BAA0B,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,iBAAiB,EAAE,0BAA0B,CAAC,CAAC,CAAC;gBAE9I,IAAI,MAAM,EAAE,CAAC;oBACX,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,SAAS,CAAC;oBAC1D,WAAW,CAAC,EAAE,OAAO,EAAE,sCAAsC,MAAM,CAAC,IAAI,2BAA2B,iBAAiB,IAAI,SAAS,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5J,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,8BAA8B,0BAA0B,wBAAwB,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3G,CAAC;YACH,CAAC;YAED,MAAM,WAAW,GAAyC;gBACxD,aAAa,EAAE,OAAO,CAAC,EAAE;gBACzB,UAAU,EAAE,eAAe;gBAC3B,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/E,GAAG,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,SAAS,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9F,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/E,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,kBAAkB,EAAE,EAAE;gBACtB,IAAI,EAAE;oBACJ,cAAc,EAAE,cAAc;oBAC9B,eAAe,EAAE,OAAO,CAAC,EAAE;oBAC3B,gBAAgB,EAAE,SAAS;oBAC3B,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACtC;gBACD,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9E,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,eAAe,EAAE,IAAI;gBACrB,kBAAkB,EAAE,IAAI;gBACxB,gBAAgB,EAAE,gBAAgB;gBAClC,uBAAuB,EAAE,uBAAuB;gBAChD,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACpC,UAAU,CAAC;wBACT,IAAI,EAAE,QAAQ,CAAC,WAAwJ;wBACvK,UAAU,EAAE,QAAQ,CAAC,UAAU;wBAC/B,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;qBAC5B,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC,CAAC,SAAS;aACd,CAAC;YAEF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,8BAA8B,CAAC,WAAW,CAAC,CAAC;YAE5F,IAAI,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBAC1C,OAAO,SAAS,CAAC,MAA4B,CAAC;YAChD,CAAC;YAED,MAAM,MAAM,GAAG,8BAA8B,CAC3C,SAAS,CAAC,MAA+C,EACzD,SAAS,CAAC,YAAY,IAAI,cAAc,SAAS,UAAU,CAC5D,CAAC;YACF,MAAM,QAAQ,GAAG,cAAc,SAAS,aAAa,MAAM,CAAC,YAAY,EAAE,CAAC;YAC3E,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxB,qBAAqB,CAAC,QAAQ,EAAE,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAClF,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,6BAA6B,SAAS,KAAK,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACxH,OAAO,CAAC,KAAK,CAAC,6BAA6B,SAAS,IAAI,EAAE,KAAK,CAAC,CAAC;YACjE,qBAAqB,CAAC,QAAQ,EAAE,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAClF,OAAO,8BAA8B,CAAqB,SAAS,EAAE,QAAQ,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,KAAK,CAAC,cAAc,CAClB,SAAiB,EACjB,cAAsB,EACtB,OAAmC,EACnC,mBAAiD,EACjD,SAAiB,EACjB,eAA2D,EAC3D,OAAwC,EACxC,UAA2C,EAC3C,gBAAyB,EACzB,uBAAgC,EAChC,0BAAmC,EACnC,UAA2C,EAC3C,QAAkB,EAClB,iBAA4B,EAC5B,gBAA8B,EAC9B,SAAoC;QAEpC,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;IACpR,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,0BAA0B,CAC9B,cAAsB,EACtB,OAAe,EACf,aAAqB,EACrB,mBAAiD,EACjD,QAAwB;QAExB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;YACjF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,2BAA2B,EAAE,CAAC;QACxE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC;YACvF,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;gBAC5E,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,oCAAoC,EAAE,CAAC;YACjF,CAAC;YAED,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;YACxF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;gBAClE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAAC;YACvE,CAAC;YAED,qFAAqF;YACrF,sFAAsF;YACtF,mEAAmE;YACnE,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEtG,MAAM,aAAa,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACrD,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBACpD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC;gBAClE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;gBAClC,OAAO,GAAG,GAAG,GAAG,CAAC,KAAK,IAAI,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACjG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,IAAI,eAAe,GAAG,EAAE,CAAC;YACzB,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,eAAe,GAAG,kDAAkD,CAAC;gBACrE,cAAc,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;oBACvC,eAAe,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,QAAQ,CAAC,YAAY,KAAK,QAAQ,CAAC,YAAY,KAAK,CAAC;oBACvF,eAAe,IAAI,kBAAkB,QAAQ,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC;oBAClE,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACjC,eAAe,IAAI,iBAAiB,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;wBACzE,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;4BACrC,eAAe,IAAI,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;wBAC9D,CAAC;wBACD,eAAe,IAAI,IAAI,CAAC;oBAC1B,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YAED,MAAM,WAAW,GAAG,uBAAuB,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,WAAW,IAAI,gBAAgB;;iCAErE,aAAa,CAAC,MAAM;EACnD,cAAc,GAAG,eAAe;;4BAEN,aAAa,GAAG,CAAC;YAEvC,WAAW,CAAC;gBACV,OAAO,EAAE,wCAAwC;gBACjD,WAAW,EAAE,IAAI;gBACjB,cAAc,EAAE,CAAC;wBACf,SAAS,EAAE,KAAK,CAAC,IAAI;wBACrB,cAAc,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;wBAC9C,aAAa,EAAE,cAAc,CAAC,MAAM;qBACrC,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;gBAC9C,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;gBAClD,IAAI,EAAE;oBACJ,gBAAgB,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC;oBAC3C,cAAc,EAAE,cAAc;iBAC/B;aACF,CAAC,CAAC;YAEH,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvE,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY;oBAChC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAErD,IAAI,MAAM,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;oBACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;oBACpD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,uBAAuB,CAAC;oBAC9D,MAAM,uBAAuB,GAAG,MAAM,CAAC,uBAAuB,IAAI,SAAS,CAAC;oBAE5E,WAAW,CAAC;wBACV,OAAO,EAAE,0BAA0B,QAAQ,EAAE;wBAC7C,WAAW,EAAE,IAAI;wBACjB,cAAc,EAAE,CAAC;gCACf,SAAS;gCACT,uBAAuB;gCACvB,OAAO,EAAE,MAAM,CAAC,eAAe,IAAI,SAAS;6BAC7C,CAAC;qBACH,CAAC,CAAC;oBAEH,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;wBACrE,OAAO;4BACL,QAAQ,EAAE,QAAmC;4BAC7C,SAAS;4BACT,uBAAuB;yBACxB,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;YACxF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,yCAAyC,EAAE,CAAC;QACtF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAC;YAClE,OAAO;gBACL,QAAQ,EAAE,QAAQ;gBAClB,SAAS,EAAE,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;aAClG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,KAAK,CAAC,0BAA0B,CAC9B,cAAsB,EACtB,OAAe,EACf,aAAqB,EACrB,mBAAiD,EACjD,QAAwB;QAExB,OAAO,IAAI,CAAC,0BAA0B,CAAC,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;IAChH,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,WAAW,CAAC,MAAyB;QAChD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,2BAA2B,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACpF,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,kBAAkB,CAC7B,cAAsB,EACtB,OAAe,EACf,WAAyB,EACzB,QAAwB;QAExB,OAAO,IAAI,CAAC,qBAAqB,CAAC,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACpF,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACK,KAAK,CAAC,qBAAqB,CACjC,cAAsB,EACtB,OAAe,EACf,WAAyB,EACzB,QAAwB;QAGxB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC1G,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC,CAAoB,iDAAiD;QACjF,CAAC;QAED,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,OAAO,CAAa;YACjD,UAAU,EAAE,uBAAuB;YACnC,WAAW,EAAE,aAAa;YAC1B,OAAO,EAAE,qBAAqB;YAC9B,OAAO,EAAE,2BAA2B;YACpC,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,CAAC;YACrD,UAAU,EAAE,QAAQ;SACrB,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC;QAE3C,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;YACrF,OAAO,EAAE,CAAC,CAAoB,iDAAiD;QACjF,CAAC;QACD,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,IAAI,EAAE,CAAC;QAC7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAChD,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAC9C,CAAC;QACF,OAAO,uBAAuB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC1D,CAAC;IAED,kEAAkE;IAC1D,KAAK,CAAC,iBAAiB,CAC7B,WAAqB;QAIrB,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAc;YAC3C,UAAU,EAAE,eAAe;YAC3B,WAAW,EAAE,UAAU,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;YACpE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC;YAC9B,UAAU,EAAE,QAAQ;SACrB,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC;QAE3C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;YACtE,OAAO,IAAI,GAAG,EAAuB,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACI,KAAK,CAAC,4BAA4B,CACvC,cAAsB,EACtB,OAAe,EACf,WAAyB,EACzB,QAAwB;QAExB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC1G,OAAO,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjG,CAAC;IAED;;;;;;;;;OASG;IACK,KAAK,CAAC,wBAAwB,CACpC,cAAsB,EACtB,OAAe,EACf,WAAyB,EACzB,QAAwB;QAExB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC1F,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,eAAe,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3E,OAAO;;gEAEqD,SAAS;QACjE,CAAC;IACP,CAAC;IAED;;;;;;;;;OASG;IACK,KAAK,CAAC,aAAa,CACzB,cAAsB,EACtB,OAAe,EACf,WAAyB,EACzB,QAAwB;QAExB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACzE,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,kBAAkB,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAyC;YACtE,UAAU,EAAE,0BAA0B;YACtC,WAAW,EAAE,GAAG,kBAAkB,CAAC,cAAc,CAAC,UAAU,CAAC,iBAAiB,eAAe,CAAC,OAAO,CAAC,GAAG;gBACvG,uCAAuC,KAAK,EAAE;YAChD,MAAM,EAAE,CAAC,IAAI,CAAC;YACd,UAAU,EAAE,QAAQ;YACpB,aAAa,EAAE,IAAI;SACpB,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC;QAE3C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;YACpE,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;IAED;;;;;;;;;OASG;IACK,KAAK,CAAC,gBAAgB,CAAC,cAAsB,EAAE,QAAmC;QACxF,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,SAAS,CAAC;YACpD,OAAO,MAAM,kBAAkB,CAAC,qBAAqB,CAAC,cAAc,EAAE,QAAQ,EAAE,IAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,QAAQ,oBAAoB,cAAc,GAAG,EAAE,KAAK,CAAC,CAAC;YAC1G,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,uBAAuB,CAAC,SAAiB;QACpD,OAAO,IAAI,CAAC,qBAAqB,CAAC,OAAO,SAAS,GAAG,EAAE,SAAS,CAAC,CAAC;IACpE,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,qBAAqB,CACjC,WAAmB,EACnB,OAA2B;QAI3B,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAa;YAC1C,UAAU,EAAE,uBAAuB;YACnC,WAAW,EAAE,WAAW;YACxB,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,eAAe,EAAE,SAAS,CAAC;YACxD,UAAU,EAAE,QAAQ;SACrB,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC;QAE3C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;YAC9E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,SAAS,EAAE,GAAG,CAAC,EAAE;YACjB,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,OAAO,EAAE,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC;SAC3C,CAAC;IACJ,CAAC;kHAh1BU,wBAAwB;gEAAxB,wBAAwB,WAAxB,wBAAwB,mBAFvB,MAAM;;iFAEP,wBAAwB;cAHpC,UAAU;eAAC;gBACV,UAAU,EAAE,MAAM;aACnB;;AAq1BD;;;;;;;;GAQG;AACH,SAAS,oBAAoB,CAAC,OAAkC;IAC9D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,iDAAiD,EAAE,KAAK,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,yFAAyF;AACzF,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC","sourcesContent":["import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { LogStatusEx, Metadata, IMetadataProvider, RunView, UserInfo } from '@memberjunction/core';\nimport { GraphQLDataProvider, GraphQLAIClient, type RunDecisionParams, type RunDecisionResult, type AgentReplyAcknowledgement } from '@memberjunction/graphql-dataprovider';\nimport { ExecuteAgentResult, AgentExecutionProgressCallback, coerceFailedExecuteAgentResult } from '@memberjunction/ai-core-plus';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport {\n ConversationEngine,\n MJConversationDetailEntity,\n MJArtifactVersionEntity,\n MJArtifactEntity\n} from '@memberjunction/core-entities';\nimport { MJAIAgentEntityExtended, MJAIAgentRunEntityExtended } from '@memberjunction/ai-core-plus';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { AgentClientService } from '@memberjunction/ng-agent-client';\nimport { RunAgentFromConversationDetailParams } from '@memberjunction/ai-agent-client';\nimport { ConversationsRuntime } from '@memberjunction/conversations-runtime';\nimport { LazyArtifactInfo } from '../models/lazy-artifact-info';\nimport { MentionParserService } from './mention-parser.service';\nimport { EscapeSQLString, UUIDsEqual } from '@memberjunction/global';\n\nimport { ConversationsRuntimeBootstrap } from './conversations-runtime-bootstrap.service';\nimport {\n GroupVersionsByArtifact,\n type AgentArtifactSummary\n} from '../utils/agent-artifact-summary';\n\n/**\n * Rows the configuration-preset lookup parses before giving up. The SQL prefilter is a LIKE,\n * so a few candidates may not be real mention blobs; this bounds how many we inspect.\n */\nconst CONFIG_PRESET_CANDIDATE_ROWS = 5;\n\n/**\n * Cap on artifact versions listed for the intent classifier.\n *\n * The block is a hint, not a record: the prompt prints a name, a type, a version count and\n * the latest version per artifact. Newest-first ordering means the cap only ever trims the\n * oldest versions of the busiest artifacts, which are the least useful lines in it.\n */\nconst MAX_AGENT_ARTIFACT_VERSIONS = 40;\n\n/**\n * Context for artifact lookups — pre-loaded conversation data.\n *\n * NO LONGER CONSUMED by this service. Both readers were converted to queries when transcript\n * windowing made these maps a partial view: they are keyed to the loaded window, so any\n * lookup for an older row silently missed. Retained as an exported type for API\n * compatibility; new code should not build one.\n */\nexport interface ArtifactLookupContext {\n agentRunsByDetailId: Map<string, MJAIAgentRunEntityExtended>;\n artifactsByDetailId: Map<string, LazyArtifactInfo[]>;\n}\n\n/**\n * An agent's prior OUTPUT artifact, resolved for payload continuity.\n *\n * `payload` is the parsed `ArtifactVersion.Content`, typed to match what actually consumes it\n * — `executeAgentContinuation` and `invokeSubAgent` both take `Record<string, unknown> | null`.\n * It is null when the version carried no content, the content did not parse, or the content\n * parsed to something that is not a JSON object; callers treat all three the same as \"no prior\n * artifact\", which is already a legal agent input.\n */\nexport interface AgentPayloadSource {\n artifactId: string;\n versionId: string;\n versionNumber: number;\n payload: Record<string, unknown> | null;\n}\n\n/**\n * Result from intent check - indicates whether to continue with agent\n * and which artifact version to use as payload\n */\nexport interface IntentCheckResult {\n decision: 'YES' | 'NO' | 'UNSURE';\n reasoning: string;\n targetArtifactVersionId?: string;\n}\n\n/**\n * Where a sub-agent's reply sits in the conversation. The server sets it (only the server writes agent replies), from\n * these checked inputs.\n */\nexport interface SubAgentThreading {\n /** The message the reply threads under, when not the user's message (a delegate's reply sits under the manager's). */\n ReplyParentId?: string | null;\n /**\n * An agent (the conversation manager) whose line \"Continuing with **{agent}** for refinement...\" the server posts\n * before the reply; the reply threads under it.\n */\n AnnouncedByAgentId?: string | null;\n /**\n * The branch the turn runs on when it forks off an earlier message on another branch (such as Regenerate, which\n * creates a new fork before running the agent while the user's message stays on its original branch).\n */\n ReplyBranchId?: string | null;\n}\n\n/**\n * Angular DI service for conversation-level agent orchestration.\n *\n * After PR 2 of the conversations-runtime extraction, the core\n * `processMessage` flow and the conversation-manager-agent resolution are\n * delegated to `@memberjunction/conversations-runtime`. This service is\n * primarily a shim for those operations PLUS the holder of the helpers\n * that haven't been ported yet:\n *\n * - `invokeSubAgent(...)` — used by Sage's routing decisions in\n * `message-input.component`.\n * - `checkAgentContinuityIntent(...)` — fast intent classification when the\n * user replies to a previous-agent thread.\n * - `FindConfigurationPresetForAgent(...)` — locates an agent's preset\n * from prior @mentions in the conversation.\n * - `clearSession(...)` — per-conversation session-id bookkeeping.\n *\n * These can move to the runtime in a follow-up; they aren't strictly needed\n * to invoke an agent end-to-end and stay here so the shim has zero behavior\n * difference vs. the original.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ConversationAgentService {\n /** GraphQL AI client - retained for RunAIPrompt (intent checking) which AgentClientService doesn't wrap */\n private _aiClient: GraphQLAIClient | null = null;\n /** Cached resolution of the conversation manager agent (default agent). */\n private _conversationManagerAgent: MJAIAgentEntityExtended | null = null;\n private _sessionIds: Map<string, string> = new Map();\n\n /** Observable indicating if the ambient agent is currently processing — delegated to the runtime's AgentRunner. */\n public readonly IsProcessing$: Observable<boolean>;\n\n /** @deprecated Use {@link IsProcessing$}. */\n public get isProcessing$(): Observable<boolean> {\n return this.IsProcessing$;\n }\n\n private _provider: IMetadataProvider | null = null;\n\n constructor(\n _bootstrap: ConversationsRuntimeBootstrap,\n private mentionParser: MentionParserService,\n private agentClientService: AgentClientService\n ) {\n // Injecting `_bootstrap` forces the runtime's INotificationAdapter +\n // IActiveTaskTracker adapters to register before any shim method runs.\n this.IsProcessing$ = ConversationsRuntime.Instance.AgentRunner.isProcessing$;\n this.initializeAIClient();\n }\n\n /**\n * The metadata provider this service uses. When unset, falls back to Metadata.Provider.\n * Setting it re-initializes the AI client and forwards the provider to the runtime's runner.\n */\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n this.initializeAIClient();\n ConversationsRuntime.Instance.AgentRunner.Provider = value;\n }\n\n /**\n * Initialize the GraphQL AI Client.\n * Retained for RunAIPrompt calls (intent checking) which the AgentClientService doesn't wrap.\n * Agent execution (RunAIAgentFromConversationDetail) now goes through ConversationsRuntime.AgentRunner.\n */\n private initializeAIClient(): void {\n try {\n const provider = this.Provider as GraphQLDataProvider;\n if (provider) {\n this._aiClient = new GraphQLAIClient(provider);\n } else {\n console.warn('GraphQLDataProvider not available, agent functionality will be limited');\n }\n } catch (error) {\n console.error('Failed to initialize GraphQL AI Client:', error);\n }\n }\n\n /**\n * Resolve the conversation manager agent via the runtime's 4-step\n * DefaultAgentResolver chain (explicit input → app-scoped Application\n * Setting → global Application Setting → code-const Sage fallback). The\n * result is cached on this service for use by the synchronous\n * {@link ConversationManagerAgentName} getter.\n *\n * Existing callers expect a Promise<MJAIAgentEntityExtended | null> — we\n * preserve that shape (returning null on failure rather than throwing)\n * so the call sites don't need to change.\n */\n public async GetConversationManagerAgent(): Promise<MJAIAgentEntityExtended | null> {\n if (this._conversationManagerAgent) {\n return this._conversationManagerAgent;\n }\n // A user who may not read the agents has no manager agent to resolve: say nothing, rather than an error for a state\n // that is theirs by design (MJ#5240)\n if (AIEngineBase.Instance.IsPermissionConstrained && AIEngineBase.Instance.ReadableAgents.length === 0) {\n return null;\n }\n\n try {\n const provider = this.Provider;\n const agent = await ConversationsRuntime.Instance.DefaultAgent.resolve({\n contextUser: provider.CurrentUser ?? undefined,\n provider,\n });\n this._conversationManagerAgent = agent;\n return agent;\n } catch (error) {\n const errorMsg = 'Error resolving conversation manager agent: ' + (error instanceof Error ? error.message : String(error));\n console.error(errorMsg);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'error', 5000);\n return null;\n }\n }\n\n /** @deprecated Use {@link GetConversationManagerAgent}. */\n public async getConversationManagerAgent(): Promise<MJAIAgentEntityExtended | null> {\n return this.GetConversationManagerAgent();\n }\n\n /**\n * Synchronous read of the cached conversation-manager-agent name. Returns\n * `null` until {@link getConversationManagerAgent} has been called at least\n * once and resolved successfully. Used by `MessageItemComponent.isConversationManager`\n * to flag messages from the routing agent without hardcoding `'Sage'`.\n */\n public get ConversationManagerAgentName(): string | null {\n return this._conversationManagerAgent?.Name ?? null;\n }\n\n /**\n * Returns `true` if the supplied agent identifier (UUID or name) matches the\n * currently cached conversation manager agent. Robust to either input.\n */\n public IsConversationManagerAgent(agentIdOrName: string | null | undefined): boolean {\n if (!agentIdOrName || !this._conversationManagerAgent) return false;\n return (\n UUIDsEqual(this._conversationManagerAgent.ID, agentIdOrName) ||\n this._conversationManagerAgent.Name === agentIdOrName\n );\n }\n\n /**\n * Process a message through the conversation manager agent. Delegates to\n * `ConversationsRuntime.Instance.AgentRunner.processMessage(...)`.\n *\n * The unused `conversationHistory` parameter is kept for backwards compatibility (it was already\n * documented as \"kept for backwards compatibility but not used\" in the original).\n *\n * @param onReplyAccepted Called with the reply row the server creates for the turn (only the server\n * writes agent replies), before any progress: key the turn's task and completion by its ID.\n */\n async ProcessMessage(\n conversationId: string,\n message: MJConversationDetailEntity,\n conversationHistory: MJConversationDetailEntity[],\n onReplyAccepted: (reply: AgentReplyAcknowledgement) => void,\n onProgress?: AgentExecutionProgressCallback,\n appContext?: Record<string, unknown> | null,\n planMode?: boolean,\n requestedSkillIDs?: string[],\n /** The agents the conversation manager may delegate to. Null or omitted allows every agent. */\n allowedAgentIDs?: readonly string[] | null,\n /** The first moment of the conversation the run may read. Null or omitted reads all of it. */\n agentHistoryFrom?: Date | null,\n /** The branch the turn runs on when it forks off an earlier message on another branch. */\n replyBranchId?: string | null\n ): Promise<ExecuteAgentResult | null> {\n // Warm the cached default-agent name for any synchronous consumers\n // before the runtime resolves on its own.\n if (!this._conversationManagerAgent) {\n await this.GetConversationManagerAgent();\n }\n return ConversationsRuntime.Instance.AgentRunner.processMessage({\n conversationId,\n message,\n onReplyAccepted,\n appContext,\n onProgress,\n ...(planMode ? { planMode: true } : {}),\n ...(requestedSkillIDs?.length ? { requestedSkillIDs } : {}),\n ...(allowedAgentIDs != null ? { AllowedAgentIDs: allowedAgentIDs } : {}),\n ...(agentHistoryFrom ? { AgentHistoryFrom: agentHistoryFrom } : {}),\n ...(replyBranchId ? { ReplyBranchID: replyBranchId } : {}),\n });\n }\n\n /** @deprecated Use {@link ProcessMessage}. */\n async processMessage(\n conversationId: string,\n message: MJConversationDetailEntity,\n conversationHistory: MJConversationDetailEntity[],\n onReplyAccepted: (reply: AgentReplyAcknowledgement) => void,\n onProgress?: AgentExecutionProgressCallback,\n appContext?: Record<string, unknown> | null,\n planMode?: boolean,\n requestedSkillIDs?: string[],\n allowedAgentIDs?: readonly string[] | null,\n agentHistoryFrom?: Date | null,\n replyBranchId?: string | null\n ): Promise<ExecuteAgentResult | null> {\n return this.ProcessMessage(conversationId, message, conversationHistory, onReplyAccepted, onProgress, appContext, planMode, requestedSkillIDs, allowedAgentIDs, agentHistoryFrom, replyBranchId);\n }\n\n /**\n * Configuration preset an agent was pinned to by a previous `@mention` in this conversation.\n *\n * Resolved by QUERY, not by scanning the display array. The pinning `@mention` is normally\n * the FIRST message of an exchange and everything after it is follow-up, so it is the\n * message most likely to fall below the loaded transcript window — and `undefined` is a\n * legal value for `configurationPresetId`, so the miss is silent. The visible consequence\n * is a run executed under the default configuration (a different model tier) instead of the\n * one the user explicitly chose, with a plausible-looking result and no error.\n *\n * There is no column to filter on: the preset lives inside the message body as a JSON\n * mention blob (`@{\"type\":\"agent\",\"id\":\"…\",\"configId\":\"…\"}`). So SQL narrows and the parser\n * decides — both `configId` and the agent id appear verbatim in that blob, which makes the\n * two LIKEs a tight prefilter, and `parseMentions` is what actually confirms a match.\n *\n * @param branchId The active branch. Only messages on its path count; null or omitted reads\n * the trunk.\n */\n public async FindConfigurationPresetForAgent(\n conversationId: string,\n agentId: string,\n branchId?: string | null\n ): Promise<string | undefined> {\n type MentionRow = Pick<MJConversationDetailEntity, 'ID' | 'Message'>;\n const pathFilter = await this.branchPathFilter(conversationId, branchId);\n if (pathFilter == null) {\n return undefined;\n }\n\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<MentionRow>({\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: `${pathFilter} AND Role='User'`\n + ` AND Message LIKE '%\"configId\"%' AND Message LIKE '%${agentId}%'`,\n OrderBy: 'Sequence DESC',\n // >1 because LIKE cannot tell a mention blob from the same id appearing elsewhere in\n // the prose; the parse below is authoritative and picks the newest genuine match.\n MaxRows: CONFIG_PRESET_CANDIDATE_ROWS,\n Fields: ['ID', 'Message'],\n ResultType: 'simple'\n }, this.Provider.CurrentUser ?? undefined);\n\n if (!result.Success) {\n console.error('Failed to resolve configuration preset:', result.ErrorMessage);\n return undefined;\n }\n\n for (const row of result.Results || []) {\n const configurationId = this.readAgentConfigFromMention(row.Message, agentId);\n if (configurationId) {\n LogStatusEx({ message: `\\u{1F3AF} Found configuration preset from @mention: ${configurationId}`, verboseOnly: true });\n return configurationId;\n }\n }\n return undefined;\n }\n\n /** Returns the configId this message pins for `agentId`, or null when it pins none. */\n private readAgentConfigFromMention(message: string | null, agentId: string): string | null {\n if (!message) {\n return null;\n }\n const parsed = this.mentionParser.parseMentions(message, AIEngineBase.Instance.ReadableAgents, []);\n const mention = parsed.agentMention;\n return mention?.id === agentId && mention.configurationId ? mention.configurationId : null;\n }\n\n\n /**\n * Clear the session for a conversation (useful when starting a new topic)\n */\n ClearSession(conversationId: string): void {\n this._sessionIds.delete(conversationId);\n }\n\n /** @deprecated Use {@link ClearSession}. */\n clearSession(conversationId: string): void {\n return this.ClearSession(conversationId);\n }\n\n /**\n * Surfaces a warning toast when the user requested skills (via /skill mentions) that the\n * target agent cannot activate — the server drops such requests, and without this the\n * refusal is invisible to the user. Client-side check uses the agent gate only (the server\n * additionally intersects with the user's Run permission).\n */\n private warnOnUnacceptedSkills(agent: MJAIAgentEntityExtended, requestedSkillIDs: string[]): void {\n const allowed = AIEngineBase.Instance.GetSkillsForAgent(agent);\n const dropped = requestedSkillIDs.filter(id => !allowed.some(s => UUIDsEqual(s.ID, id)));\n if (dropped.length === 0) return;\n const names = dropped.map(\n id => AIEngineBase.Instance.Skills.find(s => UUIDsEqual(s.ID, id))?.Name ?? 'requested skill'\n );\n const reason = agent.AcceptsSkills === 'None'\n ? `${agent.Name} doesn't accept skills`\n : `${agent.Name} can't activate ${names.length === 1 ? 'this skill' : 'these skills'}`;\n MJNotificationService.Instance?.CreateSimpleNotification(\n `${reason} — ${names.join(', ')} won't be used for this run.`,\n 'warning',\n 6000\n );\n }\n\n /**\n * Invoke a sub-agent based on Sage Agent's payload.\n * This is called when Sage decides to delegate to a specialist agent.\n *\n * Stays on the Angular shim because it directly uses AgentClientService.\n * Could move to the runtime in a follow-up if needed.\n *\n * @param onReplyAccepted Called with the reply row the server creates for the run (only the server\n * writes agent replies), before any progress: key the run's task and completion by its ID.\n */\n async InvokeSubAgent(\n agentName: string,\n conversationId: string,\n message: MJConversationDetailEntity,\n conversationHistory: MJConversationDetailEntity[],\n reasoning: string,\n onReplyAccepted: (reply: AgentReplyAcknowledgement) => void,\n payload?: Record<string, unknown> | null,\n onProgress?: AgentExecutionProgressCallback,\n sourceArtifactId?: string,\n sourceArtifactVersionId?: string,\n agentConfigurationPresetId?: string,\n appContext?: Record<string, unknown> | null,\n planMode?: boolean,\n requestedSkillIDs?: string[],\n /** The first moment of the conversation the run may read. Null or omitted reads all of it. */\n agentHistoryFrom?: Date | null,\n /** Where the reply sits in the conversation. Omitted, it answers `message` directly. */\n threading?: SubAgentThreading | null\n ): Promise<ExecuteAgentResult | null> {\n try {\n // Ensure AIEngineBase is configured\n await AIEngineBase.Instance.Config(false);\n\n // Find the agent by name\n const agent = AIEngineBase.Instance.ReadableAgents.find(a => a.Name === agentName);\n\n if (!agent || !agent.ID) {\n const errorMsg = `Sub-agent \"${agentName}\" not found`;\n console.warn(`${errorMsg}`);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'error', 5000);\n return null;\n }\n\n if (requestedSkillIDs?.length) {\n this.warnOnUnacceptedSkills(agent, requestedSkillIDs);\n }\n\n LogStatusEx({\n message: `Invoking sub-agent: ${agentName}`,\n verboseOnly: true,\n additionalArgs: [{ reasoning, hasPayload: !!payload, hasConfigPreset: !!agentConfigurationPresetId }]\n });\n\n // Map AIAgentConfiguration preset ID to actual AIConfiguration ID\n let aiConfigurationId: string | undefined = undefined;\n if (agentConfigurationPresetId) {\n const presets = AIEngineBase.Instance.GetAgentConfigurationPresets(agent.ID, false);\n const preset = presets.find(p => UUIDsEqual(p.ID, agentConfigurationPresetId) || UUIDsEqual(p.AIConfigurationID, agentConfigurationPresetId));\n\n if (preset) {\n aiConfigurationId = preset.AIConfigurationID || undefined;\n LogStatusEx({ message: `Mapped agent configuration preset \"${preset.Name}\" to AIConfigurationID: ${aiConfigurationId || 'default'}`, verboseOnly: true });\n } else {\n console.warn(`Agent configuration preset ${agentConfigurationPresetId} not found for agent ${agent.ID}`);\n }\n }\n\n const agentParams: RunAgentFromConversationDetailParams = {\n UserMessageId: message.ID,\n OnAccepted: onReplyAccepted,\n ...(threading?.ReplyParentId ? { ReplyParentId: threading.ReplyParentId } : {}),\n ...(threading?.AnnouncedByAgentId ? { AnnouncedByAgentId: threading.AnnouncedByAgentId } : {}),\n ...(threading?.ReplyBranchId ? { ReplyBranchId: threading.ReplyBranchId } : {}),\n AgentId: agent.ID,\n MaxHistoryMessages: 20,\n Data: {\n conversationId: conversationId,\n latestMessageId: message.ID,\n invocationReason: reasoning,\n ...(appContext ? { appContext } : {}),\n },\n ...(payload ? { Payload: payload } : {}),\n ...(aiConfigurationId ? { ConfigurationId: aiConfigurationId } : {}),\n ...(planMode ? { PlanMode: true } : {}),\n ...(requestedSkillIDs?.length ? { RequestedSkillIDs: requestedSkillIDs } : {}),\n ...(agentHistoryFrom ? { AgentHistoryFrom: agentHistoryFrom } : {}),\n CreateArtifacts: true,\n CreateNotification: true,\n SourceArtifactId: sourceArtifactId,\n SourceArtifactVersionId: sourceArtifactVersionId,\n OnProgress: onProgress ? (progress) => {\n onProgress({\n step: progress.CurrentStep as 'initialization' | 'validation' | 'prompt_execution' | 'action_execution' | 'subagent_execution' | 'decision_processing' | 'finalization',\n percentage: progress.Percentage,\n message: progress.Message,\n metadata: progress.Metadata\n });\n } : undefined\n };\n\n const runResult = await this.agentClientService.RunAgentFromConversationDetail(agentParams);\n\n if (runResult.Success && runResult.Result) {\n return runResult.Result as ExecuteAgentResult;\n }\n\n const failed = coerceFailedExecuteAgentResult(\n runResult.Result as ExecuteAgentResult | null | undefined,\n runResult.ErrorMessage || `Sub-agent \"${agentName}\" failed`,\n );\n const errorMsg = `Sub-agent \"${agentName}\" failed: ${failed.errorMessage}`;\n console.error(errorMsg);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'error', 5000);\n return failed;\n } catch (error) {\n const errorMsg = `Error invoking sub-agent \"${agentName}\": ` + (error instanceof Error ? error.message : String(error));\n console.error(`Error invoking sub-agent \"${agentName}\":`, error);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'error', 5000);\n return coerceFailedExecuteAgentResult<ExecuteAgentResult>(undefined, errorMsg);\n }\n }\n\n /** @deprecated Use {@link InvokeSubAgent}. */\n async invokeSubAgent(\n agentName: string,\n conversationId: string,\n message: MJConversationDetailEntity,\n conversationHistory: MJConversationDetailEntity[],\n reasoning: string,\n onReplyAccepted: (reply: AgentReplyAcknowledgement) => void,\n payload?: Record<string, unknown> | null,\n onProgress?: AgentExecutionProgressCallback,\n sourceArtifactId?: string,\n sourceArtifactVersionId?: string,\n agentConfigurationPresetId?: string,\n appContext?: Record<string, unknown> | null,\n planMode?: boolean,\n requestedSkillIDs?: string[],\n agentHistoryFrom?: Date | null,\n threading?: SubAgentThreading | null\n ): Promise<ExecuteAgentResult | null> {\n return this.InvokeSubAgent(agentName, conversationId, message, conversationHistory, reasoning, onReplyAccepted, payload, onProgress, sourceArtifactId, sourceArtifactVersionId, agentConfigurationPresetId, appContext, planMode, requestedSkillIDs, agentHistoryFrom, threading);\n }\n\n /**\n * Check if user's latest message should continue with the previous agent or route through Sage.\n * Uses fast inference (<500ms) to determine intent and avoid unnecessary Sage overhead.\n *\n * Stays on the Angular shim because it directly uses GraphQLAIClient.\n * Could move to the runtime in a follow-up.\n *\n * @param branchId The active branch. Only the agent's artifacts on its path are listed for the\n * classifier; null or omitted reads the trunk.\n */\n async CheckAgentContinuityIntent(\n conversationId: string,\n agentId: string,\n latestMessage: string,\n conversationHistory: MJConversationDetailEntity[],\n branchId?: string | null\n ): Promise<IntentCheckResult> {\n if (!this._aiClient) {\n console.warn('AI Client not initialized, defaulting to UNSURE for intent check');\n return { decision: 'UNSURE', reasoning: 'AI Client not initialized' };\n }\n\n try {\n await AIEngineBase.Instance.Config(false);\n const prompt = AIEngineBase.Instance.Prompts.find(p => p.Name === 'Check Sage Intent');\n if (!prompt) {\n console.warn('⚠️ Check Sage Intent prompt not found, defaulting to UNSURE');\n return { decision: 'UNSURE', reasoning: 'Check Sage Intent prompt not found' };\n }\n\n const agent = AIEngineBase.Instance.ReadableAgents.find(a => UUIDsEqual(a.ID, agentId));\n if (!agent) {\n console.warn('⚠️ Previous agent not found, defaulting to UNSURE');\n return { decision: 'UNSURE', reasoning: 'Previous agent not found' };\n }\n\n // Queried, not read off the caller's window-scoped maps — see findAllAgentArtifacts.\n // `conversationHistory` below is still the window on purpose: the `.slice(-10)` wants\n // the most recent exchange, which the loaded tail always contains.\n const agentArtifacts = await this.findAllAgentArtifacts(conversationId, agentId, undefined, branchId);\n\n const recentHistory = conversationHistory.slice(-10);\n const compactHistory = recentHistory.map((msg, idx) => {\n const role = msg.Role === 'User' ? 'User' : agent.Name || 'Agent';\n const content = msg.Message || '';\n return `${idx + 1}. ${role}: ${content.substring(0, 150)}${content.length > 150 ? '...' : ''}`;\n }).join('\\n');\n\n let artifactContext = '';\n if (agentArtifacts.length > 0) {\n artifactContext = '\\n\\n**Prior Artifacts Created by This Agent**:\\n';\n agentArtifacts.forEach((artifact, idx) => {\n artifactContext += `${idx + 1}. ${artifact.artifactName} (${artifact.ArtifactType})\\n`;\n artifactContext += ` - Versions: ${artifact.Versions.length}\\n`;\n if (artifact.Versions.length > 0) {\n artifactContext += ` - Latest: v${artifact.Versions[0].versionNumber}`;\n if (artifact.Versions[0].versionName) {\n artifactContext += ` - ${artifact.Versions[0].versionName}`;\n }\n artifactContext += '\\n';\n }\n });\n }\n\n const userMessage = `**Previous Agent**: ${agent.Name} - ${agent.Description || 'No description'}\n\n**Conversation History** (last ${recentHistory.length} messages):\n${compactHistory}${artifactContext}\n\n**Latest User Message**: \"${latestMessage}\"`;\n\n LogStatusEx({\n message: '🔍 Checking agent continuity intent...',\n verboseOnly: true,\n additionalArgs: [{\n agentName: agent.Name,\n messagePreview: latestMessage.substring(0, 50),\n artifactCount: agentArtifacts.length\n }]\n });\n\n const result = await this._aiClient.RunAIPrompt({\n promptId: prompt.ID,\n messages: [{ role: 'user', content: userMessage }],\n data: {\n hasPriorArtifact: agentArtifacts.length > 0,\n priorArtifacts: agentArtifacts\n }\n });\n\n if (result && result.success && (result.parsedResult || result.output)) {\n const parsed = result.parsedResult ||\n (result.output ? JSON.parse(result.output) : null);\n\n if (parsed && parsed.continuesWith) {\n const decision = parsed.continuesWith.toUpperCase();\n const reasoning = parsed.reasoning || 'No reasoning provided';\n const targetArtifactVersionId = parsed.targetArtifactVersionId || undefined;\n\n LogStatusEx({\n message: `✅ Intent check result: ${decision}`,\n verboseOnly: true,\n additionalArgs: [{\n reasoning,\n targetArtifactVersionId,\n latency: result.executionTimeMs || 'unknown'\n }]\n });\n\n if (decision === 'YES' || decision === 'NO' || decision === 'UNSURE') {\n return {\n decision: decision as 'YES' | 'NO' | 'UNSURE',\n reasoning,\n targetArtifactVersionId\n };\n }\n }\n }\n\n console.warn('⚠️ Intent check failed or returned invalid format, defaulting to UNSURE');\n return { decision: 'UNSURE', reasoning: 'Invalid format from intent check prompt' };\n } catch (error) {\n console.error('❌ Error checking agent continuity intent:', error);\n return {\n decision: 'UNSURE',\n reasoning: `Error during intent check: ${error instanceof Error ? error.message : String(error)}`\n };\n }\n }\n\n /** @deprecated Use {@link CheckAgentContinuityIntent}. */\n async checkAgentContinuityIntent(\n conversationId: string,\n agentId: string,\n latestMessage: string,\n conversationHistory: MJConversationDetailEntity[],\n branchId?: string | null\n ): Promise<IntentCheckResult> {\n return this.CheckAgentContinuityIntent(conversationId, agentId, latestMessage, conversationHistory, branchId);\n }\n\n /**\n * Runs a typed decision on the server in one round trip, through\n * {@link GraphQLAIClient.RunDecision}. Decision routing (`EnableDecisionRouting`) asks its\n * routing questions here.\n *\n * Never throws: without an AI client, or on any failure, it resolves with `Success: false` and\n * no answers.\n */\n public async RunDecision(params: RunDecisionParams): Promise<RunDecisionResult> {\n if (!this._aiClient) {\n return { Success: false, ErrorMessage: 'AI Client not initialized', Answers: {} };\n }\n return this._aiClient.RunDecision(params);\n }\n\n /**\n * Every artifact this agent produced on the active branch path, newest version first, for\n * decision routing's artifact question. Resolved by query, as {@link findAllAgentArtifacts} explains.\n *\n * @param historyFrom The chat's history floor. When set, only artifacts on replies written at or\n * after it count, as with {@link FindLatestAgentOutputVersion}.\n * @param branchId The active branch. Only artifacts on its path count, as with\n * {@link FindLatestAgentOutputVersion}; null or omitted reads the trunk.\n */\n public async FindAgentArtifacts(\n conversationId: string,\n agentId: string,\n historyFrom?: Date | null,\n branchId?: string | null\n ): Promise<AgentArtifactSummary[]> {\n return this.findAllAgentArtifacts(conversationId, agentId, historyFrom, branchId);\n }\n\n /**\n * Every artifact this agent produced on the active branch path, newest version first —\n * resolved by QUERY, not by scanning the display array.\n *\n * The scan this replaces walked `conversationDetails` and looked each row up in the\n * caller's `artifactsByDetailId` / `agentRunsByDetailId` maps. Both are scoped to the\n * LOADED WINDOW, so under transcript windowing it saw only the artifacts attached to the\n * page currently on screen.\n *\n * That matters because this list is the \"Prior Artifacts Created by This Agent\" block fed\n * to the Check Sage Intent prompt, which is what produces `targetArtifactVersionId`. A\n * truncated list does not make the classifier fail — it makes it reason over a partial\n * history and confidently name the wrong version, or miss continuity altogether. Silent,\n * plausible, and wrong: the same failure class as {@link FindLatestAgentOutputVersion},\n * closed the same way.\n *\n * Three reads: the agent's replies, their Output versions, and the artifacts' names. See\n * {@link AgentArtifactSummary} for why dropping `runId` removes the join back to agent runs.\n *\n * @param historyFrom The chat's history floor, when set (see {@link FindAgentArtifacts}).\n * @param branchId The branch whose path to read; null or omitted reads the trunk.\n */\n private async findAllAgentArtifacts(\n conversationId: string,\n agentId: string,\n historyFrom?: Date | null,\n branchId?: string | null\n ): Promise<AgentArtifactSummary[]> {\n type VersionRow = Pick<MJArtifactVersionEntity, 'ID' | 'ArtifactID' | 'VersionNumber' | 'Name'>;\n const versionFilter = await this.agentOutputVersionFilter(conversationId, agentId, historyFrom, branchId);\n if (!versionFilter) {\n return []; // the classifier degrades to no artifact context\n }\n\n const rv = RunView.FromMetadataProvider(this.Provider);\n const versionResult = await rv.RunView<VersionRow>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: versionFilter,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: MAX_AGENT_ARTIFACT_VERSIONS,\n Fields: ['ID', 'ArtifactID', 'VersionNumber', 'Name'],\n ResultType: 'simple'\n }, this.Provider.CurrentUser ?? undefined);\n\n if (!versionResult.Success) {\n console.error('Failed to load agent artifact versions:', versionResult.ErrorMessage);\n return []; // the classifier degrades to no artifact context\n }\n const versions = versionResult.Results || [];\n if (versions.length === 0) {\n return [];\n }\n\n const artifactsById = await this.loadArtifactNames(\n [...new Set(versions.map(v => v.ArtifactID))]\n );\n return GroupVersionsByArtifact(versions, artifactsById);\n }\n\n /** Names and types for the artifacts behind a set of versions. */\n private async loadArtifactNames(\n artifactIds: string[]\n ): Promise<Map<string, Pick<MJArtifactEntity, 'ID' | 'Name' | 'Type'>>> {\n type ArtifactRow = Pick<MJArtifactEntity, 'ID' | 'Name' | 'Type'>;\n\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<ArtifactRow>({\n EntityName: 'MJ: Artifacts',\n ExtraFilter: `ID IN (${artifactIds.map(id => `'${id}'`).join(',')})`,\n Fields: ['ID', 'Name', 'Type'],\n ResultType: 'simple'\n }, this.Provider.CurrentUser ?? undefined);\n\n if (!result.Success) {\n console.error('Failed to load agent artifacts:', result.ErrorMessage);\n return new Map<string, ArtifactRow>();\n }\n return new Map((result.Results || []).map(a => [a.ID, a]));\n }\n\n /**\n * Newest OUTPUT artifact version an agent produced in this conversation — resolved by\n * QUERY, not by scanning the display array.\n *\n * The array scan this replaces was correct only while `conversationHistory` held the whole\n * conversation. Under transcript windowing it holds one page, so the scan silently returns\n * null for any artifact below the window's oldest row — exactly the long \"modify this\n * again\" exchanges where payload continuity matters most. A null payload is a LEGAL agent\n * input, so the failure is silent: the agent regenerates from scratch instead of modifying.\n *\n * Two reads: the agent's replies, then their newest Output version. Versions carry\n * `__mj_CreatedAt`, so \"newest\" is expressible without joining back for `Sequence`.\n *\n * @param historyFrom The chat's history floor. When set, only artifacts on replies written at\n * or after it count: a run that may not read earlier messages must not pick up their work\n * as its payload either.\n * @param branchId The active branch. Only replies on its path count, so an artifact made on\n * another branch is never the latest here; null or omitted reads the trunk.\n */\n public async FindLatestAgentOutputVersion(\n conversationId: string,\n agentId: string,\n historyFrom?: Date | null,\n branchId?: string | null\n ): Promise<AgentPayloadSource | null> {\n const versionFilter = await this.agentOutputVersionFilter(conversationId, agentId, historyFrom, branchId);\n return versionFilter ? this.runPayloadSourceQuery(versionFilter, '__mj_CreatedAt DESC') : null;\n }\n\n /**\n * `ArtifactVersion.ID IN (...)` for every OUTPUT artifact an agent produced on one\n * conversation path, in messages no rerun replaced, or null when the agent has no such reply\n * there. Shared by {@link FindLatestAgentOutputVersion} and {@link findAllAgentArtifacts} so\n * the two can never disagree about what \"this agent's artifacts\" means.\n *\n * The replies are read with their own RunView ({@link agentReplyIds}), so the row-level\n * security on conversation messages applies. A subquery over their view would skip it, and the\n * server refuses one for a user whose read of messages is row-filtered.\n */\n private async agentOutputVersionFilter(\n conversationId: string,\n agentId: string,\n historyFrom?: Date | null,\n branchId?: string | null\n ): Promise<string | null> {\n const replyIds = await this.agentReplyIds(conversationId, agentId, historyFrom, branchId);\n if (replyIds.length === 0) {\n return null;\n }\n const inReplies = replyIds.map(id => `'${EscapeSQLString(id)}'`).join(',');\n return `ID IN (\n SELECT ArtifactVersionID FROM [__mj].[vwConversationDetailArtifacts]\n WHERE Direction='Output' AND ConversationDetailID IN (${inReplies})\n )`;\n }\n\n /**\n * IDs of the agent's replies on one conversation path, in messages no rerun replaced, written\n * at or after the history floor when one is set. Empty when the path cannot be built\n * ({@link branchPathFilter}) or the read fails.\n *\n * Filters on the DETAIL's `Status <> 'Error'` rather than the agent run's\n * `Status = 'Completed'` (which is what the array scan this replaced used). Doing it on the\n * run would mean joining back to `MJ: AI Agent Runs` purely to restate a condition the\n * detail already carries.\n */\n private async agentReplyIds(\n conversationId: string,\n agentId: string,\n historyFrom?: Date | null,\n branchId?: string | null\n ): Promise<string[]> {\n const pathFilter = await this.branchPathFilter(conversationId, branchId);\n if (pathFilter == null) {\n return [];\n }\n const floor = historyFrom ? ` AND ${ConversationEngine.HistoryFromFilter(historyFrom)}` : '';\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<Pick<MJConversationDetailEntity, 'ID'>>({\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: `${ConversationEngine.LiveRowsFilter(pathFilter)} AND AgentID='${EscapeSQLString(agentId)}'` +\n ` AND Role='AI' AND Status <> 'Error'${floor}`,\n Fields: ['ID'],\n ResultType: 'simple',\n IgnoreMaxRows: true\n }, this.Provider.CurrentUser ?? undefined);\n\n if (!result.Success) {\n console.error('Failed to load agent replies:', result.ErrorMessage);\n return [];\n }\n return (result.Results || []).map(reply => reply.ID);\n }\n\n /**\n * The SQL predicate for one branch's path in a conversation, from\n * `ConversationEngine.BranchPathFilterFresh`. A null or omitted branch is the trunk and costs\n * no query.\n *\n * Never throws. When the path cannot be built (the branch rows fail to load, or the branch is\n * not among them), it logs the error and returns null. Each lookup then returns its own\n * failure value, as it does when its main query fails. A caller must not fall back to the\n * trunk predicate: on a branch, that reads trunk rows past the fork point.\n */\n private async branchPathFilter(conversationId: string, branchId: string | null | undefined): Promise<string | null> {\n try {\n const user = this.Provider.CurrentUser ?? undefined;\n return await ConversationEngine.BranchPathFilterFresh(conversationId, branchId, user as UserInfo, this.Provider);\n } catch (error) {\n console.error(`Failed to build the path of branch ${branchId} in conversation ${conversationId}:`, error);\n return null;\n }\n }\n\n /**\n * One artifact version by ID, as a payload source.\n *\n * Used by the continuity path after the intent check names a specific version: that ID may\n * belong to a message below the loaded window, so it cannot be resolved from the window's\n * artifact maps.\n */\n public async FindArtifactVersionById(versionId: string): Promise<AgentPayloadSource | null> {\n return this.runPayloadSourceQuery(`ID='${versionId}'`, undefined);\n }\n\n /**\n * Shared read behind {@link FindLatestAgentOutputVersion} and {@link FindArtifactVersionById}.\n *\n * `ResultType: 'simple'` with an explicit `Fields` list: nothing here is mutated, and under\n * `entity_object` the `Fields` narrowing would be silently discarded by `PreRunView`.\n */\n private async runPayloadSourceQuery(\n extraFilter: string,\n orderBy: string | undefined\n ): Promise<AgentPayloadSource | null> {\n type VersionRow = Pick<MJArtifactVersionEntity, 'ID' | 'ArtifactID' | 'VersionNumber' | 'Content'>;\n\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<VersionRow>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: extraFilter,\n OrderBy: orderBy,\n MaxRows: 1,\n Fields: ['ID', 'ArtifactID', 'VersionNumber', 'Content'],\n ResultType: 'simple'\n }, this.Provider.CurrentUser ?? undefined);\n\n if (!result.Success) {\n console.error('Failed to resolve agent payload source:', result.ErrorMessage);\n return null;\n }\n const row = result.Results?.[0];\n if (!row) {\n return null;\n }\n return {\n artifactId: row.ArtifactID,\n versionId: row.ID,\n versionNumber: row.VersionNumber,\n payload: parseArtifactContent(row.Content)\n };\n }\n\n}\n\n/**\n * Parses an artifact version's `Content` into an agent payload. Returns null rather than\n * throwing — a malformed artifact must not take down the send path, and \"no payload\" is\n * already a legal agent input.\n *\n * A payload must be a JSON OBJECT. Valid JSON that parses to an array, string, or number is\n * rejected for the same reason a parse failure is: every consumer spreads it or reads named\n * keys off it, so a non-object would satisfy the type at the boundary and misbehave deeper in.\n */\nfunction parseArtifactContent(content: string | null | undefined): Record<string, unknown> | null {\n if (!content) {\n return null;\n }\n try {\n const parsed: unknown = JSON.parse(content);\n return isPayloadObject(parsed) ? parsed : null;\n } catch (error) {\n console.warn('Artifact version content did not parse as JSON:', error);\n return null;\n }\n}\n\n/** Narrows a parsed JSON value to a plain object — the only shape a payload may take. */\nfunction isPayloadObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"]}
1
+ {"version":3,"file":"conversation-agent.service.js","sourceRoot":"","sources":["../../../src/lib/services/conversation-agent.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { LogStatusEx, Metadata, IMetadataProvider, RunView, UserInfo } from '@memberjunction/core';\nimport { GraphQLDataProvider, GraphQLAIClient, type RunDecisionParams, type RunDecisionResult, type AgentReplyAcknowledgement } from '@memberjunction/graphql-dataprovider';\nimport { ExecuteAgentResult, AgentExecutionProgressCallback, coerceFailedExecuteAgentResult } from '@memberjunction/ai-core-plus';\nimport { AIEngineBase, FindMentionPinnedPresetID } from '@memberjunction/ai-engine-base';\nimport {\n ConversationEngine,\n MJConversationDetailEntity,\n MJArtifactVersionEntity,\n MJArtifactEntity\n} from '@memberjunction/core-entities';\nimport { MJAIAgentEntityExtended, MJAIAgentRunEntityExtended } from '@memberjunction/ai-core-plus';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { AgentClientService } from '@memberjunction/ng-agent-client';\nimport { RunAgentFromConversationDetailParams } from '@memberjunction/ai-agent-client';\nimport { ConversationsRuntime } from '@memberjunction/conversations-runtime';\nimport { LazyArtifactInfo } from '../models/lazy-artifact-info';\nimport { MentionParserService } from './mention-parser.service';\nimport { EscapeSQLString, UUIDsEqual } from '@memberjunction/global';\n\nimport { ConversationsRuntimeBootstrap } from './conversations-runtime-bootstrap.service';\nimport {\n GroupVersionsByArtifact,\n type AgentArtifactSummary\n} from '../utils/agent-artifact-summary';\n\n/**\n * Cap on artifact versions listed for the intent classifier.\n *\n * The block is a hint, not a record: the prompt prints a name, a type, a version count and\n * the latest version per artifact. Newest-first ordering means the cap only ever trims the\n * oldest versions of the busiest artifacts, which are the least useful lines in it.\n */\nconst MAX_AGENT_ARTIFACT_VERSIONS = 40;\n\n/**\n * Context for artifact lookups — pre-loaded conversation data.\n *\n * NO LONGER CONSUMED by this service. Both readers were converted to queries when transcript\n * windowing made these maps a partial view: they are keyed to the loaded window, so any\n * lookup for an older row silently missed. Retained as an exported type for API\n * compatibility; new code should not build one.\n */\nexport interface ArtifactLookupContext {\n agentRunsByDetailId: Map<string, MJAIAgentRunEntityExtended>;\n artifactsByDetailId: Map<string, LazyArtifactInfo[]>;\n}\n\n/**\n * An agent's prior OUTPUT artifact, resolved for payload continuity.\n *\n * `payload` is the parsed `ArtifactVersion.Content`, typed to match what actually consumes it\n * — `executeAgentContinuation` and `invokeSubAgent` both take `Record<string, unknown> | null`.\n * It is null when the version carried no content, the content did not parse, or the content\n * parsed to something that is not a JSON object; callers treat all three the same as \"no prior\n * artifact\", which is already a legal agent input.\n */\nexport interface AgentPayloadSource {\n artifactId: string;\n versionId: string;\n versionNumber: number;\n payload: Record<string, unknown> | null;\n}\n\n/**\n * Result from intent check - indicates whether to continue with agent\n * and which artifact version to use as payload\n */\nexport interface IntentCheckResult {\n decision: 'YES' | 'NO' | 'UNSURE';\n reasoning: string;\n targetArtifactVersionId?: string;\n}\n\n/**\n * Where a sub-agent's reply sits in the conversation. The server sets it (only the server writes agent replies), from\n * these checked inputs.\n */\nexport interface SubAgentThreading {\n /** The message the reply threads under, when not the user's message (a delegate's reply sits under the manager's). */\n ReplyParentId?: string | null;\n /**\n * An agent (the conversation manager) whose line \"Continuing with **{agent}** for refinement...\" the server posts\n * before the reply; the reply threads under it.\n */\n AnnouncedByAgentId?: string | null;\n /**\n * The branch the turn runs on when it forks off an earlier message on another branch (such as Regenerate, which\n * creates a new fork before running the agent while the user's message stays on its original branch).\n */\n ReplyBranchId?: string | null;\n}\n\n/**\n * Angular DI service for conversation-level agent orchestration.\n *\n * After PR 2 of the conversations-runtime extraction, the core\n * `processMessage` flow and the conversation-manager-agent resolution are\n * delegated to `@memberjunction/conversations-runtime`. This service is\n * primarily a shim for those operations PLUS the holder of the helpers\n * that haven't been ported yet:\n *\n * - `invokeSubAgent(...)` — used by Sage's routing decisions in\n * `message-input.component`.\n * - `checkAgentContinuityIntent(...)` — fast intent classification when the\n * user replies to a previous-agent thread.\n * - `FindConfigurationPresetForAgent(...)` — locates an agent's preset\n * from prior @mentions in the conversation.\n * - `clearSession(...)` — per-conversation session-id bookkeeping.\n *\n * These can move to the runtime in a follow-up; they aren't strictly needed\n * to invoke an agent end-to-end and stay here so the shim has zero behavior\n * difference vs. the original.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ConversationAgentService {\n /** GraphQL AI client - retained for RunAIPrompt (intent checking) which AgentClientService doesn't wrap */\n private _aiClient: GraphQLAIClient | null = null;\n /** Cached resolution of the conversation manager agent (default agent). */\n private _conversationManagerAgent: MJAIAgentEntityExtended | null = null;\n private _sessionIds: Map<string, string> = new Map();\n\n /** Observable indicating if the ambient agent is currently processing — delegated to the runtime's AgentRunner. */\n public readonly IsProcessing$: Observable<boolean>;\n\n /** @deprecated Use {@link IsProcessing$}. */\n public get isProcessing$(): Observable<boolean> {\n return this.IsProcessing$;\n }\n\n private _provider: IMetadataProvider | null = null;\n\n constructor(\n _bootstrap: ConversationsRuntimeBootstrap,\n _mentionParser: MentionParserService,\n private agentClientService: AgentClientService\n ) {\n // Injecting `_bootstrap` forces the runtime's INotificationAdapter +\n // IActiveTaskTracker adapters to register before any shim method runs.\n this.IsProcessing$ = ConversationsRuntime.Instance.AgentRunner.isProcessing$;\n this.initializeAIClient();\n }\n\n /**\n * The metadata provider this service uses. When unset, falls back to Metadata.Provider.\n * Setting it re-initializes the AI client and forwards the provider to the runtime's runner.\n */\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n this.initializeAIClient();\n ConversationsRuntime.Instance.AgentRunner.Provider = value;\n }\n\n /**\n * Initialize the GraphQL AI Client.\n * Retained for RunAIPrompt calls (intent checking) which the AgentClientService doesn't wrap.\n * Agent execution (RunAIAgentFromConversationDetail) now goes through ConversationsRuntime.AgentRunner.\n */\n private initializeAIClient(): void {\n try {\n const provider = this.Provider as GraphQLDataProvider;\n if (provider) {\n this._aiClient = new GraphQLAIClient(provider);\n } else {\n console.warn('GraphQLDataProvider not available, agent functionality will be limited');\n }\n } catch (error) {\n console.error('Failed to initialize GraphQL AI Client:', error);\n }\n }\n\n /**\n * Resolve the conversation manager agent via the runtime's 4-step\n * DefaultAgentResolver chain (explicit input → app-scoped Application\n * Setting → global Application Setting → code-const Sage fallback). The\n * result is cached on this service for use by the synchronous\n * {@link ConversationManagerAgentName} getter.\n *\n * Existing callers expect a Promise<MJAIAgentEntityExtended | null> — we\n * preserve that shape (returning null on failure rather than throwing)\n * so the call sites don't need to change.\n */\n public async GetConversationManagerAgent(): Promise<MJAIAgentEntityExtended | null> {\n if (this._conversationManagerAgent) {\n return this._conversationManagerAgent;\n }\n // A user who may not read the agents has no manager agent to resolve: say nothing, rather than an error for a state\n // that is theirs by design (MJ#5240)\n if (AIEngineBase.Instance.IsPermissionConstrained && AIEngineBase.Instance.ReadableAgents.length === 0) {\n return null;\n }\n\n try {\n const provider = this.Provider;\n const agent = await ConversationsRuntime.Instance.DefaultAgent.resolve({\n contextUser: provider.CurrentUser ?? undefined,\n provider,\n });\n this._conversationManagerAgent = agent;\n return agent;\n } catch (error) {\n const errorMsg = 'Error resolving conversation manager agent: ' + (error instanceof Error ? error.message : String(error));\n console.error(errorMsg);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'error', 5000);\n return null;\n }\n }\n\n /** @deprecated Use {@link GetConversationManagerAgent}. */\n public async getConversationManagerAgent(): Promise<MJAIAgentEntityExtended | null> {\n return this.GetConversationManagerAgent();\n }\n\n /**\n * Synchronous read of the cached conversation-manager-agent name. Returns\n * `null` until {@link getConversationManagerAgent} has been called at least\n * once and resolved successfully. Used by `MessageItemComponent.isConversationManager`\n * to flag messages from the routing agent without hardcoding `'Sage'`.\n */\n public get ConversationManagerAgentName(): string | null {\n return this._conversationManagerAgent?.Name ?? null;\n }\n\n /**\n * Returns `true` if the supplied agent identifier (UUID or name) matches the\n * currently cached conversation manager agent. Robust to either input.\n */\n public IsConversationManagerAgent(agentIdOrName: string | null | undefined): boolean {\n if (!agentIdOrName || !this._conversationManagerAgent) return false;\n return (\n UUIDsEqual(this._conversationManagerAgent.ID, agentIdOrName) ||\n this._conversationManagerAgent.Name === agentIdOrName\n );\n }\n\n /**\n * Process a message through the conversation manager agent. Delegates to\n * `ConversationsRuntime.Instance.AgentRunner.processMessage(...)`.\n *\n * The unused `conversationHistory` parameter is kept for backwards compatibility (it was already\n * documented as \"kept for backwards compatibility but not used\" in the original).\n *\n * @param onReplyAccepted Called with the reply row the server creates for the turn (only the server\n * writes agent replies), before any progress: key the turn's task and completion by its ID.\n */\n async ProcessMessage(\n conversationId: string,\n message: MJConversationDetailEntity,\n conversationHistory: MJConversationDetailEntity[],\n onReplyAccepted: (reply: AgentReplyAcknowledgement) => void,\n onProgress?: AgentExecutionProgressCallback,\n appContext?: Record<string, unknown> | null,\n planMode?: boolean,\n requestedSkillIDs?: string[],\n /** The agents the conversation manager may delegate to. Null or omitted allows every agent. */\n allowedAgentIDs?: readonly string[] | null,\n /** The first moment of the conversation the run may read. Null or omitted reads all of it. */\n agentHistoryFrom?: Date | null,\n /** The branch the turn runs on when it forks off an earlier message on another branch. */\n replyBranchId?: string | null\n ): Promise<ExecuteAgentResult | null> {\n // Warm the cached default-agent name for any synchronous consumers\n // before the runtime resolves on its own.\n if (!this._conversationManagerAgent) {\n await this.GetConversationManagerAgent();\n }\n return ConversationsRuntime.Instance.AgentRunner.processMessage({\n conversationId,\n message,\n onReplyAccepted,\n appContext,\n onProgress,\n ...(planMode ? { planMode: true } : {}),\n ...(requestedSkillIDs?.length ? { requestedSkillIDs } : {}),\n ...(allowedAgentIDs != null ? { AllowedAgentIDs: allowedAgentIDs } : {}),\n ...(agentHistoryFrom ? { AgentHistoryFrom: agentHistoryFrom } : {}),\n ...(replyBranchId ? { ReplyBranchID: replyBranchId } : {}),\n });\n }\n\n /** @deprecated Use {@link ProcessMessage}. */\n async processMessage(\n conversationId: string,\n message: MJConversationDetailEntity,\n conversationHistory: MJConversationDetailEntity[],\n onReplyAccepted: (reply: AgentReplyAcknowledgement) => void,\n onProgress?: AgentExecutionProgressCallback,\n appContext?: Record<string, unknown> | null,\n planMode?: boolean,\n requestedSkillIDs?: string[],\n allowedAgentIDs?: readonly string[] | null,\n agentHistoryFrom?: Date | null,\n replyBranchId?: string | null\n ): Promise<ExecuteAgentResult | null> {\n return this.ProcessMessage(conversationId, message, conversationHistory, onReplyAccepted, onProgress, appContext, planMode, requestedSkillIDs, allowedAgentIDs, agentHistoryFrom, replyBranchId);\n }\n\n /**\n * Configuration preset an agent was pinned to by a previous `@mention` in this conversation.\n *\n * Resolved by QUERY, not by scanning the display array. The pinning `@mention` is normally\n * the FIRST message of an exchange and everything after it is follow-up, so it is the\n * message most likely to fall below the loaded transcript window — and `undefined` is a\n * legal value for `configurationPresetId`, so the miss is silent. The visible consequence\n * is a run executed under the default configuration (a different model tier) instead of the\n * one the user explicitly chose, with a plausible-looking result and no error.\n *\n * There is no column to filter on: the preset lives inside the message body as a JSON\n * mention blob (`@{\"type\":\"agent\",\"id\":\"…\",\"configId\":\"…\"}`). So SQL narrows and the parser\n * decides — both `configId` and the agent id appear verbatim in that blob, which makes the\n * two LIKEs a tight prefilter, and `parseMentions` is what actually confirms a match.\n *\n * @param branchId The active branch. Only messages on its path count; null or omitted reads\n * the trunk.\n */\n public async FindConfigurationPresetForAgent(\n conversationId: string,\n agentId: string,\n branchId?: string | null\n ): Promise<string | undefined> {\n const configurationId = await FindMentionPinnedPresetID(\n conversationId,\n agentId,\n branchId,\n this.Provider.CurrentUser ?? undefined,\n this.Provider\n );\n if (configurationId) {\n console.log(`\\u{1F3AF} Found configuration preset from @mention: ${configurationId}`);\n }\n return configurationId;\n }\n\n\n\n /**\n * Clear the session for a conversation (useful when starting a new topic)\n */\n ClearSession(conversationId: string): void {\n this._sessionIds.delete(conversationId);\n }\n\n /** @deprecated Use {@link ClearSession}. */\n clearSession(conversationId: string): void {\n return this.ClearSession(conversationId);\n }\n\n /**\n * Surfaces a warning toast when the user requested skills (via /skill mentions) that the\n * target agent cannot activate — the server drops such requests, and without this the\n * refusal is invisible to the user. Client-side check uses the agent gate only (the server\n * additionally intersects with the user's Run permission).\n */\n private warnOnUnacceptedSkills(agent: MJAIAgentEntityExtended, requestedSkillIDs: string[]): void {\n const allowed = AIEngineBase.Instance.GetSkillsForAgent(agent);\n const dropped = requestedSkillIDs.filter(id => !allowed.some(s => UUIDsEqual(s.ID, id)));\n if (dropped.length === 0) return;\n const names = dropped.map(\n id => AIEngineBase.Instance.Skills.find(s => UUIDsEqual(s.ID, id))?.Name ?? 'requested skill'\n );\n const reason = agent.AcceptsSkills === 'None'\n ? `${agent.Name} doesn't accept skills`\n : `${agent.Name} can't activate ${names.length === 1 ? 'this skill' : 'these skills'}`;\n MJNotificationService.Instance?.CreateSimpleNotification(\n `${reason} — ${names.join(', ')} won't be used for this run.`,\n 'warning',\n 6000\n );\n }\n\n /**\n * Invoke a sub-agent based on Sage Agent's payload.\n * This is called when Sage decides to delegate to a specialist agent.\n *\n * Stays on the Angular shim because it directly uses AgentClientService.\n * Could move to the runtime in a follow-up if needed.\n *\n * @param onReplyAccepted Called with the reply row the server creates for the run (only the server\n * writes agent replies), before any progress: key the run's task and completion by its ID.\n */\n async InvokeSubAgent(\n agentName: string,\n conversationId: string,\n message: MJConversationDetailEntity,\n conversationHistory: MJConversationDetailEntity[],\n reasoning: string,\n onReplyAccepted: (reply: AgentReplyAcknowledgement) => void,\n payload?: Record<string, unknown> | null,\n onProgress?: AgentExecutionProgressCallback,\n sourceArtifactId?: string,\n sourceArtifactVersionId?: string,\n agentConfigurationPresetId?: string,\n appContext?: Record<string, unknown> | null,\n planMode?: boolean,\n requestedSkillIDs?: string[],\n /** The first moment of the conversation the run may read. Null or omitted reads all of it. */\n agentHistoryFrom?: Date | null,\n /** Where the reply sits in the conversation. Omitted, it answers `message` directly. */\n threading?: SubAgentThreading | null\n ): Promise<ExecuteAgentResult | null> {\n try {\n // Ensure AIEngineBase is configured\n await AIEngineBase.Instance.Config(false);\n\n // Find the agent by name\n const agent = AIEngineBase.Instance.ReadableAgents.find(a => a.Name === agentName);\n\n if (!agent || !agent.ID) {\n const errorMsg = `Sub-agent \"${agentName}\" not found`;\n console.warn(`${errorMsg}`);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'error', 5000);\n return null;\n }\n\n if (requestedSkillIDs?.length) {\n this.warnOnUnacceptedSkills(agent, requestedSkillIDs);\n }\n\n LogStatusEx({\n message: `Invoking sub-agent: ${agentName}`,\n verboseOnly: true,\n additionalArgs: [{ reasoning, hasPayload: !!payload, hasConfigPreset: !!agentConfigurationPresetId }]\n });\n\n // Map AIAgentConfiguration preset ID to actual AIConfiguration ID\n let aiConfigurationId: string | undefined = undefined;\n if (agentConfigurationPresetId) {\n const presets = AIEngineBase.Instance.GetAgentConfigurationPresets(agent.ID, false);\n const preset = presets.find(p => UUIDsEqual(p.ID, agentConfigurationPresetId) || UUIDsEqual(p.AIConfigurationID, agentConfigurationPresetId));\n\n if (preset) {\n aiConfigurationId = preset.AIConfigurationID || undefined;\n LogStatusEx({ message: `Mapped agent configuration preset \"${preset.Name}\" to AIConfigurationID: ${aiConfigurationId || 'default'}`, verboseOnly: true });\n } else {\n console.warn(`Agent configuration preset ${agentConfigurationPresetId} not found for agent ${agent.ID}`);\n }\n }\n\n const agentParams: RunAgentFromConversationDetailParams = {\n UserMessageId: message.ID,\n OnAccepted: onReplyAccepted,\n ...(threading?.ReplyParentId ? { ReplyParentId: threading.ReplyParentId } : {}),\n ...(threading?.AnnouncedByAgentId ? { AnnouncedByAgentId: threading.AnnouncedByAgentId } : {}),\n ...(threading?.ReplyBranchId ? { ReplyBranchId: threading.ReplyBranchId } : {}),\n AgentId: agent.ID,\n MaxHistoryMessages: 20,\n Data: {\n conversationId: conversationId,\n latestMessageId: message.ID,\n invocationReason: reasoning,\n ...(appContext ? { appContext } : {}),\n },\n ...(payload ? { Payload: payload } : {}),\n ...(aiConfigurationId ? { ConfigurationId: aiConfigurationId } : {}),\n ...(planMode ? { PlanMode: true } : {}),\n ...(requestedSkillIDs?.length ? { RequestedSkillIDs: requestedSkillIDs } : {}),\n ...(agentHistoryFrom ? { AgentHistoryFrom: agentHistoryFrom } : {}),\n CreateArtifacts: true,\n CreateNotification: true,\n SourceArtifactId: sourceArtifactId,\n SourceArtifactVersionId: sourceArtifactVersionId,\n OnProgress: onProgress ? (progress) => {\n onProgress({\n step: progress.CurrentStep as 'initialization' | 'validation' | 'prompt_execution' | 'action_execution' | 'subagent_execution' | 'decision_processing' | 'finalization',\n percentage: progress.Percentage,\n message: progress.Message,\n metadata: progress.Metadata\n });\n } : undefined\n };\n\n const runResult = await this.agentClientService.RunAgentFromConversationDetail(agentParams);\n\n if (runResult.Success && runResult.Result) {\n return runResult.Result as ExecuteAgentResult;\n }\n\n const failed = coerceFailedExecuteAgentResult(\n runResult.Result as ExecuteAgentResult | null | undefined,\n runResult.ErrorMessage || `Sub-agent \"${agentName}\" failed`,\n );\n const errorMsg = `Sub-agent \"${agentName}\" failed: ${failed.errorMessage}`;\n console.error(errorMsg);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'error', 5000);\n return failed;\n } catch (error) {\n const errorMsg = `Error invoking sub-agent \"${agentName}\": ` + (error instanceof Error ? error.message : String(error));\n console.error(`Error invoking sub-agent \"${agentName}\":`, error);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'error', 5000);\n return coerceFailedExecuteAgentResult<ExecuteAgentResult>(undefined, errorMsg);\n }\n }\n\n /** @deprecated Use {@link InvokeSubAgent}. */\n async invokeSubAgent(\n agentName: string,\n conversationId: string,\n message: MJConversationDetailEntity,\n conversationHistory: MJConversationDetailEntity[],\n reasoning: string,\n onReplyAccepted: (reply: AgentReplyAcknowledgement) => void,\n payload?: Record<string, unknown> | null,\n onProgress?: AgentExecutionProgressCallback,\n sourceArtifactId?: string,\n sourceArtifactVersionId?: string,\n agentConfigurationPresetId?: string,\n appContext?: Record<string, unknown> | null,\n planMode?: boolean,\n requestedSkillIDs?: string[],\n agentHistoryFrom?: Date | null,\n threading?: SubAgentThreading | null\n ): Promise<ExecuteAgentResult | null> {\n return this.InvokeSubAgent(agentName, conversationId, message, conversationHistory, reasoning, onReplyAccepted, payload, onProgress, sourceArtifactId, sourceArtifactVersionId, agentConfigurationPresetId, appContext, planMode, requestedSkillIDs, agentHistoryFrom, threading);\n }\n\n /**\n * Check if user's latest message should continue with the previous agent or route through Sage.\n * Uses fast inference (<500ms) to determine intent and avoid unnecessary Sage overhead.\n *\n * Stays on the Angular shim because it directly uses GraphQLAIClient.\n * Could move to the runtime in a follow-up.\n *\n * @param branchId The active branch. Only the agent's artifacts on its path are listed for the\n * classifier; null or omitted reads the trunk.\n */\n async CheckAgentContinuityIntent(\n conversationId: string,\n agentId: string,\n latestMessage: string,\n conversationHistory: MJConversationDetailEntity[],\n branchId?: string | null\n ): Promise<IntentCheckResult> {\n if (!this._aiClient) {\n console.warn('AI Client not initialized, defaulting to UNSURE for intent check');\n return { decision: 'UNSURE', reasoning: 'AI Client not initialized' };\n }\n\n try {\n await AIEngineBase.Instance.Config(false);\n const prompt = AIEngineBase.Instance.Prompts.find(p => p.Name === 'Check Sage Intent');\n if (!prompt) {\n console.warn('⚠️ Check Sage Intent prompt not found, defaulting to UNSURE');\n return { decision: 'UNSURE', reasoning: 'Check Sage Intent prompt not found' };\n }\n\n const agent = AIEngineBase.Instance.ReadableAgents.find(a => UUIDsEqual(a.ID, agentId));\n if (!agent) {\n console.warn('⚠️ Previous agent not found, defaulting to UNSURE');\n return { decision: 'UNSURE', reasoning: 'Previous agent not found' };\n }\n\n // Queried, not read off the caller's window-scoped maps — see findAllAgentArtifacts.\n // `conversationHistory` below is still the window on purpose: the `.slice(-10)` wants\n // the most recent exchange, which the loaded tail always contains.\n const agentArtifacts = await this.findAllAgentArtifacts(conversationId, agentId, undefined, branchId);\n\n const recentHistory = conversationHistory.slice(-10);\n const compactHistory = recentHistory.map((msg, idx) => {\n const role = msg.Role === 'User' ? 'User' : agent.Name || 'Agent';\n const content = msg.Message || '';\n return `${idx + 1}. ${role}: ${content.substring(0, 150)}${content.length > 150 ? '...' : ''}`;\n }).join('\\n');\n\n let artifactContext = '';\n if (agentArtifacts.length > 0) {\n artifactContext = '\\n\\n**Prior Artifacts Created by This Agent**:\\n';\n agentArtifacts.forEach((artifact, idx) => {\n artifactContext += `${idx + 1}. ${artifact.artifactName} (${artifact.ArtifactType})\\n`;\n artifactContext += ` - Versions: ${artifact.Versions.length}\\n`;\n if (artifact.Versions.length > 0) {\n artifactContext += ` - Latest: v${artifact.Versions[0].versionNumber}`;\n if (artifact.Versions[0].versionName) {\n artifactContext += ` - ${artifact.Versions[0].versionName}`;\n }\n artifactContext += '\\n';\n }\n });\n }\n\n const userMessage = `**Previous Agent**: ${agent.Name} - ${agent.Description || 'No description'}\n\n**Conversation History** (last ${recentHistory.length} messages):\n${compactHistory}${artifactContext}\n\n**Latest User Message**: \"${latestMessage}\"`;\n\n LogStatusEx({\n message: '🔍 Checking agent continuity intent...',\n verboseOnly: true,\n additionalArgs: [{\n agentName: agent.Name,\n messagePreview: latestMessage.substring(0, 50),\n artifactCount: agentArtifacts.length\n }]\n });\n\n const result = await this._aiClient.RunAIPrompt({\n promptId: prompt.ID,\n messages: [{ role: 'user', content: userMessage }],\n data: {\n hasPriorArtifact: agentArtifacts.length > 0,\n priorArtifacts: agentArtifacts\n }\n });\n\n if (result && result.success && (result.parsedResult || result.output)) {\n const parsed = result.parsedResult ||\n (result.output ? JSON.parse(result.output) : null);\n\n if (parsed && parsed.continuesWith) {\n const decision = parsed.continuesWith.toUpperCase();\n const reasoning = parsed.reasoning || 'No reasoning provided';\n const targetArtifactVersionId = parsed.targetArtifactVersionId || undefined;\n\n LogStatusEx({\n message: `✅ Intent check result: ${decision}`,\n verboseOnly: true,\n additionalArgs: [{\n reasoning,\n targetArtifactVersionId,\n latency: result.executionTimeMs || 'unknown'\n }]\n });\n\n if (decision === 'YES' || decision === 'NO' || decision === 'UNSURE') {\n return {\n decision: decision as 'YES' | 'NO' | 'UNSURE',\n reasoning,\n targetArtifactVersionId\n };\n }\n }\n }\n\n console.warn('⚠️ Intent check failed or returned invalid format, defaulting to UNSURE');\n return { decision: 'UNSURE', reasoning: 'Invalid format from intent check prompt' };\n } catch (error) {\n console.error('❌ Error checking agent continuity intent:', error);\n return {\n decision: 'UNSURE',\n reasoning: `Error during intent check: ${error instanceof Error ? error.message : String(error)}`\n };\n }\n }\n\n /** @deprecated Use {@link CheckAgentContinuityIntent}. */\n async checkAgentContinuityIntent(\n conversationId: string,\n agentId: string,\n latestMessage: string,\n conversationHistory: MJConversationDetailEntity[],\n branchId?: string | null\n ): Promise<IntentCheckResult> {\n return this.CheckAgentContinuityIntent(conversationId, agentId, latestMessage, conversationHistory, branchId);\n }\n\n /**\n * Runs a typed decision on the server in one round trip, through\n * {@link GraphQLAIClient.RunDecision}. Decision routing (`EnableDecisionRouting`) asks its\n * routing questions here.\n *\n * Never throws: without an AI client, or on any failure, it resolves with `Success: false` and\n * no answers.\n */\n public async RunDecision(params: RunDecisionParams): Promise<RunDecisionResult> {\n if (!this._aiClient) {\n return { Success: false, ErrorMessage: 'AI Client not initialized', Answers: {} };\n }\n return this._aiClient.RunDecision(params);\n }\n\n /**\n * Every artifact this agent produced on the active branch path, newest version first, for\n * decision routing's artifact question. Resolved by query, as {@link findAllAgentArtifacts} explains.\n *\n * @param historyFrom The chat's history floor. When set, only artifacts on replies written at or\n * after it count, as with {@link FindLatestAgentOutputVersion}.\n * @param branchId The active branch. Only artifacts on its path count, as with\n * {@link FindLatestAgentOutputVersion}; null or omitted reads the trunk.\n */\n public async FindAgentArtifacts(\n conversationId: string,\n agentId: string,\n historyFrom?: Date | null,\n branchId?: string | null\n ): Promise<AgentArtifactSummary[]> {\n return this.findAllAgentArtifacts(conversationId, agentId, historyFrom, branchId);\n }\n\n /**\n * Every artifact this agent produced on the active branch path, newest version first —\n * resolved by QUERY, not by scanning the display array.\n *\n * The scan this replaces walked `conversationDetails` and looked each row up in the\n * caller's `artifactsByDetailId` / `agentRunsByDetailId` maps. Both are scoped to the\n * LOADED WINDOW, so under transcript windowing it saw only the artifacts attached to the\n * page currently on screen.\n *\n * That matters because this list is the \"Prior Artifacts Created by This Agent\" block fed\n * to the Check Sage Intent prompt, which is what produces `targetArtifactVersionId`. A\n * truncated list does not make the classifier fail — it makes it reason over a partial\n * history and confidently name the wrong version, or miss continuity altogether. Silent,\n * plausible, and wrong: the same failure class as {@link FindLatestAgentOutputVersion},\n * closed the same way.\n *\n * Three reads: the agent's replies, their Output versions, and the artifacts' names. See\n * {@link AgentArtifactSummary} for why dropping `runId` removes the join back to agent runs.\n *\n * @param historyFrom The chat's history floor, when set (see {@link FindAgentArtifacts}).\n * @param branchId The branch whose path to read; null or omitted reads the trunk.\n */\n private async findAllAgentArtifacts(\n conversationId: string,\n agentId: string,\n historyFrom?: Date | null,\n branchId?: string | null\n ): Promise<AgentArtifactSummary[]> {\n type VersionRow = Pick<MJArtifactVersionEntity, 'ID' | 'ArtifactID' | 'VersionNumber' | 'Name'>;\n const versionFilter = await this.agentOutputVersionFilter(conversationId, agentId, historyFrom, branchId);\n if (!versionFilter) {\n return []; // the classifier degrades to no artifact context\n }\n\n const rv = RunView.FromMetadataProvider(this.Provider);\n const versionResult = await rv.RunView<VersionRow>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: versionFilter,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: MAX_AGENT_ARTIFACT_VERSIONS,\n Fields: ['ID', 'ArtifactID', 'VersionNumber', 'Name'],\n ResultType: 'simple'\n }, this.Provider.CurrentUser ?? undefined);\n\n if (!versionResult.Success) {\n console.error('Failed to load agent artifact versions:', versionResult.ErrorMessage);\n return []; // the classifier degrades to no artifact context\n }\n const versions = versionResult.Results || [];\n if (versions.length === 0) {\n return [];\n }\n\n const artifactsById = await this.loadArtifactNames(\n [...new Set(versions.map(v => v.ArtifactID))]\n );\n return GroupVersionsByArtifact(versions, artifactsById);\n }\n\n /** Names and types for the artifacts behind a set of versions. */\n private async loadArtifactNames(\n artifactIds: string[]\n ): Promise<Map<string, Pick<MJArtifactEntity, 'ID' | 'Name' | 'Type'>>> {\n type ArtifactRow = Pick<MJArtifactEntity, 'ID' | 'Name' | 'Type'>;\n\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<ArtifactRow>({\n EntityName: 'MJ: Artifacts',\n ExtraFilter: `ID IN (${artifactIds.map(id => `'${id}'`).join(',')})`,\n Fields: ['ID', 'Name', 'Type'],\n ResultType: 'simple'\n }, this.Provider.CurrentUser ?? undefined);\n\n if (!result.Success) {\n console.error('Failed to load agent artifacts:', result.ErrorMessage);\n return new Map<string, ArtifactRow>();\n }\n return new Map((result.Results || []).map(a => [a.ID, a]));\n }\n\n /**\n * Newest OUTPUT artifact version an agent produced in this conversation — resolved by\n * QUERY, not by scanning the display array.\n *\n * The array scan this replaces was correct only while `conversationHistory` held the whole\n * conversation. Under transcript windowing it holds one page, so the scan silently returns\n * null for any artifact below the window's oldest row — exactly the long \"modify this\n * again\" exchanges where payload continuity matters most. A null payload is a LEGAL agent\n * input, so the failure is silent: the agent regenerates from scratch instead of modifying.\n *\n * Two reads: the agent's replies, then their newest Output version. Versions carry\n * `__mj_CreatedAt`, so \"newest\" is expressible without joining back for `Sequence`.\n *\n * @param historyFrom The chat's history floor. When set, only artifacts on replies written at\n * or after it count: a run that may not read earlier messages must not pick up their work\n * as its payload either.\n * @param branchId The active branch. Only replies on its path count, so an artifact made on\n * another branch is never the latest here; null or omitted reads the trunk.\n */\n public async FindLatestAgentOutputVersion(\n conversationId: string,\n agentId: string,\n historyFrom?: Date | null,\n branchId?: string | null\n ): Promise<AgentPayloadSource | null> {\n const versionFilter = await this.agentOutputVersionFilter(conversationId, agentId, historyFrom, branchId);\n return versionFilter ? this.runPayloadSourceQuery(versionFilter, '__mj_CreatedAt DESC') : null;\n }\n\n /**\n * `ArtifactVersion.ID IN (...)` for every OUTPUT artifact an agent produced on one\n * conversation path, in messages no rerun replaced, or null when the agent has no such reply\n * there. Shared by {@link FindLatestAgentOutputVersion} and {@link findAllAgentArtifacts} so\n * the two can never disagree about what \"this agent's artifacts\" means.\n *\n * The replies are read with their own RunView ({@link agentReplyIds}), so the row-level\n * security on conversation messages applies. A subquery over their view would skip it, and the\n * server refuses one for a user whose read of messages is row-filtered.\n */\n private async agentOutputVersionFilter(\n conversationId: string,\n agentId: string,\n historyFrom?: Date | null,\n branchId?: string | null\n ): Promise<string | null> {\n const replyIds = await this.agentReplyIds(conversationId, agentId, historyFrom, branchId);\n if (replyIds.length === 0) {\n return null;\n }\n const inReplies = replyIds.map(id => `'${EscapeSQLString(id)}'`).join(',');\n return `ID IN (\n SELECT ArtifactVersionID FROM [__mj].[vwConversationDetailArtifacts]\n WHERE Direction='Output' AND ConversationDetailID IN (${inReplies})\n )`;\n }\n\n /**\n * IDs of the agent's replies on one conversation path, in messages no rerun replaced, written\n * at or after the history floor when one is set. Empty when the path cannot be built\n * ({@link branchPathFilter}) or the read fails.\n *\n * Filters on the DETAIL's `Status <> 'Error'` rather than the agent run's\n * `Status = 'Completed'` (which is what the array scan this replaced used). Doing it on the\n * run would mean joining back to `MJ: AI Agent Runs` purely to restate a condition the\n * detail already carries.\n */\n private async agentReplyIds(\n conversationId: string,\n agentId: string,\n historyFrom?: Date | null,\n branchId?: string | null\n ): Promise<string[]> {\n const pathFilter = await this.branchPathFilter(conversationId, branchId);\n if (pathFilter == null) {\n return [];\n }\n const floor = historyFrom ? ` AND ${ConversationEngine.HistoryFromFilter(historyFrom)}` : '';\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<Pick<MJConversationDetailEntity, 'ID'>>({\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: `${ConversationEngine.LiveRowsFilter(pathFilter)} AND AgentID='${EscapeSQLString(agentId)}'` +\n ` AND Role='AI' AND Status <> 'Error'${floor}`,\n Fields: ['ID'],\n ResultType: 'simple',\n IgnoreMaxRows: true\n }, this.Provider.CurrentUser ?? undefined);\n\n if (!result.Success) {\n console.error('Failed to load agent replies:', result.ErrorMessage);\n return [];\n }\n return (result.Results || []).map(reply => reply.ID);\n }\n\n /**\n * The SQL predicate for one branch's path in a conversation, from\n * `ConversationEngine.BranchPathFilterFresh`. A null or omitted branch is the trunk and costs\n * no query.\n *\n * Never throws. When the path cannot be built (the branch rows fail to load, or the branch is\n * not among them), it logs the error and returns null. Each lookup then returns its own\n * failure value, as it does when its main query fails. A caller must not fall back to the\n * trunk predicate: on a branch, that reads trunk rows past the fork point.\n */\n private async branchPathFilter(conversationId: string, branchId: string | null | undefined): Promise<string | null> {\n try {\n const user = this.Provider.CurrentUser ?? undefined;\n return await ConversationEngine.BranchPathFilterFresh(conversationId, branchId, user as UserInfo, this.Provider);\n } catch (error) {\n console.error(`Failed to build the path of branch ${branchId} in conversation ${conversationId}:`, error);\n return null;\n }\n }\n\n /**\n * One artifact version by ID, as a payload source.\n *\n * Used by the continuity path after the intent check names a specific version: that ID may\n * belong to a message below the loaded window, so it cannot be resolved from the window's\n * artifact maps.\n */\n public async FindArtifactVersionById(versionId: string): Promise<AgentPayloadSource | null> {\n return this.runPayloadSourceQuery(`ID='${versionId}'`, undefined);\n }\n\n /**\n * Shared read behind {@link FindLatestAgentOutputVersion} and {@link FindArtifactVersionById}.\n *\n * `ResultType: 'simple'` with an explicit `Fields` list: nothing here is mutated, and under\n * `entity_object` the `Fields` narrowing would be silently discarded by `PreRunView`.\n */\n private async runPayloadSourceQuery(\n extraFilter: string,\n orderBy: string | undefined\n ): Promise<AgentPayloadSource | null> {\n type VersionRow = Pick<MJArtifactVersionEntity, 'ID' | 'ArtifactID' | 'VersionNumber' | 'Content'>;\n\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<VersionRow>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: extraFilter,\n OrderBy: orderBy,\n MaxRows: 1,\n SkipTotalRowCount: true,\n Fields: ['ID', 'ArtifactID', 'VersionNumber', 'Content'],\n ResultType: 'simple'\n }, this.Provider.CurrentUser ?? undefined);\n\n if (!result.Success) {\n console.error('Failed to resolve agent payload source:', result.ErrorMessage);\n return null;\n }\n const row = result.Results?.[0];\n if (!row) {\n return null;\n }\n return {\n artifactId: row.ArtifactID,\n versionId: row.ID,\n versionNumber: row.VersionNumber,\n payload: parseArtifactContent(row.Content)\n };\n }\n\n}\n\n/**\n * Parses an artifact version's `Content` into an agent payload. Returns null rather than\n * throwing — a malformed artifact must not take down the send path, and \"no payload\" is\n * already a legal agent input.\n *\n * A payload must be a JSON OBJECT. Valid JSON that parses to an array, string, or number is\n * rejected for the same reason a parse failure is: every consumer spreads it or reads named\n * keys off it, so a non-object would satisfy the type at the boundary and misbehave deeper in.\n */\nfunction parseArtifactContent(content: string | null | undefined): Record<string, unknown> | null {\n if (!content) {\n return null;\n }\n try {\n const parsed: unknown = JSON.parse(content);\n return isPayloadObject(parsed) ? parsed : null;\n } catch (error) {\n console.warn('Artifact version content did not parse as JSON:', error);\n return null;\n }\n}\n\n/** Narrows a parsed JSON value to a plain object — the only shape a payload may take. */\nfunction isPayloadObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import { IMetadataProvider } from '@memberjunction/core';
2
+ import type { MJAIAgentSessionEntity } from '@memberjunction/core-entities';
2
3
  import { RealtimeDelegationCardVM, RealtimeThreadItem } from '../components/realtime/realtime-session-state';
3
4
  import { ParsedDelegationArtifact } from '@memberjunction/realtime-runtime';
4
5
  import * as i0 from "@angular/core";
@@ -7,7 +8,7 @@ import * as i0 from "@angular/core";
7
8
  * (mirrors `MJAIAgentSessionEntity.CloseReason`). `null` means the session is still open OR a
8
9
  * legacy row was closed before the column existed.
9
10
  */
10
- export type RealtimeReviewCloseReason = 'Error' | 'Explicit' | 'Janitor' | 'Shutdown';
11
+ export type RealtimeReviewCloseReason = NonNullable<MJAIAgentSessionEntity['CloseReason']>;
11
12
  /**
12
13
  * One historical caption turn of a reviewed session (a persisted `MJ: Conversation Details` row).
13
14
  *
@@ -1 +1 @@
1
- {"version":3,"file":"realtime-session-review.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/realtime-session-review.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAoC,MAAM,sBAAsB,CAAC;AAE3F,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AAC7G,OAAO,EAAE,wBAAwB,EAAkB,MAAM,kCAAkC,CAAC;;AAE5F;;;;GAIG;AACH,MAAM,MAAM,yBAAyB,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;AAEtF;;;;;;;GAOG;AACH,MAAM,WAAW,yBAAyB;IACxC,qEAAqE;IACrE,EAAE,EAAE,MAAM,CAAC;IACX,kEAAkE;IAClE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,gGAAgG;IAChG,cAAc,EAAE,IAAI,GAAG,IAAI,CAAC;IAC5B,4EAA4E;IAC5E,EAAE,EAAE,IAAI,GAAG,IAAI,CAAC;IAChB,uGAAuG;IACvG,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,kEAAkE;IAClE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,oFAAoF;IACpF,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,mEAAmE;IACnE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,+CAA+C;IAC/C,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,wFAAwF;IACxF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;CAC1B;AAED,8EAA8E;AAC9E,MAAM,WAAW,iCAAiC;IAChD,yFAAyF;IACzF,WAAW,EAAE,MAAM,CAAC;IACpB,8GAA8G;IAC9G,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,gBAAgB,EAAE,aAAa,CAAC,aAAa,CAAC,iCAAiC,CAAC,CAAC,GAChF,iCAAiC,EAAE,CAkBrC;AAED;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C,qCAAqC;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,2FAA2F;IAC3F,MAAM,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gDAAgD;IAChD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,4EAA4E;IAC5E,UAAU,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,EAAE,EAAE,IAAI,GAAG,IAAI,CAAC;CACjB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,wBAAwB;IACvC,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,oDAAoD;IACpD,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,2DAA2D;IAC3D,WAAW,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAC9C,6DAA6D;IAC7D,KAAK,EAAE,yBAAyB,EAAE,CAAC;IACnC,8FAA8F;IAC9F,aAAa,EAAE,wBAAwB,EAAE,CAAC;IAC1C,4DAA4D;IAC5D,aAAa,CAAC,EAAE,2BAA2B,EAAE,CAAC;CAC/C;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,kGAAkG;IAClG,OAAO,EAAE,MAAM,CAAC;IAChB,sGAAsG;IACtG,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,WAAW,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAC9C,mDAAmD;IACnD,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB;;;;OAIG;IACH,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,mGAAmG;IACnG,kBAAkB,EAAE,IAAI,GAAG,IAAI,CAAC;IAChC,iFAAiF;IACjF,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,qFAAqF;IACrF,KAAK,EAAE,yBAAyB,EAAE,CAAC;IACnC,oGAAoG;IACpG,aAAa,EAAE,wBAAwB,EAAE,CAAC;IAC1C,0EAA0E;IAC1E,aAAa,CAAC,EAAE,2BAA2B,EAAE,CAAC;IAC9C;;;;OAIG;IACH,aAAa,EAAE,iCAAiC,EAAE,CAAC;IACnD;;;;OAIG;IACH,IAAI,EAAE,wBAAwB,EAAE,CAAC;IACjC;;;;;;;OAOG;IACH,SAAS,EAAE,wBAAwB,EAAE,CAAC;CACvC;AA0FD,4FAA4F;AAC5F,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,mGAAmG;AACnG,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAItC,4FAA4F;AAC5F,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,GAAG,wBAAwB,CAgB5H;AAED,0FAA0F;AAC1F,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,2BAA2B,GAAG,wBAAwB,CAiBnG;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,qBAAqB,GAAG,kBAAkB,EAAE,CAyB1F;AAiCD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBACa,4BAA4B;IACvC;;;;;;OAMG;IACU,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAoB3H;;;;OAIG;YACW,WAAW;IAgCzB;;;;;;;;;OASG;YACW,gBAAgB;IA8B9B;;;;;;OAMG;YACW,kBAAkB;IAkDhC,6GAA6G;IAC7G,OAAO,CAAC,gBAAgB;IAcxB,uGAAuG;IACvG,OAAO,CAAC,WAAW;IAInB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IA8BtB,wFAAwF;IACxF,OAAO,CAAC,MAAM;IAad,uFAAuF;IACvF,OAAO,CAAC,gBAAgB;IAoCxB,kGAAkG;IAClG,OAAO,CAAC,QAAQ;IAsBhB,4FAA4F;IAC5F,OAAO,CAAC,OAAO;IAiBf,6FAA6F;IAC7F,OAAO,CAAC,WAAW;IAMnB,+EAA+E;IAC/E,OAAO,CAAC,kBAAkB;IAY1B,iGAAiG;IACjG,OAAO,CAAC,MAAM;yCA3UH,4BAA4B;6CAA5B,4BAA4B;CAkVxC"}
1
+ {"version":3,"file":"realtime-session-review.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/realtime-session-review.service.ts"],"names":[],"mappings":"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"}