@assistant-ui/react-devtools 0.1.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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +65 -0
  3. package/dist/DevToolsFrame.d.ts +8 -0
  4. package/dist/DevToolsFrame.d.ts.map +1 -0
  5. package/dist/DevToolsFrame.js +49 -0
  6. package/dist/DevToolsFrame.js.map +1 -0
  7. package/dist/DevToolsHost.d.ts +35 -0
  8. package/dist/DevToolsHost.d.ts.map +1 -0
  9. package/dist/DevToolsHost.js +104 -0
  10. package/dist/DevToolsHost.js.map +1 -0
  11. package/dist/DevToolsModal.d.ts +2 -0
  12. package/dist/DevToolsModal.d.ts.map +1 -0
  13. package/dist/DevToolsModal.js +170 -0
  14. package/dist/DevToolsModal.js.map +1 -0
  15. package/dist/ExtensionHost.d.ts +7 -0
  16. package/dist/ExtensionHost.d.ts.map +1 -0
  17. package/dist/ExtensionHost.js +50 -0
  18. package/dist/ExtensionHost.js.map +1 -0
  19. package/dist/FrameClient.d.ts +35 -0
  20. package/dist/FrameClient.d.ts.map +1 -0
  21. package/dist/FrameClient.js +63 -0
  22. package/dist/FrameClient.js.map +1 -0
  23. package/dist/FrameHost.d.ts +8 -0
  24. package/dist/FrameHost.d.ts.map +1 -0
  25. package/dist/FrameHost.js +28 -0
  26. package/dist/FrameHost.js.map +1 -0
  27. package/dist/constants.d.ts +3 -0
  28. package/dist/constants.d.ts.map +1 -0
  29. package/dist/constants.js +8 -0
  30. package/dist/constants.js.map +1 -0
  31. package/dist/index.d.ts +11 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +27 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/styles/DevToolsModal.styles.d.ts +14 -0
  36. package/dist/styles/DevToolsModal.styles.d.ts.map +1 -0
  37. package/dist/styles/DevToolsModal.styles.js +121 -0
  38. package/dist/styles/DevToolsModal.styles.js.map +1 -0
  39. package/dist/types.d.ts +10 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +1 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/utils/serialization.d.ts +5 -0
  44. package/dist/utils/serialization.d.ts.map +1 -0
  45. package/dist/utils/serialization.js +77 -0
  46. package/dist/utils/serialization.js.map +1 -0
  47. package/dist/utils/toolNormalization.d.ts +9 -0
  48. package/dist/utils/toolNormalization.d.ts.map +1 -0
  49. package/dist/utils/toolNormalization.js +58 -0
  50. package/dist/utils/toolNormalization.js.map +1 -0
  51. package/package.json +76 -0
  52. package/src/DevToolsFrame.tsx +55 -0
  53. package/src/DevToolsHost.ts +150 -0
  54. package/src/DevToolsModal.tsx +178 -0
  55. package/src/ExtensionHost.ts +57 -0
  56. package/src/FrameClient.ts +98 -0
  57. package/src/FrameHost.ts +31 -0
  58. package/src/constants.ts +2 -0
  59. package/src/index.ts +17 -0
  60. package/src/styles/DevToolsModal.styles.ts +137 -0
  61. package/src/types.ts +13 -0
  62. package/src/utils/serialization.ts +97 -0
  63. package/src/utils/toolNormalization.ts +83 -0
@@ -0,0 +1,63 @@
1
+ // 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") {
16
+ this.connectionListeners.forEach((listener) => listener());
17
+ }
18
+ });
19
+ }
20
+ onHostConnected(listener) {
21
+ this.connectionListeners.add(listener);
22
+ return () => {
23
+ this.connectionListeners.delete(listener);
24
+ };
25
+ }
26
+ subscribe(listener) {
27
+ this.listeners.add(listener);
28
+ if (this.lastUpdate.apiList || this.lastUpdate.apis) {
29
+ listener(this.lastUpdate);
30
+ }
31
+ return () => {
32
+ this.listeners.delete(listener);
33
+ };
34
+ }
35
+ setSubscription(options) {
36
+ window.parent.postMessage(
37
+ {
38
+ type: "subscription",
39
+ data: options
40
+ },
41
+ "*"
42
+ );
43
+ }
44
+ clearEvents(apiId) {
45
+ window.parent.postMessage(
46
+ {
47
+ type: "clearEvents",
48
+ data: { apiId }
49
+ },
50
+ "*"
51
+ );
52
+ }
53
+ notifyListeners(data) {
54
+ this.listeners.forEach((listener) => listener(data));
55
+ }
56
+ getLastUpdate() {
57
+ return this.lastUpdate;
58
+ }
59
+ };
60
+ export {
61
+ FrameClient
62
+ };
63
+ //# sourceMappingURL=FrameClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"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 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 this.listeners.forEach((listener) => listener(data));\n }\n\n getLastUpdate() {\n return this.lastUpdate;\n }\n}\n"],"mappings":";AAwBO,IAAM,cAAN,MAAkB;AAAA,EACf,YAAY,oBAAI,IAAoB;AAAA,EACpC,sBAAsB,oBAAI,IAAgB;AAAA,EAC1C,aAGJ,CAAC;AAAA,EAEL,cAAc;AACZ,SAAK,qBAAqB;AAAA,EAC5B;AAAA,EAEQ,uBAAuB;AAC7B,WAAO,iBAAiB,WAAW,CAAC,UAAU;AAC5C,YAAM,UAAU,MAAM;AAEtB,UAAI,QAAQ,SAAS,UAAU;AAC7B,aAAK,aAAa,QAAQ;AAC1B,aAAK,gBAAgB,QAAQ,IAAI;AAAA,MACnC,WAAW,QAAQ,SAAS,kBAAkB;AAE5C,aAAK,oBAAoB,QAAQ,CAAC,aAAa,SAAS,CAAC;AAAA,MAC3D;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,gBAAgB,UAAkC;AAChD,SAAK,oBAAoB,IAAI,QAAQ;AACrC,WAAO,MAAM;AACX,WAAK,oBAAoB,OAAO,QAAQ;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,UAAU,UAAsC;AAC9C,SAAK,UAAU,IAAI,QAAQ;AAG3B,QAAI,KAAK,WAAW,WAAW,KAAK,WAAW,MAAM;AACnD,eAAS,KAAK,UAAU;AAAA,IAC1B;AAEA,WAAO,MAAM;AACX,WAAK,UAAU,OAAO,QAAQ;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,gBAAgB,SAAiD;AAC/D,WAAO,OAAO;AAAA,MACZ;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY,OAAe;AACzB,WAAO,OAAO;AAAA,MACZ;AAAA,QACE,MAAM;AAAA,QACN,MAAM,EAAE,MAAM;AAAA,MAChB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAAgB,MAA6B;AACnD,SAAK,UAAU,QAAQ,CAAC,aAAa,SAAS,IAAI,CAAC;AAAA,EACrD;AAAA,EAEA,gBAAgB;AACd,WAAO,KAAK;AAAA,EACd;AACF;","names":[]}
@@ -0,0 +1,8 @@
1
+ export declare class FrameHost {
2
+ private frame;
3
+ private devToolsHost;
4
+ private messageListener;
5
+ constructor(frame: HTMLIFrameElement);
6
+ destroy(): void;
7
+ }
8
+ //# sourceMappingURL=FrameHost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FrameHost.d.ts","sourceRoot":"","sources":["../src/FrameHost.ts"],"names":[],"mappings":"AAEA,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,eAAe,CAAgC;gBAE3C,KAAK,EAAE,iBAAiB;IAmBpC,OAAO;CAIR"}
@@ -0,0 +1,28 @@
1
+ // src/FrameHost.ts
2
+ import { DevToolsHost } from "./DevToolsHost.js";
3
+ var FrameHost = class {
4
+ frame;
5
+ devToolsHost;
6
+ messageListener;
7
+ constructor(frame) {
8
+ this.frame = frame;
9
+ this.devToolsHost = new DevToolsHost((message) => {
10
+ if (this.frame.contentWindow) {
11
+ this.frame.contentWindow.postMessage(message, "*");
12
+ }
13
+ });
14
+ this.messageListener = (event) => {
15
+ if (event.source !== this.frame.contentWindow) return;
16
+ this.devToolsHost.onReceiveMessage(event.data);
17
+ };
18
+ window.addEventListener("message", this.messageListener);
19
+ }
20
+ destroy() {
21
+ window.removeEventListener("message", this.messageListener);
22
+ this.devToolsHost.destroy();
23
+ }
24
+ };
25
+ export {
26
+ FrameHost
27
+ };
28
+ //# sourceMappingURL=FrameHost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/FrameHost.ts"],"sourcesContent":["import { DevToolsHost } from \"./DevToolsHost\";\n\nexport class FrameHost {\n private frame: HTMLIFrameElement;\n private devToolsHost: DevToolsHost;\n private messageListener: (event: MessageEvent) => void;\n\n constructor(frame: HTMLIFrameElement) {\n this.frame = frame;\n\n // Create DevToolsHost with callback to send messages to iframe\n this.devToolsHost = new DevToolsHost((message) => {\n if (this.frame.contentWindow) {\n this.frame.contentWindow.postMessage(message, \"*\");\n }\n });\n\n // Setup listener to forward messages from iframe to DevToolsHost\n this.messageListener = (event: MessageEvent) => {\n if (event.source !== this.frame.contentWindow) return;\n this.devToolsHost.onReceiveMessage(event.data);\n };\n\n window.addEventListener(\"message\", this.messageListener);\n }\n\n destroy() {\n window.removeEventListener(\"message\", this.messageListener);\n this.devToolsHost.destroy();\n }\n}\n"],"mappings":";AAAA,SAAS,oBAAoB;AAEtB,IAAM,YAAN,MAAgB;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,OAA0B;AACpC,SAAK,QAAQ;AAGb,SAAK,eAAe,IAAI,aAAa,CAAC,YAAY;AAChD,UAAI,KAAK,MAAM,eAAe;AAC5B,aAAK,MAAM,cAAc,YAAY,SAAS,GAAG;AAAA,MACnD;AAAA,IACF,CAAC;AAGD,SAAK,kBAAkB,CAAC,UAAwB;AAC9C,UAAI,MAAM,WAAW,KAAK,MAAM,cAAe;AAC/C,WAAK,aAAa,iBAAiB,MAAM,IAAI;AAAA,IAC/C;AAEA,WAAO,iBAAiB,WAAW,KAAK,eAAe;AAAA,EACzD;AAAA,EAEA,UAAU;AACR,WAAO,oBAAoB,WAAW,KAAK,eAAe;AAC1D,SAAK,aAAa,QAAQ;AAAA,EAC5B;AACF;","names":[]}
@@ -0,0 +1,3 @@
1
+ export declare const DEFAULT_FRAME_URL = "https://devtools-frame.assistant-ui.com";
2
+ export declare const LOCAL_FRAME_URL = "http://localhost:3010";
3
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,4CAA4C,CAAC;AAC3E,eAAO,MAAM,eAAe,0BAA0B,CAAC"}
@@ -0,0 +1,8 @@
1
+ // src/constants.ts
2
+ var DEFAULT_FRAME_URL = "https://devtools-frame.assistant-ui.com";
3
+ var LOCAL_FRAME_URL = "http://localhost:3010";
4
+ export {
5
+ DEFAULT_FRAME_URL,
6
+ LOCAL_FRAME_URL
7
+ };
8
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts"],"sourcesContent":["export const DEFAULT_FRAME_URL = \"https://devtools-frame.assistant-ui.com\";\nexport const LOCAL_FRAME_URL = \"http://localhost:3010\";\n"],"mappings":";AAAO,IAAM,oBAAoB;AAC1B,IAAM,kBAAkB;","names":[]}
@@ -0,0 +1,11 @@
1
+ export { DevToolsModal } from "./DevToolsModal";
2
+ export { DevToolsFrame } from "./DevToolsFrame";
3
+ export { FrameHost } from "./FrameHost";
4
+ export { DevToolsHost } from "./DevToolsHost";
5
+ export { ExtensionHost } from "./ExtensionHost";
6
+ export { FrameClient } from "./FrameClient";
7
+ export { normalizeToolList, type NormalizedTool, } from "./utils/toolNormalization";
8
+ export { sanitizeForMessage, serializeModelContext, } from "./utils/serialization";
9
+ export type { SerializedModelContext, TabType, ViewMode } from "./types";
10
+ export * from "./constants";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EACL,iBAAiB,EACjB,KAAK,cAAc,GACpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EAAE,sBAAsB,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACzE,cAAc,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ // src/index.ts
2
+ import { DevToolsModal } from "./DevToolsModal.js";
3
+ import { DevToolsFrame } from "./DevToolsFrame.js";
4
+ import { FrameHost } from "./FrameHost.js";
5
+ import { DevToolsHost } from "./DevToolsHost.js";
6
+ import { ExtensionHost } from "./ExtensionHost.js";
7
+ import { FrameClient } from "./FrameClient.js";
8
+ import {
9
+ normalizeToolList
10
+ } from "./utils/toolNormalization.js";
11
+ import {
12
+ sanitizeForMessage,
13
+ serializeModelContext
14
+ } from "./utils/serialization.js";
15
+ export * from "./constants.js";
16
+ export {
17
+ DevToolsFrame,
18
+ DevToolsHost,
19
+ DevToolsModal,
20
+ ExtensionHost,
21
+ FrameClient,
22
+ FrameHost,
23
+ normalizeToolList,
24
+ sanitizeForMessage,
25
+ serializeModelContext
26
+ };
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { DevToolsModal } from \"./DevToolsModal\";\nexport { DevToolsFrame } from \"./DevToolsFrame\";\nexport { FrameHost } from \"./FrameHost\";\nexport { DevToolsHost } from \"./DevToolsHost\";\nexport { ExtensionHost } from \"./ExtensionHost\";\nexport { FrameClient } from \"./FrameClient\";\nexport {\n normalizeToolList,\n type NormalizedTool,\n} from \"./utils/toolNormalization\";\nexport {\n sanitizeForMessage,\n serializeModelContext,\n} from \"./utils/serialization\";\n// Export types\nexport type { SerializedModelContext, TabType, ViewMode } from \"./types\";\nexport * from \"./constants\";\n"],"mappings":";AAAA,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,iBAAiB;AAC1B,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAGP,cAAc;","names":[]}
@@ -0,0 +1,14 @@
1
+ import type { CSSProperties } from "react";
2
+ export interface DevToolsModalStyles {
3
+ floatingContainer: CSSProperties;
4
+ floatingButton: CSSProperties;
5
+ floatingButtonHover: CSSProperties;
6
+ backdrop: CSSProperties;
7
+ modal: CSSProperties;
8
+ dismissButton: CSSProperties;
9
+ dismissButtonHover: CSSProperties;
10
+ modalContent: CSSProperties;
11
+ }
12
+ export declare const getStyles: (darkMode: boolean) => DevToolsModalStyles;
13
+ export declare const ANIMATION_STYLES = "\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes slideIn {\n from {\n opacity: 0;\n transform: translate(-50%, -48%) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1);\n }\n }\n";
14
+ //# sourceMappingURL=DevToolsModal.styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevToolsModal.styles.d.ts","sourceRoot":"","sources":["../../src/styles/DevToolsModal.styles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,MAAM,WAAW,mBAAmB;IAClC,iBAAiB,EAAE,aAAa,CAAC;IACjC,cAAc,EAAE,aAAa,CAAC;IAC9B,mBAAmB,EAAE,aAAa,CAAC;IACnC,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,aAAa,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,kBAAkB,EAAE,aAAa,CAAC;IAClC,YAAY,EAAE,aAAa,CAAC;CAC7B;AA2BD,eAAO,MAAM,SAAS,GAAI,UAAU,OAAO,KAAG,mBAiF7C,CAAC;AAEF,eAAO,MAAM,gBAAgB,mSAe5B,CAAC"}
@@ -0,0 +1,121 @@
1
+ // src/styles/DevToolsModal.styles.ts
2
+ var COLORS = {
3
+ light: {
4
+ primary: "#2563EB",
5
+ background: "#f8fafc",
6
+ surface: "#ffffff",
7
+ text: "#111827",
8
+ textLight: "#6b7280",
9
+ border: "rgba(148, 163, 184, 0.35)",
10
+ shadow: "rgba(37, 99, 235, 0.35)",
11
+ buttonText: "#f9fafb",
12
+ hoverBg: "rgba(148, 163, 184, 0.18)"
13
+ },
14
+ dark: {
15
+ primary: "#111827",
16
+ background: "#09090b",
17
+ surface: "#09090b",
18
+ text: "#e5e7eb",
19
+ textLight: "#9ca3af",
20
+ border: "rgba(63, 63, 70, 0.6)",
21
+ shadow: "rgba(0, 0, 0, 0.55)",
22
+ buttonText: "#e5e7eb",
23
+ hoverBg: "rgba(148, 163, 184, 0.12)"
24
+ }
25
+ };
26
+ var getStyles = (darkMode) => {
27
+ const theme = darkMode ? COLORS.dark : COLORS.light;
28
+ return {
29
+ floatingContainer: {
30
+ position: "fixed",
31
+ bottom: "24px",
32
+ right: "24px",
33
+ zIndex: 2147483647
34
+ },
35
+ floatingButton: {
36
+ width: "42px",
37
+ height: "42px",
38
+ borderRadius: "9999px",
39
+ border: "none",
40
+ background: theme.primary,
41
+ color: theme.buttonText,
42
+ cursor: "pointer",
43
+ display: "flex",
44
+ alignItems: "center",
45
+ justifyContent: "center",
46
+ boxShadow: darkMode ? `0 10px 40px ${COLORS.dark.shadow}` : `0 10px 40px ${COLORS.light.shadow}`,
47
+ transition: "transform 0.2s ease, box-shadow 0.2s ease"
48
+ },
49
+ floatingButtonHover: {
50
+ transform: "translateY(-2px)",
51
+ boxShadow: darkMode ? "0 16px 50px rgba(17, 24, 39, 0.55)" : "0 16px 50px rgba(37, 99, 235, 0.45)"
52
+ },
53
+ backdrop: {
54
+ position: "fixed",
55
+ inset: 0,
56
+ background: "rgba(15, 23, 42, 0.45)",
57
+ backdropFilter: "blur(6px)",
58
+ animation: "fadeIn 0.12s ease",
59
+ zIndex: 2147483646
60
+ },
61
+ modal: {
62
+ position: "fixed",
63
+ top: "50%",
64
+ left: "50%",
65
+ transform: "translate(-50%, -50%)",
66
+ width: "min(960px, 90vw)",
67
+ height: "min(720px, 85vh)",
68
+ background: theme.background,
69
+ borderRadius: "16px",
70
+ border: `1px solid ${theme.border}`,
71
+ boxShadow: darkMode ? "0 32px 120px rgba(0, 0, 0, 0.55)" : "0 32px 120px rgba(15, 23, 42, 0.35)",
72
+ display: "flex",
73
+ flexDirection: "column",
74
+ overflow: "hidden",
75
+ animation: "slideIn 0.16s ease",
76
+ zIndex: 2147483647
77
+ },
78
+ dismissButton: {
79
+ alignSelf: "flex-end",
80
+ margin: "10px 12px 0 0",
81
+ background: "transparent",
82
+ border: "none",
83
+ color: theme.textLight,
84
+ cursor: "pointer",
85
+ padding: "6px",
86
+ borderRadius: "6px",
87
+ transition: "background 0.2s ease, color 0.2s ease"
88
+ },
89
+ dismissButtonHover: {
90
+ background: theme.hoverBg,
91
+ color: theme.text
92
+ },
93
+ modalContent: {
94
+ flex: 1,
95
+ overflow: "hidden",
96
+ position: "relative",
97
+ background: theme.background
98
+ }
99
+ };
100
+ };
101
+ var ANIMATION_STYLES = `
102
+ @keyframes fadeIn {
103
+ from { opacity: 0; }
104
+ to { opacity: 1; }
105
+ }
106
+ @keyframes slideIn {
107
+ from {
108
+ opacity: 0;
109
+ transform: translate(-50%, -48%) scale(0.95);
110
+ }
111
+ to {
112
+ opacity: 1;
113
+ transform: translate(-50%, -50%) scale(1);
114
+ }
115
+ }
116
+ `;
117
+ export {
118
+ ANIMATION_STYLES,
119
+ getStyles
120
+ };
121
+ //# sourceMappingURL=DevToolsModal.styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/styles/DevToolsModal.styles.ts"],"sourcesContent":["import type { CSSProperties } from \"react\";\n\nexport interface DevToolsModalStyles {\n floatingContainer: CSSProperties;\n floatingButton: CSSProperties;\n floatingButtonHover: CSSProperties;\n backdrop: CSSProperties;\n modal: CSSProperties;\n dismissButton: CSSProperties;\n dismissButtonHover: CSSProperties;\n modalContent: CSSProperties;\n}\n\nconst COLORS = {\n light: {\n primary: \"#2563EB\",\n background: \"#f8fafc\",\n surface: \"#ffffff\",\n text: \"#111827\",\n textLight: \"#6b7280\",\n border: \"rgba(148, 163, 184, 0.35)\",\n shadow: \"rgba(37, 99, 235, 0.35)\",\n buttonText: \"#f9fafb\",\n hoverBg: \"rgba(148, 163, 184, 0.18)\",\n },\n dark: {\n primary: \"#111827\",\n background: \"#09090b\",\n surface: \"#09090b\",\n text: \"#e5e7eb\",\n textLight: \"#9ca3af\",\n border: \"rgba(63, 63, 70, 0.6)\",\n shadow: \"rgba(0, 0, 0, 0.55)\",\n buttonText: \"#e5e7eb\",\n hoverBg: \"rgba(148, 163, 184, 0.12)\",\n },\n} as const;\n\nexport const getStyles = (darkMode: boolean): DevToolsModalStyles => {\n const theme = darkMode ? COLORS.dark : COLORS.light;\n\n return {\n floatingContainer: {\n position: \"fixed\",\n bottom: \"24px\",\n right: \"24px\",\n zIndex: 2147483647,\n },\n floatingButton: {\n width: \"42px\",\n height: \"42px\",\n borderRadius: \"9999px\",\n border: \"none\",\n background: theme.primary,\n color: theme.buttonText,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: darkMode\n ? `0 10px 40px ${COLORS.dark.shadow}`\n : `0 10px 40px ${COLORS.light.shadow}`,\n transition: \"transform 0.2s ease, box-shadow 0.2s ease\",\n },\n floatingButtonHover: {\n transform: \"translateY(-2px)\",\n boxShadow: darkMode\n ? \"0 16px 50px rgba(17, 24, 39, 0.55)\"\n : \"0 16px 50px rgba(37, 99, 235, 0.45)\",\n },\n backdrop: {\n position: \"fixed\",\n inset: 0,\n background: \"rgba(15, 23, 42, 0.45)\",\n backdropFilter: \"blur(6px)\",\n animation: \"fadeIn 0.12s ease\",\n zIndex: 2147483646,\n },\n modal: {\n position: \"fixed\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n width: \"min(960px, 90vw)\",\n height: \"min(720px, 85vh)\",\n background: theme.background,\n borderRadius: \"16px\",\n border: `1px solid ${theme.border}`,\n boxShadow: darkMode\n ? \"0 32px 120px rgba(0, 0, 0, 0.55)\"\n : \"0 32px 120px rgba(15, 23, 42, 0.35)\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n animation: \"slideIn 0.16s ease\",\n zIndex: 2147483647,\n },\n dismissButton: {\n alignSelf: \"flex-end\",\n margin: \"10px 12px 0 0\",\n background: \"transparent\",\n border: \"none\",\n color: theme.textLight,\n cursor: \"pointer\",\n padding: \"6px\",\n borderRadius: \"6px\",\n transition: \"background 0.2s ease, color 0.2s ease\",\n },\n dismissButtonHover: {\n background: theme.hoverBg,\n color: theme.text,\n },\n modalContent: {\n flex: 1,\n overflow: \"hidden\",\n position: \"relative\",\n background: theme.background,\n },\n };\n};\n\nexport const ANIMATION_STYLES = `\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes slideIn {\n from {\n opacity: 0;\n transform: translate(-50%, -48%) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1);\n }\n }\n`;\n"],"mappings":";AAaA,IAAM,SAAS;AAAA,EACb,OAAO;AAAA,IACL,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,MAAM;AAAA,IACN,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,SAAS;AAAA,EACX;AAAA,EACA,MAAM;AAAA,IACJ,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,MAAM;AAAA,IACN,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,SAAS;AAAA,EACX;AACF;AAEO,IAAM,YAAY,CAAC,aAA2C;AACnE,QAAM,QAAQ,WAAW,OAAO,OAAO,OAAO;AAE9C,SAAO;AAAA,IACL,mBAAmB;AAAA,MACjB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,IACA,gBAAgB;AAAA,MACd,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,YAAY,MAAM;AAAA,MAClB,OAAO,MAAM;AAAA,MACb,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,WAAW,WACP,eAAe,OAAO,KAAK,MAAM,KACjC,eAAe,OAAO,MAAM,MAAM;AAAA,MACtC,YAAY;AAAA,IACd;AAAA,IACA,qBAAqB;AAAA,MACnB,WAAW;AAAA,MACX,WAAW,WACP,uCACA;AAAA,IACN;AAAA,IACA,UAAU;AAAA,MACR,UAAU;AAAA,MACV,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,WAAW;AAAA,MACX,QAAQ;AAAA,IACV;AAAA,IACA,OAAO;AAAA,MACL,UAAU;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,MACN,WAAW;AAAA,MACX,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,YAAY,MAAM;AAAA,MAClB,cAAc;AAAA,MACd,QAAQ,aAAa,MAAM,MAAM;AAAA,MACjC,WAAW,WACP,qCACA;AAAA,MACJ,SAAS;AAAA,MACT,eAAe;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,QAAQ;AAAA,IACV;AAAA,IACA,eAAe;AAAA,MACb,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,OAAO,MAAM;AAAA,MACb,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,cAAc;AAAA,MACd,YAAY;AAAA,IACd;AAAA,IACA,oBAAoB;AAAA,MAClB,YAAY,MAAM;AAAA,MAClB,OAAO,MAAM;AAAA,IACf;AAAA,IACA,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY,MAAM;AAAA,IACpB;AAAA,EACF;AACF;AAEO,IAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;","names":[]}
@@ -0,0 +1,10 @@
1
+ import type { NormalizedTool } from "./utils/toolNormalization";
2
+ export type TabType = "state" | "events" | "context";
3
+ export type ViewMode = "raw" | "preview";
4
+ export interface SerializedModelContext {
5
+ system?: string;
6
+ tools?: NormalizedTool[];
7
+ callSettings?: Record<string, unknown>;
8
+ config?: Record<string, unknown>;
9
+ }
10
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGhE,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;AACrD,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAGzC,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC"}
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,5 @@
1
+ import { ModelContext } from "@assistant-ui/react";
2
+ import type { SerializedModelContext } from "../types";
3
+ export declare const sanitizeForMessage: (value: unknown, seen?: WeakSet<object>) => unknown;
4
+ export declare const serializeModelContext: (context: ModelContext | undefined) => SerializedModelContext | undefined;
5
+ //# sourceMappingURL=serialization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../../src/utils/serialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAGvD,eAAO,MAAM,kBAAkB,GAC7B,OAAO,OAAO,EACd,sBAA4B,KAC3B,OA6CF,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,SAAS,YAAY,GAAG,SAAS,KAChC,sBAAsB,GAAG,SAwC3B,CAAC"}
@@ -0,0 +1,77 @@
1
+ // src/utils/serialization.ts
2
+ import { normalizeToolList } from "./toolNormalization.js";
3
+ var sanitizeForMessage = (value, seen = /* @__PURE__ */ new WeakSet()) => {
4
+ if (value === null || value === void 0) return value;
5
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
6
+ return value;
7
+ }
8
+ if (typeof value === "function") {
9
+ return "[Function]";
10
+ }
11
+ if (value instanceof Date) {
12
+ return value.toISOString();
13
+ }
14
+ if (value instanceof Map) {
15
+ const result = {};
16
+ for (const [key, entry] of value.entries()) {
17
+ result[String(key)] = sanitizeForMessage(entry, seen);
18
+ }
19
+ return result;
20
+ }
21
+ if (value instanceof Set) {
22
+ return Array.from(value).map((entry) => sanitizeForMessage(entry, seen));
23
+ }
24
+ if (Array.isArray(value)) {
25
+ if (seen.has(value)) return "[Circular]";
26
+ seen.add(value);
27
+ return value.map((entry) => sanitizeForMessage(entry, seen)).filter((item) => item !== void 0);
28
+ }
29
+ if (typeof value === "object") {
30
+ if (seen.has(value)) return "[Circular]";
31
+ seen.add(value);
32
+ const result = {};
33
+ for (const [key, entry] of Object.entries(
34
+ value
35
+ )) {
36
+ result[key] = sanitizeForMessage(entry, seen);
37
+ }
38
+ return result;
39
+ }
40
+ return value;
41
+ };
42
+ var serializeModelContext = (context) => {
43
+ if (!context || typeof context !== "object") {
44
+ return void 0;
45
+ }
46
+ const modelContext = context;
47
+ const result = {};
48
+ const systemValue = modelContext["system"];
49
+ if (typeof systemValue === "string" && systemValue.length > 0) {
50
+ result.system = systemValue;
51
+ }
52
+ const tools = normalizeToolList(modelContext["tools"]);
53
+ if (tools.length > 0) {
54
+ result.tools = tools.map((tool) => ({
55
+ ...tool,
56
+ parameters: sanitizeForMessage(tool.parameters)
57
+ }));
58
+ }
59
+ if (modelContext["callSettings"] !== void 0) {
60
+ const callSettings = sanitizeForMessage(modelContext["callSettings"]);
61
+ if (callSettings && typeof callSettings === "object" && !Array.isArray(callSettings)) {
62
+ result.callSettings = callSettings;
63
+ }
64
+ }
65
+ if (modelContext["config"] !== void 0) {
66
+ const config = sanitizeForMessage(modelContext["config"]);
67
+ if (config && typeof config === "object" && !Array.isArray(config)) {
68
+ result.config = config;
69
+ }
70
+ }
71
+ return Object.keys(result).length > 0 ? result : void 0;
72
+ };
73
+ export {
74
+ sanitizeForMessage,
75
+ serializeModelContext
76
+ };
77
+ //# sourceMappingURL=serialization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/serialization.ts"],"sourcesContent":["import { ModelContext } from \"@assistant-ui/react\";\nimport type { SerializedModelContext } from \"../types\";\nimport { normalizeToolList } from \"./toolNormalization\";\n\nexport const sanitizeForMessage = (\n value: unknown,\n seen = new WeakSet<object>(),\n): unknown => {\n // Early return for primitives\n if (value === null || value === undefined) return value;\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (typeof value === \"function\") {\n return \"[Function]\";\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (value instanceof Map) {\n const result: Record<string, unknown> = {};\n for (const [key, entry] of value.entries()) {\n result[String(key)] = sanitizeForMessage(entry, seen);\n }\n return result;\n }\n if (value instanceof Set) {\n return Array.from(value).map((entry) => sanitizeForMessage(entry, seen));\n }\n if (Array.isArray(value)) {\n if (seen.has(value as unknown as object)) return \"[Circular]\";\n seen.add(value as unknown as object);\n return value\n .map((entry) => sanitizeForMessage(entry, seen))\n .filter((item) => item !== undefined);\n }\n if (typeof value === \"object\") {\n if (seen.has(value as object)) return \"[Circular]\";\n seen.add(value as object);\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(\n value as Record<string, unknown>,\n )) {\n result[key] = sanitizeForMessage(entry, seen);\n }\n return result;\n }\n return value;\n};\n\nexport const serializeModelContext = (\n context: ModelContext | undefined,\n): SerializedModelContext | undefined => {\n if (!context || typeof context !== \"object\") {\n return undefined;\n }\n\n const modelContext = context as Record<string, unknown>;\n const result: SerializedModelContext = {};\n\n const systemValue = modelContext[\"system\"];\n if (typeof systemValue === \"string\" && systemValue.length > 0) {\n result.system = systemValue;\n }\n\n const tools = normalizeToolList(modelContext[\"tools\"]);\n if (tools.length > 0) {\n result.tools = tools.map((tool) => ({\n ...tool,\n parameters: sanitizeForMessage(tool.parameters),\n }));\n }\n\n if (modelContext[\"callSettings\"] !== undefined) {\n const callSettings = sanitizeForMessage(modelContext[\"callSettings\"]);\n if (\n callSettings &&\n typeof callSettings === \"object\" &&\n !Array.isArray(callSettings)\n ) {\n result.callSettings = callSettings as Record<string, unknown>;\n }\n }\n\n if (modelContext[\"config\"] !== undefined) {\n const config = sanitizeForMessage(modelContext[\"config\"]);\n if (config && typeof config === \"object\" && !Array.isArray(config)) {\n result.config = config as Record<string, unknown>;\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n};\n"],"mappings":";AAEA,SAAS,yBAAyB;AAE3B,IAAM,qBAAqB,CAChC,OACA,OAAO,oBAAI,QAAgB,MACf;AAEZ,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,MACE,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,YAAY;AAC/B,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,MAAM;AACzB,WAAO,MAAM,YAAY;AAAA,EAC3B;AACA,MAAI,iBAAiB,KAAK;AACxB,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,MAAM,QAAQ,GAAG;AAC1C,aAAO,OAAO,GAAG,CAAC,IAAI,mBAAmB,OAAO,IAAI;AAAA,IACtD;AACA,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,KAAK;AACxB,WAAO,MAAM,KAAK,KAAK,EAAE,IAAI,CAAC,UAAU,mBAAmB,OAAO,IAAI,CAAC;AAAA,EACzE;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,QAAI,KAAK,IAAI,KAA0B,EAAG,QAAO;AACjD,SAAK,IAAI,KAA0B;AACnC,WAAO,MACJ,IAAI,CAAC,UAAU,mBAAmB,OAAO,IAAI,CAAC,EAC9C,OAAO,CAAC,SAAS,SAAS,MAAS;AAAA,EACxC;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,KAAK,IAAI,KAAe,EAAG,QAAO;AACtC,SAAK,IAAI,KAAe;AACxB,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO;AAAA,MAChC;AAAA,IACF,GAAG;AACD,aAAO,GAAG,IAAI,mBAAmB,OAAO,IAAI;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,IAAM,wBAAwB,CACnC,YACuC;AACvC,MAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,eAAe;AACrB,QAAM,SAAiC,CAAC;AAExC,QAAM,cAAc,aAAa,QAAQ;AACzC,MAAI,OAAO,gBAAgB,YAAY,YAAY,SAAS,GAAG;AAC7D,WAAO,SAAS;AAAA,EAClB;AAEA,QAAM,QAAQ,kBAAkB,aAAa,OAAO,CAAC;AACrD,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO,QAAQ,MAAM,IAAI,CAAC,UAAU;AAAA,MAClC,GAAG;AAAA,MACH,YAAY,mBAAmB,KAAK,UAAU;AAAA,IAChD,EAAE;AAAA,EACJ;AAEA,MAAI,aAAa,cAAc,MAAM,QAAW;AAC9C,UAAM,eAAe,mBAAmB,aAAa,cAAc,CAAC;AACpE,QACE,gBACA,OAAO,iBAAiB,YACxB,CAAC,MAAM,QAAQ,YAAY,GAC3B;AACA,aAAO,eAAe;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,aAAa,QAAQ,MAAM,QAAW;AACxC,UAAM,SAAS,mBAAmB,aAAa,QAAQ,CAAC;AACxD,QAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAClE,aAAO,SAAS;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AACnD;","names":[]}
@@ -0,0 +1,9 @@
1
+ export type NormalizedTool = {
2
+ name: string;
3
+ type?: string;
4
+ description?: string;
5
+ disabled?: boolean;
6
+ parameters?: unknown;
7
+ };
8
+ export declare const normalizeToolList: (value: unknown) => NormalizedTool[];
9
+ //# sourceMappingURL=toolNormalization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolNormalization.d.ts","sourceRoot":"","sources":["../../src/utils/toolNormalization.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AA0CF,eAAO,MAAM,iBAAiB,GAAI,OAAO,OAAO,KAAG,cAAc,EAgChE,CAAC"}
@@ -0,0 +1,58 @@
1
+ // src/utils/toolNormalization.ts
2
+ import { z } from "zod";
3
+ var isRecord = (value) => value !== null && typeof value === "object";
4
+ var toJsonSchema = (value) => {
5
+ if (value instanceof z.ZodType) {
6
+ try {
7
+ return z.toJSONSchema(value);
8
+ } catch {
9
+ return value;
10
+ }
11
+ }
12
+ return value;
13
+ };
14
+ var mapToNormalizedTool = (name, raw) => {
15
+ const tool = { name };
16
+ if (typeof raw["type"] === "string") {
17
+ tool.type = raw["type"];
18
+ }
19
+ if (typeof raw["description"] === "string") {
20
+ tool.description = raw["description"];
21
+ }
22
+ if (typeof raw["disabled"] === "boolean") {
23
+ tool.disabled = raw["disabled"];
24
+ }
25
+ if (Object.prototype.hasOwnProperty.call(raw, "parameters")) {
26
+ tool.parameters = toJsonSchema(raw["parameters"]);
27
+ }
28
+ return tool;
29
+ };
30
+ var normalizeToolList = (value) => {
31
+ if (!value || typeof value !== "object") {
32
+ return [];
33
+ }
34
+ if (Array.isArray(value)) {
35
+ const tools = [];
36
+ for (const entry of value) {
37
+ if (!isRecord(entry) || typeof entry["name"] !== "string") continue;
38
+ tools.push(mapToNormalizedTool(entry["name"], entry));
39
+ }
40
+ return tools;
41
+ }
42
+ if (isRecord(value)) {
43
+ const tools = [];
44
+ for (const [name, entry] of Object.entries(value)) {
45
+ if (!isRecord(entry)) {
46
+ tools.push({ name });
47
+ continue;
48
+ }
49
+ tools.push(mapToNormalizedTool(name, entry));
50
+ }
51
+ return tools;
52
+ }
53
+ return [];
54
+ };
55
+ export {
56
+ normalizeToolList
57
+ };
58
+ //# sourceMappingURL=toolNormalization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/toolNormalization.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport type NormalizedTool = {\n name: string;\n type?: string;\n description?: string;\n disabled?: boolean;\n parameters?: unknown;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\";\n\nconst toJsonSchema = (value: unknown): unknown => {\n if (value instanceof z.ZodType) {\n try {\n return z.toJSONSchema(value);\n } catch {\n return value;\n }\n }\n\n return value;\n};\n\nconst mapToNormalizedTool = (\n name: string,\n raw: Record<string, unknown>,\n): NormalizedTool => {\n const tool: NormalizedTool = { name };\n\n if (typeof raw[\"type\"] === \"string\") {\n tool.type = raw[\"type\"] as string;\n }\n\n if (typeof raw[\"description\"] === \"string\") {\n tool.description = raw[\"description\"] as string;\n }\n\n if (typeof raw[\"disabled\"] === \"boolean\") {\n tool.disabled = raw[\"disabled\"] as boolean;\n }\n\n if (Object.prototype.hasOwnProperty.call(raw, \"parameters\")) {\n tool.parameters = toJsonSchema(raw[\"parameters\"]);\n }\n\n return tool;\n};\n\nexport const normalizeToolList = (value: unknown): NormalizedTool[] => {\n if (!value || typeof value !== \"object\") {\n return [];\n }\n\n if (Array.isArray(value)) {\n const tools: NormalizedTool[] = [];\n\n for (const entry of value) {\n if (!isRecord(entry) || typeof entry[\"name\"] !== \"string\") continue;\n tools.push(mapToNormalizedTool(entry[\"name\"] as string, entry));\n }\n\n return tools;\n }\n\n if (isRecord(value)) {\n const tools: NormalizedTool[] = [];\n\n for (const [name, entry] of Object.entries(value)) {\n if (!isRecord(entry)) {\n tools.push({ name });\n continue;\n }\n\n tools.push(mapToNormalizedTool(name, entry));\n }\n\n return tools;\n }\n\n return [];\n};\n"],"mappings":";AAAA,SAAS,SAAS;AAUlB,IAAM,WAAW,CAAC,UAChB,UAAU,QAAQ,OAAO,UAAU;AAErC,IAAM,eAAe,CAAC,UAA4B;AAChD,MAAI,iBAAiB,EAAE,SAAS;AAC9B,QAAI;AACF,aAAO,EAAE,aAAa,KAAK;AAAA,IAC7B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,sBAAsB,CAC1B,MACA,QACmB;AACnB,QAAM,OAAuB,EAAE,KAAK;AAEpC,MAAI,OAAO,IAAI,MAAM,MAAM,UAAU;AACnC,SAAK,OAAO,IAAI,MAAM;AAAA,EACxB;AAEA,MAAI,OAAO,IAAI,aAAa,MAAM,UAAU;AAC1C,SAAK,cAAc,IAAI,aAAa;AAAA,EACtC;AAEA,MAAI,OAAO,IAAI,UAAU,MAAM,WAAW;AACxC,SAAK,WAAW,IAAI,UAAU;AAAA,EAChC;AAEA,MAAI,OAAO,UAAU,eAAe,KAAK,KAAK,YAAY,GAAG;AAC3D,SAAK,aAAa,aAAa,IAAI,YAAY,CAAC;AAAA,EAClD;AAEA,SAAO;AACT;AAEO,IAAM,oBAAoB,CAAC,UAAqC;AACrE,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,QAA0B,CAAC;AAEjC,eAAW,SAAS,OAAO;AACzB,UAAI,CAAC,SAAS,KAAK,KAAK,OAAO,MAAM,MAAM,MAAM,SAAU;AAC3D,YAAM,KAAK,oBAAoB,MAAM,MAAM,GAAa,KAAK,CAAC;AAAA,IAChE;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,KAAK,GAAG;AACnB,UAAM,QAA0B,CAAC;AAEjC,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AACjD,UAAI,CAAC,SAAS,KAAK,GAAG;AACpB,cAAM,KAAK,EAAE,KAAK,CAAC;AACnB;AAAA,MACF;AAEA,YAAM,KAAK,oBAAoB,MAAM,KAAK,CAAC;AAAA,IAC7C;AAEA,WAAO;AAAA,EACT;AAEA,SAAO,CAAC;AACV;","names":[]}
package/package.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "@assistant-ui/react-devtools",
3
+ "description": "React development tools for assistant-ui components",
4
+ "keywords": [
5
+ "assistant-ui",
6
+ "devtools",
7
+ "react",
8
+ "development",
9
+ "debugging"
10
+ ],
11
+ "version": "0.1.1",
12
+ "license": "MIT",
13
+ "type": "module",
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "default": "./dist/index.js"
18
+ }
19
+ },
20
+ "source": "./src/index.ts",
21
+ "main": "./dist/index.js",
22
+ "types": "./dist/index.d.ts",
23
+ "files": [
24
+ "dist",
25
+ "src",
26
+ "README.md"
27
+ ],
28
+ "sideEffects": false,
29
+ "dependencies": {
30
+ "zod": "^4.1.5"
31
+ },
32
+ "peerDependencies": {
33
+ "@assistant-ui/react": "*",
34
+ "@assistant-ui/tap": "*",
35
+ "@types/react": "*",
36
+ "@types/react-dom": "*",
37
+ "react": "^18 || ^19 || ^19.0.0-rc",
38
+ "react-dom": "^18 || ^19 || ^19.0.0-rc"
39
+ },
40
+ "peerDependenciesMeta": {
41
+ "@types/react": {
42
+ "optional": true
43
+ },
44
+ "@types/react-dom": {
45
+ "optional": true
46
+ }
47
+ },
48
+ "devDependencies": {
49
+ "@types/node": "^24.3.0",
50
+ "eslint": "^9",
51
+ "eslint-config-next": "15.4.6",
52
+ "tsx": "^4.20.4",
53
+ "vitest": "^3.2.4",
54
+ "@assistant-ui/tap": "0.1.1",
55
+ "@assistant-ui/react": "0.11.19",
56
+ "@assistant-ui/x-buildutils": "0.0.1"
57
+ },
58
+ "publishConfig": {
59
+ "access": "public",
60
+ "provenance": true
61
+ },
62
+ "homepage": "https://www.assistant-ui.com/",
63
+ "repository": {
64
+ "type": "git",
65
+ "url": "https://github.com/assistant-ui/assistant-ui/tree/main/packages/react-devtools"
66
+ },
67
+ "bugs": {
68
+ "url": "https://github.com/assistant-ui/assistant-ui/issues"
69
+ },
70
+ "scripts": {
71
+ "build": "tsx scripts/build.mts",
72
+ "build:lib": "tsx scripts/build-lib.mts",
73
+ "dev": "tsx scripts/build.mts --watch",
74
+ "lint": "eslint ."
75
+ }
76
+ }