@burdenoff/fe-libs 2026.920.1 → 2026.920.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/shared/assistant/api.d.ts +17 -0
  2. package/dist/shared/assistant/api.d.ts.map +1 -1
  3. package/dist/shared/assistant/api.js +88 -66
  4. package/dist/shared/assistant/attachmentTurn.d.ts +21 -0
  5. package/dist/shared/assistant/attachmentTurn.d.ts.map +1 -0
  6. package/dist/shared/assistant/attachmentTurn.js +48 -0
  7. package/dist/shared/assistant/attachments.d.ts +85 -6
  8. package/dist/shared/assistant/attachments.d.ts.map +1 -1
  9. package/dist/shared/assistant/attachments.js +165 -112
  10. package/dist/shared/assistant/conversation.d.ts +21 -0
  11. package/dist/shared/assistant/conversation.d.ts.map +1 -1
  12. package/dist/shared/assistant/documentExtract.d.ts +11 -2
  13. package/dist/shared/assistant/documentExtract.d.ts.map +1 -1
  14. package/dist/shared/assistant/documentExtract.js +39 -37
  15. package/dist/shared/assistant/gatewayLimits.d.ts +10 -0
  16. package/dist/shared/assistant/gatewayLimits.d.ts.map +1 -1
  17. package/dist/shared/assistant/gatewayLimits.js +2 -2
  18. package/dist/shared/assistant/index.d.ts +3 -0
  19. package/dist/shared/assistant/index.d.ts.map +1 -1
  20. package/dist/shared/assistant/preview/bridgeHost.d.ts +26 -0
  21. package/dist/shared/assistant/preview/bridgeHost.d.ts.map +1 -0
  22. package/dist/shared/assistant/preview/bridgeHost.js +16 -0
  23. package/dist/shared/assistant/preview/bridgeHostContext.d.ts +17 -0
  24. package/dist/shared/assistant/preview/bridgeHostContext.d.ts.map +1 -0
  25. package/dist/shared/assistant/preview/bridgeHostContext.js +11 -0
  26. package/dist/shared/assistant/preview/useAssistantPreviewBridge.d.ts.map +1 -1
  27. package/dist/shared/assistant/ui/AIAssistantPanel.d.ts +4 -0
  28. package/dist/shared/assistant/ui/AIAssistantPanel.d.ts.map +1 -1
  29. package/dist/shared/assistant/ui/AIAssistantPanel.js +63 -62
  30. package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
  31. package/dist/shared/assistant/ui/AssistantChatArea.js +342 -325
  32. package/dist/shared/assistant/ui/AssistantOverlay.d.ts +6 -0
  33. package/dist/shared/assistant/ui/AssistantOverlay.d.ts.map +1 -1
  34. package/dist/shared/assistant/ui/AssistantOverlay.js +93 -89
  35. package/dist/shared/assistant/ui/composer/AssistantComposer.d.ts +12 -0
  36. package/dist/shared/assistant/ui/composer/AssistantComposer.d.ts.map +1 -1
  37. package/dist/shared/assistant/ui/composer/AssistantComposer.js +57 -57
  38. package/dist/shared/assistant/useAssistantAttachments.d.ts +12 -1
  39. package/dist/shared/assistant/useAssistantAttachments.d.ts.map +1 -1
  40. package/dist/shared/assistant/useAssistantAttachments.js +98 -98
  41. package/dist/shared-assistant.js +118 -115
  42. package/package.json +1 -1
@@ -21,107 +21,109 @@ async function f() {
21
21
  let [e, t] = await Promise.all([import("../../node_modules/pdfjs-dist/build/pdf.js"), import("../../node_modules/pdfjs-dist/build/pdf.worker.min.js")]);
22
22
  return globalThis.pdfjsWorker = t, e;
23
23
  }
24
- async function p(e) {
25
- let t = (await f()).getDocument({
24
+ async function p(e, t) {
25
+ let r = (await f()).getDocument({
26
26
  data: e,
27
27
  disableFontFace: !0,
28
28
  useSystemFonts: !1
29
- }), r;
29
+ }), i;
30
30
  try {
31
- r = await t.promise;
31
+ i = await r.promise;
32
32
  } catch (e) {
33
- return await t.destroy().catch(() => void 0), (e instanceof Error ? e.name : "") === "PasswordException" ? { extraction: { status: "encrypted" } } : { extraction: {
33
+ return await r.destroy().catch(() => void 0), (e instanceof Error ? e.name : "") === "PasswordException" ? { extraction: { status: "encrypted" } } : { extraction: {
34
34
  status: "corrupt",
35
35
  detail: d(e)
36
36
  } };
37
37
  }
38
- let i = r.numPages, a = Math.min(i, 100), s = [];
38
+ let a = i.numPages, s = Math.min(a, 100), c = [];
39
39
  try {
40
40
  let e = 0;
41
- for (let t = 1; t <= a; t += 1) {
42
- let n = await r.getPage(t), i = o((await n.getTextContent()).items);
43
- if (n.cleanup(), s.push(i), e += i.length, e >= 2e5) break;
41
+ for (let t = 1; t <= s; t += 1) {
42
+ let n = await i.getPage(t), r = o((await n.getTextContent()).items);
43
+ if (n.cleanup(), c.push(r), e += r.length, e >= 2e5) break;
44
44
  }
45
45
  } catch (e) {
46
- if (s.length === 0) return { extraction: {
46
+ if (c.length === 0) return { extraction: {
47
47
  status: "corrupt",
48
48
  detail: d(e)
49
49
  } };
50
50
  } finally {
51
- await t.destroy().catch(() => void 0);
51
+ await r.destroy().catch(() => void 0);
52
52
  }
53
- return n(s, i, a, c);
53
+ return n(c, a, c.length, t);
54
54
  }
55
55
  async function m(e, t) {
56
56
  let { unzipSync: n, strFromU8: r } = await import("../../node_modules/fflate/esm/browser.js"), i = n(e, { filter: (e) => t(e.name) }), a = {};
57
57
  for (let [e, t] of Object.entries(i)) a[e] = r(t);
58
58
  return a;
59
59
  }
60
- async function h(n) {
60
+ async function h(n, r) {
61
61
  if (u(n)) return { extraction: {
62
62
  status: "corrupt",
63
63
  detail: "not an Office Open XML file — an OLE container, i.e. password-protected or a legacy .doc"
64
64
  } };
65
- let r;
65
+ let i;
66
66
  try {
67
- r = await m(n, (e) => e === "word/document.xml");
67
+ i = await m(n, (e) => e === "word/document.xml");
68
68
  } catch (e) {
69
69
  return { extraction: {
70
70
  status: "corrupt",
71
71
  detail: d(e)
72
72
  } };
73
73
  }
74
- let i = r["word/document.xml"];
75
- return i ? _(t(i).slice(0, e)) : { extraction: {
74
+ let a = i["word/document.xml"];
75
+ if (!a) return { extraction: {
76
76
  status: "corrupt",
77
77
  detail: "no word/document.xml inside the file"
78
78
  } };
79
+ let o = t(a);
80
+ return _(o.slice(0, e), r, o.length);
79
81
  }
80
- async function g(t) {
82
+ async function g(t, n) {
81
83
  if (u(t)) return { extraction: {
82
84
  status: "corrupt",
83
85
  detail: "not an Office Open XML file — an OLE container, i.e. password-protected or a legacy .xls"
84
86
  } };
85
- let n;
87
+ let o;
86
88
  try {
87
- n = await m(t, (e) => e === "xl/workbook.xml" || e === "xl/_rels/workbook.xml.rels" || e === "xl/sharedStrings.xml" || e.startsWith("xl/worksheets/"));
89
+ o = await m(t, (e) => e === "xl/workbook.xml" || e === "xl/_rels/workbook.xml.rels" || e === "xl/sharedStrings.xml" || e.startsWith("xl/worksheets/"));
88
90
  } catch (e) {
89
91
  return { extraction: {
90
92
  status: "corrupt",
91
93
  detail: d(e)
92
94
  } };
93
95
  }
94
- let o = n["xl/workbook.xml"];
95
- if (!o) return { extraction: {
96
+ let c = o["xl/workbook.xml"];
97
+ if (!c) return { extraction: {
96
98
  status: "corrupt",
97
99
  detail: "no xl/workbook.xml inside the file"
98
100
  } };
99
- let c = i(n["xl/sharedStrings.xml"] ?? ""), l = a(o, n["xl/_rels/workbook.xml.rels"] ?? "").map((e) => ({
101
+ let l = i(o["xl/sharedStrings.xml"] ?? ""), f = a(c, o["xl/_rels/workbook.xml.rels"] ?? "").map((e) => ({
100
102
  name: e.name,
101
- rows: e.path && n[e.path] ? s(n[e.path], c) : []
102
- })), f = _(r(l).slice(0, e)), p = l.filter((e) => e.rows.length > 0).map((e) => e.name);
103
- return p.length > 0 && (f.extraction.sheetNames = p), f;
103
+ rows: e.path && o[e.path] ? s(o[e.path], l) : []
104
+ })), p = r(f), h = _(p.slice(0, e), n, p.length), g = f.filter((e) => e.rows.length > 0).map((e) => e.name);
105
+ return g.length > 0 && (h.extraction.sheetNames = g), h;
104
106
  }
105
- function _(e) {
107
+ function _(e, t, n) {
106
108
  if (e.trim() === "") return { extraction: { status: "no-text" } };
107
- let t = e.length > c, n = e.slice(0, c), r = n.lastIndexOf("\n");
109
+ let r = e.length > t || n > e.length, i = e.slice(0, t), a = i.lastIndexOf("\n");
108
110
  return {
109
111
  extraction: {
110
112
  status: "ok",
111
- sourceChars: e.length
113
+ sourceChars: n
112
114
  },
113
- textContent: t && r > 8e3 * .5 ? n.slice(0, r) : n,
114
- textTruncated: t
115
+ textContent: r && a > t * .5 ? i.slice(0, a) : i,
116
+ textTruncated: r
115
117
  };
116
118
  }
117
- async function v(e, t) {
118
- let n = await y(e, t);
119
- return n.extraction.format = t, n;
119
+ async function v(e, t, n = c) {
120
+ let r = await y(e, t, n);
121
+ return r.extraction.format = t, r;
120
122
  }
121
- async function y(e, t) {
123
+ async function y(e, t, n) {
122
124
  try {
123
- let n = new Uint8Array(await e.arrayBuffer());
124
- return t === "pdf" ? await p(n) : t === "docx" ? await h(n) : await g(n);
125
+ let r = new Uint8Array(await e.arrayBuffer());
126
+ return t === "pdf" ? await p(r, n) : t === "docx" ? await h(r, n) : await g(r, n);
125
127
  } catch (e) {
126
128
  return { extraction: {
127
129
  status: "corrupt",
@@ -14,6 +14,16 @@
14
14
  * Anything that POSTs base64 from the browser has to be sized against this.
15
15
  */
16
16
  export declare const MAX_REQUEST_BODY_BYTES = 262144;
17
+ /**
18
+ * What the person is told when a turn cannot be made to fit.
19
+ *
20
+ * ★ Shared by the planner that sizes a turn and by the dispatch belt in
21
+ * `api.ts`, because they are the same refusal seen from two places and must not
22
+ * drift into two different sentences. It names the two things the person can
23
+ * actually do — the gateway's own 413 reaches `graphqlFetch` as "The request
24
+ * could not be processed. Please refresh and try again.", which names neither.
25
+ */
26
+ export declare const REQUEST_TOO_LARGE_REFUSAL = "This message is too large to send. Shorten it or send fewer attachments.";
17
27
  /**
18
28
  * What is left for a base64 image once the rest of a GraphQL request is paid
19
29
  * for: the query document, operation name, variables, and the workspace/org
@@ -1 +1 @@
1
- {"version":3,"file":"gatewayLimits.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/gatewayLimits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,sBAAsB,SAAU,CAAC;AAE9C;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B,QAAkC,CAAC"}
1
+ {"version":3,"file":"gatewayLimits.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/gatewayLimits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,sBAAsB,SAAU,CAAC;AAE9C;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,6EACsC,CAAC;AAE7E;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B,QAAkC,CAAC"}
@@ -1,4 +1,4 @@
1
1
  //#region src/shared/assistant/gatewayLimits.ts
2
- var e = 262144, t = e - 32768;
2
+ var e = 262144, t = "This message is too large to send. Shorten it or send fewer attachments.", n = e - 32768;
3
3
  //#endregion
4
- export { t as MAX_INLINE_IMAGE_BASE64_BYTES, e as MAX_REQUEST_BODY_BYTES };
4
+ export { n as MAX_INLINE_IMAGE_BASE64_BYTES, e as MAX_REQUEST_BODY_BYTES, t as REQUEST_TOO_LARGE_REFUSAL };
@@ -69,6 +69,7 @@ export * from './modeCopy';
69
69
  export * from './modeIds';
70
70
  export * from './modeCapabilities';
71
71
  export * from './adminModeSendGate';
72
+ export * from './attachmentTurn';
72
73
  export * from './writeModeConsent';
73
74
  export * from './voice/speechLabels';
74
75
  export * from './voice/replyLanguage';
@@ -119,6 +120,8 @@ export * from './ui/useDropdownEscape';
119
120
  export * from './ui/useOverlayFocus';
120
121
  export * from './ui/usePrefersReducedMotion';
121
122
  export * from './preview/useAssistantPreviewBridge';
123
+ export * from './preview/bridgeHost';
124
+ export * from './preview/bridgeHostContext';
122
125
  export * from './preview/AssistantPreviewOverlay';
123
126
  export * from './ui/composer/AssistantLanguageSelector';
124
127
  export * from './ui/composer/AssistantModeSelector';
@@ -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,26 @@
1
+ import { FC, ReactNode } from 'react';
2
+ import { AssistantPreviewController } from './types';
3
+ export interface AssistantPreviewBridgeHostProps {
4
+ /**
5
+ * The product's preview controller — the SAME object passed to the panel as
6
+ * `preview`, or the panel runs a second bridge. Keep it stable across renders
7
+ * (see `AssistantPreviewController`). Absent: nothing is bridged here.
8
+ */
9
+ preview?: AssistantPreviewController | null;
10
+ children?: ReactNode;
11
+ }
12
+ /**
13
+ * Run the preview bridge for `preview` for as long as THIS is mounted, and tell
14
+ * any panel below that it need not run one.
15
+ *
16
+ * `AssistantOverlay` mounts one for `panelProps.preview`, so a product that
17
+ * passes its controller that way gets a preview that keeps following a run
18
+ * after the assistant is closed. A host that mounts the panel itself can do the
19
+ * same by wrapping the place the panel comes and goes in this.
20
+ *
21
+ * ★ Unmounting THIS is still an ending: a run in flight gets `end(abandoned)`,
22
+ * as it did when the panel unmounted — the host has gone, and with it the only
23
+ * thing following the run.
24
+ */
25
+ export declare const AssistantPreviewBridgeHost: FC<AssistantPreviewBridgeHostProps>;
26
+ //# sourceMappingURL=bridgeHost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridgeHost.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/preview/bridgeHost.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAG3C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAiB1D,MAAM,WAAW,+BAA+B;IAC9C;;;;OAIG;IACH,OAAO,CAAC,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,0BAA0B,EAAE,EAAE,CAAC,+BAA+B,CAW1E,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { useAssistantPreviewBridge as e } from "./useAssistantPreviewBridge.js";
2
+ import { HostedPreviewBridgeContext as t } from "./bridgeHostContext.js";
3
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
+ //#region src/shared/assistant/preview/bridgeHost.tsx
5
+ function i({ controller: t }) {
6
+ return e(t), null;
7
+ }
8
+ var a = ({ preview: e, children: a }) => {
9
+ let o = e ?? null;
10
+ return /* @__PURE__ */ r(t.Provider, {
11
+ value: o,
12
+ children: [/* @__PURE__ */ n(i, { controller: o }), a]
13
+ });
14
+ };
15
+ //#endregion
16
+ export { a as AssistantPreviewBridgeHost };
@@ -0,0 +1,17 @@
1
+ import { AssistantPreviewController } from './types';
2
+ /** The controller an `AssistantPreviewBridgeHost` above bridges, or null. */
3
+ export declare const HostedPreviewBridgeContext: import('react').Context<AssistantPreviewController | null>;
4
+ /**
5
+ * The controller an ancestor already runs the bridge for, or null when none
6
+ * does.
7
+ */
8
+ export declare function useHostedAssistantPreviewBridge(): AssistantPreviewController | null;
9
+ /**
10
+ * The controller the PANEL should run its own bridge for: its `preview`, unless
11
+ * a host above it already runs the bridge for that very controller.
12
+ *
13
+ * ★ Identity, not presence. A host bridging controller A says nothing about a
14
+ * panel handed controller B; B still needs a bridge, and only the panel has it.
15
+ */
16
+ export declare function panelOwnedPreviewBridge(preview: AssistantPreviewController | null | undefined, hosted: AssistantPreviewController | null): AssistantPreviewController | null;
17
+ //# sourceMappingURL=bridgeHostContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridgeHostContext.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/preview/bridgeHostContext.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAE1D,6EAA6E;AAC7E,eAAO,MAAM,0BAA0B,4DACiB,CAAC;AAEzD;;;GAGG;AACH,wBAAgB,+BAA+B,IAAI,0BAA0B,GAAG,IAAI,CAEnF;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,0BAA0B,GAAG,IAAI,GAAG,SAAS,EACtD,MAAM,EAAE,0BAA0B,GAAG,IAAI,GACxC,0BAA0B,GAAG,IAAI,CAGnC"}
@@ -0,0 +1,11 @@
1
+ import { createContext as e, useContext as t } from "react";
2
+ //#region src/shared/assistant/preview/bridgeHostContext.ts
3
+ var n = e(null);
4
+ function r() {
5
+ return t(n);
6
+ }
7
+ function i(e, t) {
8
+ return e ? e === t ? null : e : null;
9
+ }
10
+ //#endregion
11
+ export { n as HostedPreviewBridgeContext, i as panelOwnedPreviewBridge, r as useHostedAssistantPreviewBridge };
@@ -1 +1 @@
1
- {"version":3,"file":"useAssistantPreviewBridge.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/preview/useAssistantPreviewBridge.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,0BAA0B,EAAyB,MAAM,SAAS,CAAC;AA2CjF,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,0BAA0B,GAAG,IAAI,GAC5C,IAAI,CAyMN"}
1
+ {"version":3,"file":"useAssistantPreviewBridge.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/preview/useAssistantPreviewBridge.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,0BAA0B,EAAyB,MAAM,SAAS,CAAC;AA2CjF,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,0BAA0B,GAAG,IAAI,GAC5C,IAAI,CA+MN"}
@@ -41,6 +41,10 @@ export type AIAssistantPanelProps = PanelProps & {
41
41
  *
42
42
  * ★ Absence is the off-switch — no controller, no toggle, no overlay and no
43
43
  * events. There is deliberately no second flag that could disagree with it.
44
+ *
45
+ * ★★ Passed through `AssistantOverlay`'s `panelProps`, its events keep flowing
46
+ * after the panel closes: the overlay runs the bridge, and this panel then
47
+ * runs none for the same controller (BOFF-7367, see `bridgeHost.tsx`).
44
48
  */
45
49
  preview?: AssistantPreviewController;
46
50
  };
@@ -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,EAAY,MAAM,OAAO,CAAC;AAClD,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;AAcrC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAGnE,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;IAC/B;;;;;;;;;OASG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,0BAA0B,CAAC;CACtC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CA0NtD,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,EAAY,MAAM,OAAO,CAAC;AAClD,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;AAkBrC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAGnE,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;IAC/B;;;;;;;;;OASG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,0BAA0B,CAAC;CACtC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CAiOtD,CAAC"}
@@ -7,86 +7,87 @@ import { AssistantConnectSourceProvider as a } from "./composer/connectSource.js
7
7
  import { ASSISTANT_OVERLAY_ATTR as o, ASSISTANT_PANEL_ATTR as s, activePanelOverlay as c, escapeDismisses as l, nextPanelOverlays as u } from "./panelOverlays.js";
8
8
  import { AssistantPreviewProvider as d } from "../preview/context.js";
9
9
  import { useAssistantPreviewBridge as f } from "../preview/useAssistantPreviewBridge.js";
10
- import { AssistantPreviewOverlay as p } from "../preview/AssistantPreviewOverlay.js";
11
- import { AssistantHeader as m } from "./AssistantHeader.js";
12
- import { AssistantConversationList as h } from "./AssistantConversationList.js";
13
- import { useFilesServiceWarmup as g } from "../../../storage/warmFilesService.js";
14
- import { useAssistantHeartbeat as _ } from "../useAssistantHeartbeat.js";
15
- import { useAssistantKeyboardShortcuts as v } from "../useAssistantKeyboardShortcuts.js";
16
- import { AssistantChatArea as y } from "./AssistantChatArea.js";
17
- import { useRef as b, useState as x } from "react";
18
- import { jsx as S, jsxs as C } from "react/jsx-runtime";
10
+ import { panelOwnedPreviewBridge as p, useHostedAssistantPreviewBridge as m } from "../preview/bridgeHostContext.js";
11
+ import { AssistantPreviewOverlay as h } from "../preview/AssistantPreviewOverlay.js";
12
+ import { AssistantHeader as g } from "./AssistantHeader.js";
13
+ import { AssistantConversationList as _ } from "./AssistantConversationList.js";
14
+ import { useFilesServiceWarmup as v } from "../../../storage/warmFilesService.js";
15
+ import { useAssistantHeartbeat as y } from "../useAssistantHeartbeat.js";
16
+ import { useAssistantKeyboardShortcuts as b } from "../useAssistantKeyboardShortcuts.js";
17
+ import { AssistantChatArea as x } from "./AssistantChatArea.js";
18
+ import { useRef as S, useState as C } from "react";
19
+ import { jsx as w, jsxs as T } from "react/jsx-runtime";
19
20
  //#region src/shared/assistant/ui/AIAssistantPanel.tsx
20
- var w = ({ onClose: w, visible: T, docked: E, onToggleDock: D, writeAccess: O, onNavigate: k, connectSourceHref: A, preview: j }) => {
21
- let M = t(), [N, P] = x(!1);
22
- N && !j && P(!1);
23
- let F = N && !!j;
24
- f(j ?? null);
25
- let I = b(null), { conversations: L, activeConversationId: R, conversationListOpen: z, setConversationListOpen: B, createConversation: V } = r(), H = z || F, U = c({
26
- historyOpen: z,
27
- previewOpen: F
28
- }), W = (e) => {
21
+ var E = ({ onClose: E, visible: D, docked: O, onToggleDock: k, writeAccess: A, onNavigate: j, connectSourceHref: M, preview: N }) => {
22
+ let P = t(), [F, I] = C(!1);
23
+ F && !N && I(!1);
24
+ let L = F && !!N;
25
+ f(p(N, m()));
26
+ let R = S(null), { conversations: z, activeConversationId: B, conversationListOpen: V, setConversationListOpen: H, createConversation: U } = r(), W = V || L, G = c({
27
+ historyOpen: V,
28
+ previewOpen: L
29
+ }), K = (e) => {
29
30
  let t = u({
30
- historyOpen: z,
31
- previewOpen: F
31
+ historyOpen: V,
32
+ previewOpen: L
32
33
  }, e);
33
- B(t.historyOpen), P(t.previewOpen);
34
- }, G = L.find((e) => e.id === R);
35
- _(G?.backendSessionId ?? null, G?.mode ?? null, T ?? !0), g(T ?? !0);
36
- let K = e(T !== !1);
37
- return v({
38
- panelRef: I,
34
+ H(t.historyOpen), I(t.previewOpen);
35
+ }, q = z.find((e) => e.id === B);
36
+ y(q?.backendSessionId ?? null, q?.mode ?? null, D ?? !0), v(D ?? !0);
37
+ let J = e(D !== !1);
38
+ return b({
39
+ panelRef: R,
39
40
  onClose: () => {
40
41
  if (l({
41
- historyOpen: z,
42
- previewOpen: F
42
+ historyOpen: V,
43
+ previewOpen: L
43
44
  }) === "overlay") {
44
- B(!1), P(!1);
45
+ H(!1), I(!1);
45
46
  return;
46
47
  }
47
- w();
48
+ E();
48
49
  }
49
- }), /* @__PURE__ */ S(i, {
50
- visible: T ?? !0,
51
- children: /* @__PURE__ */ S(d, {
52
- value: j,
53
- children: /* @__PURE__ */ S(n, {
54
- value: k,
55
- children: /* @__PURE__ */ S(a, {
56
- value: A,
57
- children: /* @__PURE__ */ C("div", {
58
- ref: I,
50
+ }), /* @__PURE__ */ w(i, {
51
+ visible: D ?? !0,
52
+ children: /* @__PURE__ */ w(d, {
53
+ value: N,
54
+ children: /* @__PURE__ */ w(n, {
55
+ value: j,
56
+ children: /* @__PURE__ */ w(a, {
57
+ value: M,
58
+ children: /* @__PURE__ */ T("div", {
59
+ ref: R,
59
60
  className: "relative flex h-full w-full flex-col bg-bg-surface",
60
61
  role: "complementary",
61
- "aria-label": M("panel.ariaLabel", "AI Assistant"),
62
+ "aria-label": P("panel.ariaLabel", "AI Assistant"),
62
63
  "data-testid": "ai-assistant-panel",
63
64
  [s]: "",
64
- ...U ? { [o]: U } : {},
65
+ ...G ? { [o]: G } : {},
65
66
  tabIndex: -1,
66
67
  children: [
67
- /* @__PURE__ */ S("div", {
68
+ /* @__PURE__ */ w("div", {
68
69
  className: "contents",
69
- inert: H || void 0,
70
- children: /* @__PURE__ */ S(m, {
71
- contextLabel: K,
72
- onNewConversation: () => V(),
73
- onOpenHistory: () => W("history"),
74
- historyOpen: z,
75
- onTogglePreview: () => W("preview"),
76
- previewOpen: F,
77
- onClose: w,
78
- docked: E,
79
- onToggleDock: D
70
+ inert: W || void 0,
71
+ children: /* @__PURE__ */ w(g, {
72
+ contextLabel: J,
73
+ onNewConversation: () => U(),
74
+ onOpenHistory: () => K("history"),
75
+ historyOpen: V,
76
+ onTogglePreview: () => K("preview"),
77
+ previewOpen: L,
78
+ onClose: E,
79
+ docked: O,
80
+ onToggleDock: k
80
81
  })
81
82
  }),
82
- z && /* @__PURE__ */ S(h, {}),
83
- F && /* @__PURE__ */ S(p, { onClose: () => P(!1) }),
84
- /* @__PURE__ */ S("div", {
83
+ V && /* @__PURE__ */ w(_, {}),
84
+ L && /* @__PURE__ */ w(h, { onClose: () => I(!1) }),
85
+ /* @__PURE__ */ w("div", {
85
86
  className: "contents",
86
- inert: H || void 0,
87
- children: /* @__PURE__ */ S(y, {
88
- visible: T ?? !0,
89
- writeAccess: O
87
+ inert: W || void 0,
88
+ children: /* @__PURE__ */ w(x, {
89
+ visible: D ?? !0,
90
+ writeAccess: A
90
91
  })
91
92
  })
92
93
  ]
@@ -97,4 +98,4 @@ var w = ({ onClose: w, visible: T, docked: E, onToggleDock: D, writeAccess: O, o
97
98
  });
98
99
  };
99
100
  //#endregion
100
- export { w as AIAssistantPanel };
101
+ export { E as AIAssistantPanel };
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantChatArea.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantChatArea.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,EAAE,EACR,MAAM,OAAO,CAAC;AAyEf,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAyDvE;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,EAAE,oBAAoB,CAAC;CACpC;AAED,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAAC,sBAAsB,CA8sExD,CAAC"}
1
+ {"version":3,"file":"AssistantChatArea.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantChatArea.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,EAAE,EACR,MAAM,OAAO,CAAC;AA2Ef,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAyDvE;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,EAAE,oBAAoB,CAAC;CACpC;AAED,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAAC,sBAAsB,CA4uExD,CAAC"}