skybridge 0.0.0-dev.c323857 → 0.0.0-dev.c371a09
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.
- package/README.md +145 -0
- package/bin/run.js +0 -4
- package/dist/cli/detect-port.d.ts +18 -0
- package/dist/cli/detect-port.js +61 -0
- package/dist/cli/detect-port.js.map +1 -0
- package/dist/cli/telemetry.d.ts +7 -0
- package/dist/cli/telemetry.js +123 -0
- package/dist/cli/telemetry.js.map +1 -0
- package/dist/cli/use-execute-steps.d.ts +3 -2
- package/dist/cli/use-execute-steps.js +6 -1
- package/dist/cli/use-execute-steps.js.map +1 -1
- package/dist/cli/use-nodemon.d.ts +7 -0
- package/dist/cli/use-nodemon.js +76 -0
- package/dist/cli/use-nodemon.js.map +1 -0
- package/dist/cli/use-typescript-check.d.ts +8 -0
- package/dist/cli/use-typescript-check.js +59 -0
- package/dist/cli/use-typescript-check.js.map +1 -0
- package/dist/commands/build.js +4 -2
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/dev.d.ts +4 -1
- package/dist/commands/dev.js +31 -9
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/start.d.ts +3 -1
- package/dist/commands/start.js +34 -15
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/telemetry/disable.d.ts +5 -0
- package/dist/commands/telemetry/disable.js +14 -0
- package/dist/commands/telemetry/disable.js.map +1 -0
- package/dist/commands/telemetry/enable.d.ts +5 -0
- package/dist/commands/telemetry/enable.js +14 -0
- package/dist/commands/telemetry/enable.js.map +1 -0
- package/dist/commands/telemetry/status.d.ts +5 -0
- package/dist/commands/telemetry/status.js +14 -0
- package/dist/commands/telemetry/status.js.map +1 -0
- package/dist/server/asset-base-url-transform-plugin.d.ts +11 -0
- package/dist/server/asset-base-url-transform-plugin.js +34 -0
- package/dist/server/asset-base-url-transform-plugin.js.map +1 -0
- package/dist/server/asset-base-url-transform-plugin.test.js +56 -0
- package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -0
- package/dist/server/const.d.ts +1 -0
- package/dist/server/const.js +2 -0
- package/dist/server/const.js.map +1 -0
- package/dist/server/express.d.ts +9 -0
- package/dist/server/express.js +72 -0
- package/dist/server/express.js.map +1 -0
- package/dist/server/express.test.d.ts +1 -0
- package/dist/server/express.test.js +74 -0
- package/dist/server/express.test.js.map +1 -0
- package/dist/server/server.d.ts +6 -0
- package/dist/server/server.js +79 -11
- package/dist/server/server.js.map +1 -1
- package/dist/server/templateHelper.d.ts +1 -0
- package/dist/server/templateHelper.js.map +1 -1
- package/dist/server/templates/development.hbs +3 -2
- package/dist/server/templates/production.hbs +1 -2
- package/dist/server/widgetsDevServer.js +17 -1
- package/dist/server/widgetsDevServer.js.map +1 -1
- package/dist/test/widget.test.js +22 -16
- package/dist/test/widget.test.js.map +1 -1
- package/dist/web/bridges/apps-sdk/adaptor.d.ts +12 -4
- package/dist/web/bridges/apps-sdk/adaptor.js +41 -5
- package/dist/web/bridges/apps-sdk/adaptor.js.map +1 -1
- package/dist/web/bridges/apps-sdk/bridge.d.ts +5 -5
- package/dist/web/bridges/apps-sdk/bridge.js.map +1 -1
- package/dist/web/bridges/apps-sdk/index.d.ts +2 -2
- package/dist/web/bridges/apps-sdk/index.js +1 -1
- package/dist/web/bridges/apps-sdk/index.js.map +1 -1
- package/dist/web/bridges/apps-sdk/types.d.ts +23 -23
- package/dist/web/bridges/apps-sdk/types.js.map +1 -1
- package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +2 -0
- package/dist/web/bridges/apps-sdk/{use-apps-sdk-bridge.js → use-apps-sdk-context.js} +2 -2
- package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -0
- package/dist/web/bridges/mcp-app/adaptor.d.ts +20 -3
- package/dist/web/bridges/mcp-app/adaptor.js +59 -14
- package/dist/web/bridges/mcp-app/adaptor.js.map +1 -1
- package/dist/web/bridges/mcp-app/bridge.d.ts +5 -5
- package/dist/web/bridges/mcp-app/bridge.js +21 -17
- package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
- package/dist/web/bridges/mcp-app/index.d.ts +2 -2
- package/dist/web/bridges/mcp-app/index.js +1 -1
- package/dist/web/bridges/mcp-app/index.js.map +1 -1
- package/dist/web/bridges/mcp-app/types.d.ts +2 -2
- package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +5 -0
- package/dist/web/bridges/mcp-app/{use-mcp-app-bridge.js → use-mcp-app-context.js} +2 -2
- package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -0
- package/dist/web/bridges/mcp-app/use-mcp-app-context.test.d.ts +1 -0
- package/dist/web/bridges/mcp-app/{use-mcp-app-bridge.test.js → use-mcp-app-context.test.js} +15 -6
- package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -0
- package/dist/web/bridges/types.d.ts +32 -4
- package/dist/web/components/modal-provider.d.ts +4 -0
- package/dist/web/components/modal-provider.js +47 -0
- package/dist/web/components/modal-provider.js.map +1 -0
- package/dist/web/create-store.test.js +8 -4
- package/dist/web/create-store.test.js.map +1 -1
- package/dist/web/data-llm.test.js +11 -10
- package/dist/web/data-llm.test.js.map +1 -1
- package/dist/web/generate-helpers.d.ts +1 -1
- package/dist/web/generate-helpers.js +1 -1
- package/dist/web/hooks/index.d.ts +2 -1
- package/dist/web/hooks/index.js +1 -0
- package/dist/web/hooks/index.js.map +1 -1
- package/dist/web/hooks/use-display-mode.d.ts +3 -3
- package/dist/web/hooks/use-display-mode.js.map +1 -1
- package/dist/web/hooks/use-display-mode.test-d.d.ts +1 -0
- package/dist/web/hooks/use-display-mode.test-d.js +8 -0
- package/dist/web/hooks/use-display-mode.test-d.js.map +1 -0
- package/dist/web/hooks/use-files.d.ts +2 -6
- package/dist/web/hooks/use-files.js +4 -2
- package/dist/web/hooks/use-files.js.map +1 -1
- package/dist/web/hooks/use-files.test.js +6 -1
- package/dist/web/hooks/use-files.test.js.map +1 -1
- package/dist/web/hooks/use-layout.d.ts +1 -1
- package/dist/web/hooks/use-layout.test.js +2 -1
- package/dist/web/hooks/use-layout.test.js.map +1 -1
- package/dist/web/hooks/use-open-external.d.ts +3 -1
- package/dist/web/hooks/use-open-external.js +1 -1
- package/dist/web/hooks/use-open-external.js.map +1 -1
- package/dist/web/hooks/use-open-external.test.js +11 -1
- package/dist/web/hooks/use-open-external.test.js.map +1 -1
- package/dist/web/hooks/use-request-modal.d.ts +2 -2
- package/dist/web/hooks/use-request-modal.js +9 -7
- package/dist/web/hooks/use-request-modal.js.map +1 -1
- package/dist/web/hooks/use-set-open-in-app-url.d.ts +1 -0
- package/dist/web/hooks/use-set-open-in-app-url.js +8 -0
- package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -0
- package/dist/web/hooks/use-set-open-in-app-url.test.d.ts +1 -0
- package/dist/web/hooks/use-set-open-in-app-url.test.js +43 -0
- package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -0
- package/dist/web/hooks/use-tool-info.test.js +2 -1
- package/dist/web/hooks/use-tool-info.test.js.map +1 -1
- package/dist/web/hooks/use-user.test.js +2 -1
- package/dist/web/hooks/use-user.test.js.map +1 -1
- package/dist/web/hooks/use-widget-state.test.js +9 -6
- package/dist/web/hooks/use-widget-state.test.js.map +1 -1
- package/dist/web/mount-widget.js +9 -1
- package/dist/web/mount-widget.js.map +1 -1
- package/dist/web/plugin/plugin.js +24 -9
- package/dist/web/plugin/plugin.js.map +1 -1
- package/dist/web/plugin/validate-widget.d.ts +5 -0
- package/dist/web/plugin/validate-widget.js +27 -0
- package/dist/web/plugin/validate-widget.js.map +1 -0
- package/dist/web/plugin/validate-widget.test.d.ts +1 -0
- package/dist/web/plugin/validate-widget.test.js +42 -0
- package/dist/web/plugin/validate-widget.test.js.map +1 -0
- package/dist/web/proxy.js +0 -1
- package/dist/web/proxy.js.map +1 -1
- package/package.json +34 -23
- package/tsconfig.base.json +28 -0
- package/dist/web/bridges/apps-sdk/use-apps-sdk-bridge.d.ts +0 -2
- package/dist/web/bridges/apps-sdk/use-apps-sdk-bridge.js.map +0 -1
- package/dist/web/bridges/mcp-app/use-mcp-app-bridge.d.ts +0 -5
- package/dist/web/bridges/mcp-app/use-mcp-app-bridge.js.map +0 -1
- package/dist/web/bridges/mcp-app/use-mcp-app-bridge.test.js.map +0 -1
- /package/dist/{web/bridges/mcp-app/use-mcp-app-bridge.test.d.ts → server/asset-base-url-transform-plugin.test.d.ts} +0 -0
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { UnknownObject } from "../../types.js";
|
|
2
|
-
import type { CallToolArgs, CallToolResponse } from "../types.js";
|
|
2
|
+
import type { CallToolArgs, CallToolResponse, FileMetadata, RequestModalOptions } from "../types.js";
|
|
3
3
|
type DisplayMode = "pip" | "inline" | "fullscreen" | "modal";
|
|
4
|
-
type
|
|
5
|
-
type
|
|
6
|
-
|
|
4
|
+
type RequestDisplayMode = Exclude<DisplayMode, "modal">;
|
|
5
|
+
export type AppsSdkWidgetState = {
|
|
6
|
+
modelContent: Record<string, unknown>;
|
|
7
|
+
privateContent: Record<string, unknown>;
|
|
8
|
+
imageIds?: string[];
|
|
7
9
|
};
|
|
8
10
|
export declare const TOOL_RESPONSE_EVENT_TYPE = "openai:tool_response";
|
|
9
11
|
export declare class ToolResponseEvent extends CustomEvent<{
|
|
@@ -16,17 +18,17 @@ export declare class ToolResponseEvent extends CustomEvent<{
|
|
|
16
18
|
}
|
|
17
19
|
declare global {
|
|
18
20
|
interface Window {
|
|
19
|
-
openai:
|
|
21
|
+
openai: AppsSdkMethods & AppsSdkContext;
|
|
20
22
|
}
|
|
21
23
|
interface WindowEventMap {
|
|
22
24
|
[SET_GLOBALS_EVENT_TYPE]: SetGlobalsEvent;
|
|
23
25
|
}
|
|
24
26
|
}
|
|
25
|
-
export type
|
|
27
|
+
export type AppsSdkContext<ToolInput extends UnknownObject = Record<never, unknown>, ToolOutput extends UnknownObject = UnknownObject, ToolResponseMetadata extends UnknownObject = UnknownObject, WS extends AppsSdkWidgetState = AppsSdkWidgetState> = {
|
|
26
28
|
theme: Theme;
|
|
27
29
|
userAgent: UserAgent;
|
|
28
30
|
locale: string;
|
|
29
|
-
maxHeight: number;
|
|
31
|
+
maxHeight: number | undefined;
|
|
30
32
|
displayMode: DisplayMode;
|
|
31
33
|
safeArea: SafeArea;
|
|
32
34
|
view: View;
|
|
@@ -35,19 +37,9 @@ export type OpenAiProperties<ToolInput extends UnknownObject = Record<never, unk
|
|
|
35
37
|
text: string;
|
|
36
38
|
} | null;
|
|
37
39
|
toolResponseMetadata: ToolResponseMetadata | null;
|
|
38
|
-
widgetState:
|
|
40
|
+
widgetState: WS | null;
|
|
39
41
|
};
|
|
40
|
-
export type
|
|
41
|
-
title?: string;
|
|
42
|
-
params?: Record<string, unknown>;
|
|
43
|
-
anchor?: {
|
|
44
|
-
top?: number;
|
|
45
|
-
left?: number;
|
|
46
|
-
width?: number;
|
|
47
|
-
height?: number;
|
|
48
|
-
};
|
|
49
|
-
};
|
|
50
|
-
export type OpenAiMethods<WidgetState extends UnknownObject = UnknownObject> = {
|
|
42
|
+
export type AppsSdkMethods<WS extends AppsSdkWidgetState = AppsSdkWidgetState> = {
|
|
51
43
|
/** Calls a tool on your MCP. Returns the full response. */
|
|
52
44
|
callTool: <ToolArgs extends CallToolArgs = null, ToolResponse extends CallToolResponse = CallToolResponse>(name: string, args: ToolArgs) => Promise<ToolResponse>;
|
|
53
45
|
/** Triggers a followup turn in the ChatGPT conversation */
|
|
@@ -57,22 +49,23 @@ export type OpenAiMethods<WidgetState extends UnknownObject = UnknownObject> = {
|
|
|
57
49
|
/** Opens an external link, redirects web page or mobile app */
|
|
58
50
|
openExternal(args: {
|
|
59
51
|
href: string;
|
|
52
|
+
redirectUrl?: false;
|
|
60
53
|
}): void;
|
|
61
54
|
/** For transitioning an app from inline to fullscreen or pip */
|
|
62
55
|
requestDisplayMode: (args: {
|
|
63
|
-
mode:
|
|
56
|
+
mode: RequestDisplayMode;
|
|
64
57
|
}) => Promise<{
|
|
65
58
|
/**
|
|
66
59
|
* The granted display mode. The host may reject the request.
|
|
67
60
|
* For mobile, PiP is always coerced to fullscreen.
|
|
68
61
|
*/
|
|
69
|
-
mode:
|
|
62
|
+
mode: RequestDisplayMode;
|
|
70
63
|
}>;
|
|
71
64
|
/**
|
|
72
65
|
* Sets the widget state.
|
|
73
66
|
* This state is persisted across widget renders.
|
|
74
67
|
*/
|
|
75
|
-
setWidgetState: (state:
|
|
68
|
+
setWidgetState: (state: WS) => Promise<void>;
|
|
76
69
|
/**
|
|
77
70
|
* Opens a modal portaled outside of the widget iFrame.
|
|
78
71
|
* This ensures the modal is correctly displayed and not limited to the widget's area.
|
|
@@ -87,10 +80,17 @@ export type OpenAiMethods<WidgetState extends UnknownObject = UnknownObject> = {
|
|
|
87
80
|
getFileDownloadUrl: (file: FileMetadata) => Promise<{
|
|
88
81
|
downloadUrl: string;
|
|
89
82
|
}>;
|
|
83
|
+
/**
|
|
84
|
+
* Sets the open in app URL.
|
|
85
|
+
* This URL will be opened in the app when the user clicks on the top right button in fullscreen mode.
|
|
86
|
+
*/
|
|
87
|
+
setOpenInAppUrl: (args: {
|
|
88
|
+
href: string;
|
|
89
|
+
}) => Promise<void>;
|
|
90
90
|
};
|
|
91
91
|
export declare const SET_GLOBALS_EVENT_TYPE = "openai:set_globals";
|
|
92
92
|
export declare class SetGlobalsEvent extends CustomEvent<{
|
|
93
|
-
globals: Partial<
|
|
93
|
+
globals: Partial<AppsSdkContext>;
|
|
94
94
|
}> {
|
|
95
95
|
readonly type = "openai:set_globals";
|
|
96
96
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/web/bridges/apps-sdk/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/web/bridges/apps-sdk/types.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,MAAM,wBAAwB,GAAG,sBAAsB,CAAC;AAC/D,MAAM,OAAO,iBAAkB,SAAQ,WAErC;IACkB,IAAI,GAAG,wBAAwB,CAAC;CACnD;AA2FD,sDAAsD;AACtD,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAC3D,MAAM,OAAO,eAAgB,SAAQ,WAEnC;IACkB,IAAI,GAAG,sBAAsB,CAAC;CACjD"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useSyncExternalStore } from "react";
|
|
2
2
|
import { AppsSdkBridge } from "./bridge.js";
|
|
3
|
-
export function
|
|
3
|
+
export function useAppsSdkContext(key) {
|
|
4
4
|
const bridge = AppsSdkBridge.getInstance();
|
|
5
5
|
return useSyncExternalStore(bridge.subscribe(key), () => bridge.getSnapshot(key));
|
|
6
6
|
}
|
|
7
|
-
//# sourceMappingURL=use-apps-sdk-
|
|
7
|
+
//# sourceMappingURL=use-apps-sdk-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-apps-sdk-context.js","sourceRoot":"","sources":["../../../../src/web/bridges/apps-sdk/use-apps-sdk-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,UAAU,iBAAiB,CAC/B,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"}
|
|
@@ -1,19 +1,36 @@
|
|
|
1
1
|
import type { McpUiRequestDisplayModeResult } from "@modelcontextprotocol/ext-apps";
|
|
2
|
-
import type { Adaptor, CallToolResponse,
|
|
2
|
+
import type { Adaptor, CallToolResponse, HostContext, HostContextStore, OpenExternalOptions, RequestDisplayMode, RequestModalOptions, SetWidgetStateAction } from "../types.js";
|
|
3
3
|
export declare class McpAppAdaptor implements Adaptor {
|
|
4
4
|
private static instance;
|
|
5
5
|
private stores;
|
|
6
6
|
private _widgetState;
|
|
7
7
|
private widgetStateListeners;
|
|
8
|
+
private _viewState;
|
|
9
|
+
private viewListeners;
|
|
8
10
|
private constructor();
|
|
9
11
|
static getInstance(): McpAppAdaptor;
|
|
10
12
|
static resetInstance(): void;
|
|
11
13
|
getHostContextStore<K extends keyof HostContext>(key: K): HostContextStore<K>;
|
|
12
14
|
callTool: <ToolArgs extends Record<string, unknown> | null = null, ToolResponse extends CallToolResponse = CallToolResponse>(name: string, args: ToolArgs) => Promise<ToolResponse>;
|
|
13
|
-
requestDisplayMode: (mode:
|
|
15
|
+
requestDisplayMode: (mode: RequestDisplayMode) => Promise<McpUiRequestDisplayModeResult>;
|
|
14
16
|
sendFollowUpMessage: (prompt: string) => Promise<void>;
|
|
15
|
-
openExternal(href: string): void;
|
|
17
|
+
openExternal(href: string, options?: OpenExternalOptions): void;
|
|
16
18
|
private initializeStores;
|
|
17
19
|
setWidgetState: (stateOrUpdater: SetWidgetStateAction) => Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* @throws File upload is not supported in MCP App.
|
|
22
|
+
*/
|
|
23
|
+
uploadFile(): Promise<{
|
|
24
|
+
fileId: string;
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* @throws File download is not supported in MCP App.
|
|
28
|
+
*/
|
|
29
|
+
getFileDownloadUrl(): Promise<{
|
|
30
|
+
downloadUrl: string;
|
|
31
|
+
}>;
|
|
32
|
+
openModal(options: RequestModalOptions): void;
|
|
33
|
+
closeModal(): void;
|
|
34
|
+
setOpenInAppUrl(_href: string): Promise<void>;
|
|
18
35
|
private createHostContextStore;
|
|
19
36
|
}
|
|
@@ -5,6 +5,10 @@ export class McpAppAdaptor {
|
|
|
5
5
|
stores;
|
|
6
6
|
_widgetState = null;
|
|
7
7
|
widgetStateListeners = new Set();
|
|
8
|
+
_viewState = {
|
|
9
|
+
mode: "inline",
|
|
10
|
+
};
|
|
11
|
+
viewListeners = new Set();
|
|
8
12
|
constructor() {
|
|
9
13
|
this.stores = this.initializeStores();
|
|
10
14
|
}
|
|
@@ -43,13 +47,10 @@ export class McpAppAdaptor {
|
|
|
43
47
|
};
|
|
44
48
|
requestDisplayMode = (mode) => {
|
|
45
49
|
const bridge = McpAppBridge.getInstance();
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
throw new Error("Modal display mode is not accessible in MCP App.");
|
|
50
|
+
return bridge.request({
|
|
51
|
+
method: "ui/request-display-mode",
|
|
52
|
+
params: { mode },
|
|
53
|
+
});
|
|
53
54
|
};
|
|
54
55
|
sendFollowUpMessage = async (prompt) => {
|
|
55
56
|
const bridge = McpAppBridge.getInstance();
|
|
@@ -66,7 +67,10 @@ export class McpAppAdaptor {
|
|
|
66
67
|
},
|
|
67
68
|
});
|
|
68
69
|
};
|
|
69
|
-
openExternal(href) {
|
|
70
|
+
openExternal(href, options) {
|
|
71
|
+
if (options?.redirectUrl === false) {
|
|
72
|
+
console.warn("[skybridge] redirectUrl option is not supported by the MCP ui/open-link protocol and will be ignored.");
|
|
73
|
+
}
|
|
70
74
|
const bridge = McpAppBridge.getInstance();
|
|
71
75
|
bridge.request({
|
|
72
76
|
method: "ui/open-link",
|
|
@@ -83,9 +87,9 @@ export class McpAppAdaptor {
|
|
|
83
87
|
displayMode: this.createHostContextStore(["displayMode"], ({ displayMode }) => displayMode ?? "inline"),
|
|
84
88
|
maxHeight: this.createHostContextStore(["containerDimensions"], ({ containerDimensions }) => {
|
|
85
89
|
if (containerDimensions && "maxHeight" in containerDimensions) {
|
|
86
|
-
return containerDimensions.maxHeight
|
|
90
|
+
return containerDimensions.maxHeight;
|
|
87
91
|
}
|
|
88
|
-
return
|
|
92
|
+
return undefined;
|
|
89
93
|
}),
|
|
90
94
|
userAgent: this.createHostContextStore(["platform", "deviceCapabilities"], ({ platform, deviceCapabilities }) => ({
|
|
91
95
|
device: {
|
|
@@ -100,6 +104,15 @@ export class McpAppAdaptor {
|
|
|
100
104
|
toolInput: this.createHostContextStore(["toolInput"], ({ toolInput }) => toolInput ?? null),
|
|
101
105
|
toolOutput: this.createHostContextStore(["toolResult"], ({ toolResult }) => toolResult?.structuredContent ?? null),
|
|
102
106
|
toolResponseMetadata: this.createHostContextStore(["toolResult"], ({ toolResult }) => toolResult?._meta ?? null),
|
|
107
|
+
view: {
|
|
108
|
+
subscribe: (onChange) => {
|
|
109
|
+
this.viewListeners.add(onChange);
|
|
110
|
+
return () => {
|
|
111
|
+
this.viewListeners.delete(onChange);
|
|
112
|
+
};
|
|
113
|
+
},
|
|
114
|
+
getSnapshot: () => this._viewState,
|
|
115
|
+
},
|
|
103
116
|
widgetState: {
|
|
104
117
|
subscribe: (onChange) => {
|
|
105
118
|
this.widgetStateListeners.add(onChange);
|
|
@@ -115,16 +128,48 @@ export class McpAppAdaptor {
|
|
|
115
128
|
const newState = typeof stateOrUpdater === "function"
|
|
116
129
|
? stateOrUpdater(this._widgetState)
|
|
117
130
|
: stateOrUpdater;
|
|
131
|
+
// must happen before the async bridge call to ensure the state is updated immediately for the UI,
|
|
132
|
+
// otherwise successive calls to setWidgetState may have stale state
|
|
133
|
+
this._widgetState = newState;
|
|
134
|
+
this.widgetStateListeners.forEach((listener) => {
|
|
135
|
+
listener();
|
|
136
|
+
});
|
|
118
137
|
const bridge = McpAppBridge.getInstance();
|
|
119
138
|
await bridge.request({
|
|
120
139
|
method: "ui/update-model-context",
|
|
121
|
-
params: {
|
|
140
|
+
params: {
|
|
141
|
+
structuredContent: newState,
|
|
142
|
+
content: [{ type: "text", text: JSON.stringify(newState) }],
|
|
143
|
+
},
|
|
122
144
|
});
|
|
123
|
-
|
|
124
|
-
|
|
145
|
+
};
|
|
146
|
+
/**
|
|
147
|
+
* @throws File upload is not supported in MCP App.
|
|
148
|
+
*/
|
|
149
|
+
uploadFile() {
|
|
150
|
+
throw new Error("File upload is not supported in MCP App.");
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* @throws File download is not supported in MCP App.
|
|
154
|
+
*/
|
|
155
|
+
getFileDownloadUrl() {
|
|
156
|
+
throw new Error("File download is not supported in MCP App.");
|
|
157
|
+
}
|
|
158
|
+
openModal(options) {
|
|
159
|
+
this._viewState = { mode: "modal", params: options.params };
|
|
160
|
+
this.viewListeners.forEach((listener) => {
|
|
125
161
|
listener();
|
|
126
162
|
});
|
|
127
|
-
}
|
|
163
|
+
}
|
|
164
|
+
closeModal() {
|
|
165
|
+
this._viewState = { mode: "inline" };
|
|
166
|
+
this.viewListeners.forEach((listener) => {
|
|
167
|
+
listener();
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
setOpenInAppUrl(_href) {
|
|
171
|
+
throw new Error("setOpenInAppUrl is not implemented in MCP App.");
|
|
172
|
+
}
|
|
128
173
|
createHostContextStore(keys, computeSnapshot) {
|
|
129
174
|
const bridge = McpAppBridge.getInstance();
|
|
130
175
|
let cachedValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adaptor.js","sourceRoot":"","sources":["../../../../src/web/bridges/mcp-app/adaptor.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"adaptor.js","sourceRoot":"","sources":["../../../../src/web/bridges/mcp-app/adaptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { McpUiHostContext, McpUiInitializeRequest } from "@modelcontextprotocol/ext-apps";
|
|
2
2
|
import type { Bridge, Subscribe } from "../types.js";
|
|
3
|
-
import type {
|
|
3
|
+
import type { McpAppContext, McpAppContextKey } from "./types.js";
|
|
4
4
|
type McpAppInitializationOptions = Pick<McpUiInitializeRequest["params"], "appInfo">;
|
|
5
5
|
export declare class McpAppBridge implements Bridge<McpUiHostContext> {
|
|
6
6
|
private static instance;
|
|
7
|
-
context:
|
|
7
|
+
context: McpAppContext;
|
|
8
8
|
private listeners;
|
|
9
9
|
private pendingRequests;
|
|
10
10
|
private nextId;
|
|
@@ -14,9 +14,9 @@ export declare class McpAppBridge implements Bridge<McpUiHostContext> {
|
|
|
14
14
|
private cleanupSizeObserver;
|
|
15
15
|
constructor(options: McpAppInitializationOptions, requestTimeout?: number);
|
|
16
16
|
static getInstance(options?: Partial<McpAppInitializationOptions>, requestTimeout?: number): McpAppBridge;
|
|
17
|
-
subscribe(key:
|
|
18
|
-
subscribe(keys: readonly
|
|
19
|
-
getSnapshot<K extends keyof
|
|
17
|
+
subscribe(key: McpAppContextKey): Subscribe;
|
|
18
|
+
subscribe(keys: readonly McpAppContextKey[]): Subscribe;
|
|
19
|
+
getSnapshot<K extends keyof McpAppContext>(key: K): McpAppContext[K];
|
|
20
20
|
cleanup: () => void;
|
|
21
21
|
static resetInstance(): void;
|
|
22
22
|
request<R extends {
|
|
@@ -146,6 +146,11 @@ export class McpAppBridge {
|
|
|
146
146
|
case "ui/notifications/host-context-changed":
|
|
147
147
|
this.updateContext(notification.params);
|
|
148
148
|
return;
|
|
149
|
+
case "ui/notifications/tool-input-partial":
|
|
150
|
+
this.updateContext({
|
|
151
|
+
toolInput: notification.params.arguments ?? {},
|
|
152
|
+
});
|
|
153
|
+
return;
|
|
149
154
|
case "ui/notifications/tool-input":
|
|
150
155
|
this.updateContext({
|
|
151
156
|
toolInput: notification.params.arguments ?? {},
|
|
@@ -220,23 +225,22 @@ export class McpAppBridge {
|
|
|
220
225
|
scheduled = true;
|
|
221
226
|
requestAnimationFrame(() => {
|
|
222
227
|
scheduled = false;
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
//
|
|
226
|
-
//
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
const height = Math.ceil(rect.height);
|
|
228
|
+
let width;
|
|
229
|
+
let height;
|
|
230
|
+
// In fullscreen mode, use viewport size since the widget should fill
|
|
231
|
+
// the entire available space provided by the host.
|
|
232
|
+
if (this.context.displayMode === "fullscreen") {
|
|
233
|
+
width = window.innerWidth;
|
|
234
|
+
height = window.innerHeight;
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
// Use scrollWidth/scrollHeight to measure actual rendered content size.
|
|
238
|
+
// This works better than fit-content for viewport-based layouts (vw/vh)
|
|
239
|
+
// and fluid elements like maps that want to fill available space.
|
|
240
|
+
const body = document.body;
|
|
241
|
+
width = Math.ceil(body.scrollWidth);
|
|
242
|
+
height = Math.ceil(body.scrollHeight);
|
|
243
|
+
}
|
|
240
244
|
// Only send if size actually changed (prevents feedback loops from
|
|
241
245
|
// style changes)
|
|
242
246
|
if (width !== lastWidth || height !== lastHeight) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../../../src/web/bridges/mcp-app/bridge.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../../../src/web/bridges/mcp-app/bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { McpAppAdaptor } from "./adaptor.js";
|
|
2
2
|
export { McpAppBridge } from "./bridge.js";
|
|
3
|
-
export type {
|
|
4
|
-
export {
|
|
3
|
+
export type { McpAppContext, McpAppContextKey, McpToolState, } from "./types.js";
|
|
4
|
+
export { useMcpAppContext } from "./use-mcp-app-context.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/web/bridges/mcp-app/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/web/bridges/mcp-app/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -4,5 +4,5 @@ export type McpToolState = {
|
|
|
4
4
|
toolResult: McpUiToolResultNotification["params"] | null;
|
|
5
5
|
toolCancelled: McpUiToolCancelledNotification["params"] | null;
|
|
6
6
|
};
|
|
7
|
-
export type
|
|
8
|
-
export type
|
|
7
|
+
export type McpAppContext = McpUiHostContext & McpToolState;
|
|
8
|
+
export type McpAppContextKey = keyof McpAppContext;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { McpUiInitializeRequest } from "@modelcontextprotocol/ext-apps";
|
|
2
|
+
import type { McpAppContext } from "./types.js";
|
|
3
|
+
type McpAppInitializationOptions = Pick<McpUiInitializeRequest["params"], "appInfo">;
|
|
4
|
+
export declare function useMcpAppContext<K extends keyof McpAppContext>(key: K, options?: Partial<McpAppInitializationOptions>, requestTimeout?: number): McpAppContext[K];
|
|
5
|
+
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useSyncExternalStore } from "react";
|
|
2
2
|
import { McpAppBridge } from "./bridge.js";
|
|
3
|
-
export function
|
|
3
|
+
export function useMcpAppContext(key, options, requestTimeout) {
|
|
4
4
|
const bridge = McpAppBridge.getInstance(options, requestTimeout);
|
|
5
5
|
return useSyncExternalStore(bridge.subscribe(key), () => bridge.getSnapshot(key));
|
|
6
6
|
}
|
|
7
|
-
//# sourceMappingURL=use-mcp-app-
|
|
7
|
+
//# sourceMappingURL=use-mcp-app-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-mcp-app-context.js","sourceRoot":"","sources":["../../../../src/web/bridges/mcp-app/use-mcp-app-context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,UAAU,gBAAgB,CAC9B,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 @@
|
|
|
1
|
+
export {};
|
|
@@ -2,8 +2,8 @@ import { act, renderHook, waitFor } from "@testing-library/react";
|
|
|
2
2
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
3
|
import { getMcpAppHostPostMessageMock, MockResizeObserver, } from "../../hooks/test/utils.js";
|
|
4
4
|
import { McpAppBridge } from "./bridge.js";
|
|
5
|
-
import {
|
|
6
|
-
describe("
|
|
5
|
+
import { useMcpAppContext } from "./use-mcp-app-context.js";
|
|
6
|
+
describe("useMcpAppContext", () => {
|
|
7
7
|
beforeEach(async () => {
|
|
8
8
|
vi.stubGlobal("skybridge", { hostType: "mcp-app" });
|
|
9
9
|
vi.stubGlobal("ResizeObserver", MockResizeObserver);
|
|
@@ -17,7 +17,7 @@ describe("useMcpAppBridge", () => {
|
|
|
17
17
|
vi.stubGlobal("parent", {
|
|
18
18
|
postMessage: getMcpAppHostPostMessageMock({ theme: "light" }),
|
|
19
19
|
});
|
|
20
|
-
const { result } = renderHook(() =>
|
|
20
|
+
const { result } = renderHook(() => useMcpAppContext("theme"));
|
|
21
21
|
await waitFor(() => {
|
|
22
22
|
expect(result.current).toBe("light");
|
|
23
23
|
});
|
|
@@ -29,7 +29,7 @@ describe("useMcpAppBridge", () => {
|
|
|
29
29
|
.mockImplementation(() => { });
|
|
30
30
|
const nonRespondingMock = vi.fn();
|
|
31
31
|
vi.stubGlobal("parent", { postMessage: nonRespondingMock });
|
|
32
|
-
renderHook(() =>
|
|
32
|
+
renderHook(() => useMcpAppContext("theme", undefined, 100));
|
|
33
33
|
expect(nonRespondingMock).toHaveBeenCalledWith(expect.objectContaining({ method: "ui/initialize" }), "*");
|
|
34
34
|
await act(async () => {
|
|
35
35
|
await vi.advanceTimersByTimeAsync(100);
|
|
@@ -39,9 +39,18 @@ describe("useMcpAppBridge", () => {
|
|
|
39
39
|
vi.useRealTimers();
|
|
40
40
|
});
|
|
41
41
|
it("should send size-changed notification after successful initialization", async () => {
|
|
42
|
+
// Mock body dimensions to non-zero (size-changed only sends when dimensions change)
|
|
43
|
+
Object.defineProperty(document.body, "scrollWidth", {
|
|
44
|
+
value: 800,
|
|
45
|
+
configurable: true,
|
|
46
|
+
});
|
|
47
|
+
Object.defineProperty(document.body, "scrollHeight", {
|
|
48
|
+
value: 600,
|
|
49
|
+
configurable: true,
|
|
50
|
+
});
|
|
42
51
|
const postMessageMock = getMcpAppHostPostMessageMock({ theme: "light" });
|
|
43
52
|
vi.stubGlobal("parent", { postMessage: postMessageMock });
|
|
44
|
-
renderHook(() =>
|
|
53
|
+
renderHook(() => useMcpAppContext("theme"));
|
|
45
54
|
await waitFor(() => {
|
|
46
55
|
expect(postMessageMock).toHaveBeenCalledWith(expect.objectContaining({
|
|
47
56
|
jsonrpc: "2.0",
|
|
@@ -54,4 +63,4 @@ describe("useMcpAppBridge", () => {
|
|
|
54
63
|
});
|
|
55
64
|
});
|
|
56
65
|
});
|
|
57
|
-
//# sourceMappingURL=use-mcp-app-
|
|
66
|
+
//# sourceMappingURL=use-mcp-app-context.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-mcp-app-context.test.js","sourceRoot":"","sources":["../../../../src/web/bridges/mcp-app/use-mcp-app-context.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import type { useSyncExternalStore } from "react";
|
|
|
3
3
|
import type { WidgetHostType } from "../../server/index.js";
|
|
4
4
|
export type SkybridgeProperties = {
|
|
5
5
|
hostType: WidgetHostType;
|
|
6
|
+
serverUrl: string;
|
|
6
7
|
};
|
|
7
8
|
declare global {
|
|
8
9
|
interface Window {
|
|
@@ -18,6 +19,7 @@ export type CallToolResponse = {
|
|
|
18
19
|
meta?: CallToolResult["_meta"];
|
|
19
20
|
};
|
|
20
21
|
export type DisplayMode = "pip" | "inline" | "fullscreen" | "modal";
|
|
22
|
+
export type RequestDisplayMode = Exclude<DisplayMode, "modal">;
|
|
21
23
|
export type Theme = "light" | "dark";
|
|
22
24
|
export type DeviceType = "mobile" | "tablet" | "desktop" | "unknown";
|
|
23
25
|
export type SafeAreaInsets = {
|
|
@@ -43,11 +45,15 @@ export interface HostContext {
|
|
|
43
45
|
locale: string;
|
|
44
46
|
displayMode: DisplayMode;
|
|
45
47
|
safeArea: SafeArea;
|
|
46
|
-
maxHeight: number;
|
|
48
|
+
maxHeight: number | undefined;
|
|
47
49
|
userAgent: UserAgent;
|
|
48
50
|
toolInput: Record<string, unknown> | null;
|
|
49
51
|
toolOutput: Record<string, unknown> | null;
|
|
50
52
|
toolResponseMetadata: Record<string, unknown> | null;
|
|
53
|
+
view: {
|
|
54
|
+
mode: DisplayMode;
|
|
55
|
+
params?: Record<string, unknown>;
|
|
56
|
+
};
|
|
51
57
|
widgetState: Record<string, unknown> | null;
|
|
52
58
|
}
|
|
53
59
|
export type Subscribe = Parameters<typeof useSyncExternalStore>[0];
|
|
@@ -62,13 +68,35 @@ export type HostContextStore<K extends keyof HostContext> = {
|
|
|
62
68
|
};
|
|
63
69
|
export type WidgetState = Record<string, unknown>;
|
|
64
70
|
export type SetWidgetStateAction = WidgetState | ((prevState: WidgetState | null) => WidgetState);
|
|
71
|
+
export type FileMetadata = {
|
|
72
|
+
fileId: string;
|
|
73
|
+
};
|
|
74
|
+
export type RequestModalOptions = {
|
|
75
|
+
title?: string;
|
|
76
|
+
params?: Record<string, unknown>;
|
|
77
|
+
anchor?: {
|
|
78
|
+
top?: number;
|
|
79
|
+
left?: number;
|
|
80
|
+
width?: number;
|
|
81
|
+
height?: number;
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
export type OpenExternalOptions = {
|
|
85
|
+
redirectUrl?: false;
|
|
86
|
+
};
|
|
65
87
|
export interface Adaptor {
|
|
66
88
|
getHostContextStore<K extends keyof HostContext>(key: K): HostContextStore<K>;
|
|
67
89
|
callTool<ToolArgs extends CallToolArgs = null, ToolResponse extends CallToolResponse = CallToolResponse>(name: string, args: ToolArgs): Promise<ToolResponse>;
|
|
68
|
-
requestDisplayMode(mode:
|
|
69
|
-
mode:
|
|
90
|
+
requestDisplayMode(mode: RequestDisplayMode): Promise<{
|
|
91
|
+
mode: RequestDisplayMode;
|
|
70
92
|
}>;
|
|
71
93
|
sendFollowUpMessage(prompt: string): Promise<void>;
|
|
72
|
-
openExternal(href: string): void;
|
|
94
|
+
openExternal(href: string, options?: OpenExternalOptions): void;
|
|
73
95
|
setWidgetState(stateOrUpdater: SetWidgetStateAction): Promise<void>;
|
|
96
|
+
uploadFile(file: File): Promise<FileMetadata>;
|
|
97
|
+
getFileDownloadUrl(file: FileMetadata): Promise<{
|
|
98
|
+
downloadUrl: string;
|
|
99
|
+
}>;
|
|
100
|
+
openModal(options: RequestModalOptions): void;
|
|
101
|
+
setOpenInAppUrl(href: string): Promise<void>;
|
|
74
102
|
}
|