skybridge 0.0.0-dev.d798b8b → 0.0.0-dev.d8535f2

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 (98) hide show
  1. package/README.md +74 -2
  2. package/dist/src/server/server.d.ts +1 -0
  3. package/dist/src/server/server.js +15 -6
  4. package/dist/src/server/server.js.map +1 -1
  5. package/dist/src/server/templateHelper.d.ts +9 -8
  6. package/dist/src/server/templateHelper.js +0 -8
  7. package/dist/src/server/templateHelper.js.map +1 -1
  8. package/dist/src/server/templates/development.hbs +1 -0
  9. package/dist/src/server/templates/production.hbs +3 -2
  10. package/dist/src/test/widget.test.js +23 -2
  11. package/dist/src/test/widget.test.js.map +1 -1
  12. package/dist/src/web/hooks/index.d.ts +13 -0
  13. package/dist/src/web/hooks/index.js +14 -0
  14. package/dist/src/web/hooks/index.js.map +1 -0
  15. package/dist/src/web/{use-call-tool.d.ts → hooks/use-call-tool.d.ts} +9 -9
  16. package/dist/src/web/hooks/use-call-tool.js +44 -0
  17. package/dist/src/web/hooks/use-call-tool.js.map +1 -0
  18. package/dist/src/web/hooks/use-call-tool.test.js.map +1 -0
  19. package/dist/src/web/hooks/use-display-mode.d.ts +4 -0
  20. package/dist/src/web/hooks/use-display-mode.js +7 -0
  21. package/dist/src/web/hooks/use-display-mode.js.map +1 -0
  22. package/dist/src/web/hooks/use-display-mode.test.d.ts +1 -0
  23. package/dist/src/web/hooks/use-display-mode.test.js +40 -0
  24. package/dist/src/web/hooks/use-display-mode.test.js.map +1 -0
  25. package/dist/src/web/hooks/use-locale.d.ts +1 -0
  26. package/dist/src/web/hooks/use-locale.js +5 -0
  27. package/dist/src/web/hooks/use-locale.js.map +1 -0
  28. package/dist/src/web/hooks/use-locale.test.d.ts +1 -0
  29. package/dist/src/web/hooks/use-locale.test.js +21 -0
  30. package/dist/src/web/hooks/use-locale.test.js.map +1 -0
  31. package/dist/src/web/hooks/use-open-external.d.ts +1 -0
  32. package/dist/src/web/hooks/use-open-external.js +6 -0
  33. package/dist/src/web/hooks/use-open-external.js.map +1 -0
  34. package/dist/src/web/hooks/use-open-external.test.d.ts +1 -0
  35. package/dist/src/web/hooks/use-open-external.test.js +24 -0
  36. package/dist/src/web/hooks/use-open-external.test.js.map +1 -0
  37. package/dist/src/web/{use-openai-global.d.ts → hooks/use-openai-global.d.ts} +1 -1
  38. package/dist/src/web/{use-openai-global.js → hooks/use-openai-global.js} +4 -2
  39. package/dist/src/web/hooks/use-openai-global.js.map +1 -0
  40. package/dist/src/web/hooks/use-request-modal.d.ts +5 -0
  41. package/dist/src/web/hooks/use-request-modal.js +9 -0
  42. package/dist/src/web/hooks/use-request-modal.js.map +1 -0
  43. package/dist/src/web/hooks/use-request-modal.test.d.ts +1 -0
  44. package/dist/src/web/hooks/use-request-modal.test.js +24 -0
  45. package/dist/src/web/hooks/use-request-modal.test.js.map +1 -0
  46. package/dist/src/web/hooks/use-send-follow-up-message.d.ts +1 -0
  47. package/dist/src/web/hooks/use-send-follow-up-message.js +11 -0
  48. package/dist/src/web/hooks/use-send-follow-up-message.js.map +1 -0
  49. package/dist/src/web/hooks/use-theme.d.ts +1 -0
  50. package/dist/src/web/hooks/use-theme.js +5 -0
  51. package/dist/src/web/hooks/use-theme.js.map +1 -0
  52. package/dist/src/web/hooks/use-theme.test.d.ts +1 -0
  53. package/dist/src/web/hooks/use-theme.test.js +26 -0
  54. package/dist/src/web/hooks/use-theme.test.js.map +1 -0
  55. package/dist/src/web/hooks/use-tool-info.d.ts +18 -0
  56. package/dist/src/web/hooks/use-tool-info.js +21 -0
  57. package/dist/src/web/hooks/use-tool-info.js.map +1 -0
  58. package/dist/src/web/hooks/use-tool-info.test.d.ts +1 -0
  59. package/dist/src/web/hooks/use-tool-info.test.js +58 -0
  60. package/dist/src/web/hooks/use-tool-info.test.js.map +1 -0
  61. package/dist/src/web/hooks/use-tool-output.d.ts +4 -0
  62. package/dist/src/web/hooks/use-tool-output.js +9 -0
  63. package/dist/src/web/hooks/use-tool-output.js.map +1 -0
  64. package/dist/src/web/hooks/use-tool-response-metadata.d.ts +4 -0
  65. package/dist/src/web/hooks/use-tool-response-metadata.js +8 -0
  66. package/dist/src/web/hooks/use-tool-response-metadata.js.map +1 -0
  67. package/dist/src/web/hooks/use-user-agent.d.ts +1 -0
  68. package/dist/src/web/hooks/use-user-agent.js +5 -0
  69. package/dist/src/web/hooks/use-user-agent.js.map +1 -0
  70. package/dist/src/web/hooks/use-user-agent.test.d.ts +1 -0
  71. package/dist/src/web/hooks/use-user-agent.test.js +31 -0
  72. package/dist/src/web/hooks/use-user-agent.test.js.map +1 -0
  73. package/dist/src/web/hooks/use-widget-state.d.ts +4 -0
  74. package/dist/src/web/hooks/use-widget-state.js +30 -0
  75. package/dist/src/web/hooks/use-widget-state.js.map +1 -0
  76. package/dist/src/web/hooks/use-widget-state.test.d.ts +1 -0
  77. package/dist/src/web/hooks/use-widget-state.test.js +61 -0
  78. package/dist/src/web/hooks/use-widget-state.test.js.map +1 -0
  79. package/dist/src/web/index.d.ts +1 -4
  80. package/dist/src/web/index.js +1 -4
  81. package/dist/src/web/index.js.map +1 -1
  82. package/dist/src/web/plugin.js +2 -4
  83. package/dist/src/web/plugin.js.map +1 -1
  84. package/dist/src/web/types.d.ts +11 -3
  85. package/dist/src/web/types.js.map +1 -1
  86. package/package.json +7 -2
  87. package/dist/src/web/use-call-tool.js +0 -67
  88. package/dist/src/web/use-call-tool.js.map +0 -1
  89. package/dist/src/web/use-call-tool.test.js.map +0 -1
  90. package/dist/src/web/use-openai-global.js.map +0 -1
  91. package/dist/src/web/use-tool-output.d.ts +0 -3
  92. package/dist/src/web/use-tool-output.js +0 -5
  93. package/dist/src/web/use-tool-output.js.map +0 -1
  94. package/dist/src/web/use-tool-response-metadata.d.ts +0 -3
  95. package/dist/src/web/use-tool-response-metadata.js +0 -5
  96. package/dist/src/web/use-tool-response-metadata.js.map +0 -1
  97. /package/dist/src/web/{use-call-tool.test.d.ts → hooks/use-call-tool.test.d.ts} +0 -0
  98. /package/dist/src/web/{use-call-tool.test.js → hooks/use-call-tool.test.js} +0 -0
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Triggers a modal containing the widget rendered in display mode "modal"
3
+ */
4
+ export function useRequestModal() {
5
+ return (options) => {
6
+ window.openai.requestModal(options);
7
+ };
8
+ }
9
+ //# sourceMappingURL=use-request-modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-request-modal.js","sourceRoot":"","sources":["../../../../src/web/hooks/use-request-modal.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,OAA4B,EAAE,EAAE;QACtC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,24 @@
1
+ import { useRequestModal } from "./use-request-modal.js";
2
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
3
+ import { renderHook } from "@testing-library/react";
4
+ describe("useRequestModal", () => {
5
+ let requestModalMock;
6
+ beforeEach(() => {
7
+ requestModalMock = vi.fn();
8
+ vi.stubGlobal("openai", {
9
+ requestModal: requestModalMock,
10
+ });
11
+ });
12
+ afterEach(() => {
13
+ vi.unstubAllGlobals();
14
+ vi.resetAllMocks();
15
+ });
16
+ it("should return a function that calls window.openai.requestModal with the options", () => {
17
+ const { result } = renderHook(() => useRequestModal());
18
+ const options = { title: "Test Modal" };
19
+ result.current(options);
20
+ expect(requestModalMock).toHaveBeenCalledTimes(1);
21
+ expect(requestModalMock).toHaveBeenCalledWith(options);
22
+ });
23
+ });
24
+ //# sourceMappingURL=use-request-modal.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-request-modal.test.js","sourceRoot":"","sources":["../../../../src/web/hooks/use-request-modal.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,gBAA0C,CAAC;IAE/C,UAAU,CAAC,GAAG,EAAE;QACd,gBAAgB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE;YACtB,YAAY,EAAE,gBAAgB;SAC/B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACtB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACzF,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;QAEvD,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QACxC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAExB,MAAM,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function useSendFollowUpMessage(): (prompt: string) => Promise<void>;
@@ -0,0 +1,11 @@
1
+ import { useCallback } from "react";
2
+ export function useSendFollowUpMessage() {
3
+ const sendFollowUpMessage = useCallback(async (prompt) => {
4
+ if (!window.openai?.sendFollowUpMessage) {
5
+ throw new Error("window.openai.sendFollowUpMessage is not available");
6
+ }
7
+ return window.openai.sendFollowUpMessage({ prompt });
8
+ }, []);
9
+ return sendFollowUpMessage;
10
+ }
11
+ //# sourceMappingURL=use-send-follow-up-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-send-follow-up-message.js","sourceRoot":"","sources":["../../../../src/web/hooks/use-send-follow-up-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEpC,MAAM,UAAU,sBAAsB;IACpC,MAAM,mBAAmB,GAAG,WAAW,CACrC,KAAK,EAAE,MAAc,EAAiB,EAAE;QACtC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC,EACD,EAAE,CACH,CAAC;IAEF,OAAO,mBAAmB,CAAC;AAC7B,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function useTheme(): import("../types.js").Theme;
@@ -0,0 +1,5 @@
1
+ import { useOpenAiGlobal } from "./use-openai-global.js";
2
+ export function useTheme() {
3
+ return useOpenAiGlobal("theme");
4
+ }
5
+ //# sourceMappingURL=use-theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-theme.js","sourceRoot":"","sources":["../../../../src/web/hooks/use-theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,UAAU,QAAQ;IACtB,OAAO,eAAe,CAAC,OAAO,CAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,26 @@
1
+ import { useTheme } from "./use-theme.js";
2
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
3
+ import { renderHook } from "@testing-library/react";
4
+ describe("useTheme", () => {
5
+ let OpenaiMock;
6
+ beforeEach(() => {
7
+ OpenaiMock = {
8
+ theme: "light",
9
+ };
10
+ vi.stubGlobal("openai", OpenaiMock);
11
+ });
12
+ afterEach(() => {
13
+ vi.unstubAllGlobals();
14
+ vi.resetAllMocks();
15
+ });
16
+ it("should return the current theme from window.openai.theme", () => {
17
+ const { result } = renderHook(() => useTheme());
18
+ expect(result.current).toBe("light");
19
+ });
20
+ it("should return dark theme when set to dark", () => {
21
+ OpenaiMock.theme = "dark";
22
+ const { result } = renderHook(() => useTheme());
23
+ expect(result.current).toBe("dark");
24
+ });
25
+ });
26
+ //# sourceMappingURL=use-theme.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-theme.test.js","sourceRoot":"","sources":["../../../../src/web/hooks/use-theme.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,IAAI,UAEH,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,GAAG;YACX,KAAK,EAAE,OAAO;SACf,CAAC;QACF,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACtB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEhD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,UAAU,CAAC,KAAK,GAAG,MAAM,CAAC;QAC1B,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEhD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type UnknownObject } from "skybridge/web";
2
+ type BaseToolState<TStatus extends "pending" | "success", ToolInput extends UnknownObject, ToolOutput extends UnknownObject = UnknownObject, ToolResponseMetadata extends UnknownObject = UnknownObject> = {
3
+ status: TStatus;
4
+ isPending: TStatus extends "pending" ? true : false;
5
+ isSuccess: TStatus extends "success" ? true : false;
6
+ input: ToolInput;
7
+ output: TStatus extends "success" ? ToolOutput : undefined;
8
+ responseMetadata: TStatus extends "success" ? ToolResponseMetadata : undefined;
9
+ };
10
+ type PendingToolState<ToolInput extends UnknownObject> = BaseToolState<"pending", ToolInput>;
11
+ type SuccessToolState<ToolInput extends UnknownObject, ToolOutput extends UnknownObject, ToolResponseMetadata extends UnknownObject> = BaseToolState<"success", ToolInput, ToolOutput, ToolResponseMetadata>;
12
+ type ToolState<ToolInput extends UnknownObject, ToolOutput extends UnknownObject, ToolResponseMetadata extends UnknownObject> = PendingToolState<ToolInput> | SuccessToolState<ToolInput, ToolOutput, ToolResponseMetadata>;
13
+ export declare function useToolInfo<ToolSignature extends Partial<{
14
+ input: UnknownObject;
15
+ output: UnknownObject;
16
+ responseMetadata: UnknownObject;
17
+ }>>(): ToolState<ToolSignature["input"] extends UnknownObject ? ToolSignature["input"] : {}, ToolSignature["output"] extends UnknownObject ? ToolSignature["output"] : UnknownObject, ToolSignature["responseMetadata"] extends UnknownObject ? ToolSignature["responseMetadata"] : UnknownObject>;
18
+ export {};
@@ -0,0 +1,21 @@
1
+ import { useEffect, useState } from "react";
2
+ import { useOpenAiGlobal } from "skybridge/web";
3
+ export function useToolInfo() {
4
+ const [status, setStatus] = useState("pending");
5
+ const output = useOpenAiGlobal("toolOutput") ?? undefined;
6
+ const responseMetadata = useOpenAiGlobal("toolResponseMetadata") ?? undefined;
7
+ useEffect(() => {
8
+ setStatus(output === undefined && responseMetadata === undefined
9
+ ? "pending"
10
+ : "success");
11
+ }, [output, responseMetadata]);
12
+ return {
13
+ input: useOpenAiGlobal("toolInput"),
14
+ status,
15
+ isPending: status === "pending",
16
+ isSuccess: status === "success",
17
+ output,
18
+ responseMetadata,
19
+ };
20
+ }
21
+ //# sourceMappingURL=use-tool-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-tool-info.js","sourceRoot":"","sources":["../../../../src/web/hooks/use-tool-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAsB,MAAM,eAAe,CAAC;AAoCpE,MAAM,UAAU,WAAW;IAOzB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAwB,SAAS,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,eAAe,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC;IAC1D,MAAM,gBAAgB,GAAG,eAAe,CAAC,sBAAsB,CAAC,IAAI,SAAS,CAAC;IAE9E,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,CACP,MAAM,KAAK,SAAS,IAAI,gBAAgB,KAAK,SAAS;YACpD,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,SAAS,CACd,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAE/B,OAAO;QACL,KAAK,EAAE,eAAe,CAAC,WAAW,CAAE;QACpC,MAAM;QACN,SAAS,EAAE,MAAM,KAAK,SAAS;QAC/B,SAAS,EAAE,MAAM,KAAK,SAAS;QAC/B,MAAM;QACN,gBAAgB;KASjB,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,58 @@
1
+ import { fireEvent, renderHook, waitFor } from "@testing-library/react";
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { useToolInfo } from "./use-tool-info.js";
4
+ import { SET_GLOBALS_EVENT_TYPE, SetGlobalsEvent, } from "../types.js";
5
+ describe("useToolInfo", () => {
6
+ let OpenaiMock;
7
+ beforeEach(() => {
8
+ OpenaiMock = {
9
+ toolInput: { name: "pokemon", args: { name: "pikachu" } },
10
+ toolOutput: null,
11
+ toolResponseMetadata: null,
12
+ };
13
+ vi.stubGlobal("openai", OpenaiMock);
14
+ });
15
+ afterEach(() => {
16
+ vi.unstubAllGlobals();
17
+ vi.resetAllMocks();
18
+ });
19
+ it("should return toolInput on initial mount window.openai", () => {
20
+ const { result } = renderHook(() => useToolInfo());
21
+ expect(result.current.input).toEqual({
22
+ name: "pokemon",
23
+ args: { name: "pikachu" },
24
+ });
25
+ expect(result.current.status).toEqual("pending");
26
+ expect(result.current.isPending).toEqual(true);
27
+ expect(result.current.isSuccess).toEqual(false);
28
+ expect(result.current.output).toEqual(undefined);
29
+ expect(result.current.responseMetadata).toEqual(undefined);
30
+ });
31
+ it("should eventually return tool output and response metadata once tool call completes", () => {
32
+ const { result } = renderHook(() => useToolInfo());
33
+ fireEvent(window, new SetGlobalsEvent(SET_GLOBALS_EVENT_TYPE, {
34
+ detail: {
35
+ globals: {
36
+ toolOutput: {
37
+ name: "pikachu",
38
+ color: "yellow",
39
+ description: "When several of these POKéMON gather, their\felectricity could build and cause lightning storms.",
40
+ },
41
+ toolResponseMetadata: { id: 12 },
42
+ },
43
+ },
44
+ }));
45
+ waitFor(() => {
46
+ expect(result.current.status).toEqual("success");
47
+ expect(result.current.isPending).toEqual(false);
48
+ expect(result.current.isSuccess).toEqual(true);
49
+ expect(result.current.output).toEqual({
50
+ name: "pikachu",
51
+ color: "yellow",
52
+ description: "When several of these POKéMON gather, their\felectricity could build and cause lightning storms.",
53
+ });
54
+ expect(result.current.responseMetadata).toEqual({ id: 12 });
55
+ });
56
+ });
57
+ });
58
+ //# sourceMappingURL=use-tool-info.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-tool-info.test.js","sourceRoot":"","sources":["../../../../src/web/hooks/use-tool-info.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * @deprecated This hook is deprecated. Use `useToolInfo()` instead and access the `output` property.
3
+ */
4
+ export declare function useToolOutput(): import("../types.js").UnknownObject | undefined;
@@ -0,0 +1,9 @@
1
+ import { useToolInfo } from "./use-tool-info.js";
2
+ /**
3
+ * @deprecated This hook is deprecated. Use `useToolInfo()` instead and access the `output` property.
4
+ */
5
+ export function useToolOutput() {
6
+ const { output } = useToolInfo();
7
+ return output;
8
+ }
9
+ //# sourceMappingURL=use-tool-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-tool-output.js","sourceRoot":"","sources":["../../../../src/web/hooks/use-tool-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IAEjC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * @deprecated This hook is deprecated. Use `useToolInfo()` instead and access the `responseMetadata` property.
3
+ */
4
+ export declare function useToolResponseMetadata(): import("../types.js").UnknownObject | null | undefined;
@@ -0,0 +1,8 @@
1
+ import { useOpenAiGlobal } from "./use-openai-global.js";
2
+ /**
3
+ * @deprecated This hook is deprecated. Use `useToolInfo()` instead and access the `responseMetadata` property.
4
+ */
5
+ export function useToolResponseMetadata() {
6
+ return useOpenAiGlobal("toolResponseMetadata");
7
+ }
8
+ //# sourceMappingURL=use-tool-response-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-tool-response-metadata.js","sourceRoot":"","sources":["../../../../src/web/hooks/use-tool-response-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,eAAe,CAAC,sBAAsB,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function useUserAgent(): import("../types.js").UserAgent;
@@ -0,0 +1,5 @@
1
+ import { useOpenAiGlobal } from "./use-openai-global.js";
2
+ export function useUserAgent() {
3
+ return useOpenAiGlobal("userAgent");
4
+ }
5
+ //# sourceMappingURL=use-user-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-user-agent.js","sourceRoot":"","sources":["../../../../src/web/hooks/use-user-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,UAAU,YAAY;IAC1B,OAAO,eAAe,CAAC,WAAW,CAAE,CAAC;AACvC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,31 @@
1
+ import { useUserAgent } from "./use-user-agent.js";
2
+ import { describe, it, expect, vi, beforeEach, afterEach, } from "vitest";
3
+ import { renderHook } from "@testing-library/react";
4
+ describe("useUserAgent", () => {
5
+ let OpenaiMock;
6
+ beforeEach(() => {
7
+ OpenaiMock = {
8
+ userAgent: {
9
+ device: { type: "mobile" },
10
+ capabilities: { hover: false, touch: true },
11
+ },
12
+ };
13
+ vi.stubGlobal("openai", OpenaiMock);
14
+ });
15
+ afterEach(() => {
16
+ vi.unstubAllGlobals();
17
+ vi.resetAllMocks();
18
+ });
19
+ it("should return the current user agent from window.openai.userAgent", () => {
20
+ OpenaiMock.userAgent = {
21
+ device: { type: "mobile" },
22
+ capabilities: { hover: false, touch: true },
23
+ };
24
+ const { result } = renderHook(() => useUserAgent());
25
+ expect(result.current).toEqual({
26
+ device: { type: "mobile" },
27
+ capabilities: { hover: false, touch: true },
28
+ });
29
+ });
30
+ });
31
+ //# sourceMappingURL=use-user-agent.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-user-agent.test.js","sourceRoot":"","sources":["../../../../src/web/hooks/use-user-agent.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EACL,QAAQ,EACR,EAAE,EACF,MAAM,EACN,EAAE,EACF,UAAU,EACV,SAAS,GAEV,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,UAEH,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,GAAG;YACX,SAAS,EAAE;gBACT,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;aAC5C;SACF,CAAC;QACF,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACtB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,UAAU,CAAC,SAAS,GAAG;YACrB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;SAC5C,CAAC;QACF,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;QAEpD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YAC7B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;SAC5C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type SetStateAction } from "react";
2
+ import type { UnknownObject } from "../types.js";
3
+ export declare function useWidgetState<T extends UnknownObject>(defaultState: T | (() => T)): readonly [T, (state: SetStateAction<T>) => void];
4
+ export declare function useWidgetState<T extends UnknownObject>(defaultState?: T | (() => T | null) | null): readonly [T | null, (state: SetStateAction<T | null>) => void];
@@ -0,0 +1,30 @@
1
+ import { useCallback, useEffect, useState } from "react";
2
+ import { useOpenAiGlobal } from "./use-openai-global.js";
3
+ export function useWidgetState(defaultState) {
4
+ const widgetStateFromWindow = useOpenAiGlobal("widgetState");
5
+ const [widgetState, _setWidgetState] = useState(() => {
6
+ if (widgetStateFromWindow !== null) {
7
+ return widgetStateFromWindow;
8
+ }
9
+ return typeof defaultState === "function"
10
+ ? defaultState()
11
+ : defaultState ?? null;
12
+ });
13
+ useEffect(() => {
14
+ // Fixes openai implementation bug
15
+ if (widgetStateFromWindow !== null) {
16
+ _setWidgetState(widgetStateFromWindow);
17
+ }
18
+ }, [widgetStateFromWindow]);
19
+ const setWidgetState = useCallback((state) => {
20
+ _setWidgetState((prevState) => {
21
+ const newState = typeof state === "function" ? state(prevState) : state;
22
+ if (newState !== null) {
23
+ window.openai.setWidgetState(newState);
24
+ }
25
+ return newState;
26
+ });
27
+ }, [window.openai.setWidgetState]);
28
+ return [widgetState, setWidgetState];
29
+ }
30
+ //# sourceMappingURL=use-widget-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-widget-state.js","sourceRoot":"","sources":["../../../../src/web/hooks/use-widget-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAuB,MAAM,OAAO,CAAC;AAE9E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAQzD,MAAM,UAAU,cAAc,CAC5B,YAA0C;IAE1C,MAAM,qBAAqB,GAAG,eAAe,CAAC,aAAa,CAAM,CAAC;IAElE,MAAM,CAAC,WAAW,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAW,GAAG,EAAE;QAC7D,IAAI,qBAAqB,KAAK,IAAI,EAAE,CAAC;YACnC,OAAO,qBAAqB,CAAC;QAC/B,CAAC;QAED,OAAO,OAAO,YAAY,KAAK,UAAU;YACvC,CAAC,CAAC,YAAY,EAAE;YAChB,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,kCAAkC;QAClC,IAAI,qBAAqB,KAAK,IAAI,EAAE,CAAC;YACnC,eAAe,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAE5B,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,KAA+B,EAAE,EAAE;QAClC,eAAe,CAAC,CAAC,SAAS,EAAE,EAAE;YAC5B,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAExE,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACzC,CAAC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,EACD,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAC/B,CAAC;IAEF,OAAO,CAAC,WAAW,EAAE,cAAc,CAAU,CAAC;AAChD,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,61 @@
1
+ import { useWidgetState } from "./use-widget-state.js";
2
+ import { describe, it, expect, vi, beforeEach, afterEach, } from "vitest";
3
+ import { renderHook, act } from "@testing-library/react";
4
+ describe("useWidgetState", () => {
5
+ let OpenaiMock;
6
+ beforeEach(() => {
7
+ OpenaiMock = {
8
+ widgetState: null,
9
+ setWidgetState: vi.fn().mockResolvedValue(undefined),
10
+ };
11
+ vi.stubGlobal("openai", OpenaiMock);
12
+ });
13
+ afterEach(() => {
14
+ vi.unstubAllGlobals();
15
+ vi.resetAllMocks();
16
+ });
17
+ const defaultState = { count: 0, name: "test" };
18
+ const windowState = { count: 5, name: "window" };
19
+ it("should initialize with default state when window.openai.widgetState is null", () => {
20
+ OpenaiMock.widgetState = null;
21
+ const { result } = renderHook(() => useWidgetState(defaultState));
22
+ expect(result.current[0]).toEqual(defaultState);
23
+ });
24
+ it("should initialize with window.openai.widgetState when available", () => {
25
+ OpenaiMock.widgetState = windowState;
26
+ const { result } = renderHook(() => useWidgetState(defaultState));
27
+ expect(result.current[0]).toEqual(windowState);
28
+ });
29
+ it("should call window.openai.setWidgetState when setWidgetState is called with a new state", async () => {
30
+ const { result } = renderHook(() => useWidgetState(defaultState));
31
+ const newState = { count: 10, name: "updated" };
32
+ act(() => {
33
+ result.current[1](newState);
34
+ });
35
+ expect(OpenaiMock.setWidgetState).toHaveBeenCalledWith(newState);
36
+ expect(result.current[0]).toEqual(newState);
37
+ });
38
+ it("should call window.openai.setWidgetState when setWidgetState is called with a function updater", async () => {
39
+ const { result } = renderHook(() => useWidgetState(defaultState));
40
+ act(() => {
41
+ result.current[1]((prev) => ({ ...prev, count: prev.count + 1 }));
42
+ });
43
+ expect(OpenaiMock.setWidgetState).toHaveBeenCalledWith({
44
+ count: 1,
45
+ name: "test",
46
+ });
47
+ console.log("widgetState", result.current[0]);
48
+ expect(result.current[0]).toEqual({ count: 1, name: "test" });
49
+ });
50
+ it("should update state when window.openai.widgetState changes", () => {
51
+ OpenaiMock.widgetState = defaultState;
52
+ const { result, rerender } = renderHook(() => useWidgetState(defaultState));
53
+ expect(result.current[0]).toEqual(defaultState);
54
+ // Simulate window.openai.widgetState changing
55
+ OpenaiMock.widgetState = windowState;
56
+ // Trigger re-render to simulate the useEffect running
57
+ rerender();
58
+ expect(result.current[0]).toEqual(windowState);
59
+ });
60
+ });
61
+ //# sourceMappingURL=use-widget-state.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-widget-state.test.js","sourceRoot":"","sources":["../../../../src/web/hooks/use-widget-state.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,4 @@
1
- export { useOpenAiGlobal } from "./use-openai-global.js";
2
- export { useToolOutput } from "./use-tool-output.js";
3
- export { useToolResponseMetadata } from "./use-tool-response-metadata.js";
4
- export { useCallTool } from "./use-call-tool.js";
5
1
  export * from "./types.js";
6
2
  export { mountWidget } from "./mount-widget.js";
7
3
  export { skybridge } from "./plugin.js";
4
+ export * from "./hooks/index.js";
@@ -1,8 +1,5 @@
1
- export { useOpenAiGlobal } from "./use-openai-global.js";
2
- export { useToolOutput } from "./use-tool-output.js";
3
- export { useToolResponseMetadata } from "./use-tool-response-metadata.js";
4
- export { useCallTool } from "./use-call-tool.js";
5
1
  export * from "./types.js";
6
2
  export { mountWidget } from "./mount-widget.js";
7
3
  export { skybridge } from "./plugin.js";
4
+ export * from "./hooks/index.js";
8
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,cAAc,kBAAkB,CAAC"}
@@ -12,15 +12,13 @@ export function skybridge() {
12
12
  file,
13
13
  ]));
14
14
  return {
15
+ base: "/assets",
15
16
  build: {
17
+ manifest: true,
16
18
  minify: true,
17
19
  cssCodeSplit: false,
18
20
  rollupOptions: {
19
21
  input,
20
- output: {
21
- entryFileNames: "[name].js",
22
- assetFileNames: "[name][extname]",
23
- },
24
22
  },
25
23
  },
26
24
  };
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/web/plugin.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,IAAI,EAAE,WAAW;QAEjB,KAAK,CAAC,MAAM,CAAC,MAAM;YACjB,4EAA4E;YAC5E,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;YAE9C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YACjD,MAAM,cAAc,GAAG,OAAO,CAC5B,WAAW,EACX,oCAAoC,CACrC,CAAC;YAEF,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAC9B,QAAQ,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBACrC,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3C,IAAI;aACL,CAAC,CACH,CAAC;YAEF,OAAO;gBACL,KAAK,EAAE;oBACL,MAAM,EAAE,IAAI;oBACZ,YAAY,EAAE,KAAK;oBACnB,aAAa,EAAE;wBACb,KAAK;wBACL,MAAM,EAAE;4BACN,cAAc,EAAE,WAAW;4BAC3B,cAAc,EAAE,iBAAiB;yBAClC;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/web/plugin.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,IAAI,EAAE,WAAW;QAEjB,KAAK,CAAC,MAAM,CAAC,MAAM;YACjB,4EAA4E;YAC5E,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;YAE9C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YACjD,MAAM,cAAc,GAAG,OAAO,CAC5B,WAAW,EACX,oCAAoC,CACrC,CAAC;YAEF,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAC9B,QAAQ,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBACrC,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3C,IAAI;aACL,CAAC,CACH,CAAC;YAEF,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE;oBACL,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,IAAI;oBACZ,YAAY,EAAE,KAAK;oBACnB,aAAa,EAAE;wBACb,KAAK;qBACN;iBACF;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,4 +1,4 @@
1
- type UnknownObject = Record<string, unknown>;
1
+ export type UnknownObject = Record<string, unknown>;
2
2
  export type WidgetState = UnknownObject;
3
3
  export type SetWidgetState = (state: WidgetState) => Promise<void>;
4
4
  export type SendFollowUpMessage = (args: {
@@ -9,6 +9,10 @@ export type RequestDisplayMode = (args: {
9
9
  }) => Promise<{
10
10
  mode: DisplayMode;
11
11
  }>;
12
+ export type RequestModal = (options: RequestModalOptions) => Promise<void>;
13
+ export type RequestModalOptions = {
14
+ title: string;
15
+ };
12
16
  export declare const TOOL_RESPONSE_EVENT_TYPE = "openai:tool_response";
13
17
  export declare class ToolResponseEvent extends CustomEvent<{
14
18
  tool: {
@@ -26,7 +30,7 @@ declare global {
26
30
  [SET_GLOBALS_EVENT_TYPE]: SetGlobalsEvent;
27
31
  }
28
32
  }
29
- export type OpenAiGlobals<ToolInput extends UnknownObject = UnknownObject, ToolOutput extends UnknownObject = UnknownObject, ToolResponseMetadata extends UnknownObject = UnknownObject, WidgetState extends UnknownObject = UnknownObject> = {
33
+ export type OpenAiGlobals<ToolInput extends UnknownObject = {}, ToolOutput extends UnknownObject = UnknownObject, ToolResponseMetadata extends UnknownObject = UnknownObject, WidgetState extends UnknownObject = UnknownObject> = {
30
34
  theme: Theme;
31
35
  userAgent: UserAgent;
32
36
  locale: string;
@@ -34,9 +38,13 @@ export type OpenAiGlobals<ToolInput extends UnknownObject = UnknownObject, ToolO
34
38
  displayMode: DisplayMode;
35
39
  safeArea: SafeArea;
36
40
  toolInput: ToolInput;
37
- toolOutput: ToolOutput | null;
41
+ toolOutput: ToolOutput | {
42
+ text: string;
43
+ } | null;
38
44
  toolResponseMetadata: ToolResponseMetadata | null;
39
45
  widgetState: WidgetState | null;
46
+ requestDisplayMode: RequestDisplayMode;
47
+ requestModal: RequestModal;
40
48
  };
41
49
  export type CallToolArgs = Record<string, unknown> | null;
42
50
  export type CallToolResponse = {
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/web/types.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,wBAAwB,GAAG,sBAAsB,CAAC;AAC/D,MAAM,OAAO,iBAAkB,SAAQ,WAErC;IACkB,IAAI,GAAG,wBAAwB,CAAC;CACnD;AA2ED,sDAAsD;AACtD,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAC3D,MAAM,OAAO,eAAgB,SAAQ,WAEnC;IACkB,IAAI,GAAG,sBAAsB,CAAC;CACjD"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/web/types.ts"],"names":[],"mappings":"AAkBA,MAAM,CAAC,MAAM,wBAAwB,GAAG,sBAAsB,CAAC;AAC/D,MAAM,OAAO,iBAAkB,SAAQ,WAErC;IACkB,IAAI,GAAG,wBAAwB,CAAC;CACnD;AA6ED,sDAAsD;AACtD,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAC3D,MAAM,OAAO,eAAgB,SAAQ,WAEnC;IACkB,IAAI,GAAG,sBAAsB,CAAC;CACjD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skybridge",
3
- "version": "0.0.0-dev.d798b8b",
3
+ "version": "0.0.0-dev.d8535f2",
4
4
  "description": "Skybridge is a framework for building ChatGPT apps",
5
5
  "type": "module",
6
6
  "files": [
@@ -19,7 +19,12 @@
19
19
  "scripts": {
20
20
  "build": "tsc && pnpm run build:templates",
21
21
  "build:templates": "cp -r src/server/templates dist/src/server/",
22
- "test": "vitest run --silent"
22
+ "test": "pnpm run test:unit && pnpm run test:type",
23
+ "test:unit": "vitest run --silent",
24
+ "test:type": "tsc --noEmit",
25
+ "docs:dev": "pnpm --filter @skybridge/docs start",
26
+ "docs:build": "pnpm --filter @skybridge/docs build",
27
+ "docs:serve": "pnpm --filter @skybridge/docs serve"
23
28
  },
24
29
  "keywords": [
25
30
  "chatgpt",