mcp-native 0.8.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -13
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +4 -0
- package/dist/legacy.d.ts.map +1 -0
- package/dist/legacy.js +4 -0
- package/dist/legacy.js.map +1 -0
- package/dist/mixed-surfaces.d.ts +129 -0
- package/dist/mixed-surfaces.d.ts.map +1 -0
- package/dist/mixed-surfaces.js +598 -0
- package/dist/mixed-surfaces.js.map +1 -0
- package/package.json +10 -6
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# mcp-native
|
|
4
4
|
|
|
5
|
-
### One entry point for the MCP Native
|
|
5
|
+
### One entry point for the MCP Native React Native host runtime
|
|
6
6
|
|
|
7
7
|
[](https://www.npmjs.com/package/mcp-native)
|
|
8
8
|
[](https://www.npmjs.com/package/mcp-native)
|
|
@@ -13,11 +13,23 @@
|
|
|
13
13
|
|
|
14
14
|
</div>
|
|
15
15
|
|
|
16
|
-
> **
|
|
16
|
+
> **Pre-1.0 release candidate:** MCP Native `0.9.x` is feature-complete for the documented React
|
|
17
|
+
> Native host scope, and the proposed `1.0.0` API is frozen. The stable compatibility guarantee
|
|
18
|
+
> begins after the remaining independent review and release gates are complete. Shipping hosts must
|
|
19
|
+
> still audit their policies, component mappings, permissions, WebView integration, and platform
|
|
20
|
+
> behavior.
|
|
17
21
|
|
|
18
|
-
> **Compatibility:** the
|
|
22
|
+
> **Compatibility:** the documented tool/resource and authorization boundary preserves MCP
|
|
23
|
+
> `2026-07-28` fields and passes its pinned conformance coverage. The package exposes the
|
|
24
|
+
> feature-scoped A2UI v1.0 Candidate profile and retains custom `0.1` APIs only as deprecated
|
|
25
|
+
> migration support; this is not an unqualified A2UI renderer claim. It also re-exports the
|
|
26
|
+
> documented stable MCP Apps `2026-01-26` native host-adapter profile. See the [A2UI profile](https://github.com/pablospaniard/mcp-native/blob/main/docs/a2ui-v1-conformance.md), [MCP Apps profile](https://github.com/pablospaniard/mcp-native/blob/main/docs/mcp-apps-compatibility.md), and [standards matrix](https://github.com/pablospaniard/mcp-native/blob/main/docs/standards-compatibility.md).
|
|
19
27
|
|
|
20
|
-
`mcp-native` is the convenience package for the runtime and UI APIs. It re-exports the runtime contracts, A2UI v1 lifecycle/capability/renderer-message APIs, trusted native renderer and hooks, deprecated custom surface migration APIs, and policy-gated WebView compatibility primitives from focused `@mcp-native/*` packages. Transport adapters are installed separately.
|
|
28
|
+
`mcp-native` is the convenience package for the runtime and UI APIs. It re-exports the runtime contracts, A2UI v1 lifecycle/capability/renderer-message APIs, trusted native renderer and hooks, host-owned mixed-surface coordinator, deprecated custom surface migration APIs, and policy-gated WebView compatibility primitives from focused `@mcp-native/*` packages. Transport adapters are installed separately.
|
|
29
|
+
|
|
30
|
+
Read the human-oriented [product guide](https://github.com/pablospaniard/mcp-native/blob/main/docs/product-guide.md)
|
|
31
|
+
and [mixed-surface guide](https://github.com/pablospaniard/mcp-native/blob/main/docs/mixed-surfaces.md)
|
|
32
|
+
before the API examples.
|
|
21
33
|
|
|
22
34
|
## Install
|
|
23
35
|
|
|
@@ -39,6 +51,9 @@ and the [`@mcp-native/react-native` adapter documentation](https://github.com/pa
|
|
|
39
51
|
|
|
40
52
|
## Deprecated `0.1` proof-model preview
|
|
41
53
|
|
|
54
|
+
For `0.9.x`, migrate these imports to `mcp-native/legacy`. Root aliases are removed at `1.0.0`;
|
|
55
|
+
the explicit legacy subpath stays frozen for migration and security fixes.
|
|
56
|
+
|
|
42
57
|
```tsx
|
|
43
58
|
import {
|
|
44
59
|
McpNativeSurface,
|
|
@@ -112,10 +127,10 @@ Install an individual package instead when you only need one layer.
|
|
|
112
127
|
|
|
113
128
|
Use the separately installable [`@mcp-native/mcp`](https://github.com/pablospaniard/mcp-native/tree/main/packages/mcp) package to connect these APIs to the official MCP TypeScript SDK without forcing that SDK dependency on every `mcp-native` consumer.
|
|
114
129
|
|
|
115
|
-
##
|
|
130
|
+
## Implemented in `0.9.0`
|
|
116
131
|
|
|
117
132
|
- transport-independent MCP runtime contracts;
|
|
118
|
-
-
|
|
133
|
+
- isolated migration support for the deprecated custom `0.1` surface;
|
|
119
134
|
- declared tool-action dispatch;
|
|
120
135
|
- strict A2UI resource-link resolution from tool results;
|
|
121
136
|
- schema-validated A2UI v1 JSONL lifecycle state and explicit host policies;
|
|
@@ -133,21 +148,24 @@ Use the separately installable [`@mcp-native/mcp`](https://github.com/pablospani
|
|
|
133
148
|
- typed adapters from trusted semantics into locally bundled design-system components;
|
|
134
149
|
- exact namespaced host-extension manifests, negotiation, opaque registries, local Fabric
|
|
135
150
|
registration, policy grants, and schema-valid events with inline catalogs disabled;
|
|
151
|
+
- host-owned native A2UI and isolated MCP Apps sibling lifecycle coordination;
|
|
136
152
|
- memoized render-plan and safely observed asynchronous action-dispatch hooks;
|
|
137
153
|
- policy-gated inline and remote HTML document descriptions;
|
|
138
154
|
- MCP `2026-07-28` tool/resource field preservation through the official SDK adapter;
|
|
139
155
|
- pinned current-protocol integration coverage through the SDK HTTP handler/fetch path;
|
|
140
156
|
- ESM exports, TypeScript declarations, automated tests, and signed npm provenance.
|
|
141
157
|
|
|
142
|
-
Release `0.
|
|
143
|
-
and
|
|
144
|
-
`
|
|
158
|
+
Release `0.9.0` adds host-owned mixed native/MCP Apps composition, a production-shaped reference
|
|
159
|
+
host, and the frozen `1.0.0` release-candidate API. Release `0.8.0` added policy-gated `Video` and
|
|
160
|
+
`AudioPlayer`, completed the pinned A2UI basic catalog, and added exact namespaced manifests and
|
|
161
|
+
local registration for compiled host extensions. Release `0.7.0` added the
|
|
145
162
|
non-media catalog, typed renderer-local bindings, bounded formatting and validation, host-callback
|
|
146
163
|
actions, required image grants, policy-gated HTTP(S) `openUrl`, and exact installed-subset
|
|
147
164
|
discovery. Release `0.6.0` added bounded consent, expiring/revocable host-owned grants, interactive
|
|
148
|
-
OAuth, scope history, lifecycle coordination, actionable states, and redacted operations.
|
|
149
|
-
|
|
150
|
-
|
|
165
|
+
OAuth, scope history, lifecycle coordination, actionable states, and redacted operations. The
|
|
166
|
+
packages intentionally do not claim MCP operations or A2UI features outside their documented
|
|
167
|
+
profiles. Full streaming host integration, transport placement for A2UI capability objects, and
|
|
168
|
+
separate non-blocking Expo Go integration PoCs remain deferred or excluded work. Follow the
|
|
151
169
|
[roadmap](https://github.com/pablospaniard/mcp-native/blob/main/docs/roadmap.md) for exact claim
|
|
152
170
|
boundaries.
|
|
153
171
|
|
|
@@ -155,7 +173,7 @@ boundaries.
|
|
|
155
173
|
|
|
156
174
|
Remote servers may provide declarative UI and actions, but the host owns component resolution, tool execution, permissions, and every sensitive capability. Unknown data fails closed at validation and policy boundaries.
|
|
157
175
|
|
|
158
|
-
Read the full [architecture](https://github.com/pablospaniard/mcp-native/blob/main/docs/RFC-0001-architecture.md) and [security policy](https://github.com/pablospaniard/mcp-native/blob/main/SECURITY.md) before
|
|
176
|
+
Read the full [architecture](https://github.com/pablospaniard/mcp-native/blob/main/docs/RFC-0001-architecture.md) and [security policy](https://github.com/pablospaniard/mcp-native/blob/main/SECURITY.md) before integrating or extending the runtime.
|
|
159
177
|
|
|
160
178
|
## License
|
|
161
179
|
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC"}
|
package/dist/legacy.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy.d.ts","sourceRoot":"","sources":["../src/legacy.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC"}
|
package/dist/legacy.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy.js","sourceRoot":"","sources":["../src/legacy.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { type A2uiV1SurfaceState, type A2uiV1SurfaceValidationPolicy } from "@mcp-native/a2ui";
|
|
2
|
+
import { McpAppsBridge, type McpAppsNativeSandboxConfiguration, type McpAppsResource } from "@mcp-native/webview";
|
|
3
|
+
export declare const MCP_NATIVE_MIXED_MAX_REGIONS = 32;
|
|
4
|
+
export declare const MCP_NATIVE_MIXED_MAX_LISTENERS = 64;
|
|
5
|
+
export type McpNativeMixedSurfaceKind = "a2ui" | "mcp-app";
|
|
6
|
+
export type McpNativeMixedSurfaceActivity = "background" | "foreground";
|
|
7
|
+
export type McpNativeMixedSurfaceVisibility = "hidden" | "visible";
|
|
8
|
+
export type McpNativeMixedSurfaceStatus = "cancelled" | "crashed" | "ready" | "starting";
|
|
9
|
+
export type McpNativeMixedSurfaceMemoryPressure = "critical" | "moderate";
|
|
10
|
+
export type McpNativeMixedSurfaceOrientation = "landscape-left" | "landscape-right" | "portrait" | "portrait-upside-down" | "unknown";
|
|
11
|
+
export interface McpNativeMixedSurfaceEnvironment {
|
|
12
|
+
readonly dynamicTypeScale: number;
|
|
13
|
+
readonly keyboardVisible: boolean;
|
|
14
|
+
readonly orientation: McpNativeMixedSurfaceOrientation;
|
|
15
|
+
readonly reducedMotion: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface McpNativeMixedSurfaceLifecycle {
|
|
18
|
+
readonly onCreate?: () => void | Promise<void>;
|
|
19
|
+
readonly onVisibilityChange?: (visibility: McpNativeMixedSurfaceVisibility) => void | Promise<void>;
|
|
20
|
+
readonly onActivityChange?: (activity: McpNativeMixedSurfaceActivity) => void | Promise<void>;
|
|
21
|
+
readonly onFocusChange?: (focused: boolean) => void | Promise<void>;
|
|
22
|
+
readonly onEnvironmentChange?: (environment: McpNativeMixedSurfaceEnvironment) => void | Promise<void>;
|
|
23
|
+
readonly onBack?: () => boolean | Promise<boolean>;
|
|
24
|
+
readonly onCancel?: (reason?: string) => void | Promise<void>;
|
|
25
|
+
readonly onCrash?: (error: unknown) => void | Promise<void>;
|
|
26
|
+
readonly onRecover?: () => void | Promise<void>;
|
|
27
|
+
readonly onMemoryPressure?: (pressure: McpNativeMixedSurfaceMemoryPressure) => void | Promise<void>;
|
|
28
|
+
readonly onDispose?: () => void | Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
interface McpNativeMixedSurfaceRegionBase {
|
|
31
|
+
/** Host-authored stable identifier. Server surface IDs and resource URIs are not used here. */
|
|
32
|
+
readonly id: string;
|
|
33
|
+
readonly accessibilityLabel: string;
|
|
34
|
+
readonly kind: McpNativeMixedSurfaceKind;
|
|
35
|
+
}
|
|
36
|
+
export interface McpNativeMixedA2uiRegion extends McpNativeMixedSurfaceRegionBase {
|
|
37
|
+
readonly kind: "a2ui";
|
|
38
|
+
/** Reconstructed and revalidated snapshot owned by this host registration. */
|
|
39
|
+
readonly surface: A2uiV1SurfaceState;
|
|
40
|
+
}
|
|
41
|
+
export interface McpNativeMixedMcpAppsRegion extends McpNativeMixedSurfaceRegionBase {
|
|
42
|
+
readonly kind: "mcp-app";
|
|
43
|
+
readonly bridge: McpAppsBridge;
|
|
44
|
+
/** Opaque sandbox created by `createMcpAppsNativeSandbox`. */
|
|
45
|
+
readonly sandbox: McpAppsNativeSandboxConfiguration;
|
|
46
|
+
}
|
|
47
|
+
export type McpNativeMixedSurfaceRegion = McpNativeMixedA2uiRegion | McpNativeMixedMcpAppsRegion;
|
|
48
|
+
export interface CreateMcpNativeMixedA2uiRegionOptions {
|
|
49
|
+
readonly id: string;
|
|
50
|
+
readonly accessibilityLabel: string;
|
|
51
|
+
readonly surface: A2uiV1SurfaceState;
|
|
52
|
+
readonly policy: A2uiV1SurfaceValidationPolicy;
|
|
53
|
+
readonly lifecycle?: McpNativeMixedSurfaceLifecycle;
|
|
54
|
+
}
|
|
55
|
+
export interface CreateMcpNativeMixedMcpAppsRegionOptions {
|
|
56
|
+
readonly id: string;
|
|
57
|
+
readonly accessibilityLabel: string;
|
|
58
|
+
readonly resource: McpAppsResource;
|
|
59
|
+
readonly sandbox: McpAppsNativeSandboxConfiguration;
|
|
60
|
+
readonly bridge: McpAppsBridge;
|
|
61
|
+
readonly lifecycle?: McpNativeMixedSurfaceLifecycle;
|
|
62
|
+
}
|
|
63
|
+
export interface McpNativeMixedSurfaceRegionSnapshot {
|
|
64
|
+
readonly accessibilityLabel: string;
|
|
65
|
+
/** Sibling order authored by the host; isolated WebViews retain their own accessibility tree. */
|
|
66
|
+
readonly accessibilityOrder: number;
|
|
67
|
+
readonly accessibilityTree: "isolated-webview" | "native";
|
|
68
|
+
readonly focused: boolean;
|
|
69
|
+
readonly id: string;
|
|
70
|
+
readonly kind: McpNativeMixedSurfaceKind;
|
|
71
|
+
readonly status: McpNativeMixedSurfaceStatus;
|
|
72
|
+
readonly visibility: McpNativeMixedSurfaceVisibility;
|
|
73
|
+
}
|
|
74
|
+
export interface McpNativeMixedSurfaceSnapshot {
|
|
75
|
+
readonly activity: McpNativeMixedSurfaceActivity;
|
|
76
|
+
readonly disposed: boolean;
|
|
77
|
+
readonly environment: McpNativeMixedSurfaceEnvironment;
|
|
78
|
+
readonly focusedRegionId?: string;
|
|
79
|
+
readonly regions: readonly McpNativeMixedSurfaceRegionSnapshot[];
|
|
80
|
+
readonly started: boolean;
|
|
81
|
+
}
|
|
82
|
+
export interface McpNativeMixedSurfaceCoordinatorOptions {
|
|
83
|
+
/** Factory-created, host-authored sibling regions in accessibility order. */
|
|
84
|
+
readonly regions: readonly McpNativeMixedSurfaceRegion[];
|
|
85
|
+
readonly initialActivity?: McpNativeMixedSurfaceActivity;
|
|
86
|
+
readonly initialEnvironment?: Partial<McpNativeMixedSurfaceEnvironment>;
|
|
87
|
+
readonly initialFocusedRegionId?: string;
|
|
88
|
+
readonly initialVisibleRegionIds?: readonly string[];
|
|
89
|
+
}
|
|
90
|
+
export declare class McpNativeMixedSurfaceError extends Error {
|
|
91
|
+
readonly regionId: string | undefined;
|
|
92
|
+
constructor(message: string, options?: ErrorOptions & {
|
|
93
|
+
readonly regionId?: string;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Creates one native sibling registration from a validated, host-policy-approved A2UI snapshot.
|
|
98
|
+
* This factory has no WebView fields, so declarative A2UI data cannot create or configure a View.
|
|
99
|
+
*/
|
|
100
|
+
export declare function createMcpNativeMixedA2uiRegion(options: CreateMcpNativeMixedA2uiRegionOptions): McpNativeMixedA2uiRegion;
|
|
101
|
+
/**
|
|
102
|
+
* Creates one isolated MCP Apps sibling from an opaque sandbox, its exact resource, and bridge.
|
|
103
|
+
* The server cannot select native WebView props or lifecycle callbacks through this boundary.
|
|
104
|
+
*/
|
|
105
|
+
export declare function createMcpNativeMixedMcpAppsRegion(options: CreateMcpNativeMixedMcpAppsRegionOptions): McpNativeMixedMcpAppsRegion;
|
|
106
|
+
/**
|
|
107
|
+
* Serializes host lifecycle changes across fixed sibling regions. It does not parse a layout,
|
|
108
|
+
* render a component, navigate a WebView, or forward messages between native and Apps regions.
|
|
109
|
+
*/
|
|
110
|
+
export declare class McpNativeMixedSurfaceCoordinator {
|
|
111
|
+
#private;
|
|
112
|
+
constructor(options: McpNativeMixedSurfaceCoordinatorOptions);
|
|
113
|
+
getSnapshot: () => McpNativeMixedSurfaceSnapshot;
|
|
114
|
+
getRegion(id: string): McpNativeMixedSurfaceRegion | undefined;
|
|
115
|
+
subscribe(listener: () => void): () => void;
|
|
116
|
+
start(): Promise<void>;
|
|
117
|
+
setActivity(activity: McpNativeMixedSurfaceActivity): Promise<void>;
|
|
118
|
+
setEnvironment(environment: McpNativeMixedSurfaceEnvironment): Promise<void>;
|
|
119
|
+
setVisibleRegions(ids: readonly string[]): Promise<void>;
|
|
120
|
+
transferFocus(id?: string): Promise<void>;
|
|
121
|
+
handleBack(): Promise<boolean>;
|
|
122
|
+
cancel(id: string, reason?: string): Promise<void>;
|
|
123
|
+
reportCrash(id: string, error: unknown): Promise<void>;
|
|
124
|
+
recover(id: string): Promise<void>;
|
|
125
|
+
handleMemoryPressure(pressure: McpNativeMixedSurfaceMemoryPressure): Promise<void>;
|
|
126
|
+
dispose(): Promise<void>;
|
|
127
|
+
}
|
|
128
|
+
export {};
|
|
129
|
+
//# sourceMappingURL=mixed-surfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mixed-surfaces.d.ts","sourceRoot":"","sources":["../src/mixed-surfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,598 @@
|
|
|
1
|
+
import { validateA2uiV1SurfaceState, } from "@mcp-native/a2ui";
|
|
2
|
+
import { McpAppsBridge, isMcpAppsBridgeBinding, isMcpAppsNativeSandboxConfiguration, } from "@mcp-native/webview";
|
|
3
|
+
export const MCP_NATIVE_MIXED_MAX_REGIONS = 32;
|
|
4
|
+
export const MCP_NATIVE_MIXED_MAX_LISTENERS = 64;
|
|
5
|
+
const registeredRegions = new WeakSet();
|
|
6
|
+
const coordinatedRegions = new WeakSet();
|
|
7
|
+
const regionLifecycles = new WeakMap();
|
|
8
|
+
export class McpNativeMixedSurfaceError extends Error {
|
|
9
|
+
regionId;
|
|
10
|
+
constructor(message, options) {
|
|
11
|
+
super(message, options);
|
|
12
|
+
this.name = "McpNativeMixedSurfaceError";
|
|
13
|
+
this.regionId = options?.regionId;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Creates one native sibling registration from a validated, host-policy-approved A2UI snapshot.
|
|
18
|
+
* This factory has no WebView fields, so declarative A2UI data cannot create or configure a View.
|
|
19
|
+
*/
|
|
20
|
+
export function createMcpNativeMixedA2uiRegion(options) {
|
|
21
|
+
expectFactoryOptions(options);
|
|
22
|
+
const region = Object.freeze({
|
|
23
|
+
id: expectRegionId(options.id),
|
|
24
|
+
accessibilityLabel: expectAccessibilityLabel(options.accessibilityLabel),
|
|
25
|
+
kind: "a2ui",
|
|
26
|
+
surface: validateA2uiV1SurfaceState(options.surface, options.policy),
|
|
27
|
+
});
|
|
28
|
+
registerRegion(region, options.lifecycle);
|
|
29
|
+
return region;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Creates one isolated MCP Apps sibling from an opaque sandbox, its exact resource, and bridge.
|
|
33
|
+
* The server cannot select native WebView props or lifecycle callbacks through this boundary.
|
|
34
|
+
*/
|
|
35
|
+
export function createMcpNativeMixedMcpAppsRegion(options) {
|
|
36
|
+
expectFactoryOptions(options);
|
|
37
|
+
if (!isMcpAppsNativeSandboxConfiguration(options.sandbox)) {
|
|
38
|
+
throw new McpNativeMixedSurfaceError("Mixed MCP Apps regions require an opaque createMcpAppsNativeSandbox result");
|
|
39
|
+
}
|
|
40
|
+
if (!(options.bridge instanceof McpAppsBridge)) {
|
|
41
|
+
throw new McpNativeMixedSurfaceError("Mixed MCP Apps regions require an McpAppsBridge");
|
|
42
|
+
}
|
|
43
|
+
if (options.resource === null ||
|
|
44
|
+
typeof options.resource !== "object" ||
|
|
45
|
+
Array.isArray(options.resource) ||
|
|
46
|
+
options.resource.uri !== options.sandbox.source.baseUrl) {
|
|
47
|
+
throw new McpNativeMixedSurfaceError("Mixed MCP Apps resource URI must match the sandbox base URL");
|
|
48
|
+
}
|
|
49
|
+
if (!isMcpAppsBridgeBinding(options.bridge, options.resource, options.sandbox)) {
|
|
50
|
+
throw new McpNativeMixedSurfaceError("Mixed MCP Apps regions require the exact resource, sandbox, and bridge binding");
|
|
51
|
+
}
|
|
52
|
+
const region = Object.freeze({
|
|
53
|
+
id: expectRegionId(options.id),
|
|
54
|
+
accessibilityLabel: expectAccessibilityLabel(options.accessibilityLabel),
|
|
55
|
+
kind: "mcp-app",
|
|
56
|
+
sandbox: options.sandbox,
|
|
57
|
+
bridge: options.bridge,
|
|
58
|
+
});
|
|
59
|
+
registerRegion(region, options.lifecycle);
|
|
60
|
+
return region;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Serializes host lifecycle changes across fixed sibling regions. It does not parse a layout,
|
|
64
|
+
* render a component, navigate a WebView, or forward messages between native and Apps regions.
|
|
65
|
+
*/
|
|
66
|
+
export class McpNativeMixedSurfaceCoordinator {
|
|
67
|
+
#regions;
|
|
68
|
+
#regionsById;
|
|
69
|
+
#states = new Map();
|
|
70
|
+
#listeners = new Set();
|
|
71
|
+
#activity;
|
|
72
|
+
#environment;
|
|
73
|
+
#focusedRegionId;
|
|
74
|
+
#started = false;
|
|
75
|
+
#disposed = false;
|
|
76
|
+
#operationTail = Promise.resolve();
|
|
77
|
+
#snapshot;
|
|
78
|
+
constructor(options) {
|
|
79
|
+
if (options === null || typeof options !== "object" || Array.isArray(options)) {
|
|
80
|
+
throw new McpNativeMixedSurfaceError("Mixed surface coordinator options must be an object");
|
|
81
|
+
}
|
|
82
|
+
if (!Array.isArray(options.regions)) {
|
|
83
|
+
throw new McpNativeMixedSurfaceError("Mixed surface regions must be an array");
|
|
84
|
+
}
|
|
85
|
+
if (options.regions.length === 0 || options.regions.length > MCP_NATIVE_MIXED_MAX_REGIONS) {
|
|
86
|
+
throw new McpNativeMixedSurfaceError(`Mixed surface layouts require 1-${MCP_NATIVE_MIXED_MAX_REGIONS} regions`);
|
|
87
|
+
}
|
|
88
|
+
const regions = [];
|
|
89
|
+
const byId = new Map();
|
|
90
|
+
for (const [index, region] of options.regions.entries()) {
|
|
91
|
+
if (region === null ||
|
|
92
|
+
typeof region !== "object" ||
|
|
93
|
+
!registeredRegions.has(region)) {
|
|
94
|
+
throw new McpNativeMixedSurfaceError(`Mixed surface region ${index} must come from a host registration factory`);
|
|
95
|
+
}
|
|
96
|
+
if (byId.has(region.id)) {
|
|
97
|
+
throw new McpNativeMixedSurfaceError(`Duplicate mixed surface region id: ${region.id}`);
|
|
98
|
+
}
|
|
99
|
+
if (coordinatedRegions.has(region)) {
|
|
100
|
+
throw new McpNativeMixedSurfaceError(`Mixed surface region ${region.id} already belongs to a coordinator`);
|
|
101
|
+
}
|
|
102
|
+
regions.push(region);
|
|
103
|
+
byId.set(region.id, region);
|
|
104
|
+
this.#states.set(region.id, { status: "starting", visibility: "hidden" });
|
|
105
|
+
}
|
|
106
|
+
this.#regions = Object.freeze(regions);
|
|
107
|
+
this.#regionsById = byId;
|
|
108
|
+
this.#activity = parseActivity(options.initialActivity ?? "foreground");
|
|
109
|
+
this.#environment = createEnvironment(options.initialEnvironment);
|
|
110
|
+
const visibleIds = parseRegionIds(options.initialVisibleRegionIds ?? this.#regions.map((region) => region.id), byId, "initialVisibleRegionIds");
|
|
111
|
+
for (const id of visibleIds)
|
|
112
|
+
this.#states.get(id).visibility = "visible";
|
|
113
|
+
if (options.initialFocusedRegionId !== undefined) {
|
|
114
|
+
const focusId = expectKnownRegionId(options.initialFocusedRegionId, byId, "initial focus");
|
|
115
|
+
if (this.#states.get(focusId).visibility !== "visible") {
|
|
116
|
+
throw new McpNativeMixedSurfaceError("The initially focused region must be visible", {
|
|
117
|
+
regionId: focusId,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
this.#focusedRegionId = focusId;
|
|
121
|
+
}
|
|
122
|
+
for (const region of regions)
|
|
123
|
+
coordinatedRegions.add(region);
|
|
124
|
+
this.#snapshot = this.#createSnapshot();
|
|
125
|
+
}
|
|
126
|
+
getSnapshot = () => this.#snapshot;
|
|
127
|
+
getRegion(id) {
|
|
128
|
+
return this.#regionsById.get(id);
|
|
129
|
+
}
|
|
130
|
+
subscribe(listener) {
|
|
131
|
+
if (this.#disposed) {
|
|
132
|
+
throw new McpNativeMixedSurfaceError("Cannot subscribe after mixed surface disposal");
|
|
133
|
+
}
|
|
134
|
+
if (typeof listener !== "function") {
|
|
135
|
+
throw new McpNativeMixedSurfaceError("Mixed surface listener must be a function");
|
|
136
|
+
}
|
|
137
|
+
if (this.#listeners.size >= MCP_NATIVE_MIXED_MAX_LISTENERS) {
|
|
138
|
+
throw new McpNativeMixedSurfaceError(`Mixed surface coordinator exceeds ${MCP_NATIVE_MIXED_MAX_LISTENERS} listeners`);
|
|
139
|
+
}
|
|
140
|
+
this.#listeners.add(listener);
|
|
141
|
+
return () => this.#listeners.delete(listener);
|
|
142
|
+
}
|
|
143
|
+
start() {
|
|
144
|
+
return this.#enqueue("start", async () => {
|
|
145
|
+
if (this.#started) {
|
|
146
|
+
throw new McpNativeMixedSurfaceError("Mixed surface coordinator has already started");
|
|
147
|
+
}
|
|
148
|
+
this.#started = true;
|
|
149
|
+
let firstError;
|
|
150
|
+
await forEachSerial(this.#regions, async (region) => {
|
|
151
|
+
try {
|
|
152
|
+
await this.#invoke(region, "onCreate");
|
|
153
|
+
await this.#invoke(region, "onActivityChange", this.#activity);
|
|
154
|
+
await this.#invoke(region, "onEnvironmentChange", this.#environment);
|
|
155
|
+
await this.#invoke(region, "onVisibilityChange", this.#states.get(region.id).visibility);
|
|
156
|
+
await this.#invoke(region, "onFocusChange", this.#focusedRegionId === region.id);
|
|
157
|
+
this.#states.get(region.id).status = "ready";
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
this.#states.get(region.id).status = "crashed";
|
|
161
|
+
if (this.#focusedRegionId === region.id)
|
|
162
|
+
this.#focusedRegionId = undefined;
|
|
163
|
+
firstError ??= error;
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
this.#publish();
|
|
167
|
+
if (firstError !== undefined)
|
|
168
|
+
throw firstError;
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
setActivity(activity) {
|
|
172
|
+
return this.#enqueue("set activity", async () => {
|
|
173
|
+
this.#assertStarted();
|
|
174
|
+
const parsed = parseActivity(activity);
|
|
175
|
+
if (parsed === this.#activity)
|
|
176
|
+
return;
|
|
177
|
+
await forEachSerial(this.#regions, async (region) => {
|
|
178
|
+
if (this.#states.get(region.id).status === "ready") {
|
|
179
|
+
await this.#invoke(region, "onActivityChange", parsed);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
this.#activity = parsed;
|
|
183
|
+
this.#publish();
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
setEnvironment(environment) {
|
|
187
|
+
return this.#enqueue("set environment", async () => {
|
|
188
|
+
this.#assertStarted();
|
|
189
|
+
const parsed = createEnvironment(environment);
|
|
190
|
+
if (environmentsEqual(parsed, this.#environment))
|
|
191
|
+
return;
|
|
192
|
+
await forEachSerial(this.#regions, async (region) => {
|
|
193
|
+
if (this.#states.get(region.id).status === "ready") {
|
|
194
|
+
await this.#invoke(region, "onEnvironmentChange", parsed);
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
this.#environment = parsed;
|
|
198
|
+
this.#publish();
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
setVisibleRegions(ids) {
|
|
202
|
+
return this.#enqueue("set visibility", async () => {
|
|
203
|
+
this.#assertStarted();
|
|
204
|
+
const visible = new Set(parseRegionIds(ids, this.#regionsById, "visible region ids"));
|
|
205
|
+
const previousFocusId = this.#focusedRegionId;
|
|
206
|
+
if (previousFocusId !== undefined && !visible.has(previousFocusId)) {
|
|
207
|
+
const previous = this.#regionsById.get(previousFocusId);
|
|
208
|
+
await this.#invoke(previous, "onFocusChange", false);
|
|
209
|
+
}
|
|
210
|
+
await forEachSerial(this.#regions, async (region) => {
|
|
211
|
+
const state = this.#states.get(region.id);
|
|
212
|
+
const next = visible.has(region.id) ? "visible" : "hidden";
|
|
213
|
+
if (state.visibility === next)
|
|
214
|
+
return;
|
|
215
|
+
if (state.status === "ready")
|
|
216
|
+
await this.#invoke(region, "onVisibilityChange", next);
|
|
217
|
+
});
|
|
218
|
+
if (previousFocusId !== undefined && !visible.has(previousFocusId)) {
|
|
219
|
+
this.#focusedRegionId = undefined;
|
|
220
|
+
}
|
|
221
|
+
for (const region of this.#regions) {
|
|
222
|
+
this.#states.get(region.id).visibility = visible.has(region.id) ? "visible" : "hidden";
|
|
223
|
+
}
|
|
224
|
+
this.#publish();
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
transferFocus(id) {
|
|
228
|
+
return this.#enqueue("transfer focus", async () => {
|
|
229
|
+
this.#assertStarted();
|
|
230
|
+
const nextId = id === undefined ? undefined : expectKnownRegionId(id, this.#regionsById, "focus target");
|
|
231
|
+
if (nextId === this.#focusedRegionId)
|
|
232
|
+
return;
|
|
233
|
+
if (nextId !== undefined) {
|
|
234
|
+
const nextState = this.#states.get(nextId);
|
|
235
|
+
if (nextState.visibility !== "visible" || nextState.status !== "ready") {
|
|
236
|
+
throw new McpNativeMixedSurfaceError("Focus target must be visible and ready", {
|
|
237
|
+
regionId: nextId,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
const previousId = this.#focusedRegionId;
|
|
242
|
+
if (previousId !== undefined) {
|
|
243
|
+
await this.#invoke(this.#regionsById.get(previousId), "onFocusChange", false);
|
|
244
|
+
}
|
|
245
|
+
if (nextId !== undefined) {
|
|
246
|
+
await this.#invoke(this.#regionsById.get(nextId), "onFocusChange", true);
|
|
247
|
+
}
|
|
248
|
+
this.#focusedRegionId = nextId;
|
|
249
|
+
this.#publish();
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
handleBack() {
|
|
253
|
+
let handled = false;
|
|
254
|
+
return this.#enqueue("handle back", async () => {
|
|
255
|
+
this.#assertStarted();
|
|
256
|
+
const candidates = this.#backCandidates();
|
|
257
|
+
for (const region of candidates) {
|
|
258
|
+
const callback = regionLifecycles.get(region)?.onBack;
|
|
259
|
+
if (callback === undefined)
|
|
260
|
+
continue;
|
|
261
|
+
// eslint-disable-next-line no-await-in-loop -- back handlers are ordered and short-circuit
|
|
262
|
+
const result = await this.#invokeResult(region, "onBack", callback);
|
|
263
|
+
if (typeof result !== "boolean") {
|
|
264
|
+
throw new McpNativeMixedSurfaceError("Mixed surface onBack must return a boolean", {
|
|
265
|
+
regionId: region.id,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
if (result) {
|
|
269
|
+
handled = true;
|
|
270
|
+
break;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}).then(() => handled);
|
|
274
|
+
}
|
|
275
|
+
cancel(id, reason) {
|
|
276
|
+
return this.#enqueue("cancel", async () => {
|
|
277
|
+
this.#assertStarted();
|
|
278
|
+
const region = this.#requireRegion(id);
|
|
279
|
+
const parsedReason = optionalReason(reason);
|
|
280
|
+
const state = this.#states.get(region.id);
|
|
281
|
+
if (state.status === "cancelled")
|
|
282
|
+
return;
|
|
283
|
+
if (this.#focusedRegionId === region.id) {
|
|
284
|
+
await this.#invoke(region, "onFocusChange", false);
|
|
285
|
+
}
|
|
286
|
+
await this.#invoke(region, "onCancel", parsedReason);
|
|
287
|
+
if (this.#focusedRegionId === region.id)
|
|
288
|
+
this.#focusedRegionId = undefined;
|
|
289
|
+
state.status = "cancelled";
|
|
290
|
+
state.visibility = "hidden";
|
|
291
|
+
this.#publish();
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
reportCrash(id, error) {
|
|
295
|
+
return this.#enqueue("report crash", async () => {
|
|
296
|
+
this.#assertStarted();
|
|
297
|
+
const region = this.#requireRegion(id);
|
|
298
|
+
const state = this.#states.get(region.id);
|
|
299
|
+
if (state.status === "cancelled") {
|
|
300
|
+
throw new McpNativeMixedSurfaceError("A cancelled mixed surface cannot crash", {
|
|
301
|
+
regionId: id,
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
if (state.status === "crashed")
|
|
305
|
+
return;
|
|
306
|
+
if (this.#focusedRegionId === region.id) {
|
|
307
|
+
await this.#invoke(region, "onFocusChange", false);
|
|
308
|
+
}
|
|
309
|
+
await this.#invoke(region, "onCrash", error);
|
|
310
|
+
if (this.#focusedRegionId === region.id)
|
|
311
|
+
this.#focusedRegionId = undefined;
|
|
312
|
+
state.status = "crashed";
|
|
313
|
+
this.#publish();
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
recover(id) {
|
|
317
|
+
return this.#enqueue("recover", async () => {
|
|
318
|
+
this.#assertStarted();
|
|
319
|
+
const region = this.#requireRegion(id);
|
|
320
|
+
const state = this.#states.get(region.id);
|
|
321
|
+
if (state.status !== "crashed") {
|
|
322
|
+
throw new McpNativeMixedSurfaceError("Only a crashed mixed surface can recover", {
|
|
323
|
+
regionId: id,
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
await this.#invoke(region, "onRecover");
|
|
327
|
+
await this.#invoke(region, "onActivityChange", this.#activity);
|
|
328
|
+
await this.#invoke(region, "onEnvironmentChange", this.#environment);
|
|
329
|
+
await this.#invoke(region, "onVisibilityChange", state.visibility);
|
|
330
|
+
state.status = "ready";
|
|
331
|
+
this.#publish();
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
handleMemoryPressure(pressure) {
|
|
335
|
+
return this.#enqueue("handle memory pressure", async () => {
|
|
336
|
+
this.#assertStarted();
|
|
337
|
+
if (pressure !== "moderate" && pressure !== "critical") {
|
|
338
|
+
throw new McpNativeMixedSurfaceError("Unsupported mixed surface memory-pressure level");
|
|
339
|
+
}
|
|
340
|
+
await forEachSerial(this.#regions, async (region) => {
|
|
341
|
+
if (this.#states.get(region.id).status === "ready") {
|
|
342
|
+
await this.#invoke(region, "onMemoryPressure", pressure);
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
dispose() {
|
|
348
|
+
return this.#enqueue("dispose", async () => {
|
|
349
|
+
if (this.#disposed)
|
|
350
|
+
return;
|
|
351
|
+
this.#disposed = true;
|
|
352
|
+
this.#focusedRegionId = undefined;
|
|
353
|
+
let firstError;
|
|
354
|
+
await forEachSerial([...this.#regions].reverse(), async (region) => {
|
|
355
|
+
if (region.kind === "mcp-app") {
|
|
356
|
+
try {
|
|
357
|
+
if (region.bridge.state === "ready") {
|
|
358
|
+
await region.bridge.requestResourceTeardown();
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
firstError ??= error;
|
|
363
|
+
}
|
|
364
|
+
finally {
|
|
365
|
+
region.bridge.close();
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
try {
|
|
369
|
+
await this.#invoke(region, "onDispose");
|
|
370
|
+
}
|
|
371
|
+
catch (error) {
|
|
372
|
+
firstError ??= error;
|
|
373
|
+
}
|
|
374
|
+
});
|
|
375
|
+
this.#publish();
|
|
376
|
+
this.#listeners.clear();
|
|
377
|
+
if (firstError !== undefined)
|
|
378
|
+
throw firstError;
|
|
379
|
+
}, true);
|
|
380
|
+
}
|
|
381
|
+
#requireRegion(id) {
|
|
382
|
+
return (this.#regionsById.get(expectRegionId(id)) ??
|
|
383
|
+
(() => {
|
|
384
|
+
throw new McpNativeMixedSurfaceError(`Unknown mixed surface region: ${String(id)}`);
|
|
385
|
+
})());
|
|
386
|
+
}
|
|
387
|
+
#assertStarted() {
|
|
388
|
+
if (!this.#started)
|
|
389
|
+
throw new McpNativeMixedSurfaceError("Mixed surface coordinator is not started");
|
|
390
|
+
}
|
|
391
|
+
#backCandidates() {
|
|
392
|
+
const result = [];
|
|
393
|
+
if (this.#focusedRegionId !== undefined) {
|
|
394
|
+
const focused = this.#regionsById.get(this.#focusedRegionId);
|
|
395
|
+
const focusedState = this.#states.get(focused.id);
|
|
396
|
+
if (focusedState.visibility === "visible" && focusedState.status === "ready") {
|
|
397
|
+
result.push(focused);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
for (const region of [...this.#regions].reverse()) {
|
|
401
|
+
if (region.id !== this.#focusedRegionId &&
|
|
402
|
+
this.#states.get(region.id).visibility === "visible" &&
|
|
403
|
+
this.#states.get(region.id).status === "ready") {
|
|
404
|
+
result.push(region);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
return result;
|
|
408
|
+
}
|
|
409
|
+
#enqueue(label, operation, allowDisposed = false) {
|
|
410
|
+
const result = this.#operationTail.then(async () => {
|
|
411
|
+
if (this.#disposed && !allowDisposed) {
|
|
412
|
+
throw new McpNativeMixedSurfaceError(`Cannot ${label} after mixed surface disposal`);
|
|
413
|
+
}
|
|
414
|
+
try {
|
|
415
|
+
await operation();
|
|
416
|
+
}
|
|
417
|
+
catch (error) {
|
|
418
|
+
this.#publish();
|
|
419
|
+
throw error;
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
this.#operationTail = result.catch(() => {
|
|
423
|
+
// Keep serialization usable while returning the original rejection to the caller.
|
|
424
|
+
});
|
|
425
|
+
return result;
|
|
426
|
+
}
|
|
427
|
+
async #invoke(region, key, ...arguments_) {
|
|
428
|
+
const callback = regionLifecycles.get(region)?.[key];
|
|
429
|
+
if (callback === undefined)
|
|
430
|
+
return;
|
|
431
|
+
await this.#invokeResult(region, key, callback, ...arguments_);
|
|
432
|
+
}
|
|
433
|
+
async #invokeResult(region, key, callback, ...arguments_) {
|
|
434
|
+
try {
|
|
435
|
+
return await callback(...arguments_);
|
|
436
|
+
}
|
|
437
|
+
catch (error) {
|
|
438
|
+
throw new McpNativeMixedSurfaceError(`Mixed surface ${String(key)} callback failed`, {
|
|
439
|
+
cause: error,
|
|
440
|
+
regionId: region.id,
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
#publish() {
|
|
445
|
+
this.#snapshot = this.#createSnapshot();
|
|
446
|
+
for (const listener of this.#listeners) {
|
|
447
|
+
try {
|
|
448
|
+
listener();
|
|
449
|
+
}
|
|
450
|
+
catch {
|
|
451
|
+
// A consumer notification must not corrupt serialized host lifecycle work.
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
#createSnapshot() {
|
|
456
|
+
return Object.freeze({
|
|
457
|
+
activity: this.#activity,
|
|
458
|
+
disposed: this.#disposed,
|
|
459
|
+
environment: this.#environment,
|
|
460
|
+
...(this.#focusedRegionId === undefined ? {} : { focusedRegionId: this.#focusedRegionId }),
|
|
461
|
+
regions: Object.freeze(this.#regions.map((region, index) => {
|
|
462
|
+
const state = this.#states.get(region.id);
|
|
463
|
+
return Object.freeze({
|
|
464
|
+
accessibilityLabel: region.accessibilityLabel,
|
|
465
|
+
accessibilityOrder: index,
|
|
466
|
+
accessibilityTree: region.kind === "a2ui" ? "native" : "isolated-webview",
|
|
467
|
+
focused: this.#focusedRegionId === region.id,
|
|
468
|
+
id: region.id,
|
|
469
|
+
kind: region.kind,
|
|
470
|
+
status: state.status,
|
|
471
|
+
visibility: state.visibility,
|
|
472
|
+
});
|
|
473
|
+
})),
|
|
474
|
+
started: this.#started,
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
function registerRegion(region, lifecycle) {
|
|
479
|
+
const parsedLifecycle = validateLifecycle(lifecycle ?? {});
|
|
480
|
+
registeredRegions.add(region);
|
|
481
|
+
regionLifecycles.set(region, parsedLifecycle);
|
|
482
|
+
}
|
|
483
|
+
function expectFactoryOptions(value) {
|
|
484
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
485
|
+
throw new McpNativeMixedSurfaceError("Mixed surface factory options must be an object");
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
async function forEachSerial(values, operation) {
|
|
489
|
+
for (const value of values) {
|
|
490
|
+
// eslint-disable-next-line no-await-in-loop -- host lifecycle callbacks must never race
|
|
491
|
+
await operation(value);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
function validateLifecycle(lifecycle) {
|
|
495
|
+
if (lifecycle === null || typeof lifecycle !== "object" || Array.isArray(lifecycle)) {
|
|
496
|
+
throw new McpNativeMixedSurfaceError("Mixed surface lifecycle must be an object");
|
|
497
|
+
}
|
|
498
|
+
const allowed = new Set([
|
|
499
|
+
"onCreate",
|
|
500
|
+
"onVisibilityChange",
|
|
501
|
+
"onActivityChange",
|
|
502
|
+
"onFocusChange",
|
|
503
|
+
"onEnvironmentChange",
|
|
504
|
+
"onBack",
|
|
505
|
+
"onCancel",
|
|
506
|
+
"onCrash",
|
|
507
|
+
"onRecover",
|
|
508
|
+
"onMemoryPressure",
|
|
509
|
+
"onDispose",
|
|
510
|
+
]);
|
|
511
|
+
for (const key of Object.keys(lifecycle)) {
|
|
512
|
+
if (!allowed.has(key)) {
|
|
513
|
+
throw new McpNativeMixedSurfaceError(`Unsupported mixed surface lifecycle callback: ${key}`);
|
|
514
|
+
}
|
|
515
|
+
if (typeof lifecycle[key] !== "function") {
|
|
516
|
+
throw new McpNativeMixedSurfaceError(`Mixed surface lifecycle ${key} must be a function`);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
return Object.freeze({ ...lifecycle });
|
|
520
|
+
}
|
|
521
|
+
function expectRegionId(value) {
|
|
522
|
+
if (typeof value !== "string" || !/^[A-Za-z][A-Za-z0-9._:-]{0,127}$/u.test(value)) {
|
|
523
|
+
throw new McpNativeMixedSurfaceError("Mixed surface region IDs must be 1-128 host-authored identifier characters");
|
|
524
|
+
}
|
|
525
|
+
return value;
|
|
526
|
+
}
|
|
527
|
+
function expectAccessibilityLabel(value) {
|
|
528
|
+
if (typeof value !== "string" || value.length === 0 || value.length > 512) {
|
|
529
|
+
throw new McpNativeMixedSurfaceError("Mixed surface accessibility labels must contain 1-512 characters");
|
|
530
|
+
}
|
|
531
|
+
return value;
|
|
532
|
+
}
|
|
533
|
+
function expectKnownRegionId(value, regions, path) {
|
|
534
|
+
const id = expectRegionId(value);
|
|
535
|
+
if (!regions.has(id)) {
|
|
536
|
+
throw new McpNativeMixedSurfaceError(`Unknown mixed surface region at ${path}: ${id}`);
|
|
537
|
+
}
|
|
538
|
+
return id;
|
|
539
|
+
}
|
|
540
|
+
function parseRegionIds(values, regions, path) {
|
|
541
|
+
if (!Array.isArray(values) || values.length > MCP_NATIVE_MIXED_MAX_REGIONS) {
|
|
542
|
+
throw new McpNativeMixedSurfaceError(`${path} must be a bounded array`);
|
|
543
|
+
}
|
|
544
|
+
const result = [];
|
|
545
|
+
for (const [index, value] of values.entries()) {
|
|
546
|
+
const id = expectKnownRegionId(value, regions, `${path}[${index}]`);
|
|
547
|
+
if (result.includes(id)) {
|
|
548
|
+
throw new McpNativeMixedSurfaceError(`Duplicate mixed surface region at ${path}[${index}]`);
|
|
549
|
+
}
|
|
550
|
+
result.push(id);
|
|
551
|
+
}
|
|
552
|
+
return result;
|
|
553
|
+
}
|
|
554
|
+
function parseActivity(value) {
|
|
555
|
+
if (value !== "background" && value !== "foreground") {
|
|
556
|
+
throw new McpNativeMixedSurfaceError("Mixed surface activity must be background or foreground");
|
|
557
|
+
}
|
|
558
|
+
return value;
|
|
559
|
+
}
|
|
560
|
+
function createEnvironment(input = {}) {
|
|
561
|
+
if (input === null || typeof input !== "object" || Array.isArray(input)) {
|
|
562
|
+
throw new McpNativeMixedSurfaceError("Mixed surface environment must be an object");
|
|
563
|
+
}
|
|
564
|
+
for (const key of Object.keys(input)) {
|
|
565
|
+
if (!["dynamicTypeScale", "keyboardVisible", "orientation", "reducedMotion"].includes(key)) {
|
|
566
|
+
throw new McpNativeMixedSurfaceError(`Unsupported mixed surface environment field: ${key}`);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
const dynamicTypeScale = input.dynamicTypeScale ?? 1;
|
|
570
|
+
if (!Number.isFinite(dynamicTypeScale) || dynamicTypeScale < 0.5 || dynamicTypeScale > 4) {
|
|
571
|
+
throw new McpNativeMixedSurfaceError("Mixed surface dynamic type scale must be between 0.5 and 4");
|
|
572
|
+
}
|
|
573
|
+
const keyboardVisible = input.keyboardVisible ?? false;
|
|
574
|
+
const reducedMotion = input.reducedMotion ?? false;
|
|
575
|
+
if (typeof keyboardVisible !== "boolean" || typeof reducedMotion !== "boolean") {
|
|
576
|
+
throw new McpNativeMixedSurfaceError("Mixed surface environment flags must be booleans");
|
|
577
|
+
}
|
|
578
|
+
const orientation = input.orientation ?? "unknown";
|
|
579
|
+
if (!["landscape-left", "landscape-right", "portrait", "portrait-upside-down", "unknown"].includes(orientation)) {
|
|
580
|
+
throw new McpNativeMixedSurfaceError("Unsupported mixed surface orientation");
|
|
581
|
+
}
|
|
582
|
+
return Object.freeze({ dynamicTypeScale, keyboardVisible, orientation, reducedMotion });
|
|
583
|
+
}
|
|
584
|
+
function environmentsEqual(left, right) {
|
|
585
|
+
return (left.dynamicTypeScale === right.dynamicTypeScale &&
|
|
586
|
+
left.keyboardVisible === right.keyboardVisible &&
|
|
587
|
+
left.orientation === right.orientation &&
|
|
588
|
+
left.reducedMotion === right.reducedMotion);
|
|
589
|
+
}
|
|
590
|
+
function optionalReason(value) {
|
|
591
|
+
if (value === undefined)
|
|
592
|
+
return undefined;
|
|
593
|
+
if (typeof value !== "string" || value.length === 0 || value.length > 1_024) {
|
|
594
|
+
throw new McpNativeMixedSurfaceError("Mixed surface cancellation reasons must be bounded strings");
|
|
595
|
+
}
|
|
596
|
+
return value;
|
|
597
|
+
}
|
|
598
|
+
//# sourceMappingURL=mixed-surfaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mixed-surfaces.js","sourceRoot":"","sources":["../src/mixed-surfaces.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-native",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.1",
|
|
4
4
|
"description": "Convenience package for the MCP Native runtime.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"a2ui",
|
|
@@ -31,20 +31,24 @@
|
|
|
31
31
|
".": {
|
|
32
32
|
"types": "./dist/index.d.ts",
|
|
33
33
|
"import": "./dist/index.js"
|
|
34
|
+
},
|
|
35
|
+
"./legacy": {
|
|
36
|
+
"types": "./dist/legacy.d.ts",
|
|
37
|
+
"import": "./dist/legacy.js"
|
|
34
38
|
}
|
|
35
39
|
},
|
|
36
40
|
"publishConfig": {
|
|
37
41
|
"access": "public"
|
|
38
42
|
},
|
|
39
43
|
"dependencies": {
|
|
40
|
-
"@mcp-native/a2ui": "^0.
|
|
41
|
-
"@mcp-native/core": "^0.
|
|
42
|
-
"@mcp-native/react-native": "^0.
|
|
43
|
-
"@mcp-native/webview": "^0.
|
|
44
|
+
"@mcp-native/a2ui": "^0.9.1",
|
|
45
|
+
"@mcp-native/core": "^0.9.1",
|
|
46
|
+
"@mcp-native/react-native": "^0.9.1",
|
|
47
|
+
"@mcp-native/webview": "^0.9.1"
|
|
44
48
|
},
|
|
45
49
|
"peerDependencies": {
|
|
46
50
|
"react": ">=18.3.1 <20",
|
|
47
|
-
"react-native": ">=0.
|
|
51
|
+
"react-native": ">=0.87.0 <1"
|
|
48
52
|
},
|
|
49
53
|
"peerDependenciesMeta": {
|
|
50
54
|
"react-native": {
|