@memberjunction/ai-agents 5.37.0 → 5.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -326,6 +326,53 @@ const result = await runner.ExecuteAgent({
326
326
  });
327
327
  ```
328
328
 
329
+ ## Latency Optimizations & Concurrent Sub-Agent Execution
330
+
331
+ To drastically reduce execution latency, the framework includes the following optimizations:
332
+
333
+ ### 1. In-Memory Query Embedding Caching
334
+ In-memory caching is integrated into `AIEngine.EmbedText` to bypass redundant local ONNX embedding inference, eliminating CPU-bound event-loop blockages.
335
+ * **Eviction**: Backed by `MJLruCache` from `@memberjunction/global` — a bounded LRU keeps hot queries warm across bursts (default capacity 5000 entries).
336
+ * **Cache keys**: `${modelID}|sha256(text)` so a large text doesn't pin its full string in the cache map.
337
+ * **Promise dedup**: Concurrent callers for the same `(model, text)` share a single in-flight inference promise — only one ONNX run happens even under fan-out load.
338
+ * **Control**: Callers can supply options `{ bypassCache: true }` (re-calculates but caches the new result) or `{ noCache: true }` (bypasses and does not store the result).
339
+ * **Empty input**: Empty/whitespace text short-circuits to `null` without invoking the embedding provider.
340
+ * **Negative result eviction**: Failed or empty-vector responses are evicted so subsequent calls retry rather than returning a stale failure.
341
+ * **Reset**: The cache can be manually cleared by calling `AIEngine.Instance.ClearEmbeddingCache()`.
342
+
343
+ ### 2. Parallel Data Source Preloading
344
+ `AgentDataPreloader.PreloadAgentData` resolves agent data sources concurrently with a bounded concurrency cap (default 10 in-flight at once) so a long list of sources can't saturate the DB connection pool.
345
+
346
+ ### 3. Non-blocking Observability DB Logging
347
+ Observability writes (`AIAgentRunStep` records) are completely non-blocking:
348
+ * Step creation and finalization `.Save()` operations are queued immediately into `_pendingSaves` promises.
349
+ * Sequenced queueing via `_stepSavePromises` chains saves on the *same* step ID to prevent database write races (e.g. executing a step `UPDATE` before its initial `INSERT` completes).
350
+ * All pending logging writes are drained with `Promise.allSettled` inside `finalizeAgentRun()` and the queues are cleared, so a reused agent instance doesn't leak settled promises. Save failures (rejected promises OR `Save()===false`) are logged via `LogError` and a summary is folded into `agentRun.ErrorMessage` for visibility.
351
+
352
+ ### 4. Concurrent Sub-Agent Execution
353
+ Loop agents can request multiple sub-agents to run in parallel by returning a `subAgents` array in their `nextStep` decision:
354
+ * **Bounded fan-out**: Sub-agents dispatch with a configurable concurrency cap (default 5) so a misbehaving LLM can't spawn unbounded parallel runs.
355
+ * **Deterministic transcript**: Delegation messages and progress events are pushed *synchronously* in the source order of the `subAgents` array — completion order doesn't reorder the conversation.
356
+ * **Payload isolation**: Each child sub-agent receives a deep-cloned copy of its input payload, so in-flight mutations by one sibling can't be observed by another.
357
+ * **State Merging**: Aggregates all media/file outputs and sequentially merges child/related sub-agent payloads back into the parent state via the `PayloadManager` to avoid race conditions.
358
+ * **Per-sibling audit trail**: Each parallel sub-agent's `AIAgentRunStep` records *its own* contribution as `PayloadAtEnd` rather than the cumulative merged state, so forensic logs distinguish each sibling.
359
+ * **Termination semantics**: Matches the single sub-agent path — if any dispatched child requested `terminateAfter: true`, the parent terminates regardless of whether that child succeeded. The parent's step is reported as `Failed` when any child failed, `Success` when terminating cleanly, and `Retry` otherwise.
360
+ * **Context Preservation**: Appends an aggregated delegation and completion log to the parent conversation context once all parallel steps complete.
361
+
362
+ #### Loop Response Schema
363
+ ```json
364
+ {
365
+ "taskComplete": false,
366
+ "nextStep": {
367
+ "type": "Sub-Agent",
368
+ "subAgents": [
369
+ { "name": "DbAgent", "message": "Search the database", "terminateAfter": false },
370
+ { "name": "WebAgent", "message": "Gather details from web search", "terminateAfter": false }
371
+ ]
372
+ }
373
+ }
374
+ ```
375
+
329
376
  ## Documentation
330
377
 
331
378
  Detailed guides are available in the [`docs/`](./docs/) directory:
@@ -35,23 +35,6 @@ export interface PreloadedDataResult {
35
35
  /** Sources that failed to load, with error details */
36
36
  failedSources: FailedDataSource[];
37
37
  }
38
- /**
39
- * Singleton service for preloading agent data sources.
40
- *
41
- * This class handles loading data from RunView or RunQuery sources as configured
42
- * in AIAgentDataSource metadata. Supports three cache policies:
43
- * - None: No caching, data is loaded fresh every time
44
- * - PerRun: Data is cached for the duration of a single agent run
45
- * - PerAgent: Data is cached globally with a TTL, shared across all runs
46
- *
47
- * @class AgentDataPreloader
48
- * @example
49
- * ```typescript
50
- * const preloader = AgentDataPreloader.Instance;
51
- * const data = await preloader.PreloadAgentData(agentId, contextUser);
52
- * // data = { ALL_ENTITIES: [...], MODEL_LIST: [...] }
53
- * ```
54
- */
55
38
  export declare class AgentDataPreloader extends BaseSingleton<AgentDataPreloader> {
56
39
  /**
57
40
  * Per-agent cache (global, TTL-based)
@@ -105,6 +88,14 @@ export declare class AgentDataPreloader extends BaseSingleton<AgentDataPreloader
105
88
  * Can be called to force refresh of global cached data.
106
89
  */
107
90
  clearAgentCache(): void;
91
+ /**
92
+ * Resolves all data sources with bounded concurrency, preserving input order
93
+ * in the returned result array. Each item is wrapped so the caller can
94
+ * distinguish success from failure without try/catch noise.
95
+ *
96
+ * @private
97
+ */
98
+ private resolveDataSources;
108
99
  /**
109
100
  * Loads AIAgentDataSource entities for a specific agent.
110
101
  *
@@ -1 +1 @@
1
- {"version":3,"file":"AgentDataPreloader.d.ts","sourceRoot":"","sources":["../src/AgentDataPreloader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAqE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACnH,OAAO,EAAc,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAKnE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,gDAAgD;IAChD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,sDAAsD;IACtD,aAAa,EAAE,gBAAgB,EAAE,CAAC;CACrC;AAWD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,kBAAmB,SAAQ,aAAa,CAAC,kBAAkB,CAAC;IACrE;;OAEG;IACH,OAAO,CAAC,cAAc,CAAsC;IAE5D;;OAEG;IACH,OAAO,CAAC,YAAY,CAAgD;;IAMpE;;OAEG;IACH,WAAkB,QAAQ,IAAI,kBAAkB,CAE/C;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACU,gBAAgB,CACzB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,QAAQ,EACrB,KAAK,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,mBAAmB,CAAC;IAqF/B;;;;;OAKG;IACI,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IASzC;;;OAGG;IACI,eAAe,IAAI,IAAI;IAS9B;;;;OAIG;YACW,uBAAuB;IAiBrC;;;;;OAKG;YACW,iBAAiB;IAiC/B;;;;OAIG;YACW,cAAc;IAmC5B;;;;OAIG;YACW,eAAe;IAiC7B;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAsCrB;;;;OAIG;IACH,OAAO,CAAC,SAAS;IAmCjB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;CAG9B"}
1
+ {"version":3,"file":"AgentDataPreloader.d.ts","sourceRoot":"","sources":["../src/AgentDataPreloader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAqE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACnH,OAAO,EAAc,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAKnE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,gDAAgD;IAChD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,sDAAsD;IACtD,aAAa,EAAE,gBAAgB,EAAE,CAAC;CACrC;AAkCD,qBAAa,kBAAmB,SAAQ,aAAa,CAAC,kBAAkB,CAAC;IACrE;;OAEG;IACH,OAAO,CAAC,cAAc,CAAsC;IAE5D;;OAEG;IACH,OAAO,CAAC,YAAY,CAAgD;;IAMpE;;OAEG;IACH,WAAkB,QAAQ,IAAI,kBAAkB,CAE/C;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACU,gBAAgB,CACzB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,QAAQ,EACrB,KAAK,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,mBAAmB,CAAC;IAqF/B;;;;;OAKG;IACI,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IASzC;;;OAGG;IACI,eAAe,IAAI,IAAI;IAS9B;;;;;;OAMG;YACW,kBAAkB;IAwChC;;;;OAIG;YACW,uBAAuB;IAiBrC;;;;;OAKG;YACW,iBAAiB;IAiC/B;;;;OAIG;YACW,cAAc;IAmC5B;;;;OAIG;YACW,eAAe;IAiC7B;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAsCrB;;;;OAIG;IACH,OAAO,CAAC,SAAS;IAmCjB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;CAG9B"}
@@ -31,6 +31,11 @@ import _ from 'lodash';
31
31
  * // data = { ALL_ENTITIES: [...], MODEL_LIST: [...] }
32
32
  * ```
33
33
  */
34
+ /**
35
+ * Maximum number of data sources to resolve concurrently for a single agent.
36
+ * Prevents a runaway agent with many data sources from saturating the DB pool.
37
+ */
38
+ const PRELOAD_CONCURRENCY_LIMIT = 10;
34
39
  export class AgentDataPreloader extends BaseSingleton {
35
40
  constructor() {
36
41
  super();
@@ -99,12 +104,12 @@ export class AgentDataPreloader extends BaseSingleton {
99
104
  loadedSources: [],
100
105
  failedSources: []
101
106
  };
102
- // Execute data sources in order
103
- for (const source of dataSources) {
104
- try {
105
- const sourceData = await this.executeDataSource(source, contextUser, runId);
106
- // Determine the path (use DestinationPath if provided, otherwise Name)
107
- const path = source.DestinationPath || source.Name;
107
+ // Execute data sources in parallel with a bounded concurrency cap so a
108
+ // long list of sources can't saturate the DB connection pool.
109
+ const preloadedResults = await this.resolveDataSources(dataSources, contextUser, runId);
110
+ for (const item of preloadedResults) {
111
+ if (item.success) {
112
+ const { source, sourceData, path } = item;
108
113
  // Set data in the appropriate destination
109
114
  switch (source.DestinationType) {
110
115
  case 'Data':
@@ -132,7 +137,9 @@ export class AgentDataPreloader extends BaseSingleton {
132
137
  isVerboseEnabled: IsVerboseLoggingEnabled
133
138
  });
134
139
  }
135
- catch (error) {
140
+ else if (item.success === false) {
141
+ const source = item.source;
142
+ const error = item.error;
136
143
  const errorMessage = error instanceof Error ? error.message : 'Unknown error';
137
144
  result.failedSources.push({
138
145
  name: source.Name,
@@ -140,7 +147,6 @@ export class AgentDataPreloader extends BaseSingleton {
140
147
  errorMessage
141
148
  });
142
149
  LogError(`Failed to preload data source '${source.Name}' for agent ${agentId}: ${errorMessage}`, undefined, error);
143
- // Continue loading other sources even if one fails
144
150
  }
145
151
  }
146
152
  return result;
@@ -178,6 +184,45 @@ export class AgentDataPreloader extends BaseSingleton {
178
184
  isVerboseEnabled: IsVerboseLoggingEnabled
179
185
  });
180
186
  }
187
+ /**
188
+ * Resolves all data sources with bounded concurrency, preserving input order
189
+ * in the returned result array. Each item is wrapped so the caller can
190
+ * distinguish success from failure without try/catch noise.
191
+ *
192
+ * @private
193
+ */
194
+ async resolveDataSources(dataSources, contextUser, runId) {
195
+ if (dataSources.length === 0)
196
+ return [];
197
+ const limit = Math.max(1, Math.min(PRELOAD_CONCURRENCY_LIMIT, dataSources.length));
198
+ const results = new Array(dataSources.length);
199
+ let cursor = 0;
200
+ const runners = [];
201
+ for (let i = 0; i < limit; i++) {
202
+ runners.push((async () => {
203
+ while (true) {
204
+ const idx = cursor++;
205
+ if (idx >= dataSources.length)
206
+ return;
207
+ const source = dataSources[idx];
208
+ try {
209
+ const sourceData = await this.executeDataSource(source, contextUser, runId);
210
+ results[idx] = {
211
+ success: true,
212
+ source,
213
+ sourceData,
214
+ path: source.DestinationPath || source.Name
215
+ };
216
+ }
217
+ catch (error) {
218
+ results[idx] = { success: false, source, error };
219
+ }
220
+ }
221
+ })());
222
+ }
223
+ await Promise.all(runners);
224
+ return results;
225
+ }
181
226
  /**
182
227
  * Loads AIAgentDataSource entities for a specific agent.
183
228
  *
@@ -1 +1 @@
1
- {"version":3,"file":"AgentDataPreloader.js","sourceRoot":"","sources":["../src/AgentDataPreloader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AgentDataPreloader.js","sourceRoot":"","sources":["../src/AgentDataPreloader.ts"],"names":[],"mappings":"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"}
@@ -234,10 +234,8 @@ export declare class AgentRunner {
234
234
  private GenerateConversationName;
235
235
  /**
236
236
  * Saves media outputs to AIAgentRunMedia table for permanent storage.
237
- * This creates records for each media output promoted during agent execution.
238
- *
239
- * Only media with `persist !== false` is saved. Media items with `persist: false`
240
- * are typically intercepted binary content that was never used in the final output.
237
+ * Creates a record for each media output promoted during agent execution.
238
+ * All items in the array are saved.
241
239
  *
242
240
  * @param agentRunId - The ID of the agent run
243
241
  * @param mediaOutputs - Array of media outputs to save
@@ -258,28 +256,26 @@ export declare class AgentRunner {
258
256
  */
259
257
  SaveAgentRunMedia(agentRunId: string, mediaOutputs: MediaOutput[] | undefined, contextUser: UserInfo, provider?: IMetadataProvider): Promise<string[]>;
260
258
  /**
261
- * Creates ConversationDetailAttachment records for media outputs.
262
- * This enables media to be displayed in the conversation UI.
259
+ * Creates `MJ: Artifact` + `MJ: Artifact Version` + `MJ: Conversation Detail Artifact`
260
+ * junction records for agent-produced media outputs (images, audio, video).
263
261
  *
264
- * @param conversationDetailId - The conversation detail to attach media to
265
- * @param mediaOutputs - Array of media outputs
266
- * @param agentRunMediaIds - Corresponding AIAgentRunMedia IDs
267
- * @param contextUser - User context for the operation
268
- * @returns Array of created attachment IDs
269
- * @since 3.1.0
262
+ * Replaces the deprecated `CreateConversationMediaAttachments` path which wrote to
263
+ * the `MJ: Conversation Detail Attachments` table (then auto-paired to an artifact
264
+ * via the server-side hook). Writing artifacts directly removes the deprecated-entity
265
+ * dependency and the redundant dual-write.
270
266
  *
271
- * @example
272
- * ```typescript
273
- * const runner = new AgentRunner();
274
- * const attachmentIds = await runner.CreateConversationMediaAttachments(
275
- * conversationDetailId,
276
- * mediaOutputs,
277
- * agentRunMediaIds,
278
- * currentUser
279
- * );
280
- * ```
267
+ * Reuses {@link createArtifactWithVersion} — the same helper that `ProcessFileArtifacts`
268
+ * uses — so artifact creation logic (MIME resolution, transaction wrapping, junction
269
+ * linking) lives in exactly one place.
270
+ *
271
+ * @param conversationDetailId - The conversation detail to link artifacts to
272
+ * @param mediaOutputs - Media outputs to persist as artifacts
273
+ * @param contextUser - User context for DB operations
274
+ * @param provider - Optional metadata provider for multi-provider support
275
+ *
276
+ * @since 5.38.0
281
277
  */
282
- CreateConversationMediaAttachments(conversationDetailId: string, mediaOutputs: MediaOutput[], agentRunMediaIds: string[], contextUser: UserInfo, provider?: IMetadataProvider): Promise<string[]>;
278
+ CreateMediaArtifacts(conversationDetailId: string, mediaOutputs: MediaOutput[], contextUser: UserInfo, provider?: IMetadataProvider): Promise<void>;
283
279
  /**
284
280
  * Creates MJ: Artifact records for file outputs collected during agent execution.
285
281
  * Reads directly from `ExecuteAgentResult.fileOutputs` — no DB query needed.
@@ -1 +1 @@
1
- {"version":3,"file":"AgentRunner.d.ts","sourceRoot":"","sources":["../src/AgentRunner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AgentRunner.d.ts","sourceRoot":"","sources":["../src/AgentRunner.ts"],"names":[],"mappings":"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"}
@@ -14,7 +14,7 @@ import { LogError, LogStatusEx, IsVerboseLoggingEnabled, LogStatus, Metadata, Ru
14
14
  import { MJGlobal, UUIDsEqual } from '@memberjunction/global';
15
15
  import { AIEngine } from '@memberjunction/aiengine';
16
16
  import { BaseAgent } from './base-agent.js';
17
- import { ArtifactMetadataEngine, ExtractBase64FromDataUrl } from '@memberjunction/core-entities';
17
+ import { ArtifactMetadataEngine, ExtractBase64FromDataUrl, DecideInlineStorage } from '@memberjunction/core-entities';
18
18
  import { FileStorageEngine } from '@memberjunction/storage';
19
19
  /**
20
20
  * AgentRunner provides a thin wrapper for executing AI agents.
@@ -362,16 +362,22 @@ export class AgentRunner {
362
362
  await this.ProcessFileArtifacts(agentResult.fileOutputs, agentResponseDetailId, contextUser, agentResult.resolvedStorageAccountId, md, params.agent.AcceptUnregisteredFiles);
363
363
  }
364
364
  })();
365
- // Step 7: Save media outputs to AIAgentRunMedia and create conversation attachments (async)
365
+ // Step 7: Save media outputs to AIAgentRunMedia (audit) and create artifacts (display)
366
366
  const saveMediaPromise = (async () => {
367
367
  if (agentResult.mediaOutputs && agentResult.mediaOutputs.length > 0) {
368
- const mediaToSave = agentResult.mediaOutputs.filter(m => m.persist !== false);
369
- LogStatus(`Processing ${mediaToSave.length} of ${agentResult.mediaOutputs.length} media outputs (filtered by persist flag)`);
370
- // Save to AIAgentRunMedia for permanent storage
368
+ const mediaToSave = agentResult.mediaOutputs;
369
+ LogStatus(`Processing ${mediaToSave.length} media output(s)`);
370
+ // Save to AIAgentRunMedia for permanent audit/lineage storage
371
371
  const ids = await this.SaveAgentRunMedia(agentResult.agentRun.ID, mediaToSave, contextUser, md);
372
- // Create ConversationDetailAttachment records for UI display
373
- if (agentResponseDetailId && ids.length > 0) {
374
- await this.CreateConversationMediaAttachments(agentResponseDetailId, mediaToSave, ids, contextUser, md);
372
+ // Create Artifact + ArtifactVersion + ConversationDetailArtifact for each
373
+ // media output so the chat UI renders them as artifact cards. This replaces
374
+ // the old CreateConversationMediaAttachments path which wrote to the deprecated
375
+ // ConversationDetailAttachment table (the server hook then auto-paired to an
376
+ // artifact). Writing artifacts directly removes the deprecated-entity dependency
377
+ // and the redundant dual-write. Uses the same createArtifactWithVersion helper
378
+ // that ProcessFileArtifacts uses, keeping artifact creation logic in one place.
379
+ if (agentResponseDetailId) {
380
+ await this.CreateMediaArtifacts(agentResponseDetailId, mediaToSave, contextUser, md);
375
381
  }
376
382
  return ids;
377
383
  }
@@ -736,10 +742,8 @@ export class AgentRunner {
736
742
  }
737
743
  /**
738
744
  * Saves media outputs to AIAgentRunMedia table for permanent storage.
739
- * This creates records for each media output promoted during agent execution.
740
- *
741
- * Only media with `persist !== false` is saved. Media items with `persist: false`
742
- * are typically intercepted binary content that was never used in the final output.
745
+ * Creates a record for each media output promoted during agent execution.
746
+ * All items in the array are saved.
743
747
  *
744
748
  * @param agentRunId - The ID of the agent run
745
749
  * @param mediaOutputs - Array of media outputs to save
@@ -762,16 +766,7 @@ export class AgentRunner {
762
766
  if (!mediaOutputs || mediaOutputs.length === 0) {
763
767
  return [];
764
768
  }
765
- // Filter to only persist media that should be saved
766
- // persist=false means intercepted but unused binary content (e.g., images not used in response)
767
- const mediaToSave = mediaOutputs.filter(m => m.persist !== false);
768
- if (mediaToSave.length === 0) {
769
- LogStatus(`All ${mediaOutputs.length} media outputs have persist=false, skipping save`);
770
- return [];
771
- }
772
- if (mediaToSave.length < mediaOutputs.length) {
773
- LogStatus(`Filtering: ${mediaToSave.length} of ${mediaOutputs.length} media outputs will be persisted`);
774
- }
769
+ const mediaToSave = mediaOutputs;
775
770
  const savedIds = [];
776
771
  const md = provider || this._provider;
777
772
  try {
@@ -843,102 +838,71 @@ export class AgentRunner {
843
838
  return savedIds;
844
839
  }
845
840
  }
841
+ // ── Media artifact creation ─────────────────────────────────────────────────
846
842
  /**
847
- * Creates ConversationDetailAttachment records for media outputs.
848
- * This enables media to be displayed in the conversation UI.
843
+ * Creates `MJ: Artifact` + `MJ: Artifact Version` + `MJ: Conversation Detail Artifact`
844
+ * junction records for agent-produced media outputs (images, audio, video).
849
845
  *
850
- * @param conversationDetailId - The conversation detail to attach media to
851
- * @param mediaOutputs - Array of media outputs
852
- * @param agentRunMediaIds - Corresponding AIAgentRunMedia IDs
853
- * @param contextUser - User context for the operation
854
- * @returns Array of created attachment IDs
855
- * @since 3.1.0
846
+ * Replaces the deprecated `CreateConversationMediaAttachments` path which wrote to
847
+ * the `MJ: Conversation Detail Attachments` table (then auto-paired to an artifact
848
+ * via the server-side hook). Writing artifacts directly removes the deprecated-entity
849
+ * dependency and the redundant dual-write.
856
850
  *
857
- * @example
858
- * ```typescript
859
- * const runner = new AgentRunner();
860
- * const attachmentIds = await runner.CreateConversationMediaAttachments(
861
- * conversationDetailId,
862
- * mediaOutputs,
863
- * agentRunMediaIds,
864
- * currentUser
865
- * );
866
- * ```
851
+ * Reuses {@link createArtifactWithVersion} — the same helper that `ProcessFileArtifacts`
852
+ * uses — so artifact creation logic (MIME resolution, transaction wrapping, junction
853
+ * linking) lives in exactly one place.
854
+ *
855
+ * @param conversationDetailId - The conversation detail to link artifacts to
856
+ * @param mediaOutputs - Media outputs to persist as artifacts
857
+ * @param contextUser - User context for DB operations
858
+ * @param provider - Optional metadata provider for multi-provider support
859
+ *
860
+ * @since 5.38.0
867
861
  */
868
- async CreateConversationMediaAttachments(conversationDetailId, mediaOutputs, agentRunMediaIds, contextUser, provider) {
862
+ async CreateMediaArtifacts(conversationDetailId, mediaOutputs, contextUser, provider) {
869
863
  if (!mediaOutputs || mediaOutputs.length === 0) {
870
- return [];
864
+ return;
871
865
  }
872
- const attachmentIds = [];
866
+ await ArtifactMetadataEngine.Instance.Config(false, contextUser);
873
867
  const md = provider || this._provider;
874
- try {
875
- // Use AIEngine's cached modalities instead of a fresh DB call
876
- const aiEngine = AIEngine.Instance;
877
- for (let i = 0; i < mediaOutputs.length; i++) {
878
- const mediaOutput = mediaOutputs[i];
879
- const agentRunMediaId = agentRunMediaIds[i];
880
- if (!agentRunMediaId) {
881
- LogError(`No AIAgentRunMedia ID for media output ${i}`);
882
- continue;
883
- }
884
- try {
885
- const attachment = await md.GetEntityObject('MJ: Conversation Detail Attachments', contextUser);
886
- attachment.ConversationDetailID = conversationDetailId;
887
- attachment.MimeType = mediaOutput.mimeType;
888
- attachment.DisplayOrder = i;
889
- // Get modality ID from cached engine data
890
- const modality = aiEngine.GetModalityByName(mediaOutput.modality);
891
- if (modality) {
892
- attachment.ModalityID = modality.ID;
893
- }
894
- else {
895
- LogError(`Unknown modality: ${mediaOutput.modality}`);
896
- continue;
897
- }
898
- // Generate a filename if none provided
899
- const extension = this.getMimeTypeExtension(mediaOutput.mimeType);
900
- attachment.FileName = mediaOutput.label || `${mediaOutput.modality.toLowerCase()}_${i + 1}.${extension}`;
901
- // Store inline data for small media
902
- // In the future, consider MJStorage for large files
903
- if (mediaOutput.data) {
904
- attachment.InlineData = mediaOutput.data;
905
- // Estimate file size from base64 length (base64 is ~33% larger than binary)
906
- attachment.FileSizeBytes = Math.ceil(mediaOutput.data.length * 0.75);
907
- }
908
- // Set dimensions if available
909
- if (mediaOutput.width) {
910
- attachment.Width = mediaOutput.width;
911
- }
912
- if (mediaOutput.height) {
913
- attachment.Height = mediaOutput.height;
914
- }
915
- if (mediaOutput.durationSeconds) {
916
- attachment.DurationSeconds = Math.ceil(mediaOutput.durationSeconds);
917
- }
918
- // Set description if available
919
- if (mediaOutput.description) {
920
- attachment.Description = mediaOutput.description;
921
- }
922
- const saved = await attachment.Save();
923
- if (saved) {
924
- attachmentIds.push(attachment.ID);
925
- LogStatus(`Created ConversationDetailAttachment: ${attachment.ID} (${mediaOutput.modality})`);
926
- }
927
- else {
928
- LogError(`Failed to create attachment: ${attachment.LatestResult?.Message}`);
868
+ let successCount = 0;
869
+ for (let i = 0; i < mediaOutputs.length; i++) {
870
+ const media = mediaOutputs[i];
871
+ try {
872
+ const extension = this.getMimeTypeExtension(media.mimeType);
873
+ const fileName = media.label || `${media.modality.toLowerCase()}_${i + 1}.${extension}`;
874
+ const estimatedSizeBytes = media.data
875
+ ? Math.ceil(media.data.length * 0.75)
876
+ : undefined;
877
+ await this.createArtifactWithVersion({
878
+ mimeType: media.mimeType,
879
+ fileName,
880
+ sizeBytes: estimatedSizeBytes,
881
+ conversationDetailId,
882
+ contextUser,
883
+ provider: md,
884
+ acceptUnregisteredFiles: true,
885
+ label: `media ${media.modality}`,
886
+ setVersionFields: (version) => {
887
+ // DecideInlineStorage applies consistent text-vs-binary storage
888
+ // decisions across all artifact creation paths. For media (images,
889
+ // audio, video), it wraps the base64 in a data URL; for text-y
890
+ // MIMEs it decodes to UTF-8. Same helper the server hook and
891
+ // ConversationAttachmentService use.
892
+ if (media.data) {
893
+ const stored = DecideInlineStorage(media.mimeType, media.data);
894
+ version.ContentMode = stored.contentMode;
895
+ version.Content = stored.content;
896
+ }
929
897
  }
930
- }
931
- catch (attachError) {
932
- LogError(`Error creating attachment ${i}: ${attachError.message}`);
933
- }
898
+ });
899
+ successCount++;
900
+ }
901
+ catch (error) {
902
+ LogError(`Error creating media artifact ${i} (${media.modality}): ${error.message}`);
934
903
  }
935
- LogStatus(`Created ${attachmentIds.length} conversation attachments for detail ${conversationDetailId}`);
936
- return attachmentIds;
937
- }
938
- catch (error) {
939
- LogError(`Error in CreateConversationMediaAttachments: ${error.message}`);
940
- return attachmentIds;
941
904
  }
905
+ LogStatus(`Created ${successCount} of ${mediaOutputs.length} media artifact(s) for detail ${conversationDetailId}`);
942
906
  }
943
907
  // ── File artifact processing ───────────────────────────────────────────────
944
908
  /**
@@ -1241,69 +1205,11 @@ export class AgentRunner {
1241
1205
  }
1242
1206
  }
1243
1207
  }
1244
- // Back-compat path: gather ConversationDetailAttachment rows authored
1245
- // BEFORE storage unification — those have ArtifactVersionID = NULL
1246
- // and aren't represented in the junction query above. New uploads
1247
- // (server hook created the artifact pair) come through the junction
1248
- // path with ArtifactVersionID set; we skip them here to avoid
1249
- // double-counting.
1250
- //
1251
- // Resolution is via the Artifact Type registry (wildcard-aware), not
1252
- // a hardcoded MIME prefix list — same source of truth as the upload
1253
- // gate in MJConversationDetailAttachmentEntityServer.
1254
- await ArtifactMetadataEngine.Instance.Config(false, contextUser);
1255
- const attachments = await rv.RunView({
1256
- EntityName: 'MJ: Conversation Detail Attachments',
1257
- ExtraFilter: `ConversationDetailID IN ('${detailIds.join("','")}') AND ArtifactVersionID IS NULL`,
1258
- Fields: ['ID', 'MimeType', 'FileID', 'FileName', 'InlineData', 'ArtifactVersionID'],
1259
- ResultType: 'simple',
1260
- }, contextUser);
1261
- if (attachments.Success && attachments.Results.length > 0) {
1262
- for (const att of attachments.Results) {
1263
- const mime = att.MimeType ?? '';
1264
- const ext = att.FileName?.includes('.') ? att.FileName.split('.').pop() : undefined;
1265
- const artifactType = ArtifactMetadataEngine.Instance.GetArtifactTypeByMimeType(mime, ext);
1266
- if (!artifactType)
1267
- continue; // Unsupported MIME — agent has no tools for it.
1268
- let content = '';
1269
- if (att.FileID) {
1270
- const downloaded = await this.downloadArtifactFileContent(att.FileID, contextUser);
1271
- if (downloaded) {
1272
- content = downloaded;
1273
- }
1274
- else {
1275
- LogError(`[AgentRunner] Failed to download attachment file "${att.FileName}" (FileID: ${att.FileID})`);
1276
- continue;
1277
- }
1278
- }
1279
- else if (att.InlineData) {
1280
- // InlineData is base64-encoded — decode for binary files, keep as string for text
1281
- if (mime.startsWith('text/') || mime === 'application/json') {
1282
- content = Buffer.from(att.InlineData, 'base64').toString('utf-8');
1283
- }
1284
- else {
1285
- content = Buffer.from(att.InlineData, 'base64');
1286
- }
1287
- }
1288
- else {
1289
- continue; // No content available
1290
- }
1291
- inputArtifacts.push({
1292
- name: att.FileName || 'Uploaded File',
1293
- typeName: artifactType.Name,
1294
- content,
1295
- mimeType: mime || undefined,
1296
- ...(artifactType.ToolLibraryClass ? { toolLibraryClass: artifactType.ToolLibraryClass } : {}),
1297
- deliveryMode: artifactType.DefaultDeliveryMode,
1298
- forceToolsOnly: false,
1299
- });
1300
- }
1301
- }
1302
1208
  if (inputArtifacts.length > 0) {
1303
1209
  LogStatus(`[AgentRunner] Gathered ${inputArtifacts.length} input artifact(s) for conversation ${conversationId}: ${inputArtifacts.map(a => `${a.typeName}:"${a.name}" (${a.mimeType || 'no mime'})`).join(', ')}`);
1304
1210
  }
1305
1211
  else {
1306
- LogStatus(`[AgentRunner] No input artifacts found for conversation ${conversationId} (${junctions.Results.length} artifact junction(s), ${attachments.Success ? attachments.Results.length : 0} attachment(s) checked)`);
1212
+ LogStatus(`[AgentRunner] No input artifacts found for conversation ${conversationId} (${junctions.Results.length} artifact junction(s) checked)`);
1307
1213
  }
1308
1214
  return inputArtifacts;
1309
1215
  }