@plitzi/sdk-dev-tools 0.35.8 → 0.35.9

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 (39) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/components/DevToolsPanel/tabs/ActionsViewer/ActionsViewer.d.ts +8 -1
  3. package/dist/components/DevToolsPanel/tabs/ActionsViewer/ActionsViewer.mjs +48 -138
  4. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/ActionsToolbar/ActionsToolbar.d.ts +12 -0
  5. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/ActionsToolbar/ActionsToolbar.mjs +68 -0
  6. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/ActionsToolbar/index.d.ts +3 -0
  7. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/ActionsToolbar/index.mjs +5 -0
  8. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/DetailShell/DetailShell.d.ts +7 -0
  9. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/DetailShell/DetailShell.mjs +26 -0
  10. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/DetailShell/index.d.ts +3 -0
  11. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/DetailShell/index.mjs +5 -0
  12. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/FlowTimeline/FlowTimeline.d.ts +15 -0
  13. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/FlowTimeline/FlowTimeline.mjs +29 -0
  14. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/FlowTimeline/index.d.ts +3 -0
  15. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/FlowTimeline/index.mjs +5 -0
  16. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/PayloadView/PayloadView.d.ts +6 -0
  17. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/PayloadView/PayloadView.mjs +26 -0
  18. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/PayloadView/index.d.ts +3 -0
  19. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/PayloadView/index.mjs +5 -0
  20. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/RunDetail/RunDetail.d.ts +9 -0
  21. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/RunDetail/RunDetail.mjs +140 -0
  22. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/RunDetail/index.d.ts +3 -0
  23. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/RunDetail/index.mjs +5 -0
  24. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/RunList/RunList.d.ts +11 -0
  25. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/RunList/RunList.mjs +24 -0
  26. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/RunList/index.d.ts +3 -0
  27. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/RunList/index.mjs +5 -0
  28. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/RunRow/RunRow.d.ts +10 -0
  29. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/RunRow/RunRow.mjs +88 -0
  30. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/RunRow/index.d.ts +3 -0
  31. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/RunRow/index.mjs +5 -0
  32. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/StepRow/StepRow.d.ts +9 -0
  33. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/StepRow/StepRow.mjs +57 -0
  34. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/StepRow/index.d.ts +3 -0
  35. package/dist/components/DevToolsPanel/tabs/ActionsViewer/components/StepRow/index.mjs +5 -0
  36. package/dist/components/DevToolsPanel/tabs/ActionsViewer/helpers.d.ts +53 -0
  37. package/dist/components/DevToolsPanel/tabs/ActionsViewer/helpers.mjs +65 -0
  38. package/dist/components/DevToolsPanel/tabs/Logs/categories/LogInteraction/LogInteraction.mjs +15 -15
  39. package/package.json +105 -5
package/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # @plitzi/sdk-dev-tools
2
2
 
3
+ ## 0.35.9
4
+
5
+ ### Patch Changes
6
+
7
+ - Debug a server action's whole flow from the dev-tools, not just its answer.
8
+
9
+ A run now reports an OUTLINE of what it did: every step in order, with its task, how it ended, how long it took, and
10
+ the redacted error of the one that broke the flow — the compensation steps `flow.onFailure` ran included. It carries
11
+ nothing a step was given or returned, so it goes to any page whose debugging the deployment authorized (`devMode`, or
12
+ a space that switched dev tools on for its published site) and to no other. The full trace, with each step's results,
13
+ still reaches only an authoring request or a development server.
14
+
15
+ Runs the SERVER started while rendering a page — the ones feeding `runtime: 'server'` elements — reach the dev-tools
16
+ too, seeded into the page and added to by every `/_rsc` refresh, under the same authorization: a page nobody
17
+ authorized is not told they happened. A response carrying them is never cached. A run that died on its deadline now
18
+ reports the step it was on rather than nothing at all.
19
+
20
+ The Actions tab was rebuilt around it: filters and search over the log, a run list that names the step that broke,
21
+ and a detail panel with the flow's timeline, its compensation shown apart, and what the run carried in and out.
22
+
23
+ - Updated dependencies
24
+ - @plitzi/sdk-navigation@0.35.9
25
+ - @plitzi/sdk-schema@0.35.9
26
+ - @plitzi/sdk-shared@0.35.9
27
+ - @plitzi/sdk-style@0.35.9
28
+
3
29
  ## 0.35.8
4
30
 
5
31
  ### Patch Changes
@@ -1,3 +1,10 @@
1
- /** Server action runs; `detached` and `stream` modes leave no other trace in the UI. */
1
+ /**
2
+ * Every server action this page caused, including the ones it never asked for.
3
+ *
4
+ * A `detached` run has no answer to await and a `stream` returns before its frames arrive, so neither leaves a trace
5
+ * anywhere else; a `render` run happened before the page existed in the browser. What each shows beyond its own
6
+ * outcome is what the server was willing to send — the steps to a page allowed to debug them, and what those steps
7
+ * read and answered only to an authoring session or a dev server.
8
+ */
2
9
  declare const ActionsViewer: () => import("react").JSX.Element;
3
10
  export default ActionsViewer;
@@ -1,147 +1,57 @@
1
- import e from "clsx";
2
- import { useCallback as t, useState as n } from "react";
3
- import { jsx as r, jsxs as i } from "react/jsx-runtime";
4
- import { cancelActionRun as a, useActionRuns as o, useCommonStore as s } from "@plitzi/sdk-shared/store";
5
- import c from "@plitzi/plitzi-ui/Button";
1
+ import e from "./components/ActionsToolbar/index.mjs";
2
+ import t from "./components/DetailShell/index.mjs";
3
+ import { filterRuns as n, isLive as r } from "./helpers.mjs";
4
+ import i from "./components/RunDetail/index.mjs";
5
+ import a from "./components/RunList/index.mjs";
6
+ import o from "@plitzi/plitzi-ui/hooks/useStorage";
7
+ import { useCallback as s, useMemo as c, useState as l } from "react";
8
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
9
+ import { cancelActionRun as f, useActionRuns as p, useCommonStore as m } from "@plitzi/sdk-shared/store";
6
10
  //#region src/components/DevToolsPanel/tabs/ActionsViewer/ActionsViewer.tsx
7
- var l = {
8
- running: "text-blue-600 dark:text-blue-400",
9
- streaming: "text-blue-600 dark:text-blue-400",
10
- accepted: "text-blue-600 dark:text-blue-400",
11
- completed: "text-green-700 dark:text-green-400",
12
- failed: "text-red-600 dark:text-red-400",
13
- aborted: "text-amber-600 dark:text-amber-400",
14
- skipped: "text-zinc-500"
15
- }, u = (e) => new Date(e).toLocaleTimeString(), d = (e) => e.endedAt ? `${e.endedAt - e.startedAt}ms` : "…", f = (e) => e.endedAt === void 0, p = () => {
16
- let { runs: p, clear: m } = o(), [h] = s("actions.endpoint"), [g, _] = n(), v = p.filter(f), y = t((e) => () => _((t) => t === e ? void 0 : e), []), b = t((e) => () => a(e), []);
17
- return /* @__PURE__ */ i("div", {
18
- className: "flex h-full w-full flex-col overflow-auto",
11
+ var h = "This page is served without a Plitzi server: every action step is inert", g = () => {
12
+ let { runs: g, clear: _ } = p(), [v] = m("actions.endpoint"), [y, b] = o("plitzi-sdk.dev-tools.actions.filter", "all"), [x, S] = l(""), [C, w] = l(), [T, E] = l(), D = c(() => n(g, y, x), [
13
+ g,
14
+ y,
15
+ x
16
+ ]), O = c(() => g.filter(r).length, [g]), k = c(() => g.find((e) => e.id === C), [g, C]), A = s((e) => {
17
+ w((t) => t === e ? void 0 : e), E(void 0);
18
+ }, []), j = s((e) => {
19
+ E((t) => t === e ? void 0 : e);
20
+ }, []), M = s((e) => f(e), []), N = s(() => {
21
+ _(), w(void 0), E(void 0);
22
+ }, [_]);
23
+ return /* @__PURE__ */ d("div", {
24
+ className: "flex h-full w-full flex-col",
19
25
  children: [
20
- /* @__PURE__ */ i("div", {
21
- className: "flex items-center justify-between border-b border-zinc-200 px-2 py-1 dark:border-zinc-700",
22
- children: [/* @__PURE__ */ i("div", {
23
- className: "flex items-center gap-2",
24
- children: [v.length > 0 && /* @__PURE__ */ i("span", {
25
- className: "flex items-center gap-1 text-blue-600 dark:text-blue-400",
26
- children: [
27
- /* @__PURE__ */ r("i", { className: "fa-solid fa-circle-notch fa-spin" }),
28
- v.length,
29
- " running"
30
- ]
31
- }), /* @__PURE__ */ r("span", {
32
- className: "text-xs text-zinc-500 dark:text-zinc-400",
33
- children: h ? `Server actions run at ${h}` : "This page is served without a Plitzi server: every action step is inert"
34
- })]
35
- }), /* @__PURE__ */ r(c, {
36
- size: "xs",
37
- disabled: p.length === 0,
38
- onClick: m,
39
- children: "Clear"
40
- })]
26
+ /* @__PURE__ */ u(e, {
27
+ filter: y,
28
+ query: x,
29
+ liveCount: O,
30
+ runCount: g.length,
31
+ onFilterChange: b,
32
+ onQueryChange: S,
33
+ onClear: N
41
34
  }),
42
- p.length === 0 && /* @__PURE__ */ r("div", {
43
- className: "p-3 text-xs text-zinc-500 dark:text-zinc-400",
44
- children: "No server action has run on this page yet. A run appears the moment one is SENT — including the ones that never come back."
35
+ v === void 0 && /* @__PURE__ */ u("div", {
36
+ className: "shrink-0 border-b border-amber-200 bg-amber-50 px-2 py-1 text-[10px] text-amber-700 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-400",
37
+ children: h
45
38
  }),
46
- /* @__PURE__ */ r("div", {
47
- className: "flex flex-col",
48
- children: p.map((t) => /* @__PURE__ */ i("div", {
49
- className: "border-b border-zinc-100 dark:border-zinc-800",
50
- children: [/* @__PURE__ */ i("div", {
51
- className: "flex w-full items-center gap-2 px-2 hover:bg-zinc-50 dark:hover:bg-zinc-800",
52
- children: [/* @__PURE__ */ i("button", {
53
- type: "button",
54
- className: "flex grow items-center gap-2 py-1 text-left text-xs",
55
- onClick: y(t.id),
56
- children: [
57
- /* @__PURE__ */ r("span", {
58
- className: "text-zinc-400 dark:text-zinc-500",
59
- children: u(t.startedAt)
60
- }),
61
- /* @__PURE__ */ r("span", {
62
- className: "font-medium",
63
- children: t.actionId || "(no action named)"
64
- }),
65
- /* @__PURE__ */ r("span", {
66
- className: "rounded-sm bg-zinc-100 px-1 text-[10px] uppercase dark:bg-zinc-800",
67
- children: t.mode
68
- }),
69
- /* @__PURE__ */ r("span", {
70
- className: e("ml-auto", l[t.status] ?? ""),
71
- children: t.reason ?? t.status
72
- }),
73
- /* @__PURE__ */ r("span", {
74
- className: "text-zinc-400 dark:text-zinc-500",
75
- children: d(t)
76
- })
77
- ]
78
- }), f(t) && t.cancellable && /* @__PURE__ */ r(c, {
79
- size: "xs",
80
- intent: "secondary",
81
- onClick: b(t.id),
82
- children: "Cancel"
83
- })]
84
- }), g === t.id && /* @__PURE__ */ i("div", {
85
- className: "flex flex-col gap-2 bg-zinc-50 px-3 py-2 text-xs dark:bg-zinc-800/50",
86
- children: [
87
- t.runId && /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("span", {
88
- className: "text-zinc-500 dark:text-zinc-400",
89
- children: "Run id: "
90
- }), /* @__PURE__ */ r("span", {
91
- className: "font-mono",
92
- children: t.runId
93
- })] }),
94
- t.error && /* @__PURE__ */ r("div", {
95
- className: "break-words text-red-600 dark:text-red-400",
96
- children: t.error
97
- }),
98
- /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("div", {
99
- className: "text-zinc-500 dark:text-zinc-400",
100
- children: "Input"
101
- }), /* @__PURE__ */ r("pre", {
102
- className: "overflow-auto whitespace-pre-wrap",
103
- children: JSON.stringify(t.input ?? {}, null, 2)
104
- })] }),
105
- t.output && /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("div", {
106
- className: "text-zinc-500 dark:text-zinc-400",
107
- children: "Output"
108
- }), /* @__PURE__ */ r("pre", {
109
- className: "overflow-auto whitespace-pre-wrap",
110
- children: JSON.stringify(t.output, null, 2)
111
- })] }),
112
- t.progress.length > 0 && /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ i("div", {
113
- className: "text-zinc-500 dark:text-zinc-400",
114
- children: [
115
- "Progress (",
116
- t.progress.length,
117
- ")"
118
- ]
119
- }), /* @__PURE__ */ r("pre", {
120
- className: "overflow-auto whitespace-pre-wrap",
121
- children: JSON.stringify(t.progress, null, 2)
122
- })] }),
123
- t.trace && /* @__PURE__ */ i("div", {
124
- className: "flex flex-col gap-1",
125
- children: [/* @__PURE__ */ r("div", {
126
- className: "text-zinc-500 dark:text-zinc-400",
127
- children: "Server steps"
128
- }), t.trace.map((t, n) => {
129
- let a = t.node, o = typeof t.status == "string" ? t.status : "";
130
- return /* @__PURE__ */ i("div", {
131
- className: "flex items-center justify-between rounded-sm border border-zinc-200 px-2 py-1 dark:border-zinc-700",
132
- children: [/* @__PURE__ */ r("span", { children: a?.title ?? a?.action ?? "step" }), /* @__PURE__ */ r("span", {
133
- className: e(l[o === "success" ? "completed" : "failed"]),
134
- children: o
135
- })]
136
- }, `${String(a?.action)}-${n}`);
137
- })]
138
- })
139
- ]
140
- })]
141
- }, t.id))
39
+ /* @__PURE__ */ d("div", {
40
+ className: "flex min-h-0 grow",
41
+ children: [/* @__PURE__ */ u(a, {
42
+ runs: D,
43
+ total: g.length,
44
+ selectedRunId: C,
45
+ onSelect: A,
46
+ onCancel: M
47
+ }), k !== void 0 && /* @__PURE__ */ u(t, { children: /* @__PURE__ */ u(i, {
48
+ run: k,
49
+ selectedStepId: T,
50
+ onSelectStep: j
51
+ }) })]
142
52
  })
143
53
  ]
144
54
  });
145
55
  };
146
56
  //#endregion
147
- export { p as default };
57
+ export { g as default };
@@ -0,0 +1,12 @@
1
+ import { RunFilter } from '../../helpers';
2
+ export type ActionsToolbarProps = {
3
+ filter: RunFilter;
4
+ query: string;
5
+ liveCount: number;
6
+ runCount: number;
7
+ onFilterChange: (filter: RunFilter) => void;
8
+ onQueryChange: (query: string) => void;
9
+ onClear: () => void;
10
+ };
11
+ declare const ActionsToolbar: ({ filter, query, liveCount, runCount, onFilterChange, onQueryChange, onClear }: ActionsToolbarProps) => import("react").JSX.Element;
12
+ export default ActionsToolbar;
@@ -0,0 +1,68 @@
1
+ import e from "clsx";
2
+ import { useCallback as t } from "react";
3
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
+ //#region src/components/DevToolsPanel/tabs/ActionsViewer/components/ActionsToolbar/ActionsToolbar.tsx
5
+ var i = [
6
+ {
7
+ id: "all",
8
+ label: "All",
9
+ icon: "fa-solid fa-list"
10
+ },
11
+ {
12
+ id: "live",
13
+ label: "Running",
14
+ icon: "fa-solid fa-circle-notch"
15
+ },
16
+ {
17
+ id: "failed",
18
+ label: "Failed",
19
+ icon: "fa-solid fa-circle-exclamation"
20
+ }
21
+ ], a = ({ filter: a, query: o, liveCount: s, runCount: c, onFilterChange: l, onQueryChange: u, onClear: d }) => {
22
+ let f = t((e) => () => l(e), [l]), p = t((e) => u(e.target.value), [u]);
23
+ return /* @__PURE__ */ r("div", {
24
+ className: "flex shrink-0 items-center gap-2 border-b border-zinc-200 bg-zinc-50 px-2 py-1.5 dark:border-zinc-800 dark:bg-zinc-900",
25
+ children: [
26
+ /* @__PURE__ */ n("div", {
27
+ className: "flex items-stretch gap-1",
28
+ children: i.map((t) => {
29
+ let i = a === t.id;
30
+ return /* @__PURE__ */ r("button", {
31
+ onClick: f(t.id),
32
+ "aria-pressed": i,
33
+ className: e("flex h-6 items-center gap-1 rounded px-2 text-xs font-medium transition-colors", {
34
+ "bg-violet-500 text-white": i,
35
+ "text-zinc-600 hover:bg-zinc-200 dark:text-zinc-400 dark:hover:bg-zinc-700": !i
36
+ }),
37
+ children: [
38
+ /* @__PURE__ */ n("i", { className: e(t.icon, t.id === "live" && s > 0 && "fa-spin") }),
39
+ t.label,
40
+ t.id === "live" && s > 0 && /* @__PURE__ */ n("span", {
41
+ className: "tabular-nums",
42
+ children: s
43
+ })
44
+ ]
45
+ }, t.id);
46
+ })
47
+ }),
48
+ /* @__PURE__ */ n("input", {
49
+ type: "search",
50
+ value: o,
51
+ onChange: p,
52
+ placeholder: "Filter by action, step or run id",
53
+ className: "h-6 min-w-0 grow rounded border border-zinc-200 bg-white px-2 text-xs text-zinc-700 placeholder:text-zinc-400 dark:border-zinc-700 dark:bg-zinc-800 dark:text-zinc-200"
54
+ }),
55
+ /* @__PURE__ */ r("span", {
56
+ className: "shrink-0 text-[10px] text-zinc-400 tabular-nums dark:text-zinc-500",
57
+ children: [c, " runs"]
58
+ }),
59
+ /* @__PURE__ */ r("button", {
60
+ onClick: d,
61
+ className: "flex h-6 shrink-0 items-center gap-1 rounded px-2 text-xs font-medium text-zinc-600 hover:bg-zinc-200 dark:text-zinc-300 dark:hover:bg-zinc-700",
62
+ children: [/* @__PURE__ */ n("i", { className: "fa-solid fa-trash" }), "Clear"]
63
+ })
64
+ ]
65
+ });
66
+ };
67
+ //#endregion
68
+ export { a as default };
@@ -0,0 +1,3 @@
1
+ import { default as ActionsToolbar } from './ActionsToolbar';
2
+ export type { ActionsToolbarProps } from './ActionsToolbar';
3
+ export default ActionsToolbar;
@@ -0,0 +1,5 @@
1
+ import e from "./ActionsToolbar.mjs";
2
+ //#region src/components/DevToolsPanel/tabs/ActionsViewer/components/ActionsToolbar/index.ts
3
+ var t = e;
4
+ //#endregion
5
+ export { t as default };
@@ -0,0 +1,7 @@
1
+ import { ReactNode } from 'react';
2
+ export type DetailShellProps = {
3
+ children: ReactNode;
4
+ };
5
+ /** The resizable column the selected run is inspected in; its width is remembered across sessions. */
6
+ declare const DetailShell: ({ children }: DetailShellProps) => import("react").JSX.Element;
7
+ export default DetailShell;
@@ -0,0 +1,26 @@
1
+ import e from "@plitzi/plitzi-ui/hooks/useStorage";
2
+ import { useCallback as t } from "react";
3
+ import { jsx as n } from "react/jsx-runtime";
4
+ import r from "@plitzi/plitzi-ui/ContainerResizable";
5
+ //#region src/components/DevToolsPanel/tabs/ActionsViewer/components/DetailShell/DetailShell.tsx
6
+ var i = 200, a = 520, o = 280, s = ({ children: s }) => {
7
+ let [c, l] = e("plitzi-sdk.dev-tools.actions.detail-width", o), u = t((e) => {
8
+ Number.isFinite(e) && l(e);
9
+ }, [l]);
10
+ return /* @__PURE__ */ n(r, {
11
+ className: "shrink-0 border-l border-zinc-200 dark:border-zinc-800",
12
+ resizeHandles: ["w"],
13
+ axis: "x",
14
+ autoGrow: !1,
15
+ width: c,
16
+ minConstraintsX: i,
17
+ maxConstraintsX: a,
18
+ onChange: u,
19
+ children: /* @__PURE__ */ n("aside", {
20
+ className: "flex h-full w-full flex-col gap-1.5 overflow-auto bg-zinc-50 px-3 py-2 text-[10px] dark:bg-zinc-900/50",
21
+ children: s
22
+ })
23
+ });
24
+ };
25
+ //#endregion
26
+ export { s as default };
@@ -0,0 +1,3 @@
1
+ import { default as DetailShell } from './DetailShell';
2
+ export type { DetailShellProps } from './DetailShell';
3
+ export default DetailShell;
@@ -0,0 +1,5 @@
1
+ import e from "./DetailShell.mjs";
2
+ //#region src/components/DevToolsPanel/tabs/ActionsViewer/components/DetailShell/index.ts
3
+ var t = e;
4
+ //#endregion
5
+ export { t as default };
@@ -0,0 +1,15 @@
1
+ import { ActionRunStep } from '@plitzi/sdk-shared';
2
+ export type FlowTimelineProps = {
3
+ steps: ActionRunStep[];
4
+ selectedStepId?: string;
5
+ onSelectStep: (stepId: string) => void;
6
+ };
7
+ /**
8
+ * The flow as it actually ran, in order, with the compensation kept apart from it.
9
+ *
10
+ * The `undo` steps are not more of the flow: they ran BECAUSE it failed, giving back what the steps above them
11
+ * already did. Drawn in the same list they read as a flow that carried on after the failure, which is the opposite
12
+ * of what happened.
13
+ */
14
+ declare const FlowTimeline: ({ steps, selectedStepId, onSelectStep }: FlowTimelineProps) => import("react").JSX.Element;
15
+ export default FlowTimeline;
@@ -0,0 +1,29 @@
1
+ import { stepBars as e } from "../../helpers.mjs";
2
+ import t from "../StepRow/index.mjs";
3
+ import { useMemo as n } from "react";
4
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
+ //#region src/components/DevToolsPanel/tabs/ActionsViewer/components/FlowTimeline/FlowTimeline.tsx
6
+ var a = ({ steps: a, selectedStepId: o, onSelectStep: s }) => {
7
+ let c = n(() => e(a), [a]), l = c.filter((e) => e.step.phase === "flow"), u = c.filter((e) => e.step.phase === "undo");
8
+ return /* @__PURE__ */ i("div", {
9
+ className: "flex flex-col gap-0.5",
10
+ children: [
11
+ l.map((e) => /* @__PURE__ */ r(t, {
12
+ bar: e,
13
+ selected: e.step.id === o,
14
+ onSelect: s
15
+ }, e.step.id)),
16
+ u.length > 0 && /* @__PURE__ */ i("div", {
17
+ className: "mt-2 flex items-center gap-1.5 px-1.5 text-[10px] font-medium tracking-wide text-amber-600 uppercase dark:text-amber-400",
18
+ children: [/* @__PURE__ */ r("i", { className: "fa-solid fa-rotate-left" }), "Compensation"]
19
+ }),
20
+ u.map((e) => /* @__PURE__ */ r(t, {
21
+ bar: e,
22
+ selected: e.step.id === o,
23
+ onSelect: s
24
+ }, e.step.id))
25
+ ]
26
+ });
27
+ };
28
+ //#endregion
29
+ export { a as default };
@@ -0,0 +1,3 @@
1
+ import { default as FlowTimeline } from './FlowTimeline';
2
+ export type { FlowTimelineProps } from './FlowTimeline';
3
+ export default FlowTimeline;
@@ -0,0 +1,5 @@
1
+ import e from "./FlowTimeline.mjs";
2
+ //#region src/components/DevToolsPanel/tabs/ActionsViewer/components/FlowTimeline/index.ts
3
+ var t = e;
4
+ //#endregion
5
+ export { t as default };
@@ -0,0 +1,6 @@
1
+ export type PayloadViewProps = {
2
+ value: unknown;
3
+ };
4
+ /** What a run was given, answered, or streamed — the same reader the Store tab uses, so it reads the same. */
5
+ declare const PayloadView: ({ value }: PayloadViewProps) => import("react").JSX.Element;
6
+ export default PayloadView;
@@ -0,0 +1,26 @@
1
+ import e from "@plitzi/sdk-shared/theme/useTheme";
2
+ import { jsx as t } from "react/jsx-runtime";
3
+ import n from "@uiw/react-json-view";
4
+ import * as r from "@uiw/react-json-view/vscode";
5
+ //#region src/components/DevToolsPanel/tabs/ActionsViewer/components/PayloadView/PayloadView.tsx
6
+ var i = {
7
+ ...r.vscodeTheme,
8
+ width: "100%",
9
+ overflow: "auto",
10
+ padding: "6px",
11
+ fontSize: "11px"
12
+ }, a = ({ value: r }) => {
13
+ let { resolvedTheme: a } = e();
14
+ return typeof r != "object" || !r ? /* @__PURE__ */ t("pre", {
15
+ className: "overflow-auto p-1.5 font-mono text-[11px] break-words whitespace-pre-wrap text-zinc-600 dark:text-zinc-300",
16
+ children: JSON.stringify(r)
17
+ }) : /* @__PURE__ */ t(n, {
18
+ value: r,
19
+ style: a === "dark" ? i : void 0,
20
+ enableClipboard: !1,
21
+ displayDataTypes: !1,
22
+ collapsed: 2
23
+ });
24
+ };
25
+ //#endregion
26
+ export { a as default };
@@ -0,0 +1,3 @@
1
+ import { default as PayloadView } from './PayloadView';
2
+ export type { PayloadViewProps } from './PayloadView';
3
+ export default PayloadView;
@@ -0,0 +1,5 @@
1
+ import e from "./PayloadView.mjs";
2
+ //#region src/components/DevToolsPanel/tabs/ActionsViewer/components/PayloadView/index.ts
3
+ var t = e;
4
+ //#endregion
5
+ export { t as default };
@@ -0,0 +1,9 @@
1
+ import { ActionRunEntry } from '@plitzi/sdk-shared';
2
+ export type RunDetailProps = {
3
+ run: ActionRunEntry;
4
+ selectedStepId?: string;
5
+ onSelectStep: (stepId: string) => void;
6
+ };
7
+ /** Everything known about one run: how it ended, what it did step by step, and what it carried. */
8
+ declare const RunDetail: ({ run, selectedStepId, onSelectStep }: RunDetailProps) => import("react").JSX.Element;
9
+ export default RunDetail;
@@ -0,0 +1,140 @@
1
+ import { MODE_LABEL as e, failedStep as t, formatMs as n, formatTime as r, isLive as i, runDuration as a, statusTone as o, traceResultOf as s } from "../../helpers.mjs";
2
+ import c from "../FlowTimeline/index.mjs";
3
+ import l from "../PayloadView/index.mjs";
4
+ import u from "clsx";
5
+ import { useMemo as d } from "react";
6
+ import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
7
+ //#region src/components/DevToolsPanel/tabs/ActionsViewer/components/RunDetail/RunDetail.tsx
8
+ var h = {
9
+ info: "bg-violet-500/15 text-violet-600 dark:text-violet-400",
10
+ success: "bg-emerald-500/15 text-emerald-600 dark:text-emerald-400",
11
+ danger: "bg-red-500/15 text-red-600 dark:text-red-400",
12
+ warning: "bg-amber-500/15 text-amber-600 dark:text-amber-400",
13
+ custom: "bg-zinc-500/15 text-zinc-500 dark:text-zinc-400"
14
+ }, g = "This page was sent what the flow DID, not what each step read or answered. Open the action in the builder, or run the deployment in dev mode, to inspect a step.", _ = "The server did not send the steps for this run: the action is behind a session, or this page is not authorized to debug it.", v = "The flow is still running. Its steps arrive with the answer.", y = ({ run: y, selectedStepId: b, onSelectStep: x }) => {
15
+ let S = t(y.steps), C = a(y), w = d(() => b === void 0 ? void 0 : s(y.trace, b), [y.trace, b]);
16
+ return /* @__PURE__ */ m(f, { children: [
17
+ /* @__PURE__ */ m("div", {
18
+ className: "flex items-center gap-1.5",
19
+ children: [/* @__PURE__ */ p("span", {
20
+ className: "truncate text-xs font-medium text-zinc-700 dark:text-zinc-100",
21
+ children: y.actionId || "(no action named)"
22
+ }), /* @__PURE__ */ p("span", {
23
+ className: u("shrink-0 rounded px-1 py-0.5 text-[9px]", h[o(y.status)]),
24
+ children: y.reason ?? y.status
25
+ })]
26
+ }),
27
+ y.error !== void 0 && /* @__PURE__ */ m("div", {
28
+ className: "mt-1 flex flex-col gap-1 rounded border border-red-200 bg-red-50 px-2 py-1.5 dark:border-red-500/30 dark:bg-red-500/10",
29
+ children: [/* @__PURE__ */ m("span", {
30
+ className: "font-medium text-red-600 dark:text-red-400",
31
+ children: [/* @__PURE__ */ p("i", { className: "fa-solid fa-circle-exclamation mr-1" }), S === void 0 ? "The run failed" : `Failed at “${S.title}”`]
32
+ }), /* @__PURE__ */ p("span", {
33
+ className: "break-words text-red-700 dark:text-red-300",
34
+ children: y.error
35
+ })]
36
+ }),
37
+ /* @__PURE__ */ p("div", {
38
+ className: "mt-1 font-medium tracking-wide text-zinc-400 uppercase dark:text-zinc-500",
39
+ children: "Flow"
40
+ }),
41
+ y.steps === void 0 && /* @__PURE__ */ p("span", {
42
+ className: "text-zinc-400 italic dark:text-zinc-500",
43
+ children: i(y) ? v : _
44
+ }),
45
+ y.steps !== void 0 && /* @__PURE__ */ p(c, {
46
+ steps: y.steps,
47
+ selectedStepId: b,
48
+ onSelectStep: x
49
+ }),
50
+ b !== void 0 && w === void 0 && /* @__PURE__ */ p("span", {
51
+ className: "text-zinc-400 italic dark:text-zinc-500",
52
+ children: g
53
+ }),
54
+ w !== void 0 && /* @__PURE__ */ p("div", {
55
+ className: "overflow-auto rounded border border-zinc-200 dark:border-zinc-700",
56
+ children: /* @__PURE__ */ p(l, { value: w })
57
+ }),
58
+ /* @__PURE__ */ p("div", {
59
+ className: "mt-1 font-medium tracking-wide text-zinc-400 uppercase dark:text-zinc-500",
60
+ children: "Run"
61
+ }),
62
+ /* @__PURE__ */ m("div", {
63
+ className: "flex justify-between gap-2",
64
+ children: [/* @__PURE__ */ p("span", {
65
+ className: "text-zinc-400 dark:text-zinc-500",
66
+ children: "Mode"
67
+ }), /* @__PURE__ */ p("span", {
68
+ className: "text-zinc-700 dark:text-zinc-200",
69
+ children: e[y.mode]
70
+ })]
71
+ }),
72
+ /* @__PURE__ */ m("div", {
73
+ className: "flex justify-between gap-2",
74
+ children: [/* @__PURE__ */ p("span", {
75
+ className: "text-zinc-400 dark:text-zinc-500",
76
+ children: "Started"
77
+ }), /* @__PURE__ */ p("span", {
78
+ className: "text-zinc-700 tabular-nums dark:text-zinc-200",
79
+ children: r(y.startedAt)
80
+ })]
81
+ }),
82
+ /* @__PURE__ */ m("div", {
83
+ className: "flex justify-between gap-2",
84
+ children: [/* @__PURE__ */ p("span", {
85
+ className: "text-zinc-400 dark:text-zinc-500",
86
+ children: "Took"
87
+ }), /* @__PURE__ */ p("span", {
88
+ className: "text-zinc-700 tabular-nums dark:text-zinc-200",
89
+ children: C === void 0 ? "still running" : n(C)
90
+ })]
91
+ }),
92
+ y.elementId !== void 0 && /* @__PURE__ */ m("div", {
93
+ className: "flex justify-between gap-2",
94
+ children: [/* @__PURE__ */ p("span", {
95
+ className: "text-zinc-400 dark:text-zinc-500",
96
+ children: "Element"
97
+ }), /* @__PURE__ */ p("span", {
98
+ className: "truncate font-mono text-zinc-600 dark:text-zinc-300",
99
+ children: y.elementId
100
+ })]
101
+ }),
102
+ y.runId !== void 0 && /* @__PURE__ */ m("div", {
103
+ className: "flex flex-col gap-0.5",
104
+ children: [/* @__PURE__ */ p("span", {
105
+ className: "text-zinc-400 dark:text-zinc-500",
106
+ children: "Run id"
107
+ }), /* @__PURE__ */ p("span", {
108
+ className: "font-mono break-all text-zinc-600 dark:text-zinc-300",
109
+ children: y.runId
110
+ })]
111
+ }),
112
+ y.input !== void 0 && /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p("div", {
113
+ className: "mt-1 font-medium tracking-wide text-zinc-400 uppercase dark:text-zinc-500",
114
+ children: "Input"
115
+ }), /* @__PURE__ */ p("div", {
116
+ className: "overflow-auto rounded border border-zinc-200 dark:border-zinc-700",
117
+ children: /* @__PURE__ */ p(l, { value: y.input })
118
+ })] }),
119
+ y.output !== void 0 && /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p("div", {
120
+ className: "mt-1 font-medium tracking-wide text-zinc-400 uppercase dark:text-zinc-500",
121
+ children: "Output"
122
+ }), /* @__PURE__ */ p("div", {
123
+ className: "overflow-auto rounded border border-zinc-200 dark:border-zinc-700",
124
+ children: /* @__PURE__ */ p(l, { value: y.output })
125
+ })] }),
126
+ y.progress.length > 0 && /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ m("div", {
127
+ className: "mt-1 font-medium tracking-wide text-zinc-400 uppercase dark:text-zinc-500",
128
+ children: [
129
+ "Progress (",
130
+ y.progress.length,
131
+ ")"
132
+ ]
133
+ }), /* @__PURE__ */ p("div", {
134
+ className: "overflow-auto rounded border border-zinc-200 dark:border-zinc-700",
135
+ children: /* @__PURE__ */ p(l, { value: y.progress })
136
+ })] })
137
+ ] });
138
+ };
139
+ //#endregion
140
+ export { y as default };
@@ -0,0 +1,3 @@
1
+ import { default as RunDetail } from './RunDetail';
2
+ export type { RunDetailProps } from './RunDetail';
3
+ export default RunDetail;