@memberjunction/ng-task-graph-editor 6.1.0-edge.1 → 6.1.0-edge.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/LICENSE +180 -4
  2. package/README.md +197 -0
  3. package/dist/lib/debug-variables.d.ts +27 -0
  4. package/dist/lib/debug-variables.d.ts.map +1 -0
  5. package/dist/lib/debug-variables.js +96 -0
  6. package/dist/lib/debug-variables.js.map +1 -0
  7. package/dist/lib/pane-split.d.ts +11 -0
  8. package/dist/lib/pane-split.d.ts.map +1 -0
  9. package/dist/lib/pane-split.js +36 -0
  10. package/dist/lib/pane-split.js.map +1 -0
  11. package/dist/lib/task-graph-canvas-adapter.d.ts +142 -7
  12. package/dist/lib/task-graph-canvas-adapter.d.ts.map +1 -1
  13. package/dist/lib/task-graph-canvas-adapter.js +319 -44
  14. package/dist/lib/task-graph-canvas-adapter.js.map +1 -1
  15. package/dist/lib/task-graph-debug-toolbar.component.d.ts +27 -0
  16. package/dist/lib/task-graph-debug-toolbar.component.d.ts.map +1 -0
  17. package/dist/lib/task-graph-debug-toolbar.component.js +153 -0
  18. package/dist/lib/task-graph-debug-toolbar.component.js.map +1 -0
  19. package/dist/lib/task-graph-debugger.component.d.ts +96 -0
  20. package/dist/lib/task-graph-debugger.component.d.ts.map +1 -0
  21. package/dist/lib/task-graph-debugger.component.js +371 -0
  22. package/dist/lib/task-graph-debugger.component.js.map +1 -0
  23. package/dist/lib/task-graph-editor.component.d.ts +144 -5
  24. package/dist/lib/task-graph-editor.component.d.ts.map +1 -1
  25. package/dist/lib/task-graph-editor.component.js +321 -26
  26. package/dist/lib/task-graph-editor.component.js.map +1 -1
  27. package/dist/lib/task-graph-editor.module.d.ts +10 -5
  28. package/dist/lib/task-graph-editor.module.d.ts.map +1 -1
  29. package/dist/lib/task-graph-editor.module.js +53 -5
  30. package/dist/lib/task-graph-editor.module.js.map +1 -1
  31. package/dist/lib/task-graph-properties-panel.component.d.ts +34 -8
  32. package/dist/lib/task-graph-properties-panel.component.d.ts.map +1 -1
  33. package/dist/lib/task-graph-properties-panel.component.js +164 -45
  34. package/dist/lib/task-graph-properties-panel.component.js.map +1 -1
  35. package/dist/lib/task-graph-run-prefs.d.ts +34 -0
  36. package/dist/lib/task-graph-run-prefs.d.ts.map +1 -0
  37. package/dist/lib/task-graph-run-prefs.js +67 -0
  38. package/dist/lib/task-graph-run-prefs.js.map +1 -0
  39. package/dist/lib/task-graph-run-view.component.d.ts +290 -0
  40. package/dist/lib/task-graph-run-view.component.d.ts.map +1 -0
  41. package/dist/lib/task-graph-run-view.component.js +826 -0
  42. package/dist/lib/task-graph-run-view.component.js.map +1 -0
  43. package/dist/lib/task-graph-runtime-source.d.ts +7 -1
  44. package/dist/lib/task-graph-runtime-source.d.ts.map +1 -1
  45. package/dist/lib/task-graph-runtime-source.js +14 -2
  46. package/dist/lib/task-graph-runtime-source.js.map +1 -1
  47. package/dist/lib/task-graph-variables.component.d.ts +23 -0
  48. package/dist/lib/task-graph-variables.component.d.ts.map +1 -0
  49. package/dist/lib/task-graph-variables.component.js +192 -0
  50. package/dist/lib/task-graph-variables.component.js.map +1 -0
  51. package/dist/lib/workflow-debug-host.d.ts +23 -0
  52. package/dist/lib/workflow-debug-host.d.ts.map +1 -0
  53. package/dist/lib/workflow-debug-host.js +101 -0
  54. package/dist/lib/workflow-debug-host.js.map +1 -0
  55. package/dist/public-api.d.ts +8 -0
  56. package/dist/public-api.d.ts.map +1 -1
  57. package/dist/public-api.js +8 -0
  58. package/dist/public-api.js.map +1 -1
  59. package/package.json +11 -9
@@ -0,0 +1,371 @@
1
+ /**
2
+ * Drop-in debugger for a live task graph.
3
+ *
4
+ * This is a wrap of the existing run view + VCR toolbar + the session wiring the harness and
5
+ * Runs console already had (RouteOperation, frame subscribe, `$.debug` bag). The picture and
6
+ * the verbs are unchanged; a host now supplies a parent task id and nothing else.
7
+ *
8
+ * @module @memberjunction/ng-task-graph-editor
9
+ */
10
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
11
+ import { RunView } from '@memberjunction/core';
12
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
13
+ import { UUIDsEqual } from '@memberjunction/global';
14
+ import { ComposeBreakpointSet, ParseWorkflowDebugOverlay, ParseWorkflowInvocation, } from './workflow-debug-host';
15
+ import { TaskGraphRunViewComponent, } from './task-graph-run-view.component';
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "@memberjunction/ng-ui-components";
18
+ import * as i2 from "./task-graph-debug-toolbar.component";
19
+ import * as i3 from "./task-graph-run-view.component";
20
+ function TaskGraphDebuggerComponent_Conditional_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
21
+ i0.ɵɵelement(0, "mj-alert", 5);
22
+ } if (rf & 2) {
23
+ const ctx_r1 = i0.ɵɵnextContext(2);
24
+ i0.ɵɵproperty("Message", ctx_r1.ControlError);
25
+ } }
26
+ function TaskGraphDebuggerComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
27
+ const _r1 = i0.ɵɵgetCurrentView();
28
+ i0.ɵɵelementStart(0, "div", 1)(1, "mj-task-graph-debug-toolbar", 4);
29
+ i0.ɵɵlistener("Pause", function TaskGraphDebuggerComponent_Conditional_1_Template_mj_task_graph_debug_toolbar_Pause_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.Pause()); })("Resume", function TaskGraphDebuggerComponent_Conditional_1_Template_mj_task_graph_debug_toolbar_Resume_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.Resume()); })("Step", function TaskGraphDebuggerComponent_Conditional_1_Template_mj_task_graph_debug_toolbar_Step_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.Step("one")); })("StepWave", function TaskGraphDebuggerComponent_Conditional_1_Template_mj_task_graph_debug_toolbar_StepWave_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.Step("wave")); })("Cancel", function TaskGraphDebuggerComponent_Conditional_1_Template_mj_task_graph_debug_toolbar_Cancel_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.Cancel()); });
30
+ i0.ɵɵelementEnd();
31
+ i0.ɵɵconditionalCreate(2, TaskGraphDebuggerComponent_Conditional_1_Conditional_2_Template, 1, 1, "mj-alert", 5);
32
+ i0.ɵɵelementEnd();
33
+ } if (rf & 2) {
34
+ const ctx_r1 = i0.ɵɵnextContext();
35
+ i0.ɵɵadvance();
36
+ i0.ɵɵproperty("Paused", ctx_r1.Paused)("Busy", ctx_r1.Busy)("Settled", ctx_r1.IsSettled)("Enabled", ctx_r1.Enabled && !ctx_r1.Busy);
37
+ i0.ɵɵadvance();
38
+ i0.ɵɵconditional(ctx_r1.ControlError ? 2 : -1);
39
+ } }
40
+ function AsFrameSource(provider) {
41
+ const candidate = provider;
42
+ return typeof candidate.TaskGraphFrames === 'function' ? candidate : null;
43
+ }
44
+ export class TaskGraphDebuggerComponent extends BaseAngularComponent {
45
+ cdr;
46
+ /**
47
+ * The graph to debug — the parent `MJ: Tasks` row. Everything else is optional.
48
+ */
49
+ set ParentTaskID(value) {
50
+ if (value === this.parentTaskID)
51
+ return;
52
+ this.detachFrames();
53
+ this.parentTaskID = value;
54
+ this.IsSettled = false;
55
+ if (value) {
56
+ this.attachFrames(value);
57
+ void this.Refresh();
58
+ }
59
+ else {
60
+ this.clearSession();
61
+ }
62
+ this.cdr.markForCheck();
63
+ }
64
+ get ParentTaskID() {
65
+ return this.parentTaskID;
66
+ }
67
+ WorkflowName = 'Workflow';
68
+ LiveUpdates = true;
69
+ PollIntervalSeconds = 3;
70
+ Height = '100%';
71
+ ShowLegend = false;
72
+ ShowCanvasToolbar = true;
73
+ ToolbarVisibility = 'minimized';
74
+ ToolbarAlign = 'left';
75
+ AllowBreakpointEditing = true;
76
+ ShowVariables = true;
77
+ /** VCR + error line above the canvas. Off if the host already has its own bar. */
78
+ ShowChrome = true;
79
+ Enabled = true;
80
+ ReplayAt = null;
81
+ /** Claim-gated. Public so a host toolbar can bind the same flag. */
82
+ Paused = false;
83
+ IsSettled = false;
84
+ Busy = false;
85
+ ControlError = null;
86
+ Breakpoints = [];
87
+ PausedAtTaskID = null;
88
+ EdgeOverrides = {};
89
+ Invocation = null;
90
+ LatestFrame = null;
91
+ NodeSelected = new EventEmitter();
92
+ ConnectionSelected = new EventEmitter();
93
+ LegendToggled = new EventEmitter();
94
+ SettledChange = new EventEmitter();
95
+ PausedChange = new EventEmitter();
96
+ Frame = new EventEmitter();
97
+ ControlFailed = new EventEmitter();
98
+ Settled = new EventEmitter();
99
+ RunView;
100
+ parentTaskID = null;
101
+ frameSub = null;
102
+ constructor(cdr) {
103
+ super();
104
+ this.cdr = cdr;
105
+ }
106
+ ngOnDestroy() {
107
+ this.detachFrames();
108
+ }
109
+ // ── verbs: same RouteOperation calls the hosts already made ──────────────
110
+ Pause() {
111
+ return this.executeControl('TaskGraph.Pause', { parentTaskID: this.parentTaskID });
112
+ }
113
+ Resume() {
114
+ return this.executeControl('TaskGraph.Resume', { parentTaskID: this.parentTaskID });
115
+ }
116
+ Step(target = 'one') {
117
+ return this.executeControl('TaskGraph.Step', { parentTaskID: this.parentTaskID, target });
118
+ }
119
+ Cancel() {
120
+ return this.executeControl('TaskGraph.Cancel', { parentTaskID: this.parentTaskID });
121
+ }
122
+ async ToggleBreakpoint(taskID, enabled) {
123
+ await this.Refresh();
124
+ return this.executeControl('TaskGraph.SetBreakpoints', {
125
+ parentTaskID: this.parentTaskID,
126
+ taskIDs: ComposeBreakpointSet(this.Breakpoints, taskID, enabled),
127
+ });
128
+ }
129
+ OverrideEdge(edgeID, verdict) {
130
+ return this.executeControl('TaskGraph.OverrideEdge', {
131
+ parentTaskID: this.parentTaskID,
132
+ edgeID,
133
+ verdict,
134
+ });
135
+ }
136
+ SkipTask(taskID) {
137
+ return this.executeControl('TaskGraph.SkipTask', { taskID });
138
+ }
139
+ RetryTask(taskID, inputPayload) {
140
+ return this.executeControl('TaskGraph.RetryTask', { taskID, inputPayload });
141
+ }
142
+ UpdateTaskInput(taskID, payload) {
143
+ return this.executeControl('TaskGraph.UpdateTaskInput', { taskID, payload });
144
+ }
145
+ ForceCompleteTask(taskID, payload) {
146
+ return this.executeControl('TaskGraph.ForceCompleteTask', { taskID, payload });
147
+ }
148
+ HasBreakpoint(taskID) {
149
+ return this.Breakpoints.some((id) => UUIDsEqual(id, taskID));
150
+ }
151
+ GetEdgeOverride(edgeID) {
152
+ if (!edgeID)
153
+ return null;
154
+ for (const [id, verdict] of Object.entries(this.EdgeOverrides)) {
155
+ if (UUIDsEqual(id, edgeID))
156
+ return verdict;
157
+ }
158
+ return null;
159
+ }
160
+ /** Re-read `$.debug` from the parent row. Same query the hosts already used. */
161
+ async Refresh() {
162
+ if (!this.parentTaskID)
163
+ return;
164
+ const parentTaskID = this.parentTaskID;
165
+ const result = await RunView.FromMetadataProvider(this.ProviderToUse).RunView({
166
+ EntityName: 'MJ: Tasks',
167
+ ExtraFilter: `ID='${parentTaskID}'`,
168
+ ResultType: 'entity_object',
169
+ BypassCache: true,
170
+ });
171
+ if (this.parentTaskID !== parentTaskID)
172
+ return;
173
+ const parent = result.Success ? result.Results?.[0] : undefined;
174
+ const overlay = ParseWorkflowDebugOverlay(parent?.InputPayload);
175
+ this.Breakpoints = overlay.breakpoints;
176
+ this.EdgeOverrides = overlay.edgeOverrides;
177
+ this.Invocation = ParseWorkflowInvocation(parent?.InputPayload);
178
+ if (!this.IsSettled) {
179
+ this.Paused = overlay.paused;
180
+ this.PausedAtTaskID = overlay.pausedAtTaskID;
181
+ }
182
+ this.cdr.markForCheck();
183
+ }
184
+ OnRunNodeSelected(event) {
185
+ this.NodeSelected.emit(event);
186
+ }
187
+ OnRunConnectionSelected(event) {
188
+ this.ConnectionSelected.emit(event);
189
+ }
190
+ OnRunSettled() {
191
+ this.markSettled();
192
+ }
193
+ OnRunBreakpointToggled(event) {
194
+ void this.ToggleBreakpoint(event.TaskID, event.Enabled);
195
+ }
196
+ OnRunEdgeOverride(event) {
197
+ void this.OverrideEdge(event.EdgeID, event.Verdict);
198
+ }
199
+ async executeControl(operationKey, input) {
200
+ if (!this.parentTaskID)
201
+ return false;
202
+ const provider = this.ProviderToUse;
203
+ if (typeof provider.RouteOperation !== 'function') {
204
+ this.failControl('This connection cannot send workflow controls.');
205
+ return false;
206
+ }
207
+ this.Busy = true;
208
+ this.ControlError = null;
209
+ this.cdr.markForCheck();
210
+ try {
211
+ const result = await provider.RouteOperation(operationKey, input, {});
212
+ const output = result?.Output;
213
+ if (!result?.Success || output?.success === false) {
214
+ this.failControl(output?.errorMessage ?? result?.ErrorMessage ?? 'The control could not be applied.');
215
+ return false;
216
+ }
217
+ if (operationKey === 'TaskGraph.Pause')
218
+ this.setPaused(true);
219
+ if (operationKey === 'TaskGraph.Resume')
220
+ this.setPaused(false);
221
+ await this.Refresh();
222
+ return true;
223
+ }
224
+ catch (e) {
225
+ this.failControl(e instanceof Error ? e.message : String(e));
226
+ return false;
227
+ }
228
+ finally {
229
+ this.Busy = false;
230
+ this.cdr.markForCheck();
231
+ }
232
+ }
233
+ attachFrames(parentTaskID) {
234
+ this.detachFrames();
235
+ const source = AsFrameSource(this.ProviderToUse);
236
+ if (!source)
237
+ return;
238
+ this.frameSub = source.TaskGraphFrames(parentTaskID).subscribe({
239
+ next: (frame) => this.onFrame(frame),
240
+ error: () => { this.frameSub = null; },
241
+ complete: () => { this.frameSub = null; },
242
+ });
243
+ }
244
+ onFrame(frame) {
245
+ this.LatestFrame = frame;
246
+ this.Frame.emit(frame);
247
+ if (this.IsSettled && (frame.kind === 'GraphPaused' || frame.kind === 'BreakpointHit')) {
248
+ return;
249
+ }
250
+ if (frame.kind === 'GraphPaused' || frame.kind === 'BreakpointHit') {
251
+ this.IsSettled = false;
252
+ this.setPaused(true);
253
+ if (this.parentTaskID)
254
+ void this.Refresh();
255
+ }
256
+ else if (frame.kind === 'GraphResumed' || frame.kind === 'TaskStarted') {
257
+ this.IsSettled = false;
258
+ this.setPaused(false);
259
+ }
260
+ else if (frame.kind === 'GraphSettled') {
261
+ this.markSettled();
262
+ }
263
+ this.cdr.markForCheck();
264
+ }
265
+ detachFrames() {
266
+ this.frameSub?.unsubscribe();
267
+ this.frameSub = null;
268
+ this.LatestFrame = null;
269
+ }
270
+ markSettled() {
271
+ this.IsSettled = true;
272
+ this.setPaused(false);
273
+ this.PausedAtTaskID = null;
274
+ this.SettledChange.emit(true);
275
+ this.Settled.emit();
276
+ if (this.parentTaskID)
277
+ void this.Refresh();
278
+ this.cdr.markForCheck();
279
+ }
280
+ setPaused(paused) {
281
+ this.Paused = paused;
282
+ this.PausedChange.emit(paused);
283
+ }
284
+ failControl(message) {
285
+ this.ControlError = message;
286
+ this.ControlFailed.emit(message);
287
+ this.cdr.markForCheck();
288
+ }
289
+ clearSession() {
290
+ this.Paused = false;
291
+ this.IsSettled = false;
292
+ this.Busy = false;
293
+ this.ControlError = null;
294
+ this.Breakpoints = [];
295
+ this.PausedAtTaskID = null;
296
+ this.EdgeOverrides = {};
297
+ this.Invocation = null;
298
+ this.LatestFrame = null;
299
+ }
300
+ static ɵfac = function TaskGraphDebuggerComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TaskGraphDebuggerComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
301
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TaskGraphDebuggerComponent, selectors: [["mj-task-graph-debugger"]], viewQuery: function TaskGraphDebuggerComponent_Query(rf, ctx) { if (rf & 1) {
302
+ i0.ɵɵviewQuery(TaskGraphRunViewComponent, 5);
303
+ } if (rf & 2) {
304
+ let _t;
305
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.RunView = _t.first);
306
+ } }, inputs: { ParentTaskID: "ParentTaskID", WorkflowName: "WorkflowName", LiveUpdates: "LiveUpdates", PollIntervalSeconds: "PollIntervalSeconds", Height: "Height", ShowLegend: "ShowLegend", ShowCanvasToolbar: "ShowCanvasToolbar", ToolbarVisibility: "ToolbarVisibility", ToolbarAlign: "ToolbarAlign", AllowBreakpointEditing: "AllowBreakpointEditing", ShowVariables: "ShowVariables", ShowChrome: "ShowChrome", Enabled: "Enabled", ReplayAt: "ReplayAt" }, outputs: { NodeSelected: "NodeSelected", ConnectionSelected: "ConnectionSelected", LegendToggled: "LegendToggled", SettledChange: "SettledChange", PausedChange: "PausedChange", Frame: "Frame", ControlFailed: "ControlFailed", Settled: "Settled" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 20, consts: [[1, "tgdbg"], [1, "tgdbg-chrome"], [1, "tgdbg-body"], [3, "NodeSelected", "ConnectionSelected", "LegendToggled", "Settled", "BreakpointToggled", "EdgeOverrideRequested", "Provider", "ParentTaskID", "WorkflowName", "LiveUpdates", "PollIntervalSeconds", "Height", "ShowLegend", "ShowToolbar", "ToolbarVisibility", "ToolbarAlign", "LiveFrame", "ReplayAt", "Breakpoints", "PausedAtTaskID", "GraphPaused", "EdgeOverrides", "AllowBreakpointEditing", "ShowVariables", "Invocation"], [3, "Pause", "Resume", "Step", "StepWave", "Cancel", "Paused", "Busy", "Settled", "Enabled"], ["Variant", "error", 3, "Message"]], template: function TaskGraphDebuggerComponent_Template(rf, ctx) { if (rf & 1) {
307
+ i0.ɵɵelementStart(0, "div", 0);
308
+ i0.ɵɵconditionalCreate(1, TaskGraphDebuggerComponent_Conditional_1_Template, 3, 5, "div", 1);
309
+ i0.ɵɵelementStart(2, "div", 2)(3, "mj-task-graph-run-view", 3);
310
+ i0.ɵɵlistener("NodeSelected", function TaskGraphDebuggerComponent_Template_mj_task_graph_run_view_NodeSelected_3_listener($event) { return ctx.OnRunNodeSelected($event); })("ConnectionSelected", function TaskGraphDebuggerComponent_Template_mj_task_graph_run_view_ConnectionSelected_3_listener($event) { return ctx.OnRunConnectionSelected($event); })("LegendToggled", function TaskGraphDebuggerComponent_Template_mj_task_graph_run_view_LegendToggled_3_listener($event) { return ctx.LegendToggled.emit($event); })("Settled", function TaskGraphDebuggerComponent_Template_mj_task_graph_run_view_Settled_3_listener() { return ctx.OnRunSettled(); })("BreakpointToggled", function TaskGraphDebuggerComponent_Template_mj_task_graph_run_view_BreakpointToggled_3_listener($event) { return ctx.OnRunBreakpointToggled($event); })("EdgeOverrideRequested", function TaskGraphDebuggerComponent_Template_mj_task_graph_run_view_EdgeOverrideRequested_3_listener($event) { return ctx.OnRunEdgeOverride($event); });
311
+ i0.ɵɵelementEnd()()();
312
+ } if (rf & 2) {
313
+ i0.ɵɵadvance();
314
+ i0.ɵɵconditional(ctx.ShowChrome ? 1 : -1);
315
+ i0.ɵɵadvance(2);
316
+ i0.ɵɵproperty("Provider", ctx.ProviderToUse)("ParentTaskID", ctx.ParentTaskID)("WorkflowName", ctx.WorkflowName)("LiveUpdates", ctx.LiveUpdates)("PollIntervalSeconds", ctx.PollIntervalSeconds)("Height", "100%")("ShowLegend", ctx.ShowLegend)("ShowToolbar", ctx.ShowCanvasToolbar)("ToolbarVisibility", ctx.ToolbarVisibility)("ToolbarAlign", ctx.ToolbarAlign)("LiveFrame", ctx.LatestFrame)("ReplayAt", ctx.ReplayAt)("Breakpoints", ctx.Breakpoints)("PausedAtTaskID", ctx.PausedAtTaskID)("GraphPaused", ctx.Paused)("EdgeOverrides", ctx.EdgeOverrides)("AllowBreakpointEditing", ctx.AllowBreakpointEditing)("ShowVariables", ctx.ShowVariables)("Invocation", ctx.Invocation);
317
+ } }, dependencies: [i1.MJAlertComponent, i2.TaskGraphDebugToolbarComponent, i3.TaskGraphRunViewComponent], styles: ["[_nghost-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n}\n\n.tgdbg[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n gap: var(--mj-space-2);\n}\n\n.tgdbg-chrome[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--mj-space-2);\n}\n\n.tgdbg-body[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n min-height: 0;\n}"], changeDetection: 0 });
318
+ }
319
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TaskGraphDebuggerComponent, [{
320
+ type: Component,
321
+ args: [{ standalone: false, selector: 'mj-task-graph-debugger', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"tgdbg\">\n @if (ShowChrome) {\n <div class=\"tgdbg-chrome\">\n <mj-task-graph-debug-toolbar\n [Paused]=\"Paused\"\n [Busy]=\"Busy\"\n [Settled]=\"IsSettled\"\n [Enabled]=\"Enabled && !Busy\"\n (Pause)=\"Pause()\"\n (Resume)=\"Resume()\"\n (Step)=\"Step('one')\"\n (StepWave)=\"Step('wave')\"\n (Cancel)=\"Cancel()\">\n </mj-task-graph-debug-toolbar>\n @if (ControlError) {\n <mj-alert Variant=\"error\" [Message]=\"ControlError\"></mj-alert>\n }\n </div>\n }\n <div class=\"tgdbg-body\">\n <mj-task-graph-run-view\n [Provider]=\"ProviderToUse\"\n [ParentTaskID]=\"ParentTaskID\"\n [WorkflowName]=\"WorkflowName\"\n [LiveUpdates]=\"LiveUpdates\"\n [PollIntervalSeconds]=\"PollIntervalSeconds\"\n [Height]=\"'100%'\"\n [ShowLegend]=\"ShowLegend\"\n [ShowToolbar]=\"ShowCanvasToolbar\"\n [ToolbarVisibility]=\"ToolbarVisibility\"\n [ToolbarAlign]=\"ToolbarAlign\"\n [LiveFrame]=\"LatestFrame\"\n [ReplayAt]=\"ReplayAt\"\n [Breakpoints]=\"Breakpoints\"\n [PausedAtTaskID]=\"PausedAtTaskID\"\n [GraphPaused]=\"Paused\"\n [EdgeOverrides]=\"EdgeOverrides\"\n [AllowBreakpointEditing]=\"AllowBreakpointEditing\"\n [ShowVariables]=\"ShowVariables\"\n [Invocation]=\"Invocation\"\n (NodeSelected)=\"OnRunNodeSelected($event)\"\n (ConnectionSelected)=\"OnRunConnectionSelected($event)\"\n (LegendToggled)=\"LegendToggled.emit($event)\"\n (Settled)=\"OnRunSettled()\"\n (BreakpointToggled)=\"OnRunBreakpointToggled($event)\"\n (EdgeOverrideRequested)=\"OnRunEdgeOverride($event)\">\n </mj-task-graph-run-view>\n </div>\n</div>\n", styles: [":host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n}\n\n.tgdbg {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n gap: var(--mj-space-2);\n}\n\n.tgdbg-chrome {\n flex: 0 0 auto;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--mj-space-2);\n}\n\n.tgdbg-body {\n flex: 1 1 auto;\n min-height: 0;\n}\n"] }]
322
+ }], () => [{ type: i0.ChangeDetectorRef }], { ParentTaskID: [{
323
+ type: Input
324
+ }], WorkflowName: [{
325
+ type: Input
326
+ }], LiveUpdates: [{
327
+ type: Input
328
+ }], PollIntervalSeconds: [{
329
+ type: Input
330
+ }], Height: [{
331
+ type: Input
332
+ }], ShowLegend: [{
333
+ type: Input
334
+ }], ShowCanvasToolbar: [{
335
+ type: Input
336
+ }], ToolbarVisibility: [{
337
+ type: Input
338
+ }], ToolbarAlign: [{
339
+ type: Input
340
+ }], AllowBreakpointEditing: [{
341
+ type: Input
342
+ }], ShowVariables: [{
343
+ type: Input
344
+ }], ShowChrome: [{
345
+ type: Input
346
+ }], Enabled: [{
347
+ type: Input
348
+ }], ReplayAt: [{
349
+ type: Input
350
+ }], NodeSelected: [{
351
+ type: Output
352
+ }], ConnectionSelected: [{
353
+ type: Output
354
+ }], LegendToggled: [{
355
+ type: Output
356
+ }], SettledChange: [{
357
+ type: Output
358
+ }], PausedChange: [{
359
+ type: Output
360
+ }], Frame: [{
361
+ type: Output
362
+ }], ControlFailed: [{
363
+ type: Output
364
+ }], Settled: [{
365
+ type: Output
366
+ }], RunView: [{
367
+ type: ViewChild,
368
+ args: [TaskGraphRunViewComponent]
369
+ }] }); })();
370
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TaskGraphDebuggerComponent, { className: "TaskGraphDebuggerComponent", filePath: "src/lib/task-graph-debugger.component.ts", lineNumber: 67 }); })();
371
+ //# sourceMappingURL=task-graph-debugger.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-graph-debugger.component.js","sourceRoot":"","sources":["../../src/lib/task-graph-debugger.component.ts","../../src/lib/task-graph-debugger.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * Drop-in debugger for a live task graph.\n *\n * This is a wrap of the existing run view + VCR toolbar + the session wiring the harness and\n * Runs console already had (RouteOperation, frame subscribe, `$.debug` bag). The picture and\n * the verbs are unchanged; a host now supplies a parent task id and nothing else.\n *\n * @module @memberjunction/ng-task-graph-editor\n */\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { RunView, type IMetadataProvider, type IRemoteOperationProvider } from '@memberjunction/core';\nimport { MJTaskEntity } from '@memberjunction/core-entities';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport type { FlowToolbarAlign, FlowToolbarVisibility } from '@memberjunction/ng-flow-editor';\nimport {\n ComposeBreakpointSet,\n ParseWorkflowDebugOverlay,\n ParseWorkflowInvocation,\n type WorkflowInvocationRoots,\n} from './workflow-debug-host';\nimport {\n TaskGraphRunViewComponent,\n type TaskGraphRunConnectionSelectedEvent,\n type TaskGraphRunFrame,\n type TaskGraphRunNodeSelectedEvent,\n} from './task-graph-run-view.component';\n\n/** A provider that can push dispatcher frames. GraphQL does; others simply do not. */\ntype FrameCapableProvider = IMetadataProvider & {\n TaskGraphFrames(parentTaskId: string): {\n subscribe(observer: {\n next: (frame: TaskGraphRunFrame) => void;\n error: () => void;\n complete: () => void;\n }): Subscription;\n };\n};\n\nfunction AsFrameSource(provider: IMetadataProvider): FrameCapableProvider | null {\n const candidate = provider as FrameCapableProvider;\n return typeof candidate.TaskGraphFrames === 'function' ? candidate : null;\n}\n\ntype ControlOutput = {\n success?: boolean;\n errorMessage?: string;\n};\n\n@Component({\n standalone: false,\n selector: 'mj-task-graph-debugger',\n templateUrl: './task-graph-debugger.component.html',\n styleUrls: ['./task-graph-debugger.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TaskGraphDebuggerComponent extends BaseAngularComponent implements OnDestroy {\n /**\n * The graph to debug — the parent `MJ: Tasks` row. Everything else is optional.\n */\n @Input()\n public set ParentTaskID(value: string | null) {\n if (value === this.parentTaskID) return;\n this.detachFrames();\n this.parentTaskID = value;\n this.IsSettled = false;\n if (value) {\n this.attachFrames(value);\n void this.Refresh();\n } else {\n this.clearSession();\n }\n this.cdr.markForCheck();\n }\n public get ParentTaskID(): string | null {\n return this.parentTaskID;\n }\n\n @Input() public WorkflowName: string = 'Workflow';\n @Input() public LiveUpdates: boolean = true;\n @Input() public PollIntervalSeconds: number = 3;\n @Input() public Height: string = '100%';\n @Input() public ShowLegend: boolean = false;\n @Input() public ShowCanvasToolbar: boolean = true;\n @Input() public ToolbarVisibility: FlowToolbarVisibility = 'minimized';\n @Input() public ToolbarAlign: FlowToolbarAlign = 'left';\n @Input() public AllowBreakpointEditing: boolean = true;\n @Input() public ShowVariables: boolean = true;\n /** VCR + error line above the canvas. Off if the host already has its own bar. */\n @Input() public ShowChrome: boolean = true;\n @Input() public Enabled: boolean = true;\n @Input() public ReplayAt: Date | null = null;\n\n /** Claim-gated. Public so a host toolbar can bind the same flag. */\n public Paused = false;\n public IsSettled = false;\n public Busy = false;\n public ControlError: string | null = null;\n public Breakpoints: readonly string[] = [];\n public PausedAtTaskID: string | null = null;\n public EdgeOverrides: Readonly<Record<string, 'true' | 'false'>> = {};\n public Invocation: WorkflowInvocationRoots | null = null;\n public LatestFrame: TaskGraphRunFrame | null = null;\n\n @Output() public NodeSelected = new EventEmitter<TaskGraphRunNodeSelectedEvent>();\n @Output() public ConnectionSelected = new EventEmitter<TaskGraphRunConnectionSelectedEvent>();\n @Output() public LegendToggled = new EventEmitter<boolean>();\n @Output() public SettledChange = new EventEmitter<boolean>();\n @Output() public PausedChange = new EventEmitter<boolean>();\n @Output() public Frame = new EventEmitter<TaskGraphRunFrame>();\n @Output() public ControlFailed = new EventEmitter<string>();\n @Output() public Settled = new EventEmitter<void>();\n\n @ViewChild(TaskGraphRunViewComponent) public RunView: TaskGraphRunViewComponent | undefined;\n\n private parentTaskID: string | null = null;\n private frameSub: Subscription | null = null;\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n public ngOnDestroy(): void {\n this.detachFrames();\n }\n\n // ── verbs: same RouteOperation calls the hosts already made ──────────────\n\n public Pause(): Promise<boolean> {\n return this.executeControl('TaskGraph.Pause', { parentTaskID: this.parentTaskID });\n }\n\n public Resume(): Promise<boolean> {\n return this.executeControl('TaskGraph.Resume', { parentTaskID: this.parentTaskID });\n }\n\n public Step(target: 'one' | 'wave' = 'one'): Promise<boolean> {\n return this.executeControl('TaskGraph.Step', { parentTaskID: this.parentTaskID, target });\n }\n\n public Cancel(): Promise<boolean> {\n return this.executeControl('TaskGraph.Cancel', { parentTaskID: this.parentTaskID });\n }\n\n public async ToggleBreakpoint(taskID: string, enabled: boolean): Promise<boolean> {\n await this.Refresh();\n return this.executeControl('TaskGraph.SetBreakpoints', {\n parentTaskID: this.parentTaskID,\n taskIDs: ComposeBreakpointSet(this.Breakpoints, taskID, enabled),\n });\n }\n\n public OverrideEdge(edgeID: string, verdict: 'true' | 'false' | null): Promise<boolean> {\n return this.executeControl('TaskGraph.OverrideEdge', {\n parentTaskID: this.parentTaskID,\n edgeID,\n verdict,\n });\n }\n\n public SkipTask(taskID: string): Promise<boolean> {\n return this.executeControl('TaskGraph.SkipTask', { taskID });\n }\n\n public RetryTask(taskID: string, inputPayload?: Record<string, unknown> | string): Promise<boolean> {\n return this.executeControl('TaskGraph.RetryTask', { taskID, inputPayload });\n }\n\n public UpdateTaskInput(taskID: string, payload: unknown): Promise<boolean> {\n return this.executeControl('TaskGraph.UpdateTaskInput', { taskID, payload });\n }\n\n public ForceCompleteTask(taskID: string, payload?: unknown): Promise<boolean> {\n return this.executeControl('TaskGraph.ForceCompleteTask', { taskID, payload });\n }\n\n public HasBreakpoint(taskID: string): boolean {\n return this.Breakpoints.some((id) => UUIDsEqual(id, taskID));\n }\n\n public GetEdgeOverride(edgeID: string | null): 'true' | 'false' | null {\n if (!edgeID) return null;\n for (const [id, verdict] of Object.entries(this.EdgeOverrides)) {\n if (UUIDsEqual(id, edgeID)) return verdict;\n }\n return null;\n }\n\n /** Re-read `$.debug` from the parent row. Same query the hosts already used. */\n public async Refresh(): Promise<void> {\n if (!this.parentTaskID) return;\n const parentTaskID = this.parentTaskID;\n const result = await RunView.FromMetadataProvider(this.ProviderToUse).RunView<MJTaskEntity>({\n EntityName: 'MJ: Tasks',\n ExtraFilter: `ID='${parentTaskID}'`,\n ResultType: 'entity_object',\n BypassCache: true,\n });\n if (this.parentTaskID !== parentTaskID) return;\n const parent = result.Success ? result.Results?.[0] : undefined;\n const overlay = ParseWorkflowDebugOverlay(parent?.InputPayload);\n this.Breakpoints = overlay.breakpoints;\n this.EdgeOverrides = overlay.edgeOverrides;\n this.Invocation = ParseWorkflowInvocation(parent?.InputPayload);\n if (!this.IsSettled) {\n this.Paused = overlay.paused;\n this.PausedAtTaskID = overlay.pausedAtTaskID;\n }\n this.cdr.markForCheck();\n }\n\n public OnRunNodeSelected(event: TaskGraphRunNodeSelectedEvent): void {\n this.NodeSelected.emit(event);\n }\n\n public OnRunConnectionSelected(event: TaskGraphRunConnectionSelectedEvent): void {\n this.ConnectionSelected.emit(event);\n }\n\n public OnRunSettled(): void {\n this.markSettled();\n }\n\n public OnRunBreakpointToggled(event: { TaskID: string; Enabled: boolean }): void {\n void this.ToggleBreakpoint(event.TaskID, event.Enabled);\n }\n\n public OnRunEdgeOverride(event: { EdgeID: string; Verdict: 'true' | 'false' | null }): void {\n void this.OverrideEdge(event.EdgeID, event.Verdict);\n }\n\n private async executeControl(operationKey: string, input: Record<string, unknown>): Promise<boolean> {\n if (!this.parentTaskID) return false;\n const provider = this.ProviderToUse as IMetadataProvider & Partial<IRemoteOperationProvider>;\n if (typeof provider.RouteOperation !== 'function') {\n this.failControl('This connection cannot send workflow controls.');\n return false;\n }\n this.Busy = true;\n this.ControlError = null;\n this.cdr.markForCheck();\n try {\n const result = await provider.RouteOperation(operationKey, input, {});\n const output = result?.Output as ControlOutput | undefined;\n if (!result?.Success || output?.success === false) {\n this.failControl(output?.errorMessage ?? result?.ErrorMessage ?? 'The control could not be applied.');\n return false;\n }\n if (operationKey === 'TaskGraph.Pause') this.setPaused(true);\n if (operationKey === 'TaskGraph.Resume') this.setPaused(false);\n await this.Refresh();\n return true;\n } catch (e) {\n this.failControl(e instanceof Error ? e.message : String(e));\n return false;\n } finally {\n this.Busy = false;\n this.cdr.markForCheck();\n }\n }\n\n private attachFrames(parentTaskID: string): void {\n this.detachFrames();\n const source = AsFrameSource(this.ProviderToUse);\n if (!source) return;\n this.frameSub = source.TaskGraphFrames(parentTaskID).subscribe({\n next: (frame) => this.onFrame(frame),\n error: () => { this.frameSub = null; },\n complete: () => { this.frameSub = null; },\n });\n }\n\n private onFrame(frame: TaskGraphRunFrame): void {\n this.LatestFrame = frame;\n this.Frame.emit(frame);\n if (this.IsSettled && (frame.kind === 'GraphPaused' || frame.kind === 'BreakpointHit')) {\n return;\n }\n if (frame.kind === 'GraphPaused' || frame.kind === 'BreakpointHit') {\n this.IsSettled = false;\n this.setPaused(true);\n if (this.parentTaskID) void this.Refresh();\n } else if (frame.kind === 'GraphResumed' || frame.kind === 'TaskStarted') {\n this.IsSettled = false;\n this.setPaused(false);\n } else if (frame.kind === 'GraphSettled') {\n this.markSettled();\n }\n this.cdr.markForCheck();\n }\n\n private detachFrames(): void {\n this.frameSub?.unsubscribe();\n this.frameSub = null;\n this.LatestFrame = null;\n }\n\n private markSettled(): void {\n this.IsSettled = true;\n this.setPaused(false);\n this.PausedAtTaskID = null;\n this.SettledChange.emit(true);\n this.Settled.emit();\n if (this.parentTaskID) void this.Refresh();\n this.cdr.markForCheck();\n }\n\n private setPaused(paused: boolean): void {\n this.Paused = paused;\n this.PausedChange.emit(paused);\n }\n\n private failControl(message: string): void {\n this.ControlError = message;\n this.ControlFailed.emit(message);\n this.cdr.markForCheck();\n }\n\n private clearSession(): void {\n this.Paused = false;\n this.IsSettled = false;\n this.Busy = false;\n this.ControlError = null;\n this.Breakpoints = [];\n this.PausedAtTaskID = null;\n this.EdgeOverrides = {};\n this.Invocation = null;\n this.LatestFrame = null;\n }\n}\n","<div class=\"tgdbg\">\n @if (ShowChrome) {\n <div class=\"tgdbg-chrome\">\n <mj-task-graph-debug-toolbar\n [Paused]=\"Paused\"\n [Busy]=\"Busy\"\n [Settled]=\"IsSettled\"\n [Enabled]=\"Enabled && !Busy\"\n (Pause)=\"Pause()\"\n (Resume)=\"Resume()\"\n (Step)=\"Step('one')\"\n (StepWave)=\"Step('wave')\"\n (Cancel)=\"Cancel()\">\n </mj-task-graph-debug-toolbar>\n @if (ControlError) {\n <mj-alert Variant=\"error\" [Message]=\"ControlError\"></mj-alert>\n }\n </div>\n }\n <div class=\"tgdbg-body\">\n <mj-task-graph-run-view\n [Provider]=\"ProviderToUse\"\n [ParentTaskID]=\"ParentTaskID\"\n [WorkflowName]=\"WorkflowName\"\n [LiveUpdates]=\"LiveUpdates\"\n [PollIntervalSeconds]=\"PollIntervalSeconds\"\n [Height]=\"'100%'\"\n [ShowLegend]=\"ShowLegend\"\n [ShowToolbar]=\"ShowCanvasToolbar\"\n [ToolbarVisibility]=\"ToolbarVisibility\"\n [ToolbarAlign]=\"ToolbarAlign\"\n [LiveFrame]=\"LatestFrame\"\n [ReplayAt]=\"ReplayAt\"\n [Breakpoints]=\"Breakpoints\"\n [PausedAtTaskID]=\"PausedAtTaskID\"\n [GraphPaused]=\"Paused\"\n [EdgeOverrides]=\"EdgeOverrides\"\n [AllowBreakpointEditing]=\"AllowBreakpointEditing\"\n [ShowVariables]=\"ShowVariables\"\n [Invocation]=\"Invocation\"\n (NodeSelected)=\"OnRunNodeSelected($event)\"\n (ConnectionSelected)=\"OnRunConnectionSelected($event)\"\n (LegendToggled)=\"LegendToggled.emit($event)\"\n (Settled)=\"OnRunSettled()\"\n (BreakpointToggled)=\"OnRunBreakpointToggled($event)\"\n (EdgeOverrideRequested)=\"OnRunEdgeOverride($event)\">\n </mj-task-graph-run-view>\n </div>\n</div>\n"]}