@burdenoff/fe-libs 2026.910.1 → 2026.910.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.
@@ -1,6 +1,7 @@
1
1
  import { FC } from 'react';
2
2
  import { PanelProps } from '../../plugins/types';
3
3
  import { WorkspaceWriteAccess } from '../useWorkspaceWriteAccess';
4
+ import { AssistantNavigate } from './AssistantMarkdownRenderer';
4
5
  export type AIAssistantPanelProps = PanelProps & {
5
6
  /** When provided, renders a dock/float toggle in the header. */
6
7
  docked?: boolean;
@@ -13,6 +14,16 @@ export type AIAssistantPanelProps = PanelProps & {
13
14
  * it and the panel simply never claims a write will be refused.
14
15
  */
15
16
  writeAccess?: WorkspaceWriteAccess;
17
+ /**
18
+ * Route an in-app link from an assistant reply instead of a full page load.
19
+ * Receives a router-ready PATH (`/fields?crop=42#yield`), already resolved
20
+ * from the href and proven same-origin — pass it straight to `navigate()`.
21
+ *
22
+ * ★ Threaded through rather than resolved here, for the same reason as
23
+ * `writeAccess`: only the product owns a router. Omit it and internal links
24
+ * stay ordinary same-tab anchors — the assistant never navigates on its own.
25
+ */
26
+ onNavigate?: AssistantNavigate;
16
27
  };
17
28
  /**
18
29
  * The panel.
@@ -1 +1 @@
1
- {"version":3,"file":"AIAssistantPanel.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AIAssistantPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAU,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAMtD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAQvE,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG;IAC/C,gEAAgE;IAChE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,oBAAoB,CAAC;CACpC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CA+FtD,CAAC"}
1
+ {"version":3,"file":"AIAssistantPanel.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AIAssistantPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAU,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAMtD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAIvE,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,6BAA6B,CAAC;AAKrC,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG;IAC/C,gEAAgE;IAChE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CA6GtD,CAAC"}
@@ -2,49 +2,53 @@ import { useAssistantPageLabel as e } from "../product.js";
2
2
  import { useAssistantTr as t } from "../i18n.js";
3
3
  import { useAssistantStore as n } from "../store.js";
4
4
  import { AssistantSpeechProvider as r } from "./AssistantSpeechProvider.js";
5
- import { AssistantHeader as i } from "./AssistantHeader.js";
6
- import { AssistantConversationList as a } from "./AssistantConversationList.js";
7
- import { useFilesServiceWarmup as o } from "../../../storage/warmFilesService.js";
8
- import { useAssistantHeartbeat as s } from "../useAssistantHeartbeat.js";
9
- import { useAssistantKeyboardShortcuts as c } from "../useAssistantKeyboardShortcuts.js";
10
- import { AssistantChatArea as l } from "./AssistantChatArea.js";
11
- import { useRef as u } from "react";
12
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
5
+ import { AssistantNavigateProvider as i } from "./AssistantMarkdownRenderer.js";
6
+ import { AssistantHeader as a } from "./AssistantHeader.js";
7
+ import { AssistantConversationList as o } from "./AssistantConversationList.js";
8
+ import { useFilesServiceWarmup as s } from "../../../storage/warmFilesService.js";
9
+ import { useAssistantHeartbeat as c } from "../useAssistantHeartbeat.js";
10
+ import { useAssistantKeyboardShortcuts as l } from "../useAssistantKeyboardShortcuts.js";
11
+ import { AssistantChatArea as u } from "./AssistantChatArea.js";
12
+ import { useRef as d } from "react";
13
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
13
14
  //#region src/shared/assistant/ui/AIAssistantPanel.tsx
14
- var p = ({ onClose: p, visible: m, docked: h, onToggleDock: g, writeAccess: _ }) => {
15
- let v = t(), y = u(null), { conversations: b, activeConversationId: x, conversationListOpen: S, toggleConversationList: C, createConversation: w } = n(), T = b.find((e) => e.id === x);
16
- s(T?.backendSessionId ?? null, T?.mode ?? null, m ?? !0), o(m ?? !0);
17
- let E = e(m !== !1);
18
- return c({
19
- panelRef: y,
20
- onClose: p
21
- }), /* @__PURE__ */ d(r, {
22
- visible: m ?? !0,
23
- children: /* @__PURE__ */ f("div", {
24
- ref: y,
25
- className: "relative flex h-full w-full flex-col bg-bg-surface",
26
- role: "complementary",
27
- "aria-label": v("panel.ariaLabel", "AI Assistant"),
28
- "data-testid": "ai-assistant-panel",
29
- tabIndex: -1,
30
- children: [
31
- /* @__PURE__ */ d(i, {
32
- contextLabel: E,
33
- onNewConversation: () => w(),
34
- onOpenHistory: C,
35
- historyOpen: S,
36
- onClose: p,
37
- docked: h,
38
- onToggleDock: g
39
- }),
40
- S && /* @__PURE__ */ d(a, {}),
41
- /* @__PURE__ */ d(l, {
42
- visible: m ?? !0,
43
- writeAccess: _
44
- })
45
- ]
15
+ var m = ({ onClose: m, visible: h, docked: g, onToggleDock: _, writeAccess: v, onNavigate: y }) => {
16
+ let b = t(), x = d(null), { conversations: S, activeConversationId: C, conversationListOpen: w, toggleConversationList: T, createConversation: E } = n(), D = S.find((e) => e.id === C);
17
+ c(D?.backendSessionId ?? null, D?.mode ?? null, h ?? !0), s(h ?? !0);
18
+ let O = e(h !== !1);
19
+ return l({
20
+ panelRef: x,
21
+ onClose: m
22
+ }), /* @__PURE__ */ f(r, {
23
+ visible: h ?? !0,
24
+ children: /* @__PURE__ */ f(i, {
25
+ value: y,
26
+ children: /* @__PURE__ */ p("div", {
27
+ ref: x,
28
+ className: "relative flex h-full w-full flex-col bg-bg-surface",
29
+ role: "complementary",
30
+ "aria-label": b("panel.ariaLabel", "AI Assistant"),
31
+ "data-testid": "ai-assistant-panel",
32
+ tabIndex: -1,
33
+ children: [
34
+ /* @__PURE__ */ f(a, {
35
+ contextLabel: O,
36
+ onNewConversation: () => E(),
37
+ onOpenHistory: T,
38
+ historyOpen: w,
39
+ onClose: m,
40
+ docked: g,
41
+ onToggleDock: _
42
+ }),
43
+ w && /* @__PURE__ */ f(o, {}),
44
+ /* @__PURE__ */ f(u, {
45
+ visible: h ?? !0,
46
+ writeAccess: v
47
+ })
48
+ ]
49
+ })
46
50
  })
47
51
  });
48
52
  };
49
53
  //#endregion
50
- export { p as AIAssistantPanel };
54
+ export { m as AIAssistantPanel };
@@ -1,10 +1,61 @@
1
- import { FC } from 'react';
1
+ import { FC, ReactNode } from 'react';
2
2
  import { Options } from 'react-markdown';
3
3
  interface Props {
4
4
  content: string;
5
5
  }
6
6
  /** @internal Exported for unit tests; not part of the module's public surface. */
7
7
  export declare const assistantUrlTransform: Options["urlTransform"];
8
+ /**
9
+ * How a link in an assistant reply should be treated.
10
+ *
11
+ * ★★ `href.startsWith("/")` IS NOT AN INTERNAL TEST. A protocol-relative URL —
12
+ * `//evil.example/path` — has no colon, so react-markdown's `defaultUrlTransform`
13
+ * returns it verbatim and the sanitizer passes it through; the browser then
14
+ * resolves it against the page's SCHEME and lands on another origin. Treating
15
+ * that as internal would hand an attacker-authored destination to the router.
16
+ * So the decision is made by RESOLVING the href and comparing origins.
17
+ *
18
+ * ★ This runs AFTER the sanitizer, so anything with an unsafe scheme has already
19
+ * been reduced to an empty string upstream — `blocked` here is the empty case,
20
+ * not a second scheme allow-list. The scheme policy stays in one place.
21
+ */
22
+ export type AssistantLinkKind = "internal" | "external" | "fragment" | "blocked";
23
+ /**
24
+ * Route an in-app PATH — `/fields?crop=42#yield`, never a full URL. Supplied by
25
+ * the product; absent means "no SPA routing".
26
+ */
27
+ export type AssistantNavigate = (path: string) => void;
28
+ /**
29
+ * ★ `baseOrigin` is threaded rather than left to `isSafeRedirectTarget`'s own
30
+ * `window.location.origin` default so this stays callable — and testable — with
31
+ * no DOM. With no origin to compare against we cannot prove a link is internal,
32
+ * so it degrades to `external`: a new tab is the safe direction to fail.
33
+ */
34
+ export declare function classifyAssistantHref(href: string | null | undefined, baseOrigin?: string): AssistantLinkKind;
35
+ /**
36
+ * The router-ready path for an href already classified as `internal`, or null if
37
+ * it cannot be resolved.
38
+ *
39
+ * ★★ WHY THIS IS NOT THE HREF. An internal link may be written absolutely —
40
+ * `https://app.example.com/fields?q=1#top` is same-origin, so it classifies as
41
+ * internal — and every SPA router reads a `to`/`navigate()` string as a PATH.
42
+ * Handing it the absolute form routes to a literal `/https://app.example.com/...`
43
+ * segment. Resolving here means each product wires one line and cannot get this
44
+ * wrong; the alternative is the same five lines re-derived in every product,
45
+ * with only the ones whose assistant happened to emit an absolute URL finding
46
+ * out they got it wrong.
47
+ */
48
+ export declare function assistantRoutePath(href: string | null | undefined, baseOrigin?: string): string | null;
49
+ /**
50
+ * ★ Context, not a prop: the renderer is reached by TWO paths — the chat
51
+ * transcript and the voice transcript drawer — and threading a prop through
52
+ * both spines means the next surface silently ships links that reload the app.
53
+ */
54
+ export declare const AssistantNavigateProvider: FC<{
55
+ value?: AssistantNavigate;
56
+ children: ReactNode;
57
+ }>;
58
+ export declare function useAssistantNavigate(): AssistantNavigate | null;
8
59
  export declare const AssistantMarkdownRenderer: FC<Props>;
9
60
  export {};
10
61
  //# sourceMappingURL=AssistantMarkdownRenderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantMarkdownRenderer.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantMarkdownRenderer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAY,KAAK,EAAE,EAAkB,MAAM,OAAO,CAAC;AAC1D,OAAiB,EAIf,KAAK,OAAO,EACb,MAAM,gBAAgB,CAAC;AAQxB,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAqDD,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,EAAE,OAAO,CAAC,cAAc,CAWzD,CAAC;AAkQF,eAAO,MAAM,yBAAyB,EAAE,EAAE,CAAC,KAAK,CAiB/C,CAAC"}
1
+ {"version":3,"file":"AssistantMarkdownRenderer.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantMarkdownRenderer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAIL,KAAK,EAAE,EAEP,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAiB,EAIf,KAAK,OAAO,EACb,MAAM,gBAAgB,CAAC;AASxB,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAqDD,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,EAAE,OAAO,CAAC,cAAc,CAWzD,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AAEjF;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAUvD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,UAAU,CAAC,EAAE,MAAM,GAClB,iBAAiB,CASnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CA+Bf;AAoBD;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,EAAE,CAAC;IACzC,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,EAAE,SAAS,CAAC;CACrB,CAIA,CAAC;AAEF,wBAAgB,oBAAoB,IAAI,iBAAiB,GAAG,IAAI,CAE/D;AAmTD,eAAO,MAAM,yBAAyB,EAAE,EAAE,CAAC,KAAK,CAiB/C,CAAC"}
@@ -1,52 +1,113 @@
1
- import { Markdown as e, defaultUrlTransform as t } from "../../../node_modules/react-markdown/lib/index.js";
2
- import n from "../../../node_modules/remark-gfm/lib/index.js";
3
- import { defaultSchema as r } from "../../../node_modules/hast-util-sanitize/lib/schema.js";
4
- import i from "../../../node_modules/rehype-sanitize/lib/index.js";
5
- import { useAssistantTr as a } from "../i18n.js";
6
- import { copyToClipboard as o } from "../clipboard.js";
7
- import { AssistantMarkdownImage as s } from "./AssistantMarkdownImage.js";
8
- import { useState as c } from "react";
9
- import { Check as l, Copy as u } from "lucide-react";
10
- import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
1
+ import { isSafeRedirectTarget as e } from "../../graphql/security.js";
2
+ import { Markdown as t, defaultUrlTransform as n } from "../../../node_modules/react-markdown/lib/index.js";
3
+ import r from "../../../node_modules/remark-gfm/lib/index.js";
4
+ import { defaultSchema as i } from "../../../node_modules/hast-util-sanitize/lib/schema.js";
5
+ import a from "../../../node_modules/rehype-sanitize/lib/index.js";
6
+ import { useAssistantTr as o } from "../i18n.js";
7
+ import { copyToClipboard as s } from "../clipboard.js";
8
+ import { AssistantMarkdownImage as c } from "./AssistantMarkdownImage.js";
9
+ import { createContext as l, useContext as u, useState as d } from "react";
10
+ import { Check as f, Copy as p } from "lucide-react";
11
+ import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
11
12
  //#region src/shared/assistant/ui/AssistantMarkdownRenderer.tsx
12
- var m = {
13
- ...r,
13
+ var _ = {
14
+ ...i,
14
15
  protocols: {
15
- ...r.protocols,
16
- src: [...r.protocols?.src ?? [], "data"]
16
+ ...i.protocols,
17
+ src: [...i.protocols?.src ?? [], "data"]
17
18
  }
18
- }, h = /^data:image\/(?:png|jpe?g|gif|webp|avif|bmp);base64,[A-Za-z0-9+/=\s]+$/, g = (e, n, r) => n === "src" && r.tagName === "img" && h.test(e) ? e : t(e), _ = [n], v = [[i, m]];
19
- function y({ language: e, code: t }) {
20
- let n = a(), [r, i] = c(!1);
21
- return /* @__PURE__ */ p("div", {
19
+ }, v = /^data:image\/(?:png|jpe?g|gif|webp|avif|bmp);base64,[A-Za-z0-9+/=\s]+$/, y = (e, t, r) => t === "src" && r.tagName === "img" && v.test(e) ? e : n(e);
20
+ function b() {
21
+ try {
22
+ return typeof window > "u" ? null : window.location.origin;
23
+ } catch {
24
+ return null;
25
+ }
26
+ }
27
+ function x(t, n) {
28
+ let r = (t ?? "").trim();
29
+ if (!r) return "blocked";
30
+ if (r.startsWith("#")) return "fragment";
31
+ let i = n ?? b();
32
+ return i && e(r, i) ? "internal" : "external";
33
+ }
34
+ function S(e, t) {
35
+ let n = (e ?? "").trim();
36
+ if (!n) return null;
37
+ let r = t ?? b();
38
+ if (!r) return null;
39
+ try {
40
+ let e = new URL(n, r), t = `${e.pathname}${e.search}${e.hash}`;
41
+ return t.startsWith("//") || t.startsWith("/\\") ? null : t;
42
+ } catch {
43
+ return null;
44
+ }
45
+ }
46
+ function C(e) {
47
+ return e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey;
48
+ }
49
+ var w = l(null), T = ({ value: e, children: t }) => /* @__PURE__ */ h(w.Provider, {
50
+ value: e ?? null,
51
+ children: t
52
+ });
53
+ function E() {
54
+ return u(w);
55
+ }
56
+ var D = "text-action-primary-bg underline-offset-2 hover:underline", O = ({ href: e, children: t }) => {
57
+ let n = E(), r = x(e), i = r === "internal" ? S(e) : null;
58
+ return r === "blocked" ? /* @__PURE__ */ h(m, { children: t }) : n && i ? /* @__PURE__ */ h("a", {
59
+ href: e,
60
+ className: D,
61
+ "data-testid": "assistant-markdown-link",
62
+ onClick: (e) => {
63
+ C(e) || (e.preventDefault(), n(i));
64
+ },
65
+ children: t
66
+ }) : r === "internal" || r === "fragment" ? /* @__PURE__ */ h("a", {
67
+ href: e,
68
+ className: D,
69
+ "data-testid": "assistant-markdown-link",
70
+ children: t
71
+ }) : /* @__PURE__ */ h("a", {
72
+ href: e,
73
+ target: "_blank",
74
+ rel: "noopener noreferrer",
75
+ className: D,
76
+ "data-testid": "assistant-markdown-link",
77
+ children: t
78
+ });
79
+ }, k = [r], A = [[a, _]];
80
+ function j({ language: e, code: t }) {
81
+ let n = o(), [r, i] = d(!1);
82
+ return /* @__PURE__ */ g("div", {
22
83
  className: "group relative my-2 overflow-hidden rounded-md border border-border-default bg-bg-sunken",
23
- children: [/* @__PURE__ */ p("div", {
84
+ children: [/* @__PURE__ */ g("div", {
24
85
  className: "flex items-center justify-between border-b border-border-default bg-bg-elevated px-3 py-1.5",
25
- children: [/* @__PURE__ */ f("span", {
86
+ children: [/* @__PURE__ */ h("span", {
26
87
  className: "font-mono text-[10px] uppercase tracking-wider text-text-muted",
27
88
  children: e || "code"
28
- }), /* @__PURE__ */ f("button", {
89
+ }), /* @__PURE__ */ h("button", {
29
90
  type: "button",
30
91
  onClick: () => {
31
- o(t).then((e) => {
92
+ s(t).then((e) => {
32
93
  e && (i(!0), setTimeout(() => i(!1), 2e3));
33
94
  });
34
95
  },
35
96
  className: "flex items-center gap-1 rounded px-1.5 py-0.5 text-[10px] text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary",
36
97
  "aria-label": n("markdown.copyCode", "Copy code"),
37
98
  "data-testid": "assistant-markdown-copy-code",
38
- children: r ? /* @__PURE__ */ p(d, { children: [/* @__PURE__ */ f(l, { className: "size-3 text-status-success-text" }), /* @__PURE__ */ f("span", { children: n("markdown.copied", "Copied") })] }) : /* @__PURE__ */ p(d, { children: [/* @__PURE__ */ f(u, { className: "size-3" }), /* @__PURE__ */ f("span", { children: n("markdown.copy", "Copy") })] })
99
+ children: r ? /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h(f, { className: "size-3 text-status-success-text" }), /* @__PURE__ */ h("span", { children: n("markdown.copied", "Copied") })] }) : /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h(p, { className: "size-3" }), /* @__PURE__ */ h("span", { children: n("markdown.copy", "Copy") })] })
39
100
  })]
40
- }), /* @__PURE__ */ f("pre", {
101
+ }), /* @__PURE__ */ h("pre", {
41
102
  className: "overflow-x-auto p-3 text-xs leading-relaxed",
42
- children: /* @__PURE__ */ f("code", {
103
+ children: /* @__PURE__ */ h("code", {
43
104
  className: "font-mono text-text-primary",
44
105
  children: t
45
106
  })
46
107
  })]
47
108
  });
48
109
  }
49
- function b(e) {
110
+ function M(e) {
50
111
  let t = e?.children?.[0];
51
112
  if (!t || t.type !== "element" || t.tagName !== "code") return null;
52
113
  let n = t.children.map((e) => e.type === "text" ? e.value : "").join(""), r = t.properties?.className, i = (Array.isArray(r) ? r.map(String) : String(r ?? "").split(" ")).find((e) => e.startsWith("language-"));
@@ -55,10 +116,10 @@ function b(e) {
55
116
  language: i ? i.slice(9) : ""
56
117
  };
57
118
  }
58
- function x(e, t) {
119
+ function N(e, t) {
59
120
  return typeof e == "string" && e.split(" ").includes(t);
60
121
  }
61
- function S({ level: e, children: t }) {
122
+ function P({ level: e, children: t }) {
62
123
  let n = `h${e}`, r = {
63
124
  2: "text-[1.15em]",
64
125
  3: "text-[1.08em]",
@@ -66,133 +127,129 @@ function S({ level: e, children: t }) {
66
127
  5: "text-[0.95em]",
67
128
  6: "text-[0.9em]"
68
129
  }[e];
69
- return /* @__PURE__ */ f(n, {
130
+ return /* @__PURE__ */ h(n, {
70
131
  className: `mb-1 mt-3 font-semibold text-text-primary ${r}`,
71
132
  children: t
72
133
  });
73
134
  }
74
- var C = {
75
- a: ({ href: e, children: t }) => /* @__PURE__ */ f("a", {
135
+ var F = {
136
+ a: ({ href: e, children: t }) => /* @__PURE__ */ h(O, {
76
137
  href: e,
77
- target: "_blank",
78
- rel: "noopener noreferrer",
79
- className: "text-action-primary-bg underline-offset-2 hover:underline",
80
- "data-testid": "assistant-markdown-link",
81
138
  children: t
82
139
  }),
83
- blockquote: ({ children: e }) => /* @__PURE__ */ f("blockquote", {
140
+ blockquote: ({ children: e }) => /* @__PURE__ */ h("blockquote", {
84
141
  className: "my-2 border-l-2 border-action-primary-bg pl-3 italic text-text-secondary",
85
142
  children: e
86
143
  }),
87
- code: ({ children: e }) => /* @__PURE__ */ f("code", {
144
+ code: ({ children: e }) => /* @__PURE__ */ h("code", {
88
145
  className: "rounded bg-bg-sunken px-1 py-0.5 font-mono text-[0.85em] text-text-primary",
89
146
  children: e
90
147
  }),
91
- del: ({ children: e }) => /* @__PURE__ */ f("del", {
148
+ del: ({ children: e }) => /* @__PURE__ */ h("del", {
92
149
  className: "text-text-muted line-through",
93
150
  children: e
94
151
  }),
95
- em: ({ children: e }) => /* @__PURE__ */ f("em", {
152
+ em: ({ children: e }) => /* @__PURE__ */ h("em", {
96
153
  className: "italic",
97
154
  children: e
98
155
  }),
99
- h1: ({ children: e }) => /* @__PURE__ */ f(S, {
156
+ h1: ({ children: e }) => /* @__PURE__ */ h(P, {
100
157
  level: 2,
101
158
  children: e
102
159
  }),
103
- h2: ({ children: e }) => /* @__PURE__ */ f(S, {
160
+ h2: ({ children: e }) => /* @__PURE__ */ h(P, {
104
161
  level: 3,
105
162
  children: e
106
163
  }),
107
- h3: ({ children: e }) => /* @__PURE__ */ f(S, {
164
+ h3: ({ children: e }) => /* @__PURE__ */ h(P, {
108
165
  level: 4,
109
166
  children: e
110
167
  }),
111
- h4: ({ children: e }) => /* @__PURE__ */ f(S, {
168
+ h4: ({ children: e }) => /* @__PURE__ */ h(P, {
112
169
  level: 5,
113
170
  children: e
114
171
  }),
115
- h5: ({ children: e }) => /* @__PURE__ */ f(S, {
172
+ h5: ({ children: e }) => /* @__PURE__ */ h(P, {
116
173
  level: 6,
117
174
  children: e
118
175
  }),
119
- h6: ({ children: e }) => /* @__PURE__ */ f(S, {
176
+ h6: ({ children: e }) => /* @__PURE__ */ h(P, {
120
177
  level: 6,
121
178
  children: e
122
179
  }),
123
- hr: () => /* @__PURE__ */ f("hr", { className: "my-3 border-border-default" }),
124
- img: ({ src: e, alt: t, title: n }) => /* @__PURE__ */ f(s, {
180
+ hr: () => /* @__PURE__ */ h("hr", { className: "my-3 border-border-default" }),
181
+ img: ({ src: e, alt: t, title: n }) => /* @__PURE__ */ h(c, {
125
182
  src: typeof e == "string" ? e : void 0,
126
183
  alt: t,
127
184
  title: n
128
185
  }),
129
- input: ({ checked: e, type: t }) => t === "checkbox" ? /* @__PURE__ */ f("input", {
186
+ input: ({ checked: e, type: t }) => t === "checkbox" ? /* @__PURE__ */ h("input", {
130
187
  type: "checkbox",
131
188
  checked: !!e,
132
189
  disabled: !0,
133
190
  className: "mr-1.5 size-3 flex-shrink-0 align-[-0.1em] accent-[var(--color-action-primary-bg)]"
134
191
  }) : null,
135
- li: ({ className: e, children: t }) => /* @__PURE__ */ f("li", {
136
- className: x(e, "task-list-item") ? "list-none text-text-primary" : "text-text-primary",
192
+ li: ({ className: e, children: t }) => /* @__PURE__ */ h("li", {
193
+ className: N(e, "task-list-item") ? "list-none text-text-primary" : "text-text-primary",
137
194
  children: t
138
195
  }),
139
- ol: ({ children: e }) => /* @__PURE__ */ f("ol", {
196
+ ol: ({ children: e }) => /* @__PURE__ */ h("ol", {
140
197
  className: "my-1.5 ml-5 list-decimal space-y-0.5",
141
198
  children: e
142
199
  }),
143
- p: ({ children: e }) => /* @__PURE__ */ f("p", {
200
+ p: ({ children: e }) => /* @__PURE__ */ h("p", {
144
201
  className: "my-1.5 leading-relaxed text-text-primary",
145
202
  children: e
146
203
  }),
147
204
  pre: ({ children: e, node: t }) => {
148
- let n = b(t);
149
- return n ? /* @__PURE__ */ f(y, {
205
+ let n = M(t);
206
+ return n ? /* @__PURE__ */ h(j, {
150
207
  language: n.language,
151
208
  code: n.code
152
- }) : /* @__PURE__ */ f("pre", {
209
+ }) : /* @__PURE__ */ h("pre", {
153
210
  className: "my-2 overflow-x-auto rounded-md border border-border-default bg-bg-sunken p-3 text-xs leading-relaxed",
154
211
  children: e
155
212
  });
156
213
  },
157
- strong: ({ children: e }) => /* @__PURE__ */ f("strong", {
214
+ strong: ({ children: e }) => /* @__PURE__ */ h("strong", {
158
215
  className: "font-semibold text-text-primary",
159
216
  children: e
160
217
  }),
161
- table: ({ children: e }) => /* @__PURE__ */ f("div", {
218
+ table: ({ children: e }) => /* @__PURE__ */ h("div", {
162
219
  className: "my-2 overflow-x-auto",
163
220
  "data-testid": "assistant-markdown-table",
164
- children: /* @__PURE__ */ f("table", {
221
+ children: /* @__PURE__ */ h("table", {
165
222
  className: "w-full border-collapse text-[0.9em]",
166
223
  children: e
167
224
  })
168
225
  }),
169
- td: ({ children: e }) => /* @__PURE__ */ f("td", {
226
+ td: ({ children: e }) => /* @__PURE__ */ h("td", {
170
227
  className: "px-2 py-1.5 align-top text-text-primary",
171
228
  children: e
172
229
  }),
173
- th: ({ children: e }) => /* @__PURE__ */ f("th", {
230
+ th: ({ children: e }) => /* @__PURE__ */ h("th", {
174
231
  scope: "col",
175
232
  className: "px-2 py-1.5 text-left font-semibold text-text-primary",
176
233
  children: e
177
234
  }),
178
- tr: ({ children: e }) => /* @__PURE__ */ f("tr", {
235
+ tr: ({ children: e }) => /* @__PURE__ */ h("tr", {
179
236
  className: "border-b border-border-subtle",
180
237
  children: e
181
238
  }),
182
- ul: ({ className: e, children: t }) => /* @__PURE__ */ f("ul", {
183
- className: x(e, "contains-task-list") ? "my-1.5 ml-0.5 list-none space-y-0.5" : "my-1.5 ml-5 list-disc space-y-0.5",
239
+ ul: ({ className: e, children: t }) => /* @__PURE__ */ h("ul", {
240
+ className: N(e, "contains-task-list") ? "my-1.5 ml-0.5 list-none space-y-0.5" : "my-1.5 ml-5 list-disc space-y-0.5",
184
241
  children: t
185
242
  })
186
- }, w = ({ content: t }) => /* @__PURE__ */ f("div", {
243
+ }, I = ({ content: e }) => /* @__PURE__ */ h("div", {
187
244
  className: "break-words [&>*:first-child]:mt-0 [&>*:last-child]:mb-0",
188
245
  "data-testid": "assistant-markdown",
189
- children: /* @__PURE__ */ f(e, {
190
- remarkPlugins: _,
191
- rehypePlugins: v,
192
- urlTransform: g,
193
- components: C,
194
- children: t
246
+ children: /* @__PURE__ */ h(t, {
247
+ remarkPlugins: k,
248
+ rehypePlugins: A,
249
+ urlTransform: y,
250
+ components: F,
251
+ children: e
195
252
  })
196
253
  });
197
254
  //#endregion
198
- export { w as AssistantMarkdownRenderer, g as assistantUrlTransform };
255
+ export { I as AssistantMarkdownRenderer, T as AssistantNavigateProvider, S as assistantRoutePath, y as assistantUrlTransform, x as classifyAssistantHref, E as useAssistantNavigate };
@@ -81,4 +81,4 @@ function d(e) {
81
81
  if (e) return Object.fromEntries(Object.entries(e).filter(([e]) => !t.has(e.toLowerCase())));
82
82
  }
83
83
  //#endregion
84
- export { o as getValidAccessTokenFromStorage, l as redirectToSafeLocation, d as sanitizeExtraHeaders, s as sanitizeGeography, u as validateGatewayBaseUrl };
84
+ export { o as getValidAccessTokenFromStorage, c as isSafeRedirectTarget, l as redirectToSafeLocation, d as sanitizeExtraHeaders, s as sanitizeGeography, u as validateGatewayBaseUrl };
@@ -48,47 +48,47 @@ import { ATTACHMENT_SOURCES as Mr, availableAttachmentSources as Nr, deviceHasCa
48
48
  import { SANDBOX_READY_TTL_MS as Fr, createReadinessTracker as Ir, isRecentlyVerified as Lr } from "./shared/assistant/sandboxReadiness.js";
49
49
  import { AssistantAutoSpeakToggle as Rr } from "./shared/assistant/ui/AssistantAutoSpeakToggle.js";
50
50
  import { AssistantMarkdownImage as zr, imageHostLabel as Br, isRemoteImageSrc as Vr } from "./shared/assistant/ui/AssistantMarkdownImage.js";
51
- import { AssistantMarkdownRenderer as Hr, assistantUrlTransform as Ur } from "./shared/assistant/ui/AssistantMarkdownRenderer.js";
52
- import { AssistantMessageAttachments as Wr } from "./shared/assistant/ui/AssistantMessageAttachments.js";
53
- import { AssistantPendingWriteCard as Gr } from "./shared/assistant/ui/AssistantPendingWriteCard.js";
54
- import { AssistantLanguageMenu as Kr } from "./shared/assistant/ui/AssistantLanguageMenu.js";
55
- import { AssistantReplyLanguageSelector as qr } from "./shared/assistant/ui/AssistantReplyLanguageSelector.js";
56
- import { AssistantSpeakButton as Jr } from "./shared/assistant/ui/AssistantSpeakButton.js";
57
- import { AssistantSpokenTurnsNotice as Yr } from "./shared/assistant/ui/AssistantSpokenTurnsNotice.js";
58
- import { AssistantAttachmentButton as Xr } from "./shared/assistant/ui/composer/AssistantAttachmentButton.js";
59
- import { AssistantAttachmentChips as Zr } from "./shared/assistant/ui/composer/AssistantAttachmentChips.js";
60
- import { AssistantLanguageSelector as Qr, FOLLOW_APP_LOCALE as $r } from "./shared/assistant/ui/composer/AssistantLanguageSelector.js";
61
- import { ASSISTANT_MODE_META as ei, AssistantModeSelector as ti, nextModeIndex as ni } from "./shared/assistant/ui/composer/AssistantModeSelector.js";
62
- import { AssistantVoiceButton as ri } from "./shared/assistant/ui/composer/AssistantVoiceButton.js";
63
- import { AUTO_VOICE as ii, AssistantVoiceSelector as ai } from "./shared/assistant/ui/composer/AssistantVoiceSelector.js";
64
- import { AssistantVoiceOrb as oi } from "./shared/assistant/ui/voice/AssistantVoiceOrb.js";
65
- import { AssistantVoiceSessionButton as si } from "./shared/assistant/ui/voice/AssistantVoiceSessionButton.js";
66
- import { CAPTION_SCROLL_ATTR as ci, VoiceCaption as li } from "./shared/assistant/ui/voice/VoiceCaption.js";
67
- import { VoiceConversationView as ui } from "./shared/assistant/ui/voice/VoiceConversationView.js";
68
- import { VoiceWaveform as di } from "./shared/assistant/ui/voice/VoiceWaveform.js";
69
- import { VoiceMiniController as fi } from "./shared/assistant/ui/voice/VoiceMiniController.js";
70
- import { VoiceStage as pi } from "./shared/assistant/ui/voice/VoiceStage.js";
71
- import { VoiceTranscriptDrawer as mi } from "./shared/assistant/ui/voice/VoiceTranscriptDrawer.js";
72
- import { downloadFile as hi, exportConversation as gi } from "./shared/assistant/exportConversation.js";
73
- import { AssistantMoreMenu as _i } from "./shared/assistant/ui/AssistantMoreMenu.js";
74
- import { AssistantHeader as vi } from "./shared/assistant/ui/AssistantHeader.js";
75
- import { AssistantConversationList as yi } from "./shared/assistant/ui/AssistantConversationList.js";
76
- import { AssistantEmptyState as bi } from "./shared/assistant/ui/AssistantEmptyState.js";
77
- import { AssistantMessageItem as xi } from "./shared/assistant/ui/AssistantMessageItem.js";
78
- import { AssistantMessageList as Si } from "./shared/assistant/ui/AssistantMessageList.js";
79
- import { AssistantVoiceSession as Ci } from "./shared/assistant/ui/voice/AssistantVoiceSession.js";
80
- import { useAssistantApiAccess as wi } from "./shared/assistant/useAssistantApiAccess.js";
81
- import { useConversationTurns as Ti } from "./shared/assistant/useConversationTurns.js";
82
- import { isMultimodalBodyRejection as Ei, isRecoverableAssistantError as Di } from "./shared/assistant/transportErrors.js";
83
- import { aiCreditsUpdatedEventName as Oi, dispatchAssistantQuotaExhausted as ki, notifyAiCreditsUpdated as Ai } from "./shared/assistant/aiCredits.js";
84
- import { useWorkspaceWriteAccess as ji } from "./shared/assistant/useWorkspaceWriteAccess.js";
85
- import { extractDocumentText as Mi } from "./shared/assistant/documentExtract.js";
86
- import { useAssistantAttachments as Ni } from "./shared/assistant/useAssistantAttachments.js";
87
- import { AssistantComposer as Pi } from "./shared/assistant/ui/composer/AssistantComposer.js";
88
- import { isProdRuntime as Fi } from "./shared/assistant/env.js";
89
- import { useAssistantHeartbeat as Ii } from "./shared/assistant/useAssistantHeartbeat.js";
90
- import { useAssistantKeyboardShortcuts as Li } from "./shared/assistant/useAssistantKeyboardShortcuts.js";
91
- import { AssistantApiCallsConsentDialog as Ri } from "./shared/assistant/ui/AssistantApiCallsConsentDialog.js";
92
- import { AssistantChatArea as zi } from "./shared/assistant/ui/AssistantChatArea.js";
93
- import { AIAssistantPanel as Bi } from "./shared/assistant/ui/AIAssistantPanel.js";
94
- export { Bi as AIAssistantPanel, g as ASSISTANT_API_AUTH_STRATEGY, zt as ASSISTANT_LANGUAGES, ei as ASSISTANT_MODE_META, Fn as ATTACHMENT_ACCEPT, Mr as ATTACHMENT_SOURCES, ii as AUTO_VOICE, Ri as AssistantApiCallsConsentDialog, Xr as AssistantAttachmentButton, Zr as AssistantAttachmentChips, Rr as AssistantAutoSpeakToggle, zi as AssistantChatArea, Pi as AssistantComposer, yi as AssistantConversationList, bi as AssistantEmptyState, vi as AssistantHeader, $t as AssistantI18nProvider, Kr as AssistantLanguageMenu, Qr as AssistantLanguageSelector, zr as AssistantMarkdownImage, Hr as AssistantMarkdownRenderer, Wr as AssistantMessageAttachments, xi as AssistantMessageItem, Si as AssistantMessageList, ti as AssistantModeSelector, _i as AssistantMoreMenu, Gr as AssistantPendingWriteCard, qt as AssistantProductProvider, qr as AssistantReplyLanguageSelector, X as AssistantRuntimeManager, Jr as AssistantSpeakButton, Tr as AssistantSpeechProvider, Yr as AssistantSpokenTurnsNotice, Cr as AssistantToolActivity, ri as AssistantVoiceButton, oi as AssistantVoiceOrb, ai as AssistantVoiceSelector, Ci as AssistantVoiceSession, si as AssistantVoiceSessionButton, In as AttachmentRejectedError, hn as BOILERPLATE_PAGE_SHARE, ci as CAPTION_SCROLL_ATTR, s as CHECK_AI_CREDITS, c as CREATE_SANDBOX, vt as DEFAULT_SPEAKABLE_LABELS, Bt as DEFAULT_SPEECH_RATE, Ge as ENDPOINT_GRACE_MS, l as EXTEND_SANDBOX_TTL, $r as FOLLOW_APP_LOCALE, u as GET_ACTIVE_SANDBOXES, d as GET_SANDBOX, xe as HOSTED_TTS_MAX_CHARS, _e as HOSTED_TTS_TIER, ve as HOSTED_VOICES, cn as IDLE_PLAYBACK, Ke as INITIAL_SESSION, Ln as INLINE_IMAGE_MAX_DIM, Rn as INLINE_IMAGE_QUALITY, qe as INTERRUPT_MAX_MS, Je as INTERRUPT_MIN_MS, zn as MAX_ATTACHMENTS, gn as MAX_BOILERPLATE_LINE_CHARS, _n as MAX_EXTRACTED_CHARS, Bn as MAX_FILE_BYTES, Vn as MAX_INLINE_CHARS_PER_FILE, Hn as MAX_INLINE_CHARS_TOTAL, pn as MAX_INLINE_IMAGE_BASE64_BYTES, Un as MAX_INLINE_IMAGE_BASE64_CHARS, Wn as MAX_INLINE_IMAGE_PARTS, Gn as MAX_INLINE_TURN_BODY_BYTES, vn as MAX_PDF_PAGES_SCANNED, mn as MAX_REQUEST_BODY_BYTES, yt as MAX_SPEAKABLE_CHARS, bt as MAX_SPOKEN_TABLE_ROWS, Kn as MAX_TURN_BODY_BYTES, At as MINI_CAPTION_BUDGET, yn as MIN_PAGE_TEXT_CHARS, bn as MIN_TEXT_PAGE_SHARE, gr as PHRASE_ROTATE_MS, Mt as POLL_FAST_MS, Nt as POLL_FAST_UNTIL_MS, Pt as POLL_SLOW_MS, Ft as POLL_STEADY_MS, It as POLL_STEADY_UNTIL_MS, Ot as PREVIEW_LANGUAGES, qn as PROMPT_ENVELOPE_RESERVE_BYTES, f as PROXY_SANDBOX_REQUEST, p as REPORT_AI_TOKEN_USAGE, Fr as SANDBOX_READY_TTL_MS, Ye as SILENCE_SUBMIT_MS, Se as SPEAKING_RATE_MAX, Ce as SPEAKING_RATE_MAX_STREAMING, we as SPEAKING_RATE_MAX_SYNC, Te as SPEAKING_RATE_MIN, xt as SPEECH_CHUNK_CHARS, St as SPEECH_CHUNK_CJK_CHARS, rt as SPEECH_LANG, rn as SPOKEN_LABEL_LANGUAGES, _r as STAGE_COPY, m as STOP_ASSISTANT_SANDBOX, vr as THINKING_PHRASES, Jn as TURN_BODY_HEADROOM_BYTES, it as VOICE_LIST_TIMEOUT_MS, li as VoiceCaption, ui as VoiceConversationView, fi as VoiceMiniController, pi as VoiceStage, mi as VoiceTranscriptDrawer, di as VoiceWaveform, h as WAIT_FOR_SANDBOX_RUNNING, E as abortAssistantTurn, Oi as aiCreditsUpdatedEventName, D as approvePendingWrite, en as assistantTranslationKey, Ur as assistantUrlTransform, Nr as availableAttachmentSources, Ee as base64ToBytes, ge as browserSpeechEngine, O as buildAssistantSandboxEnv, Yn as buildAttachmentPromptBlock, ht as buildContinuedFromVoiceNote, Z as buildProgress, Xn as buildPromptParts, k as buildPromptRequestBody, Zn as buildPromptWithAttachments, De as buildRequest, a as buildSandboxContextInput, gt as buildVoiceTranscriptMarkdown, le as chatTurns, A as checkAssistantAiCredits, Ct as chunkForSpeech, Qn as classifyAttachment, Oe as classifyHttpFailure, t as classifyQuotaError, xn as columnLetterToIndex, Pe as configureSpeechEngine, wt as containsCjk, Or as copyToClipboard, $n as countInlineImageCandidates, er as countInlinedImageParts, j as createAssistantSandbox, M as createAssistantSession, Me as createHostedTtsEngine, Ir as createReadinessTracker, Ne as createRoutingSpeechEngine, se as createSandboxAssistantTransport, Fe as createSpeechEngines, ke as decodeAudioResponse, Sn as decodeXmlEntities, n as describeQuotaError, tr as detectDocumentFormat, on as detectScriptLocale, Pr as deviceHasCamera, ki as dispatchAssistantQuotaExhausted, Cn as docxXmlToText, N as downloadAssistantArtifact, hi as downloadFile, nr as estimateTurnBodyBytes, o as executeSandboxGraphQL, gi as exportConversation, P as extendAssistantSandboxTTL, Mi as extractDocumentText, Vt as findAssistantLanguage, F as findExistingSandbox, Gt as findPendingWrite, wn as fitPdfPages, rr as formatBytes, Tn as formatPageRanges, kr as getActorId, I as getAssistantArtifacts, Q as getAssistantMedia, L as getAssistantMessages, R as getAssistantSession, z as getAssistantStreamAccess, $ as getAssistantText, ir as getAttachmentSendBlocker, S as getCapability, ar as getExtension, _ as getImageForMode, v as getImageTagForMode, Ar as getOrganizationId, ee as getRawMessageCreatedAt, y as getResourcesForMode, b as getSandboxImageRegistry, or as getSendableAttachments, Ie as getSpeechEngine, te as getToolProgress, jr as getWorkspaceId, ue as groupBySession, de as groupConsecutiveBySession, sr as hasAttachmentWorkInFlight, ye as hostedLocaleFor, be as hostedSupportsLanguage, Br as imageHostLabel, Xe as isCapturing, Ze as isEcho, En as isMostlyImagePages, Ei as isMultimodalBodyRejection, Fi as isProdRuntime, r as isQuotaExhaustedError, ne as isReapedSandboxConnectionError, Lr as isRecentlyVerified, re as isRecoverable, Di as isRecoverableAssistantError, Vr as isRemoteImageSrc, ln as isSpeakingMessage, at as isSpeechBlocked, yr as isStageCopy, Qe as isSubmittable, pr as isTurnInFlight, C as isUnknownFieldError, fe as isVoiceTurn, Dn as joinSheets, ot as languageDisplayName, ie as mapSessionToHistory, w as markSupported, T as markUnsupported, ae as mergeMessagesById, ze as micIsInterrupt, B as modeRequiresConfirmWrites, ni as nextModeIndex, st as normalizeLangTag, Ai as notifyAiCreditsUpdated, $e as orbMode, On as pageMarker, Kt as parseConfirmationRefusal, cr as parseDataUrl, kn as parseSharedStrings, wr as parseToolActivity, An as parseWorkbookSheets, jn as pdfTextItemsToPage, mr as planAbandonedTurn, et as planReplyConsumption, hr as planTurnAbort, Lt as pollDelayMs, ct as primaryLanguageSubtag, un as publishedChunks, i as quotaExhaustedEventName, Le as readSpeechEngineConfig, V as releaseSupersededAssistantSandboxes, Ut as replyFollowsInput, H as reportAssistantAiTokenUsage, dn as requiresCancel, Re as resetSpeechEngine, Ht as resolveAssistantLanguage, Wt as resolveLanguagePair, Jt as resolveModeConfig, x as resolveSandboxAssistantMode, sn as resolveSpeechLocale, oe as sanitize, U as selectExistingAssistantSandbox, W as selectSupersededAssistantSandboxes, lt as selectVoiceForLocale, G as sendAssistantPromptAsync, K as sendHeartbeat, Mn as sheetXmlToRows, Ae as shouldDisableEngine, jt as showPreviousChunk, Be as showsAssistantCaption, Ve as showsUserCaption, Tt as speakableEmail, ut as speechGate, an as speechLabelsFor, dt as speechLangForLocale, fn as speechPlaybackReducer, je as splitForVendor, Et as splitTableRow, tt as spokenSoFar, br as stageText, xr as statusStageCopy, q as stopReapedAssistantSandbox, Nn as summarisePageText, Sr as thinkingPhrase, Rt as toCaptionText, lr as toMessageAttachment, Dt as toSpeakableText, ur as truncateForInline, Pn as truncatePagesForInline, wi as useAssistantApiAccess, Ni as useAssistantAttachments, Ii as useAssistantHeartbeat, tn as useAssistantI18nNamespace, Li as useAssistantKeyboardShortcuts, Yt as useAssistantPageLabel, Xt as useAssistantProduct, Zt as useAssistantProductOrNull, Er as useAssistantSpeech, Qt as useAssistantStorageFolders, fr as useAssistantStore, nn as useAssistantTr, Ti as useConversationTurns, ce as useSandboxAssistantTransport, e as useVoiceInput, Dr as useVoiceSession, ji as useWorkspaceWriteAccess, dr as validateFile, ft as voiceAvailability, pe as voiceMarker, kt as voicePreviewText, pt as voiceQualityRank, me as voiceSessionIdOf, nt as voiceSessionReducer, He as voiceStageState, _t as voiceTranscriptFilename, he as voiceTurnsOnly, mt as voicesForLocale, J as waitForAssistantServiceReady, Y as waitForSandboxRunning, Ue as waveformIsActive, We as waveformIsSettled };
51
+ import { AssistantMarkdownRenderer as Hr, AssistantNavigateProvider as Ur, assistantRoutePath as Wr, assistantUrlTransform as Gr, classifyAssistantHref as Kr, useAssistantNavigate as qr } from "./shared/assistant/ui/AssistantMarkdownRenderer.js";
52
+ import { AssistantMessageAttachments as Jr } from "./shared/assistant/ui/AssistantMessageAttachments.js";
53
+ import { AssistantPendingWriteCard as Yr } from "./shared/assistant/ui/AssistantPendingWriteCard.js";
54
+ import { AssistantLanguageMenu as Xr } from "./shared/assistant/ui/AssistantLanguageMenu.js";
55
+ import { AssistantReplyLanguageSelector as Zr } from "./shared/assistant/ui/AssistantReplyLanguageSelector.js";
56
+ import { AssistantSpeakButton as Qr } from "./shared/assistant/ui/AssistantSpeakButton.js";
57
+ import { AssistantSpokenTurnsNotice as $r } from "./shared/assistant/ui/AssistantSpokenTurnsNotice.js";
58
+ import { AssistantAttachmentButton as ei } from "./shared/assistant/ui/composer/AssistantAttachmentButton.js";
59
+ import { AssistantAttachmentChips as ti } from "./shared/assistant/ui/composer/AssistantAttachmentChips.js";
60
+ import { AssistantLanguageSelector as ni, FOLLOW_APP_LOCALE as ri } from "./shared/assistant/ui/composer/AssistantLanguageSelector.js";
61
+ import { ASSISTANT_MODE_META as ii, AssistantModeSelector as ai, nextModeIndex as oi } from "./shared/assistant/ui/composer/AssistantModeSelector.js";
62
+ import { AssistantVoiceButton as si } from "./shared/assistant/ui/composer/AssistantVoiceButton.js";
63
+ import { AUTO_VOICE as ci, AssistantVoiceSelector as li } from "./shared/assistant/ui/composer/AssistantVoiceSelector.js";
64
+ import { AssistantVoiceOrb as ui } from "./shared/assistant/ui/voice/AssistantVoiceOrb.js";
65
+ import { AssistantVoiceSessionButton as di } from "./shared/assistant/ui/voice/AssistantVoiceSessionButton.js";
66
+ import { CAPTION_SCROLL_ATTR as fi, VoiceCaption as pi } from "./shared/assistant/ui/voice/VoiceCaption.js";
67
+ import { VoiceConversationView as mi } from "./shared/assistant/ui/voice/VoiceConversationView.js";
68
+ import { VoiceWaveform as hi } from "./shared/assistant/ui/voice/VoiceWaveform.js";
69
+ import { VoiceMiniController as gi } from "./shared/assistant/ui/voice/VoiceMiniController.js";
70
+ import { VoiceStage as _i } from "./shared/assistant/ui/voice/VoiceStage.js";
71
+ import { VoiceTranscriptDrawer as vi } from "./shared/assistant/ui/voice/VoiceTranscriptDrawer.js";
72
+ import { downloadFile as yi, exportConversation as bi } from "./shared/assistant/exportConversation.js";
73
+ import { AssistantMoreMenu as xi } from "./shared/assistant/ui/AssistantMoreMenu.js";
74
+ import { AssistantHeader as Si } from "./shared/assistant/ui/AssistantHeader.js";
75
+ import { AssistantConversationList as Ci } from "./shared/assistant/ui/AssistantConversationList.js";
76
+ import { AssistantEmptyState as wi } from "./shared/assistant/ui/AssistantEmptyState.js";
77
+ import { AssistantMessageItem as Ti } from "./shared/assistant/ui/AssistantMessageItem.js";
78
+ import { AssistantMessageList as Ei } from "./shared/assistant/ui/AssistantMessageList.js";
79
+ import { AssistantVoiceSession as Di } from "./shared/assistant/ui/voice/AssistantVoiceSession.js";
80
+ import { useAssistantApiAccess as Oi } from "./shared/assistant/useAssistantApiAccess.js";
81
+ import { useConversationTurns as ki } from "./shared/assistant/useConversationTurns.js";
82
+ import { isMultimodalBodyRejection as Ai, isRecoverableAssistantError as ji } from "./shared/assistant/transportErrors.js";
83
+ import { aiCreditsUpdatedEventName as Mi, dispatchAssistantQuotaExhausted as Ni, notifyAiCreditsUpdated as Pi } from "./shared/assistant/aiCredits.js";
84
+ import { useWorkspaceWriteAccess as Fi } from "./shared/assistant/useWorkspaceWriteAccess.js";
85
+ import { extractDocumentText as Ii } from "./shared/assistant/documentExtract.js";
86
+ import { useAssistantAttachments as Li } from "./shared/assistant/useAssistantAttachments.js";
87
+ import { AssistantComposer as Ri } from "./shared/assistant/ui/composer/AssistantComposer.js";
88
+ import { isProdRuntime as zi } from "./shared/assistant/env.js";
89
+ import { useAssistantHeartbeat as Bi } from "./shared/assistant/useAssistantHeartbeat.js";
90
+ import { useAssistantKeyboardShortcuts as Vi } from "./shared/assistant/useAssistantKeyboardShortcuts.js";
91
+ import { AssistantApiCallsConsentDialog as Hi } from "./shared/assistant/ui/AssistantApiCallsConsentDialog.js";
92
+ import { AssistantChatArea as Ui } from "./shared/assistant/ui/AssistantChatArea.js";
93
+ import { AIAssistantPanel as Wi } from "./shared/assistant/ui/AIAssistantPanel.js";
94
+ export { Wi as AIAssistantPanel, g as ASSISTANT_API_AUTH_STRATEGY, zt as ASSISTANT_LANGUAGES, ii as ASSISTANT_MODE_META, Fn as ATTACHMENT_ACCEPT, Mr as ATTACHMENT_SOURCES, ci as AUTO_VOICE, Hi as AssistantApiCallsConsentDialog, ei as AssistantAttachmentButton, ti as AssistantAttachmentChips, Rr as AssistantAutoSpeakToggle, Ui as AssistantChatArea, Ri as AssistantComposer, Ci as AssistantConversationList, wi as AssistantEmptyState, Si as AssistantHeader, $t as AssistantI18nProvider, Xr as AssistantLanguageMenu, ni as AssistantLanguageSelector, zr as AssistantMarkdownImage, Hr as AssistantMarkdownRenderer, Jr as AssistantMessageAttachments, Ti as AssistantMessageItem, Ei as AssistantMessageList, ai as AssistantModeSelector, xi as AssistantMoreMenu, Ur as AssistantNavigateProvider, Yr as AssistantPendingWriteCard, qt as AssistantProductProvider, Zr as AssistantReplyLanguageSelector, X as AssistantRuntimeManager, Qr as AssistantSpeakButton, Tr as AssistantSpeechProvider, $r as AssistantSpokenTurnsNotice, Cr as AssistantToolActivity, si as AssistantVoiceButton, ui as AssistantVoiceOrb, li as AssistantVoiceSelector, Di as AssistantVoiceSession, di as AssistantVoiceSessionButton, In as AttachmentRejectedError, hn as BOILERPLATE_PAGE_SHARE, fi as CAPTION_SCROLL_ATTR, s as CHECK_AI_CREDITS, c as CREATE_SANDBOX, vt as DEFAULT_SPEAKABLE_LABELS, Bt as DEFAULT_SPEECH_RATE, Ge as ENDPOINT_GRACE_MS, l as EXTEND_SANDBOX_TTL, ri as FOLLOW_APP_LOCALE, u as GET_ACTIVE_SANDBOXES, d as GET_SANDBOX, xe as HOSTED_TTS_MAX_CHARS, _e as HOSTED_TTS_TIER, ve as HOSTED_VOICES, cn as IDLE_PLAYBACK, Ke as INITIAL_SESSION, Ln as INLINE_IMAGE_MAX_DIM, Rn as INLINE_IMAGE_QUALITY, qe as INTERRUPT_MAX_MS, Je as INTERRUPT_MIN_MS, zn as MAX_ATTACHMENTS, gn as MAX_BOILERPLATE_LINE_CHARS, _n as MAX_EXTRACTED_CHARS, Bn as MAX_FILE_BYTES, Vn as MAX_INLINE_CHARS_PER_FILE, Hn as MAX_INLINE_CHARS_TOTAL, pn as MAX_INLINE_IMAGE_BASE64_BYTES, Un as MAX_INLINE_IMAGE_BASE64_CHARS, Wn as MAX_INLINE_IMAGE_PARTS, Gn as MAX_INLINE_TURN_BODY_BYTES, vn as MAX_PDF_PAGES_SCANNED, mn as MAX_REQUEST_BODY_BYTES, yt as MAX_SPEAKABLE_CHARS, bt as MAX_SPOKEN_TABLE_ROWS, Kn as MAX_TURN_BODY_BYTES, At as MINI_CAPTION_BUDGET, yn as MIN_PAGE_TEXT_CHARS, bn as MIN_TEXT_PAGE_SHARE, gr as PHRASE_ROTATE_MS, Mt as POLL_FAST_MS, Nt as POLL_FAST_UNTIL_MS, Pt as POLL_SLOW_MS, Ft as POLL_STEADY_MS, It as POLL_STEADY_UNTIL_MS, Ot as PREVIEW_LANGUAGES, qn as PROMPT_ENVELOPE_RESERVE_BYTES, f as PROXY_SANDBOX_REQUEST, p as REPORT_AI_TOKEN_USAGE, Fr as SANDBOX_READY_TTL_MS, Ye as SILENCE_SUBMIT_MS, Se as SPEAKING_RATE_MAX, Ce as SPEAKING_RATE_MAX_STREAMING, we as SPEAKING_RATE_MAX_SYNC, Te as SPEAKING_RATE_MIN, xt as SPEECH_CHUNK_CHARS, St as SPEECH_CHUNK_CJK_CHARS, rt as SPEECH_LANG, rn as SPOKEN_LABEL_LANGUAGES, _r as STAGE_COPY, m as STOP_ASSISTANT_SANDBOX, vr as THINKING_PHRASES, Jn as TURN_BODY_HEADROOM_BYTES, it as VOICE_LIST_TIMEOUT_MS, pi as VoiceCaption, mi as VoiceConversationView, gi as VoiceMiniController, _i as VoiceStage, vi as VoiceTranscriptDrawer, hi as VoiceWaveform, h as WAIT_FOR_SANDBOX_RUNNING, E as abortAssistantTurn, Mi as aiCreditsUpdatedEventName, D as approvePendingWrite, Wr as assistantRoutePath, en as assistantTranslationKey, Gr as assistantUrlTransform, Nr as availableAttachmentSources, Ee as base64ToBytes, ge as browserSpeechEngine, O as buildAssistantSandboxEnv, Yn as buildAttachmentPromptBlock, ht as buildContinuedFromVoiceNote, Z as buildProgress, Xn as buildPromptParts, k as buildPromptRequestBody, Zn as buildPromptWithAttachments, De as buildRequest, a as buildSandboxContextInput, gt as buildVoiceTranscriptMarkdown, le as chatTurns, A as checkAssistantAiCredits, Ct as chunkForSpeech, Kr as classifyAssistantHref, Qn as classifyAttachment, Oe as classifyHttpFailure, t as classifyQuotaError, xn as columnLetterToIndex, Pe as configureSpeechEngine, wt as containsCjk, Or as copyToClipboard, $n as countInlineImageCandidates, er as countInlinedImageParts, j as createAssistantSandbox, M as createAssistantSession, Me as createHostedTtsEngine, Ir as createReadinessTracker, Ne as createRoutingSpeechEngine, se as createSandboxAssistantTransport, Fe as createSpeechEngines, ke as decodeAudioResponse, Sn as decodeXmlEntities, n as describeQuotaError, tr as detectDocumentFormat, on as detectScriptLocale, Pr as deviceHasCamera, Ni as dispatchAssistantQuotaExhausted, Cn as docxXmlToText, N as downloadAssistantArtifact, yi as downloadFile, nr as estimateTurnBodyBytes, o as executeSandboxGraphQL, bi as exportConversation, P as extendAssistantSandboxTTL, Ii as extractDocumentText, Vt as findAssistantLanguage, F as findExistingSandbox, Gt as findPendingWrite, wn as fitPdfPages, rr as formatBytes, Tn as formatPageRanges, kr as getActorId, I as getAssistantArtifacts, Q as getAssistantMedia, L as getAssistantMessages, R as getAssistantSession, z as getAssistantStreamAccess, $ as getAssistantText, ir as getAttachmentSendBlocker, S as getCapability, ar as getExtension, _ as getImageForMode, v as getImageTagForMode, Ar as getOrganizationId, ee as getRawMessageCreatedAt, y as getResourcesForMode, b as getSandboxImageRegistry, or as getSendableAttachments, Ie as getSpeechEngine, te as getToolProgress, jr as getWorkspaceId, ue as groupBySession, de as groupConsecutiveBySession, sr as hasAttachmentWorkInFlight, ye as hostedLocaleFor, be as hostedSupportsLanguage, Br as imageHostLabel, Xe as isCapturing, Ze as isEcho, En as isMostlyImagePages, Ai as isMultimodalBodyRejection, zi as isProdRuntime, r as isQuotaExhaustedError, ne as isReapedSandboxConnectionError, Lr as isRecentlyVerified, re as isRecoverable, ji as isRecoverableAssistantError, Vr as isRemoteImageSrc, ln as isSpeakingMessage, at as isSpeechBlocked, yr as isStageCopy, Qe as isSubmittable, pr as isTurnInFlight, C as isUnknownFieldError, fe as isVoiceTurn, Dn as joinSheets, ot as languageDisplayName, ie as mapSessionToHistory, w as markSupported, T as markUnsupported, ae as mergeMessagesById, ze as micIsInterrupt, B as modeRequiresConfirmWrites, oi as nextModeIndex, st as normalizeLangTag, Pi as notifyAiCreditsUpdated, $e as orbMode, On as pageMarker, Kt as parseConfirmationRefusal, cr as parseDataUrl, kn as parseSharedStrings, wr as parseToolActivity, An as parseWorkbookSheets, jn as pdfTextItemsToPage, mr as planAbandonedTurn, et as planReplyConsumption, hr as planTurnAbort, Lt as pollDelayMs, ct as primaryLanguageSubtag, un as publishedChunks, i as quotaExhaustedEventName, Le as readSpeechEngineConfig, V as releaseSupersededAssistantSandboxes, Ut as replyFollowsInput, H as reportAssistantAiTokenUsage, dn as requiresCancel, Re as resetSpeechEngine, Ht as resolveAssistantLanguage, Wt as resolveLanguagePair, Jt as resolveModeConfig, x as resolveSandboxAssistantMode, sn as resolveSpeechLocale, oe as sanitize, U as selectExistingAssistantSandbox, W as selectSupersededAssistantSandboxes, lt as selectVoiceForLocale, G as sendAssistantPromptAsync, K as sendHeartbeat, Mn as sheetXmlToRows, Ae as shouldDisableEngine, jt as showPreviousChunk, Be as showsAssistantCaption, Ve as showsUserCaption, Tt as speakableEmail, ut as speechGate, an as speechLabelsFor, dt as speechLangForLocale, fn as speechPlaybackReducer, je as splitForVendor, Et as splitTableRow, tt as spokenSoFar, br as stageText, xr as statusStageCopy, q as stopReapedAssistantSandbox, Nn as summarisePageText, Sr as thinkingPhrase, Rt as toCaptionText, lr as toMessageAttachment, Dt as toSpeakableText, ur as truncateForInline, Pn as truncatePagesForInline, Oi as useAssistantApiAccess, Li as useAssistantAttachments, Bi as useAssistantHeartbeat, tn as useAssistantI18nNamespace, Vi as useAssistantKeyboardShortcuts, qr as useAssistantNavigate, Yt as useAssistantPageLabel, Xt as useAssistantProduct, Zt as useAssistantProductOrNull, Er as useAssistantSpeech, Qt as useAssistantStorageFolders, fr as useAssistantStore, nn as useAssistantTr, ki as useConversationTurns, ce as useSandboxAssistantTransport, e as useVoiceInput, Dr as useVoiceSession, Fi as useWorkspaceWriteAccess, dr as validateFile, ft as voiceAvailability, pe as voiceMarker, kt as voicePreviewText, pt as voiceQualityRank, me as voiceSessionIdOf, nt as voiceSessionReducer, He as voiceStageState, _t as voiceTranscriptFilename, he as voiceTurnsOnly, mt as voicesForLocale, J as waitForAssistantServiceReady, Y as waitForSandboxRunning, Ue as waveformIsActive, We as waveformIsSettled };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/fe-libs",
3
- "version": "2026.910.1",
3
+ "version": "2026.910.3",
4
4
  "description": "Burdenoff frontend primitives and domain libraries",
5
5
  "type": "module",
6
6
  "bin": {