skybridge 0.0.0-dev.eb507fb → 0.0.0-dev.ec66479

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 (142) hide show
  1. package/dist/src/server/devtoolsStaticServer.d.ts +15 -0
  2. package/dist/src/server/devtoolsStaticServer.js +38 -0
  3. package/dist/src/server/devtoolsStaticServer.js.map +1 -0
  4. package/dist/src/server/index.d.ts +3 -2
  5. package/dist/src/server/index.js +1 -0
  6. package/dist/src/server/index.js.map +1 -1
  7. package/dist/src/server/inferUtilityTypes.d.ts +10 -0
  8. package/dist/src/server/server.d.ts +32 -15
  9. package/dist/src/server/server.js +52 -32
  10. package/dist/src/server/server.js.map +1 -1
  11. package/dist/src/server/templateHelper.d.ts +3 -0
  12. package/dist/src/server/templateHelper.js +3 -2
  13. package/dist/src/server/templateHelper.js.map +1 -1
  14. package/dist/src/server/templates/development.hbs +3 -2
  15. package/dist/src/server/templates/production.hbs +1 -0
  16. package/dist/src/test/utils.d.ts +53 -7
  17. package/dist/src/test/utils.js +78 -0
  18. package/dist/src/test/utils.js.map +1 -1
  19. package/dist/src/test/widget.test.js +68 -11
  20. package/dist/src/test/widget.test.js.map +1 -1
  21. package/dist/src/web/bridges/apps-sdk-adapter.d.ts +4 -0
  22. package/dist/src/web/bridges/apps-sdk-adapter.js +10 -0
  23. package/dist/src/web/bridges/apps-sdk-adapter.js.map +1 -0
  24. package/dist/src/web/bridges/apps-sdk-bridge.d.ts +8 -0
  25. package/dist/src/web/bridges/apps-sdk-bridge.js +41 -0
  26. package/dist/src/web/bridges/apps-sdk-bridge.js.map +1 -0
  27. package/dist/src/web/bridges/get-bridge-methods.d.ts +2 -0
  28. package/dist/src/web/bridges/get-bridge-methods.js +8 -0
  29. package/dist/src/web/bridges/get-bridge-methods.js.map +1 -0
  30. package/dist/src/web/bridges/hooks/types.d.ts +6 -0
  31. package/dist/src/web/bridges/hooks/types.js +2 -0
  32. package/dist/src/web/bridges/hooks/types.js.map +1 -0
  33. package/dist/src/web/bridges/hooks/use-apps-sdk-bridge.d.ts +2 -0
  34. package/dist/src/web/bridges/hooks/use-apps-sdk-bridge.js +7 -0
  35. package/dist/src/web/bridges/hooks/use-apps-sdk-bridge.js.map +1 -0
  36. package/dist/src/web/bridges/hooks/use-bridge.d.ts +2 -0
  37. package/dist/src/web/bridges/hooks/use-bridge.js +19 -0
  38. package/dist/src/web/bridges/hooks/use-bridge.js.map +1 -0
  39. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.d.ts +5 -0
  40. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.js +7 -0
  41. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.js.map +1 -0
  42. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.test.js +50 -0
  43. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.test.js.map +1 -0
  44. package/dist/src/web/bridges/index.d.ts +4 -0
  45. package/dist/src/web/bridges/index.js +5 -0
  46. package/dist/src/web/bridges/index.js.map +1 -0
  47. package/dist/src/web/bridges/mcp-app-adapter.d.ts +6 -0
  48. package/dist/src/web/bridges/mcp-app-adapter.js +80 -0
  49. package/dist/src/web/bridges/mcp-app-adapter.js.map +1 -0
  50. package/dist/src/web/bridges/mcp-app-bridge.d.ts +37 -0
  51. package/dist/src/web/bridges/mcp-app-bridge.js +162 -0
  52. package/dist/src/web/bridges/mcp-app-bridge.js.map +1 -0
  53. package/dist/src/web/bridges/types.d.ts +46 -0
  54. package/dist/src/web/bridges/types.js +2 -0
  55. package/dist/src/web/bridges/types.js.map +1 -0
  56. package/dist/src/web/data-llm.js +4 -2
  57. package/dist/src/web/data-llm.js.map +1 -1
  58. package/dist/src/web/data-llm.test.js.map +1 -1
  59. package/dist/src/web/generate-helpers.d.ts +7 -5
  60. package/dist/src/web/generate-helpers.js +4 -2
  61. package/dist/src/web/generate-helpers.js.map +1 -1
  62. package/dist/src/web/generate-helpers.test-d.js +57 -2
  63. package/dist/src/web/generate-helpers.test-d.js.map +1 -1
  64. package/dist/src/web/hooks/index.d.ts +2 -3
  65. package/dist/src/web/hooks/index.js +2 -3
  66. package/dist/src/web/hooks/index.js.map +1 -1
  67. package/dist/src/web/hooks/test/utils.d.ts +10 -0
  68. package/dist/src/web/hooks/test/utils.js +39 -0
  69. package/dist/src/web/hooks/test/utils.js.map +1 -0
  70. package/dist/src/web/hooks/use-call-tool.d.ts +1 -1
  71. package/dist/src/web/hooks/use-call-tool.js +12 -4
  72. package/dist/src/web/hooks/use-call-tool.js.map +1 -1
  73. package/dist/src/web/hooks/use-call-tool.test.js +34 -14
  74. package/dist/src/web/hooks/use-call-tool.test.js.map +1 -1
  75. package/dist/src/web/hooks/use-display-mode.d.ts +2 -2
  76. package/dist/src/web/hooks/use-display-mode.js +6 -3
  77. package/dist/src/web/hooks/use-display-mode.js.map +1 -1
  78. package/dist/src/web/hooks/use-display-mode.test.js +1 -0
  79. package/dist/src/web/hooks/use-display-mode.test.js.map +1 -1
  80. package/dist/src/web/hooks/use-layout.d.ts +22 -0
  81. package/dist/src/web/hooks/use-layout.js +23 -0
  82. package/dist/src/web/hooks/use-layout.js.map +1 -0
  83. package/dist/src/web/hooks/use-layout.test.js +46 -0
  84. package/dist/src/web/hooks/use-layout.test.js.map +1 -0
  85. package/dist/src/web/hooks/use-openai-global.d.ts +3 -2
  86. package/dist/src/web/hooks/use-openai-global.js +3 -20
  87. package/dist/src/web/hooks/use-openai-global.js.map +1 -1
  88. package/dist/src/web/hooks/use-request-modal.d.ts +6 -3
  89. package/dist/src/web/hooks/use-request-modal.js +6 -1
  90. package/dist/src/web/hooks/use-request-modal.js.map +1 -1
  91. package/dist/src/web/hooks/use-request-modal.test.js +35 -2
  92. package/dist/src/web/hooks/use-request-modal.test.js.map +1 -1
  93. package/dist/src/web/hooks/use-send-follow-up-message.js +2 -7
  94. package/dist/src/web/hooks/use-send-follow-up-message.js.map +1 -1
  95. package/dist/src/web/hooks/use-tool-info.d.ts +13 -2
  96. package/dist/src/web/hooks/use-tool-info.js +15 -11
  97. package/dist/src/web/hooks/use-tool-info.js.map +1 -1
  98. package/dist/src/web/hooks/use-tool-info.test-d.js +40 -4
  99. package/dist/src/web/hooks/use-tool-info.test-d.js.map +1 -1
  100. package/dist/src/web/hooks/use-tool-info.test.js +116 -46
  101. package/dist/src/web/hooks/use-tool-info.test.js.map +1 -1
  102. package/dist/src/web/hooks/use-user.d.ts +18 -0
  103. package/dist/src/web/hooks/use-user.js +19 -0
  104. package/dist/src/web/hooks/use-user.js.map +1 -0
  105. package/dist/src/web/hooks/use-user.test.js +44 -0
  106. package/dist/src/web/hooks/use-user.test.js.map +1 -0
  107. package/dist/src/web/hooks/use-widget-state.js +2 -2
  108. package/dist/src/web/hooks/use-widget-state.js.map +1 -1
  109. package/dist/src/web/hooks/use-widget-state.test.js +1 -0
  110. package/dist/src/web/hooks/use-widget-state.test.js.map +1 -1
  111. package/dist/src/web/index.d.ts +1 -0
  112. package/dist/src/web/index.js +1 -0
  113. package/dist/src/web/index.js.map +1 -1
  114. package/dist/src/web/plugin/plugin.js +10 -4
  115. package/dist/src/web/plugin/plugin.js.map +1 -1
  116. package/dist/src/web/plugin/transform-data-llm.js +6 -3
  117. package/dist/src/web/plugin/transform-data-llm.js.map +1 -1
  118. package/dist/src/web/proxy.js +5 -0
  119. package/dist/src/web/proxy.js.map +1 -1
  120. package/dist/src/web/types.d.ts +26 -10
  121. package/dist/src/web/types.js.map +1 -1
  122. package/package.json +8 -6
  123. package/LICENSE +0 -674
  124. package/README.md +0 -123
  125. package/dist/src/web/hooks/use-locale.d.ts +0 -1
  126. package/dist/src/web/hooks/use-locale.js +0 -5
  127. package/dist/src/web/hooks/use-locale.js.map +0 -1
  128. package/dist/src/web/hooks/use-locale.test.js +0 -21
  129. package/dist/src/web/hooks/use-locale.test.js.map +0 -1
  130. package/dist/src/web/hooks/use-theme.d.ts +0 -1
  131. package/dist/src/web/hooks/use-theme.js +0 -5
  132. package/dist/src/web/hooks/use-theme.js.map +0 -1
  133. package/dist/src/web/hooks/use-theme.test.js +0 -26
  134. package/dist/src/web/hooks/use-theme.test.js.map +0 -1
  135. package/dist/src/web/hooks/use-user-agent.d.ts +0 -1
  136. package/dist/src/web/hooks/use-user-agent.js +0 -5
  137. package/dist/src/web/hooks/use-user-agent.js.map +0 -1
  138. package/dist/src/web/hooks/use-user-agent.test.js +0 -31
  139. package/dist/src/web/hooks/use-user-agent.test.js.map +0 -1
  140. /package/dist/src/web/{hooks/use-locale.test.d.ts → bridges/hooks/use-mcp-app-bridge.test.d.ts} +0 -0
  141. /package/dist/src/web/hooks/{use-theme.test.d.ts → use-layout.test.d.ts} +0 -0
  142. /package/dist/src/web/hooks/{use-user-agent.test.d.ts → use-user.test.d.ts} +0 -0
@@ -2,16 +2,21 @@ import { afterEach, beforeEach, describe, expect, it, vi, } from "vitest";
2
2
  import { createMockExtra, createMockMcpServer, resetTestEnv, setTestEnv, } from "./utils.js";
3
3
  const mockManifest = {
4
4
  "src/widgets/my-widget.tsx": { file: "my-widget.js" },
5
+ "src/widgets/folder-widget/index.tsx": { file: "folder-widget.js" },
5
6
  "style.css": { file: "style.css" },
6
7
  };
7
8
  vi.mock("node:fs", async () => {
8
9
  const actual = await vi.importActual("node:fs");
9
- const readFileSync = vi.fn((path, ...args) => {
10
+ const readFileSyncImpl = (path, ...args) => {
10
11
  if (typeof path === "string" && path.includes("manifest.json")) {
11
12
  return JSON.stringify(mockManifest);
12
13
  }
14
+ // Type assertion needed because readFileSync has overloads with different parameter types
15
+ // Using @ts-expect-error because the overloads are complex and we're forwarding args
16
+ // @ts-expect-error - readFileSync overloads require complex type handling
13
17
  return actual.readFileSync(path, ...args);
14
- });
18
+ };
19
+ const readFileSync = vi.fn(readFileSyncImpl);
15
20
  return {
16
21
  readFileSync,
17
22
  default: {
@@ -38,16 +43,17 @@ describe("McpServer.registerWidget", () => {
38
43
  const mockToolConfig = { description: "Test tool" };
39
44
  server.registerWidget("my-widget", mockRegisterResourceConfig, mockToolConfig, mockToolCallback);
40
45
  // Get the resource callback function
41
- const resourceCallback = mockRegisterResource.mock.calls[0]?.[3];
42
- expect(resourceCallback).toBeDefined();
46
+ const appsSdkResourceCallback = mockRegisterResource.mock
47
+ .calls[0]?.[3];
48
+ expect(appsSdkResourceCallback).toBeDefined();
43
49
  const serverUrl = "http://localhost:3000";
44
50
  const mockExtra = createMockExtra("__not_used__");
45
- const result = await resourceCallback(new URL("ui://widgets/my-widget.html"), mockExtra);
51
+ const result = await appsSdkResourceCallback(new URL("ui://widgets/apps-sdk/my-widget.html"), mockExtra);
46
52
  expect(mockRegisterTool).toHaveBeenCalled();
47
53
  expect(result).toEqual({
48
54
  contents: [
49
55
  {
50
- uri: "ui://widgets/my-widget.html",
56
+ uri: "ui://widgets/apps-sdk/my-widget.html",
51
57
  mimeType: "text/html+skybridge",
52
58
  text: expect.stringContaining('<div id="root"></div>'),
53
59
  },
@@ -56,7 +62,8 @@ describe("McpServer.registerWidget", () => {
56
62
  // Check development-specific content
57
63
  expect(result.contents[0]?.text).toContain(`${serverUrl}/@react-refresh`);
58
64
  expect(result.contents[0]?.text).toContain(`${serverUrl}/@vite/client`);
59
- expect(result.contents[0]?.text).toContain(`${serverUrl}/src/widgets/my-widget.tsx`);
65
+ expect(result.contents[0]?.text).toContain(`${serverUrl}/src/widgets/my-widget`);
66
+ expect(result.contents[0]?.text).not.toContain(`${serverUrl}/src/widgets/my-widget.tsx`);
60
67
  });
61
68
  it("should generate correct HTML for production mode", async () => {
62
69
  setTestEnv({ NODE_ENV: "production" });
@@ -65,15 +72,16 @@ describe("McpServer.registerWidget", () => {
65
72
  const mockToolConfig = { description: "Test tool" };
66
73
  server.registerWidget("my-widget", mockRegisterResourceConfig, mockToolConfig, mockToolCallback);
67
74
  // Get the resource callback function
68
- const resourceCallback = mockRegisterResource.mock.calls[0]?.[3];
69
- expect(resourceCallback).toBeDefined();
75
+ const appsSdkResourceCallback = mockRegisterResource.mock
76
+ .calls[0]?.[3];
77
+ expect(appsSdkResourceCallback).toBeDefined();
70
78
  const serverUrl = "https://myapp.com";
71
79
  const mockExtra = createMockExtra(serverUrl);
72
- const result = await resourceCallback?.(new URL("ui://widgets/my-widget.html"), mockExtra);
80
+ const result = await appsSdkResourceCallback(new URL("ui://widgets/apps-sdk/my-widget.html"), mockExtra);
73
81
  expect(result).toEqual({
74
82
  contents: [
75
83
  {
76
- uri: "ui://widgets/my-widget.html",
84
+ uri: "ui://widgets/apps-sdk/my-widget.html",
77
85
  mimeType: "text/html+skybridge",
78
86
  text: expect.stringContaining('<div id="root"></div>'),
79
87
  },
@@ -85,5 +93,54 @@ describe("McpServer.registerWidget", () => {
85
93
  expect(result.contents[0]?.text).toContain(`${serverUrl}/assets/my-widget.js`);
86
94
  expect(result.contents[0]?.text).toContain(`${serverUrl}/assets/style.css`);
87
95
  });
96
+ it("should resolve folder-based widgets (barrel files) in production mode", async () => {
97
+ setTestEnv({ NODE_ENV: "production" });
98
+ const mockToolCallback = vi.fn();
99
+ const mockRegisterResourceConfig = { description: "Folder widget" };
100
+ const mockToolConfig = { description: "Folder tool" };
101
+ server.registerWidget("folder-widget", mockRegisterResourceConfig, mockToolConfig, mockToolCallback);
102
+ const appsSdkResourceCallback = mockRegisterResource.mock
103
+ .calls[0]?.[3];
104
+ expect(appsSdkResourceCallback).toBeDefined();
105
+ const serverUrl = "https://myapp.com";
106
+ const mockExtra = createMockExtra(serverUrl);
107
+ const result = await appsSdkResourceCallback(new URL("ui://widgets/apps-sdk/folder-widget.html"), mockExtra);
108
+ // Should resolve to folder-widget.js from the manifest entry "src/widgets/folder-widget/index.tsx"
109
+ expect(result.contents[0]?.text).toContain(`${serverUrl}/assets/folder-widget.js`);
110
+ });
111
+ it("should register resources with correct hostType for both apps-sdk and ext-apps formats", async () => {
112
+ const mockToolCallback = vi.fn();
113
+ const mockRegisterResourceConfig = { description: "Test widget" };
114
+ const mockToolConfig = { description: "Test tool" };
115
+ server.registerWidget("my-widget", mockRegisterResourceConfig, mockToolConfig, mockToolCallback);
116
+ expect(mockRegisterResource).toHaveBeenCalledTimes(2);
117
+ const appsSdkCallback = mockRegisterResource.mock
118
+ .calls[0]?.[3];
119
+ const appsSdkResult = await appsSdkCallback(new URL("ui://widgets/apps-sdk/my-widget.html"), createMockExtra("__not_used__"));
120
+ expect(appsSdkResult).toEqual({
121
+ contents: [
122
+ {
123
+ uri: "ui://widgets/apps-sdk/my-widget.html",
124
+ mimeType: "text/html+skybridge",
125
+ text: expect.stringContaining('<div id="root"></div>'),
126
+ },
127
+ ],
128
+ });
129
+ expect(appsSdkResult.contents[0]?.text).toContain('window.skybridge = { hostType: "apps-sdk" }');
130
+ const extAppsResourceCallback = mockRegisterResource.mock
131
+ .calls[1]?.[3];
132
+ expect(extAppsResourceCallback).toBeDefined();
133
+ const extAppsResult = await extAppsResourceCallback(new URL("ui://widgets/ext-apps/my-widget.html"), createMockExtra("__not_used__"));
134
+ expect(extAppsResult).toEqual({
135
+ contents: [
136
+ {
137
+ uri: "ui://widgets/ext-apps/my-widget.html",
138
+ mimeType: "text/html;profile=mcp-app",
139
+ text: expect.stringContaining('<div id="root"></div>'),
140
+ },
141
+ ],
142
+ });
143
+ expect(extAppsResult.contents[0]?.text).toContain('window.skybridge = { hostType: "mcp-app" }');
144
+ });
88
145
  });
89
146
  //# sourceMappingURL=widget.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"widget.test.js","sourceRoot":"","sources":["../../../src/test/widget.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"widget.test.js","sourceRoot":"","sources":["../../../src/test/widget.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CallToolResponse, Methods } from "./types.js";
2
+ export declare const callTool: <ToolArgs extends Record<string, unknown> | null = null, ToolResponse extends CallToolResponse = CallToolResponse>(name: string, args: ToolArgs) => Promise<ToolResponse>;
3
+ export declare const requestDisplayMode: Methods["requestDisplayMode"];
4
+ export declare const sendFollowUpMessage: Methods["sendFollowUpMessage"];
@@ -0,0 +1,10 @@
1
+ export const callTool = async (name, args) => {
2
+ return window.openai.callTool(name, args);
3
+ };
4
+ export const requestDisplayMode = ({ mode }) => {
5
+ return window.openai.requestDisplayMode({ mode });
6
+ };
7
+ export const sendFollowUpMessage = (prompt) => {
8
+ return window.openai.sendFollowUpMessage({ prompt });
9
+ };
10
+ //# sourceMappingURL=apps-sdk-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apps-sdk-adapter.js","sourceRoot":"","sources":["../../../../src/web/bridges/apps-sdk-adapter.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAI3B,IAAY,EACZ,IAAc,EACS,EAAE;IACzB,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAyB,IAAI,EAAE,IAAI,CAAC,CAAC;AACpE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAkC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;IAC5E,OAAO,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAmC,CAAC,MAAM,EAAE,EAAE;IAC5E,OAAO,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACvD,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type OpenAiProperties } from "../types.js";
2
+ export declare class AppsSdkBridge {
3
+ private static instance;
4
+ static getInstance(): AppsSdkBridge;
5
+ static resetInstance(): void;
6
+ subscribe: (key: keyof OpenAiProperties) => (onChange: () => void) => () => void;
7
+ getSnapshot: <K extends keyof OpenAiProperties>(key: K) => (import("../types.js").OpenAiMethods<import("../types.js").UnknownObject> & OpenAiProperties<Record<never, unknown>, import("../types.js").UnknownObject, import("../types.js").UnknownObject, import("../types.js").UnknownObject>)[K];
8
+ }
@@ -0,0 +1,41 @@
1
+ import { SET_GLOBALS_EVENT_TYPE, } from "../types.js";
2
+ export class AppsSdkBridge {
3
+ static instance = null;
4
+ static getInstance() {
5
+ if (window.skybridge.hostType !== "apps-sdk" ||
6
+ window.openai === undefined) {
7
+ throw new Error("Apps SDK Bridge can only be used in the apps-sdk runtime");
8
+ }
9
+ if (AppsSdkBridge.instance === null) {
10
+ AppsSdkBridge.instance = new AppsSdkBridge();
11
+ }
12
+ return AppsSdkBridge.instance;
13
+ }
14
+ static resetInstance() {
15
+ if (AppsSdkBridge.instance) {
16
+ AppsSdkBridge.instance = null;
17
+ }
18
+ }
19
+ subscribe = (key) => (onChange) => {
20
+ const handleSetGlobal = (event) => {
21
+ const value = event.detail.globals[key];
22
+ if (value === undefined) {
23
+ return;
24
+ }
25
+ onChange();
26
+ };
27
+ window.addEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobal, {
28
+ passive: true,
29
+ });
30
+ return () => {
31
+ window.removeEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobal);
32
+ };
33
+ };
34
+ getSnapshot = (key) => {
35
+ if (window.openai === undefined) {
36
+ throw new Error(`window.openai is not available. Make sure you're calling the hook requiring ${key} within the OpenAI iFrame skybridge runtime.`);
37
+ }
38
+ return window.openai[key];
39
+ };
40
+ }
41
+ //# sourceMappingURL=apps-sdk-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apps-sdk-bridge.js","sourceRoot":"","sources":["../../../../src/web/bridges/apps-sdk-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,GAEvB,MAAM,aAAa,CAAC;AAErB,MAAM,OAAO,aAAa;IAChB,MAAM,CAAC,QAAQ,GAAyB,IAAI,CAAC;IAE9C,MAAM,CAAC,WAAW;QACvB,IACE,MAAM,CAAC,SAAS,CAAC,QAAQ,KAAK,UAAU;YACxC,MAAM,CAAC,MAAM,KAAK,SAAS,EAC3B,CAAC;YACD,MAAM,IAAI,KAAK,CACb,0DAA0D,CAC3D,CAAC;QACJ,CAAC;QACD,IAAI,aAAa,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YACpC,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAEM,MAAM,CAAC,aAAa;QACzB,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC3B,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC;QAChC,CAAC;IACH,CAAC;IAEM,SAAS,GACd,CAAC,GAA2B,EAAE,EAAE,CAAC,CAAC,QAAoB,EAAE,EAAE;QACxD,MAAM,eAAe,GAAG,CAAC,KAAsB,EAAE,EAAE;YACjD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO;YACT,CAAC;YAED,QAAQ,EAAE,CAAC;QACb,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,EAAE,eAAe,EAAE;YAC/D,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,sBAAsB,EAAE,eAAe,CAAC,CAAC;QACtE,CAAC,CAAC;IACJ,CAAC,CAAC;IACG,WAAW,GAAG,CAAmC,GAAM,EAAE,EAAE;QAChE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,+EAA+E,GAAG,8CAA8C,CACjI,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Methods } from "./types.js";
2
+ export declare const getBridgeMethods: () => Methods;
@@ -0,0 +1,8 @@
1
+ import * as AppsSdkAdapter from "./apps-sdk-adapter.js";
2
+ import * as McpAppAdapter from "./mcp-app-adapter.js";
3
+ export const getBridgeMethods = () => {
4
+ return window.skybridge.hostType === "apps-sdk"
5
+ ? AppsSdkAdapter
6
+ : McpAppAdapter;
7
+ };
8
+ //# sourceMappingURL=get-bridge-methods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-bridge-methods.js","sourceRoot":"","sources":["../../../../src/web/bridges/get-bridge-methods.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAC;AAGtD,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAY,EAAE;IAC5C,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,KAAK,UAAU;QAC7C,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,aAAa,CAAC;AACpB,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { BridgeInterface } from "../types.js";
2
+ export type BridgeSubscribe = (onChange: () => void) => () => void;
3
+ export type BridgeExternalStore<K extends keyof BridgeInterface> = {
4
+ subscribe: BridgeSubscribe;
5
+ getSnapshot: () => BridgeInterface[K];
6
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/web/bridges/hooks/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import type { OpenAiProperties } from "../../types.js";
2
+ export declare function useAppsSdkBridge<K extends keyof OpenAiProperties>(key: K): OpenAiProperties[K];
@@ -0,0 +1,7 @@
1
+ import { useSyncExternalStore } from "react";
2
+ import { AppsSdkBridge } from "../apps-sdk-bridge.js";
3
+ export function useAppsSdkBridge(key) {
4
+ const bridge = AppsSdkBridge.getInstance();
5
+ return useSyncExternalStore(bridge.subscribe(key), () => bridge.getSnapshot(key));
6
+ }
7
+ //# sourceMappingURL=use-apps-sdk-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-apps-sdk-bridge.js","sourceRoot":"","sources":["../../../../../src/web/bridges/hooks/use-apps-sdk-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,UAAU,gBAAgB,CAC9B,GAAM;IAEN,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;IAC3C,OAAO,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CACtD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { BridgeInterface } from "../types.js";
2
+ export declare const useBridge: <K extends keyof BridgeInterface>(key: K) => BridgeInterface[K];
@@ -0,0 +1,19 @@
1
+ import { useSyncExternalStore } from "react";
2
+ import { AppsSdkBridge } from "../apps-sdk-bridge.js";
3
+ import { getMcpAppAdapter } from "../mcp-app-adapter.js";
4
+ const getExternalStore = (key) => {
5
+ const hostType = window.skybridge.hostType;
6
+ if (hostType === "apps-sdk") {
7
+ const bridge = AppsSdkBridge.getInstance();
8
+ return {
9
+ subscribe: bridge.subscribe(key),
10
+ getSnapshot: () => bridge.getSnapshot(key),
11
+ };
12
+ }
13
+ return getMcpAppAdapter()[key];
14
+ };
15
+ export const useBridge = (key) => {
16
+ const externalStore = getExternalStore(key);
17
+ return useSyncExternalStore(externalStore.subscribe, externalStore.getSnapshot);
18
+ };
19
+ //# sourceMappingURL=use-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-bridge.js","sourceRoot":"","sources":["../../../../../src/web/bridges/hooks/use-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAIzD,MAAM,gBAAgB,GAAG,CACvB,GAAM,EACkB,EAAE;IAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;IAC3C,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;QAC3C,OAAO;YACL,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;YAChC,WAAW,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC;SAC3C,CAAC;IACJ,CAAC;IAED,OAAO,gBAAgB,EAAE,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,GAAM,EACc,EAAE;IACtB,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAE5C,OAAO,oBAAoB,CACzB,aAAa,CAAC,SAAS,EACvB,aAAa,CAAC,WAAW,CAC1B,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { McpUiInitializeRequest } from "@modelcontextprotocol/ext-apps";
2
+ import { type McpAppBridgeContext } from "../mcp-app-bridge.js";
3
+ type McpAppInitializationOptions = Pick<McpUiInitializeRequest["params"], "appInfo">;
4
+ export declare function useMcpAppBridge<K extends keyof McpAppBridgeContext>(key: K, options?: Partial<McpAppInitializationOptions>, requestTimeout?: number): McpAppBridgeContext[K];
5
+ export {};
@@ -0,0 +1,7 @@
1
+ import { useSyncExternalStore } from "react";
2
+ import { McpAppBridge } from "../mcp-app-bridge.js";
3
+ export function useMcpAppBridge(key, options, requestTimeout) {
4
+ const bridge = McpAppBridge.getInstance(options, requestTimeout);
5
+ return useSyncExternalStore(bridge.subscribe(key), () => bridge.getSnapshot(key));
6
+ }
7
+ //# sourceMappingURL=use-mcp-app-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-mcp-app-bridge.js","sourceRoot":"","sources":["../../../../../src/web/bridges/hooks/use-mcp-app-bridge.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,YAAY,EAA4B,MAAM,sBAAsB,CAAC;AAO9E,MAAM,UAAU,eAAe,CAC7B,GAAM,EACN,OAA8C,EAC9C,cAAuB;IAEvB,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACjE,OAAO,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CACtD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { act, fireEvent, renderHook, waitFor } from "@testing-library/react";
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { MCPAppHostPostMessageMock } from "../../hooks/test/utils.js";
4
+ import { McpAppBridge } from "../mcp-app-bridge.js";
5
+ import { useMcpAppBridge } from "./use-mcp-app-bridge.js";
6
+ describe("useMcpAppBridge", () => {
7
+ beforeEach(async () => {
8
+ vi.stubGlobal("parent", { postMessage: MCPAppHostPostMessageMock });
9
+ vi.stubGlobal("skybridge", { hostType: "mcp-app" });
10
+ McpAppBridge.resetInstance();
11
+ });
12
+ afterEach(() => {
13
+ vi.clearAllMocks();
14
+ });
15
+ it("should return the theme value from host context and update on notification", async () => {
16
+ const { result } = renderHook(() => useMcpAppBridge("theme"));
17
+ await waitFor(() => {
18
+ expect(result.current).toBe("light");
19
+ });
20
+ fireEvent(window, new MessageEvent("message", {
21
+ data: {
22
+ jsonrpc: "2.0",
23
+ method: "ui/notifications/host-context-changed",
24
+ params: {
25
+ theme: "dark",
26
+ },
27
+ },
28
+ }));
29
+ await waitFor(() => {
30
+ expect(result.current).toBe("dark");
31
+ });
32
+ });
33
+ it("should reject the request after timeout", async () => {
34
+ vi.useFakeTimers();
35
+ const consoleErrorSpy = vi
36
+ .spyOn(console, "error")
37
+ .mockImplementation(() => { });
38
+ const nonRespondingMock = vi.fn();
39
+ vi.stubGlobal("parent", { postMessage: nonRespondingMock });
40
+ renderHook(() => useMcpAppBridge("theme", undefined, 100));
41
+ expect(nonRespondingMock).toHaveBeenCalledWith(expect.objectContaining({ method: "ui/initialize" }), "*");
42
+ await act(async () => {
43
+ await vi.advanceTimersByTimeAsync(100);
44
+ });
45
+ expect(consoleErrorSpy).toHaveBeenCalledWith(new Error("Request timed out"));
46
+ consoleErrorSpy.mockRestore();
47
+ vi.useRealTimers();
48
+ });
49
+ });
50
+ //# sourceMappingURL=use-mcp-app-bridge.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-mcp-app-bridge.test.js","sourceRoot":"","sources":["../../../../../src/web/bridges/hooks/use-mcp-app-bridge.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,yBAAyB,EAAE,CAAC,CAAC;QACpE,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QACpD,YAAY,CAAC,aAAa,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAE9D,MAAM,OAAO,CAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,SAAS,CACP,MAAM,EACN,IAAI,YAAY,CAAC,SAAS,EAAE;YAC1B,IAAI,EAAE;gBACJ,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,uCAAuC;gBAC/C,MAAM,EAAE;oBACN,KAAK,EAAE,MAAM;iBACd;aACF;SACF,CAAC,CACH,CAAC;QAEF,MAAM,OAAO,CAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,eAAe,GAAG,EAAE;aACvB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;aACvB,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEhC,MAAM,iBAAiB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAE5D,UAAU,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;QAE3D,MAAM,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,CAC5C,MAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,EACpD,GAAG,CACJ,CAAC;QAEF,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAC1C,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAC/B,CAAC;QAEF,eAAe,CAAC,WAAW,EAAE,CAAC;QAC9B,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { getBridgeMethods } from "./get-bridge-methods.js";
2
+ export { useAppsSdkBridge } from "./hooks/use-apps-sdk-bridge.js";
3
+ export { useBridge } from "./hooks/use-bridge.js";
4
+ export { useMcpAppBridge } from "./hooks/use-mcp-app-bridge.js";
@@ -0,0 +1,5 @@
1
+ export { getBridgeMethods } from "./get-bridge-methods.js";
2
+ export { useAppsSdkBridge } from "./hooks/use-apps-sdk-bridge.js";
3
+ export { useBridge } from "./hooks/use-bridge.js";
4
+ export { useMcpAppBridge } from "./hooks/use-mcp-app-bridge.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/web/bridges/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { BridgeExternalStore } from "./hooks/types.js";
2
+ import type { BridgeInterface, CallToolResponse, Methods } from "./types.js";
3
+ export declare const callTool: <ToolArgs extends Record<string, unknown> | null = null, ToolResponse extends CallToolResponse = CallToolResponse>(name: string, args: ToolArgs) => Promise<ToolResponse>;
4
+ export declare const requestDisplayMode: Methods["requestDisplayMode"];
5
+ export declare const sendFollowUpMessage: Methods["sendFollowUpMessage"];
6
+ export declare const getMcpAppAdapter: () => { [K in keyof BridgeInterface]: BridgeExternalStore<K>; };
@@ -0,0 +1,80 @@
1
+ import { McpAppBridge, } from "./mcp-app-bridge.js";
2
+ export const callTool = async (name, args) => {
3
+ const bridge = McpAppBridge.getInstance();
4
+ const response = await bridge.request({
5
+ method: "tools/call",
6
+ params: {
7
+ name,
8
+ arguments: args ?? undefined,
9
+ },
10
+ });
11
+ const result = response.content
12
+ .filter((content) => content.type === "text")
13
+ .map(({ text }) => text)
14
+ .join("\n");
15
+ return {
16
+ content: response.content,
17
+ structuredContent: response.structuredContent ?? {},
18
+ isError: response.isError ?? false,
19
+ result,
20
+ meta: response._meta ?? {},
21
+ };
22
+ };
23
+ export const requestDisplayMode = ({ mode }) => {
24
+ const bridge = McpAppBridge.getInstance();
25
+ if (mode !== "modal") {
26
+ return bridge.request({
27
+ method: "ui/request-display-mode",
28
+ params: { mode },
29
+ });
30
+ }
31
+ throw new Error("Modal display mode is not accessible in MCP App.");
32
+ };
33
+ export const sendFollowUpMessage = async (prompt) => {
34
+ const bridge = McpAppBridge.getInstance();
35
+ await bridge.request({
36
+ method: "ui/message",
37
+ params: {
38
+ role: "user",
39
+ content: [
40
+ {
41
+ type: "text",
42
+ text: prompt,
43
+ },
44
+ ],
45
+ },
46
+ });
47
+ };
48
+ const createExternalStore = (keys, getSnapshot) => {
49
+ const bridge = McpAppBridge.getInstance();
50
+ return {
51
+ subscribe: bridge.subscribe(keys),
52
+ getSnapshot: () => {
53
+ const context = Object.fromEntries(keys.map((k) => [k, bridge.getSnapshot(k)]));
54
+ return getSnapshot(context);
55
+ },
56
+ };
57
+ };
58
+ export const getMcpAppAdapter = () => ({
59
+ theme: createExternalStore(["theme"], ({ theme }) => theme ?? "light"),
60
+ locale: createExternalStore(["locale"], ({ locale }) => locale ?? "en-US"),
61
+ safeArea: createExternalStore(["safeAreaInsets"], ({ safeAreaInsets }) => ({
62
+ insets: safeAreaInsets ?? { top: 0, right: 0, bottom: 0, left: 0 },
63
+ })),
64
+ displayMode: createExternalStore(["displayMode"], ({ displayMode }) => displayMode ?? "inline"),
65
+ maxHeight: createExternalStore(["viewport"], ({ viewport }) => viewport?.maxHeight ?? window.innerHeight),
66
+ userAgent: createExternalStore(["platform", "deviceCapabilities"], ({ platform, deviceCapabilities }) => ({
67
+ device: {
68
+ type: platform === "web" ? "desktop" : (platform ?? "unknown"),
69
+ },
70
+ capabilities: {
71
+ hover: true,
72
+ touch: true,
73
+ ...deviceCapabilities,
74
+ },
75
+ })),
76
+ toolInput: createExternalStore(["toolInput"], ({ toolInput }) => toolInput ?? null),
77
+ toolOutput: createExternalStore(["toolResult"], ({ toolResult }) => toolResult?.structuredContent ?? null),
78
+ toolResponseMetadata: createExternalStore(["toolResult"], ({ toolResult }) => toolResult?._meta ?? null),
79
+ });
80
+ //# sourceMappingURL=mcp-app-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-app-adapter.js","sourceRoot":"","sources":["../../../../src/web/bridges/mcp-app-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { McpUiHostContext, McpUiInitializeRequest, McpUiToolCancelledNotification, McpUiToolInputNotification, McpUiToolResultNotification } from "@modelcontextprotocol/ext-apps";
2
+ type McpAppInitializationOptions = Pick<McpUiInitializeRequest["params"], "appInfo">;
3
+ export type McpToolState = {
4
+ toolInput: NonNullable<McpUiToolInputNotification["params"]["arguments"]> | null;
5
+ toolResult: McpUiToolResultNotification["params"] | null;
6
+ toolCancelled: McpUiToolCancelledNotification["params"] | null;
7
+ };
8
+ export type McpAppBridgeContext = McpUiHostContext & McpToolState;
9
+ export type McpAppBridgeKey = keyof McpAppBridgeContext;
10
+ export declare class McpAppBridge {
11
+ private static instance;
12
+ context: McpAppBridgeContext;
13
+ private listeners;
14
+ private pendingRequests;
15
+ private nextId;
16
+ private initialized;
17
+ private appInitializationOptions;
18
+ private requestTimeout;
19
+ constructor(options: McpAppInitializationOptions, requestTimeout?: number);
20
+ static getInstance(options?: Partial<McpAppInitializationOptions>, requestTimeout?: number): McpAppBridge;
21
+ subscribe(key: McpAppBridgeKey): (onChange: () => void) => () => void;
22
+ subscribe(keys: readonly McpAppBridgeKey[]): (onChange: () => void) => () => void;
23
+ getSnapshot<K extends keyof McpAppBridgeContext>(key: K): McpAppBridgeContext[K];
24
+ cleanup: () => void;
25
+ static resetInstance(): void;
26
+ request<R extends {
27
+ method: string;
28
+ params?: unknown;
29
+ }, T>({ method, params, }: R): Promise<T>;
30
+ private emit;
31
+ private updateContext;
32
+ private init;
33
+ private handleMessage;
34
+ private connect;
35
+ private notify;
36
+ }
37
+ export {};