@memberjunction/ng-core-entity-forms 5.44.0 → 5.45.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 (119) hide show
  1. package/dist/lib/custom/Lists/list-form.component.d.ts +1 -0
  2. package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
  3. package/dist/lib/custom/Lists/list-form.component.js +4 -2
  4. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  5. package/dist/lib/custom/Queries/query-form.component.d.ts +1 -0
  6. package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
  7. package/dist/lib/custom/Queries/query-form.component.js +6 -4
  8. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  9. package/dist/lib/custom/Templates/template-params-grid.component.d.ts +1 -0
  10. package/dist/lib/custom/Templates/template-params-grid.component.d.ts.map +1 -1
  11. package/dist/lib/custom/Templates/template-params-grid.component.js +5 -3
  12. package/dist/lib/custom/Templates/template-params-grid.component.js.map +1 -1
  13. package/dist/lib/custom/Templates/templates-form.component.d.ts +2 -1
  14. package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
  15. package/dist/lib/custom/Templates/templates-form.component.js +10 -4
  16. package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
  17. package/dist/lib/custom/Tests/test-form.component.d.ts +2 -1
  18. package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
  19. package/dist/lib/custom/Tests/test-form.component.js +5 -3
  20. package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
  21. package/dist/lib/custom/Tests/test-suite-form.component.d.ts +2 -1
  22. package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
  23. package/dist/lib/custom/Tests/test-suite-form.component.js +5 -3
  24. package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
  25. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts +15 -1
  26. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts.map +1 -1
  27. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +277 -133
  28. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -1
  29. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts +10 -0
  30. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts.map +1 -1
  31. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js +80 -26
  32. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js.map +1 -1
  33. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  34. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +3 -1
  35. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  36. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +273 -263
  37. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  38. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
  39. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +219 -197
  40. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
  41. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.d.ts.map +1 -1
  42. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +116 -96
  43. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
  44. package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js +23 -21
  45. package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js.map +1 -1
  46. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.d.ts.map +1 -1
  47. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js +44 -34
  48. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js.map +1 -1
  49. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.d.ts.map +1 -1
  50. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +29 -11
  51. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
  52. package/dist/lib/generated/Entities/MJAISkill/mjaiskill.form.component.js +37 -35
  53. package/dist/lib/generated/Entities/MJAISkill/mjaiskill.form.component.js.map +1 -1
  54. package/dist/lib/generated/Entities/MJActionExecutionLog/mjactionexecutionlog.form.component.d.ts.map +1 -1
  55. package/dist/lib/generated/Entities/MJActionExecutionLog/mjactionexecutionlog.form.component.js +23 -5
  56. package/dist/lib/generated/Entities/MJActionExecutionLog/mjactionexecutionlog.form.component.js.map +1 -1
  57. package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.d.ts.map +1 -1
  58. package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.js +31 -13
  59. package/dist/lib/generated/Entities/MJApplication/mjapplication.form.component.js.map +1 -1
  60. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.d.ts.map +1 -1
  61. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js +91 -43
  62. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js.map +1 -1
  63. package/dist/lib/generated/Entities/MJConversationWidgetInstance/mjconversationwidgetinstance.form.component.d.ts +10 -0
  64. package/dist/lib/generated/Entities/MJConversationWidgetInstance/mjconversationwidgetinstance.form.component.d.ts.map +1 -0
  65. package/dist/lib/generated/Entities/MJConversationWidgetInstance/mjconversationwidgetinstance.form.component.js +86 -0
  66. package/dist/lib/generated/Entities/MJConversationWidgetInstance/mjconversationwidgetinstance.form.component.js.map +1 -0
  67. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.d.ts.map +1 -1
  68. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js +30 -12
  69. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js.map +1 -1
  70. package/dist/lib/generated/Entities/MJCredentialType/mjcredentialtype.form.component.d.ts.map +1 -1
  71. package/dist/lib/generated/Entities/MJCredentialType/mjcredentialtype.form.component.js +27 -9
  72. package/dist/lib/generated/Entities/MJCredentialType/mjcredentialtype.form.component.js.map +1 -1
  73. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
  74. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +447 -419
  75. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  76. package/dist/lib/generated/Entities/MJEnvironment/mjenvironment.form.component.d.ts.map +1 -1
  77. package/dist/lib/generated/Entities/MJEnvironment/mjenvironment.form.component.js +29 -11
  78. package/dist/lib/generated/Entities/MJEnvironment/mjenvironment.form.component.js.map +1 -1
  79. package/dist/lib/generated/Entities/MJExternalDataSource/mjexternaldatasource.form.component.d.ts +10 -0
  80. package/dist/lib/generated/Entities/MJExternalDataSource/mjexternaldatasource.form.component.d.ts.map +1 -0
  81. package/dist/lib/generated/Entities/MJExternalDataSource/mjexternaldatasource.form.component.js +113 -0
  82. package/dist/lib/generated/Entities/MJExternalDataSource/mjexternaldatasource.form.component.js.map +1 -0
  83. package/dist/lib/generated/Entities/MJExternalDataSourceType/mjexternaldatasourcetype.form.component.d.ts +10 -0
  84. package/dist/lib/generated/Entities/MJExternalDataSourceType/mjexternaldatasourcetype.form.component.d.ts.map +1 -0
  85. package/dist/lib/generated/Entities/MJExternalDataSourceType/mjexternaldatasourcetype.form.component.js +95 -0
  86. package/dist/lib/generated/Entities/MJExternalDataSourceType/mjexternaldatasourcetype.form.component.js.map +1 -0
  87. package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.d.ts.map +1 -1
  88. package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js +54 -46
  89. package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js.map +1 -1
  90. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.d.ts.map +1 -1
  91. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js +37 -19
  92. package/dist/lib/generated/Entities/MJRole/mjrole.form.component.js.map +1 -1
  93. package/dist/lib/generated/Entities/MJTemplate/mjtemplate.form.component.d.ts.map +1 -1
  94. package/dist/lib/generated/Entities/MJTemplate/mjtemplate.form.component.js +30 -12
  95. package/dist/lib/generated/Entities/MJTemplate/mjtemplate.form.component.js.map +1 -1
  96. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  97. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +147 -111
  98. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  99. package/dist/lib/generated/Entities/MJUserRoutine/mjuserroutine.form.component.d.ts +10 -0
  100. package/dist/lib/generated/Entities/MJUserRoutine/mjuserroutine.form.component.d.ts.map +1 -0
  101. package/dist/lib/generated/Entities/MJUserRoutine/mjuserroutine.form.component.js +169 -0
  102. package/dist/lib/generated/Entities/MJUserRoutine/mjuserroutine.form.component.js.map +1 -0
  103. package/dist/lib/generated/Entities/MJUserRoutineRecipient/mjuserroutinerecipient.form.component.d.ts +10 -0
  104. package/dist/lib/generated/Entities/MJUserRoutineRecipient/mjuserroutinerecipient.form.component.d.ts.map +1 -0
  105. package/dist/lib/generated/Entities/MJUserRoutineRecipient/mjuserroutinerecipient.form.component.js +82 -0
  106. package/dist/lib/generated/Entities/MJUserRoutineRecipient/mjuserroutinerecipient.form.component.js.map +1 -0
  107. package/dist/lib/generated/Entities/MJUserRoutineRun/mjuserroutinerun.form.component.d.ts +10 -0
  108. package/dist/lib/generated/Entities/MJUserRoutineRun/mjuserroutinerun.form.component.d.ts.map +1 -0
  109. package/dist/lib/generated/Entities/MJUserRoutineRun/mjuserroutinerun.form.component.js +100 -0
  110. package/dist/lib/generated/Entities/MJUserRoutineRun/mjuserroutinerun.form.component.js.map +1 -0
  111. package/dist/lib/generated/generated-forms.module.d.ts +243 -237
  112. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  113. package/dist/lib/generated/generated-forms.module.js +109 -91
  114. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  115. package/dist/lib/shared/components/template-editor.component.d.ts +4 -2
  116. package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
  117. package/dist/lib/shared/components/template-editor.component.js +10 -9
  118. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  119. package/package.json +38 -38
@@ -1 +1 @@
1
- {"version":3,"file":"ai-agent-run-step-detail.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.ts","../../../../src/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, ChangeDetectorRef } from '@angular/core';\nimport { TimelineItem } from './ai-agent-run-timeline.component';\nimport { MJAIAgentRunStepEntity } from '@memberjunction/core-entities';\nimport { ParseJSONRecursive, ParseJSONOptions } from '@memberjunction/global';\n\ninterface ScratchpadSnapshotView {\n notes: string;\n tasks: Array<{\n id: string;\n title: string;\n status: string;\n notes?: string;\n }>;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-run-step-detail',\n templateUrl: './ai-agent-run-step-detail.component.html',\n styleUrls: ['./ai-agent-run-step-detail.component.css']\n})\nexport class AIAgentRunStepDetailComponent {\n @Input() selectedTimelineItem: TimelineItem | null = null;\n @Output() closePanel = new EventEmitter<void>();\n @Output() navigateToActionLog = new EventEmitter<string>();\n @Output() copyToClipboard = new EventEmitter<string>();\n\n selectedItemJsonString = '{}';\n detailPaneTab: 'json' | 'diff' | 'scratchpad' = 'diff';\n scratchpadSubTab: 'input' | 'output' | 'diff' = 'diff';\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnChanges() {\n if (this.selectedTimelineItem) {\n this.selectedItemJsonString = this.getSelectedItemJson();\n // Default to diff tab if step has payload diff, scratchpad if available, otherwise json\n if (this.showStepPayloadDiff) {\n this.detailPaneTab = 'diff';\n } else if (this.showScratchpadTab) {\n this.detailPaneTab = 'scratchpad';\n } else {\n this.detailPaneTab = 'json';\n }\n this.scratchpadSubTab = 'diff';\n this.cdr.detectChanges();\n }\n }\n\n getSelectedItemJson(): string {\n if (!this.selectedTimelineItem) return '{}';\n \n // Get all the data from the entity\n let data;\n if (this.selectedTimelineItem.data instanceof MJAIAgentRunStepEntity) {\n // If it's a step entity, we need to get the full run data\n data = this.selectedTimelineItem.data.GetAll();\n } else {\n data = this.selectedTimelineItem.data;\n }\n \n // Apply recursive JSON parsing to the entire data object\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsedData = ParseJSONRecursive(data, parseOptions);\n \n return JSON.stringify(parsedData, null, 2);\n }\n\n /**\n * Check if selected timeline item is a step with payload changes\n */\n get showStepPayloadDiff(): boolean {\n if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {\n return false;\n }\n \n const stepData = this.selectedTimelineItem.data;\n if (stepData && (stepData.PayloadAtStart?.trim().length > 0 \n || stepData.PayloadAtEnd?.trim().length > 0)) {\n return stepData.PayloadAtStart !== stepData.PayloadAtEnd;\n } else {\n return false;\n }\n }\n\n /**\n * Get parsed PayloadAtStart for the selected step\n */\n get stepPayloadAtStartObject(): any {\n if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {\n return null;\n }\n \n const stepData = this.selectedTimelineItem.data;\n if (!stepData?.PayloadAtStart) return null;\n \n try {\n // First, check if PayloadAtStart is a JSON string that needs to be parsed\n let payloadData = stepData.PayloadAtStart;\n try {\n // If PayloadAtStart is a JSON string, parse it first\n payloadData = JSON.parse(stepData.PayloadAtStart);\n } catch {\n // If it's not valid JSON, use it as-is\n payloadData = stepData.PayloadAtStart;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n return ParseJSONRecursive(payloadData, parseOptions);\n } catch (e) {\n return null;\n }\n }\n\n /**\n * Get parsed PayloadAtEnd for the selected step\n */\n get stepPayloadAtEndObject(): any {\n if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {\n return null;\n }\n \n const stepData = this.selectedTimelineItem.data;\n if (!stepData?.PayloadAtEnd) return null;\n \n try {\n // First, check if PayloadAtEnd is a JSON string that needs to be parsed\n let payloadData = stepData.PayloadAtEnd;\n try {\n // If PayloadAtEnd is a JSON string, parse it first\n payloadData = JSON.parse(stepData.PayloadAtEnd);\n } catch {\n // If it's not valid JSON, use it as-is\n payloadData = stepData.PayloadAtEnd;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n return ParseJSONRecursive(payloadData, parseOptions);\n } catch (e) {\n return null;\n }\n }\n\n onClosePanel() {\n this.closePanel.emit();\n }\n\n onNavigateToActionLog(logId: string) {\n this.navigateToActionLog.emit(logId);\n }\n\n onCopyToClipboard() {\n this.copyToClipboard.emit(this.getSelectedItemJson());\n }\n\n /**\n * Whether the scratchpad tab should be shown (step has scratchpad data in InputData or OutputData)\n */\n get showScratchpadTab(): boolean {\n if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {\n return false;\n }\n return this.stepScratchpadInput !== null || this.stepScratchpadOutput !== null;\n }\n\n /**\n * Parse scratchpad snapshot from InputData JSON\n */\n get stepScratchpadInput(): ScratchpadSnapshotView | null {\n return this.extractScratchpadFromField('InputData');\n }\n\n /**\n * Parse scratchpad snapshot from OutputData JSON\n */\n get stepScratchpadOutput(): ScratchpadSnapshotView | null {\n return this.extractScratchpadFromField('OutputData');\n }\n\n /**\n * Number of tasks that changed between input and output scratchpad snapshots\n */\n get scratchpadTaskChangeCount(): number {\n const input = this.stepScratchpadInput;\n const output = this.stepScratchpadOutput;\n if (!input && !output) return 0;\n if (!input || !output) return (output?.tasks?.length ?? 0) + (input?.tasks?.length ?? 0);\n\n let changes = 0;\n const inputMap = new Map(input.tasks.map(t => [t.id, t]));\n const outputMap = new Map(output.tasks.map(t => [t.id, t]));\n\n for (const [id, task] of outputMap) {\n const prev = inputMap.get(id);\n if (!prev || prev.status !== task.status || prev.title !== task.title || prev.notes !== task.notes) {\n changes++;\n }\n }\n for (const id of inputMap.keys()) {\n if (!outputMap.has(id)) changes++; // removed tasks\n }\n if (input.notes !== output.notes) changes++;\n return changes;\n }\n\n private extractScratchpadFromField(fieldName: 'InputData' | 'OutputData'): ScratchpadSnapshotView | null {\n if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {\n return null;\n }\n\n const stepData = this.selectedTimelineItem.data;\n const rawValue = stepData?.[fieldName];\n if (!rawValue) return null;\n\n try {\n let parsed = rawValue;\n if (typeof parsed === 'string') {\n parsed = JSON.parse(parsed);\n }\n const scratchpad = parsed?.scratchpad;\n if (!scratchpad) return null;\n return {\n notes: scratchpad.notes ?? '',\n tasks: Array.isArray(scratchpad.tasks) ? scratchpad.tasks : []\n };\n } catch {\n return null;\n }\n }\n}","@if (selectedTimelineItem) {\n <div class=\"json-detail-pane\">\n <div class=\"json-pane-header\">\n <h3>\n <i class=\"fas\" [ngClass]=\"selectedTimelineItem.icon\"></i>\n {{ selectedTimelineItem.title }}\n </h3>\n <button class=\"btn-icon\" (click)=\"onClosePanel()\" title=\"Close\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"json-pane-content\">\n <div class=\"json-meta\">\n <div class=\"meta-item\">\n <label>Type</label>\n <span>{{ selectedTimelineItem.type }}</span>\n </div>\n <div class=\"meta-item\">\n <label>Status</label>\n <span class=\"status-badge small\" [attr.data-status]=\"selectedTimelineItem.status\">\n {{ selectedTimelineItem.status }}\n </span>\n </div>\n <div class=\"meta-item\">\n <label>Duration</label>\n <span>{{ selectedTimelineItem.duration || 'N/A' }}</span>\n </div>\n </div>\n <!-- Action-specific link -->\n @if (selectedTimelineItem.type === 'action' && selectedTimelineItem.data?.ID) {\n <div class=\"action-link\">\n <button class=\"btn-link\" (click)=\"onNavigateToActionLog(selectedTimelineItem.data.ID)\">\n <i class=\"fas fa-external-link-alt\"></i> View Action Execution Log\n </button>\n </div>\n }\n <!-- Tab Navigation - Show when we have payload diff or scratchpad data -->\n @if (showStepPayloadDiff || showScratchpadTab) {\n <div class=\"detail-pane-tabs\">\n @if (showStepPayloadDiff) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'diff'\"\n (click)=\"detailPaneTab = 'diff'\">\n <i class=\"fa-solid fa-code-branch\"></i>\n Payload Changes\n </button>\n }\n @if (showScratchpadTab) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'scratchpad'\"\n (click)=\"detailPaneTab = 'scratchpad'\">\n <i class=\"fa-solid fa-clipboard-list\"></i>\n Scratchpad\n @if (scratchpadTaskChangeCount > 0) {\n <span class=\"tab-badge\">{{ scratchpadTaskChangeCount }}</span>\n }\n </button>\n }\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'json'\"\n (click)=\"detailPaneTab = 'json'\">\n <i class=\"fa-solid fa-code\"></i>\n Full JSON\n </button>\n </div>\n }\n <!-- Tab Content -->\n <div class=\"detail-pane-content\" [class.with-tabs]=\"showStepPayloadDiff || showScratchpadTab\">\n <!-- Payload Diff Tab -->\n @if (detailPaneTab === 'diff' && showStepPayloadDiff) {\n <div class=\"step-payload-diff\">\n <mj-deep-diff\n [oldValue]=\"stepPayloadAtStartObject\"\n [newValue]=\"stepPayloadAtEndObject\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"false\"\n [maxDepth]=\"8\"\n [maxStringLength]=\"150\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n </div>\n }\n <!-- Scratchpad Tab -->\n @if (detailPaneTab === 'scratchpad' && showScratchpadTab) {\n <div class=\"scratchpad-content\">\n <div class=\"scratchpad-sub-tabs\">\n <button\n class=\"scratchpad-sub-tab\"\n [class.active]=\"scratchpadSubTab === 'diff'\"\n (click)=\"scratchpadSubTab = 'diff'\">\n <i class=\"fa-solid fa-code-compare\"></i> Diff\n </button>\n <button\n class=\"scratchpad-sub-tab\"\n [class.active]=\"scratchpadSubTab === 'input'\"\n (click)=\"scratchpadSubTab = 'input'\">\n <i class=\"fa-solid fa-arrow-right-to-bracket\"></i> Input\n </button>\n <button\n class=\"scratchpad-sub-tab\"\n [class.active]=\"scratchpadSubTab === 'output'\"\n (click)=\"scratchpadSubTab = 'output'\">\n <i class=\"fa-solid fa-arrow-right-from-bracket\"></i> Output\n </button>\n </div>\n <!-- Scratchpad Diff Sub-Tab -->\n @if (scratchpadSubTab === 'diff') {\n <div class=\"scratchpad-diff-view\">\n @if (stepScratchpadInput && stepScratchpadOutput) {\n <mj-deep-diff\n [oldValue]=\"stepScratchpadInput\"\n [newValue]=\"stepScratchpadOutput\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"true\"\n [maxDepth]=\"6\"\n [maxStringLength]=\"300\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n } @else if (stepScratchpadOutput) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-plus\"\n Title=\"Scratchpad created in this step (no prior state)\" />\n <div class=\"scratchpad-snapshot\">\n <ng-container *ngTemplateOutlet=\"scratchpadSnapshotTpl; context: { $implicit: stepScratchpadOutput }\"></ng-container>\n </div>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No scratchpad changes in this step\" />\n }\n </div>\n }\n <!-- Scratchpad Input Sub-Tab -->\n @if (scratchpadSubTab === 'input') {\n <div class=\"scratchpad-snapshot-view\">\n @if (stepScratchpadInput) {\n <ng-container *ngTemplateOutlet=\"scratchpadSnapshotTpl; context: { $implicit: stepScratchpadInput }\"></ng-container>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No scratchpad input for this step\" />\n }\n </div>\n }\n <!-- Scratchpad Output Sub-Tab -->\n @if (scratchpadSubTab === 'output') {\n <div class=\"scratchpad-snapshot-view\">\n @if (stepScratchpadOutput) {\n <ng-container *ngTemplateOutlet=\"scratchpadSnapshotTpl; context: { $implicit: stepScratchpadOutput }\"></ng-container>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No scratchpad output for this step\" />\n }\n </div>\n }\n </div>\n }\n <!-- Full JSON Tab -->\n @if (detailPaneTab === 'json' || (!showStepPayloadDiff && !showScratchpadTab)) {\n <div class=\"json-viewer\">\n <div class=\"json-toolbar\">\n <button class=\"btn-icon\" title=\"Copy JSON\" (click)=\"onCopyToClipboard()\">\n <i class=\"fas fa-copy\"></i>\n </button>\n </div>\n <mj-code-editor\n [(ngModel)]=\"selectedItemJsonString\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"width: 100%;\">\n </mj-code-editor>\n </div>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- Reusable scratchpad snapshot template -->\n<ng-template #scratchpadSnapshotTpl let-snapshot>\n <div class=\"scratchpad-snapshot\">\n @if (snapshot.notes) {\n <div class=\"scratchpad-notes-section\">\n <h4><i class=\"fa-solid fa-note-sticky\"></i> Notes</h4>\n <div class=\"scratchpad-notes-content\">{{ snapshot.notes }}</div>\n </div>\n }\n @if (snapshot.tasks?.length > 0) {\n <div class=\"scratchpad-tasks-section\">\n <h4><i class=\"fa-solid fa-list-check\"></i> Tasks ({{ snapshot.tasks.length }})</h4>\n <div class=\"scratchpad-task-list\">\n @for (task of snapshot.tasks; track task.id) {\n <div class=\"scratchpad-task-item\" [attr.data-status]=\"task.status\">\n <span class=\"task-status-indicator\" [attr.data-status]=\"task.status\">\n @switch (task.status) {\n @case ('completed') { <i class=\"fa-solid fa-circle-check\"></i> }\n @case ('in_progress') { <i class=\"fa-solid fa-spinner\"></i> }\n @case ('blocked') { <i class=\"fa-solid fa-circle-xmark\"></i> }\n @default { <i class=\"fa-regular fa-circle\"></i> }\n }\n </span>\n <div class=\"task-content\">\n <span class=\"task-id\">{{ task.id }}</span>\n <span class=\"task-title\">{{ task.title }}</span>\n @if (task.notes) {\n <span class=\"task-notes\">{{ task.notes }}</span>\n }\n </div>\n <span class=\"task-status-badge\" [attr.data-status]=\"task.status\">{{ task.status }}</span>\n </div>\n }\n </div>\n </div>\n }\n @if (!snapshot.notes && (!snapshot.tasks || snapshot.tasks.length === 0)) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"Empty scratchpad\" />\n }\n </div>\n</ng-template>"]}
1
+ {"version":3,"file":"ai-agent-run-step-detail.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.ts","../../../../src/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, ChangeDetectorRef } from '@angular/core';\nimport { TimelineItem } from './ai-agent-run-timeline.component';\nimport { MJAIAgentRunStepEntity, MJAIAgentRunStepEntity_AgentSkillInvocation } from '@memberjunction/core-entities';\nimport { ParseJSONRecursive, ParseJSONOptions } from '@memberjunction/global';\n\ninterface ScratchpadSnapshotView {\n notes: string;\n tasks: Array<{\n id: string;\n title: string;\n status: string;\n notes?: string;\n }>;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-run-step-detail',\n templateUrl: './ai-agent-run-step-detail.component.html',\n styleUrls: ['./ai-agent-run-step-detail.component.css']\n})\nexport class AIAgentRunStepDetailComponent {\n @Input() selectedTimelineItem: TimelineItem | null = null;\n @Output() closePanel = new EventEmitter<void>();\n @Output() navigateToActionLog = new EventEmitter<string>();\n @Output() copyToClipboard = new EventEmitter<string>();\n\n selectedItemJsonString = '{}';\n detailPaneTab: 'json' | 'diff' | 'scratchpad' | 'skills' = 'diff';\n scratchpadSubTab: 'input' | 'output' | 'diff' = 'diff';\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnChanges() {\n if (this.selectedTimelineItem) {\n this.selectedItemJsonString = this.getSelectedItemJson();\n // Default to diff tab if step has payload diff, skills for Skill steps (the activation IS\n // the story there), scratchpad if available, otherwise json\n if (this.showStepPayloadDiff) {\n this.detailPaneTab = 'diff';\n } else if (this.showSkillsTab && this.selectedTimelineItem.data?.StepType === 'Skill') {\n this.detailPaneTab = 'skills';\n } else if (this.showScratchpadTab) {\n this.detailPaneTab = 'scratchpad';\n } else if (this.showSkillsTab) {\n this.detailPaneTab = 'skills';\n } else {\n this.detailPaneTab = 'json';\n }\n this.scratchpadSubTab = 'diff';\n this.cdr.detectChanges();\n }\n }\n\n getSelectedItemJson(): string {\n if (!this.selectedTimelineItem) return '{}';\n \n // Get all the data from the entity\n let data;\n if (this.selectedTimelineItem.data instanceof MJAIAgentRunStepEntity) {\n // If it's a step entity, we need to get the full run data\n data = this.selectedTimelineItem.data.GetAll();\n } else {\n data = this.selectedTimelineItem.data;\n }\n \n // Apply recursive JSON parsing to the entire data object\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n const parsedData = ParseJSONRecursive(data, parseOptions);\n \n return JSON.stringify(parsedData, null, 2);\n }\n\n /**\n * Check if selected timeline item is a step with payload changes\n */\n get showStepPayloadDiff(): boolean {\n if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {\n return false;\n }\n \n const stepData = this.selectedTimelineItem.data;\n if (stepData && (stepData.PayloadAtStart?.trim().length > 0 \n || stepData.PayloadAtEnd?.trim().length > 0)) {\n return stepData.PayloadAtStart !== stepData.PayloadAtEnd;\n } else {\n return false;\n }\n }\n\n /**\n * Get parsed PayloadAtStart for the selected step\n */\n get stepPayloadAtStartObject(): any {\n if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {\n return null;\n }\n \n const stepData = this.selectedTimelineItem.data;\n if (!stepData?.PayloadAtStart) return null;\n \n try {\n // First, check if PayloadAtStart is a JSON string that needs to be parsed\n let payloadData = stepData.PayloadAtStart;\n try {\n // If PayloadAtStart is a JSON string, parse it first\n payloadData = JSON.parse(stepData.PayloadAtStart);\n } catch {\n // If it's not valid JSON, use it as-is\n payloadData = stepData.PayloadAtStart;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n return ParseJSONRecursive(payloadData, parseOptions);\n } catch (e) {\n return null;\n }\n }\n\n /**\n * Get parsed PayloadAtEnd for the selected step\n */\n get stepPayloadAtEndObject(): any {\n if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {\n return null;\n }\n \n const stepData = this.selectedTimelineItem.data;\n if (!stepData?.PayloadAtEnd) return null;\n \n try {\n // First, check if PayloadAtEnd is a JSON string that needs to be parsed\n let payloadData = stepData.PayloadAtEnd;\n try {\n // If PayloadAtEnd is a JSON string, parse it first\n payloadData = JSON.parse(stepData.PayloadAtEnd);\n } catch {\n // If it's not valid JSON, use it as-is\n payloadData = stepData.PayloadAtEnd;\n }\n \n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n return ParseJSONRecursive(payloadData, parseOptions);\n } catch (e) {\n return null;\n }\n }\n\n onClosePanel() {\n this.closePanel.emit();\n }\n\n onNavigateToActionLog(logId: string) {\n this.navigateToActionLog.emit(logId);\n }\n\n onCopyToClipboard() {\n this.copyToClipboard.emit(this.getSelectedItemJson());\n }\n\n /**\n * Whether the Skills tab should be shown — true when the step has skill-invocation records\n * on its `Skills` column (Skill steps, Prompt steps with skills in effect, and Actions/\n * Sub-Agent steps whose tool was granted through a skill).\n */\n get showSkillsTab(): boolean {\n return this.stepSkillInvocations.length > 0;\n }\n\n /**\n * Parsed {@link MJAIAgentRunStepEntity_AgentSkillInvocation} records from the step's `Skills`\n * JSON column. Empty array when the step has no skill linkage or the JSON is malformed.\n */\n get stepSkillInvocations(): MJAIAgentRunStepEntity_AgentSkillInvocation[] {\n if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {\n return [];\n }\n const raw = this.selectedTimelineItem.data?.Skills;\n if (!raw) return [];\n try {\n const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n\n /** Human-readable label for an invocation's activation type. */\n public GetActivationTypeLabel(inv: MJAIAgentRunStepEntity_AgentSkillInvocation): string {\n return inv.ActivationType === 'requested' ? 'User Requested' : 'Agent Self-Activated';\n }\n\n /**\n * Whether the scratchpad tab should be shown (step has scratchpad data in InputData or OutputData)\n */\n get showScratchpadTab(): boolean {\n if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {\n return false;\n }\n return this.stepScratchpadInput !== null || this.stepScratchpadOutput !== null;\n }\n\n /**\n * Parse scratchpad snapshot from InputData JSON\n */\n get stepScratchpadInput(): ScratchpadSnapshotView | null {\n return this.extractScratchpadFromField('InputData');\n }\n\n /**\n * Parse scratchpad snapshot from OutputData JSON\n */\n get stepScratchpadOutput(): ScratchpadSnapshotView | null {\n return this.extractScratchpadFromField('OutputData');\n }\n\n /**\n * Number of tasks that changed between input and output scratchpad snapshots\n */\n get scratchpadTaskChangeCount(): number {\n const input = this.stepScratchpadInput;\n const output = this.stepScratchpadOutput;\n if (!input && !output) return 0;\n if (!input || !output) return (output?.tasks?.length ?? 0) + (input?.tasks?.length ?? 0);\n\n let changes = 0;\n const inputMap = new Map(input.tasks.map(t => [t.id, t]));\n const outputMap = new Map(output.tasks.map(t => [t.id, t]));\n\n for (const [id, task] of outputMap) {\n const prev = inputMap.get(id);\n if (!prev || prev.status !== task.status || prev.title !== task.title || prev.notes !== task.notes) {\n changes++;\n }\n }\n for (const id of inputMap.keys()) {\n if (!outputMap.has(id)) changes++; // removed tasks\n }\n if (input.notes !== output.notes) changes++;\n return changes;\n }\n\n private extractScratchpadFromField(fieldName: 'InputData' | 'OutputData'): ScratchpadSnapshotView | null {\n if (!this.selectedTimelineItem || this.selectedTimelineItem.type !== 'step') {\n return null;\n }\n\n const stepData = this.selectedTimelineItem.data;\n const rawValue = stepData?.[fieldName];\n if (!rawValue) return null;\n\n try {\n let parsed = rawValue;\n if (typeof parsed === 'string') {\n parsed = JSON.parse(parsed);\n }\n const scratchpad = parsed?.scratchpad;\n if (!scratchpad) return null;\n return {\n notes: scratchpad.notes ?? '',\n tasks: Array.isArray(scratchpad.tasks) ? scratchpad.tasks : []\n };\n } catch {\n return null;\n }\n }\n}","@if (selectedTimelineItem) {\n <div class=\"json-detail-pane\">\n <div class=\"json-pane-header\">\n <h3>\n <i class=\"fas\" [ngClass]=\"selectedTimelineItem.icon\"></i>\n {{ selectedTimelineItem.title }}\n </h3>\n <button class=\"btn-icon\" (click)=\"onClosePanel()\" title=\"Close\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"json-pane-content\">\n <div class=\"json-meta\">\n <div class=\"meta-item\">\n <label>Type</label>\n <span>{{ selectedTimelineItem.type }}</span>\n </div>\n <div class=\"meta-item\">\n <label>Status</label>\n <span class=\"status-badge small\" [attr.data-status]=\"selectedTimelineItem.status\">\n {{ selectedTimelineItem.status }}\n </span>\n </div>\n <div class=\"meta-item\">\n <label>Duration</label>\n <span>{{ selectedTimelineItem.duration || 'N/A' }}</span>\n </div>\n </div>\n <!-- Action-specific link -->\n @if (selectedTimelineItem.type === 'action' && selectedTimelineItem.data?.ID) {\n <div class=\"action-link\">\n <button class=\"btn-link\" (click)=\"onNavigateToActionLog(selectedTimelineItem.data.ID)\">\n <i class=\"fas fa-external-link-alt\"></i> View Action Execution Log\n </button>\n </div>\n }\n <!-- Tab Navigation - Show when we have payload diff or scratchpad data -->\n @if (showStepPayloadDiff || showScratchpadTab || showSkillsTab) {\n <div class=\"detail-pane-tabs\">\n @if (showStepPayloadDiff) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'diff'\"\n (click)=\"detailPaneTab = 'diff'\">\n <i class=\"fa-solid fa-code-branch\"></i>\n Payload Changes\n </button>\n }\n @if (showSkillsTab) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'skills'\"\n (click)=\"detailPaneTab = 'skills'\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n Skills\n <span class=\"tab-badge\">{{ stepSkillInvocations.length }}</span>\n </button>\n }\n @if (showScratchpadTab) {\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'scratchpad'\"\n (click)=\"detailPaneTab = 'scratchpad'\">\n <i class=\"fa-solid fa-clipboard-list\"></i>\n Scratchpad\n @if (scratchpadTaskChangeCount > 0) {\n <span class=\"tab-badge\">{{ scratchpadTaskChangeCount }}</span>\n }\n </button>\n }\n <button\n class=\"detail-tab\"\n [class.active]=\"detailPaneTab === 'json'\"\n (click)=\"detailPaneTab = 'json'\">\n <i class=\"fa-solid fa-code\"></i>\n Full JSON\n </button>\n </div>\n }\n <!-- Tab Content -->\n <div class=\"detail-pane-content\" [class.with-tabs]=\"showStepPayloadDiff || showScratchpadTab || showSkillsTab\">\n <!-- Skills Tab — skill-invocation observability (activation type, provenance of authority, reason) -->\n @if (detailPaneTab === 'skills' && showSkillsTab) {\n <div class=\"skills-content\">\n @for (inv of stepSkillInvocations; track inv.SkillID) {\n <div class=\"skill-invocation-card\" [attr.data-activation]=\"inv.ActivationType\">\n <div class=\"skill-invocation-header\">\n <span class=\"skill-invocation-name\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n {{ inv.SkillName }}\n </span>\n <span class=\"skill-invocation-type\" [attr.data-activation]=\"inv.ActivationType\">\n {{ GetActivationTypeLabel(inv) }}\n </span>\n </div>\n @if (inv.Reason) {\n <div class=\"skill-invocation-reason\">\n <i class=\"fa-solid fa-quote-left\"></i>\n {{ inv.Reason }}\n </div>\n }\n <div class=\"skill-invocation-provenance\">\n <div class=\"provenance-title\">Provenance of Authority</div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Requested By</span>\n <span class=\"provenance-value\">{{ inv.Provenance.RequestedBy === 'user-request' ? 'User (/skill mention)' : 'Agent decision' }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Agent AcceptsSkills</span>\n <span class=\"provenance-value\">{{ inv.Provenance.AgentAcceptsSkills }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Skill ActivationMode</span>\n <span class=\"provenance-value\">{{ inv.Provenance.SkillActivationMode }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Agent SkillActivationMode</span>\n <span class=\"provenance-value\">{{ inv.Provenance.AgentSkillActivationMode }}</span>\n </div>\n <div class=\"provenance-row\">\n <span class=\"provenance-label\">Skill ID</span>\n <span class=\"provenance-value provenance-id\">{{ inv.SkillID }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n }\n <!-- Payload Diff Tab -->\n @if (detailPaneTab === 'diff' && showStepPayloadDiff) {\n <div class=\"step-payload-diff\">\n <mj-deep-diff\n [oldValue]=\"stepPayloadAtStartObject\"\n [newValue]=\"stepPayloadAtEndObject\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"false\"\n [maxDepth]=\"8\"\n [maxStringLength]=\"150\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n </div>\n }\n <!-- Scratchpad Tab -->\n @if (detailPaneTab === 'scratchpad' && showScratchpadTab) {\n <div class=\"scratchpad-content\">\n <div class=\"scratchpad-sub-tabs\">\n <button\n class=\"scratchpad-sub-tab\"\n [class.active]=\"scratchpadSubTab === 'diff'\"\n (click)=\"scratchpadSubTab = 'diff'\">\n <i class=\"fa-solid fa-code-compare\"></i> Diff\n </button>\n <button\n class=\"scratchpad-sub-tab\"\n [class.active]=\"scratchpadSubTab === 'input'\"\n (click)=\"scratchpadSubTab = 'input'\">\n <i class=\"fa-solid fa-arrow-right-to-bracket\"></i> Input\n </button>\n <button\n class=\"scratchpad-sub-tab\"\n [class.active]=\"scratchpadSubTab === 'output'\"\n (click)=\"scratchpadSubTab = 'output'\">\n <i class=\"fa-solid fa-arrow-right-from-bracket\"></i> Output\n </button>\n </div>\n <!-- Scratchpad Diff Sub-Tab -->\n @if (scratchpadSubTab === 'diff') {\n <div class=\"scratchpad-diff-view\">\n @if (stepScratchpadInput && stepScratchpadOutput) {\n <mj-deep-diff\n [oldValue]=\"stepScratchpadInput\"\n [newValue]=\"stepScratchpadOutput\"\n [title]=\"''\"\n [showSummary]=\"true\"\n [showUnchanged]=\"false\"\n [expandAll]=\"true\"\n [maxDepth]=\"6\"\n [maxStringLength]=\"300\"\n [treatNullAsUndefined]=\"true\">\n </mj-deep-diff>\n } @else if (stepScratchpadOutput) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-plus\"\n Title=\"Scratchpad created in this step (no prior state)\" />\n <div class=\"scratchpad-snapshot\">\n <ng-container *ngTemplateOutlet=\"scratchpadSnapshotTpl; context: { $implicit: stepScratchpadOutput }\"></ng-container>\n </div>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No scratchpad changes in this step\" />\n }\n </div>\n }\n <!-- Scratchpad Input Sub-Tab -->\n @if (scratchpadSubTab === 'input') {\n <div class=\"scratchpad-snapshot-view\">\n @if (stepScratchpadInput) {\n <ng-container *ngTemplateOutlet=\"scratchpadSnapshotTpl; context: { $implicit: stepScratchpadInput }\"></ng-container>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No scratchpad input for this step\" />\n }\n </div>\n }\n <!-- Scratchpad Output Sub-Tab -->\n @if (scratchpadSubTab === 'output') {\n <div class=\"scratchpad-snapshot-view\">\n @if (stepScratchpadOutput) {\n <ng-container *ngTemplateOutlet=\"scratchpadSnapshotTpl; context: { $implicit: stepScratchpadOutput }\"></ng-container>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No scratchpad output for this step\" />\n }\n </div>\n }\n </div>\n }\n <!-- Full JSON Tab -->\n @if (detailPaneTab === 'json' || (!showStepPayloadDiff && !showScratchpadTab)) {\n <div class=\"json-viewer\">\n <div class=\"json-toolbar\">\n <button class=\"btn-icon\" title=\"Copy JSON\" (click)=\"onCopyToClipboard()\">\n <i class=\"fas fa-copy\"></i>\n </button>\n </div>\n <mj-code-editor\n [(ngModel)]=\"selectedItemJsonString\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"width: 100%;\">\n </mj-code-editor>\n </div>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- Reusable scratchpad snapshot template -->\n<ng-template #scratchpadSnapshotTpl let-snapshot>\n <div class=\"scratchpad-snapshot\">\n @if (snapshot.notes) {\n <div class=\"scratchpad-notes-section\">\n <h4><i class=\"fa-solid fa-note-sticky\"></i> Notes</h4>\n <div class=\"scratchpad-notes-content\">{{ snapshot.notes }}</div>\n </div>\n }\n @if (snapshot.tasks?.length > 0) {\n <div class=\"scratchpad-tasks-section\">\n <h4><i class=\"fa-solid fa-list-check\"></i> Tasks ({{ snapshot.tasks.length }})</h4>\n <div class=\"scratchpad-task-list\">\n @for (task of snapshot.tasks; track task.id) {\n <div class=\"scratchpad-task-item\" [attr.data-status]=\"task.status\">\n <span class=\"task-status-indicator\" [attr.data-status]=\"task.status\">\n @switch (task.status) {\n @case ('completed') { <i class=\"fa-solid fa-circle-check\"></i> }\n @case ('in_progress') { <i class=\"fa-solid fa-spinner\"></i> }\n @case ('blocked') { <i class=\"fa-solid fa-circle-xmark\"></i> }\n @default { <i class=\"fa-regular fa-circle\"></i> }\n }\n </span>\n <div class=\"task-content\">\n <span class=\"task-id\">{{ task.id }}</span>\n <span class=\"task-title\">{{ task.title }}</span>\n @if (task.notes) {\n <span class=\"task-notes\">{{ task.notes }}</span>\n }\n </div>\n <span class=\"task-status-badge\" [attr.data-status]=\"task.status\">{{ task.status }}</span>\n </div>\n }\n </div>\n </div>\n }\n @if (!snapshot.notes && (!snapshot.tasks || snapshot.tasks.length === 0)) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"Empty scratchpad\" />\n }\n </div>\n</ng-template>"]}
@@ -1,4 +1,5 @@
1
1
  import { EventEmitter } from '@angular/core';
2
+ import { MJAIAgentRunStepEntity_AgentSkillInvocation } from '@memberjunction/core-entities';
2
3
  import { TimelineItem } from './ai-agent-run-timeline.component';
3
4
  import * as i0 from "@angular/core";
4
5
  export declare class AIAgentRunStepNodeComponent {
@@ -20,6 +21,15 @@ export declare class AIAgentRunStepNodeComponent {
20
21
  handleClick(): void;
21
22
  handleExpandToggle(event: Event): void;
22
23
  navigateToRecord(event: Event): void;
24
+ /**
25
+ * Skill-invocation records associated with this step (parsed from `AIAgentRunStep.Skills`).
26
+ * Non-empty on Skill steps (the activation performed), Prompt steps (skills in effect for
27
+ * the turn), and Actions/Sub-Agent steps whose tool was granted by a skill rather than a
28
+ * native agent grant.
29
+ */
30
+ get SkillInvocations(): MJAIAgentRunStepEntity_AgentSkillInvocation[];
31
+ /** Tooltip summarizing an invocation's provenance for the badge hover. */
32
+ GetSkillChipTooltip(inv: MJAIAgentRunStepEntity_AgentSkillInvocation): string;
23
33
  getAdditionalInfo(): string;
24
34
  onLogoError(event: Event): void;
25
35
  static ɵfac: i0.ɵɵFactoryDeclaration<AIAgentRunStepNodeComponent, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"ai-agent-run-step-node.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-step-node.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;;AAEjE,qBAMa,2BAA2B;IAC7B,IAAI,EAAG,YAAY,CAAC;IACpB,UAAU,UAAS;IAClB,SAAS,6BAAoC;IAC7C,YAAY,sBAA6B;IACzC,gBAAgB;oBAAkC,MAAM;kBAAY,MAAM;OAAM;IAE1F,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,YAAY,IAAI,OAAO,CAK1B;IAED,IAAI,SAAS,IAAI,OAAO,CAGvB;IAED,IAAI,mBAAmB,IAAI,OAAO,CAQjC;IAED,IAAI,oBAAoB,IAAI,MAAM,CAiBjC;IAED,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAWrC,WAAW;IAIX,kBAAkB,CAAC,KAAK,EAAE,KAAK;IAM/B,gBAAgB,CAAC,KAAK,EAAE,KAAK;IA8C7B,iBAAiB,IAAI,MAAM;IAyB3B,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;yCApJpB,2BAA2B;2CAA3B,2BAA2B;CA0JvC"}
1
+ {"version":3,"file":"ai-agent-run-step-node.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-step-node.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,2CAA2C,EAAE,MAAM,+BAA+B,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;;AAEjE,qBAMa,2BAA2B;IAC7B,IAAI,EAAG,YAAY,CAAC;IACpB,UAAU,UAAS;IAClB,SAAS,6BAAoC;IAC7C,YAAY,sBAA6B;IACzC,gBAAgB;oBAAkC,MAAM;kBAAY,MAAM;OAAM;IAE1F,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,YAAY,IAAI,OAAO,CAK1B;IAED,IAAI,SAAS,IAAI,OAAO,CAGvB;IAED,IAAI,mBAAmB,IAAI,OAAO,CAQjC;IAED,IAAI,oBAAoB,IAAI,MAAM,CAiBjC;IAED,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAWrC,WAAW;IAIX,kBAAkB,CAAC,KAAK,EAAE,KAAK;IAM/B,gBAAgB,CAAC,KAAK,EAAE,KAAK;IA8C7B;;;;;OAKG;IACH,IAAI,gBAAgB,IAAI,2CAA2C,EAAE,CASpE;IAED,0EAA0E;IACnE,mBAAmB,CAAC,GAAG,EAAE,2CAA2C,GAAG,MAAM;IAMpF,iBAAiB,IAAI,MAAM;IAyB3B,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;yCA5KpB,2BAA2B;2CAA3B,2BAA2B;CAkLvC"}
@@ -1,11 +1,12 @@
1
1
  import { Component, Input, Output, EventEmitter } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "@angular/common";
4
+ const _forTrack0 = ($index, $item) => $item.SkillID;
4
5
  function AIAgentRunStepNodeComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
5
6
  const _r1 = i0.ɵɵgetCurrentView();
6
- i0.ɵɵelementStart(0, "button", 15);
7
+ i0.ɵɵelementStart(0, "button", 16);
7
8
  i0.ɵɵlistener("click", function AIAgentRunStepNodeComponent_Conditional_1_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.handleExpandToggle($event)); });
8
- i0.ɵɵelement(1, "i", 16);
9
+ i0.ɵɵelement(1, "i", 17);
9
10
  i0.ɵɵelementEnd();
10
11
  } if (rf & 2) {
11
12
  const ctx_r1 = i0.ɵɵnextContext();
@@ -15,7 +16,7 @@ function AIAgentRunStepNodeComponent_Conditional_1_Template(rf, ctx) { if (rf &
15
16
  } }
16
17
  function AIAgentRunStepNodeComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
17
18
  const _r3 = i0.ɵɵgetCurrentView();
18
- i0.ɵɵelementStart(0, "img", 17);
19
+ i0.ɵɵelementStart(0, "img", 18);
19
20
  i0.ɵɵlistener("error", function AIAgentRunStepNodeComponent_Conditional_3_Template_img_error_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onLogoError($event)); });
20
21
  i0.ɵɵelementEnd();
21
22
  } if (rf & 2) {
@@ -37,9 +38,35 @@ function AIAgentRunStepNodeComponent_Conditional_14_Template(rf, ctx) { if (rf &
37
38
  i0.ɵɵadvance();
38
39
  i0.ɵɵtextInterpolate1(" ", ctx_r1.getAdditionalInfo(), " ");
39
40
  } }
40
- function AIAgentRunStepNodeComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
41
- i0.ɵɵelementStart(0, "span", 11);
42
- i0.ɵɵelement(1, "i", 18);
41
+ function AIAgentRunStepNodeComponent_Conditional_15_For_2_Template(rf, ctx) { if (rf & 1) {
42
+ i0.ɵɵelementStart(0, "span", 19);
43
+ i0.ɵɵelement(1, "i", 20);
44
+ i0.ɵɵtext(2);
45
+ i0.ɵɵelementStart(3, "span", 21);
46
+ i0.ɵɵtext(4);
47
+ i0.ɵɵelementEnd()();
48
+ } if (rf & 2) {
49
+ const inv_r4 = ctx.$implicit;
50
+ const ctx_r1 = i0.ɵɵnextContext(2);
51
+ i0.ɵɵproperty("title", ctx_r1.GetSkillChipTooltip(inv_r4));
52
+ i0.ɵɵattribute("data-activation", inv_r4.ActivationType);
53
+ i0.ɵɵadvance(2);
54
+ i0.ɵɵtextInterpolate1(" ", inv_r4.SkillName, " ");
55
+ i0.ɵɵadvance(2);
56
+ i0.ɵɵtextInterpolate(inv_r4.ActivationType === "requested" ? "user" : "auto");
57
+ } }
58
+ function AIAgentRunStepNodeComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
59
+ i0.ɵɵelementStart(0, "div", 10);
60
+ i0.ɵɵrepeaterCreate(1, AIAgentRunStepNodeComponent_Conditional_15_For_2_Template, 5, 4, "span", 19, _forTrack0);
61
+ i0.ɵɵelementEnd();
62
+ } if (rf & 2) {
63
+ const ctx_r1 = i0.ɵɵnextContext();
64
+ i0.ɵɵadvance();
65
+ i0.ɵɵrepeater(ctx_r1.SkillInvocations);
66
+ } }
67
+ function AIAgentRunStepNodeComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
68
+ i0.ɵɵelementStart(0, "span", 12);
69
+ i0.ɵɵelement(1, "i", 22);
43
70
  i0.ɵɵtext(2);
44
71
  i0.ɵɵelementEnd();
45
72
  } if (rf & 2) {
@@ -47,12 +74,12 @@ function AIAgentRunStepNodeComponent_Conditional_16_Template(rf, ctx) { if (rf &
47
74
  i0.ɵɵadvance(2);
48
75
  i0.ɵɵtextInterpolate1(" ", ctx_r1.item.duration, " ");
49
76
  } }
50
- function AIAgentRunStepNodeComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
51
- const _r4 = i0.ɵɵgetCurrentView();
52
- i0.ɵɵelementStart(0, "button", 19);
53
- i0.ɵɵlistener("click", function AIAgentRunStepNodeComponent_Conditional_21_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.navigateToRecord($event)); });
54
- i0.ɵɵelement(1, "i", 20);
55
- i0.ɵɵelementStart(2, "span", 21);
77
+ function AIAgentRunStepNodeComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
78
+ const _r5 = i0.ɵɵgetCurrentView();
79
+ i0.ɵɵelementStart(0, "button", 23);
80
+ i0.ɵɵlistener("click", function AIAgentRunStepNodeComponent_Conditional_22_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.navigateToRecord($event)); });
81
+ i0.ɵɵelement(1, "i", 24);
82
+ i0.ɵɵelementStart(2, "span", 25);
56
83
  i0.ɵɵtext(3);
57
84
  i0.ɵɵelementEnd()();
58
85
  } if (rf & 2) {
@@ -169,6 +196,30 @@ export class AIAgentRunStepNodeComponent {
169
196
  this.navigateToEntity.emit({ entityName, recordId });
170
197
  }
171
198
  }
199
+ /**
200
+ * Skill-invocation records associated with this step (parsed from `AIAgentRunStep.Skills`).
201
+ * Non-empty on Skill steps (the activation performed), Prompt steps (skills in effect for
202
+ * the turn), and Actions/Sub-Agent steps whose tool was granted by a skill rather than a
203
+ * native agent grant.
204
+ */
205
+ get SkillInvocations() {
206
+ const raw = this.item.type === 'step' ? this.item.data?.Skills : null;
207
+ if (!raw)
208
+ return [];
209
+ try {
210
+ const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;
211
+ return Array.isArray(parsed) ? parsed : [];
212
+ }
213
+ catch {
214
+ return [];
215
+ }
216
+ }
217
+ /** Tooltip summarizing an invocation's provenance for the badge hover. */
218
+ GetSkillChipTooltip(inv) {
219
+ const who = inv.ActivationType === 'requested' ? 'requested by the user (/skill mention)' : 'self-activated by the agent';
220
+ const reason = inv.Reason ? ` — ${inv.Reason}` : '';
221
+ return `${inv.SkillName}: ${who}${reason}`;
222
+ }
172
223
  getAdditionalInfo() {
173
224
  if (this.item.type === 'step' && this.item.data) {
174
225
  const step = this.item.data;
@@ -196,7 +247,7 @@ export class AIAgentRunStepNodeComponent {
196
247
  this.item.logoUrl = undefined;
197
248
  }
198
249
  static { this.ɵfac = function AIAgentRunStepNodeComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AIAgentRunStepNodeComponent)(); }; }
199
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AIAgentRunStepNodeComponent, selectors: [["mj-ai-agent-run-step-node"]], inputs: { item: "item", isSelected: "isSelected" }, outputs: { itemClick: "itemClick", expandToggle: "expandToggle", navigateToEntity: "navigateToEntity" }, standalone: false, decls: 22, vars: 22, consts: [[1, "timeline-item", 3, "click"], [1, "expand-toggle"], [1, "timeline-marker"], [1, "timeline-marker-logo", 3, "src", "alt"], [1, "fas", 3, "ngClass"], [1, "timeline-content"], [1, "timeline-header"], [1, "timeline-time"], [1, "timeline-subtitle"], [1, "timeline-additional-info"], [1, "timeline-meta"], [1, "duration"], [1, "status"], [1, "timeline-actions"], [1, "btn-link", 3, "title"], [1, "expand-toggle", 3, "click"], [1, "fas"], [1, "timeline-marker-logo", 3, "error", "src", "alt"], [1, "fas", "fa-clock"], [1, "btn-link", 3, "click", "title"], [1, "fas", "fa-external-link-alt"], [1, "action-text"]], template: function AIAgentRunStepNodeComponent_Template(rf, ctx) { if (rf & 1) {
250
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AIAgentRunStepNodeComponent, selectors: [["mj-ai-agent-run-step-node"]], inputs: { item: "item", isSelected: "isSelected" }, outputs: { itemClick: "itemClick", expandToggle: "expandToggle", navigateToEntity: "navigateToEntity" }, standalone: false, decls: 23, vars: 23, consts: [[1, "timeline-item", 3, "click"], [1, "expand-toggle"], [1, "timeline-marker"], [1, "timeline-marker-logo", 3, "src", "alt"], [1, "fas", 3, "ngClass"], [1, "timeline-content"], [1, "timeline-header"], [1, "timeline-time"], [1, "timeline-subtitle"], [1, "timeline-additional-info"], [1, "timeline-skills"], [1, "timeline-meta"], [1, "duration"], [1, "status"], [1, "timeline-actions"], [1, "btn-link", 3, "title"], [1, "expand-toggle", 3, "click"], [1, "fas"], [1, "timeline-marker-logo", 3, "error", "src", "alt"], [1, "skill-chip", 3, "title"], [1, "fas", "fa-wand-magic-sparkles"], [1, "skill-chip-mode"], [1, "fas", "fa-clock"], [1, "btn-link", 3, "click", "title"], [1, "fas", "fa-external-link-alt"], [1, "action-text"]], template: function AIAgentRunStepNodeComponent_Template(rf, ctx) { if (rf & 1) {
200
251
  i0.ɵɵelementStart(0, "div", 0);
201
252
  i0.ɵɵlistener("click", function AIAgentRunStepNodeComponent_Template_div_click_0_listener() { return ctx.handleClick(); });
202
253
  i0.ɵɵconditionalCreate(1, AIAgentRunStepNodeComponent_Conditional_1_Template, 2, 5, "button", 1);
@@ -215,14 +266,15 @@ export class AIAgentRunStepNodeComponent {
215
266
  i0.ɵɵtext(13);
216
267
  i0.ɵɵelementEnd();
217
268
  i0.ɵɵconditionalCreate(14, AIAgentRunStepNodeComponent_Conditional_14_Template, 2, 1, "div", 9);
218
- i0.ɵɵelementStart(15, "div", 10);
219
- i0.ɵɵconditionalCreate(16, AIAgentRunStepNodeComponent_Conditional_16_Template, 3, 1, "span", 11);
220
- i0.ɵɵelementStart(17, "span", 12);
221
- i0.ɵɵelement(18, "i", 4);
222
- i0.ɵɵtext(19);
269
+ i0.ɵɵconditionalCreate(15, AIAgentRunStepNodeComponent_Conditional_15_Template, 3, 0, "div", 10);
270
+ i0.ɵɵelementStart(16, "div", 11);
271
+ i0.ɵɵconditionalCreate(17, AIAgentRunStepNodeComponent_Conditional_17_Template, 3, 1, "span", 12);
272
+ i0.ɵɵelementStart(18, "span", 13);
273
+ i0.ɵɵelement(19, "i", 4);
274
+ i0.ɵɵtext(20);
223
275
  i0.ɵɵelementEnd()()();
224
- i0.ɵɵelementStart(20, "div", 13);
225
- i0.ɵɵconditionalCreate(21, AIAgentRunStepNodeComponent_Conditional_21_Template, 4, 2, "button", 14);
276
+ i0.ɵɵelementStart(21, "div", 14);
277
+ i0.ɵɵconditionalCreate(22, AIAgentRunStepNodeComponent_Conditional_22_Template, 4, 2, "button", 15);
226
278
  i0.ɵɵelementEnd()();
227
279
  } if (rf & 2) {
228
280
  i0.ɵɵstyleProp("margin-left", ctx.item.level * 24, "px");
@@ -239,13 +291,15 @@ export class AIAgentRunStepNodeComponent {
239
291
  i0.ɵɵadvance(4);
240
292
  i0.ɵɵtextInterpolate(ctx.item.title);
241
293
  i0.ɵɵadvance(2);
242
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(11, 19, ctx.item.startTime, "h:mm:ss.SSS a"));
294
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(11, 20, ctx.item.startTime, "h:mm:ss.SSS a"));
243
295
  i0.ɵɵadvance(3);
244
296
  i0.ɵɵtextInterpolate(ctx.item.subtitle);
245
297
  i0.ɵɵadvance();
246
298
  i0.ɵɵconditional(ctx.getAdditionalInfo() ? 14 : -1);
299
+ i0.ɵɵadvance();
300
+ i0.ɵɵconditional(ctx.SkillInvocations.length > 0 ? 15 : -1);
247
301
  i0.ɵɵadvance(2);
248
- i0.ɵɵconditional(ctx.item.duration ? 16 : -1);
302
+ i0.ɵɵconditional(ctx.item.duration ? 17 : -1);
249
303
  i0.ɵɵadvance();
250
304
  i0.ɵɵattribute("data-status", ctx.item.status);
251
305
  i0.ɵɵadvance();
@@ -253,12 +307,12 @@ export class AIAgentRunStepNodeComponent {
253
307
  i0.ɵɵadvance();
254
308
  i0.ɵɵtextInterpolate1(" ", ctx.item.status, " ");
255
309
  i0.ɵɵadvance(2);
256
- i0.ɵɵconditional(ctx.canNavigateToEntity ? 21 : -1);
257
- } }, dependencies: [i1.NgClass, i1.DatePipe], styles: [".timeline-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 12px;\n padding-left: 22px; \n\n margin-bottom: 8px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s;\n position: relative;\n}\n\n.timeline-item[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n background: var(--mj-bg-surface-sunken);\n transform: translateX(2px);\n}\n\n.timeline-item.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: 0 0 0 1px var(--mj-brand-primary);\n}\n\n\n\n.expand-toggle[_ngcontent-%COMP%] {\n position: absolute;\n left: -34px;\n top: 12px;\n width: 24px;\n height: 24px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s;\n z-index: 1;\n}\n\n.expand-toggle[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.expand-toggle[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n}\n\n\n\n.timeline-marker[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n position: relative;\n overflow: hidden;\n}\n\n.timeline-marker-logo[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 50%;\n}\n\n.timeline-marker[data-color=\"info\"][_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n\n.timeline-marker[data-color=\"success\"][_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n}\n\n.timeline-marker[data-color=\"error\"][_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n}\n\n.timeline-marker[data-color=\"warning\"][_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n}\n\n.timeline-marker[data-color=\"secondary\"][_ngcontent-%COMP%] {\n background: var(--mj-text-disabled);\n}\n\n\n\n.timeline-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.timeline-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n margin-bottom: 4px;\n}\n\n.timeline-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.timeline-time[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n font-family: monospace;\n white-space: nowrap;\n margin-left: 12px;\n}\n\n.timeline-subtitle[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-bottom: 4px;\n}\n\n.timeline-additional-info[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-bottom: 4px;\n font-style: italic;\n}\n\n.timeline-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.duration[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.status[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n font-weight: 500;\n}\n\n.status[data-status=\"Running\"][_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.status[data-status=\"Completed\"][_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.status[data-status=\"Failed\"][_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.status[data-status=\"Cancelled\"][_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n\n\n.timeline-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n font-size: 11px;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s;\n display: flex;\n align-items: center;\n gap: 4px;\n white-space: nowrap;\n}\n\n.btn-link[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.btn-link[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.action-text[_ngcontent-%COMP%] {\n display: none;\n}\n\n.timeline-item[_ngcontent-%COMP%]:hover .action-text[_ngcontent-%COMP%] {\n display: inline;\n}\n\n\n\n.timeline-item[data-type=\"subrun\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.timeline-item[data-type=\"action\"][_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-status-success);\n}\n\n.timeline-item[data-type=\"prompt\"][_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-brand-primary);\n}"] }); }
310
+ i0.ɵɵconditional(ctx.canNavigateToEntity ? 22 : -1);
311
+ } }, dependencies: [i1.NgClass, i1.DatePipe], styles: [".timeline-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 12px;\n padding-left: 22px; \n\n margin-bottom: 8px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s;\n position: relative;\n}\n\n.timeline-item[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n background: var(--mj-bg-surface-sunken);\n transform: translateX(2px);\n}\n\n.timeline-item.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: 0 0 0 1px var(--mj-brand-primary);\n}\n\n\n\n.expand-toggle[_ngcontent-%COMP%] {\n position: absolute;\n left: -34px;\n top: 12px;\n width: 24px;\n height: 24px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s;\n z-index: 1;\n}\n\n.expand-toggle[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.expand-toggle[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n}\n\n\n\n.timeline-marker[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n position: relative;\n overflow: hidden;\n}\n\n.timeline-marker-logo[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 50%;\n}\n\n.timeline-marker[data-color=\"info\"][_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n\n.timeline-marker[data-color=\"success\"][_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n}\n\n.timeline-marker[data-color=\"error\"][_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n}\n\n.timeline-marker[data-color=\"warning\"][_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n}\n\n.timeline-marker[data-color=\"secondary\"][_ngcontent-%COMP%] {\n background: var(--mj-text-disabled);\n}\n\n\n\n.timeline-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.timeline-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n margin-bottom: 4px;\n}\n\n.timeline-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.timeline-time[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n font-family: monospace;\n white-space: nowrap;\n margin-left: 12px;\n}\n\n.timeline-subtitle[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-bottom: 4px;\n}\n\n.timeline-additional-info[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-bottom: 4px;\n font-style: italic;\n}\n\n.timeline-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.duration[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.status[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n font-weight: 500;\n}\n\n.status[data-status=\"Running\"][_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.status[data-status=\"Completed\"][_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.status[data-status=\"Failed\"][_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.status[data-status=\"Cancelled\"][_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n\n\n.timeline-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n font-size: 11px;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s;\n display: flex;\n align-items: center;\n gap: 4px;\n white-space: nowrap;\n}\n\n.btn-link[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.btn-link[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.action-text[_ngcontent-%COMP%] {\n display: none;\n}\n\n.timeline-item[_ngcontent-%COMP%]:hover .action-text[_ngcontent-%COMP%] {\n display: inline;\n}\n\n\n\n.timeline-item[data-type=\"subrun\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.timeline-item[data-type=\"action\"][_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-status-success);\n}\n\n.timeline-item[data-type=\"prompt\"][_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n\n\n\n.timeline-skills[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 6px;\n}\n\n.skill-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 2px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n}\n\n\n\n.skill-chip[data-activation=\"auto\"][_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text);\n border-color: color-mix(in srgb, var(--mj-status-warning) 30%, transparent);\n}\n\n.skill-chip-mode[_ngcontent-%COMP%] {\n font-size: 9px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n opacity: 0.75;\n padding-left: 4px;\n border-left: 1px solid color-mix(in srgb, currentColor 30%, transparent);\n}"] }); }
258
312
  }
259
313
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIAgentRunStepNodeComponent, [{
260
314
  type: Component,
261
- args: [{ standalone: false, selector: 'mj-ai-agent-run-step-node', template: "<div class=\"timeline-item\"\n [class.selected]=\"isSelected\"\n [attr.data-status]=\"item.status\"\n [attr.data-type]=\"item.type\"\n [style.margin-left.px]=\"item.level * 24\"\n (click)=\"handleClick()\">\n\n <!-- Expand/Collapse Button for Sub-Agents and Parent Steps -->\n @if (canExpand) {\n <button class=\"expand-toggle\"\n (click)=\"handleExpandToggle($event)\"\n [attr.aria-expanded]=\"item.isExpanded\">\n <i class=\"fas\"\n [class.fa-chevron-right]=\"!item.isExpanded\"\n [class.fa-chevron-down]=\"item.isExpanded\"></i>\n </button>\n }\n\n <!-- Timeline Marker -->\n <div class=\"timeline-marker\" [attr.data-color]=\"item.color\">\n @if (item.logoUrl) {\n <img\n [src]=\"item.logoUrl\"\n [alt]=\"item.title\"\n class=\"timeline-marker-logo\"\n (error)=\"onLogoError($event)\" />\n }\n @if (!item.logoUrl) {\n <i class=\"fas\" [ngClass]=\"item.icon\"></i>\n }\n </div>\n\n <!-- Timeline Content -->\n <div class=\"timeline-content\">\n <div class=\"timeline-header\">\n <h4>{{ item.title }}</h4>\n <span class=\"timeline-time\">{{ item.startTime | date:'h:mm:ss.SSS a' }}</span>\n </div>\n\n <div class=\"timeline-subtitle\">{{ item.subtitle }}</div>\n\n @if (getAdditionalInfo()) {\n <div class=\"timeline-additional-info\">\n {{ getAdditionalInfo() }}\n </div>\n }\n\n <div class=\"timeline-meta\">\n @if (item.duration) {\n <span class=\"duration\">\n <i class=\"fas fa-clock\"></i> {{ item.duration }}\n </span>\n }\n <span class=\"status\" [attr.data-status]=\"item.status\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon(item.status)\"></i>\n {{ item.status }}\n </span>\n </div>\n </div>\n\n <!-- Timeline Actions -->\n <div class=\"timeline-actions\">\n @if (canNavigateToEntity) {\n <button class=\"btn-link\"\n (click)=\"navigateToRecord($event)\"\n [title]=\"entityNavigationText\">\n <i class=\"fas fa-external-link-alt\"></i>\n <span class=\"action-text\">{{ entityNavigationText }}</span>\n </button>\n }\n </div>\n</div>", styles: [".timeline-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 12px;\n padding-left: 22px; /* Add extra padding to accommodate expand button */\n margin-bottom: 8px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s;\n position: relative;\n}\n\n.timeline-item:hover {\n border-color: var(--mj-border-strong);\n background: var(--mj-bg-surface-sunken);\n transform: translateX(2px);\n}\n\n.timeline-item.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: 0 0 0 1px var(--mj-brand-primary);\n}\n\n/* Expand/Collapse Button */\n.expand-toggle {\n position: absolute;\n left: -34px;\n top: 12px;\n width: 24px;\n height: 24px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s;\n z-index: 1;\n}\n\n.expand-toggle:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.expand-toggle i {\n font-size: 10px;\n color: var(--mj-text-muted);\n}\n\n/* Timeline Marker */\n.timeline-marker {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n position: relative;\n overflow: hidden;\n}\n\n.timeline-marker-logo {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 50%;\n}\n\n.timeline-marker[data-color=\"info\"] {\n background: var(--mj-brand-primary);\n}\n\n.timeline-marker[data-color=\"success\"] {\n background: var(--mj-status-success);\n}\n\n.timeline-marker[data-color=\"error\"] {\n background: var(--mj-status-error);\n}\n\n.timeline-marker[data-color=\"warning\"] {\n background: var(--mj-status-warning);\n}\n\n.timeline-marker[data-color=\"secondary\"] {\n background: var(--mj-text-disabled);\n}\n\n/* Timeline Content */\n.timeline-content {\n flex: 1;\n min-width: 0;\n}\n\n.timeline-header {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n margin-bottom: 4px;\n}\n\n.timeline-header h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.timeline-time {\n font-size: 11px;\n color: var(--mj-text-muted);\n font-family: monospace;\n white-space: nowrap;\n margin-left: 12px;\n}\n\n.timeline-subtitle {\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-bottom: 4px;\n}\n\n.timeline-additional-info {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-bottom: 4px;\n font-style: italic;\n}\n\n.timeline-meta {\n display: flex;\n gap: 12px;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.duration {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.status {\n display: flex;\n align-items: center;\n gap: 4px;\n font-weight: 500;\n}\n\n.status[data-status=\"Running\"] {\n color: var(--mj-brand-primary);\n}\n\n.status[data-status=\"Completed\"] {\n color: var(--mj-status-success);\n}\n\n.status[data-status=\"Failed\"] {\n color: var(--mj-status-error);\n}\n\n.status[data-status=\"Cancelled\"] {\n color: var(--mj-status-warning);\n}\n\n/* Timeline Actions */\n.timeline-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-link {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n font-size: 11px;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s;\n display: flex;\n align-items: center;\n gap: 4px;\n white-space: nowrap;\n}\n\n.btn-link:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.btn-link i {\n font-size: 10px;\n}\n\n.action-text {\n display: none;\n}\n\n.timeline-item:hover .action-text {\n display: inline;\n}\n\n/* Type-specific styling */\n.timeline-item[data-type=\"subrun\"] {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.timeline-item[data-type=\"action\"] {\n border-left: 3px solid var(--mj-status-success);\n}\n\n.timeline-item[data-type=\"prompt\"] {\n border-left: 3px solid var(--mj-brand-primary);\n}"] }]
315
+ args: [{ standalone: false, selector: 'mj-ai-agent-run-step-node', template: "<div class=\"timeline-item\"\n [class.selected]=\"isSelected\"\n [attr.data-status]=\"item.status\"\n [attr.data-type]=\"item.type\"\n [style.margin-left.px]=\"item.level * 24\"\n (click)=\"handleClick()\">\n\n <!-- Expand/Collapse Button for Sub-Agents and Parent Steps -->\n @if (canExpand) {\n <button class=\"expand-toggle\"\n (click)=\"handleExpandToggle($event)\"\n [attr.aria-expanded]=\"item.isExpanded\">\n <i class=\"fas\"\n [class.fa-chevron-right]=\"!item.isExpanded\"\n [class.fa-chevron-down]=\"item.isExpanded\"></i>\n </button>\n }\n\n <!-- Timeline Marker -->\n <div class=\"timeline-marker\" [attr.data-color]=\"item.color\">\n @if (item.logoUrl) {\n <img\n [src]=\"item.logoUrl\"\n [alt]=\"item.title\"\n class=\"timeline-marker-logo\"\n (error)=\"onLogoError($event)\" />\n }\n @if (!item.logoUrl) {\n <i class=\"fas\" [ngClass]=\"item.icon\"></i>\n }\n </div>\n\n <!-- Timeline Content -->\n <div class=\"timeline-content\">\n <div class=\"timeline-header\">\n <h4>{{ item.title }}</h4>\n <span class=\"timeline-time\">{{ item.startTime | date:'h:mm:ss.SSS a' }}</span>\n </div>\n\n <div class=\"timeline-subtitle\">{{ item.subtitle }}</div>\n\n @if (getAdditionalInfo()) {\n <div class=\"timeline-additional-info\">\n {{ getAdditionalInfo() }}\n </div>\n }\n\n @if (SkillInvocations.length > 0) {\n <div class=\"timeline-skills\">\n @for (inv of SkillInvocations; track inv.SkillID) {\n <span class=\"skill-chip\" [attr.data-activation]=\"inv.ActivationType\" [title]=\"GetSkillChipTooltip(inv)\">\n <i class=\"fas fa-wand-magic-sparkles\"></i>\n {{ inv.SkillName }}\n <span class=\"skill-chip-mode\">{{ inv.ActivationType === 'requested' ? 'user' : 'auto' }}</span>\n </span>\n }\n </div>\n }\n\n <div class=\"timeline-meta\">\n @if (item.duration) {\n <span class=\"duration\">\n <i class=\"fas fa-clock\"></i> {{ item.duration }}\n </span>\n }\n <span class=\"status\" [attr.data-status]=\"item.status\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon(item.status)\"></i>\n {{ item.status }}\n </span>\n </div>\n </div>\n\n <!-- Timeline Actions -->\n <div class=\"timeline-actions\">\n @if (canNavigateToEntity) {\n <button class=\"btn-link\"\n (click)=\"navigateToRecord($event)\"\n [title]=\"entityNavigationText\">\n <i class=\"fas fa-external-link-alt\"></i>\n <span class=\"action-text\">{{ entityNavigationText }}</span>\n </button>\n }\n </div>\n</div>", styles: [".timeline-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 12px;\n padding-left: 22px; /* Add extra padding to accommodate expand button */\n margin-bottom: 8px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s;\n position: relative;\n}\n\n.timeline-item:hover {\n border-color: var(--mj-border-strong);\n background: var(--mj-bg-surface-sunken);\n transform: translateX(2px);\n}\n\n.timeline-item.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: 0 0 0 1px var(--mj-brand-primary);\n}\n\n/* Expand/Collapse Button */\n.expand-toggle {\n position: absolute;\n left: -34px;\n top: 12px;\n width: 24px;\n height: 24px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s;\n z-index: 1;\n}\n\n.expand-toggle:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.expand-toggle i {\n font-size: 10px;\n color: var(--mj-text-muted);\n}\n\n/* Timeline Marker */\n.timeline-marker {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n position: relative;\n overflow: hidden;\n}\n\n.timeline-marker-logo {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 50%;\n}\n\n.timeline-marker[data-color=\"info\"] {\n background: var(--mj-brand-primary);\n}\n\n.timeline-marker[data-color=\"success\"] {\n background: var(--mj-status-success);\n}\n\n.timeline-marker[data-color=\"error\"] {\n background: var(--mj-status-error);\n}\n\n.timeline-marker[data-color=\"warning\"] {\n background: var(--mj-status-warning);\n}\n\n.timeline-marker[data-color=\"secondary\"] {\n background: var(--mj-text-disabled);\n}\n\n/* Timeline Content */\n.timeline-content {\n flex: 1;\n min-width: 0;\n}\n\n.timeline-header {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n margin-bottom: 4px;\n}\n\n.timeline-header h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.timeline-time {\n font-size: 11px;\n color: var(--mj-text-muted);\n font-family: monospace;\n white-space: nowrap;\n margin-left: 12px;\n}\n\n.timeline-subtitle {\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-bottom: 4px;\n}\n\n.timeline-additional-info {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-bottom: 4px;\n font-style: italic;\n}\n\n.timeline-meta {\n display: flex;\n gap: 12px;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.duration {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.status {\n display: flex;\n align-items: center;\n gap: 4px;\n font-weight: 500;\n}\n\n.status[data-status=\"Running\"] {\n color: var(--mj-brand-primary);\n}\n\n.status[data-status=\"Completed\"] {\n color: var(--mj-status-success);\n}\n\n.status[data-status=\"Failed\"] {\n color: var(--mj-status-error);\n}\n\n.status[data-status=\"Cancelled\"] {\n color: var(--mj-status-warning);\n}\n\n/* Timeline Actions */\n.timeline-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.btn-link {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n font-size: 11px;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s;\n display: flex;\n align-items: center;\n gap: 4px;\n white-space: nowrap;\n}\n\n.btn-link:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.btn-link i {\n font-size: 10px;\n}\n\n.action-text {\n display: none;\n}\n\n.timeline-item:hover .action-text {\n display: inline;\n}\n\n/* Type-specific styling */\n.timeline-item[data-type=\"subrun\"] {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.timeline-item[data-type=\"action\"] {\n border-left: 3px solid var(--mj-status-success);\n}\n\n.timeline-item[data-type=\"prompt\"] {\n border-left: 3px solid var(--mj-brand-primary);\n}\n/* ============================================================\n Skill observability \u2014 badges on steps touched by skills\n ============================================================ */\n.timeline-skills {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 6px;\n}\n\n.skill-chip {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 2px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n}\n\n/* Agent self-activation gets a warning accent \u2014 it expanded its own tool surface */\n.skill-chip[data-activation=\"auto\"] {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text);\n border-color: color-mix(in srgb, var(--mj-status-warning) 30%, transparent);\n}\n\n.skill-chip-mode {\n font-size: 9px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n opacity: 0.75;\n padding-left: 4px;\n border-left: 1px solid color-mix(in srgb, currentColor 30%, transparent);\n}\n"] }]
262
316
  }], null, { item: [{
263
317
  type: Input
264
318
  }], isSelected: [{
@@ -270,5 +324,5 @@ export class AIAgentRunStepNodeComponent {
270
324
  }], navigateToEntity: [{
271
325
  type: Output
272
326
  }] }); })();
273
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIAgentRunStepNodeComponent, { className: "AIAgentRunStepNodeComponent", filePath: "src/lib/custom/ai-agent-run/ai-agent-run-step-node.component.ts", lineNumber: 10 }); })();
327
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIAgentRunStepNodeComponent, { className: "AIAgentRunStepNodeComponent", filePath: "src/lib/custom/ai-agent-run/ai-agent-run-step-node.component.ts", lineNumber: 11 }); })();
274
328
  //# sourceMappingURL=ai-agent-run-step-node.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai-agent-run-step-node.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-step-node.component.ts","../../../../src/lib/custom/ai-agent-run/ai-agent-run-step-node.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { TimelineItem } from './ai-agent-run-timeline.component';\n\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-run-step-node',\n templateUrl: './ai-agent-run-step-node.component.html',\n styleUrls: ['./ai-agent-run-step-node.component.css']\n})\nexport class AIAgentRunStepNodeComponent {\n @Input() item!: TimelineItem;\n @Input() isSelected = false;\n @Output() itemClick = new EventEmitter<TimelineItem>();\n @Output() expandToggle = new EventEmitter<Event>();\n @Output() navigateToEntity = new EventEmitter<{ entityName: string; recordId: string }>();\n\n get hasChildren(): boolean {\n return !!this.item.children && this.item.children.length > 0;\n }\n\n get isSubAgent(): boolean {\n return this.item.type === 'subrun' || (this.item.type === 'step' && this.item.data?.StepType === 'Sub-Agent');\n }\n\n get isParentStep(): boolean {\n // Check if this step has children via ParentID relationships (non-Sub-Agent hierarchy)\n return this.item.type === 'step' &&\n this.item.data?.StepType !== 'Sub-Agent' &&\n this.hasChildren;\n }\n\n get canExpand(): boolean {\n // Can expand if it's a sub-agent OR if it's a parent step with children\n return this.isSubAgent || this.isParentStep;\n }\n\n get canNavigateToEntity(): boolean {\n // For steps, check if it's a type that has a target and if TargetLogID exists\n if (this.item.type === 'step' && this.item.data) {\n const stepType = this.item.data.StepType;\n return (stepType === 'Actions' || stepType === 'Prompt' || stepType === 'Sub-Agent') \n && !!this.item.data.TargetLogID;\n }\n return false;\n }\n\n get entityNavigationText(): string {\n // For step types, check the StepType\n if (this.item.type === 'step' && this.item.data) {\n const stepType = this.item.data.StepType;\n switch (stepType.trim().toLowerCase()) {\n case 'actions':\n return 'View Action Log';\n case 'prompt':\n return 'View Prompt Run';\n case 'sub-agent':\n return 'View Agent Run';\n default:\n return 'View Details';\n }\n }\n\n return \"\";\n }\n\n getStatusIcon(status: string): string {\n const iconMap: Record<string, string> = {\n 'Running': 'fa-circle-notch fa-spin',\n 'Completed': 'fa-check-circle',\n 'Failed': 'fa-times-circle',\n 'Cancelled': 'fa-ban',\n 'Paused': 'fa-pause-circle'\n };\n return iconMap[status] || 'fa-question-circle';\n }\n\n handleClick() {\n this.itemClick.emit(this.item);\n }\n\n handleExpandToggle(event: Event) {\n if (this.canExpand) {\n this.expandToggle.emit(event);\n }\n }\n\n navigateToRecord(event: Event) {\n event.stopPropagation();\n \n if (!this.canNavigateToEntity) return;\n\n let entityName = '';\n let recordId = '';\n\n // For step types, use TargetLogID and determine entity based on StepType\n if (this.item.type === 'step' && this.item.data) {\n recordId = this.item.data.TargetLogID;\n const stepType = this.item.data.StepType;\n \n switch (stepType.trim().toLowerCase()) {\n case 'actions':\n entityName = 'MJ: Action Execution Logs';\n break;\n case 'prompt':\n entityName = 'MJ: AI Prompt Runs';\n break;\n case 'sub-agent':\n entityName = 'MJ: AI Agent Runs';\n break;\n }\n } else {\n // For direct types, use the item ID\n recordId = this.item.id;\n \n switch (this.item.type.trim().toLowerCase()) {\n case 'actions':\n entityName = 'MJ: Action Execution Logs';\n break;\n case 'prompt':\n entityName = 'MJ: AI Prompt Runs';\n break;\n case 'sub-agent':\n entityName = 'MJ: AI Agent Runs';\n break;\n }\n }\n\n if (entityName && recordId) {\n this.navigateToEntity.emit({ entityName, recordId });\n }\n }\n\n getAdditionalInfo(): string {\n if (this.item.type === 'step' && this.item.data) {\n const step = this.item.data;\n const parts = [];\n\n if (step.TargetActionName) {\n parts.push(`Action: ${step.TargetActionName}`);\n }\n if (step.Error) {\n parts.push('Error occurred');\n }\n\n return parts.join(' • ');\n }\n\n if (this.item.type === 'action' && this.item.data) {\n const log = this.item.data;\n if (log.Message) {\n return log.Message.substring(0, 100) + (log.Message.length > 100 ? '...' : '');\n }\n }\n\n return '';\n }\n\n onLogoError(event: Event): void {\n // Hide the broken image and show the icon instead by clearing logoUrl\n const imgElement = event.target as HTMLImageElement;\n imgElement.style.display = 'none';\n this.item.logoUrl = undefined;\n }\n}","<div class=\"timeline-item\"\n [class.selected]=\"isSelected\"\n [attr.data-status]=\"item.status\"\n [attr.data-type]=\"item.type\"\n [style.margin-left.px]=\"item.level * 24\"\n (click)=\"handleClick()\">\n\n <!-- Expand/Collapse Button for Sub-Agents and Parent Steps -->\n @if (canExpand) {\n <button class=\"expand-toggle\"\n (click)=\"handleExpandToggle($event)\"\n [attr.aria-expanded]=\"item.isExpanded\">\n <i class=\"fas\"\n [class.fa-chevron-right]=\"!item.isExpanded\"\n [class.fa-chevron-down]=\"item.isExpanded\"></i>\n </button>\n }\n\n <!-- Timeline Marker -->\n <div class=\"timeline-marker\" [attr.data-color]=\"item.color\">\n @if (item.logoUrl) {\n <img\n [src]=\"item.logoUrl\"\n [alt]=\"item.title\"\n class=\"timeline-marker-logo\"\n (error)=\"onLogoError($event)\" />\n }\n @if (!item.logoUrl) {\n <i class=\"fas\" [ngClass]=\"item.icon\"></i>\n }\n </div>\n\n <!-- Timeline Content -->\n <div class=\"timeline-content\">\n <div class=\"timeline-header\">\n <h4>{{ item.title }}</h4>\n <span class=\"timeline-time\">{{ item.startTime | date:'h:mm:ss.SSS a' }}</span>\n </div>\n\n <div class=\"timeline-subtitle\">{{ item.subtitle }}</div>\n\n @if (getAdditionalInfo()) {\n <div class=\"timeline-additional-info\">\n {{ getAdditionalInfo() }}\n </div>\n }\n\n <div class=\"timeline-meta\">\n @if (item.duration) {\n <span class=\"duration\">\n <i class=\"fas fa-clock\"></i> {{ item.duration }}\n </span>\n }\n <span class=\"status\" [attr.data-status]=\"item.status\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon(item.status)\"></i>\n {{ item.status }}\n </span>\n </div>\n </div>\n\n <!-- Timeline Actions -->\n <div class=\"timeline-actions\">\n @if (canNavigateToEntity) {\n <button class=\"btn-link\"\n (click)=\"navigateToRecord($event)\"\n [title]=\"entityNavigationText\">\n <i class=\"fas fa-external-link-alt\"></i>\n <span class=\"action-text\">{{ entityNavigationText }}</span>\n </button>\n }\n </div>\n</div>"]}
1
+ {"version":3,"file":"ai-agent-run-step-node.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-step-node.component.ts","../../../../src/lib/custom/ai-agent-run/ai-agent-run-step-node.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;;;;;;ICSnE,kCAEyC;IADvC,qMAAS,iCAA0B,KAAC;IAEpC,wBAE8C;IAChD,iBAAS;;;;IAFL,cAA2C;IAC7C,AADE,2DAA2C,2CACJ;;;;IAOzC,+BAIkC;IAAhC,kMAAS,0BAAmB,KAAC;IAJ/B,iBAIkC;;;IAFhC,AADA,2DAAoB,0BACF;;;IAKpB,uBAAyC;;;IAA1B,0CAAqB;;;IAcpC,8BAAsC;IACpC,YACF;IAAA,iBAAM;;;IADJ,cACF;IADE,2DACF;;;IAMI,gCAAwG;IACtG,wBAA0C;IAC1C,YACA;IAAA,gCAA8B;IAAA,YAA0D;IAC1F,AAD0F,iBAAO,EAC1F;;;;IAJ8D,0DAAkC;;IAErG,eACA;IADA,iDACA;IAA8B,eAA0D;IAA1D,6EAA0D;;;IAL9F,+BAA6B;IAC3B,+GAMC;IACH,iBAAM;;;IAPJ,cAMC;IAND,sCAMC;;;IAMD,gCAAuB;IACrB,wBAA4B;IAAC,YAC/B;IAAA,iBAAO;;;IADwB,eAC/B;IAD+B,qDAC/B;;;;IAYF,kCAEiC;IAD/B,sMAAS,+BAAwB,KAAC;IAElC,wBAAwC;IACxC,gCAA0B;IAAA,YAA0B;IACtD,AADsD,iBAAO,EACpD;;;IAHP,mDAA8B;IAEJ,eAA0B;IAA1B,iDAA0B;;ADrE5D,MAAM,OAAO,2BAA2B;IANxC;QAQW,eAAU,GAAG,KAAK,CAAC;QAClB,cAAS,GAAG,IAAI,YAAY,EAAgB,CAAC;QAC7C,iBAAY,GAAG,IAAI,YAAY,EAAS,CAAC;QACzC,qBAAgB,GAAG,IAAI,YAAY,EAA4C,CAAC;KA6K3F;IA3KC,IAAI,WAAW;QACb,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,KAAK,WAAW,CAAC,CAAC;IAChH,CAAC;IAED,IAAI,YAAY;QACd,uFAAuF;QACvF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM;YACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,KAAK,WAAW;YACxC,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAI,SAAS;QACX,wEAAwE;QACxE,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,CAAC;IAC9C,CAAC;IAED,IAAI,mBAAmB;QACrB,8EAA8E;QAC9E,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;YACzC,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,WAAW,CAAC;mBAC/E,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACpC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,oBAAoB;QACtB,qCAAqC;QACrC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;YACzC,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;gBACtC,KAAK,SAAS;oBACZ,OAAO,iBAAiB,CAAC;gBAC3B,KAAK,QAAQ;oBACX,OAAO,iBAAiB,CAAC;gBAC3B,KAAK,WAAW;oBACd,OAAO,gBAAgB,CAAC;gBAC1B;oBACE,OAAO,cAAc,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,aAAa,CAAC,MAAc;QAC1B,MAAM,OAAO,GAA2B;YACtC,SAAS,EAAE,yBAAyB;YACpC,WAAW,EAAE,iBAAiB;YAC9B,QAAQ,EAAE,iBAAiB;YAC3B,WAAW,EAAE,QAAQ;YACrB,QAAQ,EAAE,iBAAiB;SAC5B,CAAC;QACF,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,oBAAoB,CAAC;IACjD,CAAC;IAED,WAAW;QACT,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,kBAAkB,CAAC,KAAY;QAC7B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,gBAAgB,CAAC,KAAY;QAC3B,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,IAAI,CAAC,IAAI,CAAC,mBAAmB;YAAE,OAAO;QAEtC,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,QAAQ,GAAG,EAAE,CAAC;QAElB,yEAAyE;QACzE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChD,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;YACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;YAEzC,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;gBACtC,KAAK,SAAS;oBACZ,UAAU,GAAG,2BAA2B,CAAC;oBACzC,MAAM;gBACR,KAAK,QAAQ;oBACX,UAAU,GAAG,oBAAoB,CAAC;oBAClC,MAAM;gBACR,KAAK,WAAW;oBACd,UAAU,GAAG,mBAAmB,CAAC;oBACjC,MAAM;YACV,CAAC;QACH,CAAC;aAAM,CAAC;YACN,oCAAoC;YACpC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAExB,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC5C,KAAK,SAAS;oBACZ,UAAU,GAAG,2BAA2B,CAAC;oBACzC,MAAM;gBACR,KAAK,QAAQ;oBACX,UAAU,GAAG,oBAAoB,CAAC;oBAClC,MAAM;gBACR,KAAK,WAAW;oBACd,UAAU,GAAG,mBAAmB,CAAC;oBACjC,MAAM;YACV,CAAC;QACH,CAAC;QAED,IAAI,UAAU,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,IAAI,gBAAgB;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACtE,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC/D,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,0EAA0E;IACnE,mBAAmB,CAAC,GAAgD;QACzE,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc,KAAK,WAAW,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC,6BAA6B,CAAC;QAC1H,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,OAAO,GAAG,GAAG,CAAC,SAAS,KAAK,GAAG,GAAG,MAAM,EAAE,CAAC;IAC7C,CAAC;IAED,iBAAiB;QACf,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5B,MAAM,KAAK,GAAG,EAAE,CAAC;YAEjB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;YACjD,CAAC;YACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC/B,CAAC;YAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAClD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAC3B,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAChB,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,WAAW,CAAC,KAAY;QACtB,sEAAsE;QACtE,MAAM,UAAU,GAAG,KAAK,CAAC,MAA0B,CAAC;QACpD,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAChC,CAAC;4HAjLU,2BAA2B;oEAA3B,2BAA2B;YCVxC,8BAK0B;YAAxB,qGAAS,iBAAa,IAAC;YAGvB,gGAAiB;YAWjB,8BAA4D;YAC1D,6FAAoB;YAOpB,2FAAqB;YAGvB,iBAAM;YAKF,AADF,AADF,8BAA8B,aACC,SACvB;YAAA,YAAgB;YAAA,iBAAK;YACzB,+BAA4B;YAAA,aAA2C;;YACzE,AADyE,iBAAO,EAC1E;YAEN,+BAA+B;YAAA,aAAmB;YAAA,iBAAM;YAExD,+FAA2B;YAM3B,gGAAmC;YAYnC,gCAA2B;YACzB,iGAAqB;YAKrB,iCAAsD;YACpD,wBAA0D;YAC1D,aACF;YAEJ,AADE,AADE,iBAAO,EACH,EACF;YAGN,gCAA8B;YAC5B,mGAA2B;YAS/B,AADE,iBAAM,EACF;;YA/EJ,wDAAwC;YAHxC,0CAA6B;;YAO7B,cAQC;YARD,wCAQC;YAG4B,cAA8B;;YACzD,cAMC;YAND,2CAMC;YACD,cAEC;YAFD,4CAEC;YAMK,eAAgB;YAAhB,oCAAgB;YACQ,eAA2C;YAA3C,iFAA2C;YAG1C,eAAmB;YAAnB,uCAAmB;YAElD,cAIC;YAJD,mDAIC;YAED,cAUC;YAVD,2DAUC;YAGC,eAIC;YAJD,6CAIC;YACoB,cAAgC;;YACpC,cAAsC;YAAtC,4DAAsC;YACrD,cACF;YADE,gDACF;YAMF,eAOC;YAPD,mDAOC;;;iFDvEQ,2BAA2B;cANvC,SAAS;6BACI,KAAK,YACP,2BAA2B;;kBAKpC,KAAK;;kBACL,KAAK;;kBACL,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kFALI,2BAA2B","sourcesContent":["import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { MJAIAgentRunStepEntity_AgentSkillInvocation } from '@memberjunction/core-entities';\nimport { TimelineItem } from './ai-agent-run-timeline.component';\n\n@Component({\n standalone: false,\n selector: 'mj-ai-agent-run-step-node',\n templateUrl: './ai-agent-run-step-node.component.html',\n styleUrls: ['./ai-agent-run-step-node.component.css']\n})\nexport class AIAgentRunStepNodeComponent {\n @Input() item!: TimelineItem;\n @Input() isSelected = false;\n @Output() itemClick = new EventEmitter<TimelineItem>();\n @Output() expandToggle = new EventEmitter<Event>();\n @Output() navigateToEntity = new EventEmitter<{ entityName: string; recordId: string }>();\n\n get hasChildren(): boolean {\n return !!this.item.children && this.item.children.length > 0;\n }\n\n get isSubAgent(): boolean {\n return this.item.type === 'subrun' || (this.item.type === 'step' && this.item.data?.StepType === 'Sub-Agent');\n }\n\n get isParentStep(): boolean {\n // Check if this step has children via ParentID relationships (non-Sub-Agent hierarchy)\n return this.item.type === 'step' &&\n this.item.data?.StepType !== 'Sub-Agent' &&\n this.hasChildren;\n }\n\n get canExpand(): boolean {\n // Can expand if it's a sub-agent OR if it's a parent step with children\n return this.isSubAgent || this.isParentStep;\n }\n\n get canNavigateToEntity(): boolean {\n // For steps, check if it's a type that has a target and if TargetLogID exists\n if (this.item.type === 'step' && this.item.data) {\n const stepType = this.item.data.StepType;\n return (stepType === 'Actions' || stepType === 'Prompt' || stepType === 'Sub-Agent') \n && !!this.item.data.TargetLogID;\n }\n return false;\n }\n\n get entityNavigationText(): string {\n // For step types, check the StepType\n if (this.item.type === 'step' && this.item.data) {\n const stepType = this.item.data.StepType;\n switch (stepType.trim().toLowerCase()) {\n case 'actions':\n return 'View Action Log';\n case 'prompt':\n return 'View Prompt Run';\n case 'sub-agent':\n return 'View Agent Run';\n default:\n return 'View Details';\n }\n }\n\n return \"\";\n }\n\n getStatusIcon(status: string): string {\n const iconMap: Record<string, string> = {\n 'Running': 'fa-circle-notch fa-spin',\n 'Completed': 'fa-check-circle',\n 'Failed': 'fa-times-circle',\n 'Cancelled': 'fa-ban',\n 'Paused': 'fa-pause-circle'\n };\n return iconMap[status] || 'fa-question-circle';\n }\n\n handleClick() {\n this.itemClick.emit(this.item);\n }\n\n handleExpandToggle(event: Event) {\n if (this.canExpand) {\n this.expandToggle.emit(event);\n }\n }\n\n navigateToRecord(event: Event) {\n event.stopPropagation();\n \n if (!this.canNavigateToEntity) return;\n\n let entityName = '';\n let recordId = '';\n\n // For step types, use TargetLogID and determine entity based on StepType\n if (this.item.type === 'step' && this.item.data) {\n recordId = this.item.data.TargetLogID;\n const stepType = this.item.data.StepType;\n \n switch (stepType.trim().toLowerCase()) {\n case 'actions':\n entityName = 'MJ: Action Execution Logs';\n break;\n case 'prompt':\n entityName = 'MJ: AI Prompt Runs';\n break;\n case 'sub-agent':\n entityName = 'MJ: AI Agent Runs';\n break;\n }\n } else {\n // For direct types, use the item ID\n recordId = this.item.id;\n \n switch (this.item.type.trim().toLowerCase()) {\n case 'actions':\n entityName = 'MJ: Action Execution Logs';\n break;\n case 'prompt':\n entityName = 'MJ: AI Prompt Runs';\n break;\n case 'sub-agent':\n entityName = 'MJ: AI Agent Runs';\n break;\n }\n }\n\n if (entityName && recordId) {\n this.navigateToEntity.emit({ entityName, recordId });\n }\n }\n\n /**\n * Skill-invocation records associated with this step (parsed from `AIAgentRunStep.Skills`).\n * Non-empty on Skill steps (the activation performed), Prompt steps (skills in effect for\n * the turn), and Actions/Sub-Agent steps whose tool was granted by a skill rather than a\n * native agent grant.\n */\n get SkillInvocations(): MJAIAgentRunStepEntity_AgentSkillInvocation[] {\n const raw = this.item.type === 'step' ? this.item.data?.Skills : null;\n if (!raw) return [];\n try {\n const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n\n /** Tooltip summarizing an invocation's provenance for the badge hover. */\n public GetSkillChipTooltip(inv: MJAIAgentRunStepEntity_AgentSkillInvocation): string {\n const who = inv.ActivationType === 'requested' ? 'requested by the user (/skill mention)' : 'self-activated by the agent';\n const reason = inv.Reason ? ` — ${inv.Reason}` : '';\n return `${inv.SkillName}: ${who}${reason}`;\n }\n\n getAdditionalInfo(): string {\n if (this.item.type === 'step' && this.item.data) {\n const step = this.item.data;\n const parts = [];\n\n if (step.TargetActionName) {\n parts.push(`Action: ${step.TargetActionName}`);\n }\n if (step.Error) {\n parts.push('Error occurred');\n }\n\n return parts.join(' • ');\n }\n\n if (this.item.type === 'action' && this.item.data) {\n const log = this.item.data;\n if (log.Message) {\n return log.Message.substring(0, 100) + (log.Message.length > 100 ? '...' : '');\n }\n }\n\n return '';\n }\n\n onLogoError(event: Event): void {\n // Hide the broken image and show the icon instead by clearing logoUrl\n const imgElement = event.target as HTMLImageElement;\n imgElement.style.display = 'none';\n this.item.logoUrl = undefined;\n }\n}","<div class=\"timeline-item\"\n [class.selected]=\"isSelected\"\n [attr.data-status]=\"item.status\"\n [attr.data-type]=\"item.type\"\n [style.margin-left.px]=\"item.level * 24\"\n (click)=\"handleClick()\">\n\n <!-- Expand/Collapse Button for Sub-Agents and Parent Steps -->\n @if (canExpand) {\n <button class=\"expand-toggle\"\n (click)=\"handleExpandToggle($event)\"\n [attr.aria-expanded]=\"item.isExpanded\">\n <i class=\"fas\"\n [class.fa-chevron-right]=\"!item.isExpanded\"\n [class.fa-chevron-down]=\"item.isExpanded\"></i>\n </button>\n }\n\n <!-- Timeline Marker -->\n <div class=\"timeline-marker\" [attr.data-color]=\"item.color\">\n @if (item.logoUrl) {\n <img\n [src]=\"item.logoUrl\"\n [alt]=\"item.title\"\n class=\"timeline-marker-logo\"\n (error)=\"onLogoError($event)\" />\n }\n @if (!item.logoUrl) {\n <i class=\"fas\" [ngClass]=\"item.icon\"></i>\n }\n </div>\n\n <!-- Timeline Content -->\n <div class=\"timeline-content\">\n <div class=\"timeline-header\">\n <h4>{{ item.title }}</h4>\n <span class=\"timeline-time\">{{ item.startTime | date:'h:mm:ss.SSS a' }}</span>\n </div>\n\n <div class=\"timeline-subtitle\">{{ item.subtitle }}</div>\n\n @if (getAdditionalInfo()) {\n <div class=\"timeline-additional-info\">\n {{ getAdditionalInfo() }}\n </div>\n }\n\n @if (SkillInvocations.length > 0) {\n <div class=\"timeline-skills\">\n @for (inv of SkillInvocations; track inv.SkillID) {\n <span class=\"skill-chip\" [attr.data-activation]=\"inv.ActivationType\" [title]=\"GetSkillChipTooltip(inv)\">\n <i class=\"fas fa-wand-magic-sparkles\"></i>\n {{ inv.SkillName }}\n <span class=\"skill-chip-mode\">{{ inv.ActivationType === 'requested' ? 'user' : 'auto' }}</span>\n </span>\n }\n </div>\n }\n\n <div class=\"timeline-meta\">\n @if (item.duration) {\n <span class=\"duration\">\n <i class=\"fas fa-clock\"></i> {{ item.duration }}\n </span>\n }\n <span class=\"status\" [attr.data-status]=\"item.status\">\n <i class=\"fas\" [ngClass]=\"getStatusIcon(item.status)\"></i>\n {{ item.status }}\n </span>\n </div>\n </div>\n\n <!-- Timeline Actions -->\n <div class=\"timeline-actions\">\n @if (canNavigateToEntity) {\n <button class=\"btn-link\"\n (click)=\"navigateToRecord($event)\"\n [title]=\"entityNavigationText\">\n <i class=\"fas fa-external-link-alt\"></i>\n <span class=\"action-text\">{{ entityNavigationText }}</span>\n </button>\n }\n </div>\n</div>"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ai-agent-run-timeline.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-timeline.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-agent-run-timeline.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-timeline.component.ts"],"names":[],"mappings":"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"}
@@ -296,7 +296,9 @@ export class AIAgentRunTimelineComponent extends BaseAngularComponent {
296
296
  'Actions': 'fa-wrench',
297
297
  'Validation': 'fa-square-check',
298
298
  'ForEach': 'fa-repeat',
299
- 'While': 'fa-rotate'
299
+ 'While': 'fa-rotate',
300
+ 'Skill': 'fa-wand-magic-sparkles',
301
+ 'Plan': 'fa-clipboard-check'
300
302
  };
301
303
  return iconMap[stepType] || 'fa-circle';
302
304
  }