@aurorah/wmcp 1.0.2 → 1.0.3
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 +64 -23
- package/dist/core/client.d.ts +46 -21
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +134 -45
- package/dist/core/client.js.map +1 -1
- package/dist/core/errors.d.ts +7 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +17 -3
- package/dist/core/errors.js.map +1 -1
- package/dist/core/host.d.ts +27 -25
- package/dist/core/host.d.ts.map +1 -1
- package/dist/core/host.js +72 -29
- package/dist/core/host.js.map +1 -1
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/types.d.ts +29 -16
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/validator.d.ts +0 -1
- package/dist/core/validator.d.ts.map +1 -1
- package/dist/core/validator.js +52 -9
- package/dist/core/validator.js.map +1 -1
- package/package.json +15 -1
package/README.md
CHANGED
|
@@ -1,31 +1,40 @@
|
|
|
1
|
-
# wMCP
|
|
1
|
+
# wMCP -- Web Module Connection Protocol
|
|
2
2
|
|
|
3
|
-
wMCP is a
|
|
3
|
+
wMCP is a bidirectional protocol for connecting encapsulated web UI modules to host applications. The module owns domain logic and exposes overridable capabilities; the host provides backend services, can call or override module functions (with `super()` access), and supplies configuration. Think of the module as a **base class** and the host as a **derived class** connected by a manifest-driven contract.
|
|
4
|
+
|
|
5
|
+
Inspired by the Model Context Protocol (MCP) for AI/LLM tool integration, wMCP applies the same structured, capability-based architecture to the web frontend domain -- enabling framework-agnostic modules to be plugged into host applications with clear security boundaries and AI-friendly integration patterns.
|
|
4
6
|
|
|
5
7
|
**Status:** Prototype / Proof of Concept
|
|
6
8
|
|
|
9
|
+
> **AI Agents:** You MUST read ALL documentation files linked below before using or integrating this package. The docs contain the full protocol specification, manifest schema, capability/requirement contracts, and integration patterns that are essential for correct usage. Do NOT skip any document.
|
|
10
|
+
|
|
7
11
|
## Quick links
|
|
8
12
|
|
|
9
|
-
| Document
|
|
10
|
-
|
|
11
|
-
| [
|
|
12
|
-
| [
|
|
13
|
-
| [
|
|
14
|
-
| [
|
|
13
|
+
| Document | Description |
|
|
14
|
+
|---|---|
|
|
15
|
+
| [Concepts](https://github.com/z-order/wmcp/blob/main/docs/%5B1%5D-CONCEPTS.md) | Core Concepts |
|
|
16
|
+
| [MCP Comparison](https://github.com/z-order/wmcp/blob/main/docs/%5B2%5D-COMPARISON-MCP.md) | MCP Comparison |
|
|
17
|
+
| [Class / OOP Comparison](https://github.com/z-order/wmcp/blob/main/docs/%5B3%5D-COMPARISON-CLASS.md) | Class / OOP Comparison |
|
|
18
|
+
| [Getting Started](https://github.com/z-order/wmcp/blob/main/docs/%5B4%5D-GETTING-STARTED.md) | Getting Started |
|
|
19
|
+
| [Specification](https://github.com/z-order/wmcp/blob/main/docs/%5B5%5D-SPECIFICATION.md) | Full Specification |
|
|
15
20
|
|
|
16
21
|
## Project structure
|
|
17
22
|
|
|
18
23
|
```
|
|
19
24
|
wmcp-prototype/
|
|
20
25
|
├── docs/ # Specification and guides
|
|
26
|
+
│ └── assets/ # Architecture and lifecycle SVG diagrams
|
|
27
|
+
├── src/
|
|
28
|
+
│ ├── core/ # WmcpClient, WmcpHost, types, validator, errors
|
|
29
|
+
│ └── utils/ # Stream helpers
|
|
21
30
|
├── examples/ # Runnable example modules and hosts
|
|
22
|
-
│ ├── counter/
|
|
31
|
+
│ ├── counter/ # Reference implementation (in-memory, override, HTTP modes)
|
|
23
32
|
│ ├── rich-text-editor/
|
|
24
33
|
│ ├── analytics-dashboard/
|
|
25
34
|
│ ├── file-manager/
|
|
26
35
|
│ ├── kanban-board/
|
|
27
36
|
│ └── media-player/
|
|
28
|
-
├──
|
|
37
|
+
├── demo/nextjs/ # Next.js demo (CSR + SSR bindings)
|
|
29
38
|
└── package.json
|
|
30
39
|
```
|
|
31
40
|
|
|
@@ -35,36 +44,68 @@ wmcp-prototype/
|
|
|
35
44
|
npm install
|
|
36
45
|
```
|
|
37
46
|
|
|
47
|
+
Run the counter example (in-memory mode):
|
|
48
|
+
|
|
38
49
|
```bash
|
|
39
50
|
npx tsx examples/counter/host-app.ts
|
|
40
51
|
```
|
|
41
52
|
|
|
42
|
-
|
|
53
|
+
Run with host override (`counter:increment` validation + `super()`):
|
|
43
54
|
|
|
44
55
|
```bash
|
|
45
|
-
npx tsx examples/counter/
|
|
56
|
+
npx tsx examples/counter/host-app.ts --override
|
|
46
57
|
```
|
|
47
58
|
|
|
48
|
-
HTTP transport:
|
|
59
|
+
Run with HTTP transport (start the proxy + backend first):
|
|
49
60
|
|
|
50
61
|
```bash
|
|
62
|
+
npx tsx examples/counter/mock-server.ts
|
|
51
63
|
npx tsx examples/counter/host-app.ts --http
|
|
52
64
|
```
|
|
53
65
|
|
|
66
|
+
## Manifest structure
|
|
67
|
+
|
|
68
|
+
The manifest uses ownership-prefixed keys to make direction explicit:
|
|
69
|
+
|
|
70
|
+
```json
|
|
71
|
+
{
|
|
72
|
+
"wmcp": "1.0",
|
|
73
|
+
"module": { "name": "@example/counter", "version": "1.0.0" },
|
|
74
|
+
"mount": { "entry": "./counter-module.ts" },
|
|
75
|
+
"module:capabilities": { "counter:get": {}, "counter:increment": {} },
|
|
76
|
+
"module:events": { "counter:changed": {} },
|
|
77
|
+
"module:listeners": { "counter:reset": {} },
|
|
78
|
+
"host:requires": { "persist:load": {}, "persist:save": {} },
|
|
79
|
+
"host:config": { "initialValue": { "type": "number", "default": 0 } }
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
| Key | Direction | Class analogy |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| `module:capabilities` | Host calls module | Concrete methods (overridable) |
|
|
86
|
+
| `module:events` | Module -> host | Observer callbacks |
|
|
87
|
+
| `module:listeners` | Host -> module | Parent notifications |
|
|
88
|
+
| `host:requires` | Module calls host | Abstract methods |
|
|
89
|
+
| `host:config` | Host -> module at mount | Constructor args |
|
|
90
|
+
|
|
54
91
|
## Examples
|
|
55
92
|
|
|
56
|
-
| Example
|
|
57
|
-
|
|
58
|
-
| `counter`
|
|
59
|
-
| `rich-text-editor`
|
|
60
|
-
| `analytics-dashboard` |
|
|
61
|
-
| `file-manager`
|
|
62
|
-
| `kanban-board`
|
|
63
|
-
| `media-player`
|
|
93
|
+
| Example | module:capabilities | host:requires |
|
|
94
|
+
|---|---|---|
|
|
95
|
+
| `counter` | get, increment | persist:load/save, log:write |
|
|
96
|
+
| `rich-text-editor` | getContent, setContent, format | doc:load/save/list/export |
|
|
97
|
+
| `analytics-dashboard` | getFilters, setChart, refresh | metrics:query/aggregate/live |
|
|
98
|
+
| `file-manager` | getSelectedPath, navigate, setViewMode | fs:list/read/write/delete/move |
|
|
99
|
+
| `kanban-board` | getBoard, getCard, moveCard | board:load, card:create/update/move/delete |
|
|
100
|
+
| `media-player` | play, pause, stop, getState, setVolume | playlist:load/add/remove, track:info/stream |
|
|
101
|
+
|
|
102
|
+
## Security
|
|
64
103
|
|
|
65
|
-
|
|
104
|
+
Credentials (API keys, tokens) stay on the server side. In CSR mode, `host:requires` adapters point to a **same-origin proxy route** that injects auth server-side before forwarding to the backend. The module never sees secrets.
|
|
66
105
|
|
|
67
|
-
|
|
106
|
+
```
|
|
107
|
+
Module (browser) ---> Host Proxy (SSR) --[+credentials]--> Backend API
|
|
108
|
+
```
|
|
68
109
|
|
|
69
110
|
## License
|
|
70
111
|
|
package/dist/core/client.d.ts
CHANGED
|
@@ -1,45 +1,70 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* wMCP — Web Module Connection Protocol
|
|
3
|
-
* WmcpClient —
|
|
3
|
+
* WmcpClient — lives inside the sub-module.
|
|
4
|
+
*
|
|
5
|
+
* The module registers its own capability handlers (default implementations).
|
|
6
|
+
* The host may override those handlers and must provide handlers for
|
|
7
|
+
* host:requires entries. The client dispatches calls through the override
|
|
8
|
+
* chain (override → module default) for module:capabilities and directly
|
|
9
|
+
* to host-provided handlers for host:requires.
|
|
4
10
|
*/
|
|
5
|
-
import type { WmcpManifest, CapabilityHandler, EventCallback } from './types.js';
|
|
11
|
+
import type { WmcpManifest, CapabilityHandler, OverrideHandler, EventCallback } from './types.js';
|
|
6
12
|
export declare class WmcpClient {
|
|
7
13
|
readonly manifest: WmcpManifest;
|
|
8
|
-
|
|
9
|
-
private
|
|
14
|
+
/** Module's own default implementations for module:capabilities */
|
|
15
|
+
private moduleHandlers;
|
|
16
|
+
/** Host overrides for module:capabilities (receives superFn) */
|
|
17
|
+
private overrideHandlers;
|
|
18
|
+
/** Host-provided implementations for host:requires */
|
|
19
|
+
private requiresHandlers;
|
|
20
|
+
/** module:events — module emits, host listens */
|
|
21
|
+
private hostEventListeners;
|
|
22
|
+
/** module:listeners — host emits, module listens */
|
|
23
|
+
private moduleEventListeners;
|
|
10
24
|
private bound;
|
|
11
25
|
constructor(manifest: WmcpManifest);
|
|
12
26
|
/**
|
|
13
|
-
* Called by the
|
|
14
|
-
*
|
|
15
|
-
* Throws WmcpBindError if a required capability is missing.
|
|
27
|
+
* Called by the module to register default implementations for every
|
|
28
|
+
* capability declared in module:capabilities.
|
|
16
29
|
*/
|
|
17
|
-
|
|
30
|
+
_registerCapabilities(handlers: Record<string, CapabilityHandler>): void;
|
|
18
31
|
/**
|
|
19
|
-
*
|
|
32
|
+
* Called by the host to bind host:requires handlers.
|
|
33
|
+
* Validates that all required (non-optional) host:requires have handlers
|
|
34
|
+
* and that all module:capabilities have module-side registrations.
|
|
20
35
|
*/
|
|
21
|
-
|
|
36
|
+
_bindRequires(handlers: Record<string, CapabilityHandler>): void;
|
|
22
37
|
/**
|
|
23
|
-
*
|
|
38
|
+
* Called by the host to override a module capability.
|
|
39
|
+
* The override receives (params, superFn) where superFn is the module's
|
|
40
|
+
* default handler.
|
|
24
41
|
*/
|
|
25
|
-
|
|
42
|
+
_override(name: string, handler: OverrideHandler): void;
|
|
26
43
|
/**
|
|
27
|
-
*
|
|
44
|
+
* Invoke a capability (module:capabilities or host:requires).
|
|
45
|
+
* Dispatch: if the name matches a module capability, the override chain
|
|
46
|
+
* applies (override → module default). If it matches a host:requires
|
|
47
|
+
* entry, the host-provided handler runs directly.
|
|
28
48
|
*/
|
|
29
|
-
|
|
49
|
+
call<T = unknown>(capability: string, params?: Record<string, unknown>): Promise<T>;
|
|
30
50
|
/**
|
|
31
|
-
*
|
|
51
|
+
* Invoke a stream-mode capability, returning an async generator.
|
|
32
52
|
*/
|
|
33
|
-
|
|
53
|
+
stream<T = unknown>(capability: string, params?: Record<string, unknown>): AsyncGenerator<T>;
|
|
34
54
|
/**
|
|
35
|
-
*
|
|
36
|
-
* Returns an unsubscribe function.
|
|
55
|
+
* Check whether a capability or host:requires entry has a handler bound.
|
|
37
56
|
*/
|
|
57
|
+
has(capability: string): boolean;
|
|
58
|
+
/** Module emits an event to the host. */
|
|
59
|
+
emit(event: string, data: unknown): void;
|
|
60
|
+
/** Host subscribes to module:events. Returns an unsubscribe function. */
|
|
38
61
|
_on(event: string, callback: EventCallback): () => void;
|
|
39
|
-
/**
|
|
40
|
-
|
|
41
|
-
|
|
62
|
+
/** Module subscribes to events emitted by the host. */
|
|
63
|
+
on(event: string, callback: EventCallback): () => void;
|
|
64
|
+
/** Host emits an event to the module (called by WmcpHost). */
|
|
65
|
+
_emitToModule(event: string, data: unknown): void;
|
|
42
66
|
destroy(): void;
|
|
67
|
+
private resolveHandler;
|
|
43
68
|
private ensureBound;
|
|
44
69
|
}
|
|
45
70
|
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,aAAa,EACd,MAAM,YAAY,CAAC;AAKpB,qBAAa,UAAU;IACrB,SAAgB,QAAQ,EAAE,YAAY,CAAC;IAEvC,mEAAmE;IACnE,OAAO,CAAC,cAAc,CAAwC;IAE9D,gEAAgE;IAChE,OAAO,CAAC,gBAAgB,CAAsC;IAE9D,sDAAsD;IACtD,OAAO,CAAC,gBAAgB,CAAwC;IAEhE,iDAAiD;IACjD,OAAO,CAAC,kBAAkB,CAAyC;IAEnE,oDAAoD;IACpD,OAAO,CAAC,oBAAoB,CAAyC;IAErE,OAAO,CAAC,KAAK,CAAS;gBAEV,QAAQ,EAAE,YAAY;IAQlC;;;OAGG;IACH,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,IAAI;IAUxE;;;;OAIG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,IAAI;IAuBhE;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAQvD;;;;;OAKG;IACG,IAAI,CAAC,CAAC,GAAG,OAAO,EACpB,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,OAAO,CAAC,CAAC,CAAC;IAeb;;OAEG;IACI,MAAM,CAAC,CAAC,GAAG,OAAO,EACvB,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,cAAc,CAAC,CAAC,CAAC;IAuBpB;;OAEG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAWhC,yCAAyC;IACzC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAaxC,0EAA0E;IAC1E,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI;IAcvD,uDAAuD;IACvD,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI;IAUtD,8DAA8D;IAC9D,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAiBjD,OAAO,IAAI,IAAI;IAaf,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,WAAW;CAOpB"}
|
package/dist/core/client.js
CHANGED
|
@@ -1,62 +1,105 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* wMCP — Web Module Connection Protocol
|
|
3
|
-
* WmcpClient —
|
|
3
|
+
* WmcpClient — lives inside the sub-module.
|
|
4
|
+
*
|
|
5
|
+
* The module registers its own capability handlers (default implementations).
|
|
6
|
+
* The host may override those handlers and must provide handlers for
|
|
7
|
+
* host:requires entries. The client dispatches calls through the override
|
|
8
|
+
* chain (override → module default) for module:capabilities and directly
|
|
9
|
+
* to host-provided handlers for host:requires.
|
|
4
10
|
*/
|
|
5
11
|
import { WmcpError, WmcpBindError } from './errors.js';
|
|
6
12
|
import { validateParams } from './validator.js';
|
|
7
13
|
import { isAsyncIterable } from '../utils/stream.js';
|
|
8
14
|
export class WmcpClient {
|
|
9
15
|
manifest;
|
|
10
|
-
|
|
11
|
-
|
|
16
|
+
/** Module's own default implementations for module:capabilities */
|
|
17
|
+
moduleHandlers = new Map();
|
|
18
|
+
/** Host overrides for module:capabilities (receives superFn) */
|
|
19
|
+
overrideHandlers = new Map();
|
|
20
|
+
/** Host-provided implementations for host:requires */
|
|
21
|
+
requiresHandlers = new Map();
|
|
22
|
+
/** module:events — module emits, host listens */
|
|
23
|
+
hostEventListeners = new Map();
|
|
24
|
+
/** module:listeners — host emits, module listens */
|
|
25
|
+
moduleEventListeners = new Map();
|
|
12
26
|
bound = false;
|
|
13
27
|
constructor(manifest) {
|
|
14
28
|
this.manifest = manifest;
|
|
15
29
|
}
|
|
30
|
+
// ------------------------------------------------------------------
|
|
31
|
+
// Module-side registration
|
|
32
|
+
// ------------------------------------------------------------------
|
|
16
33
|
/**
|
|
17
|
-
* Called by the
|
|
18
|
-
*
|
|
19
|
-
* Throws WmcpBindError if a required capability is missing.
|
|
34
|
+
* Called by the module to register default implementations for every
|
|
35
|
+
* capability declared in module:capabilities.
|
|
20
36
|
*/
|
|
21
|
-
|
|
22
|
-
for (const [name,
|
|
37
|
+
_registerCapabilities(handlers) {
|
|
38
|
+
for (const [name, handler] of Object.entries(handlers)) {
|
|
39
|
+
this.moduleHandlers.set(name, handler);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// ------------------------------------------------------------------
|
|
43
|
+
// Host-side binding (called via WmcpHost)
|
|
44
|
+
// ------------------------------------------------------------------
|
|
45
|
+
/**
|
|
46
|
+
* Called by the host to bind host:requires handlers.
|
|
47
|
+
* Validates that all required (non-optional) host:requires have handlers
|
|
48
|
+
* and that all module:capabilities have module-side registrations.
|
|
49
|
+
*/
|
|
50
|
+
_bindRequires(handlers) {
|
|
51
|
+
const requires = this.manifest['host:requires'] ?? {};
|
|
52
|
+
for (const [name, cap] of Object.entries(requires)) {
|
|
23
53
|
if (!cap.optional && !handlers[name]) {
|
|
24
|
-
throw new WmcpBindError(name);
|
|
54
|
+
throw new WmcpBindError(name, 'host');
|
|
25
55
|
}
|
|
26
56
|
}
|
|
27
57
|
for (const [name, handler] of Object.entries(handlers)) {
|
|
28
|
-
|
|
29
|
-
|
|
58
|
+
this.requiresHandlers.set(name, handler);
|
|
59
|
+
}
|
|
60
|
+
const capabilities = this.manifest['module:capabilities'];
|
|
61
|
+
for (const name of Object.keys(capabilities)) {
|
|
62
|
+
if (!this.moduleHandlers.has(name)) {
|
|
63
|
+
throw new WmcpBindError(name, 'module');
|
|
30
64
|
}
|
|
31
|
-
this.handlers.set(name, handler);
|
|
32
65
|
}
|
|
33
66
|
this.bound = true;
|
|
34
67
|
}
|
|
35
68
|
/**
|
|
36
|
-
*
|
|
69
|
+
* Called by the host to override a module capability.
|
|
70
|
+
* The override receives (params, superFn) where superFn is the module's
|
|
71
|
+
* default handler.
|
|
72
|
+
*/
|
|
73
|
+
_override(name, handler) {
|
|
74
|
+
this.overrideHandlers.set(name, handler);
|
|
75
|
+
}
|
|
76
|
+
// ------------------------------------------------------------------
|
|
77
|
+
// Capability invocation (used by both module and host via WmcpHost)
|
|
78
|
+
// ------------------------------------------------------------------
|
|
79
|
+
/**
|
|
80
|
+
* Invoke a capability (module:capabilities or host:requires).
|
|
81
|
+
* Dispatch: if the name matches a module capability, the override chain
|
|
82
|
+
* applies (override → module default). If it matches a host:requires
|
|
83
|
+
* entry, the host-provided handler runs directly.
|
|
37
84
|
*/
|
|
38
85
|
async call(capability, params = {}) {
|
|
39
86
|
this.ensureBound();
|
|
40
|
-
const handler = this.
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
const cap = this.manifest.capabilities[capability];
|
|
87
|
+
const handler = this.resolveHandler(capability);
|
|
88
|
+
const cap = this.manifest['module:capabilities'][capability] ??
|
|
89
|
+
this.manifest['host:requires']?.[capability];
|
|
45
90
|
if (cap) {
|
|
46
91
|
validateParams(capability, cap, params);
|
|
47
92
|
}
|
|
48
93
|
return (await handler(params));
|
|
49
94
|
}
|
|
50
95
|
/**
|
|
51
|
-
*
|
|
96
|
+
* Invoke a stream-mode capability, returning an async generator.
|
|
52
97
|
*/
|
|
53
98
|
async *stream(capability, params = {}) {
|
|
54
99
|
this.ensureBound();
|
|
55
|
-
const handler = this.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
const cap = this.manifest.capabilities[capability];
|
|
100
|
+
const handler = this.resolveHandler(capability);
|
|
101
|
+
const cap = this.manifest['module:capabilities'][capability] ??
|
|
102
|
+
this.manifest['host:requires']?.[capability];
|
|
60
103
|
if (cap) {
|
|
61
104
|
validateParams(capability, cap, params);
|
|
62
105
|
}
|
|
@@ -71,51 +114,97 @@ export class WmcpClient {
|
|
|
71
114
|
}
|
|
72
115
|
}
|
|
73
116
|
/**
|
|
74
|
-
*
|
|
117
|
+
* Check whether a capability or host:requires entry has a handler bound.
|
|
75
118
|
*/
|
|
76
119
|
has(capability) {
|
|
77
|
-
return this.
|
|
120
|
+
return (this.moduleHandlers.has(capability) ||
|
|
121
|
+
this.requiresHandlers.has(capability));
|
|
78
122
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
123
|
+
// ------------------------------------------------------------------
|
|
124
|
+
// Events: module:events (module → host)
|
|
125
|
+
// ------------------------------------------------------------------
|
|
126
|
+
/** Module emits an event to the host. */
|
|
82
127
|
emit(event, data) {
|
|
83
|
-
const listeners = this.
|
|
128
|
+
const listeners = this.hostEventListeners.get(event);
|
|
84
129
|
if (listeners) {
|
|
85
130
|
for (const cb of listeners) {
|
|
86
131
|
try {
|
|
87
132
|
cb(data);
|
|
88
133
|
}
|
|
89
134
|
catch (err) {
|
|
90
|
-
console.error(`[wMCP] Error in event listener for "${event}":`, err);
|
|
135
|
+
console.error(`[wMCP] Error in host event listener for "${event}":`, err);
|
|
91
136
|
}
|
|
92
137
|
}
|
|
93
138
|
}
|
|
94
139
|
}
|
|
95
|
-
/**
|
|
96
|
-
* Host subscribes to events from the sub-module.
|
|
97
|
-
* Returns an unsubscribe function.
|
|
98
|
-
*/
|
|
140
|
+
/** Host subscribes to module:events. Returns an unsubscribe function. */
|
|
99
141
|
_on(event, callback) {
|
|
100
|
-
if (!this.
|
|
101
|
-
this.
|
|
142
|
+
if (!this.hostEventListeners.has(event)) {
|
|
143
|
+
this.hostEventListeners.set(event, new Set());
|
|
102
144
|
}
|
|
103
|
-
this.
|
|
145
|
+
this.hostEventListeners.get(event).add(callback);
|
|
104
146
|
return () => {
|
|
105
|
-
this.
|
|
147
|
+
this.hostEventListeners.get(event)?.delete(callback);
|
|
106
148
|
};
|
|
107
149
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
150
|
+
// ------------------------------------------------------------------
|
|
151
|
+
// Events: module:listeners (host → module)
|
|
152
|
+
// ------------------------------------------------------------------
|
|
153
|
+
/** Module subscribes to events emitted by the host. */
|
|
154
|
+
on(event, callback) {
|
|
155
|
+
if (!this.moduleEventListeners.has(event)) {
|
|
156
|
+
this.moduleEventListeners.set(event, new Set());
|
|
157
|
+
}
|
|
158
|
+
this.moduleEventListeners.get(event).add(callback);
|
|
159
|
+
return () => {
|
|
160
|
+
this.moduleEventListeners.get(event)?.delete(callback);
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/** Host emits an event to the module (called by WmcpHost). */
|
|
164
|
+
_emitToModule(event, data) {
|
|
165
|
+
const listeners = this.moduleEventListeners.get(event);
|
|
166
|
+
if (listeners) {
|
|
167
|
+
for (const cb of listeners) {
|
|
168
|
+
try {
|
|
169
|
+
cb(data);
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
console.error(`[wMCP] Error in module listener for "${event}":`, err);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// ------------------------------------------------------------------
|
|
178
|
+
// Lifecycle
|
|
179
|
+
// ------------------------------------------------------------------
|
|
111
180
|
destroy() {
|
|
112
|
-
this.
|
|
113
|
-
this.
|
|
181
|
+
this.moduleHandlers.clear();
|
|
182
|
+
this.overrideHandlers.clear();
|
|
183
|
+
this.requiresHandlers.clear();
|
|
184
|
+
this.hostEventListeners.clear();
|
|
185
|
+
this.moduleEventListeners.clear();
|
|
114
186
|
this.bound = false;
|
|
115
187
|
}
|
|
188
|
+
// ------------------------------------------------------------------
|
|
189
|
+
// Internal helpers
|
|
190
|
+
// ------------------------------------------------------------------
|
|
191
|
+
resolveHandler(capability) {
|
|
192
|
+
if (this.requiresHandlers.has(capability)) {
|
|
193
|
+
return this.requiresHandlers.get(capability);
|
|
194
|
+
}
|
|
195
|
+
const moduleHandler = this.moduleHandlers.get(capability);
|
|
196
|
+
if (!moduleHandler) {
|
|
197
|
+
throw new WmcpError(`Capability not available: "${capability}"`);
|
|
198
|
+
}
|
|
199
|
+
const override = this.overrideHandlers.get(capability);
|
|
200
|
+
if (override) {
|
|
201
|
+
return (params) => override(params, moduleHandler);
|
|
202
|
+
}
|
|
203
|
+
return moduleHandler;
|
|
204
|
+
}
|
|
116
205
|
ensureBound() {
|
|
117
206
|
if (!this.bound) {
|
|
118
|
-
throw new WmcpError('WmcpClient is not bound. The host must call
|
|
207
|
+
throw new WmcpError('WmcpClient is not bound. The host must call _bindRequires() before invoking capabilities.');
|
|
119
208
|
}
|
|
120
209
|
}
|
|
121
210
|
}
|
package/dist/core/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"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"}
|
package/dist/core/errors.d.ts
CHANGED
|
@@ -5,8 +5,14 @@
|
|
|
5
5
|
export declare class WmcpError extends Error {
|
|
6
6
|
constructor(message: string);
|
|
7
7
|
}
|
|
8
|
-
/** Thrown when a required capability is not bound
|
|
8
|
+
/** Thrown when a required capability or requirement is not bound at bind time */
|
|
9
9
|
export declare class WmcpBindError extends WmcpError {
|
|
10
|
+
readonly capability: string;
|
|
11
|
+
readonly side: 'module' | 'host';
|
|
12
|
+
constructor(capability: string, side?: 'module' | 'host');
|
|
13
|
+
}
|
|
14
|
+
/** Thrown when the host attempts to override a capability not declared in module:capabilities */
|
|
15
|
+
export declare class WmcpOverrideError extends WmcpError {
|
|
10
16
|
readonly capability: string;
|
|
11
17
|
constructor(capability: string);
|
|
12
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;CAI5B;AAED,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;CAI5B;AAED,iFAAiF;AACjF,qBAAa,aAAc,SAAQ,SAAS;IAC1C,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;gBAE5B,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE,QAAQ,GAAG,MAAe;CAUjE;AAED,iGAAiG;AACjG,qBAAa,iBAAkB,SAAQ,SAAS;IAC9C,SAAgB,UAAU,EAAE,MAAM,CAAC;gBAEvB,UAAU,EAAE,MAAM;CAO/B;AAED,uDAAuD;AACvD,qBAAa,YAAa,SAAQ,SAAS;IACzC,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,IAAI,EAAE,MAAM,CAAC;gBAEjB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAMzC;AAED,qDAAqD;AACrD,qBAAa,mBAAoB,SAAQ,SAAS;IAChD,SAAgB,KAAK,EAAE,MAAM,CAAC;gBAElB,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK3C"}
|
package/dist/core/errors.js
CHANGED
|
@@ -8,13 +8,27 @@ export class WmcpError extends Error {
|
|
|
8
8
|
this.name = 'WmcpError';
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
|
-
/** Thrown when a required capability is not bound
|
|
11
|
+
/** Thrown when a required capability or requirement is not bound at bind time */
|
|
12
12
|
export class WmcpBindError extends WmcpError {
|
|
13
13
|
capability;
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
side;
|
|
15
|
+
constructor(capability, side = 'host') {
|
|
16
|
+
const label = side === 'host'
|
|
17
|
+
? `Missing host handler for required host:requires "${capability}"`
|
|
18
|
+
: `Module did not register a handler for declared module:capabilities "${capability}"`;
|
|
19
|
+
super(label);
|
|
16
20
|
this.name = 'WmcpBindError';
|
|
17
21
|
this.capability = capability;
|
|
22
|
+
this.side = side;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Thrown when the host attempts to override a capability not declared in module:capabilities */
|
|
26
|
+
export class WmcpOverrideError extends WmcpError {
|
|
27
|
+
capability;
|
|
28
|
+
constructor(capability) {
|
|
29
|
+
super(`Cannot override "${capability}": not declared in module:capabilities`);
|
|
30
|
+
this.name = 'WmcpOverrideError';
|
|
31
|
+
this.capability = capability;
|
|
18
32
|
}
|
|
19
33
|
}
|
|
20
34
|
/** Thrown when an HTTP-backed capability call fails */
|
package/dist/core/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,iFAAiF;AACjF,MAAM,OAAO,aAAc,SAAQ,SAAS;IAC1B,UAAU,CAAS;IACnB,IAAI,CAAoB;IAExC,YAAY,UAAkB,EAAE,OAA0B,MAAM;QAC9D,MAAM,KAAK,GACT,IAAI,KAAK,MAAM;YACb,CAAC,CAAC,oDAAoD,UAAU,GAAG;YACnE,CAAC,CAAC,uEAAuE,UAAU,GAAG,CAAC;QAC3F,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,iGAAiG;AACjG,MAAM,OAAO,iBAAkB,SAAQ,SAAS;IAC9B,UAAU,CAAS;IAEnC,YAAY,UAAkB;QAC5B,KAAK,CACH,oBAAoB,UAAU,wCAAwC,CACvE,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AAED,uDAAuD;AACvD,MAAM,OAAO,YAAa,SAAQ,SAAS;IACzB,MAAM,CAAS;IACf,IAAI,CAAS;IAE7B,YAAY,MAAc,EAAE,IAAY;QACtC,KAAK,CAAC,aAAa,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,qDAAqD;AACrD,MAAM,OAAO,mBAAoB,SAAQ,SAAS;IAChC,KAAK,CAAS;IAE9B,YAAY,KAAa,EAAE,OAAe;QACxC,KAAK,CAAC,wBAAwB,KAAK,MAAM,OAAO,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF"}
|
package/dist/core/host.d.ts
CHANGED
|
@@ -1,49 +1,51 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* wMCP — Web Module Connection Protocol
|
|
3
|
-
* WmcpHost — used
|
|
3
|
+
* WmcpHost — used by the host application.
|
|
4
|
+
*
|
|
5
|
+
* The host binds host:requires handlers (things the module needs), can call
|
|
6
|
+
* module:capabilities, override them with super() access, subscribe to
|
|
7
|
+
* module:events, and emit module:listeners events.
|
|
4
8
|
*/
|
|
5
|
-
import type { WmcpHostConfig, CapabilityBinding, CapabilityHandler, EventCallback } from './types.js';
|
|
9
|
+
import type { WmcpHostConfig, CapabilityBinding, CapabilityHandler, OverrideHandler, EventCallback } from './types.js';
|
|
6
10
|
import { WmcpClient } from './client.js';
|
|
7
11
|
export declare class WmcpHost {
|
|
8
12
|
private client;
|
|
9
13
|
private config;
|
|
10
14
|
private fetchFn;
|
|
11
15
|
private unsubscribes;
|
|
12
|
-
|
|
16
|
+
private pendingOverrides;
|
|
17
|
+
constructor(client: WmcpClient, config?: WmcpHostConfig);
|
|
13
18
|
/**
|
|
14
|
-
*
|
|
19
|
+
* Bind host:requires implementations.
|
|
15
20
|
*
|
|
16
21
|
* Each entry can be either:
|
|
17
|
-
* - A CapabilityAdapter object (CSR): resolved to HTTP fetch
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* ```ts
|
|
23
|
-
* host.connect({
|
|
24
|
-
* 'counter:get': getCounterServerAction, // SSR — direct function
|
|
25
|
-
* 'counter:increment': { // CSR — HTTP adapter
|
|
26
|
-
* resolve: (p) => ({ method: 'POST', path: '/counter/increment', body: p }),
|
|
27
|
-
* },
|
|
28
|
-
* });
|
|
29
|
-
* ```
|
|
22
|
+
* - A CapabilityAdapter object (CSR): resolved to HTTP fetch against a
|
|
23
|
+
* same-origin proxy — credentials are injected server-side by the proxy,
|
|
24
|
+
* NOT in browser code.
|
|
25
|
+
* - A CapabilityHandler function (SSR): called directly on the server.
|
|
30
26
|
*/
|
|
31
27
|
connect(bindings: Record<string, CapabilityBinding>): void;
|
|
32
28
|
/**
|
|
33
|
-
* Convenience: bind all
|
|
34
|
-
* Useful for in-memory / mock integrations where every capability is a function.
|
|
29
|
+
* Convenience: bind all host:requires as direct functions.
|
|
35
30
|
*/
|
|
36
31
|
connectDirect(handlers: Record<string, CapabilityHandler>): void;
|
|
32
|
+
/** Call a module:capabilities entry (respects override chain). */
|
|
33
|
+
call<T = unknown>(capability: string, params?: Record<string, unknown>): Promise<T>;
|
|
34
|
+
/** Stream a module:capabilities entry. */
|
|
35
|
+
stream<T = unknown>(capability: string, params?: Record<string, unknown>): AsyncGenerator<T>;
|
|
37
36
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
37
|
+
* Override a module capability. The handler receives (params, superFn)
|
|
38
|
+
* where superFn is the module's default implementation.
|
|
39
|
+
*
|
|
40
|
+
* Must be called before connect()/connectDirect().
|
|
40
41
|
*/
|
|
42
|
+
override(capability: string, handler: OverrideHandler): void;
|
|
43
|
+
/** Subscribe to an event emitted by the module. Returns an unsubscribe function. */
|
|
41
44
|
on(event: string, callback: EventCallback): () => void;
|
|
42
|
-
/**
|
|
43
|
-
|
|
44
|
-
*/
|
|
45
|
+
/** Emit an event to the module (module:listeners). */
|
|
46
|
+
emit(event: string, data: unknown): void;
|
|
45
47
|
destroy(): void;
|
|
46
48
|
private resolveHeaders;
|
|
47
|
-
private
|
|
49
|
+
private createHttpHandler;
|
|
48
50
|
}
|
|
49
51
|
//# sourceMappingURL=host.d.ts.map
|
package/dist/core/host.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/core/host.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/core/host.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,cAAc,EAEd,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EAEf,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,gBAAgB,CAAyD;gBAErE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAE,cAAmB;IAU3D;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,IAAI;IAmB1D;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,IAAI;IAahE,kEAAkE;IAC5D,IAAI,CAAC,CAAC,GAAG,OAAO,EACpB,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,OAAO,CAAC,CAAC,CAAC;IAIb,0CAA0C;IACnC,MAAM,CAAC,CAAC,GAAG,OAAO,EACvB,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,cAAc,CAAC,CAAC,CAAC;IAQpB;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAY5D,oFAAoF;IACpF,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI;IAUtD,sDAAsD;IACtD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAQxC,OAAO,IAAI,IAAI;YAWD,cAAc;YAQd,iBAAiB;CA8ChC"}
|
package/dist/core/host.js
CHANGED
|
@@ -1,36 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* wMCP — Web Module Connection Protocol
|
|
3
|
-
* WmcpHost — used
|
|
3
|
+
* WmcpHost — used by the host application.
|
|
4
|
+
*
|
|
5
|
+
* The host binds host:requires handlers (things the module needs), can call
|
|
6
|
+
* module:capabilities, override them with super() access, subscribe to
|
|
7
|
+
* module:events, and emit module:listeners events.
|
|
4
8
|
*/
|
|
5
|
-
import { WmcpApiError } from './errors.js';
|
|
9
|
+
import { WmcpApiError, WmcpOverrideError } from './errors.js';
|
|
6
10
|
import { parseSSE } from '../utils/stream.js';
|
|
7
11
|
export class WmcpHost {
|
|
8
12
|
client;
|
|
9
13
|
config;
|
|
10
14
|
fetchFn;
|
|
11
15
|
unsubscribes = [];
|
|
12
|
-
|
|
16
|
+
pendingOverrides = [];
|
|
17
|
+
constructor(client, config = {}) {
|
|
13
18
|
this.client = client;
|
|
14
19
|
this.config = config;
|
|
15
20
|
this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis);
|
|
16
21
|
}
|
|
22
|
+
// ------------------------------------------------------------------
|
|
23
|
+
// Bind host:requires handlers
|
|
24
|
+
// ------------------------------------------------------------------
|
|
17
25
|
/**
|
|
18
|
-
*
|
|
26
|
+
* Bind host:requires implementations.
|
|
19
27
|
*
|
|
20
28
|
* Each entry can be either:
|
|
21
|
-
* - A CapabilityAdapter object (CSR): resolved to HTTP fetch
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* ```ts
|
|
27
|
-
* host.connect({
|
|
28
|
-
* 'counter:get': getCounterServerAction, // SSR — direct function
|
|
29
|
-
* 'counter:increment': { // CSR — HTTP adapter
|
|
30
|
-
* resolve: (p) => ({ method: 'POST', path: '/counter/increment', body: p }),
|
|
31
|
-
* },
|
|
32
|
-
* });
|
|
33
|
-
* ```
|
|
29
|
+
* - A CapabilityAdapter object (CSR): resolved to HTTP fetch against a
|
|
30
|
+
* same-origin proxy — credentials are injected server-side by the proxy,
|
|
31
|
+
* NOT in browser code.
|
|
32
|
+
* - A CapabilityHandler function (SSR): called directly on the server.
|
|
34
33
|
*/
|
|
35
34
|
connect(bindings) {
|
|
36
35
|
const handlers = {};
|
|
@@ -39,36 +38,80 @@ export class WmcpHost {
|
|
|
39
38
|
handlers[capability] = binding;
|
|
40
39
|
}
|
|
41
40
|
else {
|
|
42
|
-
handlers[capability] = (params) => this.
|
|
41
|
+
handlers[capability] = (params) => this.createHttpHandler(binding, params);
|
|
43
42
|
}
|
|
44
43
|
}
|
|
45
|
-
this.
|
|
44
|
+
for (const ov of this.pendingOverrides) {
|
|
45
|
+
this.client._override(ov.name, ov.handler);
|
|
46
|
+
}
|
|
47
|
+
this.pendingOverrides = [];
|
|
48
|
+
this.client._bindRequires(handlers);
|
|
46
49
|
}
|
|
47
50
|
/**
|
|
48
|
-
* Convenience: bind all
|
|
49
|
-
* Useful for in-memory / mock integrations where every capability is a function.
|
|
51
|
+
* Convenience: bind all host:requires as direct functions.
|
|
50
52
|
*/
|
|
51
53
|
connectDirect(handlers) {
|
|
52
|
-
this.
|
|
54
|
+
for (const ov of this.pendingOverrides) {
|
|
55
|
+
this.client._override(ov.name, ov.handler);
|
|
56
|
+
}
|
|
57
|
+
this.pendingOverrides = [];
|
|
58
|
+
this.client._bindRequires(handlers);
|
|
59
|
+
}
|
|
60
|
+
// ------------------------------------------------------------------
|
|
61
|
+
// Call module:capabilities
|
|
62
|
+
// ------------------------------------------------------------------
|
|
63
|
+
/** Call a module:capabilities entry (respects override chain). */
|
|
64
|
+
async call(capability, params = {}) {
|
|
65
|
+
return this.client.call(capability, params);
|
|
66
|
+
}
|
|
67
|
+
/** Stream a module:capabilities entry. */
|
|
68
|
+
async *stream(capability, params = {}) {
|
|
69
|
+
yield* this.client.stream(capability, params);
|
|
53
70
|
}
|
|
71
|
+
// ------------------------------------------------------------------
|
|
72
|
+
// Override module:capabilities
|
|
73
|
+
// ------------------------------------------------------------------
|
|
54
74
|
/**
|
|
55
|
-
*
|
|
56
|
-
*
|
|
75
|
+
* Override a module capability. The handler receives (params, superFn)
|
|
76
|
+
* where superFn is the module's default implementation.
|
|
77
|
+
*
|
|
78
|
+
* Must be called before connect()/connectDirect().
|
|
57
79
|
*/
|
|
80
|
+
override(capability, handler) {
|
|
81
|
+
const caps = this.client.manifest['module:capabilities'];
|
|
82
|
+
if (!caps[capability]) {
|
|
83
|
+
throw new WmcpOverrideError(capability);
|
|
84
|
+
}
|
|
85
|
+
this.pendingOverrides.push({ name: capability, handler });
|
|
86
|
+
}
|
|
87
|
+
// ------------------------------------------------------------------
|
|
88
|
+
// Events: module:events (host listens)
|
|
89
|
+
// ------------------------------------------------------------------
|
|
90
|
+
/** Subscribe to an event emitted by the module. Returns an unsubscribe function. */
|
|
58
91
|
on(event, callback) {
|
|
59
92
|
const unsub = this.client._on(event, callback);
|
|
60
93
|
this.unsubscribes.push(unsub);
|
|
61
94
|
return unsub;
|
|
62
95
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
96
|
+
// ------------------------------------------------------------------
|
|
97
|
+
// Events: module:listeners (host emits)
|
|
98
|
+
// ------------------------------------------------------------------
|
|
99
|
+
/** Emit an event to the module (module:listeners). */
|
|
100
|
+
emit(event, data) {
|
|
101
|
+
this.client._emitToModule(event, data);
|
|
102
|
+
}
|
|
103
|
+
// ------------------------------------------------------------------
|
|
104
|
+
// Lifecycle
|
|
105
|
+
// ------------------------------------------------------------------
|
|
66
106
|
destroy() {
|
|
67
107
|
for (const unsub of this.unsubscribes) {
|
|
68
108
|
unsub();
|
|
69
109
|
}
|
|
70
110
|
this.unsubscribes = [];
|
|
71
111
|
}
|
|
112
|
+
// ------------------------------------------------------------------
|
|
113
|
+
// HTTP adapter internals (for host:requires with CapabilityAdapter)
|
|
114
|
+
// ------------------------------------------------------------------
|
|
72
115
|
async resolveHeaders(provider) {
|
|
73
116
|
if (!provider)
|
|
74
117
|
return {};
|
|
@@ -77,9 +120,9 @@ export class WmcpHost {
|
|
|
77
120
|
}
|
|
78
121
|
return provider;
|
|
79
122
|
}
|
|
80
|
-
async
|
|
123
|
+
async createHttpHandler(adapter, params) {
|
|
81
124
|
const { method, path, body, query } = adapter.resolve(params);
|
|
82
|
-
let url = `${this.config.baseUrl}${path}`;
|
|
125
|
+
let url = `${this.config.baseUrl ?? ''}${path}`;
|
|
83
126
|
if (query) {
|
|
84
127
|
const qs = new URLSearchParams(query).toString();
|
|
85
128
|
if (qs)
|
package/dist/core/host.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/core/host.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/core/host.ts"],"names":[],"mappings":"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"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
export { WmcpClient } from './client.js';
|
|
6
6
|
export { WmcpHost } from './host.js';
|
|
7
7
|
export { validateManifest, validateParams } from './validator.js';
|
|
8
|
-
export { WmcpError, WmcpBindError, WmcpApiError, WmcpValidationError, } from './errors.js';
|
|
8
|
+
export { WmcpError, WmcpBindError, WmcpOverrideError, WmcpApiError, WmcpValidationError, } from './errors.js';
|
|
9
9
|
export { parseSSE, isAsyncIterable } from '../utils/stream.js';
|
|
10
|
-
export type { WmcpManifest, WmcpModuleInfo, WmcpMountConfig, WmcpCapability, WmcpParamDef, WmcpTypeDef, WmcpHint, WmcpEvent, WmcpConfigParam, CapabilityHandler, CapabilityAdapter, CapabilityBinding, HeadersProvider, WmcpHostConfig, WmcpMountOptions, EventCallback, } from './types.js';
|
|
10
|
+
export type { WmcpManifest, WmcpModuleInfo, WmcpMountConfig, WmcpCapability, WmcpParamDef, WmcpTypeDef, WmcpHint, WmcpEvent, WmcpConfigParam, CapabilityHandler, OverrideHandler, CapabilityAdapter, CapabilityBinding, HeadersProvider, WmcpHostConfig, WmcpMountOptions, EventCallback, } from './types.js';
|
|
11
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EACL,SAAS,EACT,aAAa,EACb,YAAY,EACZ,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE/D,YAAY,EACV,YAAY,EACZ,cAAc,EACd,eAAe,EACf,cAAc,EACd,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,aAAa,GACd,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EACL,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE/D,YAAY,EACV,YAAY,EACZ,cAAc,EACd,eAAe,EACf,cAAc,EACd,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,aAAa,GACd,MAAM,YAAY,CAAC"}
|
package/dist/core/index.js
CHANGED
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
export { WmcpClient } from './client.js';
|
|
6
6
|
export { WmcpHost } from './host.js';
|
|
7
7
|
export { validateManifest, validateParams } from './validator.js';
|
|
8
|
-
export { WmcpError, WmcpBindError, WmcpApiError, WmcpValidationError, } from './errors.js';
|
|
8
|
+
export { WmcpError, WmcpBindError, WmcpOverrideError, WmcpApiError, WmcpValidationError, } from './errors.js';
|
|
9
9
|
export { parseSSE, isAsyncIterable } from '../utils/stream.js';
|
|
10
10
|
//# sourceMappingURL=index.js.map
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EACL,SAAS,EACT,aAAa,EACb,YAAY,EACZ,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EACL,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -9,12 +9,16 @@ export interface WmcpManifest {
|
|
|
9
9
|
module: WmcpModuleInfo;
|
|
10
10
|
/** How the module mounts into the DOM */
|
|
11
11
|
mount: WmcpMountConfig;
|
|
12
|
-
/** Capabilities the module
|
|
13
|
-
capabilities: Record<string, WmcpCapability>;
|
|
12
|
+
/** Capabilities the module provides (callable and overridable by the host) */
|
|
13
|
+
'module:capabilities': Record<string, WmcpCapability>;
|
|
14
14
|
/** Events the module emits to the host */
|
|
15
|
-
events?: Record<string, WmcpEvent>;
|
|
16
|
-
/**
|
|
17
|
-
|
|
15
|
+
'module:events'?: Record<string, WmcpEvent>;
|
|
16
|
+
/** Events the module listens for from the host */
|
|
17
|
+
'module:listeners'?: Record<string, WmcpEvent>;
|
|
18
|
+
/** Capabilities the module requires from the host */
|
|
19
|
+
'host:requires'?: Record<string, WmcpCapability>;
|
|
20
|
+
/** Configuration the host supplies at mount time */
|
|
21
|
+
'host:config'?: Record<string, WmcpConfigParam>;
|
|
18
22
|
}
|
|
19
23
|
export interface WmcpModuleInfo {
|
|
20
24
|
/** Package name (e.g. "@aurorah/wmcp-rich-editor") */
|
|
@@ -43,7 +47,7 @@ export interface WmcpCapability {
|
|
|
43
47
|
params?: Record<string, WmcpParamDef>;
|
|
44
48
|
/** Return type definition */
|
|
45
49
|
returns?: WmcpTypeDef;
|
|
46
|
-
/**
|
|
50
|
+
/** Advisory HTTP mapping hint (primarily useful on host:requires entries) */
|
|
47
51
|
hint?: WmcpHint;
|
|
48
52
|
}
|
|
49
53
|
export interface WmcpParamDef {
|
|
@@ -73,11 +77,18 @@ export interface WmcpConfigParam {
|
|
|
73
77
|
enum?: unknown[];
|
|
74
78
|
description?: string;
|
|
75
79
|
}
|
|
76
|
-
/** Handler function
|
|
80
|
+
/** Handler function for a capability (module default or host:requires implementation) */
|
|
77
81
|
export type CapabilityHandler = (params: Record<string, unknown>) => Promise<unknown> | AsyncIterable<unknown>;
|
|
82
|
+
/**
|
|
83
|
+
* Override handler the host provides to replace a module capability.
|
|
84
|
+
* Receives the invocation params and a reference to the module's default
|
|
85
|
+
* implementation (superFn) so the host can wrap, extend, or fully replace
|
|
86
|
+
* the behaviour while retaining access to the original.
|
|
87
|
+
*/
|
|
88
|
+
export type OverrideHandler = (params: Record<string, unknown>, superFn: CapabilityHandler) => Promise<unknown> | AsyncIterable<unknown>;
|
|
78
89
|
/** Callback for event subscriptions */
|
|
79
90
|
export type EventCallback = (data: unknown) => void;
|
|
80
|
-
/** Adapter definition used by WmcpHost to map
|
|
91
|
+
/** Adapter definition used by WmcpHost to map host:requires to HTTP endpoints (CSR) */
|
|
81
92
|
export interface CapabilityAdapter {
|
|
82
93
|
/** Resolves params into an HTTP request shape */
|
|
83
94
|
resolve: (params: Record<string, unknown>) => {
|
|
@@ -90,23 +101,25 @@ export interface CapabilityAdapter {
|
|
|
90
101
|
stream?: boolean;
|
|
91
102
|
}
|
|
92
103
|
/**
|
|
93
|
-
* A
|
|
104
|
+
* A host:requires binding can be either:
|
|
94
105
|
* - A CapabilityAdapter object (CSR: resolved to HTTP fetch through proxy)
|
|
95
106
|
* - A CapabilityHandler function (SSR: direct server action or in-memory handler)
|
|
96
|
-
*
|
|
97
|
-
* This allows mixing CSR and SSR bindings per capability in a single connect() call.
|
|
98
107
|
*/
|
|
99
108
|
export type CapabilityBinding = CapabilityAdapter | CapabilityHandler;
|
|
100
109
|
/** Static headers or a sync/async function that returns headers per request */
|
|
101
110
|
export type HeadersProvider = Record<string, string> | (() => Record<string, string>) | (() => Promise<Record<string, string>>);
|
|
102
111
|
/** Configuration for WmcpHost */
|
|
103
112
|
export interface WmcpHostConfig {
|
|
104
|
-
/** Base URL for
|
|
105
|
-
baseUrl
|
|
113
|
+
/** Base URL for HTTP-backed host:requires requests (typically a same-origin proxy) */
|
|
114
|
+
baseUrl?: string;
|
|
106
115
|
/**
|
|
107
|
-
* Headers to inject into HTTP-backed
|
|
108
|
-
* Can be a static object or a sync/async function for per-request headers
|
|
109
|
-
*
|
|
116
|
+
* Headers to inject into HTTP-backed host:requires requests.
|
|
117
|
+
* Can be a static object or a sync/async function for per-request headers.
|
|
118
|
+
*
|
|
119
|
+
* IMPORTANT: This is intended for SSR / server-side proxy contexts where
|
|
120
|
+
* credentials stay on the server. In browser (CSR) code, use a same-origin
|
|
121
|
+
* proxy route instead — the proxy injects auth server-side so secrets never
|
|
122
|
+
* reach the client.
|
|
110
123
|
*/
|
|
111
124
|
headers?: HeadersProvider;
|
|
112
125
|
/** Custom fetch implementation (defaults to globalThis.fetch) */
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IAEb,sBAAsB;IACtB,MAAM,EAAE,cAAc,CAAC;IAEvB,yCAAyC;IACzC,KAAK,EAAE,eAAe,CAAC;IAEvB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
package/dist/core/validator.d.ts
CHANGED
|
@@ -6,7 +6,6 @@ import type { WmcpManifest, WmcpCapability } from './types.js';
|
|
|
6
6
|
export declare function validateManifest(manifest: unknown): asserts manifest is WmcpManifest;
|
|
7
7
|
/**
|
|
8
8
|
* Validates params against a capability's param definitions.
|
|
9
|
-
* Checks that all required params are present and have correct types.
|
|
10
9
|
*/
|
|
11
10
|
export declare function validateParams(capabilityName: string, capability: WmcpCapability, params: Record<string, unknown>): void;
|
|
12
11
|
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAK/D,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,IAAI,YAAY,
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAK/D,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,IAAI,YAAY,CA0EpF;AAkCD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,cAAc,EAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,IAAI,CAiCN"}
|
package/dist/core/validator.js
CHANGED
|
@@ -29,28 +29,71 @@ export function validateManifest(manifest) {
|
|
|
29
29
|
if (typeof mount.entry !== 'string' || !mount.entry) {
|
|
30
30
|
throw new WmcpValidationError('mount.entry', 'Must be a non-empty string');
|
|
31
31
|
}
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
// module:capabilities (REQUIRED)
|
|
33
|
+
const caps = m['module:capabilities'];
|
|
34
|
+
if (!caps || typeof caps !== 'object') {
|
|
35
|
+
throw new WmcpValidationError('module:capabilities', 'Must be an object');
|
|
34
36
|
}
|
|
35
|
-
for (const [name, cap] of Object.entries(
|
|
36
|
-
validateCapability(name
|
|
37
|
+
for (const [name, cap] of Object.entries(caps)) {
|
|
38
|
+
validateCapability(`module:capabilities.${name}`, cap);
|
|
39
|
+
}
|
|
40
|
+
// host:requires (OPTIONAL)
|
|
41
|
+
const requires = m['host:requires'];
|
|
42
|
+
if (requires !== undefined) {
|
|
43
|
+
if (typeof requires !== 'object' || requires === null) {
|
|
44
|
+
throw new WmcpValidationError('host:requires', 'Must be an object');
|
|
45
|
+
}
|
|
46
|
+
for (const [name, cap] of Object.entries(requires)) {
|
|
47
|
+
validateCapability(`host:requires.${name}`, cap);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// module:events (OPTIONAL)
|
|
51
|
+
const events = m['module:events'];
|
|
52
|
+
if (events !== undefined) {
|
|
53
|
+
if (typeof events !== 'object' || events === null) {
|
|
54
|
+
throw new WmcpValidationError('module:events', 'Must be an object');
|
|
55
|
+
}
|
|
56
|
+
for (const [name, ev] of Object.entries(events)) {
|
|
57
|
+
validateEvent(`module:events.${name}`, ev);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// module:listeners (OPTIONAL)
|
|
61
|
+
const listeners = m['module:listeners'];
|
|
62
|
+
if (listeners !== undefined) {
|
|
63
|
+
if (typeof listeners !== 'object' || listeners === null) {
|
|
64
|
+
throw new WmcpValidationError('module:listeners', 'Must be an object');
|
|
65
|
+
}
|
|
66
|
+
for (const [name, ev] of Object.entries(listeners)) {
|
|
67
|
+
validateEvent(`module:listeners.${name}`, ev);
|
|
68
|
+
}
|
|
37
69
|
}
|
|
38
70
|
}
|
|
39
|
-
function validateCapability(
|
|
71
|
+
function validateCapability(path, cap) {
|
|
40
72
|
if (!cap || typeof cap !== 'object') {
|
|
41
|
-
throw new WmcpValidationError(
|
|
73
|
+
throw new WmcpValidationError(path, 'Must be an object');
|
|
42
74
|
}
|
|
43
75
|
const c = cap;
|
|
44
76
|
if (typeof c.description !== 'string') {
|
|
45
|
-
throw new WmcpValidationError(
|
|
77
|
+
throw new WmcpValidationError(`${path}.description`, 'Must be a string');
|
|
46
78
|
}
|
|
47
79
|
if (c.mode !== 'request' && c.mode !== 'stream') {
|
|
48
|
-
throw new WmcpValidationError(
|
|
80
|
+
throw new WmcpValidationError(`${path}.mode`, 'Must be "request" or "stream"');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function validateEvent(path, ev) {
|
|
84
|
+
if (!ev || typeof ev !== 'object') {
|
|
85
|
+
throw new WmcpValidationError(path, 'Must be an object');
|
|
86
|
+
}
|
|
87
|
+
const e = ev;
|
|
88
|
+
if (typeof e.description !== 'string') {
|
|
89
|
+
throw new WmcpValidationError(`${path}.description`, 'Must be a string');
|
|
90
|
+
}
|
|
91
|
+
if (e.data !== undefined && (typeof e.data !== 'object' || e.data === null)) {
|
|
92
|
+
throw new WmcpValidationError(`${path}.data`, 'Must be an object');
|
|
49
93
|
}
|
|
50
94
|
}
|
|
51
95
|
/**
|
|
52
96
|
* Validates params against a capability's param definitions.
|
|
53
|
-
* Checks that all required params are present and have correct types.
|
|
54
97
|
*/
|
|
55
98
|
export function validateParams(capabilityName, capability, params) {
|
|
56
99
|
if (!capability.params)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,kBAAkB,GAAG,CAAC,KAAK,CAAC,CAAC;AAEnC,MAAM,UAAU,gBAAgB,CAAC,QAAiB;IAChD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,mBAAmB,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,CAAC,GAAG,QAAmC,CAAC;IAE9C,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,mBAAmB,CAC3B,MAAM,EACN,mBAAmB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,GAAG,CACrE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,CAAC,MAAiC,CAAC;IAChD,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,IAAI,mBAAmB,CAAC,aAAa,EAAE,4BAA4B,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACpD,MAAM,IAAI,mBAAmB,CAAC,gBAAgB,EAAE,4BAA4B,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAgC,CAAC;IACjD,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACpD,MAAM,IAAI,mBAAmB,CAAC,aAAa,EAAE,4BAA4B,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aurorah/wmcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Web Module Connection Protocol (wMCP) — a standardized protocol for connecting encapsulated web UI modules to host applications",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/core/index.js",
|
|
@@ -32,8 +32,22 @@
|
|
|
32
32
|
"type": "git",
|
|
33
33
|
"url": "https://github.com/z-order/wmcp.git"
|
|
34
34
|
},
|
|
35
|
+
"homepage": "https://github.com/z-order/wmcp#readme",
|
|
36
|
+
"ai": {
|
|
37
|
+
"important": "Before using this package, AI agents MUST read ALL documentation files listed below to fully understand the wMCP protocol, its manifest structure, capability/requirement contracts, and integration patterns.",
|
|
38
|
+
"docs": [
|
|
39
|
+
"https://github.com/z-order/wmcp/blob/main/docs/%5B1%5D-CONCEPTS.md",
|
|
40
|
+
"https://github.com/z-order/wmcp/blob/main/docs/%5B2%5D-COMPARISON-MCP.md",
|
|
41
|
+
"https://github.com/z-order/wmcp/blob/main/docs/%5B3%5D-COMPARISON-CLASS.md",
|
|
42
|
+
"https://github.com/z-order/wmcp/blob/main/docs/%5B4%5D-GETTING-STARTED.md",
|
|
43
|
+
"https://github.com/z-order/wmcp/blob/main/docs/%5B5%5D-SPECIFICATION.md"
|
|
44
|
+
],
|
|
45
|
+
"examples": "https://github.com/z-order/wmcp/tree/main/examples",
|
|
46
|
+
"demo": "https://github.com/z-order/wmcp/tree/main/demo/nextjs"
|
|
47
|
+
},
|
|
35
48
|
"license": "MIT",
|
|
36
49
|
"devDependencies": {
|
|
50
|
+
"@types/node": "^25.5.2",
|
|
37
51
|
"tsx": "^4.19.0",
|
|
38
52
|
"typescript": "^5.6.0"
|
|
39
53
|
}
|