@memberjunction/ng-dashboards 6.1.1 → 6.1.3

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.
@@ -1516,7 +1516,7 @@ let WorkflowRunsResourceComponent = class WorkflowRunsResourceComponent extends
1516
1516
  // The edges too, for the what-if preview — same rows the run view reads for the canvas.
1517
1517
  const deps = await RunView.FromMetadataProvider(this.ProviderToUse).RunView({
1518
1518
  EntityName: 'MJ: Task Dependencies',
1519
- ExtraFilter: `TaskID IN (SELECT ID FROM __mj.Task WHERE ParentID='${parentTaskID}')`,
1519
+ ExtraFilter: `TaskID IN (SELECT ID FROM [__mj].[vwTasks] WHERE ParentID='${parentTaskID}')`,
1520
1520
  ResultType: 'entity_object',
1521
1521
  BypassCache: true,
1522
1522
  });
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-runs-resource.component.js","sourceRoot":"","sources":["../../../src/Workflows/components/workflow-runs-resource.component.ts","../../../src/Workflows/components/workflow-runs-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, HostListener, OnDestroy, ViewChild } from '@angular/core';\nimport { CompositeKey, RunView } from '@memberjunction/core';\nimport { MJTaskDependencyEntity, MJTaskEntity, ResourceData, UserInfoEngine } from '@memberjunction/core-entities';\nimport { ComputeTasksToBlock, type TaskGraphNode, type TaskGraphEdge } from '@memberjunction/ai-core-plus';\nimport { ParseJSONOptions, ParseJSONRecursive, RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { BaseDashboard, BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { TaskGraphDebuggerComponent, type TaskGraphRunFrame } from '@memberjunction/ng-task-graph-editor';\nimport { SortWorkflowRuns, type WorkflowRunSortColumn } from './workflow-run-sorting';\nimport { WorkflowRunLayout } from './workflow-run-layout';\nimport {\n EmptyDebugState,\n ParseWorkflowRunParentBag,\n TryParseJsonObject,\n type WorkflowRunDebugState,\n type WorkflowRunInvocation,\n type WorkflowStall,\n} from './workflow-run-debug-state';\n\n/** Below this the detail pane cannot hold a canvas AND a JSON pane side by side. */\nconst STACK_INNER_BELOW_PX = 1100;\n\n/**\n * How the JSON panes unpack nested JSON.\n *\n * A task's `Configuration` and payloads are JSON stored inside a string column, so without this the\n * viewer shows one very long escaped line — technically the truth, and unreadable. Matches what the\n * agent-run detail panel does, so the same record reads the same way in both places.\n */\nconst JSON_PARSE_OPTIONS: ParseJSONOptions = { extractInlineJson: true, maxDepth: 100, debug: false };\n\n/** A settled-or-running graph, projected for the list. */\nexport type WorkflowRunRow = {\n ID: string;\n Name: string;\n Status: string;\n StartedAt: Date | null;\n CompletedAt: Date | null;\n /** Human-readable elapsed/duration — coarse on purpose, this is a scan column. */\n Duration: string;\n AgentRunID: string | null;\n};\n\n/** The statuses a run can be filtered to. `all` is not a status; it clears the filter. */\nexport type WorkflowRunStatusFilter = 'all' | 'Running' | 'Complete' | 'Failed' | 'Cancelled';\n\nconst STATUS_FILTERS: readonly WorkflowRunStatusFilter[] = ['all', 'Running', 'Complete', 'Failed', 'Cancelled'];\n\n// The sort column type and the ordering itself live in `workflow-run-sorting`, which is pure and\n// therefore testable without standing up the component. Re-exported so existing importers of this\n// module keep resolving.\nexport type { WorkflowRunSortColumn } from './workflow-run-sorting';\n\n/** What the detail panel is showing for the selected run. */\nexport type WorkflowRunDetailTab = 'graph' | 'json';\n\n/**\n * One step of a run, for the detail panel's step list and JSON view.\n *\n * The whole entity is kept, not a projection: the JSON view exists precisely so someone can read\n * everything the row holds, and a projection would decide for them what is worth seeing.\n */\nexport type WorkflowRunStep = {\n ID: string;\n Name: string;\n Status: string;\n StepType: string | null;\n StartedAt: Date | null;\n CompletedAt: Date | null;\n /** Every column of the row, for the JSON pane. */\n Record: Record<string, unknown>;\n};\n\n/**\n * The Workflows app's **Runs** surface — every task graph that has run, whoever started it.\n *\n * **This is why the app came back.** A workflow's definition already had a home (the AI Agents form,\n * which is the one editor); its *runs* did not. They were reachable only by opening the agent that\n * happened to submit them, which fails for the case that matters most — a graph outlives the run\n * that submitted it, so a scheduled or MCP-triggered workflow had no owning conversation to find it\n * from. This lists them by the thing a person actually remembers: what ran, when, and how it ended.\n *\n * Reads parent Task rows because a parent row **is** a graph — one row per run, no joining required\n * to count them, and the same unit the promotion picker offers.\n */\n@Component({\n standalone: false,\n selector: 'mj-workflow-runs',\n templateUrl: './workflow-runs-resource.component.html',\n styleUrls: ['./workflow-runs-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n// Registered against BaseResourceComponent, NOT BaseDashboard — while still extending BaseDashboard\n// for its lifecycle (initDashboard/loadData and the automatic NotifyLoadComplete).\n//\n// The registration key is what the shell looks the component up by, and a nav item with\n// `ResourceType: \"Custom\"` is resolved through BaseResourceComponent. Registered under BaseDashboard\n// this class was never found: the Runs tab rendered \"No component is registered for driver class\n// WorkflowRunsResource\", which reads as a packaging problem and is really a one-word mismatch.\n// Its sibling WorkflowsResourceComponent had it right, which is what made the difference visible.\n@RegisterClass(BaseResourceComponent, 'WorkflowRunsResource')\nexport class WorkflowRunsResourceComponent extends BaseDashboard implements AfterViewInit, OnDestroy {\n public IsLoading = false;\n public LoadError: string | null = null;\n\n public Runs: WorkflowRunRow[] = [];\n public StatusFilter: WorkflowRunStatusFilter = 'all';\n public SearchText = '';\n\n /** The run whose graph is showing in the detail panel, or null. */\n public SelectedRunID: string | null = null;\n\n public readonly StatusFilters = STATUS_FILTERS;\n\n /**\n * Ordering. Newest-first by default, because \"what just happened\" is the question a run list is\n * usually opened to answer.\n */\n public SortColumn: WorkflowRunSortColumn = 'StartedAt';\n public SortDescending = true;\n\n /** What the detail panel is showing. */\n public DetailTab: WorkflowRunDetailTab = 'graph';\n\n /** The selected run's steps, loaded when a run is opened. */\n public SelectedSteps: WorkflowRunStep[] = [];\n public StepsLoading = false;\n\n /** The step whose JSON is showing, or null when none is selected. */\n public SelectedStepID: string | null = null;\n\n /**\n * Pane sizes, panel visibility and the legend toggle — the rules live in `workflow-run-layout`,\n * which is pure and therefore testable without standing up Angular.\n *\n * Preferences go through `UserInfoEngine` (`MJ: User Settings`), never `localStorage`: a pane\n * width that vanishes when someone opens a different browser is exactly the kind of preference\n * people notice when it disappears. Reads are a synchronous cache hit; writes are debounced,\n * because dragging a splitter fires continuously.\n */\n public readonly Layout = new WorkflowRunLayout({\n Get: (key) => UserInfoEngine.Instance.GetSetting(key),\n Set: (key, value) => UserInfoEngine.Instance.SetSettingDebounced(key, value),\n });\n\n /** Stacked rather than side-by-side when the detail pane is too narrow for both. */\n public InnerSplitDirection: 'horizontal' | 'vertical' = 'horizontal';\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Workflow Runs';\n }\n\n initDashboard(): void {\n this.Layout.Restore();\n this.applyViewportRules();\n }\n\n ngAfterViewInit(): void {\n this.publishAgentContext();\n }\n\n /** Re-evaluates the stacking rule; the detail pane's width follows the window's. */\n @HostListener('window:resize')\n public onViewportResized(): void {\n const before = this.InnerSplitDirection;\n this.applyViewportRules();\n if (before !== this.InnerSplitDirection) this.cdr.markForCheck();\n }\n\n private applyViewportRules(): void {\n // Three columns on a laptop gives each about 400px and the canvas stops being usable, so the\n // inner pair stacks instead. Mirrors the outer split's existing breakpoint rather than\n // inventing a second responsive scheme.\n this.InnerSplitDirection = window.innerWidth < STACK_INNER_BELOW_PX ? 'vertical' : 'horizontal';\n }\n\n public OnSplitDragEnd(sizes: readonly (number | '*')[]): void {\n this.Layout.OnSplitDragEnd(sizes);\n }\n\n public OnStepSplitDragEnd(sizes: readonly (number | '*')[]): void {\n this.Layout.OnStepSplitDragEnd(sizes);\n }\n\n public ToggleStepPanel(): void {\n this.Layout.ToggleStepPanel();\n this.cdr.markForCheck();\n }\n\n /**\n * The legend was toggled on the canvas toolbar — remember it.\n *\n * Driven from the toolbar rather than a button of our own: the canvas already has a legend\n * control in the place people look for one, and adding a second in the header would be two\n * controls for one setting, free to disagree.\n */\n public OnLegendToggled(show: boolean): void {\n this.Layout.SetLegendVisible(show);\n this.cdr.markForCheck();\n }\n\n /** The rows after the active filter and search, in the chosen order — what the template renders. */\n public get VisibleRuns(): WorkflowRunRow[] {\n const wanted = this.SearchText.trim().toLowerCase();\n const filtered = this.Runs.filter((r) => {\n if (this.StatusFilter !== 'all' && r.Status !== this.StatusFilter) return false;\n return !wanted || r.Name.toLowerCase().includes(wanted);\n });\n return this.sortRuns(filtered);\n }\n\n /** Ordering — see `workflow-run-sorting` for the rules and why unset always sorts last. */\n private sortRuns(rows: WorkflowRunRow[]): WorkflowRunRow[] {\n return SortWorkflowRuns(rows, this.SortColumn, this.SortDescending);\n }\n\n /**\n * Sorts by a column, flipping direction when it is already the active one.\n *\n * Time columns start descending (newest first) and text columns ascending (A→Z), because that is\n * what each is normally wanted in — a first click that produced the least useful order would\n * just mean everyone clicks twice.\n */\n public OnSort(column: WorkflowRunSortColumn): void {\n if (this.SortColumn === column) {\n this.SortDescending = !this.SortDescending;\n } else {\n this.SortColumn = column;\n this.SortDescending = column === 'StartedAt' || column === 'CompletedAt' || column === 'Duration';\n }\n this.publishAgentContext();\n this.cdr.markForCheck();\n }\n\n /** The sort indicator for a column header: none, ascending, or descending. */\n public SortIcon(column: WorkflowRunSortColumn): string {\n if (this.SortColumn !== column) return 'fa-solid fa-sort';\n return this.SortDescending ? 'fa-solid fa-sort-down' : 'fa-solid fa-sort-up';\n }\n\n public get SelectedRun(): WorkflowRunRow | null {\n return this.Runs.find((r) => UUIDsEqual(r.ID, this.SelectedRunID ?? '')) ?? null;\n }\n\n async loadData(): Promise<void> {\n this.IsLoading = true;\n this.LoadError = null;\n this.cdr.markForCheck();\n try {\n const result = await RunView.FromMetadataProvider(this.ProviderToUse).RunView<MJTaskEntity>({\n EntityName: 'MJ: Tasks',\n // Parent rows only: one row per graph. Without this the list would show every step\n // of every run interleaved, which is a step list, not a run list.\n ExtraFilter: `ParentID IS NULL`,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 200,\n ResultType: 'entity_object',\n });\n\n if (!result.Success) {\n this.LoadError = result.ErrorMessage ?? 'Runs could not be loaded.';\n this.Runs = [];\n return;\n }\n this.Runs = (result.Results ?? []).map((t) => this.toRow(t));\n } catch (e) {\n this.LoadError = e instanceof Error ? e.message : String(e);\n this.Runs = [];\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n private toRow(task: MJTaskEntity): WorkflowRunRow {\n return {\n ID: task.ID,\n Name: task.Name ?? '(unnamed run)',\n Status: task.Status,\n StartedAt: task.StartedAt,\n CompletedAt: task.CompletedAt,\n Duration: this.describeDuration(task.StartedAt, task.CompletedAt),\n AgentRunID: task.AgentRunID,\n };\n }\n\n /**\n * Elapsed time, or how long it has been running.\n *\n * A run with no start has not begun — that is different from a zero-length run, so it says so\n * rather than printing \"0s\" and implying something happened instantly.\n */\n private describeDuration(startedAt: Date | null, completedAt: Date | null): string {\n if (!startedAt) return '—';\n const end = completedAt ?? new Date();\n const seconds = Math.max(0, Math.round((end.getTime() - startedAt.getTime()) / 1000));\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ${seconds % 60}s`;\n return `${Math.floor(minutes / 60)}h ${minutes % 60}m`;\n }\n\n public OnSelectRun(run: WorkflowRunRow): void {\n const closing = UUIDsEqual(this.SelectedRunID ?? '', run.ID);\n this.SelectedRunID = closing ? null : run.ID;\n this.SelectedStepID = null;\n this.SelectedSteps = [];\n this.SelectedDeps = [];\n this.SelectedEdgeID = null;\n this.InspectorMode = 'step';\n this.resetEditors();\n this.detachFrames();\n this.ReplayPercent = null;\n this.GraphSettled = false;\n this.DebugState = EmptyDebugState();\n this.Invocation = {};\n // Frames are owned by <mj-task-graph-debugger>; it re-emits them for stall/engine chrome.\n this.publishAgentContext();\n this.cdr.markForCheck();\n if (!closing) {\n void this.loadSteps(run.ID);\n void this.loadDebugState(run.ID);\n }\n }\n\n // ─── live console: frames ────────────────────────────────────────────────\n //\n // <mj-task-graph-debugger> owns the frame subscription and re-emits each one. This host only\n // listens for stall / engine-tick chrome. Frames are ADVISORY; the widget's row reads remain\n // the truth, reconciled on settlement.\n\n /** The newest frame, bound straight into the run view for sub-second canvas updates. */\n @ViewChild(TaskGraphDebuggerComponent) public GraphDebug: TaskGraphDebuggerComponent | undefined;\n\n public LatestFrame: TaskGraphRunFrame | null = null;\n /** The engine's recent heartbeat ticks (`PassCompleted`), newest last. Bounded. */\n public EngineTicks: TaskGraphRunFrame[] = [];\n /** Everything seen this session for the selected run, newest first. Bounded. */\n public FrameLog: TaskGraphRunFrame[] = [];\n /** Whether the selected run is paused (from `GraphPaused`/`GraphResumed` frames + verbs). */\n public DebugPaused = false;\n /** Children are all terminal — the durable bag can still say paused after the last continue. */\n public GraphSettled = false;\n /** A one-line diagnosis when the engine reports trouble — a lost worker, a held path. */\n public StallNotice: string | null = null;\n /** Structured stall so a held edge can be answered, not just named. */\n public Stall: WorkflowStall | null = null;\n /** Durable debug state from the parent row — frames are advisory, this is the truth. */\n public DebugState: WorkflowRunDebugState = EmptyDebugState();\n /** Invocation `data`/`context` roots from the same parent bag (R3-3). */\n public Invocation: WorkflowRunInvocation = {};\n /** Selected path, when the person clicked an edge rather than a step. */\n public SelectedEdgeID: string | null = null;\n public InspectorMode: 'step' | 'edge' = 'step';\n /** Force-complete confirmation + output editor. */\n public ForceCompleteOpen = false;\n public ForceCompleteJson = '{}';\n public ForceCompleteName = '';\n public ForceCompleteError: string | null = null;\n /** Edit-input editor (Pending → UpdateTaskInput, Failed → RetryTask). */\n public EditInputOpen = false;\n public EditInputJson = '';\n public EditInputError: string | null = null;\n /** True while a control verb round-trips, so the toolbar cannot double-fire. */\n public get ControlBusy(): boolean {\n return this.GraphDebug?.Busy === true;\n }\n /** Replay position for a settled run: 0–100 along its wall-clock span, or null for \"now\". */\n public ReplayPercent: number | null = null;\n\n /** Dependencies of the selected run's steps, for the what-if preview. */\n public SelectedDeps: MJTaskDependencyEntity[] = [];\n\n private static readonly FRAME_LOG_LIMIT = 250;\n private static readonly ENGINE_TICK_LIMIT = 10;\n\n public override ngOnDestroy(): void {\n this.detachFrames();\n super.ngOnDestroy();\n }\n\n private isLiveStatus(status: string): boolean {\n return status === 'In Progress' || status === 'Running' || status === 'Pending';\n }\n\n private detachFrames(): void {\n this.LatestFrame = null;\n this.DebugPaused = false;\n this.StallNotice = null;\n this.Stall = null;\n }\n\n public OnFrame(frame: TaskGraphRunFrame): void {\n this.LatestFrame = frame;\n this.FrameLog = [frame, ...this.FrameLog].slice(0, WorkflowRunsResourceComponent.FRAME_LOG_LIMIT);\n\n switch (frame.kind) {\n case 'PassCompleted':\n this.EngineTicks = [...this.EngineTicks, frame].slice(-WorkflowRunsResourceComponent.ENGINE_TICK_LIMIT);\n break;\n case 'GraphPaused':\n case 'BreakpointHit':\n if (this.GraphSettled) break; // bag can still say paused after the last step\n this.DebugPaused = true;\n if (this.SelectedRunID) void this.loadDebugState(this.SelectedRunID);\n break;\n case 'GraphResumed':\n this.DebugPaused = false;\n if (this.SelectedRunID) void this.loadDebugState(this.SelectedRunID);\n break;\n case 'ClaimChanged':\n if (frame.claimEvent === 'heartbeat-lost') {\n this.setStall({\n kind: 'worker-lost',\n message: `\"${frame.taskName ?? 'A step'}\" lost its worker — the engine will requeue it.`,\n taskName: frame.taskName,\n taskID: frame.taskId,\n });\n } else if (frame.claimEvent === 'reclaimed') {\n this.clearStall();\n }\n break;\n case 'GateDecision':\n if (frame.verdict === 'held') {\n this.setStall({\n kind: 'held',\n message: `\"${frame.taskName ?? 'A step'}\" is waiting on a path that can't be answered.`,\n taskName: frame.taskName,\n taskID: frame.taskId,\n edgeID: frame.edgeId,\n conditionText: frame.conditionText,\n reason: frame.reason,\n });\n }\n break;\n case 'StepRefused':\n this.setStall({\n kind: 'step-refused',\n message: frame.reason ?? 'The step could not start yet; it stays queued.',\n reason: frame.reason,\n });\n break;\n case 'GraphSettled':\n this.markGraphSettled();\n this.clearStall();\n void this.loadData(); // the list row's status/duration just changed\n if (this.SelectedRunID) {\n void this.loadSteps(this.SelectedRunID);\n void this.loadDebugState(this.SelectedRunID);\n }\n break;\n case 'TaskCompleted':\n case 'TaskFailed':\n case 'TaskSkipped':\n case 'TaskBlocked':\n // Keep the step list in agreement with the canvas the frame just updated.\n if (this.SelectedRunID) void this.loadSteps(this.SelectedRunID);\n break;\n }\n this.cdr.markForCheck();\n }\n\n // ─── live console: control verbs ────────────────────────────────────────\n //\n // The drop-in debugger owns RouteOperation. These handlers just call its verbs.\n\n public async OnPauseRun(): Promise<void> {\n await this.GraphDebug?.Pause();\n this.DebugPaused = true;\n this.cdr.markForCheck();\n }\n\n public async OnResumeRun(): Promise<void> {\n await this.GraphDebug?.Resume();\n this.DebugPaused = false;\n this.cdr.markForCheck();\n }\n\n public async OnStepRun(target: 'one' | 'wave'): Promise<void> {\n await this.GraphDebug?.Step(target);\n }\n\n public async OnCancelRun(): Promise<void> {\n await this.GraphDebug?.Cancel();\n await this.loadData();\n }\n\n public async OnSkipStep(step: WorkflowRunStep): Promise<void> {\n await this.GraphDebug?.SkipTask(step.ID);\n if (this.SelectedRunID) void this.loadSteps(this.SelectedRunID);\n }\n\n public async OnRetryStep(step: WorkflowRunStep): Promise<void> {\n await this.GraphDebug?.RetryTask(step.ID);\n if (this.SelectedRunID) void this.loadSteps(this.SelectedRunID);\n }\n\n public async OnBreakpointToggled(event: { TaskID: string; Enabled: boolean }): Promise<void> {\n await this.GraphDebug?.ToggleBreakpoint(event.TaskID, event.Enabled);\n }\n\n public async OnRemoveBreakpoint(taskID: string): Promise<void> {\n await this.OnBreakpointToggled({ TaskID: taskID, Enabled: false });\n }\n\n public OnSelectBreakpoint(taskID: string): void {\n const step = this.SelectedSteps.find((s) => UUIDsEqual(s.ID, taskID));\n if (step) this.OnSelectStep(step);\n else {\n this.SelectedStepID = taskID;\n this.InspectorMode = 'step';\n if (!this.Layout.StepPanelOpen) this.ToggleStepPanel();\n this.cdr.markForCheck();\n }\n }\n\n public async OnOverrideEdge(edgeID: string, verdict: 'true' | 'false' | null): Promise<void> {\n await this.GraphDebug?.OverrideEdge(edgeID, verdict);\n if (verdict != null) this.clearStall();\n }\n\n public OnGraphConnectionSelected(event: { EdgeID: string | null; FromTaskID: string; ToTaskID: string }): void {\n if (!event.EdgeID) return;\n this.SelectedEdgeID = event.EdgeID;\n this.InspectorMode = 'edge';\n if (!this.Layout.StepPanelOpen) this.ToggleStepPanel();\n this.cdr.markForCheck();\n }\n\n public get SelectedEdge(): MJTaskDependencyEntity | null {\n if (!this.SelectedEdgeID) return null;\n return this.SelectedDeps.find((d) => UUIDsEqual(d.ID, this.SelectedEdgeID!)) ?? null;\n }\n\n public get SelectedEdgeIsConditional(): boolean {\n return !!this.SelectedEdge?.Condition?.trim();\n }\n\n public get SelectedEdgeOverride(): 'true' | 'false' | null {\n if (!this.SelectedEdgeID) return null;\n return this.GraphDebug?.GetEdgeOverride(this.SelectedEdgeID) ?? null;\n }\n\n public get SelectedEdgeFromName(): string {\n const edge = this.SelectedEdge;\n if (!edge) return '';\n return this.SelectedSteps.find((s) => UUIDsEqual(s.ID, edge.DependsOnTaskID))?.Name ?? 'upstream';\n }\n\n public get SelectedEdgeToName(): string {\n const edge = this.SelectedEdge;\n if (!edge) return '';\n return this.SelectedSteps.find((s) => UUIDsEqual(s.ID, edge.TaskID))?.Name ?? 'downstream';\n }\n\n public StepName(taskID: string): string {\n return this.SelectedSteps.find((s) => UUIDsEqual(s.ID, taskID))?.Name ?? 'a step';\n }\n\n public HasBreakpoint(taskID: string): boolean {\n return this.GraphDebug?.HasBreakpoint(taskID) ?? false;\n }\n\n /** Live or paused — the VS Code bar is how you drive it, including a start-paused debug. */\n public CanDriveRun(run: { Status: string }): boolean {\n if (this.IsRunSettled(run)) return false;\n return run.Status === 'In Progress' || run.Status === 'Running' || run.Status === 'Pending' || this.DebugPaused;\n }\n\n public IsRunSettled(run: { Status: string }): boolean {\n return this.GraphSettled\n || run.Status === 'Complete'\n || run.Status === 'Failed'\n || run.Status === 'Cancelled';\n }\n\n public OnCanvasSettled(): void {\n this.markGraphSettled();\n this.cdr.markForCheck();\n }\n\n private markGraphSettled(): void {\n this.GraphSettled = true;\n this.DebugPaused = false;\n this.DebugState = { ...this.DebugState, paused: false, pausedAtTaskID: null };\n }\n\n public StepPayload(step: WorkflowRunStep, field: 'InputPayload' | 'OutputPayload'): string | null {\n const value = step.Record[field];\n if (typeof value === 'string') return value;\n if (value == null) return null;\n return JSON.stringify(value);\n }\n\n public OnBreakpointCheckbox(step: WorkflowRunStep, event: Event): void {\n const target = event.target;\n const enabled = target instanceof HTMLInputElement && target.checked;\n void this.OnBreakpointToggled({ TaskID: step.ID, Enabled: enabled });\n }\n\n public CanForceComplete(step: WorkflowRunStep): boolean {\n if (this.isHumanStep(step)) return false;\n return step.Status === 'Pending' || step.Status === 'Failed' || step.Status === 'Blocked';\n }\n\n public CanEditInput(step: WorkflowRunStep): boolean {\n return step.Status === 'Pending' || step.Status === 'Failed';\n }\n\n public OpenForceComplete(step: WorkflowRunStep): void {\n this.ForceCompleteOpen = true;\n this.ForceCompleteJson = this.prettyJson(step.Record['OutputPayload']) || '{}';\n this.ForceCompleteName = '';\n this.ForceCompleteError = null;\n this.EditInputOpen = false;\n this.cdr.markForCheck();\n }\n\n public OpenEditInput(step: WorkflowRunStep): void {\n this.EditInputOpen = true;\n this.EditInputJson = this.prettyJson(step.Record['InputPayload']) || '{}';\n this.EditInputError = null;\n this.ForceCompleteOpen = false;\n this.cdr.markForCheck();\n }\n\n public async SubmitForceComplete(step: WorkflowRunStep): Promise<void> {\n if (this.ForceCompleteName.trim() !== step.Name) {\n this.ForceCompleteError = 'Type the step name exactly to confirm.';\n this.cdr.markForCheck();\n return;\n }\n const parsed = TryParseJsonObject(this.ForceCompleteJson);\n if (!parsed.ok) {\n this.ForceCompleteError = parsed.error;\n this.cdr.markForCheck();\n return;\n }\n this.ForceCompleteError = null;\n const ok = await this.GraphDebug?.ForceCompleteTask(step.ID, parsed.value);\n if (ok) {\n this.ForceCompleteOpen = false;\n if (this.SelectedRunID) void this.loadSteps(this.SelectedRunID);\n }\n }\n\n public async SubmitEditInput(step: WorkflowRunStep): Promise<void> {\n const parsed = TryParseJsonObject(this.EditInputJson);\n if (!parsed.ok) {\n this.EditInputError = parsed.error;\n this.cdr.markForCheck();\n return;\n }\n this.EditInputError = null;\n const ok = step.Status === 'Failed'\n ? await this.GraphDebug?.RetryTask(step.ID, parsed.value)\n : await this.GraphDebug?.UpdateTaskInput(step.ID, parsed.value);\n if (ok) {\n this.EditInputOpen = false;\n if (this.SelectedRunID) void this.loadSteps(this.SelectedRunID);\n }\n }\n\n public get InvocationJson(): string {\n return JSON.stringify(\n ParseJSONRecursive(\n { data: this.Invocation.data ?? null, context: this.Invocation.context ?? null },\n JSON_PARSE_OPTIONS,\n ),\n null,\n 2,\n );\n }\n\n public get HasInvocation(): boolean {\n return this.Invocation.data != null || this.Invocation.context != null;\n }\n\n // ─── live console: inspector data ───────────────────────────────────────\n\n /** The newest claim event seen for the selected step, if any. */\n public get SelectedStepClaim(): TaskGraphRunFrame | null {\n if (!this.SelectedStepID) return null;\n return this.FrameLog.find((f) => f.kind === 'ClaimChanged' && UUIDsEqual(f.taskId ?? '', this.SelectedStepID!)) ?? null;\n }\n\n /** Latest verdict per path into/out of the selected step — \"why did this branch run\". */\n public get SelectedStepVerdicts(): TaskGraphRunFrame[] {\n if (!this.SelectedStepID) return [];\n const byEdge = new Map<string, TaskGraphRunFrame>();\n // FrameLog is newest-first, so the first sighting per edge is the latest verdict.\n for (const f of this.FrameLog) {\n if (f.kind !== 'GateDecision' || !f.edgeId) continue;\n const touches = UUIDsEqual(f.taskId ?? '', this.SelectedStepID) || UUIDsEqual(f.dependsOnTaskId ?? '', this.SelectedStepID);\n if (touches && !byEdge.has(f.edgeId)) byEdge.set(f.edgeId, f);\n }\n return [...byEdge.values()];\n }\n\n /** What the selected step's runner last said it was doing. */\n public get SelectedStepProgress(): TaskGraphRunFrame | null {\n if (!this.SelectedStepID) return null;\n return this.FrameLog.find((f) => f.kind === 'NodeProgress' && UUIDsEqual(f.taskId ?? '', this.SelectedStepID!)) ?? null;\n }\n\n /**\n * What-if: how many steps would be cut off if the selected step failed — computed with the\n * engine's OWN blocking algorithm over the loaded rows, so the preview cannot disagree with\n * what the dispatcher would actually do.\n */\n public get SelectedStepWhatIf(): { BlockedCount: number } | null {\n const step = this.SelectedStep;\n if (!step || this.SelectedSteps.length === 0) return null;\n const nodes: TaskGraphNode[] = this.SelectedSteps.map((s) => ({\n id: s.ID,\n status: (UUIDsEqual(s.ID, step.ID) ? 'Failed' : s.Status) as TaskGraphNode['status'],\n }));\n const edges: TaskGraphEdge[] = this.SelectedDeps.map((d) => ({\n taskId: d.TaskID,\n dependsOnTaskId: d.DependsOnTaskID,\n dependencyType: d.DependencyType as TaskGraphEdge['dependencyType'],\n }));\n const blocked = ComputeTasksToBlock(nodes, edges, new Set());\n return { BlockedCount: [...blocked].filter((id) => !UUIDsEqual(id, step.ID)).length };\n }\n\n // ─── live console: replay ───────────────────────────────────────────────\n\n /** Whether the selected run can be scrubbed — it has settled and has a wall-clock span. */\n public get CanReplay(): boolean {\n const run = this.SelectedRun;\n return !!run && !this.isLiveStatus(run.Status) && !!run.StartedAt && !!run.CompletedAt;\n }\n\n /** The scrub position as a timestamp inside the run's span, or null when showing the present. */\n public get ReplayAt(): Date | null {\n const run = this.SelectedRun;\n if (this.ReplayPercent == null || !run?.StartedAt || !run?.CompletedAt) return null;\n const start = run.StartedAt.getTime();\n const end = run.CompletedAt.getTime();\n return new Date(start + (end - start) * (this.ReplayPercent / 100));\n }\n\n public OnReplayScrub(value: string | number): void {\n const pct = Math.max(0, Math.min(100, Number(value)));\n this.ReplayPercent = Number.isFinite(pct) ? pct : null;\n this.cdr.markForCheck();\n }\n\n public OnReplayReset(): void {\n this.ReplayPercent = null;\n this.cdr.markForCheck();\n }\n\n /**\n * Loads the selected run's steps.\n *\n * On selection rather than with the list, because a run list of 200 would otherwise pull every\n * step of every run to show the one a person opened. `BypassCache` because the dispatcher\n * advances tasks through direct SQL, which fires no cache invalidation — a cached read here can\n * hand back the state the graph was in when it started.\n */\n private async loadSteps(parentTaskID: string): Promise<void> {\n this.StepsLoading = true;\n this.cdr.markForCheck();\n try {\n const result = await RunView.FromMetadataProvider(this.ProviderToUse).RunView<MJTaskEntity>({\n EntityName: 'MJ: Tasks',\n ExtraFilter: `ParentID='${parentTaskID}'`,\n // The same ordering rule the run tree uses: what ran, in the order it ran, with work\n // that never started at the end. `__mj_CreatedAt` alone is the COMPILER's walk\n // order, which has nothing to do with execution.\n OrderBy: 'CASE WHEN StartedAt IS NULL THEN 1 ELSE 0 END, StartedAt, __mj_CreatedAt',\n ResultType: 'entity_object',\n BypassCache: true,\n });\n // The edges too, for the what-if preview — same rows the run view reads for the canvas.\n const deps = await RunView.FromMetadataProvider(this.ProviderToUse).RunView<MJTaskDependencyEntity>({\n EntityName: 'MJ: Task Dependencies',\n ExtraFilter: `TaskID IN (SELECT ID FROM __mj.Task WHERE ParentID='${parentTaskID}')`,\n ResultType: 'entity_object',\n BypassCache: true,\n });\n if (!UUIDsEqual(this.SelectedRunID ?? '', parentTaskID)) return; // selection moved on\n this.SelectedDeps = (deps.Success ? (deps.Results ?? []) : []);\n this.SelectedSteps = (result.Success ? (result.Results ?? []) : []).map((t) => ({\n ID: t.ID,\n Name: t.Name ?? '(unnamed step)',\n Status: t.Status,\n StepType: t.StepType,\n StartedAt: t.StartedAt,\n CompletedAt: t.CompletedAt,\n Record: t.GetAll(),\n }));\n } catch (e) {\n this.LoadError = e instanceof Error ? e.message : String(e);\n this.SelectedSteps = [];\n } finally {\n this.StepsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /** A node was clicked on the canvas — show that step's JSON. */\n public OnGraphNodeSelected(event: { TaskID: string }): void {\n this.SelectedStepID = event.TaskID;\n this.InspectorMode = 'step';\n // Asking to see a step is asking for the panel. Leaving it closed would make the click look\n // like it did nothing.\n if (!this.Layout.StepPanelOpen) this.ToggleStepPanel();\n this.cdr.markForCheck();\n }\n\n public OnSelectStep(step: WorkflowRunStep): void {\n this.SelectedStepID = UUIDsEqual(this.SelectedStepID ?? '', step.ID) ? null : step.ID;\n this.InspectorMode = 'step';\n this.resetEditors();\n this.cdr.markForCheck();\n }\n\n public OnDetailTab(tab: WorkflowRunDetailTab): void {\n this.DetailTab = tab;\n this.cdr.markForCheck();\n }\n\n public get SelectedStep(): WorkflowRunStep | null {\n return this.SelectedSteps.find((s) => UUIDsEqual(s.ID, this.SelectedStepID ?? '')) ?? null;\n }\n\n /** The selected step, as formatted JSON for the viewer. */\n public get SelectedStepJson(): string {\n const step = this.SelectedStep;\n return step ? JSON.stringify(ParseJSONRecursive(step.Record, JSON_PARSE_OPTIONS), null, 2) : '{}';\n }\n\n /**\n * The whole run as JSON — the graph row and every step under it.\n *\n * Nested JSON is parsed rather than left as escaped strings, so `Configuration` and the payloads\n * read as structure instead of a single unbroken line. That is the difference between a JSON tab\n * someone can use and one they copy elsewhere to make readable.\n */\n public get SelectedRunJson(): string {\n const run = this.SelectedRun;\n if (!run) return '{}';\n return JSON.stringify(\n ParseJSONRecursive(\n {\n Run: {\n ID: run.ID,\n Name: run.Name,\n Status: run.Status,\n StartedAt: run.StartedAt,\n CompletedAt: run.CompletedAt,\n Duration: run.Duration,\n AgentRunID: run.AgentRunID,\n },\n Steps: this.SelectedSteps.map((s) => s.Record),\n },\n JSON_PARSE_OPTIONS,\n ),\n null,\n 2,\n );\n }\n\n public OnFilterByStatus(status: WorkflowRunStatusFilter): void {\n this.StatusFilter = status;\n this.publishAgentContext();\n this.cdr.markForCheck();\n }\n\n public OnSearch(text: string): void {\n this.SearchText = text;\n this.publishAgentContext();\n this.cdr.markForCheck();\n }\n\n /** Opens the agent run that submitted this graph, when there was one. */\n public OnOpenAgentRun(run: WorkflowRunRow): void {\n if (!run.AgentRunID) return;\n this.navigationService.OpenEntityRecord('MJ: AI Agent Runs', CompositeKey.FromID(run.AgentRunID));\n }\n\n private async loadDebugState(parentTaskID: string): Promise<void> {\n try {\n const result = await RunView.FromMetadataProvider(this.ProviderToUse).RunView<MJTaskEntity>({\n EntityName: 'MJ: Tasks',\n ExtraFilter: `ID='${parentTaskID}'`,\n ResultType: 'entity_object',\n BypassCache: true,\n });\n if (!UUIDsEqual(this.SelectedRunID ?? '', parentTaskID)) return;\n const parent = result.Success ? result.Results?.[0] : undefined;\n const bag = ParseWorkflowRunParentBag(parent?.InputPayload);\n this.Invocation = bag.invocation;\n // Settled trumps the durable bag: $.debug.paused can still be true after the last\n // continue, and painting that as \"paused here\" hides that the run is over.\n if (this.GraphSettled) {\n this.DebugState = { ...bag.debug, paused: false, pausedAtTaskID: null };\n this.DebugPaused = false;\n } else {\n this.DebugState = bag.debug;\n this.DebugPaused = bag.debug.paused;\n }\n } catch {\n // A failed parent read leaves the last known debug state; frames remain the safety net.\n }\n this.cdr.markForCheck();\n }\n\n private setStall(stall: WorkflowStall): void {\n this.Stall = stall;\n this.StallNotice = stall.message;\n }\n\n private clearStall(): void {\n this.Stall = null;\n this.StallNotice = null;\n }\n\n public OnDismissStall(): void {\n this.clearStall();\n this.cdr.markForCheck();\n }\n\n private resetEditors(): void {\n this.ForceCompleteOpen = false;\n this.ForceCompleteError = null;\n this.EditInputOpen = false;\n this.EditInputError = null;\n }\n\n private isHumanStep(step: WorkflowRunStep): boolean {\n const userID = step.Record['UserID'];\n return typeof userID === 'string' && userID.trim().length > 0;\n }\n\n private prettyJson(value: unknown): string {\n if (value == null || value === '') return '';\n if (typeof value === 'string') {\n try {\n return JSON.stringify(JSON.parse(value), null, 2);\n } catch {\n return value;\n }\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return '';\n }\n }\n\n /**\n * Reports surface state and registers what an agent may drive here.\n *\n * 🔒 SAFETY BOUNDARY: read-only. Nothing here re-runs, cancels, retries or deletes a run — those\n * change what a workflow did, and a run is a historical record. The agent filters, searches,\n * selects and navigates; a person commits any real action from the UI.\n */\n private publishAgentContext(): void {\n const visible = this.VisibleRuns;\n this.navigationService.SetAgentContext(this, {\n Surface: 'WorkflowRuns',\n RunCount: this.Runs.length,\n VisibleRunCount: visible.length,\n StatusFilter: this.StatusFilter,\n SearchText: this.SearchText,\n RunningCount: this.Runs.filter((r) => r.Status === 'Running').length,\n FailedCount: this.Runs.filter((r) => r.Status === 'Failed').length,\n SelectedRunID: this.SelectedRunID,\n SelectedRunName: this.SelectedRun?.Name ?? null,\n VisibleRunNames: visible.slice(0, 25).map((r) => r.Name),\n VisibleRunNamesTruncated: visible.length > 25,\n });\n\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'FilterWorkflowRunsByStatus',\n Description: `Filter the run list. One of: ${STATUS_FILTERS.join(', ')}.`,\n ParameterSchema: {\n type: 'object',\n properties: { status: { type: 'string', enum: [...STATUS_FILTERS] } },\n required: ['status'],\n },\n Handler: async (params: Record<string, unknown>) => {\n const wanted = String(params['status'] ?? '').trim();\n const match = STATUS_FILTERS.find((s) => s.toLowerCase() === wanted.toLowerCase());\n if (!match) {\n return { Success: false, Message: `Unknown status. Use one of: ${STATUS_FILTERS.join(', ')}.` };\n }\n this.OnFilterByStatus(match);\n return { Success: true };\n },\n },\n {\n Name: 'SearchWorkflowRuns',\n Description: 'Filter the run list by name.',\n ParameterSchema: {\n type: 'object',\n properties: { text: { type: 'string' } },\n required: ['text'],\n },\n Handler: async (params: Record<string, unknown>) => {\n this.OnSearch(String(params['text'] ?? ''));\n return { Success: true, Data: { VisibleRunCount: this.VisibleRuns.length } };\n },\n },\n {\n Name: 'SelectWorkflowRun',\n Description: 'Open a run by name or ID and show its graph.',\n ParameterSchema: {\n type: 'object',\n properties: { run: { type: 'string' } },\n required: ['run'],\n },\n Handler: async (params: Record<string, unknown>) => {\n const wanted = String(params['run'] ?? '').trim().toLowerCase();\n const match =\n this.Runs.find((r) => UUIDsEqual(r.ID, wanted)) ??\n this.Runs.find((r) => r.Name.trim().toLowerCase() === wanted) ??\n this.Runs.find((r) => r.Name.toLowerCase().includes(wanted));\n if (!match) {\n const available = this.Runs.slice(0, 25).map((r) => r.Name).join(', ');\n return { Success: false, Message: `No run matched \"${params['run']}\". Available: ${available}` };\n }\n this.SelectedRunID = match.ID;\n this.publishAgentContext();\n this.cdr.markForCheck();\n return { Success: true, Data: { RunID: match.ID, Name: match.Name, Status: match.Status } };\n },\n },\n {\n Name: 'RefreshWorkflowRuns',\n Description: 'Reload the run list.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n await this.loadData();\n return { Success: true, Data: { RunCount: this.Runs.length } };\n },\n },\n ]);\n }\n}\n","<mj-page-layout>\n <mj-page-header\n Title=\"Runs\"\n Icon=\"fa-solid fa-timeline\"\n Subtitle=\"Every workflow that has run — however it was started.\">\n\n <div meta>\n @if (!IsLoading && Runs.length > 0) {\n <mj-stat-badge\n [Count]=\"VisibleRuns.length\"\n [Total]=\"Runs.length\"\n Label=\"runs\"></mj-stat-badge>\n }\n </div>\n\n <div actions>\n <mj-refresh-button [Loading]=\"IsLoading\" (Clicked)=\"loadData()\"></mj-refresh-button>\n </div>\n\n <div toolbar>\n <mj-page-search\n [Value]=\"SearchText\"\n Placeholder=\"Search runs\"\n (ValueChange)=\"OnSearch($event)\"></mj-page-search>\n\n <div class=\"wfr-status-filters\">\n @for (status of StatusFilters; track status) {\n <button\n type=\"button\"\n mjButton\n [variant]=\"StatusFilter === status ? 'primary' : 'flat'\"\n size=\"sm\"\n (click)=\"OnFilterByStatus(status)\">\n {{ status === 'all' ? 'All' : status }}\n </button>\n }\n </div>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n @if (IsLoading) {\n <mj-loading text=\"Loading runs...\"></mj-loading>\n } @else if (LoadError) {\n <mj-alert Variant=\"error\" [Message]=\"LoadError\"></mj-alert>\n } @else if (Runs.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-timeline\"\n Title=\"Nothing has run yet\"\n Message=\"When a workflow runs — started by hand, on a schedule, or by an agent — it will appear here.\">\n </mj-empty-state>\n } @else if (VisibleRuns.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-filter\"\n Title=\"No runs match\"\n Message=\"Nothing matches the current filter. Clear it to see everything that has run.\">\n </mj-empty-state>\n } @else {\n <as-split class=\"wfr-split\" direction=\"horizontal\" unit=\"percent\"\n [gutterSize]=\"8\" [disabled]=\"!SelectedRun\" (dragEnd)=\"OnSplitDragEnd($event.sizes)\">\n <as-split-area [size]=\"SelectedRun ? Layout.SplitSizes[0] : 100\" [minSize]=\"20\">\n <div class=\"wfr-list\">\n <!-- A header row that sorts. Every column a person scans by is sortable, because \"the\n longest run\" and \"the one that failed this morning\" are the two questions this list\n exists to answer and neither is answerable by scrolling. -->\n <div class=\"wfr-head\" role=\"row\">\n <button type=\"button\" class=\"wfr-head-cell wfr-col-name\" (click)=\"OnSort('Name')\">\n Workflow <i [ngClass]=\"SortIcon('Name')\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"wfr-head-cell wfr-col-time\" (click)=\"OnSort('StartedAt')\">\n Started <i [ngClass]=\"SortIcon('StartedAt')\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"wfr-head-cell wfr-col-time\" (click)=\"OnSort('CompletedAt')\">\n Ended <i [ngClass]=\"SortIcon('CompletedAt')\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"wfr-head-cell wfr-col-duration\" (click)=\"OnSort('Duration')\">\n Duration <i [ngClass]=\"SortIcon('Duration')\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"wfr-head-cell wfr-col-status\" (click)=\"OnSort('Status')\">\n Status <i [ngClass]=\"SortIcon('Status')\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n @for (run of VisibleRuns; track run.ID) {\n <button\n type=\"button\"\n class=\"wfr-row\"\n [class.wfr-row-selected]=\"run.ID === SelectedRunID\"\n (click)=\"OnSelectRun(run)\">\n <span class=\"wfr-col-name wfr-row-name\">{{ run.Name }}</span>\n <!-- An em dash, never a fabricated time: a run that has not started has no start, and\n printing one would read as data. -->\n <span class=\"wfr-col-time\">{{ run.StartedAt ? (run.StartedAt | date:'MMM d, h:mm:ss a') : '—' }}</span>\n <span class=\"wfr-col-time\">{{ run.CompletedAt ? (run.CompletedAt | date:'MMM d, h:mm:ss a') : '—' }}</span>\n <span class=\"wfr-col-duration\">{{ run.Duration }}</span>\n <span class=\"wfr-col-status wfr-row-status\" [attr.data-status]=\"run.Status\">{{ run.Status }}</span>\n </button>\n }\n </div>\n </as-split-area>\n\n <as-split-area [size]=\"SelectedRun ? Layout.SplitSizes[1] : 0\" [minSize]=\"25\" [visible]=\"!!SelectedRun\">\n @if (SelectedRun; as selected) {\n <!-- The canvas lives in the RIGHT PANEL on selection, not nested inside the list row.\n A graph needs room to be read; inlining one per row turns a scannable list into a\n stack of diagrams. -->\n <aside class=\"wfr-detail\">\n <header class=\"wfr-detail-head\">\n <div class=\"wfr-detail-title\">\n <span class=\"wfr-detail-name\">{{ selected.Name }}</span>\n <span class=\"wfr-row-status\" [attr.data-status]=\"selected.Status\">{{ selected.Status }}</span>\n </div>\n <div class=\"wfr-detail-actions\">\n @if (selected.AgentRunID) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"OnOpenAgentRun(selected)\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\" aria-hidden=\"true\"></i>\n Agent run\n </button>\n }\n @if (DetailTab === 'graph') {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"ToggleStepPanel()\"\n [title]=\"Layout.StepPanelOpen ? 'Hide step details' : 'Show step details'\">\n <i class=\"fa-solid\" [class.fa-square-caret-right]=\"Layout.StepPanelOpen\"\n [class.fa-square-caret-left]=\"!Layout.StepPanelOpen\" aria-hidden=\"true\"></i>\n </button>\n }\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"OnSelectRun(selected)\" aria-label=\"Close\">\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </header>\n\n <div class=\"wfr-detail-tabs\" role=\"tablist\">\n <button type=\"button\" class=\"wfr-tab\" [class.wfr-tab-active]=\"DetailTab === 'graph'\"\n (click)=\"OnDetailTab('graph')\">\n <i class=\"fa-solid fa-diagram-project\" aria-hidden=\"true\"></i> Workflow\n </button>\n <button type=\"button\" class=\"wfr-tab\" [class.wfr-tab-active]=\"DetailTab === 'json'\"\n (click)=\"OnDetailTab('json')\">\n <i class=\"fa-solid fa-code\" aria-hidden=\"true\"></i> JSON\n </button>\n </div>\n\n @if (Stall) {\n <!-- The hardening review's signature failure — \"the run strands silently\" — made\n loud. A held path is now something the operator can answer, not just read. -->\n <div class=\"wfr-stall\" role=\"status\" [attr.data-kind]=\"Stall.kind\">\n <div class=\"wfr-stall-body\">\n <i class=\"fa-solid fa-triangle-exclamation\" aria-hidden=\"true\"></i>\n <div class=\"wfr-stall-copy\">\n <span>{{ Stall.message }}</span>\n @if (Stall.conditionText) {\n <code>{{ Stall.conditionText }}</code>\n }\n @if (Stall.reason) {\n <span class=\"wfr-stall-reason\">{{ Stall.reason }}</span>\n }\n </div>\n </div>\n @if (Stall.kind === 'held' && Stall.edgeID) {\n <div class=\"wfr-stall-actions\">\n <button mjButton variant=\"primary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnOverrideEdge(Stall.edgeID!, 'true')\">\n Answer true\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnOverrideEdge(Stall.edgeID!, 'false')\">\n Answer false\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"OnDismissStall()\">\n Leave held\n </button>\n </div>\n }\n </div>\n }\n\n @if (DetailTab === 'graph') {\n <!-- Canvas BESIDE the step it opened, not above it. A JSON record in a strip along the\n bottom shows about ten lines, which is not enough of a record to read. -->\n <as-split class=\"wfr-graph-split\" [direction]=\"InnerSplitDirection\" unit=\"percent\"\n [gutterSize]=\"8\" (dragEnd)=\"OnStepSplitDragEnd($event.sizes)\">\n <as-split-area [size]=\"Layout.StepPanelOpen ? Layout.StepSplitSizes[0] : 100\" [minSize]=\"25\">\n <div class=\"wfr-graph-pane\">\n <mj-task-graph-debugger\n #GraphDebug\n [Provider]=\"ProviderToUse\"\n [ParentTaskID]=\"selected.ID\"\n [WorkflowName]=\"selected.Name\"\n [LiveUpdates]=\"selected.Status === 'Running' || selected.Status === 'In Progress'\"\n [ReplayAt]=\"ReplayAt\"\n [ShowLegend]=\"Layout.ShowLegend\"\n Height=\"100%\"\n (NodeSelected)=\"OnGraphNodeSelected($event)\"\n (ConnectionSelected)=\"OnGraphConnectionSelected($event)\"\n (LegendToggled)=\"OnLegendToggled($event)\"\n (Settled)=\"OnCanvasSettled()\"\n (Frame)=\"OnFrame($event)\"\n (PausedChange)=\"DebugPaused = $event\">\n </mj-task-graph-debugger>\n\n @if (CanReplay) {\n <!-- Replay: scrub through the settled run on the same canvas, reconstructed\n from each step's own timestamps. Read-only by construction. -->\n <div class=\"wfr-replay\">\n <i class=\"fa-solid fa-clock-rotate-left\" aria-hidden=\"true\"></i>\n <input type=\"range\" min=\"0\" max=\"100\" step=\"1\"\n [value]=\"ReplayPercent ?? 100\"\n (input)=\"OnReplayScrub($any($event.target).value)\"\n aria-label=\"Replay position\" />\n @if (ReplayPercent !== null) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"OnReplayReset()\">Now</button>\n }\n </div>\n }\n\n @if (GraphDebug.Breakpoints.length > 0 || GraphDebug.PausedAtTaskID) {\n <div class=\"wfr-bp-bar\" aria-label=\"Armed breakpoints\">\n @if (GraphDebug.PausedAtTaskID) {\n <span class=\"wfr-chip wfr-chip-paused\">\n <i class=\"fa-solid fa-pause\" aria-hidden=\"true\"></i>\n Paused at {{ StepName(GraphDebug.PausedAtTaskID) }}\n </span>\n }\n @for (id of GraphDebug.Breakpoints; track id) {\n <button type=\"button\" class=\"wfr-chip wfr-chip-break\" (click)=\"OnSelectBreakpoint(id)\">\n <i class=\"fa-solid fa-circle\" aria-hidden=\"true\"></i>\n {{ StepName(id) }}\n <span class=\"wfr-chip-x\" (click)=\"OnRemoveBreakpoint(id); $event.stopPropagation()\"\n role=\"button\" tabindex=\"0\" aria-label=\"Remove breakpoint\">×</span>\n </button>\n }\n </div>\n }\n\n @if (EngineTicks.length > 0) {\n <!-- The engine strip: one tick per dispatcher pass. A stuck run is a strip\n that keeps ticking with nothing moving — the honest visual of a stall. -->\n <div class=\"wfr-engine\" aria-label=\"Engine activity\">\n @for (tick of EngineTicks; track tick.passNumber) {\n <span class=\"wfr-tick\" [class.wfr-tick-held]=\"(tick.heldCount ?? 0) > 0\">\n #{{ tick.passNumber }} · ready {{ tick.eligibleCount ?? 0 }}\n · held {{ tick.heldCount ?? 0 }} · took {{ tick.claimedCount ?? 0 }}\n </span>\n }\n @if (GraphDebug.Paused) {\n <span class=\"wfr-tick wfr-tick-paused\">⏸ paused — nothing new starts</span>\n }\n </div>\n }\n </div>\n </as-split-area>\n\n <as-split-area [size]=\"Layout.StepPanelOpen ? Layout.StepSplitSizes[1] : 0\" [minSize]=\"20\"\n [visible]=\"Layout.StepPanelOpen\">\n <div class=\"wfr-steps-pane\">\n @if (StepsLoading) {\n <mj-loading text=\"Loading steps...\"></mj-loading>\n } @else {\n <div class=\"wfr-step-list\">\n @for (step of SelectedSteps; track step.ID) {\n <button type=\"button\" class=\"wfr-step\"\n [class.wfr-step-selected]=\"step.ID === SelectedStepID\"\n [attr.data-status]=\"step.Status\"\n (click)=\"OnSelectStep(step)\">\n <span class=\"wfr-step-name\">{{ step.Name }}</span>\n <span class=\"wfr-step-meta\">{{ step.StepType || 'Step' }}</span>\n </button>\n }\n </div>\n\n @if (InspectorMode === 'edge' && SelectedEdge; as edge) {\n <div class=\"wfr-step-json\">\n <div class=\"wfr-step-json-head\">\n <span>{{ SelectedEdgeFromName }} → {{ SelectedEdgeToName }}</span>\n @if (SelectedEdgeOverride) {\n <span class=\"wfr-chip wfr-chip-forced\">forced {{ SelectedEdgeOverride }}</span>\n }\n </div>\n <div class=\"wfr-insp-card\">\n <span class=\"wfr-insp-label\">Condition</span>\n @if (edge.Condition?.trim()) {\n <code>{{ edge.Condition }}</code>\n } @else {\n <span>Unconditional — this path always runs.</span>\n }\n </div>\n @if (SelectedEdgeIsConditional) {\n <div class=\"wfr-insp-actions\">\n <button mjButton variant=\"primary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnOverrideEdge(edge.ID, 'true')\">Answer true</button>\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnOverrideEdge(edge.ID, 'false')\">Answer false</button>\n @if (SelectedEdgeOverride) {\n <button mjButton variant=\"flat\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnOverrideEdge(edge.ID, null)\">Clear override</button>\n }\n </div>\n } @else {\n <p class=\"wfr-insp-hint\">Skip the target step instead of overriding an unconditional path.</p>\n }\n </div>\n } @else if (SelectedStep; as step) {\n <div class=\"wfr-step-json\">\n <div class=\"wfr-step-json-head\">\n <span>{{ step.Name }}</span>\n <span class=\"wfr-row-status\" [attr.data-status]=\"step.Status\">{{ step.Status }}</span>\n </div>\n\n <button type=\"button\" class=\"wfr-bp\"\n [class.wfr-bp-on]=\"HasBreakpoint(step.ID)\"\n [disabled]=\"ControlBusy\"\n (click)=\"OnBreakpointToggled({ TaskID: step.ID, Enabled: !HasBreakpoint(step.ID) })\"\n [attr.aria-pressed]=\"HasBreakpoint(step.ID)\"\n [title]=\"HasBreakpoint(step.ID) ? 'Remove breakpoint' : 'Break before this step'\">\n <i class=\"fa-circle\"\n [class.fa-solid]=\"HasBreakpoint(step.ID)\"\n [class.fa-regular]=\"!HasBreakpoint(step.ID)\"\n aria-hidden=\"true\"></i>\n </button>\n\n <!-- The inspector: live engine facts about this step, from the frame\n stream — claim, path verdicts, runner progress, what-if. -->\n @if (SelectedStepProgress; as progress) {\n <div class=\"wfr-insp-card\">\n <span class=\"wfr-insp-label\">Doing now</span>\n <span>{{ progress.progressMessage }}\n @if (progress.progressPercent != null) { ({{ progress.progressPercent }}%) }\n </span>\n </div>\n }\n @if (SelectedStepClaim; as claim) {\n <div class=\"wfr-insp-card\" [class.wfr-insp-bad]=\"claim.claimEvent === 'heartbeat-lost'\">\n <span class=\"wfr-insp-label\">Worker</span>\n <span>\n @switch (claim.claimEvent) {\n @case ('claimed') { {{ claim.claimedBy }} — working }\n @case ('heartbeat-lost') { {{ claim.claimedBy }} — lost, will be requeued }\n @case ('reclaimed') { requeued by the engine }\n }\n </span>\n </div>\n }\n @for (verdict of SelectedStepVerdicts; track verdict.edgeId) {\n <div class=\"wfr-insp-card\" [attr.data-verdict]=\"verdict.verdict\">\n <span class=\"wfr-insp-label\">\n @switch (verdict.verdict) {\n @case ('satisfied') { Path taken }\n @case ('notTaken') { Path not taken }\n @case ('held') { Path can't be answered }\n }\n </span>\n <span>\n @if (verdict.conditionText) { <code>{{ verdict.conditionText }}</code> }\n @if (verdict.reason) { — {{ verdict.reason }} }\n </span>\n </div>\n }\n @if (SelectedStepWhatIf; as whatIf) {\n <div class=\"wfr-insp-card\">\n <span class=\"wfr-insp-label\">If this step fails</span>\n <span>{{ whatIf.BlockedCount }} step{{ whatIf.BlockedCount === 1 ? '' : 's' }} can no longer run</span>\n </div>\n }\n @if (step.Status === 'Pending' || step.Status === 'Failed' || CanForceComplete(step)) {\n <div class=\"wfr-insp-actions\">\n @if (step.Status === 'Pending') {\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnSkipStep(step)\"\n title=\"Declare this step not-taken; later steps proceed\">\n <i class=\"fa-solid fa-forward\" aria-hidden=\"true\"></i> Skip step\n </button>\n }\n @if (CanEditInput(step)) {\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OpenEditInput(step)\">\n <i class=\"fa-solid fa-pen-to-square\" aria-hidden=\"true\"></i>\n {{ step.Status === 'Failed' ? 'Edit input & retry' : 'Edit input' }}\n </button>\n }\n @if (step.Status === 'Failed') {\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnRetryStep(step)\">\n <i class=\"fa-solid fa-rotate-right\" aria-hidden=\"true\"></i> Retry\n </button>\n }\n @if (CanForceComplete(step)) {\n <button mjButton variant=\"danger\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OpenForceComplete(step)\">\n <i class=\"fa-solid fa-flag-checkered\" aria-hidden=\"true\"></i> Force complete\n </button>\n }\n </div>\n }\n\n @if (EditInputOpen) {\n <div class=\"wfr-editor-card\">\n <span class=\"wfr-insp-label\">{{ step.Status === 'Failed' ? 'Edit input and retry' : 'Edit input' }}</span>\n <p class=\"wfr-insp-hint\">Applies to this run only. Invalid JSON is refused here.</p>\n <textarea class=\"mj-textarea wfr-json-edit\" [(ngModel)]=\"EditInputJson\"\n rows=\"8\" spellcheck=\"false\"></textarea>\n @if (EditInputError) {\n <span class=\"wfr-editor-error\">{{ EditInputError }}</span>\n }\n <div class=\"wfr-insp-actions\">\n <button mjButton variant=\"primary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"SubmitEditInput(step)\">\n {{ step.Status === 'Failed' ? 'Apply & retry' : 'Apply' }}\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"EditInputOpen = false\">Cancel</button>\n </div>\n </div>\n }\n\n @if (ForceCompleteOpen) {\n <div class=\"wfr-editor-card wfr-editor-danger\">\n <span class=\"wfr-insp-label\">Force complete</span>\n <p class=\"wfr-insp-hint\">Downstream conditions will evaluate against this output as if the step had produced it. Type the step name to confirm.</p>\n <textarea class=\"mj-textarea wfr-json-edit\" [(ngModel)]=\"ForceCompleteJson\"\n rows=\"6\" spellcheck=\"false\"></textarea>\n <input class=\"mj-input\" type=\"text\" [(ngModel)]=\"ForceCompleteName\"\n [placeholder]=\"'Type “' + step.Name + '” to confirm'\" />\n @if (ForceCompleteError) {\n <span class=\"wfr-editor-error\">{{ ForceCompleteError }}</span>\n }\n <div class=\"wfr-insp-actions\">\n <button mjButton variant=\"danger\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"SubmitForceComplete(step)\">Force complete</button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"ForceCompleteOpen = false\">Cancel</button>\n </div>\n </div>\n }\n\n <mj-task-graph-variables\n [InputPayload]=\"StepPayload(step, 'InputPayload')\"\n [OutputPayload]=\"StepPayload(step, 'OutputPayload')\"\n [Invocation]=\"Invocation\">\n </mj-task-graph-variables>\n </div>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-hand-pointer\"\n Title=\"Select a step\"\n Message=\"Click a step on the canvas or in the list to see everything it recorded.\">\n </mj-empty-state>\n }\n }\n </div>\n </as-split-area>\n </as-split>\n } @else {\n <div class=\"wfr-json-pane\">\n <mj-code-editor\n [ngModel]=\"SelectedRunJson\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"width: 100%;\">\n </mj-code-editor>\n </div>\n }\n </aside>\n }\n </as-split-area>\n </as-split>\n }\n </mj-page-body>\n</mj-page-layout>\n"]}
1
+ {"version":3,"file":"workflow-runs-resource.component.js","sourceRoot":"","sources":["../../../src/Workflows/components/workflow-runs-resource.component.ts","../../../src/Workflows/components/workflow-runs-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, HostListener, OnDestroy, ViewChild } from '@angular/core';\nimport { CompositeKey, RunView } from '@memberjunction/core';\nimport { MJTaskDependencyEntity, MJTaskEntity, ResourceData, UserInfoEngine } from '@memberjunction/core-entities';\nimport { ComputeTasksToBlock, type TaskGraphNode, type TaskGraphEdge } from '@memberjunction/ai-core-plus';\nimport { ParseJSONOptions, ParseJSONRecursive, RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { BaseDashboard, BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { TaskGraphDebuggerComponent, type TaskGraphRunFrame } from '@memberjunction/ng-task-graph-editor';\nimport { SortWorkflowRuns, type WorkflowRunSortColumn } from './workflow-run-sorting';\nimport { WorkflowRunLayout } from './workflow-run-layout';\nimport {\n EmptyDebugState,\n ParseWorkflowRunParentBag,\n TryParseJsonObject,\n type WorkflowRunDebugState,\n type WorkflowRunInvocation,\n type WorkflowStall,\n} from './workflow-run-debug-state';\n\n/** Below this the detail pane cannot hold a canvas AND a JSON pane side by side. */\nconst STACK_INNER_BELOW_PX = 1100;\n\n/**\n * How the JSON panes unpack nested JSON.\n *\n * A task's `Configuration` and payloads are JSON stored inside a string column, so without this the\n * viewer shows one very long escaped line — technically the truth, and unreadable. Matches what the\n * agent-run detail panel does, so the same record reads the same way in both places.\n */\nconst JSON_PARSE_OPTIONS: ParseJSONOptions = { extractInlineJson: true, maxDepth: 100, debug: false };\n\n/** A settled-or-running graph, projected for the list. */\nexport type WorkflowRunRow = {\n ID: string;\n Name: string;\n Status: string;\n StartedAt: Date | null;\n CompletedAt: Date | null;\n /** Human-readable elapsed/duration — coarse on purpose, this is a scan column. */\n Duration: string;\n AgentRunID: string | null;\n};\n\n/** The statuses a run can be filtered to. `all` is not a status; it clears the filter. */\nexport type WorkflowRunStatusFilter = 'all' | 'Running' | 'Complete' | 'Failed' | 'Cancelled';\n\nconst STATUS_FILTERS: readonly WorkflowRunStatusFilter[] = ['all', 'Running', 'Complete', 'Failed', 'Cancelled'];\n\n// The sort column type and the ordering itself live in `workflow-run-sorting`, which is pure and\n// therefore testable without standing up the component. Re-exported so existing importers of this\n// module keep resolving.\nexport type { WorkflowRunSortColumn } from './workflow-run-sorting';\n\n/** What the detail panel is showing for the selected run. */\nexport type WorkflowRunDetailTab = 'graph' | 'json';\n\n/**\n * One step of a run, for the detail panel's step list and JSON view.\n *\n * The whole entity is kept, not a projection: the JSON view exists precisely so someone can read\n * everything the row holds, and a projection would decide for them what is worth seeing.\n */\nexport type WorkflowRunStep = {\n ID: string;\n Name: string;\n Status: string;\n StepType: string | null;\n StartedAt: Date | null;\n CompletedAt: Date | null;\n /** Every column of the row, for the JSON pane. */\n Record: Record<string, unknown>;\n};\n\n/**\n * The Workflows app's **Runs** surface — every task graph that has run, whoever started it.\n *\n * **This is why the app came back.** A workflow's definition already had a home (the AI Agents form,\n * which is the one editor); its *runs* did not. They were reachable only by opening the agent that\n * happened to submit them, which fails for the case that matters most — a graph outlives the run\n * that submitted it, so a scheduled or MCP-triggered workflow had no owning conversation to find it\n * from. This lists them by the thing a person actually remembers: what ran, when, and how it ended.\n *\n * Reads parent Task rows because a parent row **is** a graph — one row per run, no joining required\n * to count them, and the same unit the promotion picker offers.\n */\n@Component({\n standalone: false,\n selector: 'mj-workflow-runs',\n templateUrl: './workflow-runs-resource.component.html',\n styleUrls: ['./workflow-runs-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n// Registered against BaseResourceComponent, NOT BaseDashboard — while still extending BaseDashboard\n// for its lifecycle (initDashboard/loadData and the automatic NotifyLoadComplete).\n//\n// The registration key is what the shell looks the component up by, and a nav item with\n// `ResourceType: \"Custom\"` is resolved through BaseResourceComponent. Registered under BaseDashboard\n// this class was never found: the Runs tab rendered \"No component is registered for driver class\n// WorkflowRunsResource\", which reads as a packaging problem and is really a one-word mismatch.\n// Its sibling WorkflowsResourceComponent had it right, which is what made the difference visible.\n@RegisterClass(BaseResourceComponent, 'WorkflowRunsResource')\nexport class WorkflowRunsResourceComponent extends BaseDashboard implements AfterViewInit, OnDestroy {\n public IsLoading = false;\n public LoadError: string | null = null;\n\n public Runs: WorkflowRunRow[] = [];\n public StatusFilter: WorkflowRunStatusFilter = 'all';\n public SearchText = '';\n\n /** The run whose graph is showing in the detail panel, or null. */\n public SelectedRunID: string | null = null;\n\n public readonly StatusFilters = STATUS_FILTERS;\n\n /**\n * Ordering. Newest-first by default, because \"what just happened\" is the question a run list is\n * usually opened to answer.\n */\n public SortColumn: WorkflowRunSortColumn = 'StartedAt';\n public SortDescending = true;\n\n /** What the detail panel is showing. */\n public DetailTab: WorkflowRunDetailTab = 'graph';\n\n /** The selected run's steps, loaded when a run is opened. */\n public SelectedSteps: WorkflowRunStep[] = [];\n public StepsLoading = false;\n\n /** The step whose JSON is showing, or null when none is selected. */\n public SelectedStepID: string | null = null;\n\n /**\n * Pane sizes, panel visibility and the legend toggle — the rules live in `workflow-run-layout`,\n * which is pure and therefore testable without standing up Angular.\n *\n * Preferences go through `UserInfoEngine` (`MJ: User Settings`), never `localStorage`: a pane\n * width that vanishes when someone opens a different browser is exactly the kind of preference\n * people notice when it disappears. Reads are a synchronous cache hit; writes are debounced,\n * because dragging a splitter fires continuously.\n */\n public readonly Layout = new WorkflowRunLayout({\n Get: (key) => UserInfoEngine.Instance.GetSetting(key),\n Set: (key, value) => UserInfoEngine.Instance.SetSettingDebounced(key, value),\n });\n\n /** Stacked rather than side-by-side when the detail pane is too narrow for both. */\n public InnerSplitDirection: 'horizontal' | 'vertical' = 'horizontal';\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Workflow Runs';\n }\n\n initDashboard(): void {\n this.Layout.Restore();\n this.applyViewportRules();\n }\n\n ngAfterViewInit(): void {\n this.publishAgentContext();\n }\n\n /** Re-evaluates the stacking rule; the detail pane's width follows the window's. */\n @HostListener('window:resize')\n public onViewportResized(): void {\n const before = this.InnerSplitDirection;\n this.applyViewportRules();\n if (before !== this.InnerSplitDirection) this.cdr.markForCheck();\n }\n\n private applyViewportRules(): void {\n // Three columns on a laptop gives each about 400px and the canvas stops being usable, so the\n // inner pair stacks instead. Mirrors the outer split's existing breakpoint rather than\n // inventing a second responsive scheme.\n this.InnerSplitDirection = window.innerWidth < STACK_INNER_BELOW_PX ? 'vertical' : 'horizontal';\n }\n\n public OnSplitDragEnd(sizes: readonly (number | '*')[]): void {\n this.Layout.OnSplitDragEnd(sizes);\n }\n\n public OnStepSplitDragEnd(sizes: readonly (number | '*')[]): void {\n this.Layout.OnStepSplitDragEnd(sizes);\n }\n\n public ToggleStepPanel(): void {\n this.Layout.ToggleStepPanel();\n this.cdr.markForCheck();\n }\n\n /**\n * The legend was toggled on the canvas toolbar — remember it.\n *\n * Driven from the toolbar rather than a button of our own: the canvas already has a legend\n * control in the place people look for one, and adding a second in the header would be two\n * controls for one setting, free to disagree.\n */\n public OnLegendToggled(show: boolean): void {\n this.Layout.SetLegendVisible(show);\n this.cdr.markForCheck();\n }\n\n /** The rows after the active filter and search, in the chosen order — what the template renders. */\n public get VisibleRuns(): WorkflowRunRow[] {\n const wanted = this.SearchText.trim().toLowerCase();\n const filtered = this.Runs.filter((r) => {\n if (this.StatusFilter !== 'all' && r.Status !== this.StatusFilter) return false;\n return !wanted || r.Name.toLowerCase().includes(wanted);\n });\n return this.sortRuns(filtered);\n }\n\n /** Ordering — see `workflow-run-sorting` for the rules and why unset always sorts last. */\n private sortRuns(rows: WorkflowRunRow[]): WorkflowRunRow[] {\n return SortWorkflowRuns(rows, this.SortColumn, this.SortDescending);\n }\n\n /**\n * Sorts by a column, flipping direction when it is already the active one.\n *\n * Time columns start descending (newest first) and text columns ascending (A→Z), because that is\n * what each is normally wanted in — a first click that produced the least useful order would\n * just mean everyone clicks twice.\n */\n public OnSort(column: WorkflowRunSortColumn): void {\n if (this.SortColumn === column) {\n this.SortDescending = !this.SortDescending;\n } else {\n this.SortColumn = column;\n this.SortDescending = column === 'StartedAt' || column === 'CompletedAt' || column === 'Duration';\n }\n this.publishAgentContext();\n this.cdr.markForCheck();\n }\n\n /** The sort indicator for a column header: none, ascending, or descending. */\n public SortIcon(column: WorkflowRunSortColumn): string {\n if (this.SortColumn !== column) return 'fa-solid fa-sort';\n return this.SortDescending ? 'fa-solid fa-sort-down' : 'fa-solid fa-sort-up';\n }\n\n public get SelectedRun(): WorkflowRunRow | null {\n return this.Runs.find((r) => UUIDsEqual(r.ID, this.SelectedRunID ?? '')) ?? null;\n }\n\n async loadData(): Promise<void> {\n this.IsLoading = true;\n this.LoadError = null;\n this.cdr.markForCheck();\n try {\n const result = await RunView.FromMetadataProvider(this.ProviderToUse).RunView<MJTaskEntity>({\n EntityName: 'MJ: Tasks',\n // Parent rows only: one row per graph. Without this the list would show every step\n // of every run interleaved, which is a step list, not a run list.\n ExtraFilter: `ParentID IS NULL`,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 200,\n ResultType: 'entity_object',\n });\n\n if (!result.Success) {\n this.LoadError = result.ErrorMessage ?? 'Runs could not be loaded.';\n this.Runs = [];\n return;\n }\n this.Runs = (result.Results ?? []).map((t) => this.toRow(t));\n } catch (e) {\n this.LoadError = e instanceof Error ? e.message : String(e);\n this.Runs = [];\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n private toRow(task: MJTaskEntity): WorkflowRunRow {\n return {\n ID: task.ID,\n Name: task.Name ?? '(unnamed run)',\n Status: task.Status,\n StartedAt: task.StartedAt,\n CompletedAt: task.CompletedAt,\n Duration: this.describeDuration(task.StartedAt, task.CompletedAt),\n AgentRunID: task.AgentRunID,\n };\n }\n\n /**\n * Elapsed time, or how long it has been running.\n *\n * A run with no start has not begun — that is different from a zero-length run, so it says so\n * rather than printing \"0s\" and implying something happened instantly.\n */\n private describeDuration(startedAt: Date | null, completedAt: Date | null): string {\n if (!startedAt) return '—';\n const end = completedAt ?? new Date();\n const seconds = Math.max(0, Math.round((end.getTime() - startedAt.getTime()) / 1000));\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ${seconds % 60}s`;\n return `${Math.floor(minutes / 60)}h ${minutes % 60}m`;\n }\n\n public OnSelectRun(run: WorkflowRunRow): void {\n const closing = UUIDsEqual(this.SelectedRunID ?? '', run.ID);\n this.SelectedRunID = closing ? null : run.ID;\n this.SelectedStepID = null;\n this.SelectedSteps = [];\n this.SelectedDeps = [];\n this.SelectedEdgeID = null;\n this.InspectorMode = 'step';\n this.resetEditors();\n this.detachFrames();\n this.ReplayPercent = null;\n this.GraphSettled = false;\n this.DebugState = EmptyDebugState();\n this.Invocation = {};\n // Frames are owned by <mj-task-graph-debugger>; it re-emits them for stall/engine chrome.\n this.publishAgentContext();\n this.cdr.markForCheck();\n if (!closing) {\n void this.loadSteps(run.ID);\n void this.loadDebugState(run.ID);\n }\n }\n\n // ─── live console: frames ────────────────────────────────────────────────\n //\n // <mj-task-graph-debugger> owns the frame subscription and re-emits each one. This host only\n // listens for stall / engine-tick chrome. Frames are ADVISORY; the widget's row reads remain\n // the truth, reconciled on settlement.\n\n /** The newest frame, bound straight into the run view for sub-second canvas updates. */\n @ViewChild(TaskGraphDebuggerComponent) public GraphDebug: TaskGraphDebuggerComponent | undefined;\n\n public LatestFrame: TaskGraphRunFrame | null = null;\n /** The engine's recent heartbeat ticks (`PassCompleted`), newest last. Bounded. */\n public EngineTicks: TaskGraphRunFrame[] = [];\n /** Everything seen this session for the selected run, newest first. Bounded. */\n public FrameLog: TaskGraphRunFrame[] = [];\n /** Whether the selected run is paused (from `GraphPaused`/`GraphResumed` frames + verbs). */\n public DebugPaused = false;\n /** Children are all terminal — the durable bag can still say paused after the last continue. */\n public GraphSettled = false;\n /** A one-line diagnosis when the engine reports trouble — a lost worker, a held path. */\n public StallNotice: string | null = null;\n /** Structured stall so a held edge can be answered, not just named. */\n public Stall: WorkflowStall | null = null;\n /** Durable debug state from the parent row — frames are advisory, this is the truth. */\n public DebugState: WorkflowRunDebugState = EmptyDebugState();\n /** Invocation `data`/`context` roots from the same parent bag (R3-3). */\n public Invocation: WorkflowRunInvocation = {};\n /** Selected path, when the person clicked an edge rather than a step. */\n public SelectedEdgeID: string | null = null;\n public InspectorMode: 'step' | 'edge' = 'step';\n /** Force-complete confirmation + output editor. */\n public ForceCompleteOpen = false;\n public ForceCompleteJson = '{}';\n public ForceCompleteName = '';\n public ForceCompleteError: string | null = null;\n /** Edit-input editor (Pending → UpdateTaskInput, Failed → RetryTask). */\n public EditInputOpen = false;\n public EditInputJson = '';\n public EditInputError: string | null = null;\n /** True while a control verb round-trips, so the toolbar cannot double-fire. */\n public get ControlBusy(): boolean {\n return this.GraphDebug?.Busy === true;\n }\n /** Replay position for a settled run: 0–100 along its wall-clock span, or null for \"now\". */\n public ReplayPercent: number | null = null;\n\n /** Dependencies of the selected run's steps, for the what-if preview. */\n public SelectedDeps: MJTaskDependencyEntity[] = [];\n\n private static readonly FRAME_LOG_LIMIT = 250;\n private static readonly ENGINE_TICK_LIMIT = 10;\n\n public override ngOnDestroy(): void {\n this.detachFrames();\n super.ngOnDestroy();\n }\n\n private isLiveStatus(status: string): boolean {\n return status === 'In Progress' || status === 'Running' || status === 'Pending';\n }\n\n private detachFrames(): void {\n this.LatestFrame = null;\n this.DebugPaused = false;\n this.StallNotice = null;\n this.Stall = null;\n }\n\n public OnFrame(frame: TaskGraphRunFrame): void {\n this.LatestFrame = frame;\n this.FrameLog = [frame, ...this.FrameLog].slice(0, WorkflowRunsResourceComponent.FRAME_LOG_LIMIT);\n\n switch (frame.kind) {\n case 'PassCompleted':\n this.EngineTicks = [...this.EngineTicks, frame].slice(-WorkflowRunsResourceComponent.ENGINE_TICK_LIMIT);\n break;\n case 'GraphPaused':\n case 'BreakpointHit':\n if (this.GraphSettled) break; // bag can still say paused after the last step\n this.DebugPaused = true;\n if (this.SelectedRunID) void this.loadDebugState(this.SelectedRunID);\n break;\n case 'GraphResumed':\n this.DebugPaused = false;\n if (this.SelectedRunID) void this.loadDebugState(this.SelectedRunID);\n break;\n case 'ClaimChanged':\n if (frame.claimEvent === 'heartbeat-lost') {\n this.setStall({\n kind: 'worker-lost',\n message: `\"${frame.taskName ?? 'A step'}\" lost its worker — the engine will requeue it.`,\n taskName: frame.taskName,\n taskID: frame.taskId,\n });\n } else if (frame.claimEvent === 'reclaimed') {\n this.clearStall();\n }\n break;\n case 'GateDecision':\n if (frame.verdict === 'held') {\n this.setStall({\n kind: 'held',\n message: `\"${frame.taskName ?? 'A step'}\" is waiting on a path that can't be answered.`,\n taskName: frame.taskName,\n taskID: frame.taskId,\n edgeID: frame.edgeId,\n conditionText: frame.conditionText,\n reason: frame.reason,\n });\n }\n break;\n case 'StepRefused':\n this.setStall({\n kind: 'step-refused',\n message: frame.reason ?? 'The step could not start yet; it stays queued.',\n reason: frame.reason,\n });\n break;\n case 'GraphSettled':\n this.markGraphSettled();\n this.clearStall();\n void this.loadData(); // the list row's status/duration just changed\n if (this.SelectedRunID) {\n void this.loadSteps(this.SelectedRunID);\n void this.loadDebugState(this.SelectedRunID);\n }\n break;\n case 'TaskCompleted':\n case 'TaskFailed':\n case 'TaskSkipped':\n case 'TaskBlocked':\n // Keep the step list in agreement with the canvas the frame just updated.\n if (this.SelectedRunID) void this.loadSteps(this.SelectedRunID);\n break;\n }\n this.cdr.markForCheck();\n }\n\n // ─── live console: control verbs ────────────────────────────────────────\n //\n // The drop-in debugger owns RouteOperation. These handlers just call its verbs.\n\n public async OnPauseRun(): Promise<void> {\n await this.GraphDebug?.Pause();\n this.DebugPaused = true;\n this.cdr.markForCheck();\n }\n\n public async OnResumeRun(): Promise<void> {\n await this.GraphDebug?.Resume();\n this.DebugPaused = false;\n this.cdr.markForCheck();\n }\n\n public async OnStepRun(target: 'one' | 'wave'): Promise<void> {\n await this.GraphDebug?.Step(target);\n }\n\n public async OnCancelRun(): Promise<void> {\n await this.GraphDebug?.Cancel();\n await this.loadData();\n }\n\n public async OnSkipStep(step: WorkflowRunStep): Promise<void> {\n await this.GraphDebug?.SkipTask(step.ID);\n if (this.SelectedRunID) void this.loadSteps(this.SelectedRunID);\n }\n\n public async OnRetryStep(step: WorkflowRunStep): Promise<void> {\n await this.GraphDebug?.RetryTask(step.ID);\n if (this.SelectedRunID) void this.loadSteps(this.SelectedRunID);\n }\n\n public async OnBreakpointToggled(event: { TaskID: string; Enabled: boolean }): Promise<void> {\n await this.GraphDebug?.ToggleBreakpoint(event.TaskID, event.Enabled);\n }\n\n public async OnRemoveBreakpoint(taskID: string): Promise<void> {\n await this.OnBreakpointToggled({ TaskID: taskID, Enabled: false });\n }\n\n public OnSelectBreakpoint(taskID: string): void {\n const step = this.SelectedSteps.find((s) => UUIDsEqual(s.ID, taskID));\n if (step) this.OnSelectStep(step);\n else {\n this.SelectedStepID = taskID;\n this.InspectorMode = 'step';\n if (!this.Layout.StepPanelOpen) this.ToggleStepPanel();\n this.cdr.markForCheck();\n }\n }\n\n public async OnOverrideEdge(edgeID: string, verdict: 'true' | 'false' | null): Promise<void> {\n await this.GraphDebug?.OverrideEdge(edgeID, verdict);\n if (verdict != null) this.clearStall();\n }\n\n public OnGraphConnectionSelected(event: { EdgeID: string | null; FromTaskID: string; ToTaskID: string }): void {\n if (!event.EdgeID) return;\n this.SelectedEdgeID = event.EdgeID;\n this.InspectorMode = 'edge';\n if (!this.Layout.StepPanelOpen) this.ToggleStepPanel();\n this.cdr.markForCheck();\n }\n\n public get SelectedEdge(): MJTaskDependencyEntity | null {\n if (!this.SelectedEdgeID) return null;\n return this.SelectedDeps.find((d) => UUIDsEqual(d.ID, this.SelectedEdgeID!)) ?? null;\n }\n\n public get SelectedEdgeIsConditional(): boolean {\n return !!this.SelectedEdge?.Condition?.trim();\n }\n\n public get SelectedEdgeOverride(): 'true' | 'false' | null {\n if (!this.SelectedEdgeID) return null;\n return this.GraphDebug?.GetEdgeOverride(this.SelectedEdgeID) ?? null;\n }\n\n public get SelectedEdgeFromName(): string {\n const edge = this.SelectedEdge;\n if (!edge) return '';\n return this.SelectedSteps.find((s) => UUIDsEqual(s.ID, edge.DependsOnTaskID))?.Name ?? 'upstream';\n }\n\n public get SelectedEdgeToName(): string {\n const edge = this.SelectedEdge;\n if (!edge) return '';\n return this.SelectedSteps.find((s) => UUIDsEqual(s.ID, edge.TaskID))?.Name ?? 'downstream';\n }\n\n public StepName(taskID: string): string {\n return this.SelectedSteps.find((s) => UUIDsEqual(s.ID, taskID))?.Name ?? 'a step';\n }\n\n public HasBreakpoint(taskID: string): boolean {\n return this.GraphDebug?.HasBreakpoint(taskID) ?? false;\n }\n\n /** Live or paused — the VS Code bar is how you drive it, including a start-paused debug. */\n public CanDriveRun(run: { Status: string }): boolean {\n if (this.IsRunSettled(run)) return false;\n return run.Status === 'In Progress' || run.Status === 'Running' || run.Status === 'Pending' || this.DebugPaused;\n }\n\n public IsRunSettled(run: { Status: string }): boolean {\n return this.GraphSettled\n || run.Status === 'Complete'\n || run.Status === 'Failed'\n || run.Status === 'Cancelled';\n }\n\n public OnCanvasSettled(): void {\n this.markGraphSettled();\n this.cdr.markForCheck();\n }\n\n private markGraphSettled(): void {\n this.GraphSettled = true;\n this.DebugPaused = false;\n this.DebugState = { ...this.DebugState, paused: false, pausedAtTaskID: null };\n }\n\n public StepPayload(step: WorkflowRunStep, field: 'InputPayload' | 'OutputPayload'): string | null {\n const value = step.Record[field];\n if (typeof value === 'string') return value;\n if (value == null) return null;\n return JSON.stringify(value);\n }\n\n public OnBreakpointCheckbox(step: WorkflowRunStep, event: Event): void {\n const target = event.target;\n const enabled = target instanceof HTMLInputElement && target.checked;\n void this.OnBreakpointToggled({ TaskID: step.ID, Enabled: enabled });\n }\n\n public CanForceComplete(step: WorkflowRunStep): boolean {\n if (this.isHumanStep(step)) return false;\n return step.Status === 'Pending' || step.Status === 'Failed' || step.Status === 'Blocked';\n }\n\n public CanEditInput(step: WorkflowRunStep): boolean {\n return step.Status === 'Pending' || step.Status === 'Failed';\n }\n\n public OpenForceComplete(step: WorkflowRunStep): void {\n this.ForceCompleteOpen = true;\n this.ForceCompleteJson = this.prettyJson(step.Record['OutputPayload']) || '{}';\n this.ForceCompleteName = '';\n this.ForceCompleteError = null;\n this.EditInputOpen = false;\n this.cdr.markForCheck();\n }\n\n public OpenEditInput(step: WorkflowRunStep): void {\n this.EditInputOpen = true;\n this.EditInputJson = this.prettyJson(step.Record['InputPayload']) || '{}';\n this.EditInputError = null;\n this.ForceCompleteOpen = false;\n this.cdr.markForCheck();\n }\n\n public async SubmitForceComplete(step: WorkflowRunStep): Promise<void> {\n if (this.ForceCompleteName.trim() !== step.Name) {\n this.ForceCompleteError = 'Type the step name exactly to confirm.';\n this.cdr.markForCheck();\n return;\n }\n const parsed = TryParseJsonObject(this.ForceCompleteJson);\n if (!parsed.ok) {\n this.ForceCompleteError = parsed.error;\n this.cdr.markForCheck();\n return;\n }\n this.ForceCompleteError = null;\n const ok = await this.GraphDebug?.ForceCompleteTask(step.ID, parsed.value);\n if (ok) {\n this.ForceCompleteOpen = false;\n if (this.SelectedRunID) void this.loadSteps(this.SelectedRunID);\n }\n }\n\n public async SubmitEditInput(step: WorkflowRunStep): Promise<void> {\n const parsed = TryParseJsonObject(this.EditInputJson);\n if (!parsed.ok) {\n this.EditInputError = parsed.error;\n this.cdr.markForCheck();\n return;\n }\n this.EditInputError = null;\n const ok = step.Status === 'Failed'\n ? await this.GraphDebug?.RetryTask(step.ID, parsed.value)\n : await this.GraphDebug?.UpdateTaskInput(step.ID, parsed.value);\n if (ok) {\n this.EditInputOpen = false;\n if (this.SelectedRunID) void this.loadSteps(this.SelectedRunID);\n }\n }\n\n public get InvocationJson(): string {\n return JSON.stringify(\n ParseJSONRecursive(\n { data: this.Invocation.data ?? null, context: this.Invocation.context ?? null },\n JSON_PARSE_OPTIONS,\n ),\n null,\n 2,\n );\n }\n\n public get HasInvocation(): boolean {\n return this.Invocation.data != null || this.Invocation.context != null;\n }\n\n // ─── live console: inspector data ───────────────────────────────────────\n\n /** The newest claim event seen for the selected step, if any. */\n public get SelectedStepClaim(): TaskGraphRunFrame | null {\n if (!this.SelectedStepID) return null;\n return this.FrameLog.find((f) => f.kind === 'ClaimChanged' && UUIDsEqual(f.taskId ?? '', this.SelectedStepID!)) ?? null;\n }\n\n /** Latest verdict per path into/out of the selected step — \"why did this branch run\". */\n public get SelectedStepVerdicts(): TaskGraphRunFrame[] {\n if (!this.SelectedStepID) return [];\n const byEdge = new Map<string, TaskGraphRunFrame>();\n // FrameLog is newest-first, so the first sighting per edge is the latest verdict.\n for (const f of this.FrameLog) {\n if (f.kind !== 'GateDecision' || !f.edgeId) continue;\n const touches = UUIDsEqual(f.taskId ?? '', this.SelectedStepID) || UUIDsEqual(f.dependsOnTaskId ?? '', this.SelectedStepID);\n if (touches && !byEdge.has(f.edgeId)) byEdge.set(f.edgeId, f);\n }\n return [...byEdge.values()];\n }\n\n /** What the selected step's runner last said it was doing. */\n public get SelectedStepProgress(): TaskGraphRunFrame | null {\n if (!this.SelectedStepID) return null;\n return this.FrameLog.find((f) => f.kind === 'NodeProgress' && UUIDsEqual(f.taskId ?? '', this.SelectedStepID!)) ?? null;\n }\n\n /**\n * What-if: how many steps would be cut off if the selected step failed — computed with the\n * engine's OWN blocking algorithm over the loaded rows, so the preview cannot disagree with\n * what the dispatcher would actually do.\n */\n public get SelectedStepWhatIf(): { BlockedCount: number } | null {\n const step = this.SelectedStep;\n if (!step || this.SelectedSteps.length === 0) return null;\n const nodes: TaskGraphNode[] = this.SelectedSteps.map((s) => ({\n id: s.ID,\n status: (UUIDsEqual(s.ID, step.ID) ? 'Failed' : s.Status) as TaskGraphNode['status'],\n }));\n const edges: TaskGraphEdge[] = this.SelectedDeps.map((d) => ({\n taskId: d.TaskID,\n dependsOnTaskId: d.DependsOnTaskID,\n dependencyType: d.DependencyType as TaskGraphEdge['dependencyType'],\n }));\n const blocked = ComputeTasksToBlock(nodes, edges, new Set());\n return { BlockedCount: [...blocked].filter((id) => !UUIDsEqual(id, step.ID)).length };\n }\n\n // ─── live console: replay ───────────────────────────────────────────────\n\n /** Whether the selected run can be scrubbed — it has settled and has a wall-clock span. */\n public get CanReplay(): boolean {\n const run = this.SelectedRun;\n return !!run && !this.isLiveStatus(run.Status) && !!run.StartedAt && !!run.CompletedAt;\n }\n\n /** The scrub position as a timestamp inside the run's span, or null when showing the present. */\n public get ReplayAt(): Date | null {\n const run = this.SelectedRun;\n if (this.ReplayPercent == null || !run?.StartedAt || !run?.CompletedAt) return null;\n const start = run.StartedAt.getTime();\n const end = run.CompletedAt.getTime();\n return new Date(start + (end - start) * (this.ReplayPercent / 100));\n }\n\n public OnReplayScrub(value: string | number): void {\n const pct = Math.max(0, Math.min(100, Number(value)));\n this.ReplayPercent = Number.isFinite(pct) ? pct : null;\n this.cdr.markForCheck();\n }\n\n public OnReplayReset(): void {\n this.ReplayPercent = null;\n this.cdr.markForCheck();\n }\n\n /**\n * Loads the selected run's steps.\n *\n * On selection rather than with the list, because a run list of 200 would otherwise pull every\n * step of every run to show the one a person opened. `BypassCache` because the dispatcher\n * advances tasks through direct SQL, which fires no cache invalidation — a cached read here can\n * hand back the state the graph was in when it started.\n */\n private async loadSteps(parentTaskID: string): Promise<void> {\n this.StepsLoading = true;\n this.cdr.markForCheck();\n try {\n const result = await RunView.FromMetadataProvider(this.ProviderToUse).RunView<MJTaskEntity>({\n EntityName: 'MJ: Tasks',\n ExtraFilter: `ParentID='${parentTaskID}'`,\n // The same ordering rule the run tree uses: what ran, in the order it ran, with work\n // that never started at the end. `__mj_CreatedAt` alone is the COMPILER's walk\n // order, which has nothing to do with execution.\n OrderBy: 'CASE WHEN StartedAt IS NULL THEN 1 ELSE 0 END, StartedAt, __mj_CreatedAt',\n ResultType: 'entity_object',\n BypassCache: true,\n });\n // The edges too, for the what-if preview — same rows the run view reads for the canvas.\n const deps = await RunView.FromMetadataProvider(this.ProviderToUse).RunView<MJTaskDependencyEntity>({\n EntityName: 'MJ: Task Dependencies',\n ExtraFilter: `TaskID IN (SELECT ID FROM [__mj].[vwTasks] WHERE ParentID='${parentTaskID}')`,\n ResultType: 'entity_object',\n BypassCache: true,\n });\n if (!UUIDsEqual(this.SelectedRunID ?? '', parentTaskID)) return; // selection moved on\n this.SelectedDeps = (deps.Success ? (deps.Results ?? []) : []);\n this.SelectedSteps = (result.Success ? (result.Results ?? []) : []).map((t) => ({\n ID: t.ID,\n Name: t.Name ?? '(unnamed step)',\n Status: t.Status,\n StepType: t.StepType,\n StartedAt: t.StartedAt,\n CompletedAt: t.CompletedAt,\n Record: t.GetAll(),\n }));\n } catch (e) {\n this.LoadError = e instanceof Error ? e.message : String(e);\n this.SelectedSteps = [];\n } finally {\n this.StepsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /** A node was clicked on the canvas — show that step's JSON. */\n public OnGraphNodeSelected(event: { TaskID: string }): void {\n this.SelectedStepID = event.TaskID;\n this.InspectorMode = 'step';\n // Asking to see a step is asking for the panel. Leaving it closed would make the click look\n // like it did nothing.\n if (!this.Layout.StepPanelOpen) this.ToggleStepPanel();\n this.cdr.markForCheck();\n }\n\n public OnSelectStep(step: WorkflowRunStep): void {\n this.SelectedStepID = UUIDsEqual(this.SelectedStepID ?? '', step.ID) ? null : step.ID;\n this.InspectorMode = 'step';\n this.resetEditors();\n this.cdr.markForCheck();\n }\n\n public OnDetailTab(tab: WorkflowRunDetailTab): void {\n this.DetailTab = tab;\n this.cdr.markForCheck();\n }\n\n public get SelectedStep(): WorkflowRunStep | null {\n return this.SelectedSteps.find((s) => UUIDsEqual(s.ID, this.SelectedStepID ?? '')) ?? null;\n }\n\n /** The selected step, as formatted JSON for the viewer. */\n public get SelectedStepJson(): string {\n const step = this.SelectedStep;\n return step ? JSON.stringify(ParseJSONRecursive(step.Record, JSON_PARSE_OPTIONS), null, 2) : '{}';\n }\n\n /**\n * The whole run as JSON — the graph row and every step under it.\n *\n * Nested JSON is parsed rather than left as escaped strings, so `Configuration` and the payloads\n * read as structure instead of a single unbroken line. That is the difference between a JSON tab\n * someone can use and one they copy elsewhere to make readable.\n */\n public get SelectedRunJson(): string {\n const run = this.SelectedRun;\n if (!run) return '{}';\n return JSON.stringify(\n ParseJSONRecursive(\n {\n Run: {\n ID: run.ID,\n Name: run.Name,\n Status: run.Status,\n StartedAt: run.StartedAt,\n CompletedAt: run.CompletedAt,\n Duration: run.Duration,\n AgentRunID: run.AgentRunID,\n },\n Steps: this.SelectedSteps.map((s) => s.Record),\n },\n JSON_PARSE_OPTIONS,\n ),\n null,\n 2,\n );\n }\n\n public OnFilterByStatus(status: WorkflowRunStatusFilter): void {\n this.StatusFilter = status;\n this.publishAgentContext();\n this.cdr.markForCheck();\n }\n\n public OnSearch(text: string): void {\n this.SearchText = text;\n this.publishAgentContext();\n this.cdr.markForCheck();\n }\n\n /** Opens the agent run that submitted this graph, when there was one. */\n public OnOpenAgentRun(run: WorkflowRunRow): void {\n if (!run.AgentRunID) return;\n this.navigationService.OpenEntityRecord('MJ: AI Agent Runs', CompositeKey.FromID(run.AgentRunID));\n }\n\n private async loadDebugState(parentTaskID: string): Promise<void> {\n try {\n const result = await RunView.FromMetadataProvider(this.ProviderToUse).RunView<MJTaskEntity>({\n EntityName: 'MJ: Tasks',\n ExtraFilter: `ID='${parentTaskID}'`,\n ResultType: 'entity_object',\n BypassCache: true,\n });\n if (!UUIDsEqual(this.SelectedRunID ?? '', parentTaskID)) return;\n const parent = result.Success ? result.Results?.[0] : undefined;\n const bag = ParseWorkflowRunParentBag(parent?.InputPayload);\n this.Invocation = bag.invocation;\n // Settled trumps the durable bag: $.debug.paused can still be true after the last\n // continue, and painting that as \"paused here\" hides that the run is over.\n if (this.GraphSettled) {\n this.DebugState = { ...bag.debug, paused: false, pausedAtTaskID: null };\n this.DebugPaused = false;\n } else {\n this.DebugState = bag.debug;\n this.DebugPaused = bag.debug.paused;\n }\n } catch {\n // A failed parent read leaves the last known debug state; frames remain the safety net.\n }\n this.cdr.markForCheck();\n }\n\n private setStall(stall: WorkflowStall): void {\n this.Stall = stall;\n this.StallNotice = stall.message;\n }\n\n private clearStall(): void {\n this.Stall = null;\n this.StallNotice = null;\n }\n\n public OnDismissStall(): void {\n this.clearStall();\n this.cdr.markForCheck();\n }\n\n private resetEditors(): void {\n this.ForceCompleteOpen = false;\n this.ForceCompleteError = null;\n this.EditInputOpen = false;\n this.EditInputError = null;\n }\n\n private isHumanStep(step: WorkflowRunStep): boolean {\n const userID = step.Record['UserID'];\n return typeof userID === 'string' && userID.trim().length > 0;\n }\n\n private prettyJson(value: unknown): string {\n if (value == null || value === '') return '';\n if (typeof value === 'string') {\n try {\n return JSON.stringify(JSON.parse(value), null, 2);\n } catch {\n return value;\n }\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return '';\n }\n }\n\n /**\n * Reports surface state and registers what an agent may drive here.\n *\n * 🔒 SAFETY BOUNDARY: read-only. Nothing here re-runs, cancels, retries or deletes a run — those\n * change what a workflow did, and a run is a historical record. The agent filters, searches,\n * selects and navigates; a person commits any real action from the UI.\n */\n private publishAgentContext(): void {\n const visible = this.VisibleRuns;\n this.navigationService.SetAgentContext(this, {\n Surface: 'WorkflowRuns',\n RunCount: this.Runs.length,\n VisibleRunCount: visible.length,\n StatusFilter: this.StatusFilter,\n SearchText: this.SearchText,\n RunningCount: this.Runs.filter((r) => r.Status === 'Running').length,\n FailedCount: this.Runs.filter((r) => r.Status === 'Failed').length,\n SelectedRunID: this.SelectedRunID,\n SelectedRunName: this.SelectedRun?.Name ?? null,\n VisibleRunNames: visible.slice(0, 25).map((r) => r.Name),\n VisibleRunNamesTruncated: visible.length > 25,\n });\n\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'FilterWorkflowRunsByStatus',\n Description: `Filter the run list. One of: ${STATUS_FILTERS.join(', ')}.`,\n ParameterSchema: {\n type: 'object',\n properties: { status: { type: 'string', enum: [...STATUS_FILTERS] } },\n required: ['status'],\n },\n Handler: async (params: Record<string, unknown>) => {\n const wanted = String(params['status'] ?? '').trim();\n const match = STATUS_FILTERS.find((s) => s.toLowerCase() === wanted.toLowerCase());\n if (!match) {\n return { Success: false, Message: `Unknown status. Use one of: ${STATUS_FILTERS.join(', ')}.` };\n }\n this.OnFilterByStatus(match);\n return { Success: true };\n },\n },\n {\n Name: 'SearchWorkflowRuns',\n Description: 'Filter the run list by name.',\n ParameterSchema: {\n type: 'object',\n properties: { text: { type: 'string' } },\n required: ['text'],\n },\n Handler: async (params: Record<string, unknown>) => {\n this.OnSearch(String(params['text'] ?? ''));\n return { Success: true, Data: { VisibleRunCount: this.VisibleRuns.length } };\n },\n },\n {\n Name: 'SelectWorkflowRun',\n Description: 'Open a run by name or ID and show its graph.',\n ParameterSchema: {\n type: 'object',\n properties: { run: { type: 'string' } },\n required: ['run'],\n },\n Handler: async (params: Record<string, unknown>) => {\n const wanted = String(params['run'] ?? '').trim().toLowerCase();\n const match =\n this.Runs.find((r) => UUIDsEqual(r.ID, wanted)) ??\n this.Runs.find((r) => r.Name.trim().toLowerCase() === wanted) ??\n this.Runs.find((r) => r.Name.toLowerCase().includes(wanted));\n if (!match) {\n const available = this.Runs.slice(0, 25).map((r) => r.Name).join(', ');\n return { Success: false, Message: `No run matched \"${params['run']}\". Available: ${available}` };\n }\n this.SelectedRunID = match.ID;\n this.publishAgentContext();\n this.cdr.markForCheck();\n return { Success: true, Data: { RunID: match.ID, Name: match.Name, Status: match.Status } };\n },\n },\n {\n Name: 'RefreshWorkflowRuns',\n Description: 'Reload the run list.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n await this.loadData();\n return { Success: true, Data: { RunCount: this.Runs.length } };\n },\n },\n ]);\n }\n}\n","<mj-page-layout>\n <mj-page-header\n Title=\"Runs\"\n Icon=\"fa-solid fa-timeline\"\n Subtitle=\"Every workflow that has run — however it was started.\">\n\n <div meta>\n @if (!IsLoading && Runs.length > 0) {\n <mj-stat-badge\n [Count]=\"VisibleRuns.length\"\n [Total]=\"Runs.length\"\n Label=\"runs\"></mj-stat-badge>\n }\n </div>\n\n <div actions>\n <mj-refresh-button [Loading]=\"IsLoading\" (Clicked)=\"loadData()\"></mj-refresh-button>\n </div>\n\n <div toolbar>\n <mj-page-search\n [Value]=\"SearchText\"\n Placeholder=\"Search runs\"\n (ValueChange)=\"OnSearch($event)\"></mj-page-search>\n\n <div class=\"wfr-status-filters\">\n @for (status of StatusFilters; track status) {\n <button\n type=\"button\"\n mjButton\n [variant]=\"StatusFilter === status ? 'primary' : 'flat'\"\n size=\"sm\"\n (click)=\"OnFilterByStatus(status)\">\n {{ status === 'all' ? 'All' : status }}\n </button>\n }\n </div>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n @if (IsLoading) {\n <mj-loading text=\"Loading runs...\"></mj-loading>\n } @else if (LoadError) {\n <mj-alert Variant=\"error\" [Message]=\"LoadError\"></mj-alert>\n } @else if (Runs.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-timeline\"\n Title=\"Nothing has run yet\"\n Message=\"When a workflow runs — started by hand, on a schedule, or by an agent — it will appear here.\">\n </mj-empty-state>\n } @else if (VisibleRuns.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-filter\"\n Title=\"No runs match\"\n Message=\"Nothing matches the current filter. Clear it to see everything that has run.\">\n </mj-empty-state>\n } @else {\n <as-split class=\"wfr-split\" direction=\"horizontal\" unit=\"percent\"\n [gutterSize]=\"8\" [disabled]=\"!SelectedRun\" (dragEnd)=\"OnSplitDragEnd($event.sizes)\">\n <as-split-area [size]=\"SelectedRun ? Layout.SplitSizes[0] : 100\" [minSize]=\"20\">\n <div class=\"wfr-list\">\n <!-- A header row that sorts. Every column a person scans by is sortable, because \"the\n longest run\" and \"the one that failed this morning\" are the two questions this list\n exists to answer and neither is answerable by scrolling. -->\n <div class=\"wfr-head\" role=\"row\">\n <button type=\"button\" class=\"wfr-head-cell wfr-col-name\" (click)=\"OnSort('Name')\">\n Workflow <i [ngClass]=\"SortIcon('Name')\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"wfr-head-cell wfr-col-time\" (click)=\"OnSort('StartedAt')\">\n Started <i [ngClass]=\"SortIcon('StartedAt')\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"wfr-head-cell wfr-col-time\" (click)=\"OnSort('CompletedAt')\">\n Ended <i [ngClass]=\"SortIcon('CompletedAt')\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"wfr-head-cell wfr-col-duration\" (click)=\"OnSort('Duration')\">\n Duration <i [ngClass]=\"SortIcon('Duration')\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"wfr-head-cell wfr-col-status\" (click)=\"OnSort('Status')\">\n Status <i [ngClass]=\"SortIcon('Status')\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n @for (run of VisibleRuns; track run.ID) {\n <button\n type=\"button\"\n class=\"wfr-row\"\n [class.wfr-row-selected]=\"run.ID === SelectedRunID\"\n (click)=\"OnSelectRun(run)\">\n <span class=\"wfr-col-name wfr-row-name\">{{ run.Name }}</span>\n <!-- An em dash, never a fabricated time: a run that has not started has no start, and\n printing one would read as data. -->\n <span class=\"wfr-col-time\">{{ run.StartedAt ? (run.StartedAt | date:'MMM d, h:mm:ss a') : '—' }}</span>\n <span class=\"wfr-col-time\">{{ run.CompletedAt ? (run.CompletedAt | date:'MMM d, h:mm:ss a') : '—' }}</span>\n <span class=\"wfr-col-duration\">{{ run.Duration }}</span>\n <span class=\"wfr-col-status wfr-row-status\" [attr.data-status]=\"run.Status\">{{ run.Status }}</span>\n </button>\n }\n </div>\n </as-split-area>\n\n <as-split-area [size]=\"SelectedRun ? Layout.SplitSizes[1] : 0\" [minSize]=\"25\" [visible]=\"!!SelectedRun\">\n @if (SelectedRun; as selected) {\n <!-- The canvas lives in the RIGHT PANEL on selection, not nested inside the list row.\n A graph needs room to be read; inlining one per row turns a scannable list into a\n stack of diagrams. -->\n <aside class=\"wfr-detail\">\n <header class=\"wfr-detail-head\">\n <div class=\"wfr-detail-title\">\n <span class=\"wfr-detail-name\">{{ selected.Name }}</span>\n <span class=\"wfr-row-status\" [attr.data-status]=\"selected.Status\">{{ selected.Status }}</span>\n </div>\n <div class=\"wfr-detail-actions\">\n @if (selected.AgentRunID) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"OnOpenAgentRun(selected)\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\" aria-hidden=\"true\"></i>\n Agent run\n </button>\n }\n @if (DetailTab === 'graph') {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"ToggleStepPanel()\"\n [title]=\"Layout.StepPanelOpen ? 'Hide step details' : 'Show step details'\">\n <i class=\"fa-solid\" [class.fa-square-caret-right]=\"Layout.StepPanelOpen\"\n [class.fa-square-caret-left]=\"!Layout.StepPanelOpen\" aria-hidden=\"true\"></i>\n </button>\n }\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"OnSelectRun(selected)\" aria-label=\"Close\">\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </header>\n\n <div class=\"wfr-detail-tabs\" role=\"tablist\">\n <button type=\"button\" class=\"wfr-tab\" [class.wfr-tab-active]=\"DetailTab === 'graph'\"\n (click)=\"OnDetailTab('graph')\">\n <i class=\"fa-solid fa-diagram-project\" aria-hidden=\"true\"></i> Workflow\n </button>\n <button type=\"button\" class=\"wfr-tab\" [class.wfr-tab-active]=\"DetailTab === 'json'\"\n (click)=\"OnDetailTab('json')\">\n <i class=\"fa-solid fa-code\" aria-hidden=\"true\"></i> JSON\n </button>\n </div>\n\n @if (Stall) {\n <!-- The hardening review's signature failure — \"the run strands silently\" — made\n loud. A held path is now something the operator can answer, not just read. -->\n <div class=\"wfr-stall\" role=\"status\" [attr.data-kind]=\"Stall.kind\">\n <div class=\"wfr-stall-body\">\n <i class=\"fa-solid fa-triangle-exclamation\" aria-hidden=\"true\"></i>\n <div class=\"wfr-stall-copy\">\n <span>{{ Stall.message }}</span>\n @if (Stall.conditionText) {\n <code>{{ Stall.conditionText }}</code>\n }\n @if (Stall.reason) {\n <span class=\"wfr-stall-reason\">{{ Stall.reason }}</span>\n }\n </div>\n </div>\n @if (Stall.kind === 'held' && Stall.edgeID) {\n <div class=\"wfr-stall-actions\">\n <button mjButton variant=\"primary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnOverrideEdge(Stall.edgeID!, 'true')\">\n Answer true\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnOverrideEdge(Stall.edgeID!, 'false')\">\n Answer false\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"OnDismissStall()\">\n Leave held\n </button>\n </div>\n }\n </div>\n }\n\n @if (DetailTab === 'graph') {\n <!-- Canvas BESIDE the step it opened, not above it. A JSON record in a strip along the\n bottom shows about ten lines, which is not enough of a record to read. -->\n <as-split class=\"wfr-graph-split\" [direction]=\"InnerSplitDirection\" unit=\"percent\"\n [gutterSize]=\"8\" (dragEnd)=\"OnStepSplitDragEnd($event.sizes)\">\n <as-split-area [size]=\"Layout.StepPanelOpen ? Layout.StepSplitSizes[0] : 100\" [minSize]=\"25\">\n <div class=\"wfr-graph-pane\">\n <mj-task-graph-debugger\n #GraphDebug\n [Provider]=\"ProviderToUse\"\n [ParentTaskID]=\"selected.ID\"\n [WorkflowName]=\"selected.Name\"\n [LiveUpdates]=\"selected.Status === 'Running' || selected.Status === 'In Progress'\"\n [ReplayAt]=\"ReplayAt\"\n [ShowLegend]=\"Layout.ShowLegend\"\n Height=\"100%\"\n (NodeSelected)=\"OnGraphNodeSelected($event)\"\n (ConnectionSelected)=\"OnGraphConnectionSelected($event)\"\n (LegendToggled)=\"OnLegendToggled($event)\"\n (Settled)=\"OnCanvasSettled()\"\n (Frame)=\"OnFrame($event)\"\n (PausedChange)=\"DebugPaused = $event\">\n </mj-task-graph-debugger>\n\n @if (CanReplay) {\n <!-- Replay: scrub through the settled run on the same canvas, reconstructed\n from each step's own timestamps. Read-only by construction. -->\n <div class=\"wfr-replay\">\n <i class=\"fa-solid fa-clock-rotate-left\" aria-hidden=\"true\"></i>\n <input type=\"range\" min=\"0\" max=\"100\" step=\"1\"\n [value]=\"ReplayPercent ?? 100\"\n (input)=\"OnReplayScrub($any($event.target).value)\"\n aria-label=\"Replay position\" />\n @if (ReplayPercent !== null) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"OnReplayReset()\">Now</button>\n }\n </div>\n }\n\n @if (GraphDebug.Breakpoints.length > 0 || GraphDebug.PausedAtTaskID) {\n <div class=\"wfr-bp-bar\" aria-label=\"Armed breakpoints\">\n @if (GraphDebug.PausedAtTaskID) {\n <span class=\"wfr-chip wfr-chip-paused\">\n <i class=\"fa-solid fa-pause\" aria-hidden=\"true\"></i>\n Paused at {{ StepName(GraphDebug.PausedAtTaskID) }}\n </span>\n }\n @for (id of GraphDebug.Breakpoints; track id) {\n <button type=\"button\" class=\"wfr-chip wfr-chip-break\" (click)=\"OnSelectBreakpoint(id)\">\n <i class=\"fa-solid fa-circle\" aria-hidden=\"true\"></i>\n {{ StepName(id) }}\n <span class=\"wfr-chip-x\" (click)=\"OnRemoveBreakpoint(id); $event.stopPropagation()\"\n role=\"button\" tabindex=\"0\" aria-label=\"Remove breakpoint\">×</span>\n </button>\n }\n </div>\n }\n\n @if (EngineTicks.length > 0) {\n <!-- The engine strip: one tick per dispatcher pass. A stuck run is a strip\n that keeps ticking with nothing moving — the honest visual of a stall. -->\n <div class=\"wfr-engine\" aria-label=\"Engine activity\">\n @for (tick of EngineTicks; track tick.passNumber) {\n <span class=\"wfr-tick\" [class.wfr-tick-held]=\"(tick.heldCount ?? 0) > 0\">\n #{{ tick.passNumber }} · ready {{ tick.eligibleCount ?? 0 }}\n · held {{ tick.heldCount ?? 0 }} · took {{ tick.claimedCount ?? 0 }}\n </span>\n }\n @if (GraphDebug.Paused) {\n <span class=\"wfr-tick wfr-tick-paused\">⏸ paused — nothing new starts</span>\n }\n </div>\n }\n </div>\n </as-split-area>\n\n <as-split-area [size]=\"Layout.StepPanelOpen ? Layout.StepSplitSizes[1] : 0\" [minSize]=\"20\"\n [visible]=\"Layout.StepPanelOpen\">\n <div class=\"wfr-steps-pane\">\n @if (StepsLoading) {\n <mj-loading text=\"Loading steps...\"></mj-loading>\n } @else {\n <div class=\"wfr-step-list\">\n @for (step of SelectedSteps; track step.ID) {\n <button type=\"button\" class=\"wfr-step\"\n [class.wfr-step-selected]=\"step.ID === SelectedStepID\"\n [attr.data-status]=\"step.Status\"\n (click)=\"OnSelectStep(step)\">\n <span class=\"wfr-step-name\">{{ step.Name }}</span>\n <span class=\"wfr-step-meta\">{{ step.StepType || 'Step' }}</span>\n </button>\n }\n </div>\n\n @if (InspectorMode === 'edge' && SelectedEdge; as edge) {\n <div class=\"wfr-step-json\">\n <div class=\"wfr-step-json-head\">\n <span>{{ SelectedEdgeFromName }} → {{ SelectedEdgeToName }}</span>\n @if (SelectedEdgeOverride) {\n <span class=\"wfr-chip wfr-chip-forced\">forced {{ SelectedEdgeOverride }}</span>\n }\n </div>\n <div class=\"wfr-insp-card\">\n <span class=\"wfr-insp-label\">Condition</span>\n @if (edge.Condition?.trim()) {\n <code>{{ edge.Condition }}</code>\n } @else {\n <span>Unconditional — this path always runs.</span>\n }\n </div>\n @if (SelectedEdgeIsConditional) {\n <div class=\"wfr-insp-actions\">\n <button mjButton variant=\"primary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnOverrideEdge(edge.ID, 'true')\">Answer true</button>\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnOverrideEdge(edge.ID, 'false')\">Answer false</button>\n @if (SelectedEdgeOverride) {\n <button mjButton variant=\"flat\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnOverrideEdge(edge.ID, null)\">Clear override</button>\n }\n </div>\n } @else {\n <p class=\"wfr-insp-hint\">Skip the target step instead of overriding an unconditional path.</p>\n }\n </div>\n } @else if (SelectedStep; as step) {\n <div class=\"wfr-step-json\">\n <div class=\"wfr-step-json-head\">\n <span>{{ step.Name }}</span>\n <span class=\"wfr-row-status\" [attr.data-status]=\"step.Status\">{{ step.Status }}</span>\n </div>\n\n <button type=\"button\" class=\"wfr-bp\"\n [class.wfr-bp-on]=\"HasBreakpoint(step.ID)\"\n [disabled]=\"ControlBusy\"\n (click)=\"OnBreakpointToggled({ TaskID: step.ID, Enabled: !HasBreakpoint(step.ID) })\"\n [attr.aria-pressed]=\"HasBreakpoint(step.ID)\"\n [title]=\"HasBreakpoint(step.ID) ? 'Remove breakpoint' : 'Break before this step'\">\n <i class=\"fa-circle\"\n [class.fa-solid]=\"HasBreakpoint(step.ID)\"\n [class.fa-regular]=\"!HasBreakpoint(step.ID)\"\n aria-hidden=\"true\"></i>\n </button>\n\n <!-- The inspector: live engine facts about this step, from the frame\n stream — claim, path verdicts, runner progress, what-if. -->\n @if (SelectedStepProgress; as progress) {\n <div class=\"wfr-insp-card\">\n <span class=\"wfr-insp-label\">Doing now</span>\n <span>{{ progress.progressMessage }}\n @if (progress.progressPercent != null) { ({{ progress.progressPercent }}%) }\n </span>\n </div>\n }\n @if (SelectedStepClaim; as claim) {\n <div class=\"wfr-insp-card\" [class.wfr-insp-bad]=\"claim.claimEvent === 'heartbeat-lost'\">\n <span class=\"wfr-insp-label\">Worker</span>\n <span>\n @switch (claim.claimEvent) {\n @case ('claimed') { {{ claim.claimedBy }} — working }\n @case ('heartbeat-lost') { {{ claim.claimedBy }} — lost, will be requeued }\n @case ('reclaimed') { requeued by the engine }\n }\n </span>\n </div>\n }\n @for (verdict of SelectedStepVerdicts; track verdict.edgeId) {\n <div class=\"wfr-insp-card\" [attr.data-verdict]=\"verdict.verdict\">\n <span class=\"wfr-insp-label\">\n @switch (verdict.verdict) {\n @case ('satisfied') { Path taken }\n @case ('notTaken') { Path not taken }\n @case ('held') { Path can't be answered }\n }\n </span>\n <span>\n @if (verdict.conditionText) { <code>{{ verdict.conditionText }}</code> }\n @if (verdict.reason) { — {{ verdict.reason }} }\n </span>\n </div>\n }\n @if (SelectedStepWhatIf; as whatIf) {\n <div class=\"wfr-insp-card\">\n <span class=\"wfr-insp-label\">If this step fails</span>\n <span>{{ whatIf.BlockedCount }} step{{ whatIf.BlockedCount === 1 ? '' : 's' }} can no longer run</span>\n </div>\n }\n @if (step.Status === 'Pending' || step.Status === 'Failed' || CanForceComplete(step)) {\n <div class=\"wfr-insp-actions\">\n @if (step.Status === 'Pending') {\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnSkipStep(step)\"\n title=\"Declare this step not-taken; later steps proceed\">\n <i class=\"fa-solid fa-forward\" aria-hidden=\"true\"></i> Skip step\n </button>\n }\n @if (CanEditInput(step)) {\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OpenEditInput(step)\">\n <i class=\"fa-solid fa-pen-to-square\" aria-hidden=\"true\"></i>\n {{ step.Status === 'Failed' ? 'Edit input & retry' : 'Edit input' }}\n </button>\n }\n @if (step.Status === 'Failed') {\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OnRetryStep(step)\">\n <i class=\"fa-solid fa-rotate-right\" aria-hidden=\"true\"></i> Retry\n </button>\n }\n @if (CanForceComplete(step)) {\n <button mjButton variant=\"danger\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"OpenForceComplete(step)\">\n <i class=\"fa-solid fa-flag-checkered\" aria-hidden=\"true\"></i> Force complete\n </button>\n }\n </div>\n }\n\n @if (EditInputOpen) {\n <div class=\"wfr-editor-card\">\n <span class=\"wfr-insp-label\">{{ step.Status === 'Failed' ? 'Edit input and retry' : 'Edit input' }}</span>\n <p class=\"wfr-insp-hint\">Applies to this run only. Invalid JSON is refused here.</p>\n <textarea class=\"mj-textarea wfr-json-edit\" [(ngModel)]=\"EditInputJson\"\n rows=\"8\" spellcheck=\"false\"></textarea>\n @if (EditInputError) {\n <span class=\"wfr-editor-error\">{{ EditInputError }}</span>\n }\n <div class=\"wfr-insp-actions\">\n <button mjButton variant=\"primary\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"SubmitEditInput(step)\">\n {{ step.Status === 'Failed' ? 'Apply & retry' : 'Apply' }}\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"EditInputOpen = false\">Cancel</button>\n </div>\n </div>\n }\n\n @if (ForceCompleteOpen) {\n <div class=\"wfr-editor-card wfr-editor-danger\">\n <span class=\"wfr-insp-label\">Force complete</span>\n <p class=\"wfr-insp-hint\">Downstream conditions will evaluate against this output as if the step had produced it. Type the step name to confirm.</p>\n <textarea class=\"mj-textarea wfr-json-edit\" [(ngModel)]=\"ForceCompleteJson\"\n rows=\"6\" spellcheck=\"false\"></textarea>\n <input class=\"mj-input\" type=\"text\" [(ngModel)]=\"ForceCompleteName\"\n [placeholder]=\"'Type “' + step.Name + '” to confirm'\" />\n @if (ForceCompleteError) {\n <span class=\"wfr-editor-error\">{{ ForceCompleteError }}</span>\n }\n <div class=\"wfr-insp-actions\">\n <button mjButton variant=\"danger\" size=\"sm\" [disabled]=\"ControlBusy\"\n (click)=\"SubmitForceComplete(step)\">Force complete</button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"ForceCompleteOpen = false\">Cancel</button>\n </div>\n </div>\n }\n\n <mj-task-graph-variables\n [InputPayload]=\"StepPayload(step, 'InputPayload')\"\n [OutputPayload]=\"StepPayload(step, 'OutputPayload')\"\n [Invocation]=\"Invocation\">\n </mj-task-graph-variables>\n </div>\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-hand-pointer\"\n Title=\"Select a step\"\n Message=\"Click a step on the canvas or in the list to see everything it recorded.\">\n </mj-empty-state>\n }\n }\n </div>\n </as-split-area>\n </as-split>\n } @else {\n <div class=\"wfr-json-pane\">\n <mj-code-editor\n [ngModel]=\"SelectedRunJson\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"width: 100%;\">\n </mj-code-editor>\n </div>\n }\n </aside>\n }\n </as-split-area>\n </as-split>\n }\n </mj-page-body>\n</mj-page-layout>\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-dashboards",
3
- "version": "6.1.1",
3
+ "version": "6.1.3",
4
4
  "description": "MemberJunction Dashboards",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -89,7 +89,7 @@
89
89
  "@angular/compiler-cli": "21.2.22",
90
90
  "@types/d3": "^7.4.0",
91
91
  "sass": "^1.97.3",
92
- "@memberjunction/ng-test-utils": "6.1.1"
92
+ "@memberjunction/ng-test-utils": "6.1.3"
93
93
  },
94
94
  "peerDependencies": {
95
95
  "@angular/animations": "^21.2.22",
@@ -106,67 +106,67 @@
106
106
  "@codemirror/merge": "^6.11.2",
107
107
  "@codemirror/state": "^6.5.4",
108
108
  "@codemirror/view": "^6.39.12",
109
- "@memberjunction/actions-base": "6.1.1",
110
- "@memberjunction/ai-core-plus": "6.1.1",
111
- "@memberjunction/ai-engine-base": "6.1.1",
112
- "@memberjunction/api-keys-base": "6.1.1",
113
- "@memberjunction/core": "6.1.1",
114
- "@memberjunction/core-entities": "6.1.1",
115
- "@memberjunction/credentials": "6.1.1",
116
- "@memberjunction/export-engine": "6.1.1",
117
- "@memberjunction/global": "6.1.1",
118
- "@memberjunction/graphql-dataprovider": "6.1.1",
119
- "@memberjunction/integration-engine-base": "6.1.1",
120
- "@memberjunction/interactive-component-types": "6.1.1",
121
- "@memberjunction/lists-base": "6.1.1",
122
- "@memberjunction/ng-action-gallery": "6.1.1",
123
- "@memberjunction/ng-actions": "6.1.1",
124
- "@memberjunction/ng-agent-requests": "6.1.1",
125
- "@memberjunction/ng-agents": "6.1.1",
126
- "@memberjunction/ng-ai-test-harness": "6.1.1",
127
- "@memberjunction/ng-archive-manager": "6.1.1",
128
- "@memberjunction/ng-base-application": "6.1.1",
129
- "@memberjunction/ng-base-forms": "6.1.1",
130
- "@memberjunction/ng-base-types": "6.1.1",
131
- "@memberjunction/ng-clustering": "6.1.1",
132
- "@memberjunction/ng-code-editor": "6.1.1",
133
- "@memberjunction/ng-composer": "6.1.1",
134
- "@memberjunction/ng-container-directives": "6.1.1",
135
- "@memberjunction/ng-conversations": "6.1.1",
136
- "@memberjunction/ng-core-entity-forms": "6.1.1",
137
- "@memberjunction/ng-credentials": "6.1.1",
138
- "@memberjunction/ng-dashboard-viewer": "6.1.1",
139
- "@memberjunction/ng-entity-relationship-diagram": "6.1.1",
140
- "@memberjunction/ng-entity-viewer": "6.1.1",
141
- "@memberjunction/ng-explorer-settings": "6.1.1",
142
- "@memberjunction/ng-export-service": "6.1.1",
143
- "@memberjunction/ng-filter-builder": "6.1.1",
144
- "@memberjunction/ng-list-management": "6.1.1",
145
- "@memberjunction/ng-map-view": "6.1.1",
146
- "@memberjunction/ng-markdown": "6.1.1",
147
- "@memberjunction/ng-media-player": "6.1.1",
148
- "@memberjunction/ng-notifications": "6.1.1",
149
- "@memberjunction/ng-query-viewer": "6.1.1",
150
- "@memberjunction/ng-react": "6.1.1",
151
- "@memberjunction/ng-record-process-studio": "6.1.1",
152
- "@memberjunction/ng-resource-permissions": "6.1.1",
153
- "@memberjunction/ng-scheduling": "6.1.1",
154
- "@memberjunction/ng-search": "6.1.1",
155
- "@memberjunction/ng-shared": "6.1.1",
156
- "@memberjunction/ng-shared-generic": "6.1.1",
157
- "@memberjunction/ng-task-graph-editor": "6.1.1",
158
- "@memberjunction/ng-tabstrip": "6.1.1",
159
- "@memberjunction/ng-testing": "6.1.1",
160
- "@memberjunction/ng-trees": "6.1.1",
161
- "@memberjunction/ng-ui-components": "6.1.1",
162
- "@memberjunction/ng-user-routines": "6.1.1",
163
- "@memberjunction/ng-versions": "6.1.1",
164
- "@memberjunction/ng-word-cloud": "6.1.1",
165
- "@memberjunction/predictive-studio-core": "6.1.1",
166
- "@memberjunction/tag-engine-base": "6.1.1",
167
- "@memberjunction/templates-base-types": "6.1.1",
168
- "@memberjunction/testing-engine-base": "6.1.1",
169
- "@memberjunction/theme-engine": "6.1.1",
109
+ "@memberjunction/actions-base": "6.1.3",
110
+ "@memberjunction/ai-core-plus": "6.1.3",
111
+ "@memberjunction/ai-engine-base": "6.1.3",
112
+ "@memberjunction/api-keys-base": "6.1.3",
113
+ "@memberjunction/core": "6.1.3",
114
+ "@memberjunction/core-entities": "6.1.3",
115
+ "@memberjunction/credentials": "6.1.3",
116
+ "@memberjunction/export-engine": "6.1.3",
117
+ "@memberjunction/global": "6.1.3",
118
+ "@memberjunction/graphql-dataprovider": "6.1.3",
119
+ "@memberjunction/integration-engine-base": "6.1.3",
120
+ "@memberjunction/interactive-component-types": "6.1.3",
121
+ "@memberjunction/lists-base": "6.1.3",
122
+ "@memberjunction/ng-action-gallery": "6.1.3",
123
+ "@memberjunction/ng-actions": "6.1.3",
124
+ "@memberjunction/ng-agent-requests": "6.1.3",
125
+ "@memberjunction/ng-agents": "6.1.3",
126
+ "@memberjunction/ng-ai-test-harness": "6.1.3",
127
+ "@memberjunction/ng-archive-manager": "6.1.3",
128
+ "@memberjunction/ng-base-application": "6.1.3",
129
+ "@memberjunction/ng-base-forms": "6.1.3",
130
+ "@memberjunction/ng-base-types": "6.1.3",
131
+ "@memberjunction/ng-clustering": "6.1.3",
132
+ "@memberjunction/ng-code-editor": "6.1.3",
133
+ "@memberjunction/ng-composer": "6.1.3",
134
+ "@memberjunction/ng-container-directives": "6.1.3",
135
+ "@memberjunction/ng-conversations": "6.1.3",
136
+ "@memberjunction/ng-core-entity-forms": "6.1.3",
137
+ "@memberjunction/ng-credentials": "6.1.3",
138
+ "@memberjunction/ng-dashboard-viewer": "6.1.3",
139
+ "@memberjunction/ng-entity-relationship-diagram": "6.1.3",
140
+ "@memberjunction/ng-entity-viewer": "6.1.3",
141
+ "@memberjunction/ng-explorer-settings": "6.1.3",
142
+ "@memberjunction/ng-export-service": "6.1.3",
143
+ "@memberjunction/ng-filter-builder": "6.1.3",
144
+ "@memberjunction/ng-list-management": "6.1.3",
145
+ "@memberjunction/ng-map-view": "6.1.3",
146
+ "@memberjunction/ng-markdown": "6.1.3",
147
+ "@memberjunction/ng-media-player": "6.1.3",
148
+ "@memberjunction/ng-notifications": "6.1.3",
149
+ "@memberjunction/ng-query-viewer": "6.1.3",
150
+ "@memberjunction/ng-react": "6.1.3",
151
+ "@memberjunction/ng-record-process-studio": "6.1.3",
152
+ "@memberjunction/ng-resource-permissions": "6.1.3",
153
+ "@memberjunction/ng-scheduling": "6.1.3",
154
+ "@memberjunction/ng-search": "6.1.3",
155
+ "@memberjunction/ng-shared": "6.1.3",
156
+ "@memberjunction/ng-shared-generic": "6.1.3",
157
+ "@memberjunction/ng-task-graph-editor": "6.1.3",
158
+ "@memberjunction/ng-tabstrip": "6.1.3",
159
+ "@memberjunction/ng-testing": "6.1.3",
160
+ "@memberjunction/ng-trees": "6.1.3",
161
+ "@memberjunction/ng-ui-components": "6.1.3",
162
+ "@memberjunction/ng-user-routines": "6.1.3",
163
+ "@memberjunction/ng-versions": "6.1.3",
164
+ "@memberjunction/ng-word-cloud": "6.1.3",
165
+ "@memberjunction/predictive-studio-core": "6.1.3",
166
+ "@memberjunction/tag-engine-base": "6.1.3",
167
+ "@memberjunction/templates-base-types": "6.1.3",
168
+ "@memberjunction/testing-engine-base": "6.1.3",
169
+ "@memberjunction/theme-engine": "6.1.3",
170
170
  "ag-grid-angular": "^35.0.1",
171
171
  "ag-grid-community": "^35.0.1",
172
172
  "angular-split": "^20.0.0",