mcp-native 0.7.0 → 0.9.0
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 +26 -4
- 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
|
@@ -17,7 +17,11 @@
|
|
|
17
17
|
|
|
18
18
|
> **Compatibility:** the initial tool/resource boundary preserves MCP `2026-07-28` fields, but complete MCP conformance is still in progress. The package exposes the feature-scoped A2UI v1.0 Candidate profile and retains custom `0.1` APIs only as deprecated migration support; this is not an unqualified A2UI renderer claim. It also re-exports the 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
19
|
|
|
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.
|
|
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, 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.
|
|
21
|
+
|
|
22
|
+
Read the human-oriented [product guide](https://github.com/pablospaniard/mcp-native/blob/main/docs/product-guide.md)
|
|
23
|
+
and [mixed-surface guide](https://github.com/pablospaniard/mcp-native/blob/main/docs/mixed-surfaces.md)
|
|
24
|
+
before the API examples.
|
|
21
25
|
|
|
22
26
|
## Install
|
|
23
27
|
|
|
@@ -39,6 +43,9 @@ and the [`@mcp-native/react-native` adapter documentation](https://github.com/pa
|
|
|
39
43
|
|
|
40
44
|
## Deprecated `0.1` proof-model preview
|
|
41
45
|
|
|
46
|
+
For `0.9.x`, migrate these imports to `mcp-native/legacy`. Root aliases are removed at `1.0.0`;
|
|
47
|
+
the explicit legacy subpath stays frozen for migration and security fixes.
|
|
48
|
+
|
|
42
49
|
```tsx
|
|
43
50
|
import {
|
|
44
51
|
McpNativeSurface,
|
|
@@ -127,16 +134,31 @@ Use the separately installable [`@mcp-native/mcp`](https://github.com/pablospani
|
|
|
127
134
|
- host-localized A2UI v1 plural selection and pure boolean functions;
|
|
128
135
|
- bounded A2UI v1 validation functions and renderer-side field and button checks;
|
|
129
136
|
- press-time, host-policy-gated A2UI v1 HTTP(S) `openUrl` actions;
|
|
130
|
-
- trusted render plans for every
|
|
137
|
+
- trusted render plans for every basic-catalog component, with closed host-owned variants and
|
|
138
|
+
deny-by-default image/media grants;
|
|
131
139
|
- mounting through host-provided components with action and typed-binding event translation;
|
|
132
|
-
- typed adapters from trusted
|
|
140
|
+
- typed adapters from trusted semantics into locally bundled design-system components;
|
|
141
|
+
- exact namespaced host-extension manifests, negotiation, opaque registries, local Fabric
|
|
142
|
+
registration, policy grants, and schema-valid events with inline catalogs disabled;
|
|
143
|
+
- host-owned native A2UI and isolated MCP Apps sibling lifecycle coordination;
|
|
133
144
|
- memoized render-plan and safely observed asynchronous action-dispatch hooks;
|
|
134
145
|
- policy-gated inline and remote HTML document descriptions;
|
|
135
146
|
- MCP `2026-07-28` tool/resource field preservation through the official SDK adapter;
|
|
136
147
|
- pinned current-protocol integration coverage through the SDK HTTP handler/fetch path;
|
|
137
148
|
- ESM exports, TypeScript declarations, automated tests, and signed npm provenance.
|
|
138
149
|
|
|
139
|
-
Release `0.
|
|
150
|
+
Release `0.9.0` adds host-owned mixed native/MCP Apps composition, a production-shaped reference
|
|
151
|
+
host, and the frozen `1.0.0` release-candidate API. Release `0.8.0` added policy-gated `Video` and
|
|
152
|
+
`AudioPlayer`, completed the pinned A2UI basic catalog, and added exact namespaced manifests and
|
|
153
|
+
local registration for compiled host extensions. Release `0.7.0` added the
|
|
154
|
+
non-media catalog, typed renderer-local bindings, bounded formatting and validation, host-callback
|
|
155
|
+
actions, required image grants, policy-gated HTTP(S) `openUrl`, and exact installed-subset
|
|
156
|
+
discovery. Release `0.6.0` added bounded consent, expiring/revocable host-owned grants, interactive
|
|
157
|
+
OAuth, scope history, lifecycle coordination, actionable states, and redacted operations. Complete
|
|
158
|
+
MCP and A2UI conformance, full streaming host integration, transport placement for A2UI capability
|
|
159
|
+
objects, and separate non-blocking Expo Go integration PoCs remain future work. Follow the
|
|
160
|
+
[roadmap](https://github.com/pablospaniard/mcp-native/blob/main/docs/roadmap.md) for exact claim
|
|
161
|
+
boundaries.
|
|
140
162
|
|
|
141
163
|
## Security model
|
|
142
164
|
|
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.0",
|
|
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.0",
|
|
45
|
+
"@mcp-native/core": "^0.9.0",
|
|
46
|
+
"@mcp-native/react-native": "^0.9.0",
|
|
47
|
+
"@mcp-native/webview": "^0.9.0"
|
|
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": {
|