@memberjunction/ng-dashboards 6.1.0-edge.2 → 6.1.0-edge.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/LICENSE +180 -4
  2. package/README.md +1 -1
  3. package/dist/AI/components/analytics/realtime/realtime-transcripts-data.d.ts.map +1 -1
  4. package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js +4 -4
  5. package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js.map +1 -1
  6. package/dist/DatabaseDesigner/services/database-designer.engine.d.ts.map +1 -1
  7. package/dist/DatabaseDesigner/services/database-designer.engine.js +5 -9
  8. package/dist/DatabaseDesigner/services/database-designer.engine.js.map +1 -1
  9. package/dist/Integration/components/activity/activity.component.d.ts +7 -1
  10. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  11. package/dist/Integration/components/activity/activity.component.js +2 -2
  12. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  13. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
  14. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +3 -0
  15. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  16. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
  17. package/dist/Integration/components/overview/overview.component.js +2 -1
  18. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  19. package/dist/Integration/components/widgets/integration-card.component.d.ts.map +1 -1
  20. package/dist/Integration/components/widgets/integration-card.component.js +8 -7
  21. package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
  22. package/dist/Integration/components/widgets/run-history-panel.component.d.ts +1 -1
  23. package/dist/Integration/components/widgets/run-history-panel.component.d.ts.map +1 -1
  24. package/dist/Integration/components/widgets/run-history-panel.component.js +6 -0
  25. package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
  26. package/dist/Integration/services/integration-data.service.d.ts +13 -3
  27. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  28. package/dist/Integration/services/integration-data.service.js +13 -2
  29. package/dist/Integration/services/integration-data.service.js.map +1 -1
  30. package/dist/Workflows/components/workflow-run-debug-state.d.ts +41 -0
  31. package/dist/Workflows/components/workflow-run-debug-state.d.ts.map +1 -0
  32. package/dist/Workflows/components/workflow-run-debug-state.js +78 -0
  33. package/dist/Workflows/components/workflow-run-debug-state.js.map +1 -0
  34. package/dist/Workflows/components/workflow-run-layout.d.ts +83 -0
  35. package/dist/Workflows/components/workflow-run-layout.d.ts.map +1 -0
  36. package/dist/Workflows/components/workflow-run-layout.js +133 -0
  37. package/dist/Workflows/components/workflow-run-layout.js.map +1 -0
  38. package/dist/Workflows/components/workflow-runs-resource.component.d.ts +146 -3
  39. package/dist/Workflows/components/workflow-runs-resource.component.d.ts.map +1 -1
  40. package/dist/Workflows/components/workflow-runs-resource.component.js +1271 -125
  41. package/dist/Workflows/components/workflow-runs-resource.component.js.map +1 -1
  42. package/dist/workflows-dashboards.module.d.ts +2 -1
  43. package/dist/workflows-dashboards.module.d.ts.map +1 -1
  44. package/dist/workflows-dashboards.module.js +6 -2
  45. package/dist/workflows-dashboards.module.js.map +1 -1
  46. package/package.json +64 -64
@@ -4,11 +4,17 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { ChangeDetectionStrategy, Component } from '@angular/core';
7
+ var WorkflowRunsResourceComponent_1;
8
+ import { ChangeDetectionStrategy, Component, HostListener, ViewChild } from '@angular/core';
8
9
  import { CompositeKey, RunView } from '@memberjunction/core';
10
+ import { UserInfoEngine } from '@memberjunction/core-entities';
11
+ import { ComputeTasksToBlock } from '@memberjunction/ai-core-plus';
9
12
  import { ParseJSONRecursive, RegisterClass, UUIDsEqual } from '@memberjunction/global';
10
13
  import { BaseDashboard, BaseResourceComponent } from '@memberjunction/ng-shared';
14
+ import { TaskGraphDebuggerComponent } from '@memberjunction/ng-task-graph-editor';
11
15
  import { SortWorkflowRuns } from './workflow-run-sorting';
16
+ import { WorkflowRunLayout } from './workflow-run-layout';
17
+ import { EmptyDebugState, ParseWorkflowRunParentBag, TryParseJsonObject, } from './workflow-run-debug-state';
12
18
  import * as i0 from "@angular/core";
13
19
  import * as i1 from "@angular/common";
14
20
  import * as i2 from "@angular/forms";
@@ -16,16 +22,19 @@ import * as i3 from "@memberjunction/ng-ui-components";
16
22
  import * as i4 from "@memberjunction/ng-shared-generic";
17
23
  import * as i5 from "@memberjunction/ng-task-graph-editor";
18
24
  import * as i6 from "@memberjunction/ng-code-editor";
25
+ import * as i7 from "angular-split";
19
26
  const _forTrack0 = ($index, $item) => $item.ID;
27
+ const _forTrack1 = ($index, $item) => $item.passNumber;
28
+ const _forTrack2 = ($index, $item) => $item.edgeId;
20
29
  function WorkflowRunsResourceComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
21
- i0.ɵɵelement(0, "mj-stat-badge", 2);
30
+ i0.ɵɵelement(0, "mj-stat-badge", 3);
22
31
  } if (rf & 2) {
23
32
  const ctx_r0 = i0.ɵɵnextContext();
24
33
  i0.ɵɵproperty("Count", ctx_r0.VisibleRuns.length)("Total", ctx_r0.Runs.length);
25
34
  } }
26
35
  function WorkflowRunsResourceComponent_For_10_Template(rf, ctx) { if (rf & 1) {
27
36
  const _r2 = i0.ɵɵgetCurrentView();
28
- i0.ɵɵelementStart(0, "button", 14);
37
+ i0.ɵɵelementStart(0, "button", 15);
29
38
  i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_For_10_Template_button_click_0_listener() { const status_r3 = i0.ɵɵrestoreView(_r2).$implicit; const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnFilterByStatus(status_r3)); });
30
39
  i0.ɵɵtext(1);
31
40
  i0.ɵɵelementEnd();
@@ -37,39 +46,39 @@ function WorkflowRunsResourceComponent_For_10_Template(rf, ctx) { if (rf & 1) {
37
46
  i0.ɵɵtextInterpolate1(" ", status_r3 === "all" ? "All" : status_r3, " ");
38
47
  } }
39
48
  function WorkflowRunsResourceComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
40
- i0.ɵɵelement(0, "mj-loading", 9);
49
+ i0.ɵɵelement(0, "mj-loading", 10);
41
50
  } }
42
51
  function WorkflowRunsResourceComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
43
- i0.ɵɵelement(0, "mj-alert", 10);
52
+ i0.ɵɵelement(0, "mj-alert", 11);
44
53
  } if (rf & 2) {
45
54
  const ctx_r0 = i0.ɵɵnextContext();
46
55
  i0.ɵɵproperty("Message", ctx_r0.LoadError);
47
56
  } }
48
57
  function WorkflowRunsResourceComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
49
- i0.ɵɵelement(0, "mj-empty-state", 11);
58
+ i0.ɵɵelement(0, "mj-empty-state", 12);
50
59
  } }
51
60
  function WorkflowRunsResourceComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
52
- i0.ɵɵelement(0, "mj-empty-state", 12);
61
+ i0.ɵɵelement(0, "mj-empty-state", 13);
53
62
  } }
54
- function WorkflowRunsResourceComponent_Conditional_16_For_19_Template(rf, ctx) { if (rf & 1) {
63
+ function WorkflowRunsResourceComponent_Conditional_16_For_20_Template(rf, ctx) { if (rf & 1) {
55
64
  const _r5 = i0.ɵɵgetCurrentView();
56
- i0.ɵɵelementStart(0, "button", 25);
57
- i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_For_19_Template_button_click_0_listener() { const run_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnSelectRun(run_r6)); });
58
- i0.ɵɵelementStart(1, "span", 26);
65
+ i0.ɵɵelementStart(0, "button", 28);
66
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_For_20_Template_button_click_0_listener() { const run_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnSelectRun(run_r6)); });
67
+ i0.ɵɵelementStart(1, "span", 29);
59
68
  i0.ɵɵtext(2);
60
69
  i0.ɵɵelementEnd();
61
- i0.ɵɵelementStart(3, "span", 27);
70
+ i0.ɵɵelementStart(3, "span", 30);
62
71
  i0.ɵɵtext(4);
63
72
  i0.ɵɵpipe(5, "date");
64
73
  i0.ɵɵelementEnd();
65
- i0.ɵɵelementStart(6, "span", 27);
74
+ i0.ɵɵelementStart(6, "span", 30);
66
75
  i0.ɵɵtext(7);
67
76
  i0.ɵɵpipe(8, "date");
68
77
  i0.ɵɵelementEnd();
69
- i0.ɵɵelementStart(9, "span", 28);
78
+ i0.ɵɵelementStart(9, "span", 31);
70
79
  i0.ɵɵtext(10);
71
80
  i0.ɵɵelementEnd();
72
- i0.ɵɵelementStart(11, "span", 29);
81
+ i0.ɵɵelementStart(11, "span", 32);
73
82
  i0.ɵɵtext(12);
74
83
  i0.ɵɵelementEnd()();
75
84
  } if (rf & 2) {
@@ -89,123 +98,689 @@ function WorkflowRunsResourceComponent_Conditional_16_For_19_Template(rf, ctx) {
89
98
  i0.ɵɵadvance();
90
99
  i0.ɵɵtextInterpolate(run_r6.Status);
91
100
  } }
92
- function WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_8_Template(rf, ctx) { if (rf & 1) {
101
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_8_Template(rf, ctx) { if (rf & 1) {
93
102
  const _r8 = i0.ɵɵgetCurrentView();
94
- i0.ɵɵelementStart(0, "button", 43);
95
- i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const selected_r9 = i0.ɵɵnextContext(); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnOpenAgentRun(selected_r9)); });
96
- i0.ɵɵelement(1, "i", 44);
103
+ i0.ɵɵelementStart(0, "button", 49);
104
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const selected_r9 = i0.ɵɵnextContext(); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnOpenAgentRun(selected_r9)); });
105
+ i0.ɵɵelement(1, "i", 50);
97
106
  i0.ɵɵtext(2, " Agent run ");
98
107
  i0.ɵɵelementEnd();
99
108
  } }
100
- function WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_18_Conditional_3_Template(rf, ctx) { if (rf & 1) {
101
- i0.ɵɵelement(0, "mj-loading", 48);
109
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_9_Template(rf, ctx) { if (rf & 1) {
110
+ const _r10 = i0.ɵɵgetCurrentView();
111
+ i0.ɵɵelementStart(0, "button", 51);
112
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_9_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.ToggleStepPanel()); });
113
+ i0.ɵɵelement(1, "i", 52);
114
+ i0.ɵɵelementEnd();
115
+ } if (rf & 2) {
116
+ const ctx_r0 = i0.ɵɵnextContext(3);
117
+ i0.ɵɵproperty("title", ctx_r0.Layout.StepPanelOpen ? "Hide step details" : "Show step details");
118
+ i0.ɵɵadvance();
119
+ i0.ɵɵclassProp("fa-square-caret-right", ctx_r0.Layout.StepPanelOpen)("fa-square-caret-left", !ctx_r0.Layout.StepPanelOpen);
120
+ } }
121
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Conditional_6_Template(rf, ctx) { if (rf & 1) {
122
+ i0.ɵɵelementStart(0, "code");
123
+ i0.ɵɵtext(1);
124
+ i0.ɵɵelementEnd();
125
+ } if (rf & 2) {
126
+ const ctx_r0 = i0.ɵɵnextContext(4);
127
+ i0.ɵɵadvance();
128
+ i0.ɵɵtextInterpolate(ctx_r0.Stall.conditionText);
129
+ } }
130
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Conditional_7_Template(rf, ctx) { if (rf & 1) {
131
+ i0.ɵɵelementStart(0, "span", 56);
132
+ i0.ɵɵtext(1);
133
+ i0.ɵɵelementEnd();
134
+ } if (rf & 2) {
135
+ const ctx_r0 = i0.ɵɵnextContext(4);
136
+ i0.ɵɵadvance();
137
+ i0.ɵɵtextInterpolate(ctx_r0.Stall.reason);
102
138
  } }
103
- function WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_18_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
139
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Conditional_8_Template(rf, ctx) { if (rf & 1) {
104
140
  const _r11 = i0.ɵɵgetCurrentView();
105
- i0.ɵɵelementStart(0, "button", 53);
106
- i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_18_Conditional_4_For_2_Template_button_click_0_listener() { const step_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnSelectStep(step_r12)); });
107
- i0.ɵɵelementStart(1, "span", 54);
141
+ i0.ɵɵelementStart(0, "div", 57)(1, "button", 58);
142
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Conditional_8_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r11); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnOverrideEdge(ctx_r0.Stall.edgeID, "true")); });
143
+ i0.ɵɵtext(2, " Answer true ");
144
+ i0.ɵɵelementEnd();
145
+ i0.ɵɵelementStart(3, "button", 59);
146
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Conditional_8_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r11); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnOverrideEdge(ctx_r0.Stall.edgeID, "false")); });
147
+ i0.ɵɵtext(4, " Answer false ");
148
+ i0.ɵɵelementEnd();
149
+ i0.ɵɵelementStart(5, "button", 49);
150
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Conditional_8_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r11); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnDismissStall()); });
151
+ i0.ɵɵtext(6, " Leave held ");
152
+ i0.ɵɵelementEnd()();
153
+ } if (rf & 2) {
154
+ const ctx_r0 = i0.ɵɵnextContext(4);
155
+ i0.ɵɵadvance();
156
+ i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
157
+ i0.ɵɵadvance(2);
158
+ i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
159
+ } }
160
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Template(rf, ctx) { if (rf & 1) {
161
+ i0.ɵɵelementStart(0, "div", 46)(1, "div", 53);
162
+ i0.ɵɵelement(2, "i", 54);
163
+ i0.ɵɵelementStart(3, "div", 55)(4, "span");
164
+ i0.ɵɵtext(5);
165
+ i0.ɵɵelementEnd();
166
+ i0.ɵɵconditionalCreate(6, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Conditional_6_Template, 2, 1, "code");
167
+ i0.ɵɵconditionalCreate(7, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Conditional_7_Template, 2, 1, "span", 56);
168
+ i0.ɵɵelementEnd()();
169
+ i0.ɵɵconditionalCreate(8, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Conditional_8_Template, 7, 2, "div", 57);
170
+ i0.ɵɵelementEnd();
171
+ } if (rf & 2) {
172
+ const ctx_r0 = i0.ɵɵnextContext(3);
173
+ i0.ɵɵattribute("data-kind", ctx_r0.Stall.kind);
174
+ i0.ɵɵadvance(5);
175
+ i0.ɵɵtextInterpolate(ctx_r0.Stall.message);
176
+ i0.ɵɵadvance();
177
+ i0.ɵɵconditional(ctx_r0.Stall.conditionText ? 6 : -1);
178
+ i0.ɵɵadvance();
179
+ i0.ɵɵconditional(ctx_r0.Stall.reason ? 7 : -1);
180
+ i0.ɵɵadvance();
181
+ i0.ɵɵconditional(ctx_r0.Stall.kind === "held" && ctx_r0.Stall.edgeID ? 8 : -1);
182
+ } }
183
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_5_Conditional_3_Template(rf, ctx) { if (rf & 1) {
184
+ const _r14 = i0.ɵɵgetCurrentView();
185
+ i0.ɵɵelementStart(0, "button", 49);
186
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_5_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnReplayReset()); });
187
+ i0.ɵɵtext(1, "Now");
188
+ i0.ɵɵelementEnd();
189
+ } }
190
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_5_Template(rf, ctx) { if (rf & 1) {
191
+ const _r13 = i0.ɵɵgetCurrentView();
192
+ i0.ɵɵelementStart(0, "div", 63);
193
+ i0.ɵɵelement(1, "i", 68);
194
+ i0.ɵɵelementStart(2, "input", 69);
195
+ i0.ɵɵlistener("input", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_5_Template_input_input_2_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnReplayScrub($event.target.value)); });
196
+ i0.ɵɵelementEnd();
197
+ i0.ɵɵconditionalCreate(3, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_5_Conditional_3_Template, 2, 0, "button", 38);
198
+ i0.ɵɵelementEnd();
199
+ } if (rf & 2) {
200
+ const ctx_r0 = i0.ɵɵnextContext(4);
201
+ i0.ɵɵadvance(2);
202
+ i0.ɵɵproperty("value", ctx_r0.ReplayPercent ?? 100);
203
+ i0.ɵɵadvance();
204
+ i0.ɵɵconditional(ctx_r0.ReplayPercent !== null ? 3 : -1);
205
+ } }
206
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_6_Conditional_1_Template(rf, ctx) { if (rf & 1) {
207
+ i0.ɵɵelementStart(0, "span", 70);
208
+ i0.ɵɵelement(1, "i", 72);
108
209
  i0.ɵɵtext(2);
109
210
  i0.ɵɵelementEnd();
110
- i0.ɵɵelementStart(3, "span", 55);
111
- i0.ɵɵtext(4);
211
+ } if (rf & 2) {
212
+ i0.ɵɵnextContext(2);
213
+ const GraphDebug_r15 = i0.ɵɵreference(4);
214
+ const ctx_r0 = i0.ɵɵnextContext(3);
215
+ i0.ɵɵadvance(2);
216
+ i0.ɵɵtextInterpolate1(" Paused at ", ctx_r0.StepName(GraphDebug_r15.PausedAtTaskID), " ");
217
+ } }
218
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_6_For_3_Template(rf, ctx) { if (rf & 1) {
219
+ const _r16 = i0.ɵɵgetCurrentView();
220
+ i0.ɵɵelementStart(0, "button", 73);
221
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_6_For_3_Template_button_click_0_listener() { const id_r17 = i0.ɵɵrestoreView(_r16).$implicit; const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnSelectBreakpoint(id_r17)); });
222
+ i0.ɵɵelement(1, "i", 74);
223
+ i0.ɵɵtext(2);
224
+ i0.ɵɵelementStart(3, "span", 75);
225
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_6_For_3_Template_span_click_3_listener($event) { const id_r17 = i0.ɵɵrestoreView(_r16).$implicit; const ctx_r0 = i0.ɵɵnextContext(5); ctx_r0.OnRemoveBreakpoint(id_r17); return i0.ɵɵresetView($event.stopPropagation()); });
226
+ i0.ɵɵtext(4, "\u00D7");
227
+ i0.ɵɵelementEnd()();
228
+ } if (rf & 2) {
229
+ const id_r17 = ctx.$implicit;
230
+ const ctx_r0 = i0.ɵɵnextContext(5);
231
+ i0.ɵɵadvance(2);
232
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.StepName(id_r17), " ");
233
+ } }
234
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_6_Template(rf, ctx) { if (rf & 1) {
235
+ i0.ɵɵelementStart(0, "div", 64);
236
+ i0.ɵɵconditionalCreate(1, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_6_Conditional_1_Template, 3, 1, "span", 70);
237
+ i0.ɵɵrepeaterCreate(2, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_6_For_3_Template, 5, 1, "button", 71, i0.ɵɵrepeaterTrackByIdentity);
112
238
  i0.ɵɵelementEnd();
113
- i0.ɵɵelementStart(5, "span", 33);
114
- i0.ɵɵtext(6);
239
+ } if (rf & 2) {
240
+ i0.ɵɵnextContext();
241
+ const GraphDebug_r15 = i0.ɵɵreference(4);
242
+ i0.ɵɵadvance();
243
+ i0.ɵɵconditional(GraphDebug_r15.PausedAtTaskID ? 1 : -1);
244
+ i0.ɵɵadvance();
245
+ i0.ɵɵrepeater(GraphDebug_r15.Breakpoints);
246
+ } }
247
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_7_For_2_Template(rf, ctx) { if (rf & 1) {
248
+ i0.ɵɵelementStart(0, "span", 78);
249
+ i0.ɵɵtext(1);
250
+ i0.ɵɵelementEnd();
251
+ } if (rf & 2) {
252
+ const tick_r18 = ctx.$implicit;
253
+ i0.ɵɵclassProp("wfr-tick-held", (tick_r18.heldCount ?? 0) > 0);
254
+ i0.ɵɵadvance();
255
+ i0.ɵɵtextInterpolate4(" #", tick_r18.passNumber, " \u00B7 ready ", tick_r18.eligibleCount ?? 0, " \u00B7 held ", tick_r18.heldCount ?? 0, " \u00B7 took ", tick_r18.claimedCount ?? 0, " ");
256
+ } }
257
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_7_Conditional_3_Template(rf, ctx) { if (rf & 1) {
258
+ i0.ɵɵelementStart(0, "span", 77);
259
+ i0.ɵɵtext(1, "\u23F8 paused \u2014 nothing new starts");
260
+ i0.ɵɵelementEnd();
261
+ } }
262
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_7_Template(rf, ctx) { if (rf & 1) {
263
+ i0.ɵɵelementStart(0, "div", 65);
264
+ i0.ɵɵrepeaterCreate(1, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_7_For_2_Template, 2, 6, "span", 76, _forTrack1);
265
+ i0.ɵɵconditionalCreate(3, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_7_Conditional_3_Template, 2, 0, "span", 77);
266
+ i0.ɵɵelementEnd();
267
+ } if (rf & 2) {
268
+ i0.ɵɵnextContext();
269
+ const GraphDebug_r15 = i0.ɵɵreference(4);
270
+ const ctx_r0 = i0.ɵɵnextContext(3);
271
+ i0.ɵɵadvance();
272
+ i0.ɵɵrepeater(ctx_r0.EngineTicks);
273
+ i0.ɵɵadvance(2);
274
+ i0.ɵɵconditional(GraphDebug_r15.Paused ? 3 : -1);
275
+ } }
276
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_10_Template(rf, ctx) { if (rf & 1) {
277
+ i0.ɵɵelement(0, "mj-loading", 67);
278
+ } }
279
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_For_2_Template(rf, ctx) { if (rf & 1) {
280
+ const _r19 = i0.ɵɵgetCurrentView();
281
+ i0.ɵɵelementStart(0, "button", 83);
282
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_For_2_Template_button_click_0_listener() { const step_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnSelectStep(step_r20)); });
283
+ i0.ɵɵelementStart(1, "span", 84);
284
+ i0.ɵɵtext(2);
285
+ i0.ɵɵelementEnd();
286
+ i0.ɵɵelementStart(3, "span", 85);
287
+ i0.ɵɵtext(4);
115
288
  i0.ɵɵelementEnd()();
116
289
  } if (rf & 2) {
117
- const step_r12 = ctx.$implicit;
290
+ const step_r20 = ctx.$implicit;
118
291
  const ctx_r0 = i0.ɵɵnextContext(5);
119
- i0.ɵɵclassProp("wfr-step-selected", step_r12.ID === ctx_r0.SelectedStepID);
120
- i0.ɵɵattribute("data-status", step_r12.Status);
292
+ i0.ɵɵclassProp("wfr-step-selected", step_r20.ID === ctx_r0.SelectedStepID);
293
+ i0.ɵɵattribute("data-status", step_r20.Status);
294
+ i0.ɵɵadvance(2);
295
+ i0.ɵɵtextInterpolate(step_r20.Name);
296
+ i0.ɵɵadvance(2);
297
+ i0.ɵɵtextInterpolate(step_r20.StepType || "Step");
298
+ } }
299
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_4_Template(rf, ctx) { if (rf & 1) {
300
+ i0.ɵɵelementStart(0, "span", 87);
301
+ i0.ɵɵtext(1);
302
+ i0.ɵɵelementEnd();
303
+ } if (rf & 2) {
304
+ const ctx_r0 = i0.ɵɵnextContext(6);
305
+ i0.ɵɵadvance();
306
+ i0.ɵɵtextInterpolate1("forced ", ctx_r0.SelectedEdgeOverride);
307
+ } }
308
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_8_Template(rf, ctx) { if (rf & 1) {
309
+ i0.ɵɵelementStart(0, "code");
310
+ i0.ɵɵtext(1);
311
+ i0.ɵɵelementEnd();
312
+ } if (rf & 2) {
313
+ const edge_r21 = i0.ɵɵnextContext();
314
+ i0.ɵɵadvance();
315
+ i0.ɵɵtextInterpolate(edge_r21.Condition);
316
+ } }
317
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_9_Template(rf, ctx) { if (rf & 1) {
318
+ i0.ɵɵelementStart(0, "span");
319
+ i0.ɵɵtext(1, "Unconditional \u2014 this path always runs.");
320
+ i0.ɵɵelementEnd();
321
+ } }
322
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_10_Conditional_5_Template(rf, ctx) { if (rf & 1) {
323
+ const _r23 = i0.ɵɵgetCurrentView();
324
+ i0.ɵɵelementStart(0, "button", 93);
325
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_10_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r23); const edge_r21 = i0.ɵɵnextContext(2); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnOverrideEdge(edge_r21.ID, null)); });
326
+ i0.ɵɵtext(1, "Clear override");
327
+ i0.ɵɵelementEnd();
328
+ } if (rf & 2) {
329
+ const ctx_r0 = i0.ɵɵnextContext(7);
330
+ i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
331
+ } }
332
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_10_Template(rf, ctx) { if (rf & 1) {
333
+ const _r22 = i0.ɵɵgetCurrentView();
334
+ i0.ɵɵelementStart(0, "div", 90)(1, "button", 58);
335
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_10_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r22); const edge_r21 = i0.ɵɵnextContext(); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnOverrideEdge(edge_r21.ID, "true")); });
336
+ i0.ɵɵtext(2, "Answer true");
337
+ i0.ɵɵelementEnd();
338
+ i0.ɵɵelementStart(3, "button", 59);
339
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_10_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r22); const edge_r21 = i0.ɵɵnextContext(); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnOverrideEdge(edge_r21.ID, "false")); });
340
+ i0.ɵɵtext(4, "Answer false");
341
+ i0.ɵɵelementEnd();
342
+ i0.ɵɵconditionalCreate(5, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_10_Conditional_5_Template, 2, 1, "button", 92);
343
+ i0.ɵɵelementEnd();
344
+ } if (rf & 2) {
345
+ const ctx_r0 = i0.ɵɵnextContext(6);
346
+ i0.ɵɵadvance();
347
+ i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
121
348
  i0.ɵɵadvance(2);
122
- i0.ɵɵtextInterpolate(step_r12.Name);
349
+ i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
123
350
  i0.ɵɵadvance(2);
124
- i0.ɵɵtextInterpolate(step_r12.StepType || "Step");
351
+ i0.ɵɵconditional(ctx_r0.SelectedEdgeOverride ? 5 : -1);
352
+ } }
353
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_11_Template(rf, ctx) { if (rf & 1) {
354
+ i0.ɵɵelementStart(0, "p", 91);
355
+ i0.ɵɵtext(1, "Skip the target step instead of overriding an unconditional path.");
356
+ i0.ɵɵelementEnd();
357
+ } }
358
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Template(rf, ctx) { if (rf & 1) {
359
+ i0.ɵɵelementStart(0, "div", 81)(1, "div", 86)(2, "span");
360
+ i0.ɵɵtext(3);
361
+ i0.ɵɵelementEnd();
362
+ i0.ɵɵconditionalCreate(4, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_4_Template, 2, 1, "span", 87);
363
+ i0.ɵɵelementEnd();
364
+ i0.ɵɵelementStart(5, "div", 88)(6, "span", 89);
365
+ i0.ɵɵtext(7, "Condition");
366
+ i0.ɵɵelementEnd();
367
+ i0.ɵɵconditionalCreate(8, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_8_Template, 2, 1, "code")(9, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_9_Template, 2, 0, "span");
368
+ i0.ɵɵelementEnd();
369
+ i0.ɵɵconditionalCreate(10, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_10_Template, 6, 3, "div", 90)(11, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Conditional_11_Template, 2, 0, "p", 91);
370
+ i0.ɵɵelementEnd();
371
+ } if (rf & 2) {
372
+ const edge_r21 = ctx;
373
+ const ctx_r0 = i0.ɵɵnextContext(5);
374
+ i0.ɵɵadvance(3);
375
+ i0.ɵɵtextInterpolate2("", ctx_r0.SelectedEdgeFromName, " \u2192 ", ctx_r0.SelectedEdgeToName);
125
376
  i0.ɵɵadvance();
126
- i0.ɵɵattribute("data-status", step_r12.Status);
377
+ i0.ɵɵconditional(ctx_r0.SelectedEdgeOverride ? 4 : -1);
378
+ i0.ɵɵadvance(4);
379
+ i0.ɵɵconditional((edge_r21.Condition == null ? null : edge_r21.Condition.trim()) ? 8 : 9);
380
+ i0.ɵɵadvance(2);
381
+ i0.ɵɵconditional(ctx_r0.SelectedEdgeIsConditional ? 10 : 11);
382
+ } }
383
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_8_Conditional_5_Template(rf, ctx) { if (rf & 1) {
384
+ i0.ɵɵtext(0);
385
+ } if (rf & 2) {
386
+ const progress_r26 = i0.ɵɵnextContext();
387
+ i0.ɵɵtextInterpolate1(" (", progress_r26.progressPercent, "%) ");
388
+ } }
389
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_8_Template(rf, ctx) { if (rf & 1) {
390
+ i0.ɵɵelementStart(0, "div", 88)(1, "span", 89);
391
+ i0.ɵɵtext(2, "Doing now");
392
+ i0.ɵɵelementEnd();
393
+ i0.ɵɵelementStart(3, "span");
394
+ i0.ɵɵtext(4);
395
+ i0.ɵɵconditionalCreate(5, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_8_Conditional_5_Template, 1, 1);
396
+ i0.ɵɵelementEnd()();
397
+ } if (rf & 2) {
398
+ const progress_r26 = ctx;
399
+ i0.ɵɵadvance(4);
400
+ i0.ɵɵtextInterpolate1("", progress_r26.progressMessage, " ");
127
401
  i0.ɵɵadvance();
128
- i0.ɵɵtextInterpolate(step_r12.Status);
402
+ i0.ɵɵconditional(progress_r26.progressPercent != null ? 5 : -1);
129
403
  } }
130
- function WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_18_Conditional_4_Conditional_3_Template(rf, ctx) { if (rf & 1) {
131
- i0.ɵɵelementStart(0, "div", 51)(1, "div", 56);
404
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_9_Case_4_Template(rf, ctx) { if (rf & 1) {
405
+ i0.ɵɵtext(0);
406
+ } if (rf & 2) {
407
+ const claim_r27 = i0.ɵɵnextContext();
408
+ i0.ɵɵtextInterpolate1(" ", claim_r27.claimedBy, " \u2014 working ");
409
+ } }
410
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_9_Case_5_Template(rf, ctx) { if (rf & 1) {
411
+ i0.ɵɵtext(0);
412
+ } if (rf & 2) {
413
+ const claim_r27 = i0.ɵɵnextContext();
414
+ i0.ɵɵtextInterpolate1(" ", claim_r27.claimedBy, " \u2014 lost, will be requeued ");
415
+ } }
416
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_9_Case_6_Template(rf, ctx) { if (rf & 1) {
417
+ i0.ɵɵtext(0, " requeued by the engine ");
418
+ } }
419
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_9_Template(rf, ctx) { if (rf & 1) {
420
+ i0.ɵɵelementStart(0, "div", 88)(1, "span", 89);
421
+ i0.ɵɵtext(2, "Worker");
422
+ i0.ɵɵelementEnd();
423
+ i0.ɵɵelementStart(3, "span");
424
+ i0.ɵɵconditionalCreate(4, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_9_Case_4_Template, 1, 1)(5, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_9_Case_5_Template, 1, 1)(6, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_9_Case_6_Template, 1, 0);
425
+ i0.ɵɵelementEnd()();
426
+ } if (rf & 2) {
427
+ let tmp_11_0;
428
+ const claim_r27 = ctx;
429
+ i0.ɵɵclassProp("wfr-insp-bad", claim_r27.claimEvent === "heartbeat-lost");
430
+ i0.ɵɵadvance(4);
431
+ i0.ɵɵconditional((tmp_11_0 = claim_r27.claimEvent) === "claimed" ? 4 : tmp_11_0 === "heartbeat-lost" ? 5 : tmp_11_0 === "reclaimed" ? 6 : -1);
432
+ } }
433
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Case_2_Template(rf, ctx) { if (rf & 1) {
434
+ i0.ɵɵtext(0, " Path taken ");
435
+ } }
436
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Case_3_Template(rf, ctx) { if (rf & 1) {
437
+ i0.ɵɵtext(0, " Path not taken ");
438
+ } }
439
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Case_4_Template(rf, ctx) { if (rf & 1) {
440
+ i0.ɵɵtext(0, " Path can't be answered ");
441
+ } }
442
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Conditional_6_Template(rf, ctx) { if (rf & 1) {
443
+ i0.ɵɵelementStart(0, "code");
444
+ i0.ɵɵtext(1);
445
+ i0.ɵɵelementEnd();
446
+ } if (rf & 2) {
447
+ const verdict_r28 = i0.ɵɵnextContext().$implicit;
448
+ i0.ɵɵadvance();
449
+ i0.ɵɵtextInterpolate(verdict_r28.conditionText);
450
+ } }
451
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Conditional_7_Template(rf, ctx) { if (rf & 1) {
452
+ i0.ɵɵtext(0);
453
+ } if (rf & 2) {
454
+ const verdict_r28 = i0.ɵɵnextContext().$implicit;
455
+ i0.ɵɵtextInterpolate1(" \u2014 ", verdict_r28.reason, " ");
456
+ } }
457
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Template(rf, ctx) { if (rf & 1) {
458
+ i0.ɵɵelementStart(0, "div", 88)(1, "span", 89);
459
+ i0.ɵɵconditionalCreate(2, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Case_2_Template, 1, 0)(3, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Case_3_Template, 1, 0)(4, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Case_4_Template, 1, 0);
460
+ i0.ɵɵelementEnd();
461
+ i0.ɵɵelementStart(5, "span");
462
+ i0.ɵɵconditionalCreate(6, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Conditional_6_Template, 2, 1, "code");
463
+ i0.ɵɵconditionalCreate(7, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Conditional_7_Template, 1, 1);
464
+ i0.ɵɵelementEnd()();
465
+ } if (rf & 2) {
466
+ let tmp_19_0;
467
+ const verdict_r28 = ctx.$implicit;
468
+ i0.ɵɵattribute("data-verdict", verdict_r28.verdict);
469
+ i0.ɵɵadvance(2);
470
+ i0.ɵɵconditional((tmp_19_0 = verdict_r28.verdict) === "satisfied" ? 2 : tmp_19_0 === "notTaken" ? 3 : tmp_19_0 === "held" ? 4 : -1);
471
+ i0.ɵɵadvance(4);
472
+ i0.ɵɵconditional(verdict_r28.conditionText ? 6 : -1);
473
+ i0.ɵɵadvance();
474
+ i0.ɵɵconditional(verdict_r28.reason ? 7 : -1);
475
+ } }
476
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_12_Template(rf, ctx) { if (rf & 1) {
477
+ i0.ɵɵelementStart(0, "div", 88)(1, "span", 89);
478
+ i0.ɵɵtext(2, "If this step fails");
479
+ i0.ɵɵelementEnd();
480
+ i0.ɵɵelementStart(3, "span");
481
+ i0.ɵɵtext(4);
482
+ i0.ɵɵelementEnd()();
483
+ } if (rf & 2) {
484
+ const whatIf_r29 = ctx;
485
+ i0.ɵɵadvance(4);
486
+ i0.ɵɵtextInterpolate2("", whatIf_r29.BlockedCount, " step", whatIf_r29.BlockedCount === 1 ? "" : "s", " can no longer run");
487
+ } }
488
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_1_Template(rf, ctx) { if (rf & 1) {
489
+ const _r30 = i0.ɵɵgetCurrentView();
490
+ i0.ɵɵelementStart(0, "button", 103);
491
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r30); const step_r25 = i0.ɵɵnextContext(2); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnSkipStep(step_r25)); });
492
+ i0.ɵɵelement(1, "i", 104);
493
+ i0.ɵɵtext(2, " Skip step ");
494
+ i0.ɵɵelementEnd();
495
+ } if (rf & 2) {
496
+ const ctx_r0 = i0.ɵɵnextContext(7);
497
+ i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
498
+ } }
499
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_2_Template(rf, ctx) { if (rf & 1) {
500
+ const _r31 = i0.ɵɵgetCurrentView();
501
+ i0.ɵɵelementStart(0, "button", 59);
502
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r31); const step_r25 = i0.ɵɵnextContext(2); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OpenEditInput(step_r25)); });
503
+ i0.ɵɵelement(1, "i", 105);
132
504
  i0.ɵɵtext(2);
133
505
  i0.ɵɵelementEnd();
134
- i0.ɵɵelement(3, "mj-code-editor", 57);
506
+ } if (rf & 2) {
507
+ const step_r25 = i0.ɵɵnextContext(2);
508
+ const ctx_r0 = i0.ɵɵnextContext(5);
509
+ i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
510
+ i0.ɵɵadvance(2);
511
+ i0.ɵɵtextInterpolate1(" ", step_r25.Status === "Failed" ? "Edit input & retry" : "Edit input", " ");
512
+ } }
513
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_3_Template(rf, ctx) { if (rf & 1) {
514
+ const _r32 = i0.ɵɵgetCurrentView();
515
+ i0.ɵɵelementStart(0, "button", 59);
516
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r32); const step_r25 = i0.ɵɵnextContext(2); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnRetryStep(step_r25)); });
517
+ i0.ɵɵelement(1, "i", 106);
518
+ i0.ɵɵtext(2, " Retry ");
519
+ i0.ɵɵelementEnd();
520
+ } if (rf & 2) {
521
+ const ctx_r0 = i0.ɵɵnextContext(7);
522
+ i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
523
+ } }
524
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_4_Template(rf, ctx) { if (rf & 1) {
525
+ const _r33 = i0.ɵɵgetCurrentView();
526
+ i0.ɵɵelementStart(0, "button", 107);
527
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r33); const step_r25 = i0.ɵɵnextContext(2); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OpenForceComplete(step_r25)); });
528
+ i0.ɵɵelement(1, "i", 108);
529
+ i0.ɵɵtext(2, " Force complete ");
530
+ i0.ɵɵelementEnd();
531
+ } if (rf & 2) {
532
+ const ctx_r0 = i0.ɵɵnextContext(7);
533
+ i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
534
+ } }
535
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Template(rf, ctx) { if (rf & 1) {
536
+ i0.ɵɵelementStart(0, "div", 90);
537
+ i0.ɵɵconditionalCreate(1, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_1_Template, 3, 1, "button", 100);
538
+ i0.ɵɵconditionalCreate(2, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_2_Template, 3, 2, "button", 101);
539
+ i0.ɵɵconditionalCreate(3, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_3_Template, 3, 1, "button", 101);
540
+ i0.ɵɵconditionalCreate(4, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Conditional_4_Template, 3, 1, "button", 102);
135
541
  i0.ɵɵelementEnd();
136
542
  } if (rf & 2) {
543
+ const step_r25 = i0.ɵɵnextContext();
137
544
  const ctx_r0 = i0.ɵɵnextContext(5);
545
+ i0.ɵɵadvance();
546
+ i0.ɵɵconditional(step_r25.Status === "Pending" ? 1 : -1);
547
+ i0.ɵɵadvance();
548
+ i0.ɵɵconditional(ctx_r0.CanEditInput(step_r25) ? 2 : -1);
549
+ i0.ɵɵadvance();
550
+ i0.ɵɵconditional(step_r25.Status === "Failed" ? 3 : -1);
551
+ i0.ɵɵadvance();
552
+ i0.ɵɵconditional(ctx_r0.CanForceComplete(step_r25) ? 4 : -1);
553
+ } }
554
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_14_Conditional_6_Template(rf, ctx) { if (rf & 1) {
555
+ i0.ɵɵelementStart(0, "span", 110);
556
+ i0.ɵɵtext(1);
557
+ i0.ɵɵelementEnd();
558
+ } if (rf & 2) {
559
+ const ctx_r0 = i0.ɵɵnextContext(7);
560
+ i0.ɵɵadvance();
561
+ i0.ɵɵtextInterpolate(ctx_r0.EditInputError);
562
+ } }
563
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_14_Template(rf, ctx) { if (rf & 1) {
564
+ const _r34 = i0.ɵɵgetCurrentView();
565
+ i0.ɵɵelementStart(0, "div", 97)(1, "span", 89);
566
+ i0.ɵɵtext(2);
567
+ i0.ɵɵelementEnd();
568
+ i0.ɵɵelementStart(3, "p", 91);
569
+ i0.ɵɵtext(4, "Applies to this run only. Invalid JSON is refused here.");
570
+ i0.ɵɵelementEnd();
571
+ i0.ɵɵelementStart(5, "textarea", 109);
572
+ i0.ɵɵtwoWayListener("ngModelChange", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_14_Template_textarea_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r0 = i0.ɵɵnextContext(6); i0.ɵɵtwoWayBindingSet(ctx_r0.EditInputJson, $event) || (ctx_r0.EditInputJson = $event); return i0.ɵɵresetView($event); });
573
+ i0.ɵɵelementEnd();
574
+ i0.ɵɵconditionalCreate(6, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_14_Conditional_6_Template, 2, 1, "span", 110);
575
+ i0.ɵɵelementStart(7, "div", 90)(8, "button", 58);
576
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_14_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r34); const step_r25 = i0.ɵɵnextContext(); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.SubmitEditInput(step_r25)); });
577
+ i0.ɵɵtext(9);
578
+ i0.ɵɵelementEnd();
579
+ i0.ɵɵelementStart(10, "button", 49);
580
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_14_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r34); const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.EditInputOpen = false); });
581
+ i0.ɵɵtext(11, "Cancel");
582
+ i0.ɵɵelementEnd()()();
583
+ } if (rf & 2) {
584
+ const step_r25 = i0.ɵɵnextContext();
585
+ const ctx_r0 = i0.ɵɵnextContext(5);
586
+ i0.ɵɵadvance(2);
587
+ i0.ɵɵtextInterpolate(step_r25.Status === "Failed" ? "Edit input and retry" : "Edit input");
588
+ i0.ɵɵadvance(3);
589
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r0.EditInputJson);
590
+ i0.ɵɵadvance();
591
+ i0.ɵɵconditional(ctx_r0.EditInputError ? 6 : -1);
138
592
  i0.ɵɵadvance(2);
139
- i0.ɵɵtextInterpolate(ctx.Name);
593
+ i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
594
+ i0.ɵɵadvance();
595
+ i0.ɵɵtextInterpolate1(" ", step_r25.Status === "Failed" ? "Apply & retry" : "Apply", " ");
596
+ } }
597
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_15_Conditional_7_Template(rf, ctx) { if (rf & 1) {
598
+ i0.ɵɵelementStart(0, "span", 110);
599
+ i0.ɵɵtext(1);
600
+ i0.ɵɵelementEnd();
601
+ } if (rf & 2) {
602
+ const ctx_r0 = i0.ɵɵnextContext(7);
140
603
  i0.ɵɵadvance();
141
- i0.ɵɵproperty("ngModel", ctx_r0.SelectedStepJson)("language", "json")("readonly", true);
604
+ i0.ɵɵtextInterpolate(ctx_r0.ForceCompleteError);
142
605
  } }
143
- function WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_18_Conditional_4_Conditional_4_Template(rf, ctx) { if (rf & 1) {
144
- i0.ɵɵelement(0, "mj-empty-state", 52);
606
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_15_Template(rf, ctx) { if (rf & 1) {
607
+ const _r35 = i0.ɵɵgetCurrentView();
608
+ i0.ɵɵelementStart(0, "div", 98)(1, "span", 89);
609
+ i0.ɵɵtext(2, "Force complete");
610
+ i0.ɵɵelementEnd();
611
+ i0.ɵɵelementStart(3, "p", 91);
612
+ i0.ɵɵtext(4, "Downstream conditions will evaluate against this output as if the step had produced it. Type the step name to confirm.");
613
+ i0.ɵɵelementEnd();
614
+ i0.ɵɵelementStart(5, "textarea", 111);
615
+ i0.ɵɵtwoWayListener("ngModelChange", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_15_Template_textarea_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r35); const ctx_r0 = i0.ɵɵnextContext(6); i0.ɵɵtwoWayBindingSet(ctx_r0.ForceCompleteJson, $event) || (ctx_r0.ForceCompleteJson = $event); return i0.ɵɵresetView($event); });
616
+ i0.ɵɵelementEnd();
617
+ i0.ɵɵelementStart(6, "input", 112);
618
+ i0.ɵɵtwoWayListener("ngModelChange", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_15_Template_input_ngModelChange_6_listener($event) { i0.ɵɵrestoreView(_r35); const ctx_r0 = i0.ɵɵnextContext(6); i0.ɵɵtwoWayBindingSet(ctx_r0.ForceCompleteName, $event) || (ctx_r0.ForceCompleteName = $event); return i0.ɵɵresetView($event); });
619
+ i0.ɵɵelementEnd();
620
+ i0.ɵɵconditionalCreate(7, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_15_Conditional_7_Template, 2, 1, "span", 110);
621
+ i0.ɵɵelementStart(8, "div", 90)(9, "button", 107);
622
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_15_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r35); const step_r25 = i0.ɵɵnextContext(); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.SubmitForceComplete(step_r25)); });
623
+ i0.ɵɵtext(10, "Force complete");
624
+ i0.ɵɵelementEnd();
625
+ i0.ɵɵelementStart(11, "button", 49);
626
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_15_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r35); const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.ForceCompleteOpen = false); });
627
+ i0.ɵɵtext(12, "Cancel");
628
+ i0.ɵɵelementEnd()()();
629
+ } if (rf & 2) {
630
+ const step_r25 = i0.ɵɵnextContext();
631
+ const ctx_r0 = i0.ɵɵnextContext(5);
632
+ i0.ɵɵadvance(5);
633
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r0.ForceCompleteJson);
634
+ i0.ɵɵadvance();
635
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r0.ForceCompleteName);
636
+ i0.ɵɵproperty("placeholder", "Type \u201C" + step_r25.Name + "\u201D to confirm");
637
+ i0.ɵɵadvance();
638
+ i0.ɵɵconditional(ctx_r0.ForceCompleteError ? 7 : -1);
639
+ i0.ɵɵadvance(2);
640
+ i0.ɵɵproperty("disabled", ctx_r0.ControlBusy);
145
641
  } }
146
- function WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_18_Conditional_4_Template(rf, ctx) { if (rf & 1) {
147
- i0.ɵɵelementStart(0, "div", 49);
148
- i0.ɵɵrepeaterCreate(1, WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_18_Conditional_4_For_2_Template, 7, 7, "button", 50, _forTrack0);
642
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Template(rf, ctx) { if (rf & 1) {
643
+ const _r24 = i0.ɵɵgetCurrentView();
644
+ i0.ɵɵelementStart(0, "div", 81)(1, "div", 86)(2, "span");
645
+ i0.ɵɵtext(3);
646
+ i0.ɵɵelementEnd();
647
+ i0.ɵɵelementStart(4, "span", 36);
648
+ i0.ɵɵtext(5);
649
+ i0.ɵɵelementEnd()();
650
+ i0.ɵɵelementStart(6, "button", 94);
651
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Template_button_click_6_listener() { const step_r25 = i0.ɵɵrestoreView(_r24); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnBreakpointToggled({ TaskID: step_r25.ID, Enabled: !ctx_r0.HasBreakpoint(step_r25.ID) })); });
652
+ i0.ɵɵelement(7, "i", 95);
653
+ i0.ɵɵelementEnd();
654
+ i0.ɵɵconditionalCreate(8, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_8_Template, 6, 2, "div", 88);
655
+ i0.ɵɵconditionalCreate(9, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_9_Template, 7, 3, "div", 96);
656
+ i0.ɵɵrepeaterCreate(10, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_For_11_Template, 8, 4, "div", 88, _forTrack2);
657
+ i0.ɵɵconditionalCreate(12, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_12_Template, 5, 2, "div", 88);
658
+ i0.ɵɵconditionalCreate(13, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_13_Template, 5, 4, "div", 90);
659
+ i0.ɵɵconditionalCreate(14, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_14_Template, 12, 5, "div", 97);
660
+ i0.ɵɵconditionalCreate(15, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Conditional_15_Template, 13, 5, "div", 98);
661
+ i0.ɵɵelement(16, "mj-task-graph-variables", 99);
149
662
  i0.ɵɵelementEnd();
150
- i0.ɵɵconditionalCreate(3, WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_18_Conditional_4_Conditional_3_Template, 4, 4, "div", 51)(4, WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_18_Conditional_4_Conditional_4_Template, 1, 0, "mj-empty-state", 52);
151
663
  } if (rf & 2) {
152
- let tmp_6_0;
664
+ let tmp_17_0;
665
+ let tmp_18_0;
666
+ let tmp_20_0;
667
+ const step_r25 = ctx;
668
+ const ctx_r0 = i0.ɵɵnextContext(5);
669
+ i0.ɵɵadvance(3);
670
+ i0.ɵɵtextInterpolate(step_r25.Name);
671
+ i0.ɵɵadvance();
672
+ i0.ɵɵattribute("data-status", step_r25.Status);
673
+ i0.ɵɵadvance();
674
+ i0.ɵɵtextInterpolate(step_r25.Status);
675
+ i0.ɵɵadvance();
676
+ i0.ɵɵclassProp("wfr-bp-on", ctx_r0.HasBreakpoint(step_r25.ID));
677
+ i0.ɵɵproperty("disabled", ctx_r0.ControlBusy)("title", ctx_r0.HasBreakpoint(step_r25.ID) ? "Remove breakpoint" : "Break before this step");
678
+ i0.ɵɵattribute("aria-pressed", ctx_r0.HasBreakpoint(step_r25.ID));
679
+ i0.ɵɵadvance();
680
+ i0.ɵɵclassProp("fa-solid", ctx_r0.HasBreakpoint(step_r25.ID))("fa-regular", !ctx_r0.HasBreakpoint(step_r25.ID));
681
+ i0.ɵɵadvance();
682
+ i0.ɵɵconditional((tmp_17_0 = ctx_r0.SelectedStepProgress) ? 8 : -1, tmp_17_0);
683
+ i0.ɵɵadvance();
684
+ i0.ɵɵconditional((tmp_18_0 = ctx_r0.SelectedStepClaim) ? 9 : -1, tmp_18_0);
685
+ i0.ɵɵadvance();
686
+ i0.ɵɵrepeater(ctx_r0.SelectedStepVerdicts);
687
+ i0.ɵɵadvance(2);
688
+ i0.ɵɵconditional((tmp_20_0 = ctx_r0.SelectedStepWhatIf) ? 12 : -1, tmp_20_0);
689
+ i0.ɵɵadvance();
690
+ i0.ɵɵconditional(step_r25.Status === "Pending" || step_r25.Status === "Failed" || ctx_r0.CanForceComplete(step_r25) ? 13 : -1);
691
+ i0.ɵɵadvance();
692
+ i0.ɵɵconditional(ctx_r0.EditInputOpen ? 14 : -1);
693
+ i0.ɵɵadvance();
694
+ i0.ɵɵconditional(ctx_r0.ForceCompleteOpen ? 15 : -1);
695
+ i0.ɵɵadvance();
696
+ i0.ɵɵproperty("InputPayload", ctx_r0.StepPayload(step_r25, "InputPayload"))("OutputPayload", ctx_r0.StepPayload(step_r25, "OutputPayload"))("Invocation", ctx_r0.Invocation);
697
+ } }
698
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_5_Template(rf, ctx) { if (rf & 1) {
699
+ i0.ɵɵelement(0, "mj-empty-state", 82);
700
+ } }
701
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Template(rf, ctx) { if (rf & 1) {
702
+ i0.ɵɵelementStart(0, "div", 79);
703
+ i0.ɵɵrepeaterCreate(1, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_For_2_Template, 5, 5, "button", 80, _forTrack0);
704
+ i0.ɵɵelementEnd();
705
+ i0.ɵɵconditionalCreate(3, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_3_Template, 12, 5, "div", 81)(4, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_4_Template, 17, 21, "div", 81)(5, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Conditional_5_Template, 1, 0, "mj-empty-state", 82);
706
+ } if (rf & 2) {
707
+ let tmp_7_0;
153
708
  const ctx_r0 = i0.ɵɵnextContext(4);
154
709
  i0.ɵɵadvance();
155
710
  i0.ɵɵrepeater(ctx_r0.SelectedSteps);
156
711
  i0.ɵɵadvance(2);
157
- i0.ɵɵconditional((tmp_6_0 = ctx_r0.SelectedStep) ? 3 : 4, tmp_6_0);
712
+ i0.ɵɵconditional((tmp_7_0 = ctx_r0.InspectorMode === "edge" && ctx_r0.SelectedEdge) ? 3 : (tmp_7_0 = ctx_r0.SelectedStep) ? 4 : 5, tmp_7_0);
158
713
  } }
159
- function WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_18_Template(rf, ctx) { if (rf & 1) {
160
- const _r10 = i0.ɵɵgetCurrentView();
161
- i0.ɵɵelementStart(0, "div", 45)(1, "mj-task-graph-run-view", 46);
162
- i0.ɵɵlistener("NodeSelected", function WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_18_Template_mj_task_graph_run_view_NodeSelected_1_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnGraphNodeSelected($event)); });
163
- i0.ɵɵelementEnd()();
164
- i0.ɵɵelementStart(2, "div", 47);
165
- i0.ɵɵconditionalCreate(3, WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_18_Conditional_3_Template, 1, 0, "mj-loading", 48)(4, WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_18_Conditional_4_Template, 5, 1);
714
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Template(rf, ctx) { if (rf & 1) {
715
+ const _r12 = i0.ɵɵgetCurrentView();
716
+ i0.ɵɵelementStart(0, "as-split", 60);
717
+ i0.ɵɵlistener("dragEnd", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Template_as_split_dragEnd_0_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnStepSplitDragEnd($event.sizes)); });
718
+ i0.ɵɵelementStart(1, "as-split-area", 17)(2, "div", 61)(3, "mj-task-graph-debugger", 62, 0);
719
+ i0.ɵɵlistener("NodeSelected", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Template_mj_task_graph_debugger_NodeSelected_3_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnGraphNodeSelected($event)); })("ConnectionSelected", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Template_mj_task_graph_debugger_ConnectionSelected_3_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnGraphConnectionSelected($event)); })("LegendToggled", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Template_mj_task_graph_debugger_LegendToggled_3_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnLegendToggled($event)); })("Settled", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Template_mj_task_graph_debugger_Settled_3_listener() { i0.ɵɵrestoreView(_r12); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnCanvasSettled()); })("Frame", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Template_mj_task_graph_debugger_Frame_3_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnFrame($event)); })("PausedChange", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Template_mj_task_graph_debugger_PausedChange_3_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.DebugPaused = $event); });
166
720
  i0.ɵɵelementEnd();
721
+ i0.ɵɵconditionalCreate(5, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_5_Template, 4, 2, "div", 63);
722
+ i0.ɵɵconditionalCreate(6, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_6_Template, 4, 1, "div", 64);
723
+ i0.ɵɵconditionalCreate(7, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_7_Template, 4, 1, "div", 65);
724
+ i0.ɵɵelementEnd()();
725
+ i0.ɵɵelementStart(8, "as-split-area", 26)(9, "div", 66);
726
+ i0.ɵɵconditionalCreate(10, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_10_Template, 1, 0, "mj-loading", 67)(11, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Conditional_11_Template, 6, 1);
727
+ i0.ɵɵelementEnd()()();
167
728
  } if (rf & 2) {
729
+ const GraphDebug_r15 = i0.ɵɵreference(4);
168
730
  const selected_r9 = i0.ɵɵnextContext();
169
731
  const ctx_r0 = i0.ɵɵnextContext(2);
732
+ i0.ɵɵproperty("direction", ctx_r0.InnerSplitDirection)("gutterSize", 8);
170
733
  i0.ɵɵadvance();
171
- i0.ɵɵproperty("Provider", ctx_r0.ProviderToUse)("ParentTaskID", selected_r9.ID)("WorkflowName", selected_r9.Name)("LiveUpdates", selected_r9.Status === "Running" || selected_r9.Status === "In Progress");
734
+ i0.ɵɵproperty("size", ctx_r0.Layout.StepPanelOpen ? ctx_r0.Layout.StepSplitSizes[0] : 100)("minSize", 25);
735
+ i0.ɵɵadvance(2);
736
+ i0.ɵɵproperty("Provider", ctx_r0.ProviderToUse)("ParentTaskID", selected_r9.ID)("WorkflowName", selected_r9.Name)("LiveUpdates", selected_r9.Status === "Running" || selected_r9.Status === "In Progress")("ReplayAt", ctx_r0.ReplayAt)("ShowLegend", ctx_r0.Layout.ShowLegend);
172
737
  i0.ɵɵadvance(2);
173
- i0.ɵɵconditional(ctx_r0.StepsLoading ? 3 : 4);
738
+ i0.ɵɵconditional(ctx_r0.CanReplay ? 5 : -1);
739
+ i0.ɵɵadvance();
740
+ i0.ɵɵconditional(GraphDebug_r15.Breakpoints.length > 0 || GraphDebug_r15.PausedAtTaskID ? 6 : -1);
741
+ i0.ɵɵadvance();
742
+ i0.ɵɵconditional(ctx_r0.EngineTicks.length > 0 ? 7 : -1);
743
+ i0.ɵɵadvance();
744
+ i0.ɵɵproperty("size", ctx_r0.Layout.StepPanelOpen ? ctx_r0.Layout.StepSplitSizes[1] : 0)("minSize", 20)("visible", ctx_r0.Layout.StepPanelOpen);
745
+ i0.ɵɵadvance(2);
746
+ i0.ɵɵconditional(ctx_r0.StepsLoading ? 10 : 11);
174
747
  } }
175
- function WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_19_Template(rf, ctx) { if (rf & 1) {
176
- i0.ɵɵelementStart(0, "div", 42);
177
- i0.ɵɵelement(1, "mj-code-editor", 57);
748
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_21_Template(rf, ctx) { if (rf & 1) {
749
+ i0.ɵɵelementStart(0, "div", 48);
750
+ i0.ɵɵelement(1, "mj-code-editor", 113);
178
751
  i0.ɵɵelementEnd();
179
752
  } if (rf & 2) {
180
753
  const ctx_r0 = i0.ɵɵnextContext(3);
181
754
  i0.ɵɵadvance();
182
755
  i0.ɵɵproperty("ngModel", ctx_r0.SelectedRunJson)("language", "json")("readonly", true);
183
756
  } }
184
- function WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Template(rf, ctx) { if (rf & 1) {
757
+ function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Template(rf, ctx) { if (rf & 1) {
185
758
  const _r7 = i0.ɵɵgetCurrentView();
186
- i0.ɵɵelementStart(0, "aside", 24)(1, "header", 30)(2, "div", 31)(3, "span", 32);
759
+ i0.ɵɵelementStart(0, "aside", 27)(1, "header", 33)(2, "div", 34)(3, "span", 35);
187
760
  i0.ɵɵtext(4);
188
761
  i0.ɵɵelementEnd();
189
- i0.ɵɵelementStart(5, "span", 33);
762
+ i0.ɵɵelementStart(5, "span", 36);
190
763
  i0.ɵɵtext(6);
191
764
  i0.ɵɵelementEnd()();
192
- i0.ɵɵelementStart(7, "div", 34);
193
- i0.ɵɵconditionalCreate(8, WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_8_Template, 3, 0, "button", 35);
194
- i0.ɵɵelementStart(9, "button", 36);
195
- i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Template_button_click_9_listener() { const selected_r9 = i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnSelectRun(selected_r9)); });
196
- i0.ɵɵelement(10, "i", 37);
765
+ i0.ɵɵelementStart(7, "div", 37);
766
+ i0.ɵɵconditionalCreate(8, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_8_Template, 3, 0, "button", 38);
767
+ i0.ɵɵconditionalCreate(9, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_9_Template, 2, 5, "button", 39);
768
+ i0.ɵɵelementStart(10, "button", 40);
769
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Template_button_click_10_listener() { const selected_r9 = i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnSelectRun(selected_r9)); });
770
+ i0.ɵɵelement(11, "i", 41);
197
771
  i0.ɵɵelementEnd()()();
198
- i0.ɵɵelementStart(11, "div", 38)(12, "button", 39);
199
- i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnDetailTab("graph")); });
200
- i0.ɵɵelement(13, "i", 40);
201
- i0.ɵɵtext(14, " Workflow ");
202
- i0.ɵɵelementEnd();
203
- i0.ɵɵelementStart(15, "button", 39);
204
- i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnDetailTab("json")); });
205
- i0.ɵɵelement(16, "i", 41);
206
- i0.ɵɵtext(17, " JSON ");
772
+ i0.ɵɵelementStart(12, "div", 42)(13, "button", 43);
773
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnDetailTab("graph")); });
774
+ i0.ɵɵelement(14, "i", 44);
775
+ i0.ɵɵtext(15, " Workflow ");
776
+ i0.ɵɵelementEnd();
777
+ i0.ɵɵelementStart(16, "button", 43);
778
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnDetailTab("json")); });
779
+ i0.ɵɵelement(17, "i", 45);
780
+ i0.ɵɵtext(18, " JSON ");
207
781
  i0.ɵɵelementEnd()();
208
- i0.ɵɵconditionalCreate(18, WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_18_Template, 5, 5)(19, WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Conditional_19_Template, 2, 3, "div", 42);
782
+ i0.ɵɵconditionalCreate(19, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_19_Template, 9, 5, "div", 46);
783
+ i0.ɵɵconditionalCreate(20, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_20_Template, 12, 17, "as-split", 47)(21, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Conditional_21_Template, 2, 3, "div", 48);
209
784
  i0.ɵɵelementEnd();
210
785
  } if (rf & 2) {
211
786
  const selected_r9 = ctx;
@@ -218,48 +793,57 @@ function WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Template(rf
218
793
  i0.ɵɵtextInterpolate(selected_r9.Status);
219
794
  i0.ɵɵadvance(2);
220
795
  i0.ɵɵconditional(selected_r9.AgentRunID ? 8 : -1);
796
+ i0.ɵɵadvance();
797
+ i0.ɵɵconditional(ctx_r0.DetailTab === "graph" ? 9 : -1);
221
798
  i0.ɵɵadvance(4);
222
799
  i0.ɵɵclassProp("wfr-tab-active", ctx_r0.DetailTab === "graph");
223
800
  i0.ɵɵadvance(3);
224
801
  i0.ɵɵclassProp("wfr-tab-active", ctx_r0.DetailTab === "json");
225
802
  i0.ɵɵadvance(3);
226
- i0.ɵɵconditional(ctx_r0.DetailTab === "graph" ? 18 : 19);
803
+ i0.ɵɵconditional(ctx_r0.Stall ? 19 : -1);
804
+ i0.ɵɵadvance();
805
+ i0.ɵɵconditional(ctx_r0.DetailTab === "graph" ? 20 : 21);
227
806
  } }
228
807
  function WorkflowRunsResourceComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
229
808
  const _r4 = i0.ɵɵgetCurrentView();
230
- i0.ɵɵelementStart(0, "div", 15)(1, "div", 16)(2, "div", 17)(3, "button", 18);
231
- i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSort("Name")); });
232
- i0.ɵɵtext(4, " Workflow ");
233
- i0.ɵɵelement(5, "i", 19);
234
- i0.ɵɵelementEnd();
235
- i0.ɵɵelementStart(6, "button", 20);
236
- i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSort("StartedAt")); });
237
- i0.ɵɵtext(7, " Started ");
238
- i0.ɵɵelement(8, "i", 19);
239
- i0.ɵɵelementEnd();
240
- i0.ɵɵelementStart(9, "button", 20);
241
- i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSort("CompletedAt")); });
242
- i0.ɵɵtext(10, " Ended ");
243
- i0.ɵɵelement(11, "i", 19);
244
- i0.ɵɵelementEnd();
245
- i0.ɵɵelementStart(12, "button", 21);
246
- i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSort("Duration")); });
247
- i0.ɵɵtext(13, " Duration ");
248
- i0.ɵɵelement(14, "i", 19);
249
- i0.ɵɵelementEnd();
250
- i0.ɵɵelementStart(15, "button", 22);
251
- i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSort("Status")); });
252
- i0.ɵɵtext(16, " Status ");
253
- i0.ɵɵelement(17, "i", 19);
254
- i0.ɵɵelementEnd()();
255
- i0.ɵɵrepeaterCreate(18, WorkflowRunsResourceComponent_Conditional_16_For_19_Template, 13, 14, "button", 23, _forTrack0);
809
+ i0.ɵɵelementStart(0, "as-split", 16);
810
+ i0.ɵɵlistener("dragEnd", function WorkflowRunsResourceComponent_Conditional_16_Template_as_split_dragEnd_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSplitDragEnd($event.sizes)); });
811
+ i0.ɵɵelementStart(1, "as-split-area", 17)(2, "div", 18)(3, "div", 19)(4, "button", 20);
812
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSort("Name")); });
813
+ i0.ɵɵtext(5, " Workflow ");
814
+ i0.ɵɵelement(6, "i", 21);
815
+ i0.ɵɵelementEnd();
816
+ i0.ɵɵelementStart(7, "button", 22);
817
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSort("StartedAt")); });
818
+ i0.ɵɵtext(8, " Started ");
819
+ i0.ɵɵelement(9, "i", 21);
256
820
  i0.ɵɵelementEnd();
257
- i0.ɵɵconditionalCreate(20, WorkflowRunsResourceComponent_Conditional_16_Conditional_20_Template, 20, 9, "aside", 24);
821
+ i0.ɵɵelementStart(10, "button", 22);
822
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSort("CompletedAt")); });
823
+ i0.ɵɵtext(11, " Ended ");
824
+ i0.ɵɵelement(12, "i", 21);
258
825
  i0.ɵɵelementEnd();
826
+ i0.ɵɵelementStart(13, "button", 23);
827
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSort("Duration")); });
828
+ i0.ɵɵtext(14, " Duration ");
829
+ i0.ɵɵelement(15, "i", 21);
830
+ i0.ɵɵelementEnd();
831
+ i0.ɵɵelementStart(16, "button", 24);
832
+ i0.ɵɵlistener("click", function WorkflowRunsResourceComponent_Conditional_16_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnSort("Status")); });
833
+ i0.ɵɵtext(17, " Status ");
834
+ i0.ɵɵelement(18, "i", 21);
835
+ i0.ɵɵelementEnd()();
836
+ i0.ɵɵrepeaterCreate(19, WorkflowRunsResourceComponent_Conditional_16_For_20_Template, 13, 14, "button", 25, _forTrack0);
837
+ i0.ɵɵelementEnd()();
838
+ i0.ɵɵelementStart(21, "as-split-area", 26);
839
+ i0.ɵɵconditionalCreate(22, WorkflowRunsResourceComponent_Conditional_16_Conditional_22_Template, 22, 11, "aside", 27);
840
+ i0.ɵɵelementEnd()();
259
841
  } if (rf & 2) {
260
- let tmp_8_0;
842
+ let tmp_14_0;
261
843
  const ctx_r0 = i0.ɵɵnextContext();
262
- i0.ɵɵclassProp("wfr-split-open", ctx_r0.SelectedRun);
844
+ i0.ɵɵproperty("gutterSize", 8)("disabled", !ctx_r0.SelectedRun);
845
+ i0.ɵɵadvance();
846
+ i0.ɵɵproperty("size", ctx_r0.SelectedRun ? ctx_r0.Layout.SplitSizes[0] : 100)("minSize", 20);
263
847
  i0.ɵɵadvance(5);
264
848
  i0.ɵɵproperty("ngClass", ctx_r0.SortIcon("Name"));
265
849
  i0.ɵɵadvance(3);
@@ -273,8 +857,12 @@ function WorkflowRunsResourceComponent_Conditional_16_Template(rf, ctx) { if (rf
273
857
  i0.ɵɵadvance();
274
858
  i0.ɵɵrepeater(ctx_r0.VisibleRuns);
275
859
  i0.ɵɵadvance(2);
276
- i0.ɵɵconditional((tmp_8_0 = ctx_r0.SelectedRun) ? 20 : -1, tmp_8_0);
860
+ i0.ɵɵproperty("size", ctx_r0.SelectedRun ? ctx_r0.Layout.SplitSizes[1] : 0)("minSize", 25)("visible", !!ctx_r0.SelectedRun);
861
+ i0.ɵɵadvance();
862
+ i0.ɵɵconditional((tmp_14_0 = ctx_r0.SelectedRun) ? 22 : -1, tmp_14_0);
277
863
  } }
864
+ /** Below this the detail pane cannot hold a canvas AND a JSON pane side by side. */
865
+ const STACK_INNER_BELOW_PX = 1100;
278
866
  /**
279
867
  * How the JSON panes unpack nested JSON.
280
868
  *
@@ -297,6 +885,7 @@ const STATUS_FILTERS = ['all', 'Running', 'Complete', 'Failed', 'Cancelled'];
297
885
  * to count them, and the same unit the promotion picker offers.
298
886
  */
299
887
  let WorkflowRunsResourceComponent = class WorkflowRunsResourceComponent extends BaseDashboard {
888
+ static { WorkflowRunsResourceComponent_1 = this; }
300
889
  cdr;
301
890
  IsLoading = false;
302
891
  LoadError = null;
@@ -319,6 +908,21 @@ let WorkflowRunsResourceComponent = class WorkflowRunsResourceComponent extends
319
908
  StepsLoading = false;
320
909
  /** The step whose JSON is showing, or null when none is selected. */
321
910
  SelectedStepID = null;
911
+ /**
912
+ * Pane sizes, panel visibility and the legend toggle — the rules live in `workflow-run-layout`,
913
+ * which is pure and therefore testable without standing up Angular.
914
+ *
915
+ * Preferences go through `UserInfoEngine` (`MJ: User Settings`), never `localStorage`: a pane
916
+ * width that vanishes when someone opens a different browser is exactly the kind of preference
917
+ * people notice when it disappears. Reads are a synchronous cache hit; writes are debounced,
918
+ * because dragging a splitter fires continuously.
919
+ */
920
+ Layout = new WorkflowRunLayout({
921
+ Get: (key) => UserInfoEngine.Instance.GetSetting(key),
922
+ Set: (key, value) => UserInfoEngine.Instance.SetSettingDebounced(key, value),
923
+ });
924
+ /** Stacked rather than side-by-side when the detail pane is too narrow for both. */
925
+ InnerSplitDirection = 'horizontal';
322
926
  constructor(cdr) {
323
927
  super();
324
928
  this.cdr = cdr;
@@ -327,11 +931,46 @@ let WorkflowRunsResourceComponent = class WorkflowRunsResourceComponent extends
327
931
  return 'Workflow Runs';
328
932
  }
329
933
  initDashboard() {
330
- // Nothing to set up — loadData does the work and the filters default to "everything".
934
+ this.Layout.Restore();
935
+ this.applyViewportRules();
331
936
  }
332
937
  ngAfterViewInit() {
333
938
  this.publishAgentContext();
334
939
  }
940
+ /** Re-evaluates the stacking rule; the detail pane's width follows the window's. */
941
+ onViewportResized() {
942
+ const before = this.InnerSplitDirection;
943
+ this.applyViewportRules();
944
+ if (before !== this.InnerSplitDirection)
945
+ this.cdr.markForCheck();
946
+ }
947
+ applyViewportRules() {
948
+ // Three columns on a laptop gives each about 400px and the canvas stops being usable, so the
949
+ // inner pair stacks instead. Mirrors the outer split's existing breakpoint rather than
950
+ // inventing a second responsive scheme.
951
+ this.InnerSplitDirection = window.innerWidth < STACK_INNER_BELOW_PX ? 'vertical' : 'horizontal';
952
+ }
953
+ OnSplitDragEnd(sizes) {
954
+ this.Layout.OnSplitDragEnd(sizes);
955
+ }
956
+ OnStepSplitDragEnd(sizes) {
957
+ this.Layout.OnStepSplitDragEnd(sizes);
958
+ }
959
+ ToggleStepPanel() {
960
+ this.Layout.ToggleStepPanel();
961
+ this.cdr.markForCheck();
962
+ }
963
+ /**
964
+ * The legend was toggled on the canvas toolbar — remember it.
965
+ *
966
+ * Driven from the toolbar rather than a button of our own: the canvas already has a legend
967
+ * control in the place people look for one, and adding a second in the header would be two
968
+ * controls for one setting, free to disagree.
969
+ */
970
+ OnLegendToggled(show) {
971
+ this.Layout.SetLegendVisible(show);
972
+ this.cdr.markForCheck();
973
+ }
335
974
  /** The rows after the active filter and search, in the chosen order — what the template renders. */
336
975
  get VisibleRuns() {
337
976
  const wanted = this.SearchText.trim().toLowerCase();
@@ -437,10 +1076,420 @@ let WorkflowRunsResourceComponent = class WorkflowRunsResourceComponent extends
437
1076
  this.SelectedRunID = closing ? null : run.ID;
438
1077
  this.SelectedStepID = null;
439
1078
  this.SelectedSteps = [];
1079
+ this.SelectedDeps = [];
1080
+ this.SelectedEdgeID = null;
1081
+ this.InspectorMode = 'step';
1082
+ this.resetEditors();
1083
+ this.detachFrames();
1084
+ this.ReplayPercent = null;
1085
+ this.GraphSettled = false;
1086
+ this.DebugState = EmptyDebugState();
1087
+ this.Invocation = {};
1088
+ // Frames are owned by <mj-task-graph-debugger>; it re-emits them for stall/engine chrome.
440
1089
  this.publishAgentContext();
441
1090
  this.cdr.markForCheck();
442
- if (!closing)
1091
+ if (!closing) {
443
1092
  void this.loadSteps(run.ID);
1093
+ void this.loadDebugState(run.ID);
1094
+ }
1095
+ }
1096
+ // ─── live console: frames ────────────────────────────────────────────────
1097
+ //
1098
+ // <mj-task-graph-debugger> owns the frame subscription and re-emits each one. This host only
1099
+ // listens for stall / engine-tick chrome. Frames are ADVISORY; the widget's row reads remain
1100
+ // the truth, reconciled on settlement.
1101
+ /** The newest frame, bound straight into the run view for sub-second canvas updates. */
1102
+ GraphDebug;
1103
+ LatestFrame = null;
1104
+ /** The engine's recent heartbeat ticks (`PassCompleted`), newest last. Bounded. */
1105
+ EngineTicks = [];
1106
+ /** Everything seen this session for the selected run, newest first. Bounded. */
1107
+ FrameLog = [];
1108
+ /** Whether the selected run is paused (from `GraphPaused`/`GraphResumed` frames + verbs). */
1109
+ DebugPaused = false;
1110
+ /** Children are all terminal — the durable bag can still say paused after the last continue. */
1111
+ GraphSettled = false;
1112
+ /** A one-line diagnosis when the engine reports trouble — a lost worker, a held path. */
1113
+ StallNotice = null;
1114
+ /** Structured stall so a held edge can be answered, not just named. */
1115
+ Stall = null;
1116
+ /** Durable debug state from the parent row — frames are advisory, this is the truth. */
1117
+ DebugState = EmptyDebugState();
1118
+ /** Invocation `data`/`context` roots from the same parent bag (R3-3). */
1119
+ Invocation = {};
1120
+ /** Selected path, when the person clicked an edge rather than a step. */
1121
+ SelectedEdgeID = null;
1122
+ InspectorMode = 'step';
1123
+ /** Force-complete confirmation + output editor. */
1124
+ ForceCompleteOpen = false;
1125
+ ForceCompleteJson = '{}';
1126
+ ForceCompleteName = '';
1127
+ ForceCompleteError = null;
1128
+ /** Edit-input editor (Pending → UpdateTaskInput, Failed → RetryTask). */
1129
+ EditInputOpen = false;
1130
+ EditInputJson = '';
1131
+ EditInputError = null;
1132
+ /** True while a control verb round-trips, so the toolbar cannot double-fire. */
1133
+ get ControlBusy() {
1134
+ return this.GraphDebug?.Busy === true;
1135
+ }
1136
+ /** Replay position for a settled run: 0–100 along its wall-clock span, or null for "now". */
1137
+ ReplayPercent = null;
1138
+ /** Dependencies of the selected run's steps, for the what-if preview. */
1139
+ SelectedDeps = [];
1140
+ static FRAME_LOG_LIMIT = 250;
1141
+ static ENGINE_TICK_LIMIT = 10;
1142
+ ngOnDestroy() {
1143
+ this.detachFrames();
1144
+ super.ngOnDestroy();
1145
+ }
1146
+ isLiveStatus(status) {
1147
+ return status === 'In Progress' || status === 'Running' || status === 'Pending';
1148
+ }
1149
+ detachFrames() {
1150
+ this.LatestFrame = null;
1151
+ this.DebugPaused = false;
1152
+ this.StallNotice = null;
1153
+ this.Stall = null;
1154
+ }
1155
+ OnFrame(frame) {
1156
+ this.LatestFrame = frame;
1157
+ this.FrameLog = [frame, ...this.FrameLog].slice(0, WorkflowRunsResourceComponent_1.FRAME_LOG_LIMIT);
1158
+ switch (frame.kind) {
1159
+ case 'PassCompleted':
1160
+ this.EngineTicks = [...this.EngineTicks, frame].slice(-WorkflowRunsResourceComponent_1.ENGINE_TICK_LIMIT);
1161
+ break;
1162
+ case 'GraphPaused':
1163
+ case 'BreakpointHit':
1164
+ if (this.GraphSettled)
1165
+ break; // bag can still say paused after the last step
1166
+ this.DebugPaused = true;
1167
+ if (this.SelectedRunID)
1168
+ void this.loadDebugState(this.SelectedRunID);
1169
+ break;
1170
+ case 'GraphResumed':
1171
+ this.DebugPaused = false;
1172
+ if (this.SelectedRunID)
1173
+ void this.loadDebugState(this.SelectedRunID);
1174
+ break;
1175
+ case 'ClaimChanged':
1176
+ if (frame.claimEvent === 'heartbeat-lost') {
1177
+ this.setStall({
1178
+ kind: 'worker-lost',
1179
+ message: `"${frame.taskName ?? 'A step'}" lost its worker — the engine will requeue it.`,
1180
+ taskName: frame.taskName,
1181
+ taskID: frame.taskId,
1182
+ });
1183
+ }
1184
+ else if (frame.claimEvent === 'reclaimed') {
1185
+ this.clearStall();
1186
+ }
1187
+ break;
1188
+ case 'GateDecision':
1189
+ if (frame.verdict === 'held') {
1190
+ this.setStall({
1191
+ kind: 'held',
1192
+ message: `"${frame.taskName ?? 'A step'}" is waiting on a path that can't be answered.`,
1193
+ taskName: frame.taskName,
1194
+ taskID: frame.taskId,
1195
+ edgeID: frame.edgeId,
1196
+ conditionText: frame.conditionText,
1197
+ reason: frame.reason,
1198
+ });
1199
+ }
1200
+ break;
1201
+ case 'StepRefused':
1202
+ this.setStall({
1203
+ kind: 'step-refused',
1204
+ message: frame.reason ?? 'The step could not start yet; it stays queued.',
1205
+ reason: frame.reason,
1206
+ });
1207
+ break;
1208
+ case 'GraphSettled':
1209
+ this.markGraphSettled();
1210
+ this.clearStall();
1211
+ void this.loadData(); // the list row's status/duration just changed
1212
+ if (this.SelectedRunID) {
1213
+ void this.loadSteps(this.SelectedRunID);
1214
+ void this.loadDebugState(this.SelectedRunID);
1215
+ }
1216
+ break;
1217
+ case 'TaskCompleted':
1218
+ case 'TaskFailed':
1219
+ case 'TaskSkipped':
1220
+ case 'TaskBlocked':
1221
+ // Keep the step list in agreement with the canvas the frame just updated.
1222
+ if (this.SelectedRunID)
1223
+ void this.loadSteps(this.SelectedRunID);
1224
+ break;
1225
+ }
1226
+ this.cdr.markForCheck();
1227
+ }
1228
+ // ─── live console: control verbs ────────────────────────────────────────
1229
+ //
1230
+ // The drop-in debugger owns RouteOperation. These handlers just call its verbs.
1231
+ async OnPauseRun() {
1232
+ await this.GraphDebug?.Pause();
1233
+ this.DebugPaused = true;
1234
+ this.cdr.markForCheck();
1235
+ }
1236
+ async OnResumeRun() {
1237
+ await this.GraphDebug?.Resume();
1238
+ this.DebugPaused = false;
1239
+ this.cdr.markForCheck();
1240
+ }
1241
+ async OnStepRun(target) {
1242
+ await this.GraphDebug?.Step(target);
1243
+ }
1244
+ async OnCancelRun() {
1245
+ await this.GraphDebug?.Cancel();
1246
+ await this.loadData();
1247
+ }
1248
+ async OnSkipStep(step) {
1249
+ await this.GraphDebug?.SkipTask(step.ID);
1250
+ if (this.SelectedRunID)
1251
+ void this.loadSteps(this.SelectedRunID);
1252
+ }
1253
+ async OnRetryStep(step) {
1254
+ await this.GraphDebug?.RetryTask(step.ID);
1255
+ if (this.SelectedRunID)
1256
+ void this.loadSteps(this.SelectedRunID);
1257
+ }
1258
+ async OnBreakpointToggled(event) {
1259
+ await this.GraphDebug?.ToggleBreakpoint(event.TaskID, event.Enabled);
1260
+ }
1261
+ async OnRemoveBreakpoint(taskID) {
1262
+ await this.OnBreakpointToggled({ TaskID: taskID, Enabled: false });
1263
+ }
1264
+ OnSelectBreakpoint(taskID) {
1265
+ const step = this.SelectedSteps.find((s) => UUIDsEqual(s.ID, taskID));
1266
+ if (step)
1267
+ this.OnSelectStep(step);
1268
+ else {
1269
+ this.SelectedStepID = taskID;
1270
+ this.InspectorMode = 'step';
1271
+ if (!this.Layout.StepPanelOpen)
1272
+ this.ToggleStepPanel();
1273
+ this.cdr.markForCheck();
1274
+ }
1275
+ }
1276
+ async OnOverrideEdge(edgeID, verdict) {
1277
+ await this.GraphDebug?.OverrideEdge(edgeID, verdict);
1278
+ if (verdict != null)
1279
+ this.clearStall();
1280
+ }
1281
+ OnGraphConnectionSelected(event) {
1282
+ if (!event.EdgeID)
1283
+ return;
1284
+ this.SelectedEdgeID = event.EdgeID;
1285
+ this.InspectorMode = 'edge';
1286
+ if (!this.Layout.StepPanelOpen)
1287
+ this.ToggleStepPanel();
1288
+ this.cdr.markForCheck();
1289
+ }
1290
+ get SelectedEdge() {
1291
+ if (!this.SelectedEdgeID)
1292
+ return null;
1293
+ return this.SelectedDeps.find((d) => UUIDsEqual(d.ID, this.SelectedEdgeID)) ?? null;
1294
+ }
1295
+ get SelectedEdgeIsConditional() {
1296
+ return !!this.SelectedEdge?.Condition?.trim();
1297
+ }
1298
+ get SelectedEdgeOverride() {
1299
+ if (!this.SelectedEdgeID)
1300
+ return null;
1301
+ return this.GraphDebug?.GetEdgeOverride(this.SelectedEdgeID) ?? null;
1302
+ }
1303
+ get SelectedEdgeFromName() {
1304
+ const edge = this.SelectedEdge;
1305
+ if (!edge)
1306
+ return '';
1307
+ return this.SelectedSteps.find((s) => UUIDsEqual(s.ID, edge.DependsOnTaskID))?.Name ?? 'upstream';
1308
+ }
1309
+ get SelectedEdgeToName() {
1310
+ const edge = this.SelectedEdge;
1311
+ if (!edge)
1312
+ return '';
1313
+ return this.SelectedSteps.find((s) => UUIDsEqual(s.ID, edge.TaskID))?.Name ?? 'downstream';
1314
+ }
1315
+ StepName(taskID) {
1316
+ return this.SelectedSteps.find((s) => UUIDsEqual(s.ID, taskID))?.Name ?? 'a step';
1317
+ }
1318
+ HasBreakpoint(taskID) {
1319
+ return this.GraphDebug?.HasBreakpoint(taskID) ?? false;
1320
+ }
1321
+ /** Live or paused — the VS Code bar is how you drive it, including a start-paused debug. */
1322
+ CanDriveRun(run) {
1323
+ if (this.IsRunSettled(run))
1324
+ return false;
1325
+ return run.Status === 'In Progress' || run.Status === 'Running' || run.Status === 'Pending' || this.DebugPaused;
1326
+ }
1327
+ IsRunSettled(run) {
1328
+ return this.GraphSettled
1329
+ || run.Status === 'Complete'
1330
+ || run.Status === 'Failed'
1331
+ || run.Status === 'Cancelled';
1332
+ }
1333
+ OnCanvasSettled() {
1334
+ this.markGraphSettled();
1335
+ this.cdr.markForCheck();
1336
+ }
1337
+ markGraphSettled() {
1338
+ this.GraphSettled = true;
1339
+ this.DebugPaused = false;
1340
+ this.DebugState = { ...this.DebugState, paused: false, pausedAtTaskID: null };
1341
+ }
1342
+ StepPayload(step, field) {
1343
+ const value = step.Record[field];
1344
+ if (typeof value === 'string')
1345
+ return value;
1346
+ if (value == null)
1347
+ return null;
1348
+ return JSON.stringify(value);
1349
+ }
1350
+ OnBreakpointCheckbox(step, event) {
1351
+ const target = event.target;
1352
+ const enabled = target instanceof HTMLInputElement && target.checked;
1353
+ void this.OnBreakpointToggled({ TaskID: step.ID, Enabled: enabled });
1354
+ }
1355
+ CanForceComplete(step) {
1356
+ if (this.isHumanStep(step))
1357
+ return false;
1358
+ return step.Status === 'Pending' || step.Status === 'Failed' || step.Status === 'Blocked';
1359
+ }
1360
+ CanEditInput(step) {
1361
+ return step.Status === 'Pending' || step.Status === 'Failed';
1362
+ }
1363
+ OpenForceComplete(step) {
1364
+ this.ForceCompleteOpen = true;
1365
+ this.ForceCompleteJson = this.prettyJson(step.Record['OutputPayload']) || '{}';
1366
+ this.ForceCompleteName = '';
1367
+ this.ForceCompleteError = null;
1368
+ this.EditInputOpen = false;
1369
+ this.cdr.markForCheck();
1370
+ }
1371
+ OpenEditInput(step) {
1372
+ this.EditInputOpen = true;
1373
+ this.EditInputJson = this.prettyJson(step.Record['InputPayload']) || '{}';
1374
+ this.EditInputError = null;
1375
+ this.ForceCompleteOpen = false;
1376
+ this.cdr.markForCheck();
1377
+ }
1378
+ async SubmitForceComplete(step) {
1379
+ if (this.ForceCompleteName.trim() !== step.Name) {
1380
+ this.ForceCompleteError = 'Type the step name exactly to confirm.';
1381
+ this.cdr.markForCheck();
1382
+ return;
1383
+ }
1384
+ const parsed = TryParseJsonObject(this.ForceCompleteJson);
1385
+ if (!parsed.ok) {
1386
+ this.ForceCompleteError = parsed.error;
1387
+ this.cdr.markForCheck();
1388
+ return;
1389
+ }
1390
+ this.ForceCompleteError = null;
1391
+ const ok = await this.GraphDebug?.ForceCompleteTask(step.ID, parsed.value);
1392
+ if (ok) {
1393
+ this.ForceCompleteOpen = false;
1394
+ if (this.SelectedRunID)
1395
+ void this.loadSteps(this.SelectedRunID);
1396
+ }
1397
+ }
1398
+ async SubmitEditInput(step) {
1399
+ const parsed = TryParseJsonObject(this.EditInputJson);
1400
+ if (!parsed.ok) {
1401
+ this.EditInputError = parsed.error;
1402
+ this.cdr.markForCheck();
1403
+ return;
1404
+ }
1405
+ this.EditInputError = null;
1406
+ const ok = step.Status === 'Failed'
1407
+ ? await this.GraphDebug?.RetryTask(step.ID, parsed.value)
1408
+ : await this.GraphDebug?.UpdateTaskInput(step.ID, parsed.value);
1409
+ if (ok) {
1410
+ this.EditInputOpen = false;
1411
+ if (this.SelectedRunID)
1412
+ void this.loadSteps(this.SelectedRunID);
1413
+ }
1414
+ }
1415
+ get InvocationJson() {
1416
+ return JSON.stringify(ParseJSONRecursive({ data: this.Invocation.data ?? null, context: this.Invocation.context ?? null }, JSON_PARSE_OPTIONS), null, 2);
1417
+ }
1418
+ get HasInvocation() {
1419
+ return this.Invocation.data != null || this.Invocation.context != null;
1420
+ }
1421
+ // ─── live console: inspector data ───────────────────────────────────────
1422
+ /** The newest claim event seen for the selected step, if any. */
1423
+ get SelectedStepClaim() {
1424
+ if (!this.SelectedStepID)
1425
+ return null;
1426
+ return this.FrameLog.find((f) => f.kind === 'ClaimChanged' && UUIDsEqual(f.taskId ?? '', this.SelectedStepID)) ?? null;
1427
+ }
1428
+ /** Latest verdict per path into/out of the selected step — "why did this branch run". */
1429
+ get SelectedStepVerdicts() {
1430
+ if (!this.SelectedStepID)
1431
+ return [];
1432
+ const byEdge = new Map();
1433
+ // FrameLog is newest-first, so the first sighting per edge is the latest verdict.
1434
+ for (const f of this.FrameLog) {
1435
+ if (f.kind !== 'GateDecision' || !f.edgeId)
1436
+ continue;
1437
+ const touches = UUIDsEqual(f.taskId ?? '', this.SelectedStepID) || UUIDsEqual(f.dependsOnTaskId ?? '', this.SelectedStepID);
1438
+ if (touches && !byEdge.has(f.edgeId))
1439
+ byEdge.set(f.edgeId, f);
1440
+ }
1441
+ return [...byEdge.values()];
1442
+ }
1443
+ /** What the selected step's runner last said it was doing. */
1444
+ get SelectedStepProgress() {
1445
+ if (!this.SelectedStepID)
1446
+ return null;
1447
+ return this.FrameLog.find((f) => f.kind === 'NodeProgress' && UUIDsEqual(f.taskId ?? '', this.SelectedStepID)) ?? null;
1448
+ }
1449
+ /**
1450
+ * What-if: how many steps would be cut off if the selected step failed — computed with the
1451
+ * engine's OWN blocking algorithm over the loaded rows, so the preview cannot disagree with
1452
+ * what the dispatcher would actually do.
1453
+ */
1454
+ get SelectedStepWhatIf() {
1455
+ const step = this.SelectedStep;
1456
+ if (!step || this.SelectedSteps.length === 0)
1457
+ return null;
1458
+ const nodes = this.SelectedSteps.map((s) => ({
1459
+ id: s.ID,
1460
+ status: (UUIDsEqual(s.ID, step.ID) ? 'Failed' : s.Status),
1461
+ }));
1462
+ const edges = this.SelectedDeps.map((d) => ({
1463
+ taskId: d.TaskID,
1464
+ dependsOnTaskId: d.DependsOnTaskID,
1465
+ dependencyType: d.DependencyType,
1466
+ }));
1467
+ const blocked = ComputeTasksToBlock(nodes, edges, new Set());
1468
+ return { BlockedCount: [...blocked].filter((id) => !UUIDsEqual(id, step.ID)).length };
1469
+ }
1470
+ // ─── live console: replay ───────────────────────────────────────────────
1471
+ /** Whether the selected run can be scrubbed — it has settled and has a wall-clock span. */
1472
+ get CanReplay() {
1473
+ const run = this.SelectedRun;
1474
+ return !!run && !this.isLiveStatus(run.Status) && !!run.StartedAt && !!run.CompletedAt;
1475
+ }
1476
+ /** The scrub position as a timestamp inside the run's span, or null when showing the present. */
1477
+ get ReplayAt() {
1478
+ const run = this.SelectedRun;
1479
+ if (this.ReplayPercent == null || !run?.StartedAt || !run?.CompletedAt)
1480
+ return null;
1481
+ const start = run.StartedAt.getTime();
1482
+ const end = run.CompletedAt.getTime();
1483
+ return new Date(start + (end - start) * (this.ReplayPercent / 100));
1484
+ }
1485
+ OnReplayScrub(value) {
1486
+ const pct = Math.max(0, Math.min(100, Number(value)));
1487
+ this.ReplayPercent = Number.isFinite(pct) ? pct : null;
1488
+ this.cdr.markForCheck();
1489
+ }
1490
+ OnReplayReset() {
1491
+ this.ReplayPercent = null;
1492
+ this.cdr.markForCheck();
444
1493
  }
445
1494
  /**
446
1495
  * Loads the selected run's steps.
@@ -464,8 +1513,16 @@ let WorkflowRunsResourceComponent = class WorkflowRunsResourceComponent extends
464
1513
  ResultType: 'entity_object',
465
1514
  BypassCache: true,
466
1515
  });
1516
+ // The edges too, for the what-if preview — same rows the run view reads for the canvas.
1517
+ const deps = await RunView.FromMetadataProvider(this.ProviderToUse).RunView({
1518
+ EntityName: 'MJ: Task Dependencies',
1519
+ ExtraFilter: `TaskID IN (SELECT ID FROM __mj.Task WHERE ParentID='${parentTaskID}')`,
1520
+ ResultType: 'entity_object',
1521
+ BypassCache: true,
1522
+ });
467
1523
  if (!UUIDsEqual(this.SelectedRunID ?? '', parentTaskID))
468
1524
  return; // selection moved on
1525
+ this.SelectedDeps = (deps.Success ? (deps.Results ?? []) : []);
469
1526
  this.SelectedSteps = (result.Success ? (result.Results ?? []) : []).map((t) => ({
470
1527
  ID: t.ID,
471
1528
  Name: t.Name ?? '(unnamed step)',
@@ -488,10 +1545,17 @@ let WorkflowRunsResourceComponent = class WorkflowRunsResourceComponent extends
488
1545
  /** A node was clicked on the canvas — show that step's JSON. */
489
1546
  OnGraphNodeSelected(event) {
490
1547
  this.SelectedStepID = event.TaskID;
1548
+ this.InspectorMode = 'step';
1549
+ // Asking to see a step is asking for the panel. Leaving it closed would make the click look
1550
+ // like it did nothing.
1551
+ if (!this.Layout.StepPanelOpen)
1552
+ this.ToggleStepPanel();
491
1553
  this.cdr.markForCheck();
492
1554
  }
493
1555
  OnSelectStep(step) {
494
1556
  this.SelectedStepID = UUIDsEqual(this.SelectedStepID ?? '', step.ID) ? null : step.ID;
1557
+ this.InspectorMode = 'step';
1558
+ this.resetEditors();
495
1559
  this.cdr.markForCheck();
496
1560
  }
497
1561
  OnDetailTab(tab) {
@@ -546,6 +1610,75 @@ let WorkflowRunsResourceComponent = class WorkflowRunsResourceComponent extends
546
1610
  return;
547
1611
  this.navigationService.OpenEntityRecord('MJ: AI Agent Runs', CompositeKey.FromID(run.AgentRunID));
548
1612
  }
1613
+ async loadDebugState(parentTaskID) {
1614
+ try {
1615
+ const result = await RunView.FromMetadataProvider(this.ProviderToUse).RunView({
1616
+ EntityName: 'MJ: Tasks',
1617
+ ExtraFilter: `ID='${parentTaskID}'`,
1618
+ ResultType: 'entity_object',
1619
+ BypassCache: true,
1620
+ });
1621
+ if (!UUIDsEqual(this.SelectedRunID ?? '', parentTaskID))
1622
+ return;
1623
+ const parent = result.Success ? result.Results?.[0] : undefined;
1624
+ const bag = ParseWorkflowRunParentBag(parent?.InputPayload);
1625
+ this.Invocation = bag.invocation;
1626
+ // Settled trumps the durable bag: $.debug.paused can still be true after the last
1627
+ // continue, and painting that as "paused here" hides that the run is over.
1628
+ if (this.GraphSettled) {
1629
+ this.DebugState = { ...bag.debug, paused: false, pausedAtTaskID: null };
1630
+ this.DebugPaused = false;
1631
+ }
1632
+ else {
1633
+ this.DebugState = bag.debug;
1634
+ this.DebugPaused = bag.debug.paused;
1635
+ }
1636
+ }
1637
+ catch {
1638
+ // A failed parent read leaves the last known debug state; frames remain the safety net.
1639
+ }
1640
+ this.cdr.markForCheck();
1641
+ }
1642
+ setStall(stall) {
1643
+ this.Stall = stall;
1644
+ this.StallNotice = stall.message;
1645
+ }
1646
+ clearStall() {
1647
+ this.Stall = null;
1648
+ this.StallNotice = null;
1649
+ }
1650
+ OnDismissStall() {
1651
+ this.clearStall();
1652
+ this.cdr.markForCheck();
1653
+ }
1654
+ resetEditors() {
1655
+ this.ForceCompleteOpen = false;
1656
+ this.ForceCompleteError = null;
1657
+ this.EditInputOpen = false;
1658
+ this.EditInputError = null;
1659
+ }
1660
+ isHumanStep(step) {
1661
+ const userID = step.Record['UserID'];
1662
+ return typeof userID === 'string' && userID.trim().length > 0;
1663
+ }
1664
+ prettyJson(value) {
1665
+ if (value == null || value === '')
1666
+ return '';
1667
+ if (typeof value === 'string') {
1668
+ try {
1669
+ return JSON.stringify(JSON.parse(value), null, 2);
1670
+ }
1671
+ catch {
1672
+ return value;
1673
+ }
1674
+ }
1675
+ try {
1676
+ return JSON.stringify(value, null, 2);
1677
+ }
1678
+ catch {
1679
+ return '';
1680
+ }
1681
+ }
549
1682
  /**
550
1683
  * Reports surface state and registers what an agent may drive here.
551
1684
  *
@@ -635,21 +1768,28 @@ let WorkflowRunsResourceComponent = class WorkflowRunsResourceComponent extends
635
1768
  ]);
636
1769
  }
637
1770
  static ɵfac = function WorkflowRunsResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || WorkflowRunsResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
638
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: WorkflowRunsResourceComponent, selectors: [["mj-workflow-runs"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 17, vars: 4, consts: [["Title", "Runs", "Icon", "fa-solid fa-timeline", "Subtitle", "Every workflow that has run \u2014 however it was started."], ["meta", ""], ["Label", "runs", 3, "Count", "Total"], ["actions", ""], [3, "Clicked", "Loading"], ["toolbar", ""], ["Placeholder", "Search runs", 3, "ValueChange", "Value"], [1, "wfr-status-filters"], ["type", "button", "mjButton", "", "size", "sm", 3, "variant"], ["text", "Loading runs..."], ["Variant", "error", 3, "Message"], ["Icon", "fa-solid fa-timeline", "Title", "Nothing has run yet", "Message", "When a workflow runs \u2014 started by hand, on a schedule, or by an agent \u2014 it will appear here."], ["Icon", "fa-solid fa-filter", "Title", "No runs match", "Message", "Nothing matches the current filter. Clear it to see everything that has run."], [1, "wfr-split", 3, "wfr-split-open"], ["type", "button", "mjButton", "", "size", "sm", 3, "click", "variant"], [1, "wfr-split"], [1, "wfr-list"], ["role", "row", 1, "wfr-head"], ["type", "button", 1, "wfr-head-cell", "wfr-col-name", 3, "click"], ["aria-hidden", "true", 3, "ngClass"], ["type", "button", 1, "wfr-head-cell", "wfr-col-time", 3, "click"], ["type", "button", 1, "wfr-head-cell", "wfr-col-duration", 3, "click"], ["type", "button", 1, "wfr-head-cell", "wfr-col-status", 3, "click"], ["type", "button", 1, "wfr-row", 3, "wfr-row-selected"], [1, "wfr-detail"], ["type", "button", 1, "wfr-row", 3, "click"], [1, "wfr-col-name", "wfr-row-name"], [1, "wfr-col-time"], [1, "wfr-col-duration"], [1, "wfr-col-status", "wfr-row-status"], [1, "wfr-detail-head"], [1, "wfr-detail-title"], [1, "wfr-detail-name"], [1, "wfr-row-status"], [1, "wfr-detail-actions"], ["mjButton", "", "variant", "flat", "size", "sm"], ["mjButton", "", "variant", "flat", "size", "sm", "aria-label", "Close", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-xmark"], ["role", "tablist", 1, "wfr-detail-tabs"], ["type", "button", 1, "wfr-tab", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-diagram-project"], ["aria-hidden", "true", 1, "fa-solid", "fa-code"], [1, "wfr-json-pane"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-arrow-up-right-from-square"], [1, "wfr-graph-pane"], ["Height", "100%", 3, "NodeSelected", "Provider", "ParentTaskID", "WorkflowName", "LiveUpdates"], [1, "wfr-steps-pane"], ["text", "Loading steps..."], [1, "wfr-step-list"], ["type", "button", 1, "wfr-step", 3, "wfr-step-selected"], [1, "wfr-step-json"], ["Size", "compact", "Icon", "fa-solid fa-hand-pointer", "Title", "Select a step", "Message", "Click a step on the canvas or in the list to see everything it recorded."], ["type", "button", 1, "wfr-step", 3, "click"], [1, "wfr-step-name"], [1, "wfr-step-meta"], [1, "wfr-step-json-head"], [2, "width", "100%", 3, "ngModel", "language", "readonly"]], template: function WorkflowRunsResourceComponent_Template(rf, ctx) { if (rf & 1) {
639
- i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0)(2, "div", 1);
640
- i0.ɵɵconditionalCreate(3, WorkflowRunsResourceComponent_Conditional_3_Template, 1, 2, "mj-stat-badge", 2);
1771
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: WorkflowRunsResourceComponent, selectors: [["mj-workflow-runs"]], viewQuery: function WorkflowRunsResourceComponent_Query(rf, ctx) { if (rf & 1) {
1772
+ i0.ɵɵviewQuery(TaskGraphDebuggerComponent, 5);
1773
+ } if (rf & 2) {
1774
+ let _t;
1775
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.GraphDebug = _t.first);
1776
+ } }, hostBindings: function WorkflowRunsResourceComponent_HostBindings(rf, ctx) { if (rf & 1) {
1777
+ i0.ɵɵlistener("resize", function WorkflowRunsResourceComponent_resize_HostBindingHandler() { return ctx.onViewportResized(); }, i0.ɵɵresolveWindow);
1778
+ } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 17, vars: 4, consts: [["GraphDebug", ""], ["Title", "Runs", "Icon", "fa-solid fa-timeline", "Subtitle", "Every workflow that has run \u2014 however it was started."], ["meta", ""], ["Label", "runs", 3, "Count", "Total"], ["actions", ""], [3, "Clicked", "Loading"], ["toolbar", ""], ["Placeholder", "Search runs", 3, "ValueChange", "Value"], [1, "wfr-status-filters"], ["type", "button", "mjButton", "", "size", "sm", 3, "variant"], ["text", "Loading runs..."], ["Variant", "error", 3, "Message"], ["Icon", "fa-solid fa-timeline", "Title", "Nothing has run yet", "Message", "When a workflow runs \u2014 started by hand, on a schedule, or by an agent \u2014 it will appear here."], ["Icon", "fa-solid fa-filter", "Title", "No runs match", "Message", "Nothing matches the current filter. Clear it to see everything that has run."], ["direction", "horizontal", "unit", "percent", 1, "wfr-split", 3, "gutterSize", "disabled"], ["type", "button", "mjButton", "", "size", "sm", 3, "click", "variant"], ["direction", "horizontal", "unit", "percent", 1, "wfr-split", 3, "dragEnd", "gutterSize", "disabled"], [3, "size", "minSize"], [1, "wfr-list"], ["role", "row", 1, "wfr-head"], ["type", "button", 1, "wfr-head-cell", "wfr-col-name", 3, "click"], ["aria-hidden", "true", 3, "ngClass"], ["type", "button", 1, "wfr-head-cell", "wfr-col-time", 3, "click"], ["type", "button", 1, "wfr-head-cell", "wfr-col-duration", 3, "click"], ["type", "button", 1, "wfr-head-cell", "wfr-col-status", 3, "click"], ["type", "button", 1, "wfr-row", 3, "wfr-row-selected"], [3, "size", "minSize", "visible"], [1, "wfr-detail"], ["type", "button", 1, "wfr-row", 3, "click"], [1, "wfr-col-name", "wfr-row-name"], [1, "wfr-col-time"], [1, "wfr-col-duration"], [1, "wfr-col-status", "wfr-row-status"], [1, "wfr-detail-head"], [1, "wfr-detail-title"], [1, "wfr-detail-name"], [1, "wfr-row-status"], [1, "wfr-detail-actions"], ["mjButton", "", "variant", "flat", "size", "sm"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "title"], ["mjButton", "", "variant", "flat", "size", "sm", "aria-label", "Close", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-xmark"], ["role", "tablist", 1, "wfr-detail-tabs"], ["type", "button", 1, "wfr-tab", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-diagram-project"], ["aria-hidden", "true", 1, "fa-solid", "fa-code"], ["role", "status", 1, "wfr-stall"], ["unit", "percent", 1, "wfr-graph-split", 3, "direction", "gutterSize"], [1, "wfr-json-pane"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-arrow-up-right-from-square"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click", "title"], ["aria-hidden", "true", 1, "fa-solid"], [1, "wfr-stall-body"], ["aria-hidden", "true", 1, "fa-solid", "fa-triangle-exclamation"], [1, "wfr-stall-copy"], [1, "wfr-stall-reason"], [1, "wfr-stall-actions"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click", "disabled"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "click", "disabled"], ["unit", "percent", 1, "wfr-graph-split", 3, "dragEnd", "direction", "gutterSize"], [1, "wfr-graph-pane"], ["Height", "100%", 3, "NodeSelected", "ConnectionSelected", "LegendToggled", "Settled", "Frame", "PausedChange", "Provider", "ParentTaskID", "WorkflowName", "LiveUpdates", "ReplayAt", "ShowLegend"], [1, "wfr-replay"], ["aria-label", "Armed breakpoints", 1, "wfr-bp-bar"], ["aria-label", "Engine activity", 1, "wfr-engine"], [1, "wfr-steps-pane"], ["text", "Loading steps..."], ["aria-hidden", "true", 1, "fa-solid", "fa-clock-rotate-left"], ["type", "range", "min", "0", "max", "100", "step", "1", "aria-label", "Replay position", 3, "input", "value"], [1, "wfr-chip", "wfr-chip-paused"], ["type", "button", 1, "wfr-chip", "wfr-chip-break"], ["aria-hidden", "true", 1, "fa-solid", "fa-pause"], ["type", "button", 1, "wfr-chip", "wfr-chip-break", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-circle"], ["role", "button", "tabindex", "0", "aria-label", "Remove breakpoint", 1, "wfr-chip-x", 3, "click"], [1, "wfr-tick", 3, "wfr-tick-held"], [1, "wfr-tick", "wfr-tick-paused"], [1, "wfr-tick"], [1, "wfr-step-list"], ["type", "button", 1, "wfr-step", 3, "wfr-step-selected"], [1, "wfr-step-json"], ["Size", "compact", "Icon", "fa-solid fa-hand-pointer", "Title", "Select a step", "Message", "Click a step on the canvas or in the list to see everything it recorded."], ["type", "button", 1, "wfr-step", 3, "click"], [1, "wfr-step-name"], [1, "wfr-step-meta"], [1, "wfr-step-json-head"], [1, "wfr-chip", "wfr-chip-forced"], [1, "wfr-insp-card"], [1, "wfr-insp-label"], [1, "wfr-insp-actions"], [1, "wfr-insp-hint"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "disabled"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click", "disabled"], ["type", "button", 1, "wfr-bp", 3, "click", "disabled", "title"], ["aria-hidden", "true", 1, "fa-circle"], [1, "wfr-insp-card", 3, "wfr-insp-bad"], [1, "wfr-editor-card"], [1, "wfr-editor-card", "wfr-editor-danger"], [3, "InputPayload", "OutputPayload", "Invocation"], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Declare this step not-taken; later steps proceed", 3, "disabled"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "disabled"], ["mjButton", "", "variant", "danger", "size", "sm", 3, "disabled"], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Declare this step not-taken; later steps proceed", 3, "click", "disabled"], ["aria-hidden", "true", 1, "fa-solid", "fa-forward"], ["aria-hidden", "true", 1, "fa-solid", "fa-pen-to-square"], ["aria-hidden", "true", 1, "fa-solid", "fa-rotate-right"], ["mjButton", "", "variant", "danger", "size", "sm", 3, "click", "disabled"], ["aria-hidden", "true", 1, "fa-solid", "fa-flag-checkered"], ["rows", "8", "spellcheck", "false", 1, "mj-textarea", "wfr-json-edit", 3, "ngModelChange", "ngModel"], [1, "wfr-editor-error"], ["rows", "6", "spellcheck", "false", 1, "mj-textarea", "wfr-json-edit", 3, "ngModelChange", "ngModel"], ["type", "text", 1, "mj-input", 3, "ngModelChange", "ngModel", "placeholder"], [2, "width", "100%", 3, "ngModel", "language", "readonly"]], template: function WorkflowRunsResourceComponent_Template(rf, ctx) { if (rf & 1) {
1779
+ i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 1)(2, "div", 2);
1780
+ i0.ɵɵconditionalCreate(3, WorkflowRunsResourceComponent_Conditional_3_Template, 1, 2, "mj-stat-badge", 3);
641
1781
  i0.ɵɵelementEnd();
642
- i0.ɵɵelementStart(4, "div", 3)(5, "mj-refresh-button", 4);
1782
+ i0.ɵɵelementStart(4, "div", 4)(5, "mj-refresh-button", 5);
643
1783
  i0.ɵɵlistener("Clicked", function WorkflowRunsResourceComponent_Template_mj_refresh_button_Clicked_5_listener() { return ctx.loadData(); });
644
1784
  i0.ɵɵelementEnd()();
645
- i0.ɵɵelementStart(6, "div", 5)(7, "mj-page-search", 6);
1785
+ i0.ɵɵelementStart(6, "div", 6)(7, "mj-page-search", 7);
646
1786
  i0.ɵɵlistener("ValueChange", function WorkflowRunsResourceComponent_Template_mj_page_search_ValueChange_7_listener($event) { return ctx.OnSearch($event); });
647
1787
  i0.ɵɵelementEnd();
648
- i0.ɵɵelementStart(8, "div", 7);
649
- i0.ɵɵrepeaterCreate(9, WorkflowRunsResourceComponent_For_10_Template, 2, 2, "button", 8, i0.ɵɵrepeaterTrackByIdentity);
1788
+ i0.ɵɵelementStart(8, "div", 8);
1789
+ i0.ɵɵrepeaterCreate(9, WorkflowRunsResourceComponent_For_10_Template, 2, 2, "button", 9, i0.ɵɵrepeaterTrackByIdentity);
650
1790
  i0.ɵɵelementEnd()()();
651
1791
  i0.ɵɵelementStart(11, "mj-page-body");
652
- i0.ɵɵconditionalCreate(12, WorkflowRunsResourceComponent_Conditional_12_Template, 1, 0, "mj-loading", 9)(13, WorkflowRunsResourceComponent_Conditional_13_Template, 1, 1, "mj-alert", 10)(14, WorkflowRunsResourceComponent_Conditional_14_Template, 1, 0, "mj-empty-state", 11)(15, WorkflowRunsResourceComponent_Conditional_15_Template, 1, 0, "mj-empty-state", 12)(16, WorkflowRunsResourceComponent_Conditional_16_Template, 21, 8, "div", 13);
1792
+ i0.ɵɵconditionalCreate(12, WorkflowRunsResourceComponent_Conditional_12_Template, 1, 0, "mj-loading", 10)(13, WorkflowRunsResourceComponent_Conditional_13_Template, 1, 1, "mj-alert", 11)(14, WorkflowRunsResourceComponent_Conditional_14_Template, 1, 0, "mj-empty-state", 12)(15, WorkflowRunsResourceComponent_Conditional_15_Template, 1, 0, "mj-empty-state", 13)(16, WorkflowRunsResourceComponent_Conditional_16_Template, 23, 13, "as-split", 14);
653
1793
  i0.ɵɵelementEnd()();
654
1794
  } if (rf & 2) {
655
1795
  i0.ɵɵadvance(3);
@@ -662,15 +1802,21 @@ let WorkflowRunsResourceComponent = class WorkflowRunsResourceComponent extends
662
1802
  i0.ɵɵrepeater(ctx.StatusFilters);
663
1803
  i0.ɵɵadvance(3);
664
1804
  i0.ɵɵconditional(ctx.IsLoading ? 12 : ctx.LoadError ? 13 : ctx.Runs.length === 0 ? 14 : ctx.VisibleRuns.length === 0 ? 15 : 16);
665
- } }, dependencies: [i1.NgClass, i2.NgControlStatus, i2.NgModel, i3.MJAlertComponent, i3.MJButtonDirective, i3.MJEmptyStateComponent, i3.MJPageBodyComponent, i3.MJPageHeaderComponent, i3.MJPageLayoutComponent, i3.MJPageSearchComponent, i3.MJRefreshButtonComponent, i3.MJStatBadgeComponent, i4.LoadingComponent, i5.TaskGraphRunViewComponent, i6.CodeEditorComponent, i1.DatePipe], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n}\n\n.wfr-status-filters[_ngcontent-%COMP%] {\n display: flex;\n gap: var(--mj-space-1);\n align-items: center;\n}\n\n\n\n\n.wfr-split[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr;\n gap: var(--mj-space-3);\n height: 100%;\n min-height: 0;\n}\n\n.wfr-split-open[_ngcontent-%COMP%] {\n grid-template-columns: minmax(28rem, 40%) 1fr;\n}\n\n@media (max-width: 900px) {\n .wfr-split-open[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n.wfr-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1);\n overflow-y: auto;\n min-height: 0;\n}\n\n.wfr-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n width: 100%;\n padding: var(--mj-space-2) var(--mj-space-3);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n text-align: left;\n cursor: pointer;\n color: var(--mj-text-primary);\n}\n\n.wfr-row[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.wfr-row[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n}\n\n.wfr-row-selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.wfr-row-main[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.wfr-row-name[_ngcontent-%COMP%] {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wfr-row-when[_ngcontent-%COMP%] {\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n}\n\n.wfr-row-status[_ngcontent-%COMP%] {\n flex: none;\n font-size: var(--mj-font-size-xs);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n padding: 2px var(--mj-space-2);\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-page);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n}\n\n\n\n\n\n.wfr-row-status[data-status='Complete'][_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n}\n\n.wfr-row-status[data-status='Failed'][_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 40%, transparent);\n}\n\n.wfr-row-status[data-status='Running'][_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n.wfr-detail[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n min-height: 0;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n}\n\n.wfr-detail-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n padding: var(--mj-space-2) var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.wfr-detail-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n min-width: 0;\n}\n\n.wfr-detail-name[_ngcontent-%COMP%] {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wfr-detail-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-1);\n flex: none;\n}\n\n\n\n\n\n\n\n\n.wfr-head[_ngcontent-%COMP%], \n.wfr-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: minmax(0, 2fr) minmax(0, 1.3fr) minmax(0, 1.3fr) minmax(0, 0.7fr) minmax(0, 0.9fr);\n gap: var(--mj-space-2);\n align-items: center;\n}\n\n.wfr-head[_ngcontent-%COMP%] {\n position: sticky;\n top: 0;\n z-index: 1;\n padding: 0 var(--mj-space-3) var(--mj-space-1);\n background: var(--mj-bg-page);\n}\n\n.wfr-head-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n padding: var(--mj-space-1) 0;\n font-size: var(--mj-font-size-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n cursor: pointer;\n text-align: left;\n}\n\n.wfr-head-cell[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.wfr-head-cell[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n opacity: 0.65;\n font-size: 0.85em;\n}\n\n.wfr-col-time[_ngcontent-%COMP%], \n.wfr-col-duration[_ngcontent-%COMP%] {\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.wfr-col-status[_ngcontent-%COMP%] {\n justify-self: start;\n}\n\n\n\n\n\n.wfr-detail-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: var(--mj-space-1);\n padding: 0 var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.wfr-tab[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n padding: var(--mj-space-2) var(--mj-space-2);\n font-size: var(--mj-font-size-sm);\n font-weight: 600;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.wfr-tab-active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n\n\n.wfr-graph-pane[_ngcontent-%COMP%] {\n flex: 1 1 55%;\n min-height: 12rem;\n}\n\n.wfr-steps-pane[_ngcontent-%COMP%] {\n flex: 1 1 45%;\n display: flex;\n flex-direction: column;\n min-height: 0;\n border-top: 1px solid var(--mj-border-default);\n overflow: hidden;\n}\n\n.wfr-step-list[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: var(--mj-space-1);\n padding: var(--mj-space-2);\n border-bottom: 1px solid var(--mj-border-default);\n max-height: 30%;\n overflow-y: auto;\n}\n\n.wfr-step[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-1) var(--mj-space-2);\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n color: var(--mj-text-primary);\n font-size: var(--mj-font-size-sm);\n cursor: pointer;\n text-align: left;\n}\n\n.wfr-step[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.wfr-step-selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n\n\n.wfr-step[data-status='Skipped'][_ngcontent-%COMP%] .wfr-step-name[_ngcontent-%COMP%] {\n text-decoration: line-through;\n color: var(--mj-text-secondary);\n}\n\n.wfr-step-name[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.wfr-step-meta[_ngcontent-%COMP%] {\n font-size: var(--mj-font-size-xs);\n color: var(--mj-text-secondary);\n}\n\n.wfr-step-json[_ngcontent-%COMP%], \n.wfr-json-pane[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: auto;\n}\n\n.wfr-step-json-head[_ngcontent-%COMP%] {\n padding: var(--mj-space-1) var(--mj-space-3);\n font-weight: 600;\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n}"], changeDetection: 0 });
1805
+ } }, dependencies: [i1.NgClass, i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgModel, i3.MJAlertComponent, i3.MJButtonDirective, i3.MJEmptyStateComponent, i3.MJPageBodyComponent, i3.MJPageHeaderComponent, i3.MJPageLayoutComponent, i3.MJPageSearchComponent, i3.MJRefreshButtonComponent, i3.MJStatBadgeComponent, i4.LoadingComponent, i5.TaskGraphVariablesComponent, i5.TaskGraphDebuggerComponent, i6.CodeEditorComponent, i7.SplitComponent, i7.SplitAreaComponent, i1.DatePipe], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n}\n\n.wfr-status-filters[_ngcontent-%COMP%] {\n display: flex;\n gap: var(--mj-space-1);\n align-items: center;\n}\n\n\n\n\n.wfr-split[_ngcontent-%COMP%] {\n height: 100%;\n min-height: 0;\n}\n\n\n\n[_nghost-%COMP%] .wfr-split > .as-split-gutter, \n[_nghost-%COMP%] .wfr-graph-split > .as-split-gutter {\n background: transparent !important;\n position: relative;\n}\n\n[_nghost-%COMP%] .wfr-split > .as-split-gutter::after, \n[_nghost-%COMP%] .wfr-graph-split > .as-split-gutter::after {\n content: '';\n position: absolute;\n inset: 0;\n margin: auto;\n background: var(--mj-border-default);\n border-radius: var(--mj-radius-full);\n}\n\n[_nghost-%COMP%] .wfr-split.as-horizontal > .as-split-gutter::after, \n[_nghost-%COMP%] .wfr-graph-split.as-horizontal > .as-split-gutter::after {\n width: 2px;\n}\n\n[_nghost-%COMP%] .wfr-graph-split.as-vertical > .as-split-gutter::after {\n height: 2px;\n}\n\n[_nghost-%COMP%] .wfr-split > .as-split-gutter:hover::after, \n[_nghost-%COMP%] .wfr-graph-split > .as-split-gutter:hover::after {\n background: var(--mj-brand-primary);\n}\n\n\n\n\n\n.wfr-graph-split[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n min-height: 0;\n}\n\n.wfr-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1);\n overflow-y: auto;\n min-height: 0;\n}\n\n.wfr-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n width: 100%;\n padding: var(--mj-space-2) var(--mj-space-3);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n text-align: left;\n cursor: pointer;\n color: var(--mj-text-primary);\n}\n\n.wfr-row[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.wfr-row[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n}\n\n.wfr-row-selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.wfr-row-main[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.wfr-row-name[_ngcontent-%COMP%] {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wfr-row-when[_ngcontent-%COMP%] {\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n}\n\n.wfr-row-status[_ngcontent-%COMP%] {\n flex: none;\n font-size: var(--mj-font-size-xs);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n padding: 2px var(--mj-space-2);\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-page);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n}\n\n\n\n\n\n.wfr-row-status[data-status='Complete'][_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n}\n\n.wfr-row-status[data-status='Failed'][_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 40%, transparent);\n}\n\n.wfr-row-status[data-status='Running'][_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n.wfr-detail[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n \n\n\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n}\n\n.wfr-detail-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n padding: var(--mj-space-2) var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.wfr-detail-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n min-width: 0;\n}\n\n.wfr-detail-name[_ngcontent-%COMP%] {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wfr-detail-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-1);\n flex: none;\n}\n\n\n\n\n\n\n\n\n.wfr-head[_ngcontent-%COMP%], \n.wfr-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: minmax(0, 2fr) minmax(0, 1.3fr) minmax(0, 1.3fr) minmax(0, 0.7fr) minmax(0, 0.9fr);\n gap: var(--mj-space-2);\n align-items: center;\n}\n\n.wfr-head[_ngcontent-%COMP%] {\n position: sticky;\n top: 0;\n z-index: 1;\n padding: 0 var(--mj-space-3) var(--mj-space-1);\n background: var(--mj-bg-page);\n}\n\n.wfr-head-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n padding: var(--mj-space-1) 0;\n font-size: var(--mj-font-size-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n cursor: pointer;\n text-align: left;\n}\n\n.wfr-head-cell[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.wfr-head-cell[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n opacity: 0.65;\n font-size: 0.85em;\n}\n\n.wfr-col-time[_ngcontent-%COMP%], \n.wfr-col-duration[_ngcontent-%COMP%] {\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.wfr-col-status[_ngcontent-%COMP%] {\n justify-self: start;\n}\n\n\n\n\n\n.wfr-detail-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: var(--mj-space-1);\n padding: 0 var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.wfr-tab[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n padding: var(--mj-space-2) var(--mj-space-2);\n font-size: var(--mj-font-size-sm);\n font-weight: 600;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.wfr-tab-active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.wfr-graph-pane[_ngcontent-%COMP%] {\n height: 100%;\n min-height: 12rem;\n}\n\n.wfr-steps-pane[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n border-left: 1px solid var(--mj-border-default);\n overflow: hidden;\n}\n\n\n\n[_nghost-%COMP%] .as-vertical .wfr-steps-pane {\n border-left: none;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.wfr-step-list[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: var(--mj-space-1);\n padding: var(--mj-space-2);\n border-bottom: 1px solid var(--mj-border-default);\n max-height: 8rem;\n overflow-y: auto;\n flex: none;\n}\n\n.wfr-step[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-1) var(--mj-space-2);\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n color: var(--mj-text-primary);\n font-size: var(--mj-font-size-sm);\n cursor: pointer;\n text-align: left;\n}\n\n.wfr-step[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.wfr-step-selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n\n\n.wfr-step[data-status='Skipped'][_ngcontent-%COMP%] .wfr-step-name[_ngcontent-%COMP%] {\n text-decoration: line-through;\n color: var(--mj-text-secondary);\n}\n\n.wfr-step-name[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.wfr-step-meta[_ngcontent-%COMP%] {\n font-size: var(--mj-font-size-xs);\n color: var(--mj-text-secondary);\n}\n\n.wfr-step-json[_ngcontent-%COMP%], \n.wfr-json-pane[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: auto;\n}\n\n.wfr-step-json-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n padding: var(--mj-space-1) var(--mj-space-3);\n font-weight: 600;\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n flex: none;\n}\n\n\n\n\n.wfr-stall[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 8px 12px;\n margin: 0 12px 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-warning) 45%, var(--mj-border-default));\n border-left: 4px solid var(--mj-status-warning);\n border-radius: var(--mj-radius-md);\n background: color-mix(in srgb, var(--mj-status-warning) 8%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n font-size: var(--mj-font-size-sm);\n}\n.wfr-stall-body[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n.wfr-stall[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-status-warning); }\n.wfr-stall-copy[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n.wfr-stall-copy[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n font-family: var(--mj-font-mono, ui-monospace, monospace);\n font-size: var(--mj-font-size-xs);\n}\n.wfr-stall-reason[_ngcontent-%COMP%] { color: var(--mj-text-secondary); }\n.wfr-stall-actions[_ngcontent-%COMP%] { display: flex; flex-wrap: wrap; gap: 6px; }\n\n.wfr-replay[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 12px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-page);\n}\n.wfr-replay[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-text-secondary); }\n.wfr-replay[_ngcontent-%COMP%] input[type='range'][_ngcontent-%COMP%] { flex: 1; accent-color: var(--mj-brand-primary); }\n\n.wfr-engine[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n overflow-x: auto;\n padding: 6px 12px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-page);\n font-family: var(--mj-font-mono, ui-monospace, monospace);\n font-size: var(--mj-font-size-xs);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n}\n.wfr-tick[_ngcontent-%COMP%] {\n flex: none;\n padding: 3px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n white-space: nowrap;\n}\n.wfr-tick-held[_ngcontent-%COMP%] {\n border-color: color-mix(in srgb, var(--mj-status-warning, #d97706) 45%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-status-warning, #d97706) 8%, var(--mj-bg-surface));\n}\n.wfr-tick-paused[_ngcontent-%COMP%] { color: var(--mj-brand-primary); border-color: var(--mj-border-strong); }\n\n.wfr-insp-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 7px 10px;\n margin: 0 0 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-primary);\n}\n.wfr-insp-card[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n font-family: var(--mj-font-mono, ui-monospace, monospace);\n font-size: var(--mj-font-size-xs);\n}\n.wfr-insp-label[_ngcontent-%COMP%] {\n font-size: var(--mj-font-size-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n}\n.wfr-insp-card[data-verdict='held'][_ngcontent-%COMP%], \n.wfr-insp-bad[_ngcontent-%COMP%] {\n border-color: color-mix(in srgb, var(--mj-status-warning, #d97706) 45%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-status-warning, #d97706) 8%, var(--mj-bg-surface));\n}\n.wfr-insp-card[data-verdict='satisfied'][_ngcontent-%COMP%] .wfr-insp-label[_ngcontent-%COMP%] { color: var(--mj-status-success); }\n.wfr-insp-actions[_ngcontent-%COMP%] { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 8px; }\n.wfr-insp-hint[_ngcontent-%COMP%] {\n margin: 0 0 8px;\n font-size: var(--mj-font-size-xs);\n color: var(--mj-text-muted);\n}\n\n.wfr-bp-bar[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n padding: 6px 12px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-page);\n}\n.wfr-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: var(--mj-font-size-xs);\n cursor: pointer;\n}\n.wfr-chip-break[_ngcontent-%COMP%] { color: var(--mj-status-error); border-color: color-mix(in srgb, var(--mj-status-error) 40%, transparent); }\n.wfr-chip-break[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 7px; }\n.wfr-chip-paused[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n cursor: default;\n}\n.wfr-chip-forced[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n border-color: color-mix(in srgb, var(--mj-status-warning) 40%, transparent);\n cursor: default;\n}\n.wfr-chip-x[_ngcontent-%COMP%] {\n font-size: 14px;\n line-height: 1;\n padding: 0 2px;\n}\n.wfr-chip-x[_ngcontent-%COMP%]:hover { color: var(--mj-text-primary); }\n\n.wfr-bp[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin: 0 0 8px;\n padding: 0;\n border: none;\n border-radius: 50%;\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n.wfr-bp[_ngcontent-%COMP%]:hover { color: var(--mj-status-error); }\n.wfr-bp-on[_ngcontent-%COMP%], \n.wfr-bp-on[_ngcontent-%COMP%]:hover { color: var(--mj-status-error); }\n.wfr-bp[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 10px; }\n.wfr-bp[_ngcontent-%COMP%]:disabled { opacity: 0.45; cursor: default; }\n\n.wfr-editor-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 10px;\n margin: 0 0 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface-card);\n}\n.wfr-editor-danger[_ngcontent-%COMP%] {\n border-color: color-mix(in srgb, var(--mj-status-error) 40%, var(--mj-border-default));\n}\n.wfr-json-edit[_ngcontent-%COMP%] {\n width: 100%;\n min-height: 120px;\n font-family: var(--mj-font-mono, ui-monospace, monospace);\n font-size: var(--mj-font-size-xs);\n resize: vertical;\n}\n.wfr-editor-error[_ngcontent-%COMP%] { color: var(--mj-status-error); font-size: var(--mj-font-size-xs); }"], changeDetection: 0 });
666
1806
  };
667
- WorkflowRunsResourceComponent = __decorate([
1807
+ WorkflowRunsResourceComponent = WorkflowRunsResourceComponent_1 = __decorate([
668
1808
  RegisterClass(BaseResourceComponent, 'WorkflowRunsResource')
669
1809
  ], WorkflowRunsResourceComponent);
670
1810
  export { WorkflowRunsResourceComponent };
671
1811
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(WorkflowRunsResourceComponent, [{
672
1812
  type: Component,
673
- args: [{ standalone: false, selector: 'mj-workflow-runs', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mj-page-layout>\n <mj-page-header\n Title=\"Runs\"\n Icon=\"fa-solid fa-timeline\"\n Subtitle=\"Every workflow that has run \u2014 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 \u2014 started by hand, on a schedule, or by an agent \u2014 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 <div class=\"wfr-split\" [class.wfr-split-open]=\"SelectedRun\">\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') : '\u2014' }}</span>\n <span class=\"wfr-col-time\">{{ run.CompletedAt ? (run.CompletedAt | date:'MMM d, h:mm:ss a') : '\u2014' }}</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\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 <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 (DetailTab === 'graph') {\n <!-- The canvas, then whatever step is selected on it. Clicking a node shows that\n step's record \u2014 the same move the agent-run timeline offers, so a workflow reads\n the same way wherever it is opened from. -->\n <div class=\"wfr-graph-pane\">\n <mj-task-graph-run-view\n [Provider]=\"ProviderToUse\"\n [ParentTaskID]=\"selected.ID\"\n [WorkflowName]=\"selected.Name\"\n [LiveUpdates]=\"selected.Status === 'Running' || selected.Status === 'In Progress'\"\n Height=\"100%\"\n (NodeSelected)=\"OnGraphNodeSelected($event)\">\n </mj-task-graph-run-view>\n </div>\n\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 <span class=\"wfr-row-status\" [attr.data-status]=\"step.Status\">{{ step.Status }}</span>\n </button>\n }\n </div>\n\n @if (SelectedStep; as step) {\n <div class=\"wfr-step-json\">\n <div class=\"wfr-step-json-head\">{{ step.Name }}</div>\n <mj-code-editor\n [ngModel]=\"SelectedStepJson\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n style=\"width: 100%;\">\n </mj-code-editor>\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 } @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 </div>\n }\n </mj-page-body>\n</mj-page-layout>\n", styles: [":host {\n display: block;\n height: 100%;\n}\n\n.wfr-status-filters {\n display: flex;\n gap: var(--mj-space-1);\n align-items: center;\n}\n\n/* List alone until something is selected; two panes after. The canvas gets the larger share\n because a graph is the thing being read once it is open. */\n.wfr-split {\n display: grid;\n grid-template-columns: 1fr;\n gap: var(--mj-space-3);\n height: 100%;\n min-height: 0;\n}\n\n.wfr-split-open {\n grid-template-columns: minmax(28rem, 40%) 1fr;\n}\n\n@media (max-width: 900px) {\n .wfr-split-open {\n grid-template-columns: 1fr;\n }\n}\n\n.wfr-list {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1);\n overflow-y: auto;\n min-height: 0;\n}\n\n.wfr-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n width: 100%;\n padding: var(--mj-space-2) var(--mj-space-3);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n text-align: left;\n cursor: pointer;\n color: var(--mj-text-primary);\n}\n\n.wfr-row:hover {\n border-color: var(--mj-border-strong);\n}\n\n.wfr-row:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n}\n\n.wfr-row-selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.wfr-row-main {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.wfr-row-name {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wfr-row-when {\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n}\n\n.wfr-row-status {\n flex: none;\n font-size: var(--mj-font-size-xs);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n padding: 2px var(--mj-space-2);\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-page);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n}\n\n/* Status carries meaning, so it is encoded in colour as well as text \u2014 a failed run should be\n findable without reading every row. Skipped stays grey on purpose: a branch that was not taken\n is a normal outcome, not a warning. */\n.wfr-row-status[data-status='Complete'] {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n}\n\n.wfr-row-status[data-status='Failed'] {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 40%, transparent);\n}\n\n.wfr-row-status[data-status='Running'] {\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n.wfr-detail {\n display: flex;\n flex-direction: column;\n min-height: 0;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n}\n\n.wfr-detail-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n padding: var(--mj-space-2) var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.wfr-detail-title {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n min-width: 0;\n}\n\n.wfr-detail-name {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wfr-detail-actions {\n display: flex;\n align-items: center;\n gap: var(--mj-space-1);\n flex: none;\n}\n\n/* ============================================================\n The run list as a sortable table\n ============================================================\n A run list is scanned for two things \u2014 the slowest run and the one that failed \u2014 and neither is\n answerable by scrolling. Columns line up so a reader compares down a column rather than reading\n each row; `tabular-nums` keeps the timestamps from jittering as digits change. */\n.wfr-head,\n.wfr-row {\n display: grid;\n grid-template-columns: minmax(0, 2fr) minmax(0, 1.3fr) minmax(0, 1.3fr) minmax(0, 0.7fr) minmax(0, 0.9fr);\n gap: var(--mj-space-2);\n align-items: center;\n}\n\n.wfr-head {\n position: sticky;\n top: 0;\n z-index: 1;\n padding: 0 var(--mj-space-3) var(--mj-space-1);\n background: var(--mj-bg-page);\n}\n\n.wfr-head-cell {\n display: flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n padding: var(--mj-space-1) 0;\n font-size: var(--mj-font-size-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n cursor: pointer;\n text-align: left;\n}\n\n.wfr-head-cell:hover {\n color: var(--mj-text-primary);\n}\n\n.wfr-head-cell i {\n opacity: 0.65;\n font-size: 0.85em;\n}\n\n.wfr-col-time,\n.wfr-col-duration {\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.wfr-col-status {\n justify-self: start;\n}\n\n/* ============================================================\n Detail panel: canvas + step JSON, or the whole run as JSON\n ============================================================ */\n.wfr-detail-tabs {\n display: flex;\n gap: var(--mj-space-1);\n padding: 0 var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.wfr-tab {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n padding: var(--mj-space-2) var(--mj-space-2);\n font-size: var(--mj-font-size-sm);\n font-weight: 600;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.wfr-tab-active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n/* The canvas takes the larger share; the step pane below it is a reading surface, not a diagram. */\n.wfr-graph-pane {\n flex: 1 1 55%;\n min-height: 12rem;\n}\n\n.wfr-steps-pane {\n flex: 1 1 45%;\n display: flex;\n flex-direction: column;\n min-height: 0;\n border-top: 1px solid var(--mj-border-default);\n overflow: hidden;\n}\n\n.wfr-step-list {\n display: flex;\n flex-wrap: wrap;\n gap: var(--mj-space-1);\n padding: var(--mj-space-2);\n border-bottom: 1px solid var(--mj-border-default);\n max-height: 30%;\n overflow-y: auto;\n}\n\n.wfr-step {\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-1) var(--mj-space-2);\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n color: var(--mj-text-primary);\n font-size: var(--mj-font-size-sm);\n cursor: pointer;\n text-align: left;\n}\n\n.wfr-step:hover {\n border-color: var(--mj-border-strong);\n}\n\n.wfr-step-selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n/* Work that never ran must not read like work that did \u2014 the same rule the run timeline follows. */\n.wfr-step[data-status='Skipped'] .wfr-step-name {\n text-decoration: line-through;\n color: var(--mj-text-secondary);\n}\n\n.wfr-step-name {\n font-weight: 600;\n}\n\n.wfr-step-meta {\n font-size: var(--mj-font-size-xs);\n color: var(--mj-text-secondary);\n}\n\n.wfr-step-json,\n.wfr-json-pane {\n flex: 1 1 auto;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: auto;\n}\n\n.wfr-step-json-head {\n padding: var(--mj-space-1) var(--mj-space-3);\n font-weight: 600;\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n}\n"] }]
674
- }], () => [{ type: i0.ChangeDetectorRef }], null); })();
675
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(WorkflowRunsResourceComponent, { className: "WorkflowRunsResourceComponent", filePath: "src/Workflows/components/workflow-runs-resource.component.ts", lineNumber: 87 }); })();
1813
+ args: [{ standalone: false, selector: 'mj-workflow-runs', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mj-page-layout>\n <mj-page-header\n Title=\"Runs\"\n Icon=\"fa-solid fa-timeline\"\n Subtitle=\"Every workflow that has run \u2014 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 \u2014 started by hand, on a schedule, or by an agent \u2014 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') : '\u2014' }}</span>\n <span class=\"wfr-col-time\">{{ run.CompletedAt ? (run.CompletedAt | date:'MMM d, h:mm:ss a') : '\u2014' }}</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 \u2014 \"the run strands silently\" \u2014 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\">\u00D7</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 \u2014 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 }} \u00B7 ready {{ tick.eligibleCount ?? 0 }}\n \u00B7 held {{ tick.heldCount ?? 0 }} \u00B7 took {{ tick.claimedCount ?? 0 }}\n </span>\n }\n @if (GraphDebug.Paused) {\n <span class=\"wfr-tick wfr-tick-paused\">\u23F8 paused \u2014 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 }} \u2192 {{ 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 \u2014 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 \u2014 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 }} \u2014 working }\n @case ('heartbeat-lost') { {{ claim.claimedBy }} \u2014 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) { \u2014 {{ 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 \u201C' + step.Name + '\u201D 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", styles: [":host {\n display: block;\n height: 100%;\n}\n\n.wfr-status-filters {\n display: flex;\n gap: var(--mj-space-1);\n align-items: center;\n}\n\n/* List alone until something is selected; two resizable panes after. The size is the user's \u2014 see\n the LAYOUT_KEYS note on the component for why it is persisted server-side rather than locally. */\n.wfr-split {\n height: 100%;\n min-height: 0;\n}\n\n/* A gutter you can find. The default is a hairline, which is discoverable only by accident. */\n:host ::ng-deep .wfr-split > .as-split-gutter,\n:host ::ng-deep .wfr-graph-split > .as-split-gutter {\n background: transparent !important;\n position: relative;\n}\n\n:host ::ng-deep .wfr-split > .as-split-gutter::after,\n:host ::ng-deep .wfr-graph-split > .as-split-gutter::after {\n content: '';\n position: absolute;\n inset: 0;\n margin: auto;\n background: var(--mj-border-default);\n border-radius: var(--mj-radius-full);\n}\n\n:host ::ng-deep .wfr-split.as-horizontal > .as-split-gutter::after,\n:host ::ng-deep .wfr-graph-split.as-horizontal > .as-split-gutter::after {\n width: 2px;\n}\n\n:host ::ng-deep .wfr-graph-split.as-vertical > .as-split-gutter::after {\n height: 2px;\n}\n\n:host ::ng-deep .wfr-split > .as-split-gutter:hover::after,\n:host ::ng-deep .wfr-graph-split > .as-split-gutter:hover::after {\n background: var(--mj-brand-primary);\n}\n\n/* The canvas and the step record sit SIDE BY SIDE \u2014 a JSON record in a strip along the bottom shows\n about ten lines. Stacks below the breakpoint, where three columns would leave each too narrow to\n use. */\n.wfr-graph-split {\n flex: 1 1 auto;\n min-height: 0;\n}\n\n.wfr-list {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1);\n overflow-y: auto;\n min-height: 0;\n}\n\n.wfr-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n width: 100%;\n padding: var(--mj-space-2) var(--mj-space-3);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n text-align: left;\n cursor: pointer;\n color: var(--mj-text-primary);\n}\n\n.wfr-row:hover {\n border-color: var(--mj-border-strong);\n}\n\n.wfr-row:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n}\n\n.wfr-row-selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.wfr-row-main {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.wfr-row-name {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wfr-row-when {\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n}\n\n.wfr-row-status {\n flex: none;\n font-size: var(--mj-font-size-xs);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n padding: 2px var(--mj-space-2);\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-page);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n}\n\n/* Status carries meaning, so it is encoded in colour as well as text \u2014 a failed run should be\n findable without reading every row. Skipped stays grey on purpose: a branch that was not taken\n is a normal outcome, not a warning. */\n.wfr-row-status[data-status='Complete'] {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n}\n\n.wfr-row-status[data-status='Failed'] {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 40%, transparent);\n}\n\n.wfr-row-status[data-status='Running'] {\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n.wfr-detail {\n display: flex;\n flex-direction: column;\n /* Fills its split area. Without it the column sizes to its CONTENT, so the canvas below \u2014\n `flex: 1 1 auto` of an auto-height parent \u2014 got its intrinsic height and left dead space. */\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n}\n\n.wfr-detail-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n padding: var(--mj-space-2) var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.wfr-detail-title {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n min-width: 0;\n}\n\n.wfr-detail-name {\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wfr-detail-actions {\n display: flex;\n align-items: center;\n gap: var(--mj-space-1);\n flex: none;\n}\n\n/* ============================================================\n The run list as a sortable table\n ============================================================\n A run list is scanned for two things \u2014 the slowest run and the one that failed \u2014 and neither is\n answerable by scrolling. Columns line up so a reader compares down a column rather than reading\n each row; `tabular-nums` keeps the timestamps from jittering as digits change. */\n.wfr-head,\n.wfr-row {\n display: grid;\n grid-template-columns: minmax(0, 2fr) minmax(0, 1.3fr) minmax(0, 1.3fr) minmax(0, 0.7fr) minmax(0, 0.9fr);\n gap: var(--mj-space-2);\n align-items: center;\n}\n\n.wfr-head {\n position: sticky;\n top: 0;\n z-index: 1;\n padding: 0 var(--mj-space-3) var(--mj-space-1);\n background: var(--mj-bg-page);\n}\n\n.wfr-head-cell {\n display: flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n padding: var(--mj-space-1) 0;\n font-size: var(--mj-font-size-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n cursor: pointer;\n text-align: left;\n}\n\n.wfr-head-cell:hover {\n color: var(--mj-text-primary);\n}\n\n.wfr-head-cell i {\n opacity: 0.65;\n font-size: 0.85em;\n}\n\n.wfr-col-time,\n.wfr-col-duration {\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.wfr-col-status {\n justify-self: start;\n}\n\n/* ============================================================\n Detail panel: canvas + step JSON, or the whole run as JSON\n ============================================================ */\n.wfr-detail-tabs {\n display: flex;\n gap: var(--mj-space-1);\n padding: 0 var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.wfr-tab {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n padding: var(--mj-space-2) var(--mj-space-2);\n font-size: var(--mj-font-size-sm);\n font-weight: 600;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.wfr-tab-active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.wfr-graph-pane {\n height: 100%;\n min-height: 12rem;\n}\n\n.wfr-steps-pane {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n border-left: 1px solid var(--mj-border-default);\n overflow: hidden;\n}\n\n/* Stacked layout puts the divider back on top, where the eye expects it. */\n:host ::ng-deep .as-vertical .wfr-steps-pane {\n border-left: none;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.wfr-step-list {\n display: flex;\n flex-wrap: wrap;\n gap: var(--mj-space-1);\n padding: var(--mj-space-2);\n border-bottom: 1px solid var(--mj-border-default);\n max-height: 8rem;\n overflow-y: auto;\n flex: none;\n}\n\n.wfr-step {\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-1) var(--mj-space-2);\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n color: var(--mj-text-primary);\n font-size: var(--mj-font-size-sm);\n cursor: pointer;\n text-align: left;\n}\n\n.wfr-step:hover {\n border-color: var(--mj-border-strong);\n}\n\n.wfr-step-selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n/* Work that never ran must not read like work that did \u2014 the same rule the run timeline follows. */\n.wfr-step[data-status='Skipped'] .wfr-step-name {\n text-decoration: line-through;\n color: var(--mj-text-secondary);\n}\n\n.wfr-step-name {\n font-weight: 600;\n}\n\n.wfr-step-meta {\n font-size: var(--mj-font-size-xs);\n color: var(--mj-text-secondary);\n}\n\n.wfr-step-json,\n.wfr-json-pane {\n flex: 1 1 auto;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: auto;\n}\n\n.wfr-step-json-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n padding: var(--mj-space-1) var(--mj-space-3);\n font-weight: 600;\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-secondary);\n flex: none;\n}\n\n/* \u2500\u2500 live console \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.wfr-stall {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 8px 12px;\n margin: 0 12px 8px;\n border: 1px solid color-mix(in srgb, var(--mj-status-warning) 45%, var(--mj-border-default));\n border-left: 4px solid var(--mj-status-warning);\n border-radius: var(--mj-radius-md);\n background: color-mix(in srgb, var(--mj-status-warning) 8%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n font-size: var(--mj-font-size-sm);\n}\n.wfr-stall-body {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n.wfr-stall i { color: var(--mj-status-warning); }\n.wfr-stall-copy {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n.wfr-stall-copy code {\n font-family: var(--mj-font-mono, ui-monospace, monospace);\n font-size: var(--mj-font-size-xs);\n}\n.wfr-stall-reason { color: var(--mj-text-secondary); }\n.wfr-stall-actions { display: flex; flex-wrap: wrap; gap: 6px; }\n\n.wfr-replay {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 12px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-page);\n}\n.wfr-replay i { color: var(--mj-text-secondary); }\n.wfr-replay input[type='range'] { flex: 1; accent-color: var(--mj-brand-primary); }\n\n.wfr-engine {\n display: flex;\n gap: 8px;\n overflow-x: auto;\n padding: 6px 12px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-page);\n font-family: var(--mj-font-mono, ui-monospace, monospace);\n font-size: var(--mj-font-size-xs);\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n}\n.wfr-tick {\n flex: none;\n padding: 3px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n white-space: nowrap;\n}\n.wfr-tick-held {\n border-color: color-mix(in srgb, var(--mj-status-warning, #d97706) 45%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-status-warning, #d97706) 8%, var(--mj-bg-surface));\n}\n.wfr-tick-paused { color: var(--mj-brand-primary); border-color: var(--mj-border-strong); }\n\n.wfr-insp-card {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 7px 10px;\n margin: 0 0 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n font-size: var(--mj-font-size-sm);\n color: var(--mj-text-primary);\n}\n.wfr-insp-card code {\n font-family: var(--mj-font-mono, ui-monospace, monospace);\n font-size: var(--mj-font-size-xs);\n}\n.wfr-insp-label {\n font-size: var(--mj-font-size-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n}\n.wfr-insp-card[data-verdict='held'],\n.wfr-insp-bad {\n border-color: color-mix(in srgb, var(--mj-status-warning, #d97706) 45%, var(--mj-border-default));\n background: color-mix(in srgb, var(--mj-status-warning, #d97706) 8%, var(--mj-bg-surface));\n}\n.wfr-insp-card[data-verdict='satisfied'] .wfr-insp-label { color: var(--mj-status-success); }\n.wfr-insp-actions { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 8px; }\n.wfr-insp-hint {\n margin: 0 0 8px;\n font-size: var(--mj-font-size-xs);\n color: var(--mj-text-muted);\n}\n\n.wfr-bp-bar {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n padding: 6px 12px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-page);\n}\n.wfr-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: var(--mj-font-size-xs);\n cursor: pointer;\n}\n.wfr-chip-break { color: var(--mj-status-error); border-color: color-mix(in srgb, var(--mj-status-error) 40%, transparent); }\n.wfr-chip-break i { font-size: 7px; }\n.wfr-chip-paused {\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n cursor: default;\n}\n.wfr-chip-forced {\n color: var(--mj-status-warning);\n border-color: color-mix(in srgb, var(--mj-status-warning) 40%, transparent);\n cursor: default;\n}\n.wfr-chip-x {\n font-size: 14px;\n line-height: 1;\n padding: 0 2px;\n}\n.wfr-chip-x:hover { color: var(--mj-text-primary); }\n\n.wfr-bp {\n width: 22px;\n height: 22px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin: 0 0 8px;\n padding: 0;\n border: none;\n border-radius: 50%;\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n.wfr-bp:hover { color: var(--mj-status-error); }\n.wfr-bp-on,\n.wfr-bp-on:hover { color: var(--mj-status-error); }\n.wfr-bp i { font-size: 10px; }\n.wfr-bp:disabled { opacity: 0.45; cursor: default; }\n\n.wfr-editor-card {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 10px;\n margin: 0 0 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface-card);\n}\n.wfr-editor-danger {\n border-color: color-mix(in srgb, var(--mj-status-error) 40%, var(--mj-border-default));\n}\n.wfr-json-edit {\n width: 100%;\n min-height: 120px;\n font-family: var(--mj-font-mono, ui-monospace, monospace);\n font-size: var(--mj-font-size-xs);\n resize: vertical;\n}\n.wfr-editor-error { color: var(--mj-status-error); font-size: var(--mj-font-size-xs); }\n"] }]
1814
+ }], () => [{ type: i0.ChangeDetectorRef }], { onViewportResized: [{
1815
+ type: HostListener,
1816
+ args: ['window:resize']
1817
+ }], GraphDebug: [{
1818
+ type: ViewChild,
1819
+ args: [TaskGraphDebuggerComponent]
1820
+ }] }); })();
1821
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(WorkflowRunsResourceComponent, { className: "WorkflowRunsResourceComponent", filePath: "src/Workflows/components/workflow-runs-resource.component.ts", lineNumber: 101 }); })();
676
1822
  //# sourceMappingURL=workflow-runs-resource.component.js.map