@assistant-ui/react-devtools 1.0.6 → 1.2.1

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 (54) hide show
  1. package/README.md +11 -47
  2. package/dist/DevToolsFrame.d.ts +9 -6
  3. package/dist/DevToolsFrame.d.ts.map +1 -1
  4. package/dist/DevToolsFrame.js +33 -24
  5. package/dist/DevToolsFrame.js.map +1 -1
  6. package/dist/DevToolsHost.d.ts +31 -29
  7. package/dist/DevToolsHost.d.ts.map +1 -1
  8. package/dist/DevToolsHost.js +81 -99
  9. package/dist/DevToolsHost.js.map +1 -1
  10. package/dist/DevToolsModal.d.ts +4 -1
  11. package/dist/DevToolsModal.d.ts.map +1 -1
  12. package/dist/DevToolsModal.js +132 -77
  13. package/dist/DevToolsModal.js.map +1 -1
  14. package/dist/ExtensionHost.d.ts +8 -5
  15. package/dist/ExtensionHost.d.ts.map +1 -1
  16. package/dist/ExtensionHost.js +40 -44
  17. package/dist/ExtensionHost.js.map +1 -1
  18. package/dist/FrameClient.d.ts +29 -27
  19. package/dist/FrameClient.d.ts.map +1 -1
  20. package/dist/FrameClient.js +52 -55
  21. package/dist/FrameClient.js.map +1 -1
  22. package/dist/FrameHost.d.ts +9 -6
  23. package/dist/FrameHost.d.ts.map +1 -1
  24. package/dist/FrameHost.js +24 -25
  25. package/dist/FrameHost.js.map +1 -1
  26. package/dist/constants.d.ts +5 -2
  27. package/dist/constants.d.ts.map +1 -1
  28. package/dist/constants.js +6 -2
  29. package/dist/constants.js.map +1 -1
  30. package/dist/index.d.ts +11 -11
  31. package/dist/index.js +10 -10
  32. package/dist/styles/DevToolsModal.styles.d.ts +16 -12
  33. package/dist/styles/DevToolsModal.styles.d.ts.map +1 -1
  34. package/dist/styles/DevToolsModal.styles.js +101 -103
  35. package/dist/styles/DevToolsModal.styles.js.map +1 -1
  36. package/dist/types.d.ts +12 -8
  37. package/dist/types.d.ts.map +1 -1
  38. package/dist/types.js +0 -2
  39. package/dist/utils/serialization.d.ts +7 -3
  40. package/dist/utils/serialization.d.ts.map +1 -1
  41. package/dist/utils/serialization.js +48 -76
  42. package/dist/utils/serialization.js.map +1 -1
  43. package/dist/utils/toolNormalization.d.ts +10 -7
  44. package/dist/utils/toolNormalization.d.ts.map +1 -1
  45. package/dist/utils/toolNormalization.js +38 -48
  46. package/dist/utils/toolNormalization.js.map +1 -1
  47. package/package.json +11 -11
  48. package/src/DevToolsModal.tsx +7 -1
  49. package/src/FrameClient.ts +2 -0
  50. package/src/utils/serialization.ts +7 -7
  51. package/src/utils/toolNormalization.ts +10 -10
  52. package/dist/index.d.ts.map +0 -1
  53. package/dist/index.js.map +0 -1
  54. package/dist/types.js.map +0 -1
@@ -1,87 +1,142 @@
1
1
  "use client";
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { useEffect, useMemo, useState, useSyncExternalStore } from "react";
4
2
  import { DevToolsFrame } from "./DevToolsFrame.js";
5
- import { getStyles, ANIMATION_STYLES } from "./styles/DevToolsModal.styles.js";
3
+ import { ANIMATION_STYLES, getStyles } from "./styles/DevToolsModal.styles.js";
4
+ import { useEffect, useMemo, useState, useSyncExternalStore } from "react";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/DevToolsModal.tsx
6
7
  const isDarkMode = () => {
7
- if (typeof document === "undefined")
8
- return false;
9
- return (document.documentElement.classList.contains("dark") ||
10
- document.body.classList.contains("dark"));
8
+ if (typeof document === "undefined") return false;
9
+ return document.documentElement.classList.contains("dark") || document.body.classList.contains("dark");
11
10
  };
12
11
  const subscribeToThemeChanges = (callback) => {
13
- if (typeof MutationObserver === "undefined") {
14
- return () => { };
15
- }
16
- const observer = new MutationObserver(callback);
17
- observer.observe(document.documentElement, {
18
- attributes: true,
19
- attributeFilter: ["class"],
20
- });
21
- if (document.body !== document.documentElement) {
22
- observer.observe(document.body, {
23
- attributes: true,
24
- attributeFilter: ["class"],
25
- });
26
- }
27
- return () => observer.disconnect();
12
+ if (typeof MutationObserver === "undefined") return () => {};
13
+ const observer = new MutationObserver(callback);
14
+ observer.observe(document.documentElement, {
15
+ attributes: true,
16
+ attributeFilter: ["class"]
17
+ });
18
+ if (document.body !== document.documentElement) observer.observe(document.body, {
19
+ attributes: true,
20
+ attributeFilter: ["class"]
21
+ });
22
+ return () => observer.disconnect();
28
23
  };
29
24
  const DevToolsModalImpl = () => {
30
- const [isOpen, setIsOpen] = useState(false);
31
- const [buttonHover, setButtonHover] = useState(false);
32
- const [closeHover, setCloseHover] = useState(false);
33
- const darkMode = useSyncExternalStore(subscribeToThemeChanges, isDarkMode, () => false);
34
- const styles = useMemo(() => getStyles(darkMode), [darkMode]);
35
- useEffect(() => {
36
- if (typeof document === "undefined")
37
- return;
38
- const styleId = "devtools-modal-animations";
39
- if (!document.getElementById(styleId)) {
40
- const style = document.createElement("style");
41
- style.id = styleId;
42
- style.textContent = ANIMATION_STYLES;
43
- document.head.appendChild(style);
44
- }
45
- return () => {
46
- const style = document.getElementById(styleId);
47
- if (style && !document.querySelector("[data-devtools-modal]")) {
48
- style.remove();
49
- }
50
- };
51
- }, []);
52
- useEffect(() => {
53
- if (!isOpen)
54
- return;
55
- const handleEscape = (event) => {
56
- if (event.key === "Escape") {
57
- setIsOpen(false);
58
- }
59
- };
60
- document.addEventListener("keydown", handleEscape);
61
- return () => document.removeEventListener("keydown", handleEscape);
62
- }, [isOpen]);
63
- return (_jsxs(_Fragment, { children: [_jsx("div", { style: styles.floatingContainer, children: _jsx("button", { onClick: () => setIsOpen(true), onMouseEnter: () => setButtonHover(true), onMouseLeave: () => setButtonHover(false), style: {
64
- ...styles.floatingButton,
65
- ...(buttonHover ? styles.floatingButtonHover : {}),
66
- }, "aria-label": "Open assistant-ui DevTools", title: "Open assistant-ui DevTools", children: _jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", style: { width: "20px", height: "20px" }, children: _jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z", stroke: "currentColor", strokeWidth: "1.8", strokeLinecap: "round", strokeLinejoin: "round", fill: "none" }) }) }) }), isOpen && (_jsxs(_Fragment, { children: [_jsx("div", { style: styles.backdrop, onClick: () => setIsOpen(false) }), _jsxs("div", { style: styles.modal, "data-devtools-modal": true, children: [_jsx("button", { onClick: () => setIsOpen(false), onMouseEnter: () => setCloseHover(true), onMouseLeave: () => setCloseHover(false), style: {
67
- ...styles.dismissButton,
68
- ...(closeHover ? styles.dismissButtonHover : {}),
69
- }, "aria-label": "Close DevTools", children: _jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [_jsx("path", { d: "M18 6L6 18", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M6 6L18 18", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round", strokeLinejoin: "round" })] }) }), _jsx("div", { style: styles.modalContent, children: _jsx(DevToolsFrame, { style: {
70
- width: "100%",
71
- height: "100%",
72
- border: "none",
73
- borderRadius: "12px",
74
- backgroundColor: "transparent",
75
- } }) })] })] }))] }));
25
+ const [isOpen, setIsOpen] = useState(false);
26
+ const [buttonHover, setButtonHover] = useState(false);
27
+ const [closeHover, setCloseHover] = useState(false);
28
+ const darkMode = useSyncExternalStore(subscribeToThemeChanges, isDarkMode, () => false);
29
+ const styles = useMemo(() => getStyles(darkMode), [darkMode]);
30
+ useEffect(() => {
31
+ if (typeof document === "undefined") return;
32
+ const styleId = "devtools-modal-animations";
33
+ if (!document.getElementById(styleId)) {
34
+ const style = document.createElement("style");
35
+ style.id = styleId;
36
+ style.textContent = ANIMATION_STYLES;
37
+ document.head.appendChild(style);
38
+ }
39
+ return () => {
40
+ const style = document.getElementById(styleId);
41
+ if (style && !document.querySelector("[data-devtools-modal]")) style.remove();
42
+ };
43
+ }, []);
44
+ useEffect(() => {
45
+ if (!isOpen) return;
46
+ const handleEscape = (event) => {
47
+ if (event.key === "Escape") setIsOpen(false);
48
+ };
49
+ document.addEventListener("keydown", handleEscape);
50
+ return () => document.removeEventListener("keydown", handleEscape);
51
+ }, [isOpen]);
52
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
53
+ style: styles.floatingContainer,
54
+ children: /* @__PURE__ */ jsx("button", {
55
+ type: "button",
56
+ onClick: () => setIsOpen(true),
57
+ onMouseEnter: () => setButtonHover(true),
58
+ onMouseLeave: () => setButtonHover(false),
59
+ style: {
60
+ ...styles.floatingButton,
61
+ ...buttonHover ? styles.floatingButtonHover : {}
62
+ },
63
+ "aria-label": "Open assistant-ui DevTools",
64
+ title: "Open assistant-ui DevTools",
65
+ children: /* @__PURE__ */ jsx("svg", {
66
+ "aria-hidden": "true",
67
+ width: "20",
68
+ height: "20",
69
+ viewBox: "0 0 24 24",
70
+ fill: "none",
71
+ xmlns: "http://www.w3.org/2000/svg",
72
+ style: {
73
+ width: "20px",
74
+ height: "20px"
75
+ },
76
+ children: /* @__PURE__ */ jsx("path", {
77
+ d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",
78
+ stroke: "currentColor",
79
+ strokeWidth: "1.8",
80
+ strokeLinecap: "round",
81
+ strokeLinejoin: "round",
82
+ fill: "none"
83
+ })
84
+ })
85
+ })
86
+ }), isOpen && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
87
+ style: styles.backdrop,
88
+ onClick: () => setIsOpen(false)
89
+ }), /* @__PURE__ */ jsxs("div", {
90
+ style: styles.modal,
91
+ "data-devtools-modal": true,
92
+ children: [/* @__PURE__ */ jsx("button", {
93
+ type: "button",
94
+ onClick: () => setIsOpen(false),
95
+ onMouseEnter: () => setCloseHover(true),
96
+ onMouseLeave: () => setCloseHover(false),
97
+ style: {
98
+ ...styles.dismissButton,
99
+ ...closeHover ? styles.dismissButtonHover : {}
100
+ },
101
+ "aria-label": "Close DevTools",
102
+ children: /* @__PURE__ */ jsxs("svg", {
103
+ "aria-hidden": "true",
104
+ width: "14",
105
+ height: "14",
106
+ viewBox: "0 0 24 24",
107
+ fill: "none",
108
+ xmlns: "http://www.w3.org/2000/svg",
109
+ children: [/* @__PURE__ */ jsx("path", {
110
+ d: "M18 6L6 18",
111
+ stroke: "currentColor",
112
+ strokeWidth: "1.6",
113
+ strokeLinecap: "round",
114
+ strokeLinejoin: "round"
115
+ }), /* @__PURE__ */ jsx("path", {
116
+ d: "M6 6L18 18",
117
+ stroke: "currentColor",
118
+ strokeWidth: "1.6",
119
+ strokeLinecap: "round",
120
+ strokeLinejoin: "round"
121
+ })]
122
+ })
123
+ }), /* @__PURE__ */ jsx("div", {
124
+ style: styles.modalContent,
125
+ children: /* @__PURE__ */ jsx(DevToolsFrame, { style: {
126
+ width: "100%",
127
+ height: "100%",
128
+ border: "none",
129
+ borderRadius: "12px",
130
+ backgroundColor: "transparent"
131
+ } })
132
+ })]
133
+ })] })] });
76
134
  };
77
- // Export a component that only renders in development
78
- export const DevToolsModal = () => {
79
- // Check if we're in production - most bundlers will replace process.env.NODE_ENV
80
- // This allows the entire component to be eliminated via dead code elimination
81
- if (typeof process !== "undefined" &&
82
- process.env?.["NODE_ENV"] === "production") {
83
- return null;
84
- }
85
- return _jsx(DevToolsModalImpl, {});
135
+ const DevToolsModal = () => {
136
+ if (typeof process !== "undefined" && process.env?.NODE_ENV === "production") return null;
137
+ return /* @__PURE__ */ jsx(DevToolsModalImpl, {});
86
138
  };
139
+ //#endregion
140
+ export { DevToolsModal };
141
+
87
142
  //# sourceMappingURL=DevToolsModal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsModal.js","sourceRoot":"","sources":["../src/DevToolsModal.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DevToolsModal.js","names":[],"sources":["../src/DevToolsModal.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useState, useSyncExternalStore } from \"react\";\nimport { DevToolsFrame } from \"./DevToolsFrame\";\nimport { getStyles, ANIMATION_STYLES } from \"./styles/DevToolsModal.styles\";\n\nconst isDarkMode = (): boolean => {\n if (typeof document === \"undefined\") return false;\n return (\n document.documentElement.classList.contains(\"dark\") ||\n document.body.classList.contains(\"dark\")\n );\n};\n\nconst subscribeToThemeChanges = (callback: () => void) => {\n if (typeof MutationObserver === \"undefined\") {\n return () => {};\n }\n\n const observer = new MutationObserver(callback);\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n\n if (document.body !== document.documentElement) {\n observer.observe(document.body, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n }\n\n return () => observer.disconnect();\n};\n\nconst DevToolsModalImpl = () => {\n const [isOpen, setIsOpen] = useState(false);\n const [buttonHover, setButtonHover] = useState(false);\n const [closeHover, setCloseHover] = useState(false);\n\n const darkMode = useSyncExternalStore(\n subscribeToThemeChanges,\n isDarkMode,\n () => false, // Server-side always returns false\n );\n\n const styles = useMemo(() => getStyles(darkMode), [darkMode]);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n\n const styleId = \"devtools-modal-animations\";\n if (!document.getElementById(styleId)) {\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.textContent = ANIMATION_STYLES;\n document.head.appendChild(style);\n }\n\n return () => {\n const style = document.getElementById(styleId);\n if (style && !document.querySelector(\"[data-devtools-modal]\")) {\n style.remove();\n }\n };\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }, [isOpen]);\n\n return (\n <>\n <div style={styles.floatingContainer}>\n <button\n type=\"button\"\n onClick={() => setIsOpen(true)}\n onMouseEnter={() => setButtonHover(true)}\n onMouseLeave={() => setButtonHover(false)}\n style={{\n ...styles.floatingButton,\n ...(buttonHover ? styles.floatingButtonHover : {}),\n }}\n aria-label=\"Open assistant-ui DevTools\"\n title=\"Open assistant-ui DevTools\"\n >\n <svg\n aria-hidden=\"true\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ width: \"20px\", height: \"20px\" }}\n >\n <path\n d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </button>\n </div>\n\n {isOpen && (\n <>\n {/* biome-ignore lint/a11y/useKeyWithClickEvents: backdrop click is a convenience; keyboard users use the close button */}\n {/* biome-ignore lint/a11y/noStaticElementInteractions: backdrop overlay */}\n <div style={styles.backdrop} onClick={() => setIsOpen(false)} />\n\n <div style={styles.modal} data-devtools-modal>\n <button\n type=\"button\"\n onClick={() => setIsOpen(false)}\n onMouseEnter={() => setCloseHover(true)}\n onMouseLeave={() => setCloseHover(false)}\n style={{\n ...styles.dismissButton,\n ...(closeHover ? styles.dismissButtonHover : {}),\n }}\n aria-label=\"Close DevTools\"\n >\n <svg\n aria-hidden=\"true\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M6 6L18 18\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n <div style={styles.modalContent}>\n <DevToolsFrame\n style={{\n width: \"100%\",\n height: \"100%\",\n border: \"none\",\n borderRadius: \"12px\",\n backgroundColor: \"transparent\",\n }}\n />\n </div>\n </div>\n </>\n )}\n </>\n );\n};\n\n// Export a component that only renders in development\nexport const DevToolsModal = () => {\n // Check if we're in production - most bundlers will replace process.env.NODE_ENV\n // This allows the entire component to be eliminated via dead code elimination\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV === \"production\"\n ) {\n return null;\n }\n\n return <DevToolsModalImpl />;\n};\n"],"mappings":"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"}
@@ -1,7 +1,10 @@
1
- export declare class ExtensionHost {
2
- private devToolsHost;
3
- private messageListener;
4
- constructor();
5
- destroy(): void;
1
+ //#region src/ExtensionHost.d.ts
2
+ declare class ExtensionHost {
3
+ private devToolsHost;
4
+ private messageListener;
5
+ constructor();
6
+ destroy(): void;
6
7
  }
8
+ //#endregion
9
+ export { ExtensionHost };
7
10
  //# sourceMappingURL=ExtensionHost.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionHost.d.ts","sourceRoot":"","sources":["../src/ExtensionHost.ts"],"names":[],"mappings":"AAEA,qBAAa,aAAa;IACxB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,eAAe,CAAgC;;IAgDvD,OAAO;CAIR"}
1
+ {"version":3,"file":"ExtensionHost.d.ts","names":[],"sources":["../src/ExtensionHost.ts"],"mappings":";cAEa,aAAA;EAAA,QACH,YAAA;EAAA,QACA,eAAA;;EAgDR,OAAA,CAAA;AAAA"}
@@ -1,46 +1,42 @@
1
1
  import { DevToolsHost } from "./DevToolsHost.js";
2
- export class ExtensionHost {
3
- devToolsHost;
4
- messageListener;
5
- constructor() {
6
- // Create DevToolsHost with callback to send messages through extension
7
- this.devToolsHost = new DevToolsHost((message) => {
8
- console.log("[ExtensionHost] Sending message to iframe:", message);
9
- window.postMessage({
10
- source: "assistant-ui-devtools-page",
11
- payload: message,
12
- }, "*");
13
- });
14
- // Setup listener to forward messages from extension to DevToolsHost
15
- this.messageListener = (event) => {
16
- if (event.source !== window)
17
- return;
18
- // Log ALL messages to see what's coming through
19
- if (event.data.source === "assistant-ui-devtools-iframe") {
20
- console.log("[ExtensionHost] Received message from iframe:", {
21
- source: event.data.source,
22
- payload: event.data.payload,
23
- fullData: event.data,
24
- });
25
- this.devToolsHost.onReceiveMessage(event.data.payload);
26
- }
27
- };
28
- window.addEventListener("message", this.messageListener);
29
- // Announce that a new host has connected
30
- // This tells the iframe to re-send its subscription
31
- setTimeout(() => {
32
- console.log("[ExtensionHost] Announcing connection to iframe");
33
- window.postMessage({
34
- source: "assistant-ui-devtools-page",
35
- payload: {
36
- type: "host-connected",
37
- },
38
- }, "*");
39
- }, 100);
40
- }
41
- destroy() {
42
- window.removeEventListener("message", this.messageListener);
43
- this.devToolsHost.destroy();
44
- }
45
- }
2
+ //#region src/ExtensionHost.ts
3
+ var ExtensionHost = class {
4
+ devToolsHost;
5
+ messageListener;
6
+ constructor() {
7
+ this.devToolsHost = new DevToolsHost((message) => {
8
+ console.log("[ExtensionHost] Sending message to iframe:", message);
9
+ window.postMessage({
10
+ source: "assistant-ui-devtools-page",
11
+ payload: message
12
+ }, "*");
13
+ });
14
+ this.messageListener = (event) => {
15
+ if (event.source !== window) return;
16
+ if (event.data.source === "assistant-ui-devtools-iframe") {
17
+ console.log("[ExtensionHost] Received message from iframe:", {
18
+ source: event.data.source,
19
+ payload: event.data.payload,
20
+ fullData: event.data
21
+ });
22
+ this.devToolsHost.onReceiveMessage(event.data.payload);
23
+ }
24
+ };
25
+ window.addEventListener("message", this.messageListener);
26
+ setTimeout(() => {
27
+ console.log("[ExtensionHost] Announcing connection to iframe");
28
+ window.postMessage({
29
+ source: "assistant-ui-devtools-page",
30
+ payload: { type: "host-connected" }
31
+ }, "*");
32
+ }, 100);
33
+ }
34
+ destroy() {
35
+ window.removeEventListener("message", this.messageListener);
36
+ this.devToolsHost.destroy();
37
+ }
38
+ };
39
+ //#endregion
40
+ export { ExtensionHost };
41
+
46
42
  //# sourceMappingURL=ExtensionHost.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionHost.js","sourceRoot":"","sources":["../src/ExtensionHost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,0BAAuB;AAE9C,MAAM,OAAO,aAAa;IAChB,YAAY,CAAe;IAC3B,eAAe,CAAgC;IAEvD;QACE,uEAAuE;QACvE,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE;YAC/C,OAAO,CAAC,GAAG,CAAC,4CAA4C,EAAE,OAAO,CAAC,CAAC;YACnE,MAAM,CAAC,WAAW,CAChB;gBACE,MAAM,EAAE,4BAA4B;gBACpC,OAAO,EAAE,OAAO;aACjB,EACD,GAAG,CACJ,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,oEAAoE;QACpE,IAAI,CAAC,eAAe,GAAG,CAAC,KAAmB,EAAE,EAAE;YAC7C,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;gBAAE,OAAO;YAEpC,gDAAgD;YAChD,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,8BAA8B,EAAE,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,+CAA+C,EAAE;oBAC3D,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;oBACzB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO;oBAC3B,QAAQ,EAAE,KAAK,CAAC,IAAI;iBACrB,CAAC,CAAC;gBACH,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzD,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAEzD,yCAAyC;QACzC,oDAAoD;QACpD,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,MAAM,CAAC,WAAW,CAChB;gBACE,MAAM,EAAE,4BAA4B;gBACpC,OAAO,EAAE;oBACP,IAAI,EAAE,gBAAgB;iBACvB;aACF,EACD,GAAG,CACJ,CAAC;QACJ,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAED,OAAO;QACL,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5D,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;CACF"}
1
+ {"version":3,"file":"ExtensionHost.js","names":[],"sources":["../src/ExtensionHost.ts"],"sourcesContent":["import { DevToolsHost } from \"./DevToolsHost\";\n\nexport class ExtensionHost {\n private devToolsHost: DevToolsHost;\n private messageListener: (event: MessageEvent) => void;\n\n constructor() {\n // Create DevToolsHost with callback to send messages through extension\n this.devToolsHost = new DevToolsHost((message) => {\n console.log(\"[ExtensionHost] Sending message to iframe:\", message);\n window.postMessage(\n {\n source: \"assistant-ui-devtools-page\",\n payload: message,\n },\n \"*\",\n );\n });\n\n // Setup listener to forward messages from extension to DevToolsHost\n this.messageListener = (event: MessageEvent) => {\n if (event.source !== window) return;\n\n // Log ALL messages to see what's coming through\n if (event.data.source === \"assistant-ui-devtools-iframe\") {\n console.log(\"[ExtensionHost] Received message from iframe:\", {\n source: event.data.source,\n payload: event.data.payload,\n fullData: event.data,\n });\n this.devToolsHost.onReceiveMessage(event.data.payload);\n }\n };\n\n window.addEventListener(\"message\", this.messageListener);\n\n // Announce that a new host has connected\n // This tells the iframe to re-send its subscription\n setTimeout(() => {\n console.log(\"[ExtensionHost] Announcing connection to iframe\");\n window.postMessage(\n {\n source: \"assistant-ui-devtools-page\",\n payload: {\n type: \"host-connected\",\n },\n },\n \"*\",\n );\n }, 100);\n }\n\n destroy() {\n window.removeEventListener(\"message\", this.messageListener);\n this.devToolsHost.destroy();\n }\n}\n"],"mappings":";;AAEA,IAAa,gBAAb,MAA2B;CACzB;CACA;CAEA,cAAc;EAEZ,KAAK,eAAe,IAAI,cAAc,YAAY;GAChD,QAAQ,IAAI,8CAA8C,OAAO;GACjE,OAAO,YACL;IACE,QAAQ;IACR,SAAS;GACX,GACA,GACF;EACF,CAAC;EAGD,KAAK,mBAAmB,UAAwB;GAC9C,IAAI,MAAM,WAAW,QAAQ;GAG7B,IAAI,MAAM,KAAK,WAAW,gCAAgC;IACxD,QAAQ,IAAI,iDAAiD;KAC3D,QAAQ,MAAM,KAAK;KACnB,SAAS,MAAM,KAAK;KACpB,UAAU,MAAM;IAClB,CAAC;IACD,KAAK,aAAa,iBAAiB,MAAM,KAAK,OAAO;GACvD;EACF;EAEA,OAAO,iBAAiB,WAAW,KAAK,eAAe;EAIvD,iBAAiB;GACf,QAAQ,IAAI,iDAAiD;GAC7D,OAAO,YACL;IACE,QAAQ;IACR,SAAS,EACP,MAAM,iBACR;GACF,GACA,GACF;EACF,GAAG,GAAG;CACR;CAEA,UAAU;EACR,OAAO,oBAAoB,WAAW,KAAK,eAAe;EAC1D,KAAK,aAAa,QAAQ;CAC5B;AACF"}
@@ -1,35 +1,37 @@
1
+ //#region src/FrameClient.d.ts
1
2
  interface ApiData {
2
- apiId: number;
3
- state: any;
4
- events: any[];
5
- context?: any;
3
+ apiId: number;
4
+ state: any;
5
+ events: any[];
6
+ context?: any;
6
7
  }
7
8
  type UpdateListener = (data: {
9
+ apiList?: Array<{
10
+ apiId: number;
11
+ }>;
12
+ apis?: ApiData[];
13
+ }) => void;
14
+ declare class FrameClient {
15
+ private listeners;
16
+ private connectionListeners;
17
+ private lastUpdate;
18
+ constructor();
19
+ private setupMessageListener;
20
+ onHostConnected(listener: () => void): () => void;
21
+ subscribe(listener: UpdateListener): () => void;
22
+ setSubscription(options: {
23
+ apiList?: boolean;
24
+ apis?: number[];
25
+ }): void;
26
+ clearEvents(apiId: number): void;
27
+ private notifyListeners;
28
+ getLastUpdate(): {
8
29
  apiList?: Array<{
9
- apiId: number;
30
+ apiId: number;
10
31
  }>;
11
32
  apis?: ApiData[];
12
- }) => void;
13
- export declare class FrameClient {
14
- private listeners;
15
- private connectionListeners;
16
- private lastUpdate;
17
- constructor();
18
- private setupMessageListener;
19
- onHostConnected(listener: () => void): () => void;
20
- subscribe(listener: UpdateListener): () => void;
21
- setSubscription(options: {
22
- apiList?: boolean;
23
- apis?: number[];
24
- }): void;
25
- clearEvents(apiId: number): void;
26
- private notifyListeners;
27
- getLastUpdate(): {
28
- apiList?: Array<{
29
- apiId: number;
30
- }>;
31
- apis?: ApiData[];
32
- };
33
+ };
33
34
  }
34
- export {};
35
+ //#endregion
36
+ export { FrameClient };
35
37
  //# sourceMappingURL=FrameClient.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FrameClient.d.ts","sourceRoot":"","sources":["../src/FrameClient.ts"],"names":[],"mappings":"AAAA,UAAU,OAAO;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,GAAG,CAAC;IACX,MAAM,EAAE,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,EAAE,GAAG,CAAC;CACf;AAcD,KAAK,cAAc,GAAG,CAAC,IAAI,EAAE;IAC3B,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;CAClB,KAAK,IAAI,CAAC;AAEX,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,mBAAmB,CAAyB;IACpD,OAAO,CAAC,UAAU,CAGX;;IAMP,OAAO,CAAC,oBAAoB;IAc5B,eAAe,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAOjD,SAAS,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI;IAa/C,eAAe,CAAC,OAAO,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;IAU/D,WAAW,CAAC,KAAK,EAAE,MAAM;IAUzB,OAAO,CAAC,eAAe;IAIvB,aAAa;kBAlED,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;eAC3B,OAAO,EAAE;;CAoEnB"}
1
+ {"version":3,"file":"FrameClient.d.ts","names":[],"sources":["../src/FrameClient.ts"],"mappings":";UAAU,OAAA;EACR,KAAA;EACA,KAAA;EACA,MAAA;EACA,OAAA;AAAA;AAAA,KAeG,cAAA,IAAkB,IAAA;EACrB,OAAA,GAAU,KAAA;IAAQ,KAAA;EAAA;EAClB,IAAA,GAAO,OAAO;AAAA;AAAA,cAGH,WAAA;EAAA,QACH,SAAA;EAAA,QACA,mBAAA;EAAA,QACA,UAAA;;UASA,oBAAA;EAeR,eAAA,CAAgB,QAAA;EAOhB,SAAA,CAAU,QAAA,EAAU,cAAA;EAapB,eAAA,CAAgB,OAAA;IAAW,OAAA;IAAmB,IAAA;EAAA;EAU9C,WAAA,CAAY,KAAA;EAAA,QAUJ,eAAA;EAKR,aAAA,CAAA;cApEY,KAAA;MAAQ,KAAA;IAAA;WACX,OAAA;EAAA;AAAA"}
@@ -1,56 +1,53 @@
1
- export class FrameClient {
2
- listeners = new Set();
3
- connectionListeners = new Set();
4
- lastUpdate = {};
5
- constructor() {
6
- this.setupMessageListener();
7
- }
8
- setupMessageListener() {
9
- window.addEventListener("message", (event) => {
10
- const message = event.data;
11
- if (message.type === "update") {
12
- this.lastUpdate = message.data;
13
- this.notifyListeners(message.data);
14
- }
15
- else if (message.type === "host-connected") {
16
- // Host has reconnected (page refresh), notify listeners to re-subscribe
17
- this.connectionListeners.forEach((listener) => listener());
18
- }
19
- });
20
- }
21
- onHostConnected(listener) {
22
- this.connectionListeners.add(listener);
23
- return () => {
24
- this.connectionListeners.delete(listener);
25
- };
26
- }
27
- subscribe(listener) {
28
- this.listeners.add(listener);
29
- // Send the last update to the new listener
30
- if (this.lastUpdate.apiList || this.lastUpdate.apis) {
31
- listener(this.lastUpdate);
32
- }
33
- return () => {
34
- this.listeners.delete(listener);
35
- };
36
- }
37
- setSubscription(options) {
38
- window.parent.postMessage({
39
- type: "subscription",
40
- data: options,
41
- }, "*");
42
- }
43
- clearEvents(apiId) {
44
- window.parent.postMessage({
45
- type: "clearEvents",
46
- data: { apiId },
47
- }, "*");
48
- }
49
- notifyListeners(data) {
50
- this.listeners.forEach((listener) => listener(data));
51
- }
52
- getLastUpdate() {
53
- return this.lastUpdate;
54
- }
55
- }
1
+ //#region src/FrameClient.ts
2
+ var FrameClient = class {
3
+ listeners = /* @__PURE__ */ new Set();
4
+ connectionListeners = /* @__PURE__ */ new Set();
5
+ lastUpdate = {};
6
+ constructor() {
7
+ this.setupMessageListener();
8
+ }
9
+ setupMessageListener() {
10
+ window.addEventListener("message", (event) => {
11
+ const message = event.data;
12
+ if (message.type === "update") {
13
+ this.lastUpdate = message.data;
14
+ this.notifyListeners(message.data);
15
+ } else if (message.type === "host-connected") this.connectionListeners.forEach((listener) => listener());
16
+ });
17
+ }
18
+ onHostConnected(listener) {
19
+ this.connectionListeners.add(listener);
20
+ return () => {
21
+ this.connectionListeners.delete(listener);
22
+ };
23
+ }
24
+ subscribe(listener) {
25
+ this.listeners.add(listener);
26
+ if (this.lastUpdate.apiList || this.lastUpdate.apis) listener(this.lastUpdate);
27
+ return () => {
28
+ this.listeners.delete(listener);
29
+ };
30
+ }
31
+ setSubscription(options) {
32
+ window.parent.postMessage({
33
+ type: "subscription",
34
+ data: options
35
+ }, "*");
36
+ }
37
+ clearEvents(apiId) {
38
+ window.parent.postMessage({
39
+ type: "clearEvents",
40
+ data: { apiId }
41
+ }, "*");
42
+ }
43
+ notifyListeners(data) {
44
+ this.listeners.forEach((listener) => listener(data));
45
+ }
46
+ getLastUpdate() {
47
+ return this.lastUpdate;
48
+ }
49
+ };
50
+ //#endregion
51
+ export { FrameClient };
52
+
56
53
  //# sourceMappingURL=FrameClient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FrameClient.js","sourceRoot":"","sources":["../src/FrameClient.ts"],"names":[],"mappings":"AAwBA,MAAM,OAAO,WAAW;IACd,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,mBAAmB,GAAG,IAAI,GAAG,EAAc,CAAC;IAC5C,UAAU,GAGd,EAAE,CAAC;IAEP;QACE,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAEO,oBAAoB;QAC1B,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,IAA4C,CAAC;YAEnE,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC9B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;gBAC/B,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBAC7C,wEAAwE;gBACxE,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,eAAe,CAAC,QAAoB;QAClC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,QAAwB;QAChC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE7B,2CAA2C;QAC3C,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACpD,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;IAED,eAAe,CAAC,OAA+C;QAC7D,MAAM,CAAC,MAAM,CAAC,WAAW,CACvB;YACE,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,OAAO;SACd,EACD,GAAG,CACJ,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,KAAa;QACvB,MAAM,CAAC,MAAM,CAAC,WAAW,CACvB;YACE,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,EAAE,KAAK,EAAE;SAChB,EACD,GAAG,CACJ,CAAC;IACJ,CAAC;IAEO,eAAe,CAAC,IAA2B;QACjD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}
1
+ {"version":3,"file":"FrameClient.js","names":[],"sources":["../src/FrameClient.ts"],"sourcesContent":["interface ApiData {\n apiId: number;\n state: any;\n events: any[];\n context?: any;\n}\n\ninterface UpdateMessage {\n type: \"update\";\n data: {\n apiList?: Array<{ apiId: number }>;\n apis?: ApiData[];\n };\n}\n\ninterface HostConnectedMessage {\n type: \"host-connected\";\n}\n\ntype UpdateListener = (data: {\n apiList?: Array<{ apiId: number }>;\n apis?: ApiData[];\n}) => void;\n\nexport class FrameClient {\n private listeners = new Set<UpdateListener>();\n private connectionListeners = new Set<() => void>();\n private lastUpdate: {\n apiList?: Array<{ apiId: number }>;\n apis?: ApiData[];\n } = {};\n\n constructor() {\n this.setupMessageListener();\n }\n\n private setupMessageListener() {\n window.addEventListener(\"message\", (event) => {\n const message = event.data as UpdateMessage | HostConnectedMessage;\n\n if (message.type === \"update\") {\n this.lastUpdate = message.data;\n this.notifyListeners(message.data);\n } else if (message.type === \"host-connected\") {\n // Host has reconnected (page refresh), notify listeners to re-subscribe\n // biome-ignore lint/suspicious/useIterableCallbackReturn: forEach callback intentionally has no return\n this.connectionListeners.forEach((listener) => listener());\n }\n });\n }\n\n onHostConnected(listener: () => void): () => void {\n this.connectionListeners.add(listener);\n return () => {\n this.connectionListeners.delete(listener);\n };\n }\n\n subscribe(listener: UpdateListener): () => void {\n this.listeners.add(listener);\n\n // Send the last update to the new listener\n if (this.lastUpdate.apiList || this.lastUpdate.apis) {\n listener(this.lastUpdate);\n }\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n setSubscription(options: { apiList?: boolean; apis?: number[] }) {\n window.parent.postMessage(\n {\n type: \"subscription\",\n data: options,\n },\n \"*\",\n );\n }\n\n clearEvents(apiId: number) {\n window.parent.postMessage(\n {\n type: \"clearEvents\",\n data: { apiId },\n },\n \"*\",\n );\n }\n\n private notifyListeners(data: UpdateMessage[\"data\"]) {\n // biome-ignore lint/suspicious/useIterableCallbackReturn: forEach callback intentionally has no return\n this.listeners.forEach((listener) => listener(data));\n }\n\n getLastUpdate() {\n return this.lastUpdate;\n }\n}\n"],"mappings":";AAwBA,IAAa,cAAb,MAAyB;CACvB,4BAAoB,IAAI,IAAoB;CAC5C,sCAA8B,IAAI,IAAgB;CAClD,aAGI,CAAC;CAEL,cAAc;EACZ,KAAK,qBAAqB;CAC5B;CAEA,uBAA+B;EAC7B,OAAO,iBAAiB,YAAY,UAAU;GAC5C,MAAM,UAAU,MAAM;GAEtB,IAAI,QAAQ,SAAS,UAAU;IAC7B,KAAK,aAAa,QAAQ;IAC1B,KAAK,gBAAgB,QAAQ,IAAI;GACnC,OAAO,IAAI,QAAQ,SAAS,kBAG1B,KAAK,oBAAoB,SAAS,aAAa,SAAS,CAAC;EAE7D,CAAC;CACH;CAEA,gBAAgB,UAAkC;EAChD,KAAK,oBAAoB,IAAI,QAAQ;EACrC,aAAa;GACX,KAAK,oBAAoB,OAAO,QAAQ;EAC1C;CACF;CAEA,UAAU,UAAsC;EAC9C,KAAK,UAAU,IAAI,QAAQ;EAG3B,IAAI,KAAK,WAAW,WAAW,KAAK,WAAW,MAC7C,SAAS,KAAK,UAAU;EAG1B,aAAa;GACX,KAAK,UAAU,OAAO,QAAQ;EAChC;CACF;CAEA,gBAAgB,SAAiD;EAC/D,OAAO,OAAO,YACZ;GACE,MAAM;GACN,MAAM;EACR,GACA,GACF;CACF;CAEA,YAAY,OAAe;EACzB,OAAO,OAAO,YACZ;GACE,MAAM;GACN,MAAM,EAAE,MAAM;EAChB,GACA,GACF;CACF;CAEA,gBAAwB,MAA6B;EAEnD,KAAK,UAAU,SAAS,aAAa,SAAS,IAAI,CAAC;CACrD;CAEA,gBAAgB;EACd,OAAO,KAAK;CACd;AACF"}
@@ -1,8 +1,11 @@
1
- export declare class FrameHost {
2
- private frame;
3
- private devToolsHost;
4
- private messageListener;
5
- constructor(frame: HTMLIFrameElement);
6
- destroy(): void;
1
+ //#region src/FrameHost.d.ts
2
+ declare class FrameHost {
3
+ private frame;
4
+ private devToolsHost;
5
+ private messageListener;
6
+ constructor(frame: HTMLIFrameElement);
7
+ destroy(): void;
7
8
  }
9
+ //#endregion
10
+ export { FrameHost };
8
11
  //# sourceMappingURL=FrameHost.d.ts.map