@mearl/provider 2.13.0 → 2.15.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/dist/types.d.ts CHANGED
@@ -1,6 +1,11 @@
1
1
  import type { ProviderAction } from './generated-provider-actions.js';
2
- export declare const MEARL_PROVIDER_PROTOCOL_VERSION = 1;
2
+ export declare const MEARL_PROVIDER_PROTOCOL_VERSION = 2;
3
3
  export type { ProviderAction } from './generated-provider-actions.js';
4
+ export type JsonPrimitive = string | number | boolean | null;
5
+ export type JsonValue = JsonPrimitive | JsonValue[] | JsonObject;
6
+ export interface JsonObject {
7
+ [key: string]: JsonValue;
8
+ }
4
9
  export type ProviderScreenshotKind = 'native' | 'reconstructed' | 'none';
5
10
  export interface ProviderCapabilities {
6
11
  actions: ProviderAction[];
@@ -17,27 +22,118 @@ export interface ProviderDescriptor {
17
22
  name: string;
18
23
  version: string;
19
24
  protocolVersion?: number;
25
+ builtin?: boolean;
20
26
  }
21
- export interface ProviderBrowserParameter {
22
- key: string;
23
- label: string;
24
- required?: boolean;
25
- placeholder?: string;
27
+ export type ProviderInputComponent = 'cookie-sync' | 'switch';
28
+ export interface ProviderInputVisibility {
29
+ field: string;
30
+ empty: boolean;
31
+ }
32
+ interface ProviderSchemaBase {
33
+ title?: string;
26
34
  description?: string;
35
+ default?: JsonValue;
36
+ /** Optional Mearl form component used to edit this schema value. */
37
+ component?: ProviderInputComponent;
38
+ /** Presentation-only default used by Mearl forms without changing runtime semantics. */
39
+ formDefault?: JsonValue;
40
+ /** Excludes an advanced runtime option from generated Mearl forms. */
41
+ formHidden?: boolean;
42
+ /** Places compact fields side by side in generated Mearl forms. */
43
+ formWidth?: 'half' | 'full';
44
+ /** Hides the optional badge without changing schema validation. */
45
+ formHideOptional?: boolean;
46
+ /** Conditionally displays and submits this field based on another form value. */
47
+ formVisibleWhen?: ProviderInputVisibility;
48
+ }
49
+ export interface ProviderStringSchema extends ProviderSchemaBase {
50
+ type: 'string';
51
+ secret?: boolean;
52
+ enum?: readonly string[];
53
+ minLength?: number;
54
+ maxLength?: number;
55
+ pattern?: string;
56
+ placeholder?: string;
57
+ }
58
+ export interface ProviderNumberSchema extends ProviderSchemaBase {
59
+ type: 'number';
60
+ integer?: boolean;
61
+ minimum?: number;
62
+ maximum?: number;
63
+ }
64
+ export interface ProviderBooleanSchema extends ProviderSchemaBase {
65
+ type: 'boolean';
66
+ }
67
+ export interface ProviderArraySchema extends ProviderSchemaBase {
68
+ type: 'array';
69
+ items: ProviderInputSchema;
70
+ minItems?: number;
71
+ maxItems?: number;
72
+ }
73
+ export interface ProviderObjectSchema extends ProviderSchemaBase {
74
+ type: 'object';
75
+ properties: Record<string, ProviderInputSchema>;
76
+ required?: readonly string[];
77
+ oneOf?: readonly ProviderObjectSchema[];
78
+ not?: ProviderObjectSchema;
79
+ additionalProperties?: boolean;
80
+ }
81
+ export type ProviderInputSchema = ProviderStringSchema | ProviderNumberSchema | ProviderBooleanSchema | ProviderArraySchema | ProviderObjectSchema;
82
+ export interface ProviderConfigurationDefinition {
83
+ inputSchema: ProviderObjectSchema;
27
84
  }
28
85
  export interface ProviderBrowserType {
29
86
  name: string;
30
- parameters: ProviderBrowserParameter[];
87
+ documentationUrl?: string;
88
+ /** Provider-owned usage guidance rendered by `mearl <providerId>`. */
89
+ help?: readonly string[];
90
+ inputSchema: ProviderObjectSchema;
91
+ configuration?: ProviderConfigurationDefinition;
92
+ }
93
+ export type ProviderBrowserStatus = 'connected' | 'pairing' | 'running_disconnected' | 'stopped';
94
+ export type ProviderOwnership = 'owned' | 'attached';
95
+ export type ProviderPersistence = 'ephemeral' | 'persistent';
96
+ export type ProviderBrowserOperation = 'start' | 'close' | 'detach' | 'deleteData' | 'access' | 'syncCookies';
97
+ export type ProviderBrowserControl = {
98
+ kind: 'provider';
99
+ capabilities: ProviderCapabilities;
100
+ } | {
101
+ kind: 'host';
102
+ transport: 'extension' | 'cdp';
103
+ browserId: string;
104
+ capabilities?: ProviderCapabilities;
105
+ } | {
106
+ kind: 'none';
107
+ };
108
+ /** Common safe metadata; additional Provider-specific keys must also be non-secret JSON. */
109
+ export type ProviderBrowserDetails = JsonObject & {
110
+ headless?: boolean;
111
+ createdAt?: string;
112
+ cdpPort?: number;
113
+ copiedCookies?: {
114
+ domains: string[];
115
+ count: number;
116
+ };
117
+ };
118
+ export interface ProviderBrowserReference {
119
+ kind: string;
120
+ id: string;
121
+ label?: string;
31
122
  }
32
123
  export interface ProviderBrowser {
33
- /** Stable within this provider. Mearl prefixes it with the provider id globally. */
124
+ /** Stable within this provider. Mearl adds the Provider namespace globally. */
34
125
  browserId: string;
35
126
  name: string;
36
- status?: 'connected' | 'pairing';
127
+ status: ProviderBrowserStatus;
128
+ control: ProviderBrowserControl;
129
+ ownership?: ProviderOwnership;
130
+ persistence: ProviderPersistence;
131
+ operations: ProviderBrowserOperation[];
37
132
  lastFocusedAt?: number;
38
- capabilities: ProviderCapabilities;
39
- /** Pairing metadata is valid only while status is pairing. */
40
133
  pairing?: ProviderPairingInfo;
134
+ references?: ProviderBrowserReference[];
135
+ /** Safe, non-secret metadata suitable for browser_list and remote connectors. */
136
+ details?: ProviderBrowserDetails;
41
137
  }
42
138
  export interface InstalledProviderManifest extends ProviderDescriptor {
43
139
  protocolVersion: number;
@@ -56,41 +152,78 @@ export interface ProviderPackageMetadata {
56
152
  export interface ProviderActionRequest {
57
153
  id: string;
58
154
  action: string;
59
- data?: Record<string, unknown>;
155
+ data?: JsonObject;
60
156
  /** Provider-local browser id selected by the Mearl client. */
61
157
  browserId?: string;
62
158
  version?: string;
63
159
  controlSource?: string;
160
+ host?: ProviderHostContextData;
64
161
  }
65
162
  export interface ProviderActionContext {
66
163
  browserId: string;
67
164
  action: ProviderAction;
68
- data: Record<string, unknown>;
165
+ data: JsonObject;
69
166
  controlSource?: string;
70
167
  }
71
- export type ProviderActionHandler = (context: ProviderActionContext) => Promise<unknown>;
72
- interface ProviderBrowserCreateResultBase {
168
+ export interface ProviderHostServices {
169
+ request<T = JsonValue>(method: string, data?: JsonObject): Promise<T>;
170
+ }
171
+ /** Host-derived launch data carried over the local Provider protocol. */
172
+ export interface ProviderHostContextData {
173
+ cookies?: JsonObject[];
174
+ userAgent?: string;
175
+ }
176
+ export interface ProviderContext {
177
+ host?: ProviderHostServices;
178
+ controlSource?: string;
179
+ }
180
+ export interface ProviderInstanceRequest {
73
181
  browserId: string;
74
- name: string;
75
182
  }
76
- export type ProviderBrowserCreateResult = (ProviderBrowserCreateResultBase & {
77
- status: 'connected';
78
- pairing?: never;
79
- }) | (ProviderBrowserCreateResultBase & {
80
- status: 'pairing';
81
- pairing: ProviderPairingInfo;
82
- });
83
- export type ProviderBrowserCreateHandler = (parameters: Record<string, string>) => Promise<ProviderBrowserCreateResult>;
84
- export type ProviderBrowserDeleteHandler = (browserId: string) => Promise<unknown>;
85
- export interface ProviderServerOptions {
183
+ export interface ProviderCloseRequest extends ProviderInstanceRequest {
184
+ deleteData?: boolean;
185
+ }
186
+ export interface ProviderSyncCookiesRequest extends ProviderInstanceRequest {
187
+ scope: JsonObject;
188
+ }
189
+ export interface ProviderAccess {
190
+ kind: string;
191
+ url: string;
192
+ sensitive: true;
193
+ }
194
+ export interface BrowserProviderDefinition {
86
195
  descriptor: ProviderDescriptor;
87
- handleAction: ProviderActionHandler;
88
- createBrowser: ProviderBrowserCreateHandler;
89
- deleteBrowser: ProviderBrowserDeleteHandler;
196
+ browserType: ProviderBrowserType;
197
+ listBrowsers?: (context: ProviderContext) => ProviderBrowser[] | Promise<ProviderBrowser[]>;
198
+ launch: (options: JsonObject, context: ProviderContext) => Promise<ProviderBrowser>;
199
+ start?: (request: ProviderInstanceRequest, context: ProviderContext) => Promise<ProviderBrowser>;
200
+ close: (request: ProviderCloseRequest, context: ProviderContext) => Promise<unknown>;
201
+ detach?: (request: ProviderInstanceRequest, context: ProviderContext) => Promise<unknown>;
202
+ syncCookies?: (request: ProviderSyncCookiesRequest, context: ProviderContext) => Promise<unknown>;
203
+ getAccess?: (request: ProviderInstanceRequest, context: ProviderContext) => Promise<ProviderAccess>;
204
+ configure?: (options: JsonObject, context: ProviderContext) => Promise<unknown>;
205
+ handleAction?: (context: ProviderActionContext) => Promise<unknown>;
206
+ }
207
+ export interface ProviderRuntime {
208
+ readonly definition: BrowserProviderDefinition;
209
+ listBrowsers(context?: ProviderContext): Promise<ProviderBrowser[]>;
210
+ updateBrowsers(browsers: ProviderBrowser[]): void;
211
+ launch(options: JsonObject, context?: ProviderContext): Promise<ProviderBrowser>;
212
+ start(request: ProviderInstanceRequest, context?: ProviderContext): Promise<ProviderBrowser>;
213
+ close(request: ProviderCloseRequest, context?: ProviderContext): Promise<unknown>;
214
+ detach(request: ProviderInstanceRequest, context?: ProviderContext): Promise<unknown>;
215
+ syncCookies(request: ProviderSyncCookiesRequest, context?: ProviderContext): Promise<unknown>;
216
+ getAccess(request: ProviderInstanceRequest, context?: ProviderContext): Promise<ProviderAccess>;
217
+ configure(options: JsonObject, context?: ProviderContext): Promise<unknown>;
218
+ invokeAction(context: ProviderActionContext): Promise<unknown>;
219
+ }
220
+ export interface ProviderServerOptions {
221
+ definition: BrowserProviderDefinition;
90
222
  socketPath?: string;
91
223
  }
92
224
  export interface ProviderServer {
93
225
  readonly socketPath: string;
226
+ readonly runtime: ProviderRuntime;
94
227
  start(): Promise<void>;
95
228
  updateBrowsers(browsers: ProviderBrowser[]): void;
96
229
  touchBrowser(browserId: string): void;
package/dist/types.js CHANGED
@@ -1 +1 @@
1
- export const MEARL_PROVIDER_PROTOCOL_VERSION = 1;
1
+ export const MEARL_PROVIDER_PROTOCOL_VERSION = 2;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mearl/provider",
3
- "version": "2.13.0",
4
- "description": "Contracts and runtime utilities for external Mearl browser-control providers",
3
+ "version": "2.15.0",
4
+ "description": "Unified contracts and runtime utilities for built-in and external Mearl browser providers",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -35,7 +35,7 @@
35
35
  "registry": "https://registry.npmjs.org"
36
36
  },
37
37
  "dependencies": {
38
- "@mearl/daemon-core": "2.13.0"
38
+ "@mearl/daemon-core": "2.15.0"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/node": "^24.9.1",