@burdenoff/fe-libs 2026.912.1 → 2026.912.2

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.
@@ -96,6 +96,9 @@ export * from './preview/context';
96
96
  export * from './preview/previewTransitions';
97
97
  export * from './preview/surfaceState';
98
98
  export * from './preview/runIdentity';
99
+ export * from './preview/entity/entityPreviewState';
100
+ export * from './preview/entity/AssistantStepRail';
101
+ export * from './preview/entity/AssistantEntityPreview';
99
102
  export * from './ui/panelOverlays';
100
103
  export * from './ui/useDropdownEscape';
101
104
  export * from './ui/useOverlayFocus';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { FC, ReactNode } from 'react';
2
+ import { AssistantStepRailProps } from './AssistantStepRail';
3
+ import { AssistantPreviewFollow, AssistantPreviewStep } from './entityPreviewState';
4
+ export interface AssistantPreviewTab {
5
+ /**
6
+ * Stable id.
7
+ *
8
+ * ★ Matching a STEP id is what makes the surface follow the run — see
9
+ * `nextActiveTab`. Ids that match nothing are still perfectly valid; such a
10
+ * tab is simply never auto-selected.
11
+ */
12
+ readonly id: string;
13
+ readonly label: string;
14
+ /** Optional count, e.g. how many widgets this tab holds. */
15
+ readonly badge?: string | number;
16
+ /** Rendered only while the tab is active, so an inactive tab costs nothing. */
17
+ readonly render: () => ReactNode;
18
+ }
19
+ export interface AssistantEntityPreviewProps {
20
+ readonly title: string;
21
+ readonly steps?: readonly AssistantPreviewStep[];
22
+ readonly tabs?: readonly AssistantPreviewTab[];
23
+ /**
24
+ * Identifies the current run. A CHANGE releases the viewer's tab choice.
25
+ *
26
+ * ★ Without it a tab pinned during one run silently governs the next, so the
27
+ * surface sat on a stale tab while a new build ran behind it.
28
+ */
29
+ readonly runKey?: string | null;
30
+ /**
31
+ * Which step the surface follows when nothing is pinned. Defaults to
32
+ * `produced` — see `AssistantPreviewFollow`; the intuitive "follow the running
33
+ * step" parks the viewer on a tab whose entity does not exist yet.
34
+ */
35
+ readonly follow?: AssistantPreviewFollow;
36
+ /** What the run says it is doing right now. */
37
+ readonly caption?: string | null;
38
+ /** Set when the run failed, so the surface stops pretending to be live. */
39
+ readonly error?: string | null;
40
+ /**
41
+ * Free-form status line — "updated 2m ago", a live badge, a count.
42
+ *
43
+ * ★ `ReactNode`, not a string: the real consumer's version of this line is a
44
+ * pulsing "Live" pill beside the timestamp. Forcing it to a string would have
45
+ * meant either losing that or pushing the whole header back into the product.
46
+ */
47
+ readonly meta?: ReactNode;
48
+ readonly onClose?: () => void;
49
+ /**
50
+ * Replaces the default close button.
51
+ *
52
+ * ★ A product with its own button vocabulary (an icon-only ghost button, say)
53
+ * should not have to choose between this surface and its own design system.
54
+ * `onClose` remains the simple path for products that have no opinion.
55
+ */
56
+ readonly headerActions?: ReactNode;
57
+ /** Already-translated chrome strings. This component holds no translator. */
58
+ readonly labels?: {
59
+ readonly close?: string;
60
+ readonly steps?: string;
61
+ readonly skipped?: string;
62
+ readonly stepsHeading?: string;
63
+ /**
64
+ * How each step STATUS is said, for people who cannot see the glyph.
65
+ *
66
+ * ★★ Forwarded to the rail. Without this a non-English product could
67
+ * translate every visible string and still have "completed" and "failed"
68
+ * announced in English — the one place where the difference between them
69
+ * is the whole message.
70
+ */
71
+ readonly stepStatus?: AssistantStepRailProps['statusLabels'];
72
+ };
73
+ /** Body shown when there are no tabs. */
74
+ readonly children?: ReactNode;
75
+ }
76
+ export declare const AssistantEntityPreview: FC<AssistantEntityPreviewProps>;
77
+ //# sourceMappingURL=AssistantEntityPreview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantEntityPreview.d.ts","sourceRoot":"","sources":["../../../../../src/shared/assistant/preview/entity/AssistantEntityPreview.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAQL,KAAK,EAAE,EACP,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAML,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EAC1B,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,mBAAmB;IAClC;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,MAAM,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACjD,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC/C;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,sBAAsB,CAAC;IACzC,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC;IACnC,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAC/B;;;;;;;WAOG;QACH,QAAQ,CAAC,UAAU,CAAC,EAAE,sBAAsB,CAAC,cAAc,CAAC,CAAC;KAC9D,CAAC;IACF,yCAAyC;IACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;CAC/B;AA+XD,eAAO,MAAM,sBAAsB,EAAE,EAAE,CAAC,2BAA2B,CAqKlE,CAAC"}
@@ -0,0 +1,191 @@
1
+ import { IDLE_ACTIVE_TAB as e, nextActiveTab as t, pinActiveTab as n, tabForArrowKey as r } from "./entityPreviewState.js";
2
+ import { AssistantStepRail as i } from "./AssistantStepRail.js";
3
+ import { useCallback as a, useEffect as o, useId as s, useMemo as c, useRef as l, useState as u } from "react";
4
+ import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
5
+ //#region src/shared/assistant/preview/entity/AssistantEntityPreview.tsx
6
+ var m = {
7
+ borderColor: "var(--color-border-subtle)",
8
+ backgroundColor: "var(--color-bg-sunken)",
9
+ boxShadow: "var(--shadow-elevation-1)",
10
+ borderRadius: "var(--radius-card)"
11
+ }, h = { borderColor: "var(--color-border-subtle)" }, g = (e) => e.replace(/[^A-Za-z0-9_-]/g, (e) => `-${e.charCodeAt(0).toString(36)}-`), _ = [], v = [], y = ({ title: e, meta: t, onClose: n, headerActions: r, closeLabel: i }) => /* @__PURE__ */ p("header", {
12
+ className: "flex items-center justify-between gap-2 border-b px-3 py-2",
13
+ style: h,
14
+ children: [/* @__PURE__ */ p("div", {
15
+ className: "flex min-w-0 items-center gap-2",
16
+ children: [/* @__PURE__ */ f("span", {
17
+ className: "truncate text-sm font-medium",
18
+ style: { color: "var(--color-text-primary)" },
19
+ children: e
20
+ }), t == null ? null : /* @__PURE__ */ f("span", {
21
+ className: "shrink-0 text-xs",
22
+ style: { color: "var(--color-text-muted)" },
23
+ "data-testid": "assistant-entity-preview-meta",
24
+ children: t
25
+ })]
26
+ }), r ?? (n ? /* @__PURE__ */ f("button", {
27
+ type: "button",
28
+ onClick: n,
29
+ className: "shrink-0 rounded-md px-2 py-1 text-xs focus:outline-none focus-visible:ring-2",
30
+ style: { color: "var(--color-text-secondary)" },
31
+ "aria-label": i ?? "Close preview",
32
+ "data-testid": "assistant-entity-preview-close",
33
+ children: i ?? "Close preview"
34
+ }) : null)]
35
+ }), b = ({ error: e, caption: t }) => /* @__PURE__ */ p(d, { children: [e ? /* @__PURE__ */ f("p", {
36
+ role: "alert",
37
+ className: "border-b px-3 py-2 text-xs",
38
+ style: {
39
+ ...h,
40
+ color: "var(--color-status-error-text)"
41
+ },
42
+ "data-testid": "assistant-entity-preview-error",
43
+ children: e
44
+ }) : null, /* @__PURE__ */ f("p", {
45
+ "aria-live": "polite",
46
+ className: e == null && t ? "border-b px-3 py-2 text-xs" : void 0,
47
+ style: t && !e ? {
48
+ ...h,
49
+ color: "var(--color-text-secondary)",
50
+ margin: 0
51
+ } : { margin: 0 },
52
+ "data-testid": "assistant-entity-preview-caption",
53
+ children: e ? "" : t ?? ""
54
+ })] }), x = ({ tabs: e, tabIds: t, title: n, activeId: i, pinnedId: a, onPick: s, tabDomId: c, panelDomId: u }) => {
55
+ let d = l(null), m = l(null);
56
+ return o(() => {
57
+ let e = m.current;
58
+ if (e !== null) {
59
+ if (t.includes(e)) {
60
+ document.activeElement === document.body && (m.current = null);
61
+ return;
62
+ }
63
+ m.current = null, document.activeElement === document.body && i !== null && (m.current = i, document.getElementById(c(i))?.focus());
64
+ }
65
+ }, [
66
+ t,
67
+ i,
68
+ c
69
+ ]), e.length === 0 ? null : /* @__PURE__ */ f("div", {
70
+ ref: d,
71
+ role: "tablist",
72
+ "aria-label": n,
73
+ className: "flex min-w-0 items-center gap-1 overflow-x-auto border-b px-2 py-1",
74
+ style: h,
75
+ children: e.map((e) => {
76
+ let n = e.id === i;
77
+ return /* @__PURE__ */ p("button", {
78
+ type: "button",
79
+ role: "tab",
80
+ id: c(e.id),
81
+ "aria-selected": n,
82
+ "aria-controls": n ? u(e.id) : void 0,
83
+ tabIndex: n ? 0 : -1,
84
+ onClick: () => {
85
+ e.id !== (a ?? i) && s(e.id);
86
+ },
87
+ onFocus: () => {
88
+ m.current = e.id;
89
+ },
90
+ onBlur: (t) => {
91
+ let n = t.relatedTarget;
92
+ if (n !== null) {
93
+ if (d.current?.contains(n) === !0) return;
94
+ m.current === e.id && (m.current = null);
95
+ return;
96
+ }
97
+ let r = e.id;
98
+ queueMicrotask(() => {
99
+ m.current === r && document.getElementById(c(r)) !== null && (m.current = null);
100
+ });
101
+ },
102
+ onKeyDown: (n) => {
103
+ let o = getComputedStyle(n.currentTarget).direction === "rtl", l = r(n.key, t, e.id, o);
104
+ l !== null && (n.preventDefault(), l !== (a ?? i) && s(l), document.getElementById(c(l))?.focus());
105
+ },
106
+ "data-testid": `assistant-entity-tab-${e.id}`,
107
+ "data-selected": n ? "true" : "false",
108
+ className: "shrink-0 rounded-md px-2.5 py-1 text-xs font-medium focus:outline-none focus-visible:ring-2",
109
+ style: {
110
+ backgroundColor: n ? "var(--color-bg-surface)" : "transparent",
111
+ color: n ? "var(--color-text-primary)" : "var(--color-text-muted)"
112
+ },
113
+ children: [e.label, e.badge === void 0 ? null : /* @__PURE__ */ f("span", {
114
+ className: "ml-1.5 text-[10px]",
115
+ children: e.badge
116
+ })]
117
+ }, e.id);
118
+ })
119
+ });
120
+ }, S = ({ title: r, steps: o = _, tabs: l = v, runKey: d = null, follow: S, caption: C, error: w, meta: T, onClose: E, headerActions: D, labels: O, children: k }) => {
121
+ let A = s(), j = a((e) => `assistant-entity-tab-${A}-${g(e)}`, [A]), M = a((e) => `assistant-entity-panel-${A}-${g(e)}`, [A]), [N, P] = u(e), F = c(() => l.map((e) => e.id), [l]), I = t(N, {
122
+ runKey: d,
123
+ tabIds: F,
124
+ steps: o,
125
+ follow: S
126
+ });
127
+ (I.pinnedId !== N.pinnedId || I.runKey !== N.runKey || I.activeId !== N.activeId) && P({
128
+ activeId: I.activeId,
129
+ pinnedId: I.pinnedId,
130
+ runKey: I.runKey
131
+ });
132
+ let L = l.find((e) => e.id === I.activeId) ?? null;
133
+ return /* @__PURE__ */ p("section", {
134
+ className: "flex min-w-0 flex-col overflow-hidden border",
135
+ style: m,
136
+ "data-testid": "assistant-entity-preview",
137
+ "aria-label": r,
138
+ children: [
139
+ /* @__PURE__ */ f(y, {
140
+ title: r,
141
+ meta: T,
142
+ onClose: E,
143
+ headerActions: D,
144
+ closeLabel: O?.close
145
+ }),
146
+ o.length > 0 ? /* @__PURE__ */ p("div", {
147
+ className: "border-b px-3 py-2",
148
+ style: h,
149
+ children: [O?.stepsHeading ? /* @__PURE__ */ f("h3", {
150
+ className: "mb-1 text-[11px] font-semibold uppercase tracking-wide",
151
+ style: { color: "var(--color-text-muted)" },
152
+ children: O.stepsHeading
153
+ }) : null, /* @__PURE__ */ f(i, {
154
+ steps: o,
155
+ label: O?.steps,
156
+ skippedLabel: O?.skipped,
157
+ statusLabels: O?.stepStatus
158
+ })]
159
+ }) : null,
160
+ /* @__PURE__ */ f(b, {
161
+ error: w,
162
+ caption: C
163
+ }),
164
+ /* @__PURE__ */ f(x, {
165
+ tabs: l,
166
+ tabIds: F,
167
+ title: r,
168
+ activeId: I.activeId,
169
+ pinnedId: I.pinnedId,
170
+ onPick: (e) => {
171
+ P(n(e, d));
172
+ },
173
+ tabDomId: j,
174
+ panelDomId: M
175
+ }),
176
+ /* @__PURE__ */ f("div", {
177
+ className: "min-w-0 flex-1 overflow-auto",
178
+ children: L ? /* @__PURE__ */ f("div", {
179
+ role: "tabpanel",
180
+ tabIndex: 0,
181
+ id: M(L.id),
182
+ "aria-labelledby": j(L.id),
183
+ "data-testid": "assistant-entity-preview-panel",
184
+ children: L.render()
185
+ }) : k
186
+ })
187
+ ]
188
+ });
189
+ };
190
+ //#endregion
191
+ export { S as AssistantEntityPreview };
@@ -0,0 +1,22 @@
1
+ import { FC } from 'react';
2
+ import { AssistantPreviewStep, AssistantPreviewStepStatus } from './entityPreviewState';
3
+ export interface AssistantStepRailProps {
4
+ readonly steps: readonly AssistantPreviewStep[];
5
+ /** Accessible name for the rail. Supplied by the product, already translated. */
6
+ readonly label?: string;
7
+ /** Suffix shown on a skipped chip. */
8
+ readonly skippedLabel?: string;
9
+ /**
10
+ * How each status is SAID, for people who cannot see the glyph.
11
+ *
12
+ * ★★★ Without this the rail announced the same string whether a step had
13
+ * succeeded or failed: the pip is `aria-hidden` (it is decorative), a
14
+ * `data-status` attribute is not accessibility metadata, and only `running`
15
+ * carried `aria-current`. "Parser" and "Parser" are indistinguishable, so a
16
+ * screen-reader user was told a build had finished with no way to learn that
17
+ * half of it had failed.
18
+ */
19
+ readonly statusLabels?: Partial<Record<AssistantPreviewStepStatus, string>>;
20
+ }
21
+ export declare const AssistantStepRail: FC<AssistantStepRailProps>;
22
+ //# sourceMappingURL=AssistantStepRail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantStepRail.d.ts","sourceRoot":"","sources":["../../../../../src/shared/assistant/preview/entity/AssistantStepRail.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAiB,EAAE,EAAE,MAAM,OAAO,CAAC;AAE/C,OAAO,KAAK,EACV,oBAAoB,EACpB,0BAA0B,EAC3B,MAAM,sBAAsB,CAAC;AA4I9B,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAChD,iFAAiF;IACjF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,sCAAsC;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;;;;;OASG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC,CAAC;CAC7E;AAED,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAAC,sBAAsB,CAsGxD,CAAC"}
@@ -0,0 +1,124 @@
1
+ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
+ //#region src/shared/assistant/preview/entity/AssistantStepRail.tsx
3
+ var n = {
4
+ done: "M20 6 9 17l-5-5",
5
+ failed: "M18 6 6 18M6 6l12 12",
6
+ skipped: "M5 12h14"
7
+ }, r = {
8
+ done: "var(--color-status-success-text)",
9
+ failed: "var(--color-status-error-text)",
10
+ skipped: "var(--color-text-muted)",
11
+ running: "var(--color-action-primary-bg)",
12
+ pending: "var(--color-border-strong)"
13
+ }, i = ({ status: t }) => t === "pending" ? /* @__PURE__ */ e("span", {
14
+ className: "size-1.5 shrink-0 rounded-full",
15
+ style: { backgroundColor: r.pending }
16
+ }) : t === "running" ? /* @__PURE__ */ e("svg", {
17
+ className: "size-3.5 shrink-0 motion-safe:animate-spin",
18
+ viewBox: "0 0 24 24",
19
+ fill: "none",
20
+ stroke: r.running,
21
+ strokeWidth: "2.5",
22
+ strokeLinecap: "round",
23
+ "aria-hidden": "true",
24
+ children: /* @__PURE__ */ e("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" })
25
+ }) : /* @__PURE__ */ e("svg", {
26
+ className: "size-3.5 shrink-0",
27
+ viewBox: "0 0 24 24",
28
+ fill: "none",
29
+ stroke: r[t],
30
+ strokeWidth: "2.5",
31
+ strokeLinecap: "round",
32
+ strokeLinejoin: "round",
33
+ "aria-hidden": "true",
34
+ children: /* @__PURE__ */ e("path", { d: n[t] })
35
+ });
36
+ function a(e) {
37
+ return e === "done" ? {
38
+ borderColor: "var(--color-status-success-border)",
39
+ backgroundColor: "var(--color-status-success-bgSubtle)",
40
+ color: "var(--color-status-success-text)"
41
+ } : e === "failed" ? {
42
+ borderColor: "var(--color-status-error-border)",
43
+ backgroundColor: "var(--color-status-error-bgSubtle)",
44
+ color: "var(--color-status-error-text)"
45
+ } : e === "running" ? {
46
+ borderColor: "var(--color-action-primary-bg)",
47
+ backgroundColor: "var(--color-bg-surface)",
48
+ color: "var(--color-text-primary)",
49
+ boxShadow: "var(--shadow-elevation-1)"
50
+ } : {
51
+ borderColor: "var(--color-border-subtle)",
52
+ color: "var(--color-text-muted)"
53
+ };
54
+ }
55
+ var o = {
56
+ pending: "not started",
57
+ running: "running",
58
+ done: "completed",
59
+ failed: "failed",
60
+ skipped: "skipped"
61
+ }, s = "inline-flex shrink-0 items-center gap-1.5 rounded-full border px-2.5 py-1 text-xs font-medium", c = ({ steps: n, label: r = "Build steps", skippedLabel: c = "skipped", statusLabels: l }) => {
62
+ if (n.length === 0) return null;
63
+ let u = null;
64
+ for (let e = n.length - 1; e >= 0; --e) if (n[e]?.status === "running") {
65
+ u = n[e]?.id ?? null;
66
+ break;
67
+ }
68
+ return /* @__PURE__ */ e("ul", {
69
+ className: "flex min-w-0 items-center gap-1 overflow-x-auto pb-0.5",
70
+ style: {
71
+ listStyle: "none",
72
+ margin: 0,
73
+ padding: 0
74
+ },
75
+ "data-testid": "assistant-preview-step-rail",
76
+ "aria-label": r,
77
+ children: n.map((r, d) => /* @__PURE__ */ t("li", {
78
+ className: "flex shrink-0 items-center gap-1",
79
+ children: [/* @__PURE__ */ t("span", {
80
+ "data-testid": `assistant-preview-step-${r.id}`,
81
+ "data-status": r.status,
82
+ "aria-current": r.id === u ? "step" : void 0,
83
+ className: s,
84
+ style: a(r.status),
85
+ children: [
86
+ /* @__PURE__ */ e(i, { status: r.status }),
87
+ r.label,
88
+ r.status === "skipped" ? /* @__PURE__ */ e("span", {
89
+ className: "text-[10px]",
90
+ "aria-hidden": "true",
91
+ children: c
92
+ }) : null,
93
+ /* @__PURE__ */ e("span", {
94
+ style: {
95
+ position: "absolute",
96
+ width: 1,
97
+ height: 1,
98
+ margin: -1,
99
+ padding: 0,
100
+ overflow: "hidden",
101
+ clip: "rect(0 0 0 0)",
102
+ clipPath: "inset(50%)",
103
+ whiteSpace: "nowrap",
104
+ border: 0
105
+ },
106
+ children: `, ${l?.[r.status] ?? o[r.status]}`
107
+ })
108
+ ]
109
+ }), d < n.length - 1 ? /* @__PURE__ */ e("svg", {
110
+ className: "size-3.5 shrink-0",
111
+ viewBox: "0 0 24 24",
112
+ fill: "none",
113
+ stroke: "var(--color-text-muted)",
114
+ strokeWidth: "2",
115
+ strokeLinecap: "round",
116
+ strokeLinejoin: "round",
117
+ "aria-hidden": "true",
118
+ children: /* @__PURE__ */ e("path", { d: "m9 18 6-6-6-6" })
119
+ }) : null]
120
+ }, r.id))
121
+ });
122
+ };
123
+ //#endregion
124
+ export { c as AssistantStepRail };
@@ -0,0 +1,134 @@
1
+ import { AssistantToolStep } from '../../ui/AssistantToolActivity';
2
+ /**
3
+ * ★★ THE UNION OF BOTH VOCABULARIES IN USE, not either one of them.
4
+ *
5
+ * - this package's tool steps: `queued | running | completed | failed`
6
+ * - BigConsole's build steps: `pending | running | done | skipped`
7
+ *
8
+ * `failed` and `skipped` each exist in exactly one of them, and that asymmetry
9
+ * is not cosmetic: BigConsole's own pip renders four statuses and falls through
10
+ * to the not-started dot for anything else, so feeding it a `failed` tool step
11
+ * would have drawn a FAILED tool as one that never started. Whatever this
12
+ * surface accepts, it must draw — see `AssistantStepRail`, which has a branch
13
+ * for all five.
14
+ */
15
+ export type AssistantPreviewStepStatus = 'pending' | 'running' | 'done' | 'failed' | 'skipped';
16
+ /**
17
+ * Which step the surface follows when the viewer has not pinned a tab.
18
+ *
19
+ * ★★★ THE DEFAULT IS `produced`, AND THAT IS NOT THE OBVIOUS CHOICE.
20
+ * "Follow the running step" is the intuitive rule and it is wrong for this
21
+ * surface: these tabs show the ENTITIES a step produced, and a step that is
22
+ * still running has not produced one yet — so following it parks the viewer on
23
+ * an empty tab for as long as the work takes. The real consumer had already
24
+ * worked this out and written it down (BigConsole's `AiPreviewPanel`: "so the
25
+ * moment the data sink is created you see its rows, not an empty 'waiting for
26
+ * the dashboard' tab"). The rail still shows the spinner on the next step, so
27
+ * nothing about progress is lost.
28
+ *
29
+ * `running` remains available for a surface whose tabs show live output of the
30
+ * step itself rather than its result.
31
+ */
32
+ export type AssistantPreviewFollow = 'produced' | 'running';
33
+ export interface AssistantPreviewStep {
34
+ /** Stable within the run. Matched against tab ids to follow the run. */
35
+ readonly id: string;
36
+ readonly label: string;
37
+ readonly status: AssistantPreviewStepStatus;
38
+ }
39
+ /**
40
+ * Adapts this package's parsed tool activity into the surface's vocabulary, so
41
+ * a product on the `preview` capability can render the same rail as a product
42
+ * driving the surface from its own store.
43
+ *
44
+ * ★ Total by construction: `FROM_TOOL_STATUS` is keyed on the tool status type,
45
+ * so adding a status there is a compile error here rather than a step that
46
+ * silently renders as `pending`.
47
+ */
48
+ export declare function stepsFromToolActivity(steps: readonly AssistantToolStep[]): AssistantPreviewStep[];
49
+ /**
50
+ * Which tab the surface is showing, and whether the viewer chose it.
51
+ *
52
+ * ★★ EXTRACTED AS A PURE REDUCER BECAUSE IT CANNOT BE TESTED ANY OTHER WAY.
53
+ * This package has no DOM in tests — every render test uses
54
+ * `renderToStaticMarkup`, which runs NO effects and cannot click anything. A
55
+ * follow-the-run rule expressed as a `useEffect` would be literally unreachable
56
+ * from the suite, so it lives here and the component is a thin wrapper.
57
+ */
58
+ export interface ActiveTabState {
59
+ /** The tab currently shown. DERIVED every render, and persisted by the caller
60
+ * only so it can survive a moment when the run points nowhere. */
61
+ readonly activeId: string | null;
62
+ /**
63
+ * The tab the viewer CHOSE, kept separately from the one on screen.
64
+ *
65
+ * ★★★ THESE TWO WERE ONE FIELD AND THAT WAS A BUG. When a pinned tab dropped
66
+ * out of `tabIds` for a moment — tabs arrive from props and can blink — the
67
+ * reducer put the run's fallback in `activeId` while leaving the pin set, and
68
+ * the caller persisted the whole thing. The fallback then WAS the pin: the
69
+ * viewer's actual choice was gone even after their tab came back.
70
+ *
71
+ * ★★ Without this, a pin cannot survive its own tab's absence, which is
72
+ * exactly the case a pin is for.
73
+ */
74
+ readonly pinnedId: string | null;
75
+ /**
76
+ * The run ALL of this state belongs to — the shown tab as much as the pin.
77
+ *
78
+ * ★★ One key for both, because carrying either across runs is the same
79
+ * mistake. An earlier revision keyed only the pin, so an UNPINNED surface
80
+ * that finished `r1` on a later tab opened `r2` still showing it.
81
+ */
82
+ readonly runKey: string | null;
83
+ }
84
+ export declare const IDLE_ACTIVE_TAB: ActiveTabState;
85
+ export interface ActiveTabInput {
86
+ /**
87
+ * Identifies the run. A CHANGE releases the viewer's pin.
88
+ *
89
+ * ★ null means "no run" and does NOT release it: a surface sitting idle
90
+ * between runs must not reshuffle itself under a reader.
91
+ */
92
+ readonly runKey: string | null;
93
+ /** Tab ids, in display order. */
94
+ readonly tabIds: readonly string[];
95
+ /** Steps, in pipeline order. Ids are matched against `tabIds`. */
96
+ readonly steps: readonly AssistantPreviewStep[];
97
+ /** Defaults to `produced` — see `AssistantPreviewFollow` for why. */
98
+ readonly follow?: AssistantPreviewFollow;
99
+ }
100
+ /**
101
+ * The surface's only decision, applied on every render.
102
+ *
103
+ * Order matters and each clause earns its place:
104
+ * 1. a new run releases the pin — the viewer's choice was about the last run
105
+ * 2. a live pin wins over the run, but only while its tab still exists
106
+ * 3. otherwise follow the run (running step, else the last settled one)
107
+ * 4. otherwise keep what is showing, if it still exists
108
+ * 5. otherwise the first tab — and null only when there are no tabs at all
109
+ */
110
+ export declare function nextActiveTab(state: ActiveTabState, input: ActiveTabInput): ActiveTabState;
111
+ /**
112
+ * The viewer chose a tab. Pins it to the CURRENT run, so the pin is released
113
+ * by the next one rather than outliving it.
114
+ */
115
+ export declare function pinActiveTab(activeId: string, runKey: string | null): ActiveTabState;
116
+ /**
117
+ * The tab an arrow key moves to, or null when the key is not ours.
118
+ *
119
+ * ★★ A tablist using roving `tabIndex` MUST handle these. With only the
120
+ * selected tab in the tab order and no key handling, every other tab is
121
+ * unreachable by keyboard — strictly worse than leaving them all tabbable.
122
+ *
123
+ * ★ Wraps at both ends, which is what `role="tablist"` implies, and is pure so
124
+ * it can be tested in a package with no DOM.
125
+ */
126
+ export declare function tabForArrowKey(key: string, tabIds: readonly string[], activeId: string | null,
127
+ /**
128
+ * ★★ Arrow keys follow the VISUAL direction, so they swap in RTL: with the
129
+ * tabs laid out right-to-left, ArrowRight moves to the PREVIOUS one. Getting
130
+ * this wrong is not a rough edge for an Arabic or Hebrew reader — every
131
+ * arrow press goes the opposite way from the one they pressed.
132
+ */
133
+ rtl?: boolean): string | null;
134
+ //# sourceMappingURL=entityPreviewState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entityPreviewState.d.ts","sourceRoot":"","sources":["../../../../../src/shared/assistant/preview/entity/entityPreviewState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAExE;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,0BAA0B,GAClC,SAAS,GACT,SAAS,GACT,MAAM,GACN,QAAQ,GACR,SAAS,CAAC;AAEd;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,SAAS,CAAC;AAE5D,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAC;CAC7C;AAmBD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,iBAAiB,EAAE,GAClC,oBAAoB,EAAE,CAMxB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B;uEACmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,eAAO,MAAM,eAAe,EAAE,cAI7B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,iCAAiC;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAChD,qEAAqE;IACrE,QAAQ,CAAC,MAAM,CAAC,EAAE,sBAAsB,CAAC;CAC1C;AAkCD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,cAAc,GACpB,cAAc,CAoEhB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,cAAc,CAEhB;AAGD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,QAAQ,EAAE,MAAM,GAAG,IAAI;AACvB;;;;;GAKG;AACH,GAAG,UAAQ,GACV,MAAM,GAAG,IAAI,CAef"}
@@ -0,0 +1,63 @@
1
+ //#region src/shared/assistant/preview/entity/entityPreviewState.ts
2
+ var e = new Set([
3
+ "done",
4
+ "failed",
5
+ "skipped"
6
+ ]), t = {
7
+ queued: "pending",
8
+ running: "running",
9
+ completed: "done",
10
+ failed: "failed"
11
+ };
12
+ function n(e) {
13
+ return e.map((e) => ({
14
+ id: e.id,
15
+ label: e.label,
16
+ status: t[e.status]
17
+ }));
18
+ }
19
+ var r = {
20
+ activeId: null,
21
+ pinnedId: null,
22
+ runKey: null
23
+ };
24
+ function i(t, n) {
25
+ let r = null, i = null, a = null;
26
+ for (let o of t.steps) n.has(o.id) && (o.status === "running" ? r = o.id : o.status === "done" ? (i = o.id, a = o.id) : e.has(o.status) && (a = o.id));
27
+ return t.follow === "running" ? r ?? a : i ?? r ?? a;
28
+ }
29
+ function a(e, t) {
30
+ let n = t.runKey !== null && t.runKey !== e.runKey ? {
31
+ activeId: null,
32
+ pinnedId: null,
33
+ runKey: t.runKey
34
+ } : e, r = new Set(t.tabIds);
35
+ if (n.pinnedId !== null && r.has(n.pinnedId)) return n.activeId === n.pinnedId ? n : {
36
+ ...n,
37
+ activeId: n.pinnedId
38
+ };
39
+ let a = n.activeId !== null && r.has(n.activeId) ? n.activeId : null, o = i(t, r) ?? a ?? t.tabIds[0] ?? null;
40
+ return o === n.activeId ? n : {
41
+ ...n,
42
+ activeId: o
43
+ };
44
+ }
45
+ function o(e, t) {
46
+ return {
47
+ activeId: e,
48
+ pinnedId: e,
49
+ runKey: t
50
+ };
51
+ }
52
+ function s(e, t, n, r = !1) {
53
+ if (t.length === 0) return null;
54
+ let i = t[0] ?? null, a = t[t.length - 1] ?? null;
55
+ if (e === "Home") return i;
56
+ if (e === "End") return a;
57
+ let o = e === (r ? "ArrowLeft" : "ArrowRight") ? 1 : e === (r ? "ArrowRight" : "ArrowLeft") ? -1 : 0;
58
+ if (o === 0) return null;
59
+ let s = n === null ? -1 : t.indexOf(n);
60
+ return s < 0 ? i : t[(s + o + t.length) % t.length] ?? null;
61
+ }
62
+ //#endregion
63
+ export { r as IDLE_ACTIVE_TAB, a as nextActiveTab, o as pinActiveTab, n as stepsFromToolActivity, s as tabForArrowKey };
@@ -65,41 +65,44 @@ import { AssistantPreviewProvider as gi, useAssistantPreview as _i } from "./sha
65
65
  import { IDLE_PREVIEW_STATE as vi, isRunningStatus as yi, nextPreviewEvents as bi } from "./shared/assistant/preview/previewTransitions.js";
66
66
  import { IDLE_PREVIEW as xi, NO_OWNER as Si, applyPreviewEvent as Ci, createAssistantPreviewSurface as wi, currentPreviewOwner as Ti, runBelongsTo as Ei, sameOwner as Di } from "./shared/assistant/preview/surfaceState.js";
67
67
  import { createRunIdentityCache as Oi, runIdentities as ki } from "./shared/assistant/preview/runIdentity.js";
68
- import { useOverlayFocus as Ai } from "./shared/assistant/ui/useOverlayFocus.js";
69
- import { useAssistantPreviewBridge as ji } from "./shared/assistant/preview/useAssistantPreviewBridge.js";
70
- import { AssistantPreviewOverlay as Mi } from "./shared/assistant/preview/AssistantPreviewOverlay.js";
71
- import { AssistantLanguageSelector as Ni, FOLLOW_APP_LOCALE as Pi } from "./shared/assistant/ui/composer/AssistantLanguageSelector.js";
72
- import { ASSISTANT_MODE_META as Fi, AssistantModeSelector as Ii, nextModeIndex as Li } from "./shared/assistant/ui/composer/AssistantModeSelector.js";
73
- import { AssistantVoiceButton as Ri } from "./shared/assistant/ui/composer/AssistantVoiceButton.js";
74
- import { AUTO_VOICE as zi, AssistantVoiceSelector as Bi } from "./shared/assistant/ui/composer/AssistantVoiceSelector.js";
75
- import { AssistantVoiceOrb as Vi } from "./shared/assistant/ui/voice/AssistantVoiceOrb.js";
76
- import { AssistantVoiceSessionButton as Hi } from "./shared/assistant/ui/voice/AssistantVoiceSessionButton.js";
77
- import { CAPTION_SCROLL_ATTR as Ui, VoiceCaption as Wi } from "./shared/assistant/ui/voice/VoiceCaption.js";
78
- import { VoiceConversationView as Gi } from "./shared/assistant/ui/voice/VoiceConversationView.js";
79
- import { VoiceWaveform as Ki } from "./shared/assistant/ui/voice/VoiceWaveform.js";
80
- import { VoiceMiniController as qi } from "./shared/assistant/ui/voice/VoiceMiniController.js";
81
- import { VoiceStage as Ji } from "./shared/assistant/ui/voice/VoiceStage.js";
82
- import { VoiceTranscriptDrawer as Yi } from "./shared/assistant/ui/voice/VoiceTranscriptDrawer.js";
83
- import { downloadFile as Xi, exportConversation as Zi } from "./shared/assistant/exportConversation.js";
84
- import { AssistantMoreMenu as Qi } from "./shared/assistant/ui/AssistantMoreMenu.js";
85
- import { AssistantHeader as $i } from "./shared/assistant/ui/AssistantHeader.js";
86
- import { AssistantConversationList as ea } from "./shared/assistant/ui/AssistantConversationList.js";
87
- import { AssistantEmptyState as ta } from "./shared/assistant/ui/AssistantEmptyState.js";
88
- import { AssistantMessageItem as na } from "./shared/assistant/ui/AssistantMessageItem.js";
89
- import { AssistantMessageList as ra } from "./shared/assistant/ui/AssistantMessageList.js";
90
- import { AssistantVoiceSession as ia } from "./shared/assistant/ui/voice/AssistantVoiceSession.js";
91
- import { useAssistantApiAccess as aa } from "./shared/assistant/useAssistantApiAccess.js";
92
- import { useConversationTurns as oa } from "./shared/assistant/useConversationTurns.js";
93
- import { isMultimodalBodyRejection as sa, isRecoverableAssistantError as ca } from "./shared/assistant/transportErrors.js";
94
- import { aiCreditsUpdatedEventName as la, dispatchAssistantQuotaExhausted as ua, notifyAiCreditsUpdated as da } from "./shared/assistant/aiCredits.js";
95
- import { useWorkspaceWriteAccess as fa } from "./shared/assistant/useWorkspaceWriteAccess.js";
96
- import { extractDocumentText as pa } from "./shared/assistant/documentExtract.js";
97
- import { useAssistantAttachments as ma } from "./shared/assistant/useAssistantAttachments.js";
98
- import { AssistantComposer as ha } from "./shared/assistant/ui/composer/AssistantComposer.js";
99
- import { isProdRuntime as ga } from "./shared/assistant/env.js";
100
- import { useAssistantHeartbeat as _a } from "./shared/assistant/useAssistantHeartbeat.js";
101
- import { useAssistantKeyboardShortcuts as va } from "./shared/assistant/useAssistantKeyboardShortcuts.js";
102
- import { AssistantApiCallsConsentDialog as ya } from "./shared/assistant/ui/AssistantApiCallsConsentDialog.js";
103
- import { AssistantChatArea as ba } from "./shared/assistant/ui/AssistantChatArea.js";
104
- import { AIAssistantPanel as xa } from "./shared/assistant/ui/AIAssistantPanel.js";
105
- export { xa as AIAssistantPanel, L as ASSISTANT_API_AUTH_STRATEGY, sn as ASSISTANT_LANGUAGES, Fi as ASSISTANT_MODE_META, ii as ASSISTANT_OVERLAY_ATTR, ai as ASSISTANT_PANEL_ATTR, Kn as ATTACHMENT_ACCEPT, Hr as ATTACHMENT_SOURCES, zi as AUTO_VOICE, ya as AssistantApiCallsConsentDialog, mi as AssistantAttachmentButton, hi as AssistantAttachmentChips, Jr as AssistantAutoSpeakToggle, ba as AssistantChatArea, ha as AssistantComposer, ri as AssistantConnectSourceItem, ti as AssistantConnectSourceProvider, ea as AssistantConversationList, ta as AssistantEmptyState, $i as AssistantHeader, s as AssistantI18nProvider, Zr as AssistantLanguageMenu, Ni as AssistantLanguageSelector, f as AssistantMarkdownImage, h as AssistantMarkdownRenderer, Yr as AssistantMessageAttachments, na as AssistantMessageItem, ra as AssistantMessageList, Ii as AssistantModeSelector, Qi as AssistantMoreMenu, g as AssistantNavigateProvider, Xr as AssistantPendingWriteCard, Mi as AssistantPreviewOverlay, gi as AssistantPreviewProvider, t as AssistantProductProvider, Qr as AssistantReplyLanguageSelector, _e as AssistantRuntimeManager, $r as AssistantSpeakButton, Ir as AssistantSpeechProvider, ei as AssistantSpokenTurnsNotice, Pr as AssistantToolActivity, Ri as AssistantVoiceButton, Vi as AssistantVoiceOrb, Bi as AssistantVoiceSelector, ia as AssistantVoiceSession, Hi as AssistantVoiceSessionButton, qn as AttachmentRejectedError, En as BOILERPLATE_PAGE_SHARE, Ui as CAPTION_SCROLL_ATTR, O as CHECK_AI_CREDITS, k as CREATE_SANDBOX, zt as DEFAULT_SPEAKABLE_LABELS, cn as DEFAULT_SPEECH_RATE, ft as ENDPOINT_GRACE_MS, A as EXTEND_SANDBOX_TTL, Pi as FOLLOW_APP_LOCALE, j as GET_ACTIVE_SANDBOXES, M as GET_SANDBOX, He as HOSTED_TTS_MAX_CHARS, Re as HOSTED_TTS_TIER, ze as HOSTED_VOICES, yn as IDLE_PLAYBACK, xi as IDLE_PREVIEW, vi as IDLE_PREVIEW_STATE, pt as INITIAL_SESSION, Jn as INLINE_IMAGE_MAX_DIM, Yn as INLINE_IMAGE_QUALITY, mt as INTERRUPT_MAX_MS, ht as INTERRUPT_MIN_MS, Xn as MAX_ATTACHMENTS, Dn as MAX_BOILERPLATE_LINE_CHARS, On as MAX_EXTRACTED_CHARS, Zn as MAX_FILE_BYTES, Qn as MAX_INLINE_CHARS_PER_FILE, $n as MAX_INLINE_CHARS_TOTAL, wn as MAX_INLINE_IMAGE_BASE64_BYTES, er as MAX_INLINE_IMAGE_BASE64_CHARS, tr as MAX_INLINE_IMAGE_PARTS, nr as MAX_INLINE_TURN_BODY_BYTES, kn as MAX_PDF_PAGES_SCANNED, Tn as MAX_REQUEST_BODY_BYTES, Bt as MAX_SPEAKABLE_CHARS, Vt as MAX_SPOKEN_TABLE_ROWS, rr as MAX_TURN_BODY_BYTES, Zt as MINI_CAPTION_BUDGET, An as MIN_PAGE_TEXT_CHARS, jn as MIN_TEXT_PAGE_SHARE, Si as NO_OWNER, oi as NO_PANEL_OVERLAY, Dr as PHRASE_ROTATE_MS, $t as POLL_FAST_MS, en as POLL_FAST_UNTIL_MS, tn as POLL_SLOW_MS, nn as POLL_STEADY_MS, rn as POLL_STEADY_UNTIL_MS, Yt as PREVIEW_LANGUAGES, ir as PROMPT_ENVELOPE_RESERVE_BYTES, N as PROXY_SANDBOX_REQUEST, P as REPORT_AI_TOKEN_USAGE, Gr as SANDBOX_READY_TTL_MS, gt as SILENCE_SUBMIT_MS, Ue as SPEAKING_RATE_MAX, We as SPEAKING_RATE_MAX_STREAMING, Ge as SPEAKING_RATE_MAX_SYNC, Ke as SPEAKING_RATE_MIN, Ht as SPEECH_CHUNK_CHARS, Ut as SPEECH_CHUNK_CJK_CHARS, wt as SPEECH_LANG, hn as SPOKEN_LABEL_LANGUAGES, Or as STAGE_COPY, F as STOP_ASSISTANT_SANDBOX, kr as THINKING_PHRASES, ar as TURN_BODY_HEADROOM_BYTES, Tt as VOICE_LIST_TIMEOUT_MS, Wi as VoiceCaption, Gi as VoiceConversationView, qi as VoiceMiniController, Ji as VoiceStage, Yi as VoiceTranscriptDrawer, Ki as VoiceWaveform, I as WAIT_FOR_SANDBOX_RUNNING, q as abortAssistantTurn, si as activePanelOverlay, la as aiCreditsUpdatedEventName, Ci as applyPreviewEvent, J as approvePendingWrite, ci as assistantPanelOwnsEscape, _ as assistantRoutePath, c as assistantTranslationKey, v as assistantUrlTransform, Ur as availableAttachmentSources, qe as base64ToBytes, y as browserShouldHandle, Le as browserSpeechEngine, Y as buildAssistantSandboxEnv, or as buildAttachmentPromptBlock, It as buildContinuedFromVoiceNote, ve as buildProgress, sr as buildPromptParts, X as buildPromptRequestBody, cr as buildPromptWithAttachments, Je as buildRequest, E as buildSandboxContextInput, Lt as buildVoiceTranscriptMarkdown, Ae as chatTurns, Z as checkAssistantAiCredits, Wt as chunkForSpeech, b as classifyAssistantHref, lr as classifyAttachment, Ye as classifyHttpFailure, S as classifyQuotaError, Mn as columnLetterToIndex, tt as configureSpeechEngine, Gt as containsCjk, d as copyToClipboard, ur as countInlineImageCandidates, dr as countInlinedImageParts, wi as createAssistantPreviewSurface, Q as createAssistantSandbox, $ as createAssistantSession, $e as createHostedTtsEngine, Kr as createReadinessTracker, et as createRoutingSpeechEngine, Oi as createRunIdentityCache, Oe as createSandboxAssistantTransport, nt as createSpeechEngines, Ti as currentPreviewOwner, Xe as decodeAudioResponse, Nn as decodeXmlEntities, C as describeQuotaError, fr as detectDocumentFormat, _n as detectScriptLocale, Wr as deviceHasCamera, ua as dispatchAssistantQuotaExhausted, Pn as docxXmlToText, ee as downloadAssistantArtifact, Xi as downloadFile, li as escapeDismisses, pr as estimateTurnBodyBytes, D as executeSandboxGraphQL, Zi as exportConversation, te as extendAssistantSandboxTTL, pa as extractDocumentText, ln as findAssistantLanguage, ne as findExistingSandbox, pn as findPendingWrite, Fn as fitPdfPages, ui as focusIsInsidePanel, mr as formatBytes, In as formatPageRanges, zr as getActorId, re as getAssistantArtifacts, ye as getAssistantMedia, ie as getAssistantMessages, ae as getAssistantSession, oe as getAssistantStreamAccess, be as getAssistantText, hr as getAttachmentSendBlocker, U as getCapability, gr as getExtension, R as getImageForMode, z as getImageTagForMode, Br as getOrganizationId, xe as getRawMessageCreatedAt, B as getResourcesForMode, V as getSandboxImageRegistry, _r as getSendableAttachments, rt as getSpeechEngine, Se as getToolProgress, Vr as getWorkspaceId, je as groupBySession, Me as groupConsecutiveBySession, vr as hasAttachmentWorkInFlight, Be as hostedLocaleFor, Ve as hostedSupportsLanguage, p as imageHostLabel, _t as isCapturing, vt as isEcho, Ln as isMostlyImagePages, sa as isMultimodalBodyRejection, ga as isProdRuntime, w as isQuotaExhaustedError, Ce as isReapedSandboxConnectionError, qr as isRecentlyVerified, we as isRecoverable, ca as isRecoverableAssistantError, m as isRemoteImageSrc, yi as isRunningStatus, bn as isSpeakingMessage, Et as isSpeechBlocked, Ar as isStageCopy, yt as isSubmittable, wr as isTurnInFlight, W as isUnknownFieldError, Ne as isVoiceTurn, Rn as joinSheets, Dt as languageDisplayName, Te as mapSessionToHistory, G as markSupported, K as markUnsupported, Ee as mergeMessagesById, ot as micIsInterrupt, se as modeRequiresConfirmWrites, Li as nextModeIndex, di as nextPanelOverlays, bi as nextPreviewEvents, Ot as normalizeLangTag, da as notifyAiCreditsUpdated, bt as orbMode, zn as pageMarker, fi as panelOwnsEscape, mn as parseConfirmationRefusal, yr as parseDataUrl, Bn as parseSharedStrings, Fr as parseToolActivity, Vn as parseWorkbookSheets, Hn as pdfTextItemsToPage, Tr as planAbandonedTurn, xt as planReplyConsumption, Er as planTurnAbort, an as pollDelayMs, kt as primaryLanguageSubtag, xn as publishedChunks, T as quotaExhaustedEventName, it as readSpeechEngineConfig, ce as releaseSupersededAssistantSandboxes, dn as replyFollowsInput, le as reportAssistantAiTokenUsage, Sn as requiresCancel, at as resetSpeechEngine, un as resolveAssistantLanguage, fn as resolveLanguagePair, n as resolveModeConfig, H as resolveSandboxAssistantMode, vn as resolveSpeechLocale, Ei as runBelongsTo, ki as runIdentities, Di as sameOwner, De as sanitize, ue as selectExistingAssistantSandbox, de as selectSupersededAssistantSandboxes, At as selectVoiceForLocale, fe as sendAssistantPromptAsync, pe as sendHeartbeat, Un as sheetXmlToRows, Ze as shouldDisableEngine, Qt as showPreviousChunk, st as showsAssistantCaption, ct as showsUserCaption, Kt as speakableEmail, jt as speechGate, gn as speechLabelsFor, Mt as speechLangForLocale, Cn as speechPlaybackReducer, Qe as splitForVendor, qt as splitTableRow, St as spokenSoFar, jr as stageText, Mr as statusStageCopy, me as stopReapedAssistantSandbox, Wn as summarisePageText, Nr as thinkingPhrase, on as toCaptionText, br as toMessageAttachment, Jt as toSpeakableText, xr as truncateForInline, Gn as truncatePagesForInline, aa as useAssistantApiAccess, ma as useAssistantAttachments, ni as useAssistantConnectSource, _a as useAssistantHeartbeat, l as useAssistantI18nNamespace, va as useAssistantKeyboardShortcuts, x as useAssistantNavigate, r as useAssistantPageLabel, _i as useAssistantPreview, ji as useAssistantPreviewBridge, i as useAssistantProduct, a as useAssistantProductOrNull, Lr as useAssistantSpeech, o as useAssistantStorageFolders, Cr as useAssistantStore, u as useAssistantTr, oa as useConversationTurns, pi as useDropdownEscape, Ai as useOverlayFocus, ke as useSandboxAssistantTransport, e as useVoiceInput, Rr as useVoiceSession, fa as useWorkspaceWriteAccess, Sr as validateFile, Nt as voiceAvailability, Pe as voiceMarker, Xt as voicePreviewText, Pt as voiceQualityRank, Fe as voiceSessionIdOf, Ct as voiceSessionReducer, lt as voiceStageState, Rt as voiceTranscriptFilename, Ie as voiceTurnsOnly, Ft as voicesForLocale, he as waitForAssistantServiceReady, ge as waitForSandboxRunning, ut as waveformIsActive, dt as waveformIsSettled };
68
+ import { IDLE_ACTIVE_TAB as Ai, nextActiveTab as ji, pinActiveTab as Mi, stepsFromToolActivity as Ni, tabForArrowKey as Pi } from "./shared/assistant/preview/entity/entityPreviewState.js";
69
+ import { AssistantStepRail as Fi } from "./shared/assistant/preview/entity/AssistantStepRail.js";
70
+ import { AssistantEntityPreview as Ii } from "./shared/assistant/preview/entity/AssistantEntityPreview.js";
71
+ import { useOverlayFocus as Li } from "./shared/assistant/ui/useOverlayFocus.js";
72
+ import { useAssistantPreviewBridge as Ri } from "./shared/assistant/preview/useAssistantPreviewBridge.js";
73
+ import { AssistantPreviewOverlay as zi } from "./shared/assistant/preview/AssistantPreviewOverlay.js";
74
+ import { AssistantLanguageSelector as Bi, FOLLOW_APP_LOCALE as Vi } from "./shared/assistant/ui/composer/AssistantLanguageSelector.js";
75
+ import { ASSISTANT_MODE_META as Hi, AssistantModeSelector as Ui, nextModeIndex as Wi } from "./shared/assistant/ui/composer/AssistantModeSelector.js";
76
+ import { AssistantVoiceButton as Gi } from "./shared/assistant/ui/composer/AssistantVoiceButton.js";
77
+ import { AUTO_VOICE as Ki, AssistantVoiceSelector as qi } from "./shared/assistant/ui/composer/AssistantVoiceSelector.js";
78
+ import { AssistantVoiceOrb as Ji } from "./shared/assistant/ui/voice/AssistantVoiceOrb.js";
79
+ import { AssistantVoiceSessionButton as Yi } from "./shared/assistant/ui/voice/AssistantVoiceSessionButton.js";
80
+ import { CAPTION_SCROLL_ATTR as Xi, VoiceCaption as Zi } from "./shared/assistant/ui/voice/VoiceCaption.js";
81
+ import { VoiceConversationView as Qi } from "./shared/assistant/ui/voice/VoiceConversationView.js";
82
+ import { VoiceWaveform as $i } from "./shared/assistant/ui/voice/VoiceWaveform.js";
83
+ import { VoiceMiniController as ea } from "./shared/assistant/ui/voice/VoiceMiniController.js";
84
+ import { VoiceStage as ta } from "./shared/assistant/ui/voice/VoiceStage.js";
85
+ import { VoiceTranscriptDrawer as na } from "./shared/assistant/ui/voice/VoiceTranscriptDrawer.js";
86
+ import { downloadFile as ra, exportConversation as ia } from "./shared/assistant/exportConversation.js";
87
+ import { AssistantMoreMenu as aa } from "./shared/assistant/ui/AssistantMoreMenu.js";
88
+ import { AssistantHeader as oa } from "./shared/assistant/ui/AssistantHeader.js";
89
+ import { AssistantConversationList as sa } from "./shared/assistant/ui/AssistantConversationList.js";
90
+ import { AssistantEmptyState as ca } from "./shared/assistant/ui/AssistantEmptyState.js";
91
+ import { AssistantMessageItem as la } from "./shared/assistant/ui/AssistantMessageItem.js";
92
+ import { AssistantMessageList as ua } from "./shared/assistant/ui/AssistantMessageList.js";
93
+ import { AssistantVoiceSession as da } from "./shared/assistant/ui/voice/AssistantVoiceSession.js";
94
+ import { useAssistantApiAccess as fa } from "./shared/assistant/useAssistantApiAccess.js";
95
+ import { useConversationTurns as pa } from "./shared/assistant/useConversationTurns.js";
96
+ import { isMultimodalBodyRejection as ma, isRecoverableAssistantError as ha } from "./shared/assistant/transportErrors.js";
97
+ import { aiCreditsUpdatedEventName as ga, dispatchAssistantQuotaExhausted as _a, notifyAiCreditsUpdated as va } from "./shared/assistant/aiCredits.js";
98
+ import { useWorkspaceWriteAccess as ya } from "./shared/assistant/useWorkspaceWriteAccess.js";
99
+ import { extractDocumentText as ba } from "./shared/assistant/documentExtract.js";
100
+ import { useAssistantAttachments as xa } from "./shared/assistant/useAssistantAttachments.js";
101
+ import { AssistantComposer as Sa } from "./shared/assistant/ui/composer/AssistantComposer.js";
102
+ import { isProdRuntime as Ca } from "./shared/assistant/env.js";
103
+ import { useAssistantHeartbeat as wa } from "./shared/assistant/useAssistantHeartbeat.js";
104
+ import { useAssistantKeyboardShortcuts as Ta } from "./shared/assistant/useAssistantKeyboardShortcuts.js";
105
+ import { AssistantApiCallsConsentDialog as Ea } from "./shared/assistant/ui/AssistantApiCallsConsentDialog.js";
106
+ import { AssistantChatArea as Da } from "./shared/assistant/ui/AssistantChatArea.js";
107
+ import { AIAssistantPanel as Oa } from "./shared/assistant/ui/AIAssistantPanel.js";
108
+ export { Oa as AIAssistantPanel, L as ASSISTANT_API_AUTH_STRATEGY, sn as ASSISTANT_LANGUAGES, Hi as ASSISTANT_MODE_META, ii as ASSISTANT_OVERLAY_ATTR, ai as ASSISTANT_PANEL_ATTR, Kn as ATTACHMENT_ACCEPT, Hr as ATTACHMENT_SOURCES, Ki as AUTO_VOICE, Ea as AssistantApiCallsConsentDialog, mi as AssistantAttachmentButton, hi as AssistantAttachmentChips, Jr as AssistantAutoSpeakToggle, Da as AssistantChatArea, Sa as AssistantComposer, ri as AssistantConnectSourceItem, ti as AssistantConnectSourceProvider, sa as AssistantConversationList, ca as AssistantEmptyState, Ii as AssistantEntityPreview, oa as AssistantHeader, s as AssistantI18nProvider, Zr as AssistantLanguageMenu, Bi as AssistantLanguageSelector, f as AssistantMarkdownImage, h as AssistantMarkdownRenderer, Yr as AssistantMessageAttachments, la as AssistantMessageItem, ua as AssistantMessageList, Ui as AssistantModeSelector, aa as AssistantMoreMenu, g as AssistantNavigateProvider, Xr as AssistantPendingWriteCard, zi as AssistantPreviewOverlay, gi as AssistantPreviewProvider, t as AssistantProductProvider, Qr as AssistantReplyLanguageSelector, _e as AssistantRuntimeManager, $r as AssistantSpeakButton, Ir as AssistantSpeechProvider, ei as AssistantSpokenTurnsNotice, Fi as AssistantStepRail, Pr as AssistantToolActivity, Gi as AssistantVoiceButton, Ji as AssistantVoiceOrb, qi as AssistantVoiceSelector, da as AssistantVoiceSession, Yi as AssistantVoiceSessionButton, qn as AttachmentRejectedError, En as BOILERPLATE_PAGE_SHARE, Xi as CAPTION_SCROLL_ATTR, O as CHECK_AI_CREDITS, k as CREATE_SANDBOX, zt as DEFAULT_SPEAKABLE_LABELS, cn as DEFAULT_SPEECH_RATE, ft as ENDPOINT_GRACE_MS, A as EXTEND_SANDBOX_TTL, Vi as FOLLOW_APP_LOCALE, j as GET_ACTIVE_SANDBOXES, M as GET_SANDBOX, He as HOSTED_TTS_MAX_CHARS, Re as HOSTED_TTS_TIER, ze as HOSTED_VOICES, Ai as IDLE_ACTIVE_TAB, yn as IDLE_PLAYBACK, xi as IDLE_PREVIEW, vi as IDLE_PREVIEW_STATE, pt as INITIAL_SESSION, Jn as INLINE_IMAGE_MAX_DIM, Yn as INLINE_IMAGE_QUALITY, mt as INTERRUPT_MAX_MS, ht as INTERRUPT_MIN_MS, Xn as MAX_ATTACHMENTS, Dn as MAX_BOILERPLATE_LINE_CHARS, On as MAX_EXTRACTED_CHARS, Zn as MAX_FILE_BYTES, Qn as MAX_INLINE_CHARS_PER_FILE, $n as MAX_INLINE_CHARS_TOTAL, wn as MAX_INLINE_IMAGE_BASE64_BYTES, er as MAX_INLINE_IMAGE_BASE64_CHARS, tr as MAX_INLINE_IMAGE_PARTS, nr as MAX_INLINE_TURN_BODY_BYTES, kn as MAX_PDF_PAGES_SCANNED, Tn as MAX_REQUEST_BODY_BYTES, Bt as MAX_SPEAKABLE_CHARS, Vt as MAX_SPOKEN_TABLE_ROWS, rr as MAX_TURN_BODY_BYTES, Zt as MINI_CAPTION_BUDGET, An as MIN_PAGE_TEXT_CHARS, jn as MIN_TEXT_PAGE_SHARE, Si as NO_OWNER, oi as NO_PANEL_OVERLAY, Dr as PHRASE_ROTATE_MS, $t as POLL_FAST_MS, en as POLL_FAST_UNTIL_MS, tn as POLL_SLOW_MS, nn as POLL_STEADY_MS, rn as POLL_STEADY_UNTIL_MS, Yt as PREVIEW_LANGUAGES, ir as PROMPT_ENVELOPE_RESERVE_BYTES, N as PROXY_SANDBOX_REQUEST, P as REPORT_AI_TOKEN_USAGE, Gr as SANDBOX_READY_TTL_MS, gt as SILENCE_SUBMIT_MS, Ue as SPEAKING_RATE_MAX, We as SPEAKING_RATE_MAX_STREAMING, Ge as SPEAKING_RATE_MAX_SYNC, Ke as SPEAKING_RATE_MIN, Ht as SPEECH_CHUNK_CHARS, Ut as SPEECH_CHUNK_CJK_CHARS, wt as SPEECH_LANG, hn as SPOKEN_LABEL_LANGUAGES, Or as STAGE_COPY, F as STOP_ASSISTANT_SANDBOX, kr as THINKING_PHRASES, ar as TURN_BODY_HEADROOM_BYTES, Tt as VOICE_LIST_TIMEOUT_MS, Zi as VoiceCaption, Qi as VoiceConversationView, ea as VoiceMiniController, ta as VoiceStage, na as VoiceTranscriptDrawer, $i as VoiceWaveform, I as WAIT_FOR_SANDBOX_RUNNING, q as abortAssistantTurn, si as activePanelOverlay, ga as aiCreditsUpdatedEventName, Ci as applyPreviewEvent, J as approvePendingWrite, ci as assistantPanelOwnsEscape, _ as assistantRoutePath, c as assistantTranslationKey, v as assistantUrlTransform, Ur as availableAttachmentSources, qe as base64ToBytes, y as browserShouldHandle, Le as browserSpeechEngine, Y as buildAssistantSandboxEnv, or as buildAttachmentPromptBlock, It as buildContinuedFromVoiceNote, ve as buildProgress, sr as buildPromptParts, X as buildPromptRequestBody, cr as buildPromptWithAttachments, Je as buildRequest, E as buildSandboxContextInput, Lt as buildVoiceTranscriptMarkdown, Ae as chatTurns, Z as checkAssistantAiCredits, Wt as chunkForSpeech, b as classifyAssistantHref, lr as classifyAttachment, Ye as classifyHttpFailure, S as classifyQuotaError, Mn as columnLetterToIndex, tt as configureSpeechEngine, Gt as containsCjk, d as copyToClipboard, ur as countInlineImageCandidates, dr as countInlinedImageParts, wi as createAssistantPreviewSurface, Q as createAssistantSandbox, $ as createAssistantSession, $e as createHostedTtsEngine, Kr as createReadinessTracker, et as createRoutingSpeechEngine, Oi as createRunIdentityCache, Oe as createSandboxAssistantTransport, nt as createSpeechEngines, Ti as currentPreviewOwner, Xe as decodeAudioResponse, Nn as decodeXmlEntities, C as describeQuotaError, fr as detectDocumentFormat, _n as detectScriptLocale, Wr as deviceHasCamera, _a as dispatchAssistantQuotaExhausted, Pn as docxXmlToText, ee as downloadAssistantArtifact, ra as downloadFile, li as escapeDismisses, pr as estimateTurnBodyBytes, D as executeSandboxGraphQL, ia as exportConversation, te as extendAssistantSandboxTTL, ba as extractDocumentText, ln as findAssistantLanguage, ne as findExistingSandbox, pn as findPendingWrite, Fn as fitPdfPages, ui as focusIsInsidePanel, mr as formatBytes, In as formatPageRanges, zr as getActorId, re as getAssistantArtifacts, ye as getAssistantMedia, ie as getAssistantMessages, ae as getAssistantSession, oe as getAssistantStreamAccess, be as getAssistantText, hr as getAttachmentSendBlocker, U as getCapability, gr as getExtension, R as getImageForMode, z as getImageTagForMode, Br as getOrganizationId, xe as getRawMessageCreatedAt, B as getResourcesForMode, V as getSandboxImageRegistry, _r as getSendableAttachments, rt as getSpeechEngine, Se as getToolProgress, Vr as getWorkspaceId, je as groupBySession, Me as groupConsecutiveBySession, vr as hasAttachmentWorkInFlight, Be as hostedLocaleFor, Ve as hostedSupportsLanguage, p as imageHostLabel, _t as isCapturing, vt as isEcho, Ln as isMostlyImagePages, ma as isMultimodalBodyRejection, Ca as isProdRuntime, w as isQuotaExhaustedError, Ce as isReapedSandboxConnectionError, qr as isRecentlyVerified, we as isRecoverable, ha as isRecoverableAssistantError, m as isRemoteImageSrc, yi as isRunningStatus, bn as isSpeakingMessage, Et as isSpeechBlocked, Ar as isStageCopy, yt as isSubmittable, wr as isTurnInFlight, W as isUnknownFieldError, Ne as isVoiceTurn, Rn as joinSheets, Dt as languageDisplayName, Te as mapSessionToHistory, G as markSupported, K as markUnsupported, Ee as mergeMessagesById, ot as micIsInterrupt, se as modeRequiresConfirmWrites, ji as nextActiveTab, Wi as nextModeIndex, di as nextPanelOverlays, bi as nextPreviewEvents, Ot as normalizeLangTag, va as notifyAiCreditsUpdated, bt as orbMode, zn as pageMarker, fi as panelOwnsEscape, mn as parseConfirmationRefusal, yr as parseDataUrl, Bn as parseSharedStrings, Fr as parseToolActivity, Vn as parseWorkbookSheets, Hn as pdfTextItemsToPage, Mi as pinActiveTab, Tr as planAbandonedTurn, xt as planReplyConsumption, Er as planTurnAbort, an as pollDelayMs, kt as primaryLanguageSubtag, xn as publishedChunks, T as quotaExhaustedEventName, it as readSpeechEngineConfig, ce as releaseSupersededAssistantSandboxes, dn as replyFollowsInput, le as reportAssistantAiTokenUsage, Sn as requiresCancel, at as resetSpeechEngine, un as resolveAssistantLanguage, fn as resolveLanguagePair, n as resolveModeConfig, H as resolveSandboxAssistantMode, vn as resolveSpeechLocale, Ei as runBelongsTo, ki as runIdentities, Di as sameOwner, De as sanitize, ue as selectExistingAssistantSandbox, de as selectSupersededAssistantSandboxes, At as selectVoiceForLocale, fe as sendAssistantPromptAsync, pe as sendHeartbeat, Un as sheetXmlToRows, Ze as shouldDisableEngine, Qt as showPreviousChunk, st as showsAssistantCaption, ct as showsUserCaption, Kt as speakableEmail, jt as speechGate, gn as speechLabelsFor, Mt as speechLangForLocale, Cn as speechPlaybackReducer, Qe as splitForVendor, qt as splitTableRow, St as spokenSoFar, jr as stageText, Mr as statusStageCopy, Ni as stepsFromToolActivity, me as stopReapedAssistantSandbox, Wn as summarisePageText, Pi as tabForArrowKey, Nr as thinkingPhrase, on as toCaptionText, br as toMessageAttachment, Jt as toSpeakableText, xr as truncateForInline, Gn as truncatePagesForInline, fa as useAssistantApiAccess, xa as useAssistantAttachments, ni as useAssistantConnectSource, wa as useAssistantHeartbeat, l as useAssistantI18nNamespace, Ta as useAssistantKeyboardShortcuts, x as useAssistantNavigate, r as useAssistantPageLabel, _i as useAssistantPreview, Ri as useAssistantPreviewBridge, i as useAssistantProduct, a as useAssistantProductOrNull, Lr as useAssistantSpeech, o as useAssistantStorageFolders, Cr as useAssistantStore, u as useAssistantTr, pa as useConversationTurns, pi as useDropdownEscape, Li as useOverlayFocus, ke as useSandboxAssistantTransport, e as useVoiceInput, Rr as useVoiceSession, ya as useWorkspaceWriteAccess, Sr as validateFile, Nt as voiceAvailability, Pe as voiceMarker, Xt as voicePreviewText, Pt as voiceQualityRank, Fe as voiceSessionIdOf, Ct as voiceSessionReducer, lt as voiceStageState, Rt as voiceTranscriptFilename, Ie as voiceTurnsOnly, Ft as voicesForLocale, he as waitForAssistantServiceReady, ge as waitForSandboxRunning, ut as waveformIsActive, dt as waveformIsSettled };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/fe-libs",
3
- "version": "2026.912.1",
3
+ "version": "2026.912.2",
4
4
  "description": "Burdenoff frontend primitives and domain libraries",
5
5
  "type": "module",
6
6
  "bin": {