@aurorah/wmcp 1.0.1 → 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 CHANGED
@@ -1,31 +1,40 @@
1
- # wMCP Web Module Connection Protocol
1
+ # wMCP -- Web Module Connection Protocol
2
2
 
3
- wMCP is a standardized protocol for connecting encapsulated web UI modules to host applications. Inspired by the Model Context Protocol (MCP) for AI/LLM tool integration, wMCP applies the same manifest-driven, 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.
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 | Description |
10
- | -------------------------------------------------- | ------------------ |
11
- | [docs/CONCEPTS.md](docs/CONCEPTS.md) | Core Concepts |
12
- | [docs/SPECIFICATION.md](docs/SPECIFICATION.md) | Full Specification |
13
- | [docs/MCP-COMPARISON.md](docs/MCP-COMPARISON.md) | MCP Comparison |
14
- | [docs/GETTING-STARTED.md](docs/GETTING-STARTED.md) | Getting Started |
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
- ├── src/ # Core protocol implementation (if present)
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
- In another terminal:
53
+ Run with host override (`counter:increment` validation + `super()`):
43
54
 
44
55
  ```bash
45
- npx tsx examples/counter/mock-server.ts
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 | Description |
57
- | --------------------- | -------------------------------------------------------- |
58
- | `counter` | Minimal getting-started |
59
- | `rich-text-editor` | Content CRUD, autosave, export |
60
- | `analytics-dashboard` | Queries, aggregation, live data streams |
61
- | `file-manager` | File CRUD, upload/download, tree navigation |
62
- | `kanban-board` | Task management, drag-and-drop, real-time sync |
63
- | `media-player` | Playlist management, streaming playback, progress events |
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
- ## Core concepts
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
- wMCP is organized around **manifests** (module discovery and metadata), **capabilities** (what a module can do), **events** (host ↔ module messaging), **config** (host-supplied settings), and **hints** (optional UX or integration guidance). See [docs/CONCEPTS.md](docs/CONCEPTS.md) for full detail.
106
+ ```
107
+ Module (browser) ---> Host Proxy (SSR) --[+credentials]--> Backend API
108
+ ```
68
109
 
69
110
  ## License
70
111
 
@@ -1,45 +1,70 @@
1
1
  /**
2
2
  * wMCP — Web Module Connection Protocol
3
- * WmcpClient — used inside the sub-module to call capabilities and emit events.
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
- private handlers;
9
- private eventListeners;
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 host at mount time.
14
- * Binds handler functions to each capability declared in the manifest.
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
- _bind(handlers: Record<string, CapabilityHandler>): void;
30
+ _registerCapabilities(handlers: Record<string, CapabilityHandler>): void;
18
31
  /**
19
- * Invokes a request-mode capability.
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
- call<T = unknown>(capability: string, params?: Record<string, unknown>): Promise<T>;
36
+ _bindRequires(handlers: Record<string, CapabilityHandler>): void;
22
37
  /**
23
- * Invokes a stream-mode capability, returning an async generator.
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
- stream<T = unknown>(capability: string, params?: Record<string, unknown>): AsyncGenerator<T>;
42
+ _override(name: string, handler: OverrideHandler): void;
26
43
  /**
27
- * Checks if a capability has been bound (useful for optional capabilities).
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
- has(capability: string): boolean;
49
+ call<T = unknown>(capability: string, params?: Record<string, unknown>): Promise<T>;
30
50
  /**
31
- * Sub-module calls this to emit an event to the host.
51
+ * Invoke a stream-mode capability, returning an async generator.
32
52
  */
33
- emit(event: string, data: unknown): void;
53
+ stream<T = unknown>(capability: string, params?: Record<string, unknown>): AsyncGenerator<T>;
34
54
  /**
35
- * Host subscribes to events from the sub-module.
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
- * Cleans up all handlers and event listeners.
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;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACd,MAAM,YAAY,CAAC;AAKpB,qBAAa,UAAU;IACrB,SAAgB,QAAQ,EAAE,YAAY,CAAC;IAEvC,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,KAAK,CAAS;gBAEV,QAAQ,EAAE,YAAY;IAIlC;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,IAAI;IAiBxD;;OAEG;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;IAIhC;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAaxC;;;OAGG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI;IAWvD;;OAEG;IACH,OAAO,IAAI,IAAI;IAMf,OAAO,CAAC,WAAW;CAOpB"}
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"}
@@ -1,62 +1,105 @@
1
1
  /**
2
2
  * wMCP — Web Module Connection Protocol
3
- * WmcpClient — used inside the sub-module to call capabilities and emit events.
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
- handlers = new Map();
11
- eventListeners = new Map();
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 host at mount time.
18
- * Binds handler functions to each capability declared in the manifest.
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
- _bind(handlers) {
22
- for (const [name, cap] of Object.entries(this.manifest.capabilities)) {
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
- if (!this.manifest.capabilities[name]) {
29
- console.warn(`[wMCP] Binding unknown capability: "${name}" — not declared in manifest`);
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
- * Invokes a request-mode capability.
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.handlers.get(capability);
41
- if (!handler) {
42
- throw new WmcpError(`Capability not available: "${capability}"`);
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
- * Invokes a stream-mode capability, returning an async generator.
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.handlers.get(capability);
56
- if (!handler) {
57
- throw new WmcpError(`Capability not available: "${capability}"`);
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
- * Checks if a capability has been bound (useful for optional capabilities).
117
+ * Check whether a capability or host:requires entry has a handler bound.
75
118
  */
76
119
  has(capability) {
77
- return this.handlers.has(capability);
120
+ return (this.moduleHandlers.has(capability) ||
121
+ this.requiresHandlers.has(capability));
78
122
  }
79
- /**
80
- * Sub-module calls this to emit an event to the host.
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.eventListeners.get(event);
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.eventListeners.has(event)) {
101
- this.eventListeners.set(event, new Set());
142
+ if (!this.hostEventListeners.has(event)) {
143
+ this.hostEventListeners.set(event, new Set());
102
144
  }
103
- this.eventListeners.get(event).add(callback);
145
+ this.hostEventListeners.get(event).add(callback);
104
146
  return () => {
105
- this.eventListeners.get(event)?.delete(callback);
147
+ this.hostEventListeners.get(event)?.delete(callback);
106
148
  };
107
149
  }
108
- /**
109
- * Cleans up all handlers and event listeners.
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.handlers.clear();
113
- this.eventListeners.clear();
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 _bind() before invoking capabilities.');
207
+ throw new WmcpError('WmcpClient is not bound. The host must call _bindRequires() before invoking capabilities.');
119
208
  }
120
209
  }
121
210
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,OAAO,UAAU;IACL,QAAQ,CAAe;IAE/B,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;IAChD,cAAc,GAAG,IAAI,GAAG,EAA8B,CAAC;IACvD,KAAK,GAAG,KAAK,CAAC;IAEtB,YAAY,QAAsB;QAChC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAA2C;QAC/C,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,OAAO,CAAC,IAAI,CAAC,uCAAuC,IAAI,8BAA8B,CAAC,CAAC;YAC1F,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CACR,UAAkB,EAClB,SAAkC,EAAE;QAEpC,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,SAAS,CAAC,8BAA8B,UAAU,GAAG,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,GAAG,EAAE,CAAC;YACR,cAAc,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAM,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,CAAC,MAAM,CACX,UAAkB,EAClB,SAAkC,EAAE;QAEpC,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,SAAS,CAAC,8BAA8B,UAAU,GAAG,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,GAAG,EAAE,CAAC;YACR,cAAc,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAE/B,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACjC,MAAM,KAAU,CAAC;YACnB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,MAAM,MAAM,CAAM,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,UAAkB;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,KAAa,EAAE,IAAa;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,EAAE,CAAC,IAAI,CAAC,CAAC;gBACX,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,uCAAuC,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC;gBACvE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,GAAG,CAAC,KAAa,EAAE,QAAuB;QACxC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE9C,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnD,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,SAAS,CACjB,mFAAmF,CACpF,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"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"}
@@ -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 by the host */
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,iEAAiE;AACjE,qBAAa,aAAc,SAAQ,SAAS;IAC1C,SAAgB,UAAU,EAAE,MAAM,CAAC;gBAEvB,UAAU,EAAE,MAAM;CAK/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"}
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"}
@@ -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 by the host */
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
- constructor(capability) {
15
- super(`Missing handler for required capability: "${capability}"`);
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 */
@@ -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,iEAAiE;AACjE,MAAM,OAAO,aAAc,SAAQ,SAAS;IAC1B,UAAU,CAAS;IAEnC,YAAY,UAAkB;QAC5B,KAAK,CAAC,6CAA6C,UAAU,GAAG,CAAC,CAAC;QAClE,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,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"}
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"}
@@ -1,49 +1,51 @@
1
1
  /**
2
2
  * wMCP — Web Module Connection Protocol
3
- * WmcpHost — used inside the host application to bind capabilities and subscribe to events.
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
- constructor(client: WmcpClient, config: WmcpHostConfig);
16
+ private pendingOverrides;
17
+ constructor(client: WmcpClient, config?: WmcpHostConfig);
13
18
  /**
14
- * Binds capability implementations to the client.
19
+ * Bind host:requires implementations.
15
20
  *
16
21
  * Each entry can be either:
17
- * - A CapabilityAdapter object (CSR): resolved to HTTP fetch through the proxy
18
- * - A CapabilityHandler function (SSR): called directly (e.g. Next.js server action with 'use server')
19
- *
20
- * This allows mixing CSR and SSR bindings per capability in a single call:
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 handlers as direct functions (bypass HTTP adapter layer).
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
- * Subscribe to an event emitted by the sub-module.
39
- * Returns an unsubscribe function.
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
- * Cleans up all event subscriptions.
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 createHandler;
49
+ private createHttpHandler;
48
50
  }
49
51
  //# sourceMappingURL=host.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/core/host.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,cAAc,EAEd,iBAAiB,EACjB,iBAAiB,EAEjB,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;gBAEjC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc;IAMtD;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,IAAI;IAc1D;;;OAGG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,IAAI;IAIhE;;;OAGG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI;IAMtD;;OAEG;IACH,OAAO,IAAI,IAAI;YAOD,cAAc;YAQd,aAAa;CA8C5B"}
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 inside the host application to bind capabilities and subscribe to events.
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
- constructor(client, config) {
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
- * Binds capability implementations to the client.
26
+ * Bind host:requires implementations.
19
27
  *
20
28
  * Each entry can be either:
21
- * - A CapabilityAdapter object (CSR): resolved to HTTP fetch through the proxy
22
- * - A CapabilityHandler function (SSR): called directly (e.g. Next.js server action with 'use server')
23
- *
24
- * This allows mixing CSR and SSR bindings per capability in a single call:
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.createHandler(binding, params);
41
+ handlers[capability] = (params) => this.createHttpHandler(binding, params);
43
42
  }
44
43
  }
45
- this.client._bind(handlers);
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 handlers as direct functions (bypass HTTP adapter layer).
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.client._bind(handlers);
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
- * Subscribe to an event emitted by the sub-module.
56
- * Returns an unsubscribe function.
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
- * Cleans up all event subscriptions.
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 createHandler(adapter, params) {
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)
@@ -1 +1 @@
1
- {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/core/host.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/core/host.ts"],"names":[],"mappings":"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"}
@@ -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
@@ -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"}
@@ -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
@@ -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"}
@@ -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 requires from the host */
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
- /** Configuration the module accepts at mount time */
17
- config?: Record<string, WmcpConfigParam>;
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
- /** Hint for host adapter generation: suggested HTTP method + path template */
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 the host provides for a capability */
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 capabilities to HTTP endpoints (CSR) */
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 capability binding can be either:
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 API requests (e.g. "/api/v1" or "http://localhost:8000/api/v1") */
105
- baseUrl: string;
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 capability requests.
108
- * Can be a static object or a sync/async function for per-request headers
109
- * (e.g. reading API keys from env, session cookies, or token refresh).
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) */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -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,CAwCpF;AAqBD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,cAAc,EAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,IAAI,CAiCN"}
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"}
@@ -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
- if (!m.capabilities || typeof m.capabilities !== 'object') {
33
- throw new WmcpValidationError('capabilities', 'Must be an object');
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(m.capabilities)) {
36
- validateCapability(name, cap);
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(name, cap) {
71
+ function validateCapability(path, cap) {
40
72
  if (!cap || typeof cap !== 'object') {
41
- throw new WmcpValidationError(`capabilities.${name}`, 'Must be an object');
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(`capabilities.${name}.description`, 'Must be a string');
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(`capabilities.${name}.mode`, 'Must be "request" or "stream"');
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":"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"}
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.1",
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",
@@ -28,8 +28,26 @@
28
28
  "web-components",
29
29
  "plugin-architecture"
30
30
  ],
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "https://github.com/z-order/wmcp.git"
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
+ },
31
48
  "license": "MIT",
32
49
  "devDependencies": {
50
+ "@types/node": "^25.5.2",
33
51
  "tsx": "^4.19.0",
34
52
  "typescript": "^5.6.0"
35
53
  }