@memberjunction/ng-core-entity-forms 2.78.0 → 2.79.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +6 -2
  2. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
  3. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +542 -141
  4. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  5. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +19 -0
  6. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
  7. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +69 -17
  8. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  9. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts +28 -0
  10. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
  11. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +81 -5
  12. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
  13. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +11 -3
  14. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  15. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +76 -31
  16. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  17. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts +7 -1
  18. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts.map +1 -1
  19. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js +84 -18
  20. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js.map +1 -1
  21. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +5 -0
  22. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  23. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +205 -60
  24. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  25. package/dist/lib/generated/Entities/AIAgentRun/aiagentrun.form.component.js +6 -6
  26. package/dist/lib/generated/Entities/AIAgentRun/aiagentrun.form.component.js.map +1 -1
  27. package/dist/lib/generated/Entities/AIAgentRun/sections/details.component.d.ts.map +1 -1
  28. package/dist/lib/generated/Entities/AIAgentRun/sections/details.component.js +82 -4
  29. package/dist/lib/generated/Entities/AIAgentRun/sections/details.component.js.map +1 -1
  30. package/dist/lib/generated/Entities/AIConfiguration/aiconfiguration.form.component.js +19 -9
  31. package/dist/lib/generated/Entities/AIConfiguration/aiconfiguration.form.component.js.map +1 -1
  32. package/dist/lib/generated/Entities/AIModel/aimodel.form.component.js +13 -3
  33. package/dist/lib/generated/Entities/AIModel/aimodel.form.component.js.map +1 -1
  34. package/dist/lib/generated/Entities/AIPrompt/aiprompt.form.component.js +6 -6
  35. package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.d.ts.map +1 -1
  36. package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.js +60 -4
  37. package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.js.map +1 -1
  38. package/dist/lib/generated/Entities/AIVendor/aivendor.form.component.js +13 -3
  39. package/dist/lib/generated/Entities/AIVendor/aivendor.form.component.js.map +1 -1
  40. package/dist/lib/generated/Entities/User/user.form.component.js +6 -6
  41. package/dist/lib/generated/Entities/User/user.form.component.js.map +1 -1
  42. package/package.json +16 -16
@@ -145,7 +145,7 @@ function AIAgentRunFormComponentExtended_div_33_Template(rf, ctx) { if (rf & 1)
145
145
  function AIAgentRunFormComponentExtended_div_48_Template(rf, ctx) { if (rf & 1) {
146
146
  const _r3 = i0.ɵɵgetCurrentView();
147
147
  i0.ɵɵelementStart(0, "div", 42)(1, "kendo-splitter", 43)(2, "kendo-splitter-pane", 44)(3, "mj-ai-agent-run-timeline", 45);
148
- i0.ɵɵlistener("itemSelected", function AIAgentRunFormComponentExtended_div_48_Template_mj_ai_agent_run_timeline_itemSelected_3_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.selectTimelineItem($event)); })("navigateToEntity", function AIAgentRunFormComponentExtended_div_48_Template_mj_ai_agent_run_timeline_navigateToEntity_3_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.navigateToEntityRecord($event)); });
148
+ i0.ɵɵlistener("itemSelected", function AIAgentRunFormComponentExtended_div_48_Template_mj_ai_agent_run_timeline_itemSelected_3_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.selectTimelineItem($event)); })("navigateToEntity", function AIAgentRunFormComponentExtended_div_48_Template_mj_ai_agent_run_timeline_navigateToEntity_3_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.navigateToEntityRecord($event)); })("agentRunCompleted", function AIAgentRunFormComponentExtended_div_48_Template_mj_ai_agent_run_timeline_agentRunCompleted_3_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onAgentRunCompleted($event)); });
149
149
  i0.ɵɵelementEnd()();
150
150
  i0.ɵɵelementStart(4, "kendo-splitter-pane", 46)(5, "mj-ai-agent-run-step-detail", 47);
151
151
  i0.ɵɵlistener("closePanel", function AIAgentRunFormComponentExtended_div_48_Template_mj_ai_agent_run_step_detail_closePanel_5_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.closeJsonPanel()); })("navigateToActionLog", function AIAgentRunFormComponentExtended_div_48_Template_mj_ai_agent_run_step_detail_navigateToActionLog_5_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.navigateToActionLog($event)); })("copyToClipboard", function AIAgentRunFormComponentExtended_div_48_Template_mj_ai_agent_run_step_detail_copyToClipboard_5_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.copyToClipboard($event)); });
@@ -155,7 +155,7 @@ function AIAgentRunFormComponentExtended_div_48_Template(rf, ctx) { if (rf & 1)
155
155
  i0.ɵɵadvance(2);
156
156
  i0.ɵɵproperty("min", "400px");
157
157
  i0.ɵɵadvance();
158
- i0.ɵɵproperty("aiAgentRunId", ctx_r0.record.ID)("autoRefresh", ctx_r0.record.Status === "Running")("refreshInterval", 3000);
158
+ i0.ɵɵproperty("aiAgentRunId", ctx_r0.record.ID)("autoRefresh", ctx_r0.record.Status === "Running")("refreshInterval", 30000);
159
159
  i0.ɵɵadvance();
160
160
  i0.ɵɵproperty("size", "45%")("min", "300px")("collapsed", !ctx_r0.selectedTimelineItem);
161
161
  i0.ɵɵadvance();
@@ -193,7 +193,7 @@ function AIAgentRunFormComponentExtended_div_50_Template(rf, ctx) { if (rf & 1)
193
193
  } }
194
194
  function AIAgentRunFormComponentExtended_div_51_ng_template_3_a_11_Template(rf, ctx) { if (rf & 1) {
195
195
  const _r5 = i0.ɵɵgetCurrentView();
196
- i0.ɵɵelementStart(0, "a", 64);
196
+ i0.ɵɵelementStart(0, "a", 66);
197
197
  i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_div_51_ng_template_3_a_11_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.openEntityRecord("MJ: AI Agent Runs", ctx_r0.record.ParentRunID)); });
198
198
  i0.ɵɵtext(1);
199
199
  i0.ɵɵelementEnd();
@@ -209,7 +209,7 @@ function AIAgentRunFormComponentExtended_div_51_ng_template_3_span_12_Template(r
209
209
  } }
210
210
  function AIAgentRunFormComponentExtended_div_51_ng_template_3_a_17_Template(rf, ctx) { if (rf & 1) {
211
211
  const _r6 = i0.ɵɵgetCurrentView();
212
- i0.ɵɵelementStart(0, "a", 64);
212
+ i0.ɵɵelementStart(0, "a", 66);
213
213
  i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_div_51_ng_template_3_a_17_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.openEntityRecord("MJ: AI Agent Runs", ctx_r0.record.LastRunID)); });
214
214
  i0.ɵɵtext(1);
215
215
  i0.ɵɵelementEnd();
@@ -225,7 +225,7 @@ function AIAgentRunFormComponentExtended_div_51_ng_template_3_span_18_Template(r
225
225
  } }
226
226
  function AIAgentRunFormComponentExtended_div_51_ng_template_3_a_23_Template(rf, ctx) { if (rf & 1) {
227
227
  const _r7 = i0.ɵɵgetCurrentView();
228
- i0.ɵɵelementStart(0, "a", 64);
228
+ i0.ɵɵelementStart(0, "a", 66);
229
229
  i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_div_51_ng_template_3_a_23_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.openEntityRecord("Conversations", ctx_r0.record.ConversationID)); });
230
230
  i0.ɵɵtext(1);
231
231
  i0.ɵɵelementEnd();
@@ -241,7 +241,7 @@ function AIAgentRunFormComponentExtended_div_51_ng_template_3_span_24_Template(r
241
241
  } }
242
242
  function AIAgentRunFormComponentExtended_div_51_ng_template_3_a_29_Template(rf, ctx) { if (rf & 1) {
243
243
  const _r8 = i0.ɵɵgetCurrentView();
244
- i0.ɵɵelementStart(0, "a", 64);
244
+ i0.ɵɵelementStart(0, "a", 66);
245
245
  i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_div_51_ng_template_3_a_29_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.openEntityRecord("Users", ctx_r0.record.UserID)); });
246
246
  i0.ɵɵtext(1);
247
247
  i0.ɵɵelementEnd();
@@ -257,36 +257,36 @@ function AIAgentRunFormComponentExtended_div_51_ng_template_3_span_30_Template(r
257
257
  } }
258
258
  function AIAgentRunFormComponentExtended_div_51_ng_template_3_Template(rf, ctx) { if (rf & 1) {
259
259
  const _r4 = i0.ɵɵgetCurrentView();
260
- i0.ɵɵelementStart(0, "div", 62)(1, "div", 63)(2, "label");
260
+ i0.ɵɵelementStart(0, "div", 64)(1, "div", 65)(2, "label");
261
261
  i0.ɵɵtext(3, "Agent");
262
262
  i0.ɵɵelementEnd();
263
- i0.ɵɵelementStart(4, "span")(5, "a", 64);
263
+ i0.ɵɵelementStart(4, "span")(5, "a", 66);
264
264
  i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_div_51_ng_template_3_Template_a_click_5_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.openEntityRecord("AI Agents", ctx_r0.record.AgentID)); });
265
265
  i0.ɵɵtext(6);
266
266
  i0.ɵɵelementEnd()()();
267
- i0.ɵɵelementStart(7, "div", 63)(8, "label");
267
+ i0.ɵɵelementStart(7, "div", 65)(8, "label");
268
268
  i0.ɵɵtext(9, "Parent Run ID");
269
269
  i0.ɵɵelementEnd();
270
270
  i0.ɵɵelementStart(10, "span");
271
- i0.ɵɵtemplate(11, AIAgentRunFormComponentExtended_div_51_ng_template_3_a_11_Template, 2, 1, "a", 65)(12, AIAgentRunFormComponentExtended_div_51_ng_template_3_span_12_Template, 2, 0, "span", 66);
271
+ i0.ɵɵtemplate(11, AIAgentRunFormComponentExtended_div_51_ng_template_3_a_11_Template, 2, 1, "a", 67)(12, AIAgentRunFormComponentExtended_div_51_ng_template_3_span_12_Template, 2, 0, "span", 68);
272
272
  i0.ɵɵelementEnd()();
273
- i0.ɵɵelementStart(13, "div", 63)(14, "label");
273
+ i0.ɵɵelementStart(13, "div", 65)(14, "label");
274
274
  i0.ɵɵtext(15, "Last Run ID");
275
275
  i0.ɵɵelementEnd();
276
276
  i0.ɵɵelementStart(16, "span");
277
- i0.ɵɵtemplate(17, AIAgentRunFormComponentExtended_div_51_ng_template_3_a_17_Template, 2, 1, "a", 65)(18, AIAgentRunFormComponentExtended_div_51_ng_template_3_span_18_Template, 2, 0, "span", 66);
277
+ i0.ɵɵtemplate(17, AIAgentRunFormComponentExtended_div_51_ng_template_3_a_17_Template, 2, 1, "a", 67)(18, AIAgentRunFormComponentExtended_div_51_ng_template_3_span_18_Template, 2, 0, "span", 68);
278
278
  i0.ɵɵelementEnd()();
279
- i0.ɵɵelementStart(19, "div", 63)(20, "label");
279
+ i0.ɵɵelementStart(19, "div", 65)(20, "label");
280
280
  i0.ɵɵtext(21, "Conversation ID");
281
281
  i0.ɵɵelementEnd();
282
282
  i0.ɵɵelementStart(22, "span");
283
- i0.ɵɵtemplate(23, AIAgentRunFormComponentExtended_div_51_ng_template_3_a_23_Template, 2, 1, "a", 65)(24, AIAgentRunFormComponentExtended_div_51_ng_template_3_span_24_Template, 2, 0, "span", 66);
283
+ i0.ɵɵtemplate(23, AIAgentRunFormComponentExtended_div_51_ng_template_3_a_23_Template, 2, 1, "a", 67)(24, AIAgentRunFormComponentExtended_div_51_ng_template_3_span_24_Template, 2, 0, "span", 68);
284
284
  i0.ɵɵelementEnd()();
285
- i0.ɵɵelementStart(25, "div", 63)(26, "label");
285
+ i0.ɵɵelementStart(25, "div", 65)(26, "label");
286
286
  i0.ɵɵtext(27, "User");
287
287
  i0.ɵɵelementEnd();
288
288
  i0.ɵɵelementStart(28, "span");
289
- i0.ɵɵtemplate(29, AIAgentRunFormComponentExtended_div_51_ng_template_3_a_29_Template, 2, 1, "a", 65)(30, AIAgentRunFormComponentExtended_div_51_ng_template_3_span_30_Template, 2, 0, "span", 66);
289
+ i0.ɵɵtemplate(29, AIAgentRunFormComponentExtended_div_51_ng_template_3_a_29_Template, 2, 1, "a", 67)(30, AIAgentRunFormComponentExtended_div_51_ng_template_3_span_30_Template, 2, 0, "span", 68);
290
290
  i0.ɵɵelementEnd()()();
291
291
  } if (rf & 2) {
292
292
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -309,11 +309,101 @@ function AIAgentRunFormComponentExtended_div_51_ng_template_3_Template(rf, ctx)
309
309
  i0.ɵɵadvance();
310
310
  i0.ɵɵproperty("ngIf", !ctx_r0.record.UserID);
311
311
  } }
312
- function AIAgentRunFormComponentExtended_div_51_ng_template_5_div_11_Template(rf, ctx) { if (rf & 1) {
313
- i0.ɵɵelementStart(0, "div", 68)(1, "label");
312
+ function AIAgentRunFormComponentExtended_div_51_ng_template_5_a_5_Template(rf, ctx) { if (rf & 1) {
313
+ const _r9 = i0.ɵɵgetCurrentView();
314
+ i0.ɵɵelementStart(0, "a", 66);
315
+ i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_div_51_ng_template_5_a_5_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.openEntityRecord("AI Configurations", ctx_r0.record.ConfigurationID)); });
316
+ i0.ɵɵtext(1);
317
+ i0.ɵɵelementEnd();
318
+ } if (rf & 2) {
319
+ const ctx_r0 = i0.ɵɵnextContext(3);
320
+ i0.ɵɵadvance();
321
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.record.Configuration || "N/A", " ");
322
+ } }
323
+ function AIAgentRunFormComponentExtended_div_51_ng_template_5_span_6_Template(rf, ctx) { if (rf & 1) {
324
+ i0.ɵɵelementStart(0, "span");
325
+ i0.ɵɵtext(1, "N/A");
326
+ i0.ɵɵelementEnd();
327
+ } }
328
+ function AIAgentRunFormComponentExtended_div_51_ng_template_5_a_11_Template(rf, ctx) { if (rf & 1) {
329
+ const _r10 = i0.ɵɵgetCurrentView();
330
+ i0.ɵɵelementStart(0, "a", 66);
331
+ i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_div_51_ng_template_5_a_11_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.openEntityRecord("AI Models", ctx_r0.record.OverrideModelID)); });
332
+ i0.ɵɵtext(1);
333
+ i0.ɵɵelementEnd();
334
+ } if (rf & 2) {
335
+ const ctx_r0 = i0.ɵɵnextContext(3);
336
+ i0.ɵɵadvance();
337
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.record.OverrideModel || "N/A", " ");
338
+ } }
339
+ function AIAgentRunFormComponentExtended_div_51_ng_template_5_span_12_Template(rf, ctx) { if (rf & 1) {
340
+ i0.ɵɵelementStart(0, "span");
341
+ i0.ɵɵtext(1, "N/A");
342
+ i0.ɵɵelementEnd();
343
+ } }
344
+ function AIAgentRunFormComponentExtended_div_51_ng_template_5_a_17_Template(rf, ctx) { if (rf & 1) {
345
+ const _r11 = i0.ɵɵgetCurrentView();
346
+ i0.ɵɵelementStart(0, "a", 66);
347
+ i0.ɵɵlistener("click", function AIAgentRunFormComponentExtended_div_51_ng_template_5_a_17_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.openEntityRecord("AI Vendors", ctx_r0.record.OverrideVendorID)); });
348
+ i0.ɵɵtext(1);
349
+ i0.ɵɵelementEnd();
350
+ } if (rf & 2) {
351
+ const ctx_r0 = i0.ɵɵnextContext(3);
352
+ i0.ɵɵadvance();
353
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.record.OverrideVendor || "N/A", " ");
354
+ } }
355
+ function AIAgentRunFormComponentExtended_div_51_ng_template_5_span_18_Template(rf, ctx) { if (rf & 1) {
356
+ i0.ɵɵelementStart(0, "span");
357
+ i0.ɵɵtext(1, "N/A");
358
+ i0.ɵɵelementEnd();
359
+ } }
360
+ function AIAgentRunFormComponentExtended_div_51_ng_template_5_Template(rf, ctx) { if (rf & 1) {
361
+ i0.ɵɵelementStart(0, "div", 64)(1, "div", 65)(2, "label");
362
+ i0.ɵɵtext(3, "Configuration");
363
+ i0.ɵɵelementEnd();
364
+ i0.ɵɵelementStart(4, "span");
365
+ i0.ɵɵtemplate(5, AIAgentRunFormComponentExtended_div_51_ng_template_5_a_5_Template, 2, 1, "a", 67)(6, AIAgentRunFormComponentExtended_div_51_ng_template_5_span_6_Template, 2, 0, "span", 68);
366
+ i0.ɵɵelementEnd()();
367
+ i0.ɵɵelementStart(7, "div", 65)(8, "label");
368
+ i0.ɵɵtext(9, "Override Model");
369
+ i0.ɵɵelementEnd();
370
+ i0.ɵɵelementStart(10, "span");
371
+ i0.ɵɵtemplate(11, AIAgentRunFormComponentExtended_div_51_ng_template_5_a_11_Template, 2, 1, "a", 67)(12, AIAgentRunFormComponentExtended_div_51_ng_template_5_span_12_Template, 2, 0, "span", 68);
372
+ i0.ɵɵelementEnd()();
373
+ i0.ɵɵelementStart(13, "div", 65)(14, "label");
374
+ i0.ɵɵtext(15, "Override Vendor");
375
+ i0.ɵɵelementEnd();
376
+ i0.ɵɵelementStart(16, "span");
377
+ i0.ɵɵtemplate(17, AIAgentRunFormComponentExtended_div_51_ng_template_5_a_17_Template, 2, 1, "a", 67)(18, AIAgentRunFormComponentExtended_div_51_ng_template_5_span_18_Template, 2, 0, "span", 68);
378
+ i0.ɵɵelementEnd()();
379
+ i0.ɵɵelementStart(19, "div", 65)(20, "label");
380
+ i0.ɵɵtext(21, "Verbose Logging");
381
+ i0.ɵɵelementEnd();
382
+ i0.ɵɵelementStart(22, "span");
383
+ i0.ɵɵtext(23);
384
+ i0.ɵɵelementEnd()()();
385
+ } if (rf & 2) {
386
+ const ctx_r0 = i0.ɵɵnextContext(2);
387
+ i0.ɵɵadvance(5);
388
+ i0.ɵɵproperty("ngIf", ctx_r0.record.ConfigurationID);
389
+ i0.ɵɵadvance();
390
+ i0.ɵɵproperty("ngIf", !ctx_r0.record.ConfigurationID);
391
+ i0.ɵɵadvance(5);
392
+ i0.ɵɵproperty("ngIf", ctx_r0.record.OverrideModelID);
393
+ i0.ɵɵadvance();
394
+ i0.ɵɵproperty("ngIf", !ctx_r0.record.OverrideModelID);
395
+ i0.ɵɵadvance(5);
396
+ i0.ɵɵproperty("ngIf", ctx_r0.record.OverrideVendorID);
397
+ i0.ɵɵadvance();
398
+ i0.ɵɵproperty("ngIf", !ctx_r0.record.OverrideVendorID);
399
+ i0.ɵɵadvance(5);
400
+ i0.ɵɵtextInterpolate(ctx_r0.record.Verbose ? "Yes" : "No");
401
+ } }
402
+ function AIAgentRunFormComponentExtended_div_51_ng_template_7_div_11_Template(rf, ctx) { if (rf & 1) {
403
+ i0.ɵɵelementStart(0, "div", 70)(1, "label");
314
404
  i0.ɵɵtext(2, "Error Message");
315
405
  i0.ɵɵelementEnd();
316
- i0.ɵɵelementStart(3, "div", 69);
406
+ i0.ɵɵelementStart(3, "div", 71);
317
407
  i0.ɵɵtext(4);
318
408
  i0.ɵɵelementEnd()();
319
409
  } if (rf & 2) {
@@ -321,20 +411,20 @@ function AIAgentRunFormComponentExtended_div_51_ng_template_5_div_11_Template(rf
321
411
  i0.ɵɵadvance(4);
322
412
  i0.ɵɵtextInterpolate(ctx_r0.record.ErrorMessage);
323
413
  } }
324
- function AIAgentRunFormComponentExtended_div_51_ng_template_5_Template(rf, ctx) { if (rf & 1) {
325
- i0.ɵɵelementStart(0, "div", 62)(1, "div", 63)(2, "label");
414
+ function AIAgentRunFormComponentExtended_div_51_ng_template_7_Template(rf, ctx) { if (rf & 1) {
415
+ i0.ɵɵelementStart(0, "div", 64)(1, "div", 65)(2, "label");
326
416
  i0.ɵɵtext(3, "Status");
327
417
  i0.ɵɵelementEnd();
328
418
  i0.ɵɵelementStart(4, "span", 15);
329
419
  i0.ɵɵtext(5);
330
420
  i0.ɵɵelementEnd()();
331
- i0.ɵɵelementStart(6, "div", 63)(7, "label");
421
+ i0.ɵɵelementStart(6, "div", 65)(7, "label");
332
422
  i0.ɵɵtext(8, "Success");
333
423
  i0.ɵɵelementEnd();
334
424
  i0.ɵɵelementStart(9, "span");
335
425
  i0.ɵɵtext(10);
336
426
  i0.ɵɵelementEnd()();
337
- i0.ɵɵtemplate(11, AIAgentRunFormComponentExtended_div_51_ng_template_5_div_11_Template, 5, 1, "div", 67);
427
+ i0.ɵɵtemplate(11, AIAgentRunFormComponentExtended_div_51_ng_template_7_div_11_Template, 5, 1, "div", 69);
338
428
  i0.ɵɵelementEnd();
339
429
  } if (rf & 2) {
340
430
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -349,36 +439,36 @@ function AIAgentRunFormComponentExtended_div_51_ng_template_5_Template(rf, ctx)
349
439
  i0.ɵɵadvance();
350
440
  i0.ɵɵproperty("ngIf", ctx_r0.record.ErrorMessage);
351
441
  } }
352
- function AIAgentRunFormComponentExtended_div_51_ng_template_7_Template(rf, ctx) { if (rf & 1) {
353
- i0.ɵɵelementStart(0, "div", 62)(1, "div", 63)(2, "label");
442
+ function AIAgentRunFormComponentExtended_div_51_ng_template_9_Template(rf, ctx) { if (rf & 1) {
443
+ i0.ɵɵelementStart(0, "div", 64)(1, "div", 65)(2, "label");
354
444
  i0.ɵɵtext(3, "Total Tokens Used");
355
445
  i0.ɵɵelementEnd();
356
446
  i0.ɵɵelementStart(4, "span");
357
447
  i0.ɵɵtext(5);
358
448
  i0.ɵɵpipe(6, "number");
359
449
  i0.ɵɵelementEnd()();
360
- i0.ɵɵelementStart(7, "div", 63)(8, "label");
450
+ i0.ɵɵelementStart(7, "div", 65)(8, "label");
361
451
  i0.ɵɵtext(9, "Prompt Tokens");
362
452
  i0.ɵɵelementEnd();
363
453
  i0.ɵɵelementStart(10, "span");
364
454
  i0.ɵɵtext(11);
365
455
  i0.ɵɵpipe(12, "number");
366
456
  i0.ɵɵelementEnd()();
367
- i0.ɵɵelementStart(13, "div", 63)(14, "label");
457
+ i0.ɵɵelementStart(13, "div", 65)(14, "label");
368
458
  i0.ɵɵtext(15, "Completion Tokens");
369
459
  i0.ɵɵelementEnd();
370
460
  i0.ɵɵelementStart(16, "span");
371
461
  i0.ɵɵtext(17);
372
462
  i0.ɵɵpipe(18, "number");
373
463
  i0.ɵɵelementEnd()();
374
- i0.ɵɵelementStart(19, "div", 63)(20, "label");
464
+ i0.ɵɵelementStart(19, "div", 65)(20, "label");
375
465
  i0.ɵɵtext(21, "Total Cost");
376
466
  i0.ɵɵelementEnd();
377
467
  i0.ɵɵelementStart(22, "span");
378
468
  i0.ɵɵtext(23);
379
469
  i0.ɵɵpipe(24, "number");
380
470
  i0.ɵɵelementEnd()();
381
- i0.ɵɵelementStart(25, "div", 63)(26, "label");
471
+ i0.ɵɵelementStart(25, "div", 65)(26, "label");
382
472
  i0.ɵɵtext(27, "Total Prompt Iterations");
383
473
  i0.ɵɵelementEnd();
384
474
  i0.ɵɵelementStart(28, "span");
@@ -398,60 +488,74 @@ function AIAgentRunFormComponentExtended_div_51_ng_template_7_Template(rf, ctx)
398
488
  i0.ɵɵadvance(6);
399
489
  i0.ɵɵtextInterpolate(ctx_r0.record.TotalPromptIterations != null ? i0.ɵɵpipeBind2(30, 17, ctx_r0.record.TotalPromptIterations, "1.0-0") : "N/A");
400
490
  } }
401
- function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_8_ng_template_1_Template(rf, ctx) { if (rf & 1) {
402
- i0.ɵɵelementStart(0, "div", 71);
403
- i0.ɵɵelement(1, "mj-code-editor", 72);
491
+ function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_10_ng_template_1_Template(rf, ctx) { if (rf & 1) {
492
+ i0.ɵɵelementStart(0, "div", 73);
493
+ i0.ɵɵelement(1, "mj-code-editor", 74);
404
494
  i0.ɵɵelementEnd();
405
495
  } if (rf & 2) {
406
496
  const ctx_r0 = i0.ɵɵnextContext(3);
407
497
  i0.ɵɵadvance();
408
498
  i0.ɵɵproperty("ngModel", ctx_r0.parsedResult)("language", "json")("readonly", true);
409
499
  } }
410
- function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_8_Template(rf, ctx) { if (rf & 1) {
411
- i0.ɵɵelementStart(0, "kendo-panelbar-item", 70);
412
- i0.ɵɵtemplate(1, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_8_ng_template_1_Template, 2, 3, "ng-template", 55);
500
+ function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_10_Template(rf, ctx) { if (rf & 1) {
501
+ i0.ɵɵelementStart(0, "kendo-panelbar-item", 72);
502
+ i0.ɵɵtemplate(1, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_10_ng_template_1_Template, 2, 3, "ng-template", 55);
413
503
  i0.ɵɵelementEnd();
414
504
  } }
415
- function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_9_ng_template_1_Template(rf, ctx) { if (rf & 1) {
416
- i0.ɵɵelementStart(0, "div", 71);
417
- i0.ɵɵelement(1, "mj-code-editor", 72);
505
+ function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_11_ng_template_1_Template(rf, ctx) { if (rf & 1) {
506
+ i0.ɵɵelementStart(0, "div", 73);
507
+ i0.ɵɵelement(1, "mj-code-editor", 74);
418
508
  i0.ɵɵelementEnd();
419
509
  } if (rf & 2) {
420
510
  const ctx_r0 = i0.ɵɵnextContext(3);
421
511
  i0.ɵɵadvance();
422
512
  i0.ɵɵproperty("ngModel", ctx_r0.parsedStartingPayload)("language", "json")("readonly", true);
423
513
  } }
424
- function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_9_Template(rf, ctx) { if (rf & 1) {
425
- i0.ɵɵelementStart(0, "kendo-panelbar-item", 73);
426
- i0.ɵɵtemplate(1, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_9_ng_template_1_Template, 2, 3, "ng-template", 55);
514
+ function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_11_Template(rf, ctx) { if (rf & 1) {
515
+ i0.ɵɵelementStart(0, "kendo-panelbar-item", 75);
516
+ i0.ɵɵtemplate(1, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_11_ng_template_1_Template, 2, 3, "ng-template", 55);
427
517
  i0.ɵɵelementEnd();
428
518
  } }
429
- function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_10_ng_template_1_Template(rf, ctx) { if (rf & 1) {
430
- i0.ɵɵelementStart(0, "div", 71);
431
- i0.ɵɵelement(1, "mj-code-editor", 72);
519
+ function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_12_ng_template_1_Template(rf, ctx) { if (rf & 1) {
520
+ i0.ɵɵelementStart(0, "div", 73);
521
+ i0.ɵɵelement(1, "mj-code-editor", 74);
522
+ i0.ɵɵelementEnd();
523
+ } if (rf & 2) {
524
+ const ctx_r0 = i0.ɵɵnextContext(3);
525
+ i0.ɵɵadvance();
526
+ i0.ɵɵproperty("ngModel", ctx_r0.parsedData)("language", "json")("readonly", true);
527
+ } }
528
+ function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_12_Template(rf, ctx) { if (rf & 1) {
529
+ i0.ɵɵelementStart(0, "kendo-panelbar-item", 76);
530
+ i0.ɵɵtemplate(1, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_12_ng_template_1_Template, 2, 3, "ng-template", 55);
531
+ i0.ɵɵelementEnd();
532
+ } }
533
+ function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_13_ng_template_1_Template(rf, ctx) { if (rf & 1) {
534
+ i0.ɵɵelementStart(0, "div", 73);
535
+ i0.ɵɵelement(1, "mj-code-editor", 74);
432
536
  i0.ɵɵelementEnd();
433
537
  } if (rf & 2) {
434
538
  const ctx_r0 = i0.ɵɵnextContext(3);
435
539
  i0.ɵɵadvance();
436
540
  i0.ɵɵproperty("ngModel", ctx_r0.parsedFinalPayload)("language", "json")("readonly", true);
437
541
  } }
438
- function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_10_Template(rf, ctx) { if (rf & 1) {
439
- i0.ɵɵelementStart(0, "kendo-panelbar-item", 74);
440
- i0.ɵɵtemplate(1, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_10_ng_template_1_Template, 2, 3, "ng-template", 55);
542
+ function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_13_Template(rf, ctx) { if (rf & 1) {
543
+ i0.ɵɵelementStart(0, "kendo-panelbar-item", 77);
544
+ i0.ɵɵtemplate(1, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_13_ng_template_1_Template, 2, 3, "ng-template", 55);
441
545
  i0.ɵɵelementEnd();
442
546
  } }
443
- function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_11_ng_template_1_Template(rf, ctx) { if (rf & 1) {
444
- i0.ɵɵelementStart(0, "div", 76);
445
- i0.ɵɵelement(1, "mj-deep-diff", 77);
547
+ function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_14_ng_template_1_Template(rf, ctx) { if (rf & 1) {
548
+ i0.ɵɵelementStart(0, "div", 79);
549
+ i0.ɵɵelement(1, "mj-deep-diff", 80);
446
550
  i0.ɵɵelementEnd();
447
551
  } if (rf & 2) {
448
552
  const ctx_r0 = i0.ɵɵnextContext(3);
449
553
  i0.ɵɵadvance();
450
554
  i0.ɵɵproperty("oldValue", ctx_r0.startingPayloadObject)("newValue", ctx_r0.finalPayloadObject)("title", "")("showSummary", true)("showUnchanged", false)("expandAll", false)("maxDepth", 10)("maxStringLength", 200)("treatNullAsUndefined", true);
451
555
  } }
452
- function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_11_Template(rf, ctx) { if (rf & 1) {
453
- i0.ɵɵelementStart(0, "kendo-panelbar-item", 75);
454
- i0.ɵɵtemplate(1, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_11_ng_template_1_Template, 2, 9, "ng-template", 55);
556
+ function AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_14_Template(rf, ctx) { if (rf & 1) {
557
+ i0.ɵɵelementStart(0, "kendo-panelbar-item", 78);
558
+ i0.ɵɵtemplate(1, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_14_ng_template_1_Template, 2, 9, "ng-template", 55);
455
559
  i0.ɵɵelementEnd();
456
560
  } }
457
561
  function AIAgentRunFormComponentExtended_div_51_Template(rf, ctx) { if (rf & 1) {
@@ -459,12 +563,15 @@ function AIAgentRunFormComponentExtended_div_51_Template(rf, ctx) { if (rf & 1)
459
563
  i0.ɵɵtemplate(3, AIAgentRunFormComponentExtended_div_51_ng_template_3_Template, 31, 9, "ng-template", 55);
460
564
  i0.ɵɵelementEnd();
461
565
  i0.ɵɵelementStart(4, "kendo-panelbar-item", 56);
462
- i0.ɵɵtemplate(5, AIAgentRunFormComponentExtended_div_51_ng_template_5_Template, 12, 8, "ng-template", 55);
566
+ i0.ɵɵtemplate(5, AIAgentRunFormComponentExtended_div_51_ng_template_5_Template, 24, 7, "ng-template", 55);
463
567
  i0.ɵɵelementEnd();
464
568
  i0.ɵɵelementStart(6, "kendo-panelbar-item", 57);
465
- i0.ɵɵtemplate(7, AIAgentRunFormComponentExtended_div_51_ng_template_7_Template, 31, 20, "ng-template", 55);
569
+ i0.ɵɵtemplate(7, AIAgentRunFormComponentExtended_div_51_ng_template_7_Template, 12, 8, "ng-template", 55);
570
+ i0.ɵɵelementEnd();
571
+ i0.ɵɵelementStart(8, "kendo-panelbar-item", 58);
572
+ i0.ɵɵtemplate(9, AIAgentRunFormComponentExtended_div_51_ng_template_9_Template, 31, 20, "ng-template", 55);
466
573
  i0.ɵɵelementEnd();
467
- i0.ɵɵtemplate(8, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_8_Template, 2, 0, "kendo-panelbar-item", 58)(9, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_9_Template, 2, 0, "kendo-panelbar-item", 59)(10, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_10_Template, 2, 0, "kendo-panelbar-item", 60)(11, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_11_Template, 2, 0, "kendo-panelbar-item", 61);
574
+ i0.ɵɵtemplate(10, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_10_Template, 2, 0, "kendo-panelbar-item", 59)(11, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_11_Template, 2, 0, "kendo-panelbar-item", 60)(12, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_12_Template, 2, 0, "kendo-panelbar-item", 61)(13, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_13_Template, 2, 0, "kendo-panelbar-item", 62)(14, AIAgentRunFormComponentExtended_div_51_kendo_panelbar_item_14_Template, 2, 0, "kendo-panelbar-item", 63);
468
575
  i0.ɵɵelementEnd()();
469
576
  } if (rf & 2) {
470
577
  const ctx_r0 = i0.ɵɵnextContext();
@@ -472,11 +579,13 @@ function AIAgentRunFormComponentExtended_div_51_Template(rf, ctx) { if (rf & 1)
472
579
  i0.ɵɵproperty("keepItemContent", true);
473
580
  i0.ɵɵadvance();
474
581
  i0.ɵɵproperty("expanded", true);
475
- i0.ɵɵadvance(6);
582
+ i0.ɵɵadvance(8);
476
583
  i0.ɵɵproperty("ngIf", ctx_r0.record.Result);
477
584
  i0.ɵɵadvance();
478
585
  i0.ɵɵproperty("ngIf", ctx_r0.record.StartingPayload);
479
586
  i0.ɵɵadvance();
587
+ i0.ɵɵproperty("ngIf", ctx_r0.record.Data);
588
+ i0.ɵɵadvance();
480
589
  i0.ɵɵproperty("ngIf", ctx_r0.record.FinalPayload);
481
590
  i0.ɵɵadvance();
482
591
  i0.ɵɵproperty("ngIf", ctx_r0.showPayloadDiff);
@@ -637,6 +746,13 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
637
746
  console.error('Failed to copy to clipboard:', err);
638
747
  }
639
748
  }
749
+ onAgentRunCompleted(status) {
750
+ // Update the record status
751
+ this.record.Status = status;
752
+ this.cdr.detectChanges();
753
+ // Reload the full record to get updated data
754
+ this.refreshData();
755
+ }
640
756
  /**
641
757
  * Get the Result field with recursive JSON parsing applied
642
758
  */
@@ -724,6 +840,35 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
724
840
  return this.record.FinalPayload;
725
841
  }
726
842
  }
843
+ /**
844
+ * Get the Data field with recursive JSON parsing applied
845
+ */
846
+ get parsedData() {
847
+ if (!this.record?.Data)
848
+ return '';
849
+ try {
850
+ // First, check if Data is a JSON string that needs to be parsed
851
+ let data = this.record.Data;
852
+ try {
853
+ // If Data is a JSON string, parse it first
854
+ data = JSON.parse(this.record.Data);
855
+ }
856
+ catch {
857
+ // If it's not valid JSON, use it as-is
858
+ data = this.record.Data;
859
+ }
860
+ const parseOptions = {
861
+ extractInlineJson: true,
862
+ maxDepth: 100,
863
+ debug: false
864
+ };
865
+ const parsed = ParseJSONRecursive(data, parseOptions);
866
+ return JSON.stringify(parsed, null, 2);
867
+ }
868
+ catch (e) {
869
+ return this.record.Data;
870
+ }
871
+ }
727
872
  /**
728
873
  * Get parsed Starting Payload as an object for deep diff
729
874
  */
@@ -872,7 +1017,7 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
872
1017
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.timelineComponent = _t.first);
873
1018
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.analyticsComponent = _t.first);
874
1019
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.visualizationComponent = _t.first);
875
- } }, features: [i0.ɵɵInheritDefinitionFeature], decls: 52, vars: 27, consts: [["visualizationComponent", ""], ["analyticsComponent", ""], [1, "record-form-container", "ai-agent-run-form"], [1, "record-form"], [1, "header"], [1, "header-content"], [1, "header-left"], [1, "icon-wrapper"], [1, "fas", "fa-robot"], [1, "header-info"], [1, "meta-info"], ["class", "agent-name", 4, "ngIf"], [1, "run-id"], ["class", "parent-run", 4, "ngIf"], [1, "header-right"], [1, "status-badge"], [1, "fas", 3, "ngClass"], [1, "header-actions"], ["title", "Refresh", 1, "btn-icon", 3, "click"], [1, "fas", "fa-sync-alt"], [1, "header-stats"], [1, "stat"], [1, "label"], [1, "value"], ["class", "stat", 4, "ngIf"], [1, "tabs"], [1, "tab", 3, "click"], [1, "fas", "fa-stream"], [1, "fas", "fa-diagram-project"], [1, "fas", "fa-chart-line"], [1, "fas", "fa-info-circle"], [1, "content-area"], ["class", "tab-content", "style", "height: 100%;", 4, "ngIf"], ["class", "tab-content", 4, "ngIf"], [1, "agent-name"], [1, "parent-run"], [1, "fas", "fa-level-up-alt"], [1, "parent-link", 3, "click"], ["class", "value", 4, "ngIf"], ["class", "value loading", 4, "ngIf"], [1, "value", "loading"], [1, "fas", "fa-spinner", "fa-spin"], [1, "tab-content", 2, "height", "100%"], ["orientation", "horizontal", 2, "height", "100%"], [3, "min"], [3, "itemSelected", "navigateToEntity", "aiAgentRunId", "autoRefresh", "refreshInterval"], [3, "size", "min", "collapsed"], [3, "closePanel", "navigateToActionLog", "copyToClipboard", "selectedTimelineItem"], [3, "aiAgentRunId", 4, "ngIf"], [3, "aiAgentRunId"], [3, "agentRunId", 4, "ngIf"], [3, "agentRunId"], [1, "tab-content"], [3, "keepItemContent"], ["title", "General Information", 3, "expanded"], ["kendoPanelBarContent", ""], ["title", "Execution Status"], ["title", "Usage & Cost"], ["title", "Result", 4, "ngIf"], ["title", "Starting Payload", 4, "ngIf"], ["title", "Final Payload", 4, "ngIf"], ["title", "Payload Diff", 4, "ngIf"], [1, "details-grid"], [1, "detail-item"], ["href", "javascript:void(0)", 1, "entity-link", 3, "click"], ["href", "javascript:void(0)", "class", "entity-link", 3, "click", 4, "ngIf"], [4, "ngIf"], ["class", "detail-item full-width", 4, "ngIf"], [1, "detail-item", "full-width"], [1, "error-message"], ["title", "Result"], [1, "result-viewer"], [2, "height", "300px", "width", "100%", 3, "ngModel", "language", "readonly"], ["title", "Starting Payload"], ["title", "Final Payload"], ["title", "Payload Diff"], [2, "padding", "20px", "background", "#f8f9fa"], [3, "oldValue", "newValue", "title", "showSummary", "showUnchanged", "expandAll", "maxDepth", "maxStringLength", "treatNullAsUndefined"]], template: function AIAgentRunFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
1020
+ } }, features: [i0.ɵɵInheritDefinitionFeature], decls: 52, vars: 27, consts: [["visualizationComponent", ""], ["analyticsComponent", ""], [1, "record-form-container", "ai-agent-run-form"], [1, "record-form"], [1, "header"], [1, "header-content"], [1, "header-left"], [1, "icon-wrapper"], [1, "fas", "fa-robot"], [1, "header-info"], [1, "meta-info"], ["class", "agent-name", 4, "ngIf"], [1, "run-id"], ["class", "parent-run", 4, "ngIf"], [1, "header-right"], [1, "status-badge"], [1, "fas", 3, "ngClass"], [1, "header-actions"], ["title", "Refresh", 1, "btn-icon", 3, "click"], [1, "fas", "fa-sync-alt"], [1, "header-stats"], [1, "stat"], [1, "label"], [1, "value"], ["class", "stat", 4, "ngIf"], [1, "tabs"], [1, "tab", 3, "click"], [1, "fas", "fa-stream"], [1, "fas", "fa-diagram-project"], [1, "fas", "fa-chart-line"], [1, "fas", "fa-info-circle"], [1, "content-area"], ["class", "tab-content", "style", "height: 100%;", 4, "ngIf"], ["class", "tab-content", 4, "ngIf"], [1, "agent-name"], [1, "parent-run"], [1, "fas", "fa-level-up-alt"], [1, "parent-link", 3, "click"], ["class", "value", 4, "ngIf"], ["class", "value loading", 4, "ngIf"], [1, "value", "loading"], [1, "fas", "fa-spinner", "fa-spin"], [1, "tab-content", 2, "height", "100%"], ["orientation", "horizontal", 2, "height", "100%"], [3, "min"], [3, "itemSelected", "navigateToEntity", "agentRunCompleted", "aiAgentRunId", "autoRefresh", "refreshInterval"], [3, "size", "min", "collapsed"], [3, "closePanel", "navigateToActionLog", "copyToClipboard", "selectedTimelineItem"], [3, "aiAgentRunId", 4, "ngIf"], [3, "aiAgentRunId"], [3, "agentRunId", 4, "ngIf"], [3, "agentRunId"], [1, "tab-content"], [3, "keepItemContent"], ["title", "General Information", 3, "expanded"], ["kendoPanelBarContent", ""], ["title", "Execution Settings"], ["title", "Execution Status"], ["title", "Usage & Cost"], ["title", "Result", 4, "ngIf"], ["title", "Starting Payload", 4, "ngIf"], ["title", "Execution Data", 4, "ngIf"], ["title", "Final Payload", 4, "ngIf"], ["title", "Payload Diff", 4, "ngIf"], [1, "details-grid"], [1, "detail-item"], ["href", "javascript:void(0)", 1, "entity-link", 3, "click"], ["href", "javascript:void(0)", "class", "entity-link", 3, "click", 4, "ngIf"], [4, "ngIf"], ["class", "detail-item full-width", 4, "ngIf"], [1, "detail-item", "full-width"], [1, "error-message"], ["title", "Result"], [1, "result-viewer"], [2, "height", "300px", "width", "100%", 3, "ngModel", "language", "readonly"], ["title", "Starting Payload"], ["title", "Execution Data"], ["title", "Final Payload"], ["title", "Payload Diff"], [2, "padding", "20px", "background", "#f8f9fa"], [3, "oldValue", "newValue", "title", "showSummary", "showUnchanged", "expandAll", "maxDepth", "maxStringLength", "treatNullAsUndefined"]], template: function AIAgentRunFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
876
1021
  i0.ɵɵelementStart(0, "div", 2)(1, "div", 3)(2, "div", 4)(3, "div", 5)(4, "div", 6)(5, "div", 7);
877
1022
  i0.ɵɵelement(6, "i", 8);
878
1023
  i0.ɵɵelementEnd();
@@ -924,7 +1069,7 @@ let AIAgentRunFormComponentExtended = class AIAgentRunFormComponentExtended exte
924
1069
  i0.ɵɵtext(46, " Details ");
925
1070
  i0.ɵɵelementEnd()();
926
1071
  i0.ɵɵelementStart(47, "div", 31);
927
- i0.ɵɵtemplate(48, AIAgentRunFormComponentExtended_div_48_Template, 6, 8, "div", 32)(49, AIAgentRunFormComponentExtended_div_49_Template, 2, 1, "div", 32)(50, AIAgentRunFormComponentExtended_div_50_Template, 2, 1, "div", 32)(51, AIAgentRunFormComponentExtended_div_51_Template, 12, 6, "div", 33);
1072
+ i0.ɵɵtemplate(48, AIAgentRunFormComponentExtended_div_48_Template, 6, 8, "div", 32)(49, AIAgentRunFormComponentExtended_div_49_Template, 2, 1, "div", 32)(50, AIAgentRunFormComponentExtended_div_50_Template, 2, 1, "div", 32)(51, AIAgentRunFormComponentExtended_div_51_Template, 15, 7, "div", 33);
928
1073
  i0.ɵɵelementEnd()()();
929
1074
  } if (rf & 2) {
930
1075
  i0.ɵɵadvance(11);
@@ -975,7 +1120,7 @@ AIAgentRunFormComponentExtended = __decorate([
975
1120
  export { AIAgentRunFormComponentExtended };
976
1121
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIAgentRunFormComponentExtended, [{
977
1122
  type: Component,
978
- args: [{ selector: 'mj-ai-agent-run-form', template: "<div class=\"record-form-container ai-agent-run-form\">\n <div class=\"record-form\">\n <!-- Header -->\n <div class=\"header\">\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"icon-wrapper\">\n <i class=\"fas fa-robot\"></i>\n </div>\n <div class=\"header-info\">\n <h2>AI Agent Run</h2>\n <div class=\"meta-info\">\n <span class=\"agent-name\" *ngIf=\"agent\">{{ agent.Name }}</span>\n <span class=\"run-id\">{{ record.ID }}</span>\n <span class=\"parent-run\" *ngIf=\"record.ParentRunID\">\n <i class=\"fas fa-level-up-alt\"></i>\n <a (click)=\"navigateToParentRun()\" class=\"parent-link\">Parent Run</a>\n </span>\n </div>\n </div>\n </div>\n <div class=\"header-right\">\n <div class=\"status-badge\" [attr.data-status]=\"record.Status\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon(record.Status || '')\"></i>\n {{ record.Status }}\n </div>\n <div class=\"header-actions\">\n <button class=\"btn-icon\" (click)=\"refreshData()\" title=\"Refresh\">\n <i class=\"fas fa-sync-alt\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"header-stats\">\n <div class=\"stat\">\n <span class=\"label\">Started</span>\n <span class=\"value\">{{ record.StartedAt | date:'medium' }}</span>\n </div>\n <div class=\"stat\" *ngIf=\"record.CompletedAt\">\n <span class=\"label\">Completed</span>\n <span class=\"value\">{{ record.CompletedAt | date:'medium' }}</span>\n </div>\n <div class=\"stat\" *ngIf=\"record.CompletedAt\">\n <span class=\"label\">Duration</span>\n <span class=\"value\">{{ calculateDuration(record.StartedAt, record.CompletedAt) }}</span>\n </div>\n <div class=\"stat\" *ngIf=\"record.Success !== null && record.CompletedAt !== null\">\n <span class=\"label\">Result</span>\n <span class=\"value\" [class.success]=\"record.Success\" [class.error]=\"!record.Success\">\n {{ record.Success ? 'Success' : 'Failed' }}\n </span>\n </div>\n <div class=\"stat\" *ngIf=\"costMetrics && (costMetrics.totalTokensInput + costMetrics.totalTokensOutput) > 0\">\n <span class=\"label\">Tokens</span>\n <span class=\"value\" *ngIf=\"!costMetrics.isLoading\">{{ (costMetrics.totalTokensInput + costMetrics.totalTokensOutput) | number:'1.0-0' }}</span>\n <span class=\"value loading\" *ngIf=\"costMetrics.isLoading\"><i class=\"fas fa-spinner fa-spin\"></i></span>\n </div>\n <div class=\"stat\" *ngIf=\"costMetrics && costMetrics.totalCost > 0\">\n <span class=\"label\">Cost</span>\n <span class=\"value\" *ngIf=\"!costMetrics.isLoading\">${{ costMetrics.totalCost | number:'1.2-4' }}</span>\n <span class=\"value loading\" *ngIf=\"costMetrics.isLoading\"><i class=\"fas fa-spinner fa-spin\"></i></span>\n </div>\n </div>\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs\">\n <button class=\"tab\" [class.active]=\"activeTab === 'timeline'\" (click)=\"changeTab('timeline')\">\n <i class=\"fas fa-stream\"></i> Timeline\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'visualization'\" (click)=\"changeTab('visualization')\">\n <i class=\"fas fa-diagram-project\"></i> Visualization\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'analytics'\" (click)=\"changeTab('analytics')\">\n <i class=\"fas fa-chart-line\"></i> Analytics\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'details'\" (click)=\"changeTab('details')\">\n <i class=\"fas fa-info-circle\"></i> Details\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"content-area\">\n <!-- Timeline Tab -->\n <div class=\"tab-content\" *ngIf=\"activeTab === 'timeline'\" style=\"height: 100%;\">\n <kendo-splitter style=\"height: 100%;\" orientation=\"horizontal\">\n <!-- Timeline Pane -->\n <kendo-splitter-pane [min]=\"'400px'\">\n <mj-ai-agent-run-timeline\n [aiAgentRunId]=\"record.ID\"\n [autoRefresh]=\"record.Status === 'Running'\"\n [refreshInterval]=\"3000\"\n (itemSelected)=\"selectTimelineItem($event)\"\n (navigateToEntity)=\"navigateToEntityRecord($event)\">\n </mj-ai-agent-run-timeline>\n </kendo-splitter-pane>\n \n <!-- JSON Detail Pane -->\n <kendo-splitter-pane [size]=\"'45%'\" [min]=\"'300px'\" [collapsed]=\"!selectedTimelineItem\">\n <mj-ai-agent-run-step-detail\n [selectedTimelineItem]=\"selectedTimelineItem\"\n (closePanel)=\"closeJsonPanel()\"\n (navigateToActionLog)=\"navigateToActionLog($event)\"\n (copyToClipboard)=\"copyToClipboard($event)\">\n </mj-ai-agent-run-step-detail>\n </kendo-splitter-pane>\n </kendo-splitter>\n </div>\n\n <!-- Visualization Tab -->\n <div class=\"tab-content\" *ngIf=\"activeTab === 'visualization'\" style=\"height: 100%;\">\n <mj-ai-agent-run-visualization\n #visualizationComponent\n [aiAgentRunId]=\"record.ID\"\n *ngIf=\"visualizationLoaded\">\n </mj-ai-agent-run-visualization>\n </div>\n\n <!-- Analytics Tab -->\n <div class=\"tab-content\" *ngIf=\"activeTab === 'analytics'\" style=\"height: 100%;\">\n <mj-ai-agent-run-analytics \n #analyticsComponent\n [agentRunId]=\"record.ID\"\n *ngIf=\"analyticsLoaded\">\n </mj-ai-agent-run-analytics>\n </div>\n\n <!-- Details Tab -->\n <div class=\"tab-content\" *ngIf=\"activeTab === 'details'\">\n <kendo-panelbar [keepItemContent]=\"true\">\n <kendo-panelbar-item title=\"General Information\" [expanded]=\"true\">\n <ng-template kendoPanelBarContent>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Agent</label>\n <span>\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('AI Agents', record.AgentID)\">\n {{ agent?.Name || 'N/A' }}\n </a>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Parent Run ID</label>\n <span>\n <a *ngIf=\"record.ParentRunID\" href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agent Runs', record.ParentRunID)\">\n {{ record.ParentRunID }}\n </a>\n <span *ngIf=\"!record.ParentRunID\">None (Root)</span>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Last Run ID</label>\n <span>\n <a *ngIf=\"record.LastRunID\" href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agent Runs', record.LastRunID)\">\n {{ record.LastRunID }}\n </a>\n <span *ngIf=\"!record.LastRunID\">None</span>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Conversation ID</label>\n <span>\n <a *ngIf=\"record.ConversationID\" href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('Conversations', record.ConversationID)\">\n {{ record.ConversationID }}\n </a>\n <span *ngIf=\"!record.ConversationID\">N/A</span>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>User</label>\n <span>\n <a *ngIf=\"record.UserID\" href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('Users', record.UserID)\">\n {{ record.User || 'N/A' }}\n </a>\n <span *ngIf=\"!record.UserID\">N/A</span>\n </span>\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Execution Status\">\n <ng-template kendoPanelBarContent>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Status</label>\n <span class=\"status-badge\" [attr.data-status]=\"record.Status\">\n {{ record.Status }}\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Success</label>\n <span [class.success]=\"record.Success\" [class.error]=\"record.Success === false\">\n {{ record.Success === null ? 'In Progress' : (record.Success ? 'Yes' : 'No') }}\n </span>\n </div>\n <div class=\"detail-item full-width\" *ngIf=\"record.ErrorMessage\">\n <label>Error Message</label>\n <div class=\"error-message\">{{ record.ErrorMessage }}</div>\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Usage & Cost\">\n <ng-template kendoPanelBarContent>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Total Tokens Used</label>\n <span>{{ record.TotalTokensUsed ? (record.TotalTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Prompt Tokens</label>\n <span>{{ record.TotalPromptTokensUsed ? (record.TotalPromptTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Completion Tokens</label>\n <span>{{ record.TotalCompletionTokensUsed ? (record.TotalCompletionTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Total Cost</label>\n <span>{{ record.TotalCost != null ? ('$' + (record.TotalCost | number:'1.2-4')) : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Total Prompt Iterations</label>\n <span>{{ record.TotalPromptIterations != null ? (record.TotalPromptIterations | number:'1.0-0') : 'N/A' }}</span>\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Result\" *ngIf=\"record.Result\">\n <ng-template kendoPanelBarContent>\n <div class=\"result-viewer\">\n <mj-code-editor\n [ngModel]=\"parsedResult\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Starting Payload\" *ngIf=\"record.StartingPayload\">\n <ng-template kendoPanelBarContent>\n <div class=\"result-viewer\">\n <mj-code-editor\n [ngModel]=\"parsedStartingPayload\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Final Payload\" *ngIf=\"record.FinalPayload\">\n <ng-template kendoPanelBarContent>\n <div class=\"result-viewer\">\n <mj-code-editor\n [ngModel]=\"parsedFinalPayload\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Payload Diff\" *ngIf=\"showPayloadDiff\">\n <ng-template kendoPanelBarContent>\n <div style=\"padding: 20px; background: #f8f9fa;\">\n <mj-deep-diff\n [oldValue]=\"startingPayloadObject\"\n [newValue]=\"finalPayloadObject\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"false\"\n [maxDepth]=\"10\"\n [maxStringLength]=\"200\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n </kendo-panelbar>\n </div>\n </div>\n </div>\n</div>", styles: [".ai-agent-run-form {\n height: 100%;\n overflow: auto;\n}\n\n/* Header Styles */\n.header {\n background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);\n border-bottom: 1px solid #e0e6ed;\n padding: 20px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n}\n\n.header-content {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 16px;\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.icon-wrapper {\n width: 48px;\n height: 48px;\n background: linear-gradient(135deg, #2196f3, #1976d2);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 20px;\n}\n\n.header-info h2 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.meta-info {\n display: flex;\n gap: 12px;\n margin-top: 4px;\n font-size: 14px;\n color: #6c757d;\n}\n\n.parent-run {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.parent-link {\n color: #ff6358;\n text-decoration: none;\n cursor: pointer;\n transition: color 0.2s;\n}\n\n.parent-link:hover {\n color: #ff4444;\n text-decoration: underline;\n}\n\n.agent-name {\n font-weight: 500;\n color: #495057;\n}\n\n.run-id {\n font-family: monospace;\n font-size: 12px;\n opacity: 0.7;\n}\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.status-badge {\n padding: 6px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.status-badge[data-status=\"Running\"] {\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.status-badge[data-status=\"Completed\"] {\n background: #d4edda;\n color: #155724;\n}\n\n.status-badge[data-status=\"Failed\"] {\n background: #f8d7da;\n color: #721c24;\n}\n\n.status-badge[data-status=\"Cancelled\"] {\n background: #fff3cd;\n color: #856404;\n}\n\n.status-badge[data-status=\"Paused\"] {\n background: #e2e3e5;\n color: #383d41;\n}\n\n.status-badge.small {\n padding: 4px 12px;\n font-size: 11px;\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n}\n\n.btn-icon {\n width: 36px;\n height: 36px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n}\n\n.btn-icon:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n color: #495057;\n}\n\n.header-stats {\n display: flex;\n gap: 24px;\n padding-top: 12px;\n border-top: 1px solid #e9ecef;\n}\n\n.stat {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat .label {\n font-size: 12px;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat .value {\n font-size: 14px;\n font-weight: 500;\n color: #495057;\n}\n\n.stat .value.success {\n color: #28a745;\n}\n\n.stat .value.error {\n color: #dc3545;\n}\n\n/* Tabs */\n.tabs {\n display: flex;\n border-bottom: 1px solid #dee2e6;\n background: #f8f9fa;\n}\n\n.tab {\n padding: 12px 24px;\n border: none;\n background: transparent;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: #6c757d;\n display: flex;\n align-items: center;\n gap: 8px;\n transition: all 0.2s ease;\n border-bottom: 3px solid transparent;\n}\n\n.tab:hover {\n color: #495057;\n background: rgba(0,0,0,0.02);\n}\n\n.tab.active {\n color: #2196f3;\n border-bottom-color: #2196f3;\n background: white;\n}\n\n/* Content Area */\n.content-area {\n position: relative;\n height: calc(100vh - 280px);\n overflow: auto;\n background: white;\n}\n\n.tab-content {\n height: 100%;\n overflow: auto;\n}\n\n/* Details tab specific */\n.tab-content[ng-reflect-ng-if=\"true\"] > kendo-panelbar {\n height: 100%;\n overflow-y: auto;\n}\n\n/* JSON Detail Pane */\n.json-detail-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #f8f9fa;\n border-left: 1px solid #e0e6ed;\n}\n\n.json-pane-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: white;\n border-bottom: 1px solid #e0e6ed;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n}\n\n.json-pane-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.json-pane-header h3 i {\n color: #6b7280;\n font-size: 14px;\n}\n\n.json-pane-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: auto;\n padding: 16px;\n}\n\n.json-meta {\n display: flex;\n gap: 20px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.json-meta .meta-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta .meta-item label {\n font-size: 11px;\n text-transform: uppercase;\n color: #6b7280;\n font-weight: 600;\n letter-spacing: 0.5px;\n}\n\n.json-meta .meta-item span {\n font-size: 14px;\n color: #2c3e50;\n font-weight: 500;\n}\n\n.action-link {\n margin-bottom: 12px;\n}\n\n.action-link .btn-link {\n background: none;\n border: none;\n color: #2196f3;\n font-size: 14px;\n cursor: pointer;\n padding: 6px 12px;\n border-radius: 4px;\n transition: all 0.2s;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.action-link .btn-link:hover {\n background: rgba(33, 150, 243, 0.08);\n color: #1976d2;\n}\n\n.json-viewer {\n flex: 1;\n display: flex;\n flex-direction: column;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e6ed;\n overflow: auto;\n padding: 20px;\n gap: 10px;\n min-height: 0;\n margin-bottom: 45px;\n}\n\n\n.json-toolbar {\n display: flex;\n justify-content: flex-end;\n padding: 8px 12px;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e6ed;\n}\n\n/* Timeline Styles */\n.timeline-container {\n height: 100%;\n overflow-y: auto;\n padding: 20px;\n}\n\n.timeline-container > .timeline {\n max-width: 900px;\n margin: 0 auto;\n}\n\n.timeline {\n position: relative;\n padding-left: 40px;\n}\n\n.timeline::before {\n content: '';\n position: absolute;\n left: 20px;\n top: 0;\n bottom: 0;\n width: 2px;\n background: #e9ecef;\n}\n\n.timeline-item {\n position: relative;\n margin-bottom: 24px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.timeline-item:hover {\n transform: translateX(4px);\n}\n\n.timeline-item.selected {\n transform: translateX(8px);\n}\n\n.timeline-item.selected .timeline-content {\n background: #f0f7ff;\n border-color: #2196f3;\n}\n\n.timeline-marker {\n position: absolute;\n left: -30px;\n top: 0;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: white;\n border: 3px solid #e9ecef;\n z-index: 1;\n transition: all 0.2s ease;\n}\n\n.timeline-marker[data-color=\"success\"] {\n border-color: #28a745;\n color: #28a745;\n}\n\n.timeline-marker[data-color=\"error\"] {\n border-color: #dc3545;\n color: #dc3545;\n}\n\n.timeline-marker[data-color=\"info\"] {\n border-color: #17a2b8;\n color: #17a2b8;\n}\n\n.timeline-marker[data-color=\"warning\"] {\n border-color: #ffc107;\n color: #ffc107;\n}\n\n.timeline-marker[data-color=\"secondary\"] {\n border-color: #6c757d;\n color: #6c757d;\n}\n\n.timeline-marker.small {\n width: 28px;\n height: 28px;\n font-size: 12px;\n}\n\n.timeline-content {\n background: white;\n border: 1px solid #e9ecef;\n border-radius: 12px;\n padding: 16px 20px;\n margin-left: 20px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n transition: all 0.2s ease;\n}\n\n.timeline-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.timeline-header h4 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.timeline-header h5 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #495057;\n}\n\n.timeline-time {\n font-size: 12px;\n color: #6c757d;\n font-family: monospace;\n}\n\n.timeline-subtitle {\n font-size: 13px;\n color: #6c757d;\n margin-bottom: 8px;\n}\n\n.timeline-meta {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: #6c757d;\n}\n\n.timeline-meta .status {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.timeline-meta .status[data-status=\"Completed\"] {\n background: #d4edda;\n color: #155724;\n}\n\n.timeline-meta .status[data-status=\"Failed\"] {\n background: #f8d7da;\n color: #721c24;\n}\n\n.timeline-meta .status[data-status=\"Running\"] {\n background: #cce5ff;\n color: #004085;\n}\n\n.timeline-meta .status[data-status=\"Paused\"] {\n background: #e2e3e5;\n color: #383d41;\n}\n\n.duration {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.timeline-actions {\n position: absolute;\n right: 20px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-link {\n background: none;\n border: none;\n color: #2196f3;\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s ease;\n}\n\n.btn-link:hover {\n background: rgba(33, 150, 243, 0.1);\n}\n\n.btn-expand {\n width: 24px;\n height: 24px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n font-size: 12px;\n}\n\n.btn-expand:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n color: #495057;\n}\n\n/* Timeline Children */\n.timeline-children {\n position: relative;\n margin-top: 12px;\n margin-bottom: 12px;\n}\n\n.timeline-children::before {\n content: '';\n position: absolute;\n left: -10px;\n top: -12px;\n bottom: 0;\n width: 2px;\n background: #e9ecef;\n}\n\n.child-item {\n margin-bottom: 12px;\n}\n\n.child-item .timeline-content {\n background: #f8f9fa;\n border-color: #e0e6ed;\n}\n\n/* Sub-run timeline styles */\n.sub-run-timeline {\n background: rgba(33, 150, 243, 0.02);\n border-left: 2px solid rgba(33, 150, 243, 0.2);\n margin-left: 20px;\n padding-left: 20px;\n margin-top: 8px;\n margin-bottom: 8px;\n}\n\n.sub-run-item .timeline-marker {\n border-width: 2px;\n}\n\n.sub-run-item .timeline-content {\n transition: all 0.2s ease;\n}\n\n/* JSON Detail Pane (in splitter) */\n.json-detail-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n border-left: 1px solid #e0e6ed;\n}\n\n.json-pane-header {\n padding: 16px 20px;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-shrink: 0;\n}\n\n.json-pane-header h3 {\n margin: 0;\n font-size: 16px;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 10px;\n font-weight: 600;\n}\n\n.json-pane-content {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.json-meta {\n padding: 16px 20px;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n flex-shrink: 0;\n}\n\n.json-meta .meta-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta label {\n font-size: 11px;\n color: #7c8798;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.json-meta span {\n font-size: 14px;\n color: #2c3e50;\n font-weight: 500;\n}\n\n.action-link {\n padding: 12px 20px;\n border-bottom: 1px solid #e0e6ed;\n flex-shrink: 0;\n}\n\n.action-link .btn-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: #2196f3;\n text-decoration: none;\n font-size: 14px;\n padding: 8px 12px;\n background: #f0f7ff;\n border: 1px solid #d0e5ff;\n border-radius: 4px;\n transition: all 0.2s;\n cursor: pointer;\n}\n\n.action-link .btn-link:hover {\n background: #e1f0ff;\n border-color: #b0d5ff;\n text-decoration: none;\n}\n\n\n.json-toolbar {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n/* Details Tab */\n.details-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n padding: 20px;\n}\n\n.detail-item {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-item.full-width {\n grid-column: 1 / -1;\n}\n\n.detail-item label {\n font-size: 12px;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-item span {\n font-size: 14px;\n color: #495057;\n}\n\n.error-message {\n background: #f8d7da;\n color: #721c24;\n padding: 12px;\n border-radius: 8px;\n font-size: 13px;\n}\n\n.result-viewer,\n.state-viewer {\n padding: 20px;\n max-height: 450px;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n\n.result-viewer mj-code-editor,\n.state-viewer mj-code-editor {\n flex: 1;\n min-height: 0;\n}\n\n/* Empty States */\n.empty-state,\n.loading-state,\n.error-state {\n text-align: center;\n padding: 60px 20px;\n color: #6c757d;\n}\n\n.empty-state i,\n.loading-state i,\n.error-state i {\n opacity: 0.3;\n margin-bottom: 16px;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .header-content {\n flex-direction: column;\n gap: 16px;\n }\n \n .header-stats {\n flex-wrap: wrap;\n }\n \n .json-detail-pane {\n width: 100%;\n }\n \n .timeline {\n padding-left: 30px;\n }\n \n .timeline-marker {\n left: -25px;\n width: 32px;\n height: 32px;\n }\n \n .timeline-content {\n margin-left: 10px;\n }\n}\n\n/* Entity Link Styles */\n.entity-link {\n color: #2196f3;\n text-decoration: none;\n transition: all 0.2s ease;\n border-bottom: 1px solid transparent;\n display: inline-block;\n}\n\n.entity-link:hover {\n color: #1976d2;\n border-bottom-color: #1976d2;\n}\n\n.entity-link:active {\n color: #0d47a1;\n}\n\n/* Detail Pane Tabs */\n.detail-pane-tabs {\n display: flex;\n gap: 8px;\n margin: 8px 0 0 0;\n border-bottom: 1px solid #e0e6ed;\n padding: 0 16px;\n}\n\n.detail-tab {\n padding: 10px 16px;\n background: none;\n border: none;\n border-bottom: 3px solid transparent;\n color: #6c757d;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-tab:hover {\n color: #495057;\n background: rgba(0, 0, 0, 0.02);\n}\n\n.detail-tab.active {\n color: #2196f3;\n border-bottom-color: #2196f3;\n}\n\n.detail-tab i {\n font-size: 14px;\n}\n\n/* Detail Pane Content */\n.detail-pane-content {\n flex: 1;\n overflow-y: auto;\n min-height: 0;\n margin-bottom: 35px;\n}\n\n.detail-pane-content.with-tabs {\n /* When tabs are shown, content starts right after tabs */\n margin-top: 0;\n}\n\n/* Step Payload Diff */\n.step-payload-diff {\n height: 100%;\n overflow-y: auto;\n padding: 16px;\n}\n\n.step-payload-diff mj-deep-diff {\n display: block;\n height: 100%;\n}\n\n/* JSON Viewer adjustments when no tabs */\n.detail-pane-content:not(.with-tabs) .json-viewer {\n margin-top: 16px;\n}"] }]
1123
+ args: [{ selector: 'mj-ai-agent-run-form', template: "<div class=\"record-form-container ai-agent-run-form\">\n <div class=\"record-form\">\n <!-- Header -->\n <div class=\"header\">\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"icon-wrapper\">\n <i class=\"fas fa-robot\"></i>\n </div>\n <div class=\"header-info\">\n <h2>AI Agent Run</h2>\n <div class=\"meta-info\">\n <span class=\"agent-name\" *ngIf=\"agent\">{{ agent.Name }}</span>\n <span class=\"run-id\">{{ record.ID }}</span>\n <span class=\"parent-run\" *ngIf=\"record.ParentRunID\">\n <i class=\"fas fa-level-up-alt\"></i>\n <a (click)=\"navigateToParentRun()\" class=\"parent-link\">Parent Run</a>\n </span>\n </div>\n </div>\n </div>\n <div class=\"header-right\">\n <div class=\"status-badge\" [attr.data-status]=\"record.Status\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon(record.Status || '')\"></i>\n {{ record.Status }}\n </div>\n <div class=\"header-actions\">\n <button class=\"btn-icon\" (click)=\"refreshData()\" title=\"Refresh\">\n <i class=\"fas fa-sync-alt\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"header-stats\">\n <div class=\"stat\">\n <span class=\"label\">Started</span>\n <span class=\"value\">{{ record.StartedAt | date:'medium' }}</span>\n </div>\n <div class=\"stat\" *ngIf=\"record.CompletedAt\">\n <span class=\"label\">Completed</span>\n <span class=\"value\">{{ record.CompletedAt | date:'medium' }}</span>\n </div>\n <div class=\"stat\" *ngIf=\"record.CompletedAt\">\n <span class=\"label\">Duration</span>\n <span class=\"value\">{{ calculateDuration(record.StartedAt, record.CompletedAt) }}</span>\n </div>\n <div class=\"stat\" *ngIf=\"record.Success !== null && record.CompletedAt !== null\">\n <span class=\"label\">Result</span>\n <span class=\"value\" [class.success]=\"record.Success\" [class.error]=\"!record.Success\">\n {{ record.Success ? 'Success' : 'Failed' }}\n </span>\n </div>\n <div class=\"stat\" *ngIf=\"costMetrics && (costMetrics.totalTokensInput + costMetrics.totalTokensOutput) > 0\">\n <span class=\"label\">Tokens</span>\n <span class=\"value\" *ngIf=\"!costMetrics.isLoading\">{{ (costMetrics.totalTokensInput + costMetrics.totalTokensOutput) | number:'1.0-0' }}</span>\n <span class=\"value loading\" *ngIf=\"costMetrics.isLoading\"><i class=\"fas fa-spinner fa-spin\"></i></span>\n </div>\n <div class=\"stat\" *ngIf=\"costMetrics && costMetrics.totalCost > 0\">\n <span class=\"label\">Cost</span>\n <span class=\"value\" *ngIf=\"!costMetrics.isLoading\">${{ costMetrics.totalCost | number:'1.2-4' }}</span>\n <span class=\"value loading\" *ngIf=\"costMetrics.isLoading\"><i class=\"fas fa-spinner fa-spin\"></i></span>\n </div>\n </div>\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs\">\n <button class=\"tab\" [class.active]=\"activeTab === 'timeline'\" (click)=\"changeTab('timeline')\">\n <i class=\"fas fa-stream\"></i> Timeline\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'visualization'\" (click)=\"changeTab('visualization')\">\n <i class=\"fas fa-diagram-project\"></i> Visualization\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'analytics'\" (click)=\"changeTab('analytics')\">\n <i class=\"fas fa-chart-line\"></i> Analytics\n </button>\n <button class=\"tab\" [class.active]=\"activeTab === 'details'\" (click)=\"changeTab('details')\">\n <i class=\"fas fa-info-circle\"></i> Details\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"content-area\">\n <!-- Timeline Tab -->\n <div class=\"tab-content\" *ngIf=\"activeTab === 'timeline'\" style=\"height: 100%;\">\n <kendo-splitter style=\"height: 100%;\" orientation=\"horizontal\">\n <!-- Timeline Pane -->\n <kendo-splitter-pane [min]=\"'400px'\">\n <mj-ai-agent-run-timeline\n [aiAgentRunId]=\"record.ID\"\n [autoRefresh]=\"record.Status === 'Running'\"\n [refreshInterval]=\"30000\"\n (itemSelected)=\"selectTimelineItem($event)\"\n (navigateToEntity)=\"navigateToEntityRecord($event)\"\n (agentRunCompleted)=\"onAgentRunCompleted($event)\">\n </mj-ai-agent-run-timeline>\n </kendo-splitter-pane>\n \n <!-- JSON Detail Pane -->\n <kendo-splitter-pane [size]=\"'45%'\" [min]=\"'300px'\" [collapsed]=\"!selectedTimelineItem\">\n <mj-ai-agent-run-step-detail\n [selectedTimelineItem]=\"selectedTimelineItem\"\n (closePanel)=\"closeJsonPanel()\"\n (navigateToActionLog)=\"navigateToActionLog($event)\"\n (copyToClipboard)=\"copyToClipboard($event)\">\n </mj-ai-agent-run-step-detail>\n </kendo-splitter-pane>\n </kendo-splitter>\n </div>\n\n <!-- Visualization Tab -->\n <div class=\"tab-content\" *ngIf=\"activeTab === 'visualization'\" style=\"height: 100%;\">\n <mj-ai-agent-run-visualization\n #visualizationComponent\n [aiAgentRunId]=\"record.ID\"\n *ngIf=\"visualizationLoaded\">\n </mj-ai-agent-run-visualization>\n </div>\n\n <!-- Analytics Tab -->\n <div class=\"tab-content\" *ngIf=\"activeTab === 'analytics'\" style=\"height: 100%;\">\n <mj-ai-agent-run-analytics \n #analyticsComponent\n [agentRunId]=\"record.ID\"\n *ngIf=\"analyticsLoaded\">\n </mj-ai-agent-run-analytics>\n </div>\n\n <!-- Details Tab -->\n <div class=\"tab-content\" *ngIf=\"activeTab === 'details'\">\n <kendo-panelbar [keepItemContent]=\"true\">\n <kendo-panelbar-item title=\"General Information\" [expanded]=\"true\">\n <ng-template kendoPanelBarContent>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Agent</label>\n <span>\n <a href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('AI Agents', record.AgentID)\">\n {{ agent?.Name || 'N/A' }}\n </a>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Parent Run ID</label>\n <span>\n <a *ngIf=\"record.ParentRunID\" href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agent Runs', record.ParentRunID)\">\n {{ record.ParentRunID }}\n </a>\n <span *ngIf=\"!record.ParentRunID\">None (Root)</span>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Last Run ID</label>\n <span>\n <a *ngIf=\"record.LastRunID\" href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('MJ: AI Agent Runs', record.LastRunID)\">\n {{ record.LastRunID }}\n </a>\n <span *ngIf=\"!record.LastRunID\">None</span>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Conversation ID</label>\n <span>\n <a *ngIf=\"record.ConversationID\" href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('Conversations', record.ConversationID)\">\n {{ record.ConversationID }}\n </a>\n <span *ngIf=\"!record.ConversationID\">N/A</span>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>User</label>\n <span>\n <a *ngIf=\"record.UserID\" href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('Users', record.UserID)\">\n {{ record.User || 'N/A' }}\n </a>\n <span *ngIf=\"!record.UserID\">N/A</span>\n </span>\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Execution Settings\">\n <ng-template kendoPanelBarContent>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Configuration</label>\n <span>\n <a *ngIf=\"record.ConfigurationID\" href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('AI Configurations', record.ConfigurationID)\">\n {{ record.Configuration || 'N/A' }}\n </a>\n <span *ngIf=\"!record.ConfigurationID\">N/A</span>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Override Model</label>\n <span>\n <a *ngIf=\"record.OverrideModelID\" href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('AI Models', record.OverrideModelID)\">\n {{ record.OverrideModel || 'N/A' }}\n </a>\n <span *ngIf=\"!record.OverrideModelID\">N/A</span>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Override Vendor</label>\n <span>\n <a *ngIf=\"record.OverrideVendorID\" href=\"javascript:void(0)\" class=\"entity-link\" (click)=\"openEntityRecord('AI Vendors', record.OverrideVendorID)\">\n {{ record.OverrideVendor || 'N/A' }}\n </a>\n <span *ngIf=\"!record.OverrideVendorID\">N/A</span>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Verbose Logging</label>\n <span>{{ record.Verbose ? 'Yes' : 'No' }}</span>\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Execution Status\">\n <ng-template kendoPanelBarContent>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Status</label>\n <span class=\"status-badge\" [attr.data-status]=\"record.Status\">\n {{ record.Status }}\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Success</label>\n <span [class.success]=\"record.Success\" [class.error]=\"record.Success === false\">\n {{ record.Success === null ? 'In Progress' : (record.Success ? 'Yes' : 'No') }}\n </span>\n </div>\n <div class=\"detail-item full-width\" *ngIf=\"record.ErrorMessage\">\n <label>Error Message</label>\n <div class=\"error-message\">{{ record.ErrorMessage }}</div>\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Usage & Cost\">\n <ng-template kendoPanelBarContent>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Total Tokens Used</label>\n <span>{{ record.TotalTokensUsed ? (record.TotalTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Prompt Tokens</label>\n <span>{{ record.TotalPromptTokensUsed ? (record.TotalPromptTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Completion Tokens</label>\n <span>{{ record.TotalCompletionTokensUsed ? (record.TotalCompletionTokensUsed | number:'1.0-0') : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Total Cost</label>\n <span>{{ record.TotalCost != null ? ('$' + (record.TotalCost | number:'1.2-4')) : 'N/A' }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Total Prompt Iterations</label>\n <span>{{ record.TotalPromptIterations != null ? (record.TotalPromptIterations | number:'1.0-0') : 'N/A' }}</span>\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Result\" *ngIf=\"record.Result\">\n <ng-template kendoPanelBarContent>\n <div class=\"result-viewer\">\n <mj-code-editor\n [ngModel]=\"parsedResult\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Starting Payload\" *ngIf=\"record.StartingPayload\">\n <ng-template kendoPanelBarContent>\n <div class=\"result-viewer\">\n <mj-code-editor\n [ngModel]=\"parsedStartingPayload\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Execution Data\" *ngIf=\"record.Data\">\n <ng-template kendoPanelBarContent>\n <div class=\"result-viewer\">\n <mj-code-editor\n [ngModel]=\"parsedData\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Final Payload\" *ngIf=\"record.FinalPayload\">\n <ng-template kendoPanelBarContent>\n <div class=\"result-viewer\">\n <mj-code-editor\n [ngModel]=\"parsedFinalPayload\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <kendo-panelbar-item title=\"Payload Diff\" *ngIf=\"showPayloadDiff\">\n <ng-template kendoPanelBarContent>\n <div style=\"padding: 20px; background: #f8f9fa;\">\n <mj-deep-diff\n [oldValue]=\"startingPayloadObject\"\n [newValue]=\"finalPayloadObject\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"false\"\n [maxDepth]=\"10\"\n [maxStringLength]=\"200\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n </kendo-panelbar>\n </div>\n </div>\n </div>\n</div>", styles: [".ai-agent-run-form {\n height: 100%;\n overflow: auto;\n}\n\n/* Header Styles */\n.header {\n background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);\n border-bottom: 1px solid #e0e6ed;\n padding: 20px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n}\n\n.header-content {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 16px;\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.icon-wrapper {\n width: 48px;\n height: 48px;\n background: linear-gradient(135deg, #2196f3, #1976d2);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 20px;\n}\n\n.header-info h2 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.meta-info {\n display: flex;\n gap: 12px;\n margin-top: 4px;\n font-size: 14px;\n color: #6c757d;\n}\n\n.parent-run {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.parent-link {\n color: #ff6358;\n text-decoration: none;\n cursor: pointer;\n transition: color 0.2s;\n}\n\n.parent-link:hover {\n color: #ff4444;\n text-decoration: underline;\n}\n\n.agent-name {\n font-weight: 500;\n color: #495057;\n}\n\n.run-id {\n font-family: monospace;\n font-size: 12px;\n opacity: 0.7;\n}\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.status-badge {\n padding: 6px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.status-badge[data-status=\"Running\"] {\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.status-badge[data-status=\"Completed\"] {\n background: #d4edda;\n color: #155724;\n}\n\n.status-badge[data-status=\"Failed\"] {\n background: #f8d7da;\n color: #721c24;\n}\n\n.status-badge[data-status=\"Cancelled\"] {\n background: #fff3cd;\n color: #856404;\n}\n\n.status-badge[data-status=\"Paused\"] {\n background: #e2e3e5;\n color: #383d41;\n}\n\n.status-badge.small {\n padding: 4px 12px;\n font-size: 11px;\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n}\n\n.btn-icon {\n width: 36px;\n height: 36px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n}\n\n.btn-icon:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n color: #495057;\n}\n\n.header-stats {\n display: flex;\n gap: 24px;\n padding-top: 12px;\n border-top: 1px solid #e9ecef;\n}\n\n.stat {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.stat .label {\n font-size: 12px;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat .value {\n font-size: 14px;\n font-weight: 500;\n color: #495057;\n}\n\n.stat .value.success {\n color: #28a745;\n}\n\n.stat .value.error {\n color: #dc3545;\n}\n\n/* Tabs */\n.tabs {\n display: flex;\n border-bottom: 1px solid #dee2e6;\n background: #f8f9fa;\n}\n\n.tab {\n padding: 12px 24px;\n border: none;\n background: transparent;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: #6c757d;\n display: flex;\n align-items: center;\n gap: 8px;\n transition: all 0.2s ease;\n border-bottom: 3px solid transparent;\n}\n\n.tab:hover {\n color: #495057;\n background: rgba(0,0,0,0.02);\n}\n\n.tab.active {\n color: #2196f3;\n border-bottom-color: #2196f3;\n background: white;\n}\n\n/* Content Area */\n.content-area {\n position: relative;\n height: calc(100vh - 280px);\n overflow: auto;\n background: white;\n}\n\n.tab-content {\n height: 100%;\n overflow: auto;\n}\n\n/* Details tab specific */\n.tab-content[ng-reflect-ng-if=\"true\"] > kendo-panelbar {\n height: 100%;\n overflow-y: auto;\n}\n\n/* JSON Detail Pane */\n.json-detail-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #f8f9fa;\n border-left: 1px solid #e0e6ed;\n}\n\n.json-pane-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: white;\n border-bottom: 1px solid #e0e6ed;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n}\n\n.json-pane-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.json-pane-header h3 i {\n color: #6b7280;\n font-size: 14px;\n}\n\n.json-pane-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: auto;\n padding: 16px;\n}\n\n.json-meta {\n display: flex;\n gap: 20px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.json-meta .meta-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta .meta-item label {\n font-size: 11px;\n text-transform: uppercase;\n color: #6b7280;\n font-weight: 600;\n letter-spacing: 0.5px;\n}\n\n.json-meta .meta-item span {\n font-size: 14px;\n color: #2c3e50;\n font-weight: 500;\n}\n\n.action-link {\n margin-bottom: 12px;\n}\n\n.action-link .btn-link {\n background: none;\n border: none;\n color: #2196f3;\n font-size: 14px;\n cursor: pointer;\n padding: 6px 12px;\n border-radius: 4px;\n transition: all 0.2s;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.action-link .btn-link:hover {\n background: rgba(33, 150, 243, 0.08);\n color: #1976d2;\n}\n\n.json-viewer {\n flex: 1;\n display: flex;\n flex-direction: column;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e6ed;\n overflow: auto;\n padding: 20px;\n gap: 10px;\n min-height: 0;\n margin-bottom: 45px;\n}\n\n\n.json-toolbar {\n display: flex;\n justify-content: flex-end;\n padding: 8px 12px;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e6ed;\n}\n\n/* Timeline Styles */\n.timeline-container {\n height: 100%;\n overflow-y: auto;\n padding: 20px;\n}\n\n.timeline-container > .timeline {\n max-width: 900px;\n margin: 0 auto;\n}\n\n.timeline {\n position: relative;\n padding-left: 40px;\n}\n\n.timeline::before {\n content: '';\n position: absolute;\n left: 20px;\n top: 0;\n bottom: 0;\n width: 2px;\n background: #e9ecef;\n}\n\n.timeline-item {\n position: relative;\n margin-bottom: 24px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.timeline-item:hover {\n transform: translateX(4px);\n}\n\n.timeline-item.selected {\n transform: translateX(8px);\n}\n\n.timeline-item.selected .timeline-content {\n background: #f0f7ff;\n border-color: #2196f3;\n}\n\n.timeline-marker {\n position: absolute;\n left: -30px;\n top: 0;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: white;\n border: 3px solid #e9ecef;\n z-index: 1;\n transition: all 0.2s ease;\n}\n\n.timeline-marker[data-color=\"success\"] {\n border-color: #28a745;\n color: #28a745;\n}\n\n.timeline-marker[data-color=\"error\"] {\n border-color: #dc3545;\n color: #dc3545;\n}\n\n.timeline-marker[data-color=\"info\"] {\n border-color: #17a2b8;\n color: #17a2b8;\n}\n\n.timeline-marker[data-color=\"warning\"] {\n border-color: #ffc107;\n color: #ffc107;\n}\n\n.timeline-marker[data-color=\"secondary\"] {\n border-color: #6c757d;\n color: #6c757d;\n}\n\n.timeline-marker.small {\n width: 28px;\n height: 28px;\n font-size: 12px;\n}\n\n.timeline-content {\n background: white;\n border: 1px solid #e9ecef;\n border-radius: 12px;\n padding: 16px 20px;\n margin-left: 20px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.04);\n transition: all 0.2s ease;\n}\n\n.timeline-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.timeline-header h4 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.timeline-header h5 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #495057;\n}\n\n.timeline-time {\n font-size: 12px;\n color: #6c757d;\n font-family: monospace;\n}\n\n.timeline-subtitle {\n font-size: 13px;\n color: #6c757d;\n margin-bottom: 8px;\n}\n\n.timeline-meta {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: #6c757d;\n}\n\n.timeline-meta .status {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.timeline-meta .status[data-status=\"Completed\"] {\n background: #d4edda;\n color: #155724;\n}\n\n.timeline-meta .status[data-status=\"Failed\"] {\n background: #f8d7da;\n color: #721c24;\n}\n\n.timeline-meta .status[data-status=\"Running\"] {\n background: #cce5ff;\n color: #004085;\n}\n\n.timeline-meta .status[data-status=\"Paused\"] {\n background: #e2e3e5;\n color: #383d41;\n}\n\n.duration {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.timeline-actions {\n position: absolute;\n right: 20px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-link {\n background: none;\n border: none;\n color: #2196f3;\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s ease;\n}\n\n.btn-link:hover {\n background: rgba(33, 150, 243, 0.1);\n}\n\n.btn-expand {\n width: 24px;\n height: 24px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n font-size: 12px;\n}\n\n.btn-expand:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n color: #495057;\n}\n\n/* Timeline Children */\n.timeline-children {\n position: relative;\n margin-top: 12px;\n margin-bottom: 12px;\n}\n\n.timeline-children::before {\n content: '';\n position: absolute;\n left: -10px;\n top: -12px;\n bottom: 0;\n width: 2px;\n background: #e9ecef;\n}\n\n.child-item {\n margin-bottom: 12px;\n}\n\n.child-item .timeline-content {\n background: #f8f9fa;\n border-color: #e0e6ed;\n}\n\n/* Sub-run timeline styles */\n.sub-run-timeline {\n background: rgba(33, 150, 243, 0.02);\n border-left: 2px solid rgba(33, 150, 243, 0.2);\n margin-left: 20px;\n padding-left: 20px;\n margin-top: 8px;\n margin-bottom: 8px;\n}\n\n.sub-run-item .timeline-marker {\n border-width: 2px;\n}\n\n.sub-run-item .timeline-content {\n transition: all 0.2s ease;\n}\n\n/* JSON Detail Pane (in splitter) */\n.json-detail-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n border-left: 1px solid #e0e6ed;\n}\n\n.json-pane-header {\n padding: 16px 20px;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-shrink: 0;\n}\n\n.json-pane-header h3 {\n margin: 0;\n font-size: 16px;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 10px;\n font-weight: 600;\n}\n\n.json-pane-content {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.json-meta {\n padding: 16px 20px;\n border-bottom: 1px solid #e0e6ed;\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n flex-shrink: 0;\n}\n\n.json-meta .meta-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.json-meta label {\n font-size: 11px;\n color: #7c8798;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.json-meta span {\n font-size: 14px;\n color: #2c3e50;\n font-weight: 500;\n}\n\n.action-link {\n padding: 12px 20px;\n border-bottom: 1px solid #e0e6ed;\n flex-shrink: 0;\n}\n\n.action-link .btn-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: #2196f3;\n text-decoration: none;\n font-size: 14px;\n padding: 8px 12px;\n background: #f0f7ff;\n border: 1px solid #d0e5ff;\n border-radius: 4px;\n transition: all 0.2s;\n cursor: pointer;\n}\n\n.action-link .btn-link:hover {\n background: #e1f0ff;\n border-color: #b0d5ff;\n text-decoration: none;\n}\n\n\n.json-toolbar {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n/* Details Tab */\n.details-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 20px;\n padding: 20px;\n}\n\n.detail-item {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-item.full-width {\n grid-column: 1 / -1;\n}\n\n.detail-item label {\n font-size: 12px;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-item span {\n font-size: 14px;\n color: #495057;\n}\n\n.error-message {\n background: #f8d7da;\n color: #721c24;\n padding: 12px;\n border-radius: 8px;\n font-size: 13px;\n}\n\n.result-viewer,\n.state-viewer {\n padding: 20px;\n max-height: 450px;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n\n.result-viewer mj-code-editor,\n.state-viewer mj-code-editor {\n flex: 1;\n min-height: 0;\n}\n\n/* Empty States */\n.empty-state,\n.loading-state,\n.error-state {\n text-align: center;\n padding: 60px 20px;\n color: #6c757d;\n}\n\n.empty-state i,\n.loading-state i,\n.error-state i {\n opacity: 0.3;\n margin-bottom: 16px;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .header-content {\n flex-direction: column;\n gap: 16px;\n }\n \n .header-stats {\n flex-wrap: wrap;\n }\n \n .json-detail-pane {\n width: 100%;\n }\n \n .timeline {\n padding-left: 30px;\n }\n \n .timeline-marker {\n left: -25px;\n width: 32px;\n height: 32px;\n }\n \n .timeline-content {\n margin-left: 10px;\n }\n}\n\n/* Entity Link Styles */\n.entity-link {\n color: #2196f3;\n text-decoration: none;\n transition: all 0.2s ease;\n border-bottom: 1px solid transparent;\n display: inline-block;\n}\n\n.entity-link:hover {\n color: #1976d2;\n border-bottom-color: #1976d2;\n}\n\n.entity-link:active {\n color: #0d47a1;\n}\n\n/* Detail Pane Tabs */\n.detail-pane-tabs {\n display: flex;\n gap: 8px;\n margin: 8px 0 0 0;\n border-bottom: 1px solid #e0e6ed;\n padding: 0 16px;\n}\n\n.detail-tab {\n padding: 10px 16px;\n background: none;\n border: none;\n border-bottom: 3px solid transparent;\n color: #6c757d;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-tab:hover {\n color: #495057;\n background: rgba(0, 0, 0, 0.02);\n}\n\n.detail-tab.active {\n color: #2196f3;\n border-bottom-color: #2196f3;\n}\n\n.detail-tab i {\n font-size: 14px;\n}\n\n/* Detail Pane Content */\n.detail-pane-content {\n flex: 1;\n overflow-y: auto;\n min-height: 0;\n margin-bottom: 35px;\n}\n\n.detail-pane-content.with-tabs {\n /* When tabs are shown, content starts right after tabs */\n margin-top: 0;\n}\n\n/* Step Payload Diff */\n.step-payload-diff {\n height: 100%;\n overflow-y: auto;\n padding: 16px;\n}\n\n.step-payload-diff mj-deep-diff {\n display: block;\n height: 100%;\n}\n\n/* JSON Viewer adjustments when no tabs */\n.detail-pane-content:not(.with-tabs) .json-viewer {\n margin-top: 16px;\n}"] }]
979
1124
  }], () => [{ type: i0.ElementRef }, { type: i1.SharedService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i3.AIAgentRunCostService }, { type: i4.AIAgentRunDataService }], { timelineComponent: [{
980
1125
  type: ViewChild,
981
1126
  args: [AIAgentRunTimelineComponent]