@nwire/mcp 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -19
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/inspect.d.ts.map +1 -1
- package/dist/inspect.js +27 -11
- package/dist/inspect.js.map +1 -1
- package/dist/write-tools.d.ts.map +1 -1
- package/dist/write-tools.js +4 -6
- package/dist/write-tools.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/inspect-tools.test.ts +46 -37
- package/src/__tests__/mcp-io.test.ts +12 -10
- package/src/__tests__/write-tools.test.ts +39 -35
- package/src/index.ts +11 -7
- package/src/inspect.ts +39 -25
- package/src/write-tools.ts +20 -21
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ import { createKernel } from "@nwire/kernel";
|
|
|
24
24
|
|
|
25
25
|
const kernel = createKernel();
|
|
26
26
|
kernel.router.register("dev", devHandler);
|
|
27
|
-
kernel.router.register("ls",
|
|
27
|
+
kernel.router.register("ls", listHandler);
|
|
28
28
|
|
|
29
29
|
await serveMcp({ kernel, serverName: "my-app" });
|
|
30
30
|
// Process now speaks MCP over stdin/stdout; stderr is for logs.
|
|
@@ -38,10 +38,10 @@ Then point Claude Desktop at the binary in `claude_desktop_config.json`:
|
|
|
38
38
|
|
|
39
39
|
## Surface
|
|
40
40
|
|
|
41
|
-
| Export
|
|
42
|
-
|
|
|
43
|
-
| `serveMcp({ kernel?, serverName?, serverVersion?, stdin?, stdout? })` | Boot the server on stdio; resolves when stdin closes.
|
|
44
|
-
| `JsonRpcRequest` / `JsonRpcResponse` / `JsonRpcNotification`
|
|
41
|
+
| Export | Role |
|
|
42
|
+
| --------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
|
|
43
|
+
| `serveMcp({ kernel?, serverName?, serverVersion?, stdin?, stdout? })` | Boot the server on stdio; resolves when stdin closes. |
|
|
44
|
+
| `JsonRpcRequest` / `JsonRpcResponse` / `JsonRpcNotification` | JSON-RPC types for callers writing alternative transports (WebSocket, etc.). |
|
|
45
45
|
|
|
46
46
|
### Built-in tools
|
|
47
47
|
|
|
@@ -49,23 +49,23 @@ Beyond the kernel's CommandRouter, the server exposes these tools:
|
|
|
49
49
|
|
|
50
50
|
**Inspect (read-only)** — proxy `/__nwire/*` on a running wire, fall back to `.nwire/*.json` on disk:
|
|
51
51
|
|
|
52
|
-
| Tool
|
|
53
|
-
|
|
|
54
|
-
| `manifest`
|
|
55
|
-
| `list_actions`
|
|
56
|
-
| `list_events`
|
|
57
|
-
| `list_hooks`
|
|
58
|
-
| `list_plugins`
|
|
59
|
-
| `recent_events`
|
|
60
|
-
| `recent_telemetry`
|
|
52
|
+
| Tool | Reads |
|
|
53
|
+
| ------------------ | -------------------------------- |
|
|
54
|
+
| `manifest` | `.nwire/manifest.json` |
|
|
55
|
+
| `list_actions` | `.nwire/actions.json` |
|
|
56
|
+
| `list_events` | `.nwire/events.json` |
|
|
57
|
+
| `list_hooks` | `.nwire/hooks.json` |
|
|
58
|
+
| `list_plugins` | `.nwire/plugins.json` |
|
|
59
|
+
| `recent_events` | Live `/__nwire/events/recent` |
|
|
60
|
+
| `recent_telemetry` | Live `/__nwire/telemetry/recent` |
|
|
61
61
|
|
|
62
62
|
**Write (mutating)** — POST to a live wire:
|
|
63
63
|
|
|
64
|
-
| Tool
|
|
65
|
-
|
|
|
66
|
-
| `dispatch_action
|
|
67
|
-
| `run_command`
|
|
68
|
-
| `replay_trace`
|
|
64
|
+
| Tool | Posts to |
|
|
65
|
+
| ----------------- | -------------------------------------------------------- |
|
|
66
|
+
| `dispatch_action` | `/__nwire/dispatch` — fire any registered action. |
|
|
67
|
+
| `run_command` | `/__nwire/commands/run` — invoke a `defineCommand`. |
|
|
68
|
+
| `replay_trace` | `/__nwire/replay` — replay a recording against the wire. |
|
|
69
69
|
|
|
70
70
|
Write tools gracefully gap-flag when the target endpoint isn't mounted
|
|
71
71
|
(e.g., MCP running standalone with no wire up).
|
package/dist/index.d.ts
CHANGED
|
@@ -76,4 +76,7 @@ export interface ServeMcpOptions {
|
|
|
76
76
|
*/
|
|
77
77
|
export declare function serveMcp(options?: ServeMcpOptions): Promise<void>;
|
|
78
78
|
export type { JsonRpcRequest, JsonRpcResponse, JsonRpcNotification };
|
|
79
|
+
export { inspectTools, findInspectTool, resetInspectDiscoveryCache } from "./inspect.js";
|
|
80
|
+
export type { InspectToolDef } from "./inspect.js";
|
|
81
|
+
export { writeTools, findWriteTool } from "./write-tools.js";
|
|
79
82
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAoC,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAM9E,UAAU,cAAc;IACtB,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,UAAU,eAAe;IACvB,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACpE;AAED,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AASD,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAoC,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAM9E,UAAU,cAAc;IACtB,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,UAAU,eAAe;IACvB,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACpE;AAED,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AASD,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IACvC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CACzC;AAED;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC3E;AAoND,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AACzF,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -261,4 +261,6 @@ function readLines(stream, onLine) {
|
|
|
261
261
|
stream.on("close", () => resolve());
|
|
262
262
|
});
|
|
263
263
|
}
|
|
264
|
+
export { inspectTools, findInspectTool, resetInspectDiscoveryCache } from "./inspect.js";
|
|
265
|
+
export { writeTools, findWriteTool } from "./write-tools.js";
|
|
264
266
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,YAAY,EAAmC,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAwB7D,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,YAAY,EAAmC,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAwB7D,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC;AACzB,MAAM,aAAa,GAAG,CAAC,KAAK,CAAC;AAC7B,MAAM,kBAAkB,GAAG,CAAC,KAAK,CAAC;AAClC,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC;AAyB5B;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,UAA2B,EAAE;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;IAChD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC;IACjD,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;IAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAEhD,MAAM,IAAI,GAAG,CAAC,GAA0C,EAAQ,EAAE;QAChE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC;IACF,MAAM,GAAG,GAAG,CAAC,IAAY,EAAQ,EAAE;QACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC;IAEF,GAAG,CAAC,oBAAoB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,uBAAuB,CAAC,CAAC;IAE5E,MAAM,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACpC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,OAAO;QACzB,IAAI,OAAuB,CAAC;QAC5B,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,IAAI;gBACR,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE;aAC5D,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,MAAM,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,+BAA+B,CAAC,CAAC;AACvC,CAAC;AASD,KAAK,UAAU,MAAM,CAAC,GAAmB,EAAE,GAAkB;IAC3D,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC;IAC1B,IAAI,CAAC;QACH,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;YACnB,KAAK,YAAY;gBACf,GAAG,CAAC,IAAI,CAAC;oBACP,OAAO,EAAE,KAAK;oBACd,EAAE;oBACF,MAAM,EAAE;wBACN,eAAe,EAAE,YAAY;wBAC7B,UAAU,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,aAAa,EAAE;wBAChE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE;qBAChD;iBACF,CAAC,CAAC;gBACH,OAAO;YAET,KAAK,YAAY;gBACf,GAAG,CAAC,IAAI,CAAC;oBACP,OAAO,EAAE,KAAK;oBACd,EAAE;oBACF,MAAM,EAAE;wBACN,KAAK,EAAE;4BACL,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gCACzC,IAAI;gCACJ,WAAW,EAAE,kBAAkB,IAAI,GAAG;gCACtC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE;6BAC5D,CAAC,CAAC;4BACH,yDAAyD;4BACzD,wCAAwC;4BACxC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gCAC1B,IAAI,EAAE,CAAC,CAAC,IAAI;gCACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gCAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;6BAC3B,CAAC,CAAC;4BACH,yDAAyD;4BACzD,yDAAyD;4BACzD,4CAA4C;4BAC5C,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gCACxB,IAAI,EAAE,CAAC,CAAC,IAAI;gCACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gCAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;6BAC3B,CAAC,CAAC;yBACJ;qBACF;iBACF,CAAC,CAAC;gBACH,OAAO;YAET,KAAK,YAAY;gBACf,MAAM,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;gBAC7B,OAAO;YAET;gBACE,GAAG,CAAC,IAAI,CAAC;oBACP,OAAO,EAAE,KAAK;oBACd,EAAE;oBACF,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,GAAG,CAAC,MAAM,GAAG,EAAE;iBAC1E,CAAC,CAAC;QACP,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,KAAK;YACd,EAAE;YACF,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE;SAC/D,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,GAAmB,EACnB,EAA0B,EAC1B,GAAkB;IAElB,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,IAA0B,CAAC;IACpD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAA4B,CAAC;IACtE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,KAAK;YACd,EAAE;YACF,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,4BAA4B,EAAE;SAC3E,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,oEAAoE;IACpE,oEAAoE;IACpE,kEAAkE;IAClE,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACrC,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO,EAAE,KAAK;gBACd,EAAE;gBACF,MAAM,EAAE;oBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;oBACtD,OAAO,EAAE,KAAK;iBACf;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO,EAAE,KAAK;gBACd,EAAE;gBACF,MAAM,EAAE;oBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;oBACzD,OAAO,EAAE,IAAI;iBACd;aACF,CAAC,CAAC;QACL,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,KAAK;YACd,EAAE;YACF,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,iBAAiB,IAAI,GAAG,EAAE;SACvE,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,kEAAkE;IAClE,MAAM,MAAM,GAAkB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE;QACtC,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,wBAAwB;gBAChC,MAAM,EAAE;oBACN,aAAa,EAAE,MAAM,CAAC,SAAS;oBAC/B,OAAO,EAAE,KAAK,CAAC,IAAI;oBACnB,MAAM,EAAE,KAAK,CAAC,MAAM;iBACrB;aACF,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YAC7C,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,wBAAwB;gBAChC,MAAM,EAAE;oBACN,aAAa,EAAE,MAAM,CAAC,SAAS;oBAC/B,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,GAAG,EAAE,KAAK,CAAC,GAAG;iBACf;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QACpC,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,KAAK;YACd,EAAE;YACF,MAAM,EAAE;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzD,OAAO,EAAE,KAAK;aACf;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,KAAK;YACd,EAAE;YACF,MAAM,EAAE;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;gBACzD,OAAO,EAAE,IAAI;aACd;SACF,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,WAAW,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAChB,MAA6B,EAC7B,MAAuC;IAEvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAsB,EAAE,EAAE;YACjD,MAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACrE,iEAAiE;YACjE,qEAAqE;YACrE,sDAAsD;YACtD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;gBACrB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA8B,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;gBAChF,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAMD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAEzF,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/inspect.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../src/inspect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;
|
|
1
|
+
{"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../src/inspect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAwBH,kEAAkE;AAClE,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAetE;AAoGD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACnE;AA8BD,eAAO,MAAM,YAAY,EAAE,SAAS,cAAc,EAsHjD,CAAC;AAEF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAExE"}
|
package/dist/inspect.js
CHANGED
|
@@ -27,8 +27,7 @@ import { existsSync, readFileSync } from "node:fs";
|
|
|
27
27
|
import { resolve } from "node:path";
|
|
28
28
|
// ─── Port discovery ────────────────────────────────────────────────
|
|
29
29
|
const DEFAULT_PROBE_PORTS = [
|
|
30
|
-
3000, 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, 3009, 3010,
|
|
31
|
-
3030, 3040, 3050, 4000, 8080,
|
|
30
|
+
3000, 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, 3009, 3010, 3030, 3040, 3050, 4000, 8080,
|
|
32
31
|
];
|
|
33
32
|
const PROBE_TIMEOUT_MS = 150;
|
|
34
33
|
const CACHE_TTL_MS = 5_000;
|
|
@@ -63,7 +62,10 @@ export async function discoverInspectUrl() {
|
|
|
63
62
|
function parsePorts(raw) {
|
|
64
63
|
if (!raw)
|
|
65
64
|
return undefined;
|
|
66
|
-
const ports = raw
|
|
65
|
+
const ports = raw
|
|
66
|
+
.split(",")
|
|
67
|
+
.map((s) => Number(s.trim()))
|
|
68
|
+
.filter((n) => n > 0);
|
|
67
69
|
return ports.length > 0 ? ports : undefined;
|
|
68
70
|
}
|
|
69
71
|
/**
|
|
@@ -74,7 +76,10 @@ function parsePorts(raw) {
|
|
|
74
76
|
function isNwireWire(port, timeoutMs) {
|
|
75
77
|
return new Promise((resolveProbe) => {
|
|
76
78
|
const sock = createConnection({ host: "127.0.0.1", port });
|
|
77
|
-
sock.setTimeout(timeoutMs, () => {
|
|
79
|
+
sock.setTimeout(timeoutMs, () => {
|
|
80
|
+
sock.destroy();
|
|
81
|
+
resolveProbe(false);
|
|
82
|
+
});
|
|
78
83
|
sock.once("error", () => resolveProbe(false));
|
|
79
84
|
sock.once("connect", () => {
|
|
80
85
|
sock.destroy();
|
|
@@ -85,11 +90,17 @@ function isNwireWire(port, timeoutMs) {
|
|
|
85
90
|
}
|
|
86
91
|
let buf = "";
|
|
87
92
|
res.setEncoding("utf8");
|
|
88
|
-
res.on("data", (c) => {
|
|
89
|
-
|
|
93
|
+
res.on("data", (c) => {
|
|
94
|
+
buf += c;
|
|
95
|
+
if (buf.length > 1024)
|
|
96
|
+
res.destroy();
|
|
97
|
+
});
|
|
90
98
|
res.on("end", () => resolveProbe(buf.trimStart().startsWith("[")));
|
|
91
99
|
});
|
|
92
|
-
req.setTimeout(timeoutMs, () => {
|
|
100
|
+
req.setTimeout(timeoutMs, () => {
|
|
101
|
+
req.destroy();
|
|
102
|
+
resolveProbe(false);
|
|
103
|
+
});
|
|
93
104
|
req.once("error", () => resolveProbe(false));
|
|
94
105
|
req.end();
|
|
95
106
|
});
|
|
@@ -102,7 +113,9 @@ async function httpGetJson(url) {
|
|
|
102
113
|
const req = httpRequest({ host: u.hostname, port: u.port || 80, path: u.pathname + u.search, method: "GET" }, (res) => {
|
|
103
114
|
let buf = "";
|
|
104
115
|
res.setEncoding("utf8");
|
|
105
|
-
res.on("data", (c) => {
|
|
116
|
+
res.on("data", (c) => {
|
|
117
|
+
buf += c;
|
|
118
|
+
});
|
|
106
119
|
res.on("end", () => {
|
|
107
120
|
if ((res.statusCode ?? 0) >= 400) {
|
|
108
121
|
return rejectGet(new Error(`GET ${url} → ${res.statusCode}`));
|
|
@@ -115,7 +128,10 @@ async function httpGetJson(url) {
|
|
|
115
128
|
}
|
|
116
129
|
});
|
|
117
130
|
});
|
|
118
|
-
req.setTimeout(5_000, () => {
|
|
131
|
+
req.setTimeout(5_000, () => {
|
|
132
|
+
req.destroy();
|
|
133
|
+
rejectGet(new Error(`GET ${url} timed out`));
|
|
134
|
+
});
|
|
119
135
|
req.once("error", rejectGet);
|
|
120
136
|
req.end();
|
|
121
137
|
});
|
|
@@ -167,7 +183,7 @@ export const inspectTools = [
|
|
|
167
183
|
},
|
|
168
184
|
{
|
|
169
185
|
name: "list_actions",
|
|
170
|
-
description:
|
|
186
|
+
description: 'List actions exposed by the wire. Optional `module` filter (e.g. "submissions").',
|
|
171
187
|
inputSchema: {
|
|
172
188
|
type: "object",
|
|
173
189
|
additionalProperties: false,
|
|
@@ -215,7 +231,7 @@ export const inspectTools = [
|
|
|
215
231
|
},
|
|
216
232
|
{
|
|
217
233
|
name: "list_plugins",
|
|
218
|
-
description:
|
|
234
|
+
description: 'List discovered plugins (reads .nwire/plugins.json). Optional `kind` filter: "plugin" | "module".',
|
|
219
235
|
inputSchema: {
|
|
220
236
|
type: "object",
|
|
221
237
|
additionalProperties: false,
|
package/dist/inspect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../src/inspect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,sEAAsE;AAEtE,MAAM,mBAAmB,GAAsB;IAC7C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../src/inspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-tools.d.ts","sourceRoot":"","sources":["../src/write-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"write-tools.d.ts","sourceRoot":"","sources":["../src/write-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AA+MvE,eAAO,MAAM,UAAU,EAAE,SAAS,cAAc,EAA8C,CAAC;AAE/F,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEtE"}
|
package/dist/write-tools.js
CHANGED
|
@@ -44,7 +44,9 @@ async function httpPostJson(url, payload) {
|
|
|
44
44
|
}, (res) => {
|
|
45
45
|
let buf = "";
|
|
46
46
|
res.setEncoding("utf8");
|
|
47
|
-
res.on("data", (c) => {
|
|
47
|
+
res.on("data", (c) => {
|
|
48
|
+
buf += c;
|
|
49
|
+
});
|
|
48
50
|
res.on("end", () => {
|
|
49
51
|
const status = res.statusCode ?? 0;
|
|
50
52
|
if (buf.length === 0)
|
|
@@ -201,11 +203,7 @@ const replayTrace = {
|
|
|
201
203
|
return body;
|
|
202
204
|
},
|
|
203
205
|
};
|
|
204
|
-
export const writeTools = [
|
|
205
|
-
dispatchAction,
|
|
206
|
-
runCommand,
|
|
207
|
-
replayTrace,
|
|
208
|
-
];
|
|
206
|
+
export const writeTools = [dispatchAction, runCommand, replayTrace];
|
|
209
207
|
export function findWriteTool(name) {
|
|
210
208
|
return writeTools.find((t) => t.name === name);
|
|
211
209
|
}
|
package/dist/write-tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-tools.js","sourceRoot":"","sources":["../src/write-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAuB,MAAM,cAAc,CAAC;AASvE;;;;GAIG;AACH,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,OAAgB;IACvD,OAAO,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE;QAC7C,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"write-tools.js","sourceRoot":"","sources":["../src/write-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAuB,MAAM,cAAc,CAAC;AASvE;;;;GAIG;AACH,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,OAAgB;IACvD,OAAO,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE;QAC7C,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,WAAW,CACrB;YACE,IAAI,EAAE,CAAC,CAAC,QAAQ;YAChB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;YAClB,IAAI,EAAE,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,MAAM;YAC3B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;aACrD;SACF,EACD,CAAC,GAAG,EAAE,EAAE;YACN,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACxB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;gBAC3B,GAAG,IAAI,CAAC,CAAC;YACX,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC;gBACnC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,WAAW,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;gBACtE,IAAI,CAAC;oBACH,WAAW,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACjD,CAAC;gBAAC,MAAM,CAAC;oBACP,2DAA2D;oBAC3D,WAAW,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CACF,CAAC;QACF,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE;YAC1B,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC9B,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChB,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,sEAAsE;AAEtE,MAAM,OAAO,GACX,gGAAgG,CAAC;AAEnG;;;;GAIG;AACH,MAAM,cAAc,GAAmB;IACrC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EACT,0EAA0E;QAC1E,kEAAkE;QAClE,wFAAwF;IAC1F,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,oBAAoB,EAAE,KAAK;QAC3B,QAAQ,EAAE,CAAC,QAAQ,CAAC;QACpB,UAAU,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE;YACrD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,oBAAoB,EAAE,KAAK;gBAC3B,UAAU,EAAE;oBACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACtB,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;iBACpD;aACF;YACD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC3B;KACF;IACD,KAAK,CAAC,GAAG,CAAC,IAAI;QACZ,MAAM,GAAG,GAAG,MAAM,kBAAkB,EAAE,CAAC;QACvC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,MAA4B,CAAC;QACjD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAqD,CAAC;QACxE,MAAM,MAAM,GAAG,IAAI,CAAC,MAA4B,CAAC;QACjD,MAAM,OAAO,GAAG;YACd,MAAM;YACN,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;YACvB,GAAG,CAAC,IAAI,EAAE,EAAE,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;YAClD,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,CAAC;SACxC,CAAC;QACF,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC,GAAG,GAAG,kBAAkB,EAAE,OAAO,CAAC,CAAC;QAC/E,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,oBAAoB,MAAM,MAAM,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CACzF,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,GAAmB;IACjC,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,iEAAiE;QACjE,wCAAwC;QACxC,kGAAkG;IACpG,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,oBAAoB,EAAE,KAAK;QAC3B,QAAQ,EAAE,CAAC,MAAM,CAAC;QAClB,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE;SACrD;KACF;IACD,KAAK,CAAC,GAAG,CAAC,IAAI;QACZ,MAAM,GAAG,GAAG,MAAM,kBAAkB,EAAE,CAAC;QACvC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAA0B,CAAC;QAC7C,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAE1D,uEAAuE;QACvE,6DAA6D;QAC7D,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC,GAAG,GAAG,iBAAiB,EAAE;YACnE,IAAI;YACJ,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;SACtB,CAAC,CAAC;QACH,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,mEAAmE;gBACjE,mFAAmF;gBACnF,4FAA4F,CAC/F,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,uBAAuB,MAAM,MAAM,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAC5F,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,GAAmB;IAClC,IAAI,EAAE,cAAc;IACpB,WAAW,EACT,6EAA6E;QAC7E,6EAA6E;QAC7E,iGAAiG;IACnG,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,oBAAoB,EAAE,KAAK;QAC3B,QAAQ,EAAE,CAAC,WAAW,CAAC;QACvB,UAAU,EAAE;YACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE;SAC1D;KACF;IACD,KAAK,CAAC,GAAG,CAAC,IAAI;QACZ,MAAM,GAAG,GAAG,MAAM,kBAAkB,EAAE,CAAC;QACvC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAgD,CAAC;QACxE,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAC5F,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC,GAAG,GAAG,gBAAgB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACnF,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,kEAAkE;gBAChE,2FAA2F;gBAC3F,0FAA0F,CAC7F,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,wBAAwB,MAAM,MAAM,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAC7F,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAA8B,CAAC,cAAc,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AAE/F,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACjD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nwire/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Nwire MCP (Model Context Protocol) server — exposes the kernel's CommandRouter as MCP tools over stdio. AI clients (Claude, Cursor, …) drive nwire commands the same way the CLI and Studio do.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"access": "public"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@nwire/kernel": "0.8.
|
|
25
|
+
"@nwire/kernel": "0.8.17"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/node": "^22.19.9",
|
|
@@ -21,23 +21,25 @@ import { createKernel, type Kernel } from "@nwire/kernel";
|
|
|
21
21
|
import { serveMcp } from "../index";
|
|
22
22
|
import { resetInspectDiscoveryCache } from "../inspect";
|
|
23
23
|
|
|
24
|
-
interface PendingResponse {
|
|
24
|
+
interface PendingResponse {
|
|
25
|
+
resolve: (value: any) => void;
|
|
26
|
+
}
|
|
25
27
|
|
|
26
28
|
class StdioHarness {
|
|
27
|
-
readonly stdin
|
|
29
|
+
readonly stdin = new PassThrough();
|
|
28
30
|
readonly stdout = new PassThrough();
|
|
29
|
-
private buffer
|
|
31
|
+
private buffer = "";
|
|
30
32
|
private pending = new Map<string | number, PendingResponse>();
|
|
31
33
|
readonly notifications: Array<{ method: string; params?: any }> = [];
|
|
32
|
-
readonly served:
|
|
34
|
+
readonly served: Promise<void>;
|
|
33
35
|
private id = 0;
|
|
34
36
|
|
|
35
37
|
constructor(kernel: Kernel) {
|
|
36
38
|
this.served = serveMcp({
|
|
37
39
|
kernel,
|
|
38
|
-
stdin:
|
|
40
|
+
stdin: this.stdin,
|
|
39
41
|
stdout: this.stdout,
|
|
40
|
-
serverName:
|
|
42
|
+
serverName: "nwire-test",
|
|
41
43
|
serverVersion: "0.0.0-test",
|
|
42
44
|
});
|
|
43
45
|
this.stdout.setEncoding("utf8");
|
|
@@ -74,22 +76,22 @@ class StdioHarness {
|
|
|
74
76
|
}
|
|
75
77
|
|
|
76
78
|
interface StubWire {
|
|
77
|
-
readonly url:
|
|
79
|
+
readonly url: string;
|
|
78
80
|
readonly server: Server;
|
|
79
|
-
manifest:
|
|
80
|
-
events:
|
|
81
|
-
telemetry:
|
|
82
|
-
requests:
|
|
81
|
+
manifest: Record<string, unknown>;
|
|
82
|
+
events: unknown[];
|
|
83
|
+
telemetry: unknown[];
|
|
84
|
+
requests: Array<{ method: string; url: string }>;
|
|
83
85
|
}
|
|
84
86
|
|
|
85
87
|
async function startStubWire(): Promise<StubWire> {
|
|
86
88
|
const stub: StubWire = {
|
|
87
|
-
url:
|
|
88
|
-
server:
|
|
89
|
-
manifest:
|
|
90
|
-
events:
|
|
89
|
+
url: "",
|
|
90
|
+
server: null as unknown as Server,
|
|
91
|
+
manifest: {},
|
|
92
|
+
events: [],
|
|
91
93
|
telemetry: [],
|
|
92
|
-
requests:
|
|
94
|
+
requests: [],
|
|
93
95
|
};
|
|
94
96
|
const server = createServer((req, res) => {
|
|
95
97
|
stub.requests.push({ method: req.method ?? "?", url: req.url ?? "" });
|
|
@@ -123,10 +125,10 @@ function parseToolResult(res: any): unknown {
|
|
|
123
125
|
}
|
|
124
126
|
|
|
125
127
|
describe("@nwire/mcp — inspect tools", () => {
|
|
126
|
-
let kernel:
|
|
128
|
+
let kernel: Kernel;
|
|
127
129
|
let harness: StdioHarness;
|
|
128
|
-
let stub:
|
|
129
|
-
let tmpDir:
|
|
130
|
+
let stub: StubWire | undefined;
|
|
131
|
+
let tmpDir: string | undefined;
|
|
130
132
|
let prevCwd: string | undefined;
|
|
131
133
|
let prevInspectUrl: string | undefined;
|
|
132
134
|
|
|
@@ -171,7 +173,11 @@ describe("@nwire/mcp — inspect tools", () => {
|
|
|
171
173
|
|
|
172
174
|
it("manifest returns the live wire's manifest body", async () => {
|
|
173
175
|
stub = await startStubWire();
|
|
174
|
-
stub.manifest = {
|
|
176
|
+
stub.manifest = {
|
|
177
|
+
actions: [{ name: "a.do", module: "alpha" }],
|
|
178
|
+
events: [],
|
|
179
|
+
generatedAt: "now",
|
|
180
|
+
};
|
|
175
181
|
process.env.NWIRE_INSPECT_URL = stub.url;
|
|
176
182
|
harness = new StdioHarness(kernel);
|
|
177
183
|
|
|
@@ -186,21 +192,21 @@ describe("@nwire/mcp — inspect tools", () => {
|
|
|
186
192
|
stub.manifest = {
|
|
187
193
|
actions: [
|
|
188
194
|
{ name: "submit", module: "submissions" },
|
|
189
|
-
{ name: "grade",
|
|
190
|
-
{ name: "enrol",
|
|
195
|
+
{ name: "grade", module: "submissions" },
|
|
196
|
+
{ name: "enrol", module: "roster" },
|
|
191
197
|
],
|
|
192
198
|
};
|
|
193
199
|
process.env.NWIRE_INSPECT_URL = stub.url;
|
|
194
200
|
harness = new StdioHarness(kernel);
|
|
195
201
|
|
|
196
202
|
const unfiltered = await harness.request("tools/call", {
|
|
197
|
-
name:
|
|
203
|
+
name: "list_actions",
|
|
198
204
|
arguments: {},
|
|
199
205
|
});
|
|
200
206
|
expect((parseToolResult(unfiltered) as unknown[]).length).toBe(3);
|
|
201
207
|
|
|
202
208
|
const filtered = await harness.request("tools/call", {
|
|
203
|
-
name:
|
|
209
|
+
name: "list_actions",
|
|
204
210
|
arguments: { module: "submissions" },
|
|
205
211
|
});
|
|
206
212
|
const actions = parseToolResult(filtered) as Array<{ name: string }>;
|
|
@@ -212,15 +218,15 @@ describe("@nwire/mcp — inspect tools", () => {
|
|
|
212
218
|
stub.manifest = {
|
|
213
219
|
events: [
|
|
214
220
|
{ name: "Submitted", module: "submissions" },
|
|
215
|
-
{ name: "Graded",
|
|
216
|
-
{ name: "Enrolled",
|
|
221
|
+
{ name: "Graded", module: "submissions" },
|
|
222
|
+
{ name: "Enrolled", module: "roster" },
|
|
217
223
|
],
|
|
218
224
|
};
|
|
219
225
|
process.env.NWIRE_INSPECT_URL = stub.url;
|
|
220
226
|
harness = new StdioHarness(kernel);
|
|
221
227
|
|
|
222
228
|
const res = await harness.request("tools/call", {
|
|
223
|
-
name:
|
|
229
|
+
name: "list_events",
|
|
224
230
|
arguments: { module: "roster" },
|
|
225
231
|
});
|
|
226
232
|
const events = parseToolResult(res) as Array<{ name: string }>;
|
|
@@ -229,7 +235,7 @@ describe("@nwire/mcp — inspect tools", () => {
|
|
|
229
235
|
});
|
|
230
236
|
|
|
231
237
|
it("list_hooks reads .nwire/hooks.json from disk", async () => {
|
|
232
|
-
tmpDir
|
|
238
|
+
tmpDir = mkdtempSync(join(tmpdir(), "nwire-mcp-hooks-"));
|
|
233
239
|
prevCwd = process.cwd();
|
|
234
240
|
mkdirSync(join(tmpDir, ".nwire"), { recursive: true });
|
|
235
241
|
const hooks = [{ name: "tracing", phase: "before" }];
|
|
@@ -246,12 +252,12 @@ describe("@nwire/mcp — inspect tools", () => {
|
|
|
246
252
|
});
|
|
247
253
|
|
|
248
254
|
it("list_plugins reads .nwire/plugins.json from disk and supports kind filter", async () => {
|
|
249
|
-
tmpDir
|
|
255
|
+
tmpDir = mkdtempSync(join(tmpdir(), "nwire-mcp-plugins-"));
|
|
250
256
|
prevCwd = process.cwd();
|
|
251
257
|
mkdirSync(join(tmpDir, ".nwire"), { recursive: true });
|
|
252
258
|
const plugins = [
|
|
253
|
-
{ name: "rbac",
|
|
254
|
-
{ name: "identity",
|
|
259
|
+
{ name: "rbac", kind: "plugin" },
|
|
260
|
+
{ name: "identity", kind: "plugin" },
|
|
255
261
|
{ name: "submissions", kind: "module" },
|
|
256
262
|
];
|
|
257
263
|
writeFileSync(join(tmpDir, ".nwire", "plugins.json"), JSON.stringify(plugins));
|
|
@@ -261,13 +267,13 @@ describe("@nwire/mcp — inspect tools", () => {
|
|
|
261
267
|
harness = new StdioHarness(kernel);
|
|
262
268
|
|
|
263
269
|
const all = await harness.request("tools/call", {
|
|
264
|
-
name:
|
|
270
|
+
name: "list_plugins",
|
|
265
271
|
arguments: {},
|
|
266
272
|
});
|
|
267
273
|
expect((parseToolResult(all) as unknown[]).length).toBe(3);
|
|
268
274
|
|
|
269
275
|
const onlyPlugins = await harness.request("tools/call", {
|
|
270
|
-
name:
|
|
276
|
+
name: "list_plugins",
|
|
271
277
|
arguments: { kind: "plugin" },
|
|
272
278
|
});
|
|
273
279
|
expect((parseToolResult(onlyPlugins) as Array<{ name: string }>).map((p) => p.name)).toEqual([
|
|
@@ -278,12 +284,15 @@ describe("@nwire/mcp — inspect tools", () => {
|
|
|
278
284
|
|
|
279
285
|
it("recent_events passes the limit param through to the wire", async () => {
|
|
280
286
|
stub = await startStubWire();
|
|
281
|
-
stub.events = [
|
|
287
|
+
stub.events = [
|
|
288
|
+
{ name: "Submitted", t: 1 },
|
|
289
|
+
{ name: "Graded", t: 2 },
|
|
290
|
+
];
|
|
282
291
|
process.env.NWIRE_INSPECT_URL = stub.url;
|
|
283
292
|
harness = new StdioHarness(kernel);
|
|
284
293
|
|
|
285
294
|
const res = await harness.request("tools/call", {
|
|
286
|
-
name:
|
|
295
|
+
name: "recent_events",
|
|
287
296
|
arguments: { limit: 42 },
|
|
288
297
|
});
|
|
289
298
|
expect(res.result.isError).toBe(false);
|
|
@@ -299,7 +308,7 @@ describe("@nwire/mcp — inspect tools", () => {
|
|
|
299
308
|
harness = new StdioHarness(kernel);
|
|
300
309
|
|
|
301
310
|
const res = await harness.request("tools/call", {
|
|
302
|
-
name:
|
|
311
|
+
name: "recent_telemetry",
|
|
303
312
|
arguments: {},
|
|
304
313
|
});
|
|
305
314
|
expect(res.result.isError).toBe(false);
|
|
@@ -310,7 +319,7 @@ describe("@nwire/mcp — inspect tools", () => {
|
|
|
310
319
|
|
|
311
320
|
it("manifest gracefully fails when no wire and no cache are available", async () => {
|
|
312
321
|
// Point at an empty tmp dir with no .nwire/ AND no live wire URL.
|
|
313
|
-
tmpDir
|
|
322
|
+
tmpDir = mkdtempSync(join(tmpdir(), "nwire-mcp-empty-"));
|
|
314
323
|
prevCwd = process.cwd();
|
|
315
324
|
process.chdir(tmpDir);
|
|
316
325
|
// Force discovery to find nothing: set a deliberately-empty probe list
|
|
@@ -10,23 +10,25 @@ import { PassThrough } from "node:stream";
|
|
|
10
10
|
import { createKernel, type Kernel } from "@nwire/kernel";
|
|
11
11
|
import { serveMcp } from "../index";
|
|
12
12
|
|
|
13
|
-
interface PendingResponse {
|
|
13
|
+
interface PendingResponse {
|
|
14
|
+
resolve: (value: any) => void;
|
|
15
|
+
}
|
|
14
16
|
|
|
15
17
|
class StdioHarness {
|
|
16
|
-
readonly stdin
|
|
18
|
+
readonly stdin = new PassThrough();
|
|
17
19
|
readonly stdout = new PassThrough();
|
|
18
|
-
private buffer
|
|
20
|
+
private buffer = "";
|
|
19
21
|
private pending = new Map<string | number, PendingResponse>();
|
|
20
22
|
readonly notifications: Array<{ method: string; params?: any }> = [];
|
|
21
|
-
readonly served:
|
|
23
|
+
readonly served: Promise<void>;
|
|
22
24
|
private id = 0;
|
|
23
25
|
|
|
24
26
|
constructor(kernel: Kernel) {
|
|
25
27
|
this.served = serveMcp({
|
|
26
28
|
kernel,
|
|
27
|
-
stdin:
|
|
29
|
+
stdin: this.stdin,
|
|
28
30
|
stdout: this.stdout,
|
|
29
|
-
serverName:
|
|
31
|
+
serverName: "nwire-test",
|
|
30
32
|
serverVersion: "0.0.0-test",
|
|
31
33
|
});
|
|
32
34
|
this.stdout.setEncoding("utf8");
|
|
@@ -63,7 +65,7 @@ class StdioHarness {
|
|
|
63
65
|
}
|
|
64
66
|
|
|
65
67
|
describe("@nwire/mcp — JSON-RPC over stdio", () => {
|
|
66
|
-
let kernel:
|
|
68
|
+
let kernel: Kernel;
|
|
67
69
|
let harness: StdioHarness;
|
|
68
70
|
|
|
69
71
|
beforeEach(() => {
|
|
@@ -83,13 +85,13 @@ describe("@nwire/mcp — JSON-RPC over stdio", () => {
|
|
|
83
85
|
});
|
|
84
86
|
|
|
85
87
|
it("tools/list returns every registered command", async () => {
|
|
86
|
-
kernel.router.register("greet",
|
|
88
|
+
kernel.router.register("greet", async () => "hi");
|
|
87
89
|
kernel.router.register("double", async (_ctx, a: { n: number }) => a.n * 2);
|
|
88
90
|
harness = new StdioHarness(kernel);
|
|
89
91
|
|
|
90
92
|
const res = await harness.request("tools/list", {});
|
|
91
93
|
const tools = res.result.tools as Array<{
|
|
92
|
-
name:
|
|
94
|
+
name: string;
|
|
93
95
|
description: string;
|
|
94
96
|
inputSchema: { type: string };
|
|
95
97
|
}>;
|
|
@@ -109,7 +111,7 @@ describe("@nwire/mcp — JSON-RPC over stdio", () => {
|
|
|
109
111
|
harness = new StdioHarness(kernel);
|
|
110
112
|
|
|
111
113
|
const res = await harness.request("tools/call", {
|
|
112
|
-
name:
|
|
114
|
+
name: "double",
|
|
113
115
|
arguments: { n: 21 },
|
|
114
116
|
});
|
|
115
117
|
expect(res.result.isError).toBe(false);
|
|
@@ -15,23 +15,25 @@ import { createKernel, type Kernel } from "@nwire/kernel";
|
|
|
15
15
|
import { serveMcp } from "../index";
|
|
16
16
|
import { resetInspectDiscoveryCache } from "../inspect";
|
|
17
17
|
|
|
18
|
-
interface PendingResponse {
|
|
18
|
+
interface PendingResponse {
|
|
19
|
+
resolve: (value: any) => void;
|
|
20
|
+
}
|
|
19
21
|
|
|
20
22
|
class StdioHarness {
|
|
21
|
-
readonly stdin
|
|
23
|
+
readonly stdin = new PassThrough();
|
|
22
24
|
readonly stdout = new PassThrough();
|
|
23
|
-
private buffer
|
|
25
|
+
private buffer = "";
|
|
24
26
|
private pending = new Map<string | number, PendingResponse>();
|
|
25
27
|
readonly notifications: Array<{ method: string; params?: any }> = [];
|
|
26
|
-
readonly served:
|
|
28
|
+
readonly served: Promise<void>;
|
|
27
29
|
private id = 0;
|
|
28
30
|
|
|
29
31
|
constructor(kernel: Kernel) {
|
|
30
32
|
this.served = serveMcp({
|
|
31
33
|
kernel,
|
|
32
|
-
stdin:
|
|
34
|
+
stdin: this.stdin,
|
|
33
35
|
stdout: this.stdout,
|
|
34
|
-
serverName:
|
|
36
|
+
serverName: "nwire-test",
|
|
35
37
|
serverVersion: "0.0.0-test",
|
|
36
38
|
});
|
|
37
39
|
this.stdout.setEncoding("utf8");
|
|
@@ -69,12 +71,12 @@ class StdioHarness {
|
|
|
69
71
|
|
|
70
72
|
interface CapturedRequest {
|
|
71
73
|
readonly method: string;
|
|
72
|
-
readonly url:
|
|
73
|
-
readonly body:
|
|
74
|
+
readonly url: string;
|
|
75
|
+
readonly body: unknown;
|
|
74
76
|
}
|
|
75
77
|
|
|
76
78
|
interface StubWire {
|
|
77
|
-
readonly url:
|
|
79
|
+
readonly url: string;
|
|
78
80
|
readonly server: Server;
|
|
79
81
|
readonly requests: CapturedRequest[];
|
|
80
82
|
/** Override per-path responses. Default → 404 so gap-flag tests fire. */
|
|
@@ -85,8 +87,10 @@ async function readBody(req: IncomingMessage): Promise<unknown> {
|
|
|
85
87
|
return new Promise((resolveBody) => {
|
|
86
88
|
let raw = "";
|
|
87
89
|
req.setEncoding("utf8");
|
|
88
|
-
req.on("data", (c: string) => {
|
|
89
|
-
|
|
90
|
+
req.on("data", (c: string) => {
|
|
91
|
+
raw += c;
|
|
92
|
+
});
|
|
93
|
+
req.on("end", () => {
|
|
90
94
|
if (raw.length === 0) return resolveBody(undefined);
|
|
91
95
|
try {
|
|
92
96
|
resolveBody(JSON.parse(raw));
|
|
@@ -99,15 +103,15 @@ async function readBody(req: IncomingMessage): Promise<unknown> {
|
|
|
99
103
|
|
|
100
104
|
async function startStubWire(): Promise<StubWire> {
|
|
101
105
|
const stub: StubWire = {
|
|
102
|
-
url:
|
|
103
|
-
server:
|
|
106
|
+
url: "",
|
|
107
|
+
server: null as unknown as Server,
|
|
104
108
|
requests: [],
|
|
105
|
-
routes:
|
|
109
|
+
routes: new Map(),
|
|
106
110
|
};
|
|
107
111
|
const server = createServer(async (req, res) => {
|
|
108
|
-
const url
|
|
112
|
+
const url = req.url ?? "";
|
|
109
113
|
const method = req.method ?? "?";
|
|
110
|
-
const body
|
|
114
|
+
const body = method === "POST" ? await readBody(req) : undefined;
|
|
111
115
|
stub.requests.push({ method, url, body });
|
|
112
116
|
|
|
113
117
|
// The discovery probe hits GET /_nwire/events/recent — always 200 [].
|
|
@@ -148,9 +152,9 @@ function parseToolResult(res: any): unknown {
|
|
|
148
152
|
}
|
|
149
153
|
|
|
150
154
|
describe("@nwire/mcp — write tools", () => {
|
|
151
|
-
let kernel:
|
|
155
|
+
let kernel: Kernel;
|
|
152
156
|
let harness: StdioHarness;
|
|
153
|
-
let stub:
|
|
157
|
+
let stub: StubWire | undefined;
|
|
154
158
|
let prevInspectUrl: string | undefined;
|
|
155
159
|
let prevProbePorts: string | undefined;
|
|
156
160
|
|
|
@@ -188,14 +192,14 @@ describe("@nwire/mcp — write tools", () => {
|
|
|
188
192
|
stub.routes.set("POST /_nwire/dispatch", (body) => {
|
|
189
193
|
expect(body).toEqual({
|
|
190
194
|
action: "submissions.submit",
|
|
191
|
-
input:
|
|
195
|
+
input: { studentId: "alice", answer: "42" },
|
|
192
196
|
userId: "u-1",
|
|
193
197
|
});
|
|
194
198
|
return {
|
|
195
199
|
status: 200,
|
|
196
|
-
body:
|
|
197
|
-
ok:
|
|
198
|
-
result:
|
|
200
|
+
body: {
|
|
201
|
+
ok: true,
|
|
202
|
+
result: { events: [{ name: "Submitted" }] },
|
|
199
203
|
envelope: { messageId: "m-1", correlationId: "c-1" },
|
|
200
204
|
},
|
|
201
205
|
};
|
|
@@ -204,11 +208,11 @@ describe("@nwire/mcp — write tools", () => {
|
|
|
204
208
|
harness = new StdioHarness(kernel);
|
|
205
209
|
|
|
206
210
|
const res = await harness.request("tools/call", {
|
|
207
|
-
name:
|
|
211
|
+
name: "dispatch_action",
|
|
208
212
|
arguments: {
|
|
209
213
|
action: "submissions.submit",
|
|
210
|
-
input:
|
|
211
|
-
user:
|
|
214
|
+
input: { studentId: "alice", answer: "42" },
|
|
215
|
+
user: { id: "u-1", roles: ["student"] },
|
|
212
216
|
},
|
|
213
217
|
});
|
|
214
218
|
expect(res.result.isError).toBe(false);
|
|
@@ -226,7 +230,7 @@ describe("@nwire/mcp — write tools", () => {
|
|
|
226
230
|
harness = new StdioHarness(kernel);
|
|
227
231
|
|
|
228
232
|
const res = await harness.request("tools/call", {
|
|
229
|
-
name:
|
|
233
|
+
name: "dispatch_action",
|
|
230
234
|
arguments: { action: "x", input: {} },
|
|
231
235
|
});
|
|
232
236
|
expect(res.result.isError).toBe(true);
|
|
@@ -242,7 +246,7 @@ describe("@nwire/mcp — write tools", () => {
|
|
|
242
246
|
harness = new StdioHarness(kernel);
|
|
243
247
|
|
|
244
248
|
const res = await harness.request("tools/call", {
|
|
245
|
-
name:
|
|
249
|
+
name: "run_command",
|
|
246
250
|
arguments: { name: "dev", args: {} },
|
|
247
251
|
});
|
|
248
252
|
expect(res.result.isError).toBe(true);
|
|
@@ -267,7 +271,7 @@ describe("@nwire/mcp — write tools", () => {
|
|
|
267
271
|
harness = new StdioHarness(kernel);
|
|
268
272
|
|
|
269
273
|
const res = await harness.request("tools/call", {
|
|
270
|
-
name:
|
|
274
|
+
name: "run_command",
|
|
271
275
|
arguments: { name: "dev", args: { wire: "main" } },
|
|
272
276
|
});
|
|
273
277
|
expect(res.result.isError).toBe(false);
|
|
@@ -283,7 +287,7 @@ describe("@nwire/mcp — write tools", () => {
|
|
|
283
287
|
harness = new StdioHarness(kernel);
|
|
284
288
|
|
|
285
289
|
const res = await harness.request("tools/call", {
|
|
286
|
-
name:
|
|
290
|
+
name: "run_command",
|
|
287
291
|
arguments: { name: "dev", args: {} },
|
|
288
292
|
});
|
|
289
293
|
expect(res.result.isError).toBe(true);
|
|
@@ -298,12 +302,12 @@ describe("@nwire/mcp — write tools", () => {
|
|
|
298
302
|
harness = new StdioHarness(kernel);
|
|
299
303
|
|
|
300
304
|
const recording = {
|
|
301
|
-
ctxIn:
|
|
305
|
+
ctxIn: {},
|
|
302
306
|
outcome: "ok",
|
|
303
|
-
steps:
|
|
307
|
+
steps: [{ stepKind: "branch", stepName: "guard", phase: "enter" }],
|
|
304
308
|
};
|
|
305
309
|
const res = await harness.request("tools/call", {
|
|
306
|
-
name:
|
|
310
|
+
name: "replay_trace",
|
|
307
311
|
arguments: { recording },
|
|
308
312
|
});
|
|
309
313
|
expect(res.result.isError).toBe(true);
|
|
@@ -319,13 +323,13 @@ describe("@nwire/mcp — write tools", () => {
|
|
|
319
323
|
stub = await startStubWire();
|
|
320
324
|
stub.routes.set("POST /_nwire/replay", () => ({
|
|
321
325
|
status: 200,
|
|
322
|
-
body:
|
|
326
|
+
body: { ok: true, drift: [], stepsCompared: 1 },
|
|
323
327
|
}));
|
|
324
328
|
process.env.NWIRE_INSPECT_URL = stub.url;
|
|
325
329
|
harness = new StdioHarness(kernel);
|
|
326
330
|
|
|
327
331
|
const res = await harness.request("tools/call", {
|
|
328
|
-
name:
|
|
332
|
+
name: "replay_trace",
|
|
329
333
|
arguments: { recording: { ctxIn: {}, outcome: "ok", steps: [] } },
|
|
330
334
|
});
|
|
331
335
|
expect(res.result.isError).toBe(false);
|
|
@@ -341,7 +345,7 @@ describe("@nwire/mcp — write tools", () => {
|
|
|
341
345
|
harness = new StdioHarness(kernel);
|
|
342
346
|
|
|
343
347
|
const res = await harness.request("tools/call", {
|
|
344
|
-
name:
|
|
348
|
+
name: "replay_trace",
|
|
345
349
|
arguments: { recording: { ctxIn: {}, outcome: "ok", steps: [] } },
|
|
346
350
|
});
|
|
347
351
|
expect(res.result.isError).toBe(true);
|
package/src/index.ts
CHANGED
|
@@ -50,10 +50,10 @@ interface JsonRpcNotification {
|
|
|
50
50
|
readonly params?: Record<string, unknown>;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
const ERR_PARSE
|
|
54
|
-
const ERR_NOT_FOUND
|
|
53
|
+
const ERR_PARSE = -32700;
|
|
54
|
+
const ERR_NOT_FOUND = -32601;
|
|
55
55
|
const ERR_INVALID_PARAMS = -32602;
|
|
56
|
-
const ERR_INTERNAL
|
|
56
|
+
const ERR_INTERNAL = -32603;
|
|
57
57
|
|
|
58
58
|
// ─── Server ────────────────────────────────────────────────────────
|
|
59
59
|
|
|
@@ -69,7 +69,7 @@ export interface ServeMcpOptions {
|
|
|
69
69
|
* Defaults to `process.stdin`. Tests supply a PassThrough; foreign
|
|
70
70
|
* transports (websocket, http) can adapt to this same shape.
|
|
71
71
|
*/
|
|
72
|
-
readonly stdin?:
|
|
72
|
+
readonly stdin?: NodeJS.ReadableStream;
|
|
73
73
|
/**
|
|
74
74
|
* Output stream the server writes responses + notifications to.
|
|
75
75
|
* Defaults to `process.stdout`. Stderr is always used for server
|
|
@@ -91,7 +91,7 @@ export async function serveMcp(options: ServeMcpOptions = {}): Promise<void> {
|
|
|
91
91
|
const kernel = options.kernel ?? createKernel();
|
|
92
92
|
const serverName = options.serverName ?? "nwire";
|
|
93
93
|
const serverVersion = options.serverVersion ?? "0.1.0";
|
|
94
|
-
const stdin
|
|
94
|
+
const stdin = options.stdin ?? process.stdin;
|
|
95
95
|
const stdout = options.stdout ?? process.stdout;
|
|
96
96
|
|
|
97
97
|
const send = (msg: JsonRpcResponse | JsonRpcNotification): void => {
|
|
@@ -159,7 +159,7 @@ async function handle(req: JsonRpcRequest, ctx: HandleContext): Promise<void> {
|
|
|
159
159
|
// Read-only introspection tools that proxy /_nwire/* (or
|
|
160
160
|
// fall back to the .nwire/ disk cache).
|
|
161
161
|
...inspectTools.map((t) => ({
|
|
162
|
-
name:
|
|
162
|
+
name: t.name,
|
|
163
163
|
description: t.description,
|
|
164
164
|
inputSchema: t.inputSchema,
|
|
165
165
|
})),
|
|
@@ -167,7 +167,7 @@ async function handle(req: JsonRpcRequest, ctx: HandleContext): Promise<void> {
|
|
|
167
167
|
// Some target endpoints aren't mounted yet — those tools
|
|
168
168
|
// gracefully gap-flag (see write-tools.ts).
|
|
169
169
|
...writeTools.map((t) => ({
|
|
170
|
-
name:
|
|
170
|
+
name: t.name,
|
|
171
171
|
description: t.description,
|
|
172
172
|
inputSchema: t.inputSchema,
|
|
173
173
|
})),
|
|
@@ -333,3 +333,7 @@ function readLines(
|
|
|
333
333
|
// Also export the JSON-RPC types so consumers can write their own
|
|
334
334
|
// transport adapters (e.g. WebSocket) reusing the dispatch logic.
|
|
335
335
|
export type { JsonRpcRequest, JsonRpcResponse, JsonRpcNotification };
|
|
336
|
+
|
|
337
|
+
export { inspectTools, findInspectTool, resetInspectDiscoveryCache } from "./inspect.js";
|
|
338
|
+
export type { InspectToolDef } from "./inspect.js";
|
|
339
|
+
export { writeTools, findWriteTool } from "./write-tools.js";
|
package/src/inspect.ts
CHANGED
|
@@ -30,8 +30,7 @@ import { resolve } from "node:path";
|
|
|
30
30
|
// ─── Port discovery ────────────────────────────────────────────────
|
|
31
31
|
|
|
32
32
|
const DEFAULT_PROBE_PORTS: readonly number[] = [
|
|
33
|
-
3000, 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, 3009, 3010,
|
|
34
|
-
3030, 3040, 3050, 4000, 8080,
|
|
33
|
+
3000, 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, 3009, 3010, 3030, 3040, 3050, 4000, 8080,
|
|
35
34
|
];
|
|
36
35
|
|
|
37
36
|
const PROBE_TIMEOUT_MS = 150;
|
|
@@ -39,7 +38,7 @@ const CACHE_TTL_MS = 5_000;
|
|
|
39
38
|
const NEGATIVE_CACHE_TTL_MS = 1_500;
|
|
40
39
|
|
|
41
40
|
interface DiscoveredUrl {
|
|
42
|
-
readonly url:
|
|
41
|
+
readonly url: string | undefined;
|
|
43
42
|
readonly expires: number;
|
|
44
43
|
}
|
|
45
44
|
|
|
@@ -74,7 +73,10 @@ export async function discoverInspectUrl(): Promise<string | undefined> {
|
|
|
74
73
|
|
|
75
74
|
function parsePorts(raw: string | undefined): readonly number[] | undefined {
|
|
76
75
|
if (!raw) return undefined;
|
|
77
|
-
const ports = raw
|
|
76
|
+
const ports = raw
|
|
77
|
+
.split(",")
|
|
78
|
+
.map((s) => Number(s.trim()))
|
|
79
|
+
.filter((n) => n > 0);
|
|
78
80
|
return ports.length > 0 ? ports : undefined;
|
|
79
81
|
}
|
|
80
82
|
|
|
@@ -86,21 +88,33 @@ function parsePorts(raw: string | undefined): readonly number[] | undefined {
|
|
|
86
88
|
function isNwireWire(port: number, timeoutMs: number): Promise<boolean> {
|
|
87
89
|
return new Promise((resolveProbe) => {
|
|
88
90
|
const sock = createConnection({ host: "127.0.0.1", port });
|
|
89
|
-
sock.setTimeout(timeoutMs, () => {
|
|
90
|
-
|
|
91
|
+
sock.setTimeout(timeoutMs, () => {
|
|
92
|
+
sock.destroy();
|
|
93
|
+
resolveProbe(false);
|
|
94
|
+
});
|
|
95
|
+
sock.once("error", () => resolveProbe(false));
|
|
91
96
|
sock.once("connect", () => {
|
|
92
97
|
sock.destroy();
|
|
93
98
|
const req = httpRequest(
|
|
94
99
|
{ host: "127.0.0.1", port, path: "/_nwire/events/recent?limit=1", method: "GET" },
|
|
95
100
|
(res) => {
|
|
96
|
-
if (res.statusCode !== 200) {
|
|
101
|
+
if (res.statusCode !== 200) {
|
|
102
|
+
res.resume();
|
|
103
|
+
return resolveProbe(false);
|
|
104
|
+
}
|
|
97
105
|
let buf = "";
|
|
98
106
|
res.setEncoding("utf8");
|
|
99
|
-
res.on("data", (c: string) => {
|
|
100
|
-
|
|
107
|
+
res.on("data", (c: string) => {
|
|
108
|
+
buf += c;
|
|
109
|
+
if (buf.length > 1024) res.destroy();
|
|
110
|
+
});
|
|
111
|
+
res.on("end", () => resolveProbe(buf.trimStart().startsWith("[")));
|
|
101
112
|
},
|
|
102
113
|
);
|
|
103
|
-
req.setTimeout(timeoutMs, () => {
|
|
114
|
+
req.setTimeout(timeoutMs, () => {
|
|
115
|
+
req.destroy();
|
|
116
|
+
resolveProbe(false);
|
|
117
|
+
});
|
|
104
118
|
req.once("error", () => resolveProbe(false));
|
|
105
119
|
req.end();
|
|
106
120
|
});
|
|
@@ -117,8 +131,10 @@ async function httpGetJson(url: string): Promise<unknown> {
|
|
|
117
131
|
(res) => {
|
|
118
132
|
let buf = "";
|
|
119
133
|
res.setEncoding("utf8");
|
|
120
|
-
res.on("data", (c: string) => {
|
|
121
|
-
|
|
134
|
+
res.on("data", (c: string) => {
|
|
135
|
+
buf += c;
|
|
136
|
+
});
|
|
137
|
+
res.on("end", () => {
|
|
122
138
|
if ((res.statusCode ?? 0) >= 400) {
|
|
123
139
|
return rejectGet(new Error(`GET ${url} → ${res.statusCode}`));
|
|
124
140
|
}
|
|
@@ -130,7 +146,10 @@ async function httpGetJson(url: string): Promise<unknown> {
|
|
|
130
146
|
});
|
|
131
147
|
},
|
|
132
148
|
);
|
|
133
|
-
req.setTimeout(5_000, () => {
|
|
149
|
+
req.setTimeout(5_000, () => {
|
|
150
|
+
req.destroy();
|
|
151
|
+
rejectGet(new Error(`GET ${url} timed out`));
|
|
152
|
+
});
|
|
134
153
|
req.once("error", rejectGet);
|
|
135
154
|
req.end();
|
|
136
155
|
});
|
|
@@ -151,10 +170,10 @@ function readDiskCache(file: string): unknown | undefined {
|
|
|
151
170
|
// ─── Tool registry ─────────────────────────────────────────────────
|
|
152
171
|
|
|
153
172
|
export interface InspectToolDef {
|
|
154
|
-
readonly name:
|
|
173
|
+
readonly name: string;
|
|
155
174
|
readonly description: string;
|
|
156
175
|
readonly inputSchema: Record<string, unknown>;
|
|
157
|
-
readonly run:
|
|
176
|
+
readonly run: (args: Record<string, unknown>) => Promise<unknown>;
|
|
158
177
|
}
|
|
159
178
|
|
|
160
179
|
/**
|
|
@@ -197,8 +216,7 @@ export const inspectTools: readonly InspectToolDef[] = [
|
|
|
197
216
|
},
|
|
198
217
|
{
|
|
199
218
|
name: "list_actions",
|
|
200
|
-
description:
|
|
201
|
-
"List actions exposed by the wire. Optional `module` filter (e.g. \"submissions\").",
|
|
219
|
+
description: 'List actions exposed by the wire. Optional `module` filter (e.g. "submissions").',
|
|
202
220
|
inputSchema: {
|
|
203
221
|
type: "object",
|
|
204
222
|
additionalProperties: false,
|
|
@@ -214,8 +232,7 @@ export const inspectTools: readonly InspectToolDef[] = [
|
|
|
214
232
|
},
|
|
215
233
|
{
|
|
216
234
|
name: "list_events",
|
|
217
|
-
description:
|
|
218
|
-
"List events declared by the wire. Optional `module` filter.",
|
|
235
|
+
description: "List events declared by the wire. Optional `module` filter.",
|
|
219
236
|
inputSchema: {
|
|
220
237
|
type: "object",
|
|
221
238
|
additionalProperties: false,
|
|
@@ -250,16 +267,14 @@ export const inspectTools: readonly InspectToolDef[] = [
|
|
|
250
267
|
{
|
|
251
268
|
name: "list_plugins",
|
|
252
269
|
description:
|
|
253
|
-
|
|
270
|
+
'List discovered plugins (reads .nwire/plugins.json). Optional `kind` filter: "plugin" | "module".',
|
|
254
271
|
inputSchema: {
|
|
255
272
|
type: "object",
|
|
256
273
|
additionalProperties: false,
|
|
257
274
|
properties: { kind: { type: "string", enum: ["plugin", "module"] } },
|
|
258
275
|
},
|
|
259
276
|
async run(args) {
|
|
260
|
-
let plugins = readDiskCache("plugins.json") as
|
|
261
|
-
| Array<{ kind?: string }>
|
|
262
|
-
| undefined;
|
|
277
|
+
let plugins = readDiskCache("plugins.json") as Array<{ kind?: string }> | undefined;
|
|
263
278
|
if (!plugins) {
|
|
264
279
|
try {
|
|
265
280
|
const manifest = await getManifest();
|
|
@@ -276,8 +291,7 @@ export const inspectTools: readonly InspectToolDef[] = [
|
|
|
276
291
|
},
|
|
277
292
|
{
|
|
278
293
|
name: "recent_events",
|
|
279
|
-
description:
|
|
280
|
-
"GET /_nwire/events/recent?limit=N from the running wire. Requires a live wire.",
|
|
294
|
+
description: "GET /_nwire/events/recent?limit=N from the running wire. Requires a live wire.",
|
|
281
295
|
inputSchema: {
|
|
282
296
|
type: "object",
|
|
283
297
|
additionalProperties: false,
|
package/src/write-tools.ts
CHANGED
|
@@ -29,7 +29,7 @@ import { discoverInspectUrl, type InspectToolDef } from "./inspect.js";
|
|
|
29
29
|
|
|
30
30
|
interface HttpResult {
|
|
31
31
|
readonly status: number;
|
|
32
|
-
readonly body:
|
|
32
|
+
readonly body: unknown;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
/**
|
|
@@ -39,24 +39,26 @@ interface HttpResult {
|
|
|
39
39
|
*/
|
|
40
40
|
async function httpPostJson(url: string, payload: unknown): Promise<HttpResult> {
|
|
41
41
|
return new Promise((resolvePost, rejectPost) => {
|
|
42
|
-
const u
|
|
42
|
+
const u = new URL(url);
|
|
43
43
|
const data = JSON.stringify(payload ?? {});
|
|
44
44
|
const req = httpRequest(
|
|
45
45
|
{
|
|
46
|
-
host:
|
|
47
|
-
port:
|
|
48
|
-
path:
|
|
49
|
-
method:
|
|
46
|
+
host: u.hostname,
|
|
47
|
+
port: u.port || 80,
|
|
48
|
+
path: u.pathname + u.search,
|
|
49
|
+
method: "POST",
|
|
50
50
|
headers: {
|
|
51
|
-
"Content-Type":
|
|
51
|
+
"Content-Type": "application/json",
|
|
52
52
|
"Content-Length": Buffer.byteLength(data).toString(),
|
|
53
53
|
},
|
|
54
54
|
},
|
|
55
55
|
(res) => {
|
|
56
56
|
let buf = "";
|
|
57
57
|
res.setEncoding("utf8");
|
|
58
|
-
res.on("data", (c: string) => {
|
|
59
|
-
|
|
58
|
+
res.on("data", (c: string) => {
|
|
59
|
+
buf += c;
|
|
60
|
+
});
|
|
61
|
+
res.on("end", () => {
|
|
60
62
|
const status = res.statusCode ?? 0;
|
|
61
63
|
if (buf.length === 0) return resolvePost({ status, body: undefined });
|
|
62
64
|
try {
|
|
@@ -80,7 +82,8 @@ async function httpPostJson(url: string, payload: unknown): Promise<HttpResult>
|
|
|
80
82
|
|
|
81
83
|
// ─── Tools ─────────────────────────────────────────────────────────
|
|
82
84
|
|
|
83
|
-
const NO_WIRE =
|
|
85
|
+
const NO_WIRE =
|
|
86
|
+
"no running wire detected; this tool requires a live wire (set NWIRE_INSPECT_URL or start one).";
|
|
84
87
|
|
|
85
88
|
/**
|
|
86
89
|
* Invoke a registered action via `POST /_nwire/dispatch`. Returns the
|
|
@@ -99,12 +102,12 @@ const dispatchAction: InspectToolDef = {
|
|
|
99
102
|
required: ["action"],
|
|
100
103
|
properties: {
|
|
101
104
|
action: { type: "string" },
|
|
102
|
-
input:
|
|
103
|
-
user:
|
|
105
|
+
input: { type: "object", additionalProperties: true },
|
|
106
|
+
user: {
|
|
104
107
|
type: "object",
|
|
105
108
|
additionalProperties: false,
|
|
106
109
|
properties: {
|
|
107
|
-
id:
|
|
110
|
+
id: { type: "string" },
|
|
108
111
|
roles: { type: "array", items: { type: "string" } },
|
|
109
112
|
},
|
|
110
113
|
},
|
|
@@ -116,13 +119,13 @@ const dispatchAction: InspectToolDef = {
|
|
|
116
119
|
if (!url) throw new Error(NO_WIRE);
|
|
117
120
|
const action = args.action as string | undefined;
|
|
118
121
|
if (!action) throw new Error("dispatch_action requires `action`");
|
|
119
|
-
const user
|
|
122
|
+
const user = args.user as { id?: string; roles?: string[] } | undefined;
|
|
120
123
|
const tenant = args.tenant as string | undefined;
|
|
121
124
|
const payload = {
|
|
122
125
|
action,
|
|
123
|
-
input:
|
|
126
|
+
input: args.input ?? {},
|
|
124
127
|
...(user?.id !== undefined && { userId: user.id }),
|
|
125
|
-
...(tenant
|
|
128
|
+
...(tenant !== undefined && { tenant }),
|
|
126
129
|
};
|
|
127
130
|
const { status, body } = await httpPostJson(`${url}/_nwire/dispatch`, payload);
|
|
128
131
|
if (status >= 400) {
|
|
@@ -227,11 +230,7 @@ const replayTrace: InspectToolDef = {
|
|
|
227
230
|
},
|
|
228
231
|
};
|
|
229
232
|
|
|
230
|
-
export const writeTools: readonly InspectToolDef[] = [
|
|
231
|
-
dispatchAction,
|
|
232
|
-
runCommand,
|
|
233
|
-
replayTrace,
|
|
234
|
-
];
|
|
233
|
+
export const writeTools: readonly InspectToolDef[] = [dispatchAction, runCommand, replayTrace];
|
|
235
234
|
|
|
236
235
|
export function findWriteTool(name: string): InspectToolDef | undefined {
|
|
237
236
|
return writeTools.find((t) => t.name === name);
|