@openweave/weave-link 0.2.0 → 0.4.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.
Files changed (45) hide show
  1. package/dist/auth.d.ts +59 -0
  2. package/dist/auth.d.ts.map +1 -0
  3. package/dist/auth.js +130 -0
  4. package/dist/auth.js.map +1 -0
  5. package/dist/cli.d.ts +22 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +247 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/http-transport.d.ts +65 -0
  10. package/dist/http-transport.d.ts.map +1 -0
  11. package/dist/http-transport.js +265 -0
  12. package/dist/http-transport.js.map +1 -0
  13. package/dist/index.d.ts +14 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +45 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/installer/claude-desktop.d.ts +49 -0
  18. package/dist/installer/claude-desktop.d.ts.map +1 -0
  19. package/dist/installer/claude-desktop.js +169 -0
  20. package/dist/installer/claude-desktop.js.map +1 -0
  21. package/dist/installer/config-generator.d.ts +47 -0
  22. package/dist/installer/config-generator.d.ts.map +1 -0
  23. package/dist/installer/config-generator.js +90 -0
  24. package/dist/installer/config-generator.js.map +1 -0
  25. package/dist/installer/cursor.d.ts +52 -0
  26. package/dist/installer/cursor.d.ts.map +1 -0
  27. package/dist/installer/cursor.js +165 -0
  28. package/dist/installer/cursor.js.map +1 -0
  29. package/dist/installer/index.d.ts +11 -0
  30. package/dist/installer/index.d.ts.map +1 -0
  31. package/dist/installer/index.js +14 -0
  32. package/dist/installer/index.js.map +1 -0
  33. package/dist/mcp-server.d.ts +75 -0
  34. package/dist/mcp-server.d.ts.map +1 -0
  35. package/dist/mcp-server.js +364 -0
  36. package/dist/mcp-server.js.map +1 -0
  37. package/dist/tools.d.ts +42 -0
  38. package/dist/tools.d.ts.map +1 -0
  39. package/dist/tools.js +230 -0
  40. package/dist/tools.js.map +1 -0
  41. package/dist/types.d.ts +86 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +6 -0
  44. package/dist/types.js.map +1 -0
  45. package/package.json +2 -3
package/dist/auth.d.ts ADDED
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Auth Middleware — M9: Remote WeaveLink
3
+ *
4
+ * Validates API keys for incoming HTTP requests.
5
+ * Supports two header formats:
6
+ * - `Authorization: Bearer <key>`
7
+ * - `X-API-Key: <key>`
8
+ *
9
+ * When `disabled`, all requests pass through (useful for local stdio use).
10
+ */
11
+ import type { IncomingMessage, ServerResponse } from 'node:http';
12
+ export interface AuthConfig {
13
+ /** Set to false to disable auth (local-only mode). Default: true */
14
+ enabled: boolean;
15
+ /** Allowed API keys. At least one required when enabled. */
16
+ apiKeys: string[];
17
+ }
18
+ export interface AuthResult {
19
+ ok: boolean;
20
+ reason?: string;
21
+ }
22
+ export declare class AuthManager {
23
+ private config;
24
+ constructor(config?: Partial<AuthConfig>);
25
+ /**
26
+ * Validate an incoming request's API key.
27
+ */
28
+ verifyRequest(req: IncomingMessage): AuthResult;
29
+ /**
30
+ * Middleware helper: reject the request with 401 if auth fails,
31
+ * then call `next()` if it passes.
32
+ */
33
+ middleware(req: IncomingMessage, res: ServerResponse, next: () => void): void;
34
+ /**
35
+ * Add an API key at runtime.
36
+ */
37
+ addKey(key: string): void;
38
+ /**
39
+ * Remove an API key.
40
+ */
41
+ removeKey(key: string): void;
42
+ /**
43
+ * Disable auth (e.g., for local stdio mode).
44
+ */
45
+ disable(): void;
46
+ /**
47
+ * Enable auth.
48
+ */
49
+ enable(): void;
50
+ isEnabled(): boolean;
51
+ getKeyCount(): number;
52
+ private extractKey;
53
+ }
54
+ /**
55
+ * Generate a secure random API key using rejection sampling to avoid modulo bias.
56
+ * (VULN-013: previous implementation had ~3% bias for the first 8 characters)
57
+ */
58
+ export declare function generateApiKey(length?: number): string;
59
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,MAAM,WAAW,UAAU;IACzB,oEAAoE;IACpE,OAAO,EAAE,OAAO,CAAC;IACjB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC;IAOxC;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,eAAe,GAAG,UAAU;IAwB/C;;;OAGG;IACH,UAAU,CACR,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,IAAI,GACf,IAAI;IAUP;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMzB;;OAEG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI5B;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,MAAM,IAAI,IAAI;IAId,SAAS,IAAI,OAAO;IAIpB,WAAW,IAAI,MAAM;IAMrB,OAAO,CAAC,UAAU;CAenB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,SAAK,GAAG,MAAM,CAelD"}
package/dist/auth.js ADDED
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ /**
3
+ * Auth Middleware — M9: Remote WeaveLink
4
+ *
5
+ * Validates API keys for incoming HTTP requests.
6
+ * Supports two header formats:
7
+ * - `Authorization: Bearer <key>`
8
+ * - `X-API-Key: <key>`
9
+ *
10
+ * When `disabled`, all requests pass through (useful for local stdio use).
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AuthManager = void 0;
14
+ exports.generateApiKey = generateApiKey;
15
+ // ──────────────────────────────────────────────────────────
16
+ // AuthManager
17
+ // ──────────────────────────────────────────────────────────
18
+ class AuthManager {
19
+ config;
20
+ constructor(config) {
21
+ this.config = {
22
+ enabled: config?.enabled ?? true,
23
+ apiKeys: config?.apiKeys ?? [],
24
+ };
25
+ }
26
+ /**
27
+ * Validate an incoming request's API key.
28
+ */
29
+ verifyRequest(req) {
30
+ if (!this.config.enabled) {
31
+ return { ok: true };
32
+ }
33
+ if (this.config.apiKeys.length === 0) {
34
+ return { ok: false, reason: 'Server has no API keys configured' };
35
+ }
36
+ const key = this.extractKey(req);
37
+ if (!key) {
38
+ return {
39
+ ok: false,
40
+ reason: 'Missing API key — use Authorization: Bearer <key> or X-API-Key: <key>',
41
+ };
42
+ }
43
+ if (!this.config.apiKeys.includes(key)) {
44
+ return { ok: false, reason: 'Invalid API key' };
45
+ }
46
+ return { ok: true };
47
+ }
48
+ /**
49
+ * Middleware helper: reject the request with 401 if auth fails,
50
+ * then call `next()` if it passes.
51
+ */
52
+ middleware(req, res, next) {
53
+ const result = this.verifyRequest(req);
54
+ if (result.ok) {
55
+ next();
56
+ }
57
+ else {
58
+ res.writeHead(401, { 'Content-Type': 'application/json' });
59
+ res.end(JSON.stringify({ error: result.reason }));
60
+ }
61
+ }
62
+ /**
63
+ * Add an API key at runtime.
64
+ */
65
+ addKey(key) {
66
+ if (!this.config.apiKeys.includes(key)) {
67
+ this.config.apiKeys.push(key);
68
+ }
69
+ }
70
+ /**
71
+ * Remove an API key.
72
+ */
73
+ removeKey(key) {
74
+ this.config.apiKeys = this.config.apiKeys.filter(k => k !== key);
75
+ }
76
+ /**
77
+ * Disable auth (e.g., for local stdio mode).
78
+ */
79
+ disable() {
80
+ this.config.enabled = false;
81
+ }
82
+ /**
83
+ * Enable auth.
84
+ */
85
+ enable() {
86
+ this.config.enabled = true;
87
+ }
88
+ isEnabled() {
89
+ return this.config.enabled;
90
+ }
91
+ getKeyCount() {
92
+ return this.config.apiKeys.length;
93
+ }
94
+ // ── private ──────────────────────────────────────────────
95
+ extractKey(req) {
96
+ // Authorization: Bearer <key>
97
+ const authHeader = req.headers['authorization'];
98
+ if (authHeader?.startsWith('Bearer ')) {
99
+ return authHeader.slice(7).trim() || null;
100
+ }
101
+ // X-API-Key: <key>
102
+ const apiKeyHeader = req.headers['x-api-key'];
103
+ if (typeof apiKeyHeader === 'string' && apiKeyHeader.trim()) {
104
+ return apiKeyHeader.trim();
105
+ }
106
+ return null;
107
+ }
108
+ }
109
+ exports.AuthManager = AuthManager;
110
+ /**
111
+ * Generate a secure random API key using rejection sampling to avoid modulo bias.
112
+ * (VULN-013: previous implementation had ~3% bias for the first 8 characters)
113
+ */
114
+ function generateApiKey(length = 32) {
115
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
116
+ // 256 - (256 % 62) = 248 — the largest multiple of 62 that fits in a byte
117
+ const maxUnbiased = 256 - (256 % chars.length);
118
+ let result = '';
119
+ while (result.length < length) {
120
+ const bytes = new Uint8Array(length * 2);
121
+ crypto.getRandomValues(bytes);
122
+ for (const b of bytes) {
123
+ if (b < maxUnbiased && result.length < length) {
124
+ result += chars[b % chars.length];
125
+ }
126
+ }
127
+ }
128
+ return result;
129
+ }
130
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAwIH,wCAeC;AAvID,6DAA6D;AAC7D,cAAc;AACd,6DAA6D;AAE7D,MAAa,WAAW;IACd,MAAM,CAAa;IAE3B,YAAY,MAA4B;QACtC,IAAI,CAAC,MAAM,GAAG;YACZ,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,IAAI;YAChC,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE;SAC/B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,GAAoB;QAChC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mCAAmC,EAAE,CAAC;QACpE,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,uEAAuE;aAChF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAClD,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,UAAU,CACR,GAAoB,EACpB,GAAmB,EACnB,IAAgB;QAEhB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,IAAI,EAAE,CAAC;QACT,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAW;QAChB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,GAAW;QACnB,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7B,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;IACpC,CAAC;IAED,4DAA4D;IAEpD,UAAU,CAAC,GAAoB;QACrC,8BAA8B;QAC9B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAChD,IAAI,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;QAC5C,CAAC;QAED,mBAAmB;QACnB,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC9C,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5D,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AA9GD,kCA8GC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,MAAM,GAAG,EAAE;IACxC,MAAM,KAAK,GAAG,gEAAgE,CAAC;IAC/E,0EAA0E;IAC1E,MAAM,WAAW,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,OAAO,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,WAAW,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;gBAC9C,MAAM,IAAI,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * WeaveLink CLI — M8/M9: Server + Installer Entry Point
4
+ *
5
+ * Commands:
6
+ * weave-link start [options] Start the HTTP or stdio server
7
+ * weave-link install claude Install into Claude Desktop
8
+ * weave-link install cursor Install into Cursor (global or project scope)
9
+ * weave-link uninstall claude Remove from Claude Desktop
10
+ * weave-link uninstall cursor Remove from Cursor
11
+ * weave-link status Show server info / config paths
12
+ * weave-link keygen Generate a new random API key
13
+ *
14
+ * Options (for `start`):
15
+ * --port <n> Port to listen on (default: 3001)
16
+ * --host <h> Host to bind to (default: 127.0.0.1)
17
+ * --mode stdio|http Transport mode (default: http)
18
+ * --no-auth Disable API key auth
19
+ * --verbose Enable verbose logging
20
+ */
21
+ export {};
22
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;GAkBG"}
package/dist/cli.js ADDED
@@ -0,0 +1,247 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * WeaveLink CLI — M8/M9: Server + Installer Entry Point
5
+ *
6
+ * Commands:
7
+ * weave-link start [options] Start the HTTP or stdio server
8
+ * weave-link install claude Install into Claude Desktop
9
+ * weave-link install cursor Install into Cursor (global or project scope)
10
+ * weave-link uninstall claude Remove from Claude Desktop
11
+ * weave-link uninstall cursor Remove from Cursor
12
+ * weave-link status Show server info / config paths
13
+ * weave-link keygen Generate a new random API key
14
+ *
15
+ * Options (for `start`):
16
+ * --port <n> Port to listen on (default: 3001)
17
+ * --host <h> Host to bind to (default: 127.0.0.1)
18
+ * --mode stdio|http Transport mode (default: http)
19
+ * --no-auth Disable API key auth
20
+ * --verbose Enable verbose logging
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ const mcp_server_1 = require("./mcp-server");
24
+ const auth_1 = require("./auth");
25
+ const http_transport_1 = require("./http-transport");
26
+ const claude_desktop_1 = require("./installer/claude-desktop");
27
+ const cursor_1 = require("./installer/cursor");
28
+ // ──────────────────────────────────────────────────────────
29
+ // Arg parser (zero dependencies — no yargs/commander)
30
+ // ──────────────────────────────────────────────────────────
31
+ function parseArgs(argv) {
32
+ const args = {};
33
+ const positional = [];
34
+ for (let i = 0; i < argv.length; i++) {
35
+ const arg = argv[i];
36
+ if (arg.startsWith('--')) {
37
+ const key = arg.slice(2);
38
+ const next = argv[i + 1];
39
+ if (next && !next.startsWith('--')) {
40
+ args[key] = next;
41
+ i++;
42
+ }
43
+ else {
44
+ args[key] = true;
45
+ }
46
+ }
47
+ else {
48
+ positional.push(arg);
49
+ if (positional.length === 1)
50
+ args['command'] = arg;
51
+ if (positional.length === 2)
52
+ args['subcommand'] = arg;
53
+ }
54
+ }
55
+ return args;
56
+ }
57
+ // ──────────────────────────────────────────────────────────
58
+ // Commands
59
+ // ──────────────────────────────────────────────────────────
60
+ async function cmdStart(args) {
61
+ const mode = args['mode'] ?? 'http';
62
+ const port = parseInt(args['port'] ?? '3001', 10);
63
+ const host = args['host'] ?? '127.0.0.1';
64
+ const noAuth = args['no-auth'] === true;
65
+ const verbose = args['verbose'] === true;
66
+ const apiKey = process.env['WEAVE_API_KEY'] || args['api-key'];
67
+ const auth = new auth_1.AuthManager({
68
+ enabled: !noAuth && Boolean(apiKey),
69
+ apiKeys: apiKey ? [apiKey] : [],
70
+ });
71
+ const server = new mcp_server_1.WeaveLinkServer();
72
+ if (mode === 'stdio') {
73
+ // stdio mode: accept JSON-RPC on stdin, write to stdout
74
+ await server.initialize();
75
+ console.error(`[WeaveLink] stdio mode ready. Auth: ${auth.isEnabled() ? 'enabled' : 'disabled'}`);
76
+ process.stdin.setEncoding('utf-8');
77
+ process.stdin.on('data', async (chunk) => {
78
+ try {
79
+ const msg = JSON.parse(chunk.trim());
80
+ const result = await server.callTool(msg.tool ?? msg.method, msg.args ?? msg.params ?? {});
81
+ process.stdout.write(JSON.stringify(result) + '\n');
82
+ }
83
+ catch (err) {
84
+ process.stdout.write(JSON.stringify({ error: err.message }) + '\n');
85
+ }
86
+ });
87
+ return;
88
+ }
89
+ // HTTP mode
90
+ const transport = new http_transport_1.HttpTransport(server, auth, { port, host, cors: true, verbose: true });
91
+ await transport.start();
92
+ console.log(`[WeaveLink] HTTP server started`);
93
+ console.log(` URL : http://${host}:${port}`);
94
+ console.log(` Auth : ${auth.isEnabled() ? `enabled (${auth.getKeyCount()} key(s))` : 'disabled'}`);
95
+ console.log(` Tools : ${server.listTools().length} tools registered`);
96
+ if (!auth.isEnabled() && !noAuth) {
97
+ console.warn(`\n ⚠ No WEAVE_API_KEY set. Running without authentication.\n Set --api-key <key> or WEAVE_API_KEY env var to enable auth.\n`);
98
+ }
99
+ if (verbose) {
100
+ console.log(`\n Endpoints:`);
101
+ console.log(` GET http://${host}:${port}/ → server info`);
102
+ console.log(` GET http://${host}:${port}/health → liveness check`);
103
+ console.log(` GET http://${host}:${port}/tools → list tools`);
104
+ console.log(` POST http://${host}:${port}/tools/call → invoke tool`);
105
+ console.log(` GET http://${host}:${port}/events → SSE stream\n`);
106
+ }
107
+ // Graceful shutdown
108
+ process.on('SIGINT', async () => {
109
+ console.log('\n[WeaveLink] Shutting down…');
110
+ await transport.stop();
111
+ process.exit(0);
112
+ });
113
+ }
114
+ async function cmdInstall(subcommand, args) {
115
+ const mode = args['mode'] ?? 'stdio';
116
+ const port = args['port'] ? parseInt(args['port'], 10) : undefined;
117
+ const apiKey = args['api-key'] || process.env['WEAVE_API_KEY'];
118
+ const wlConfig = { port, apiKey };
119
+ if (subcommand === 'claude') {
120
+ const result = await claude_desktop_1.ClaudeDesktopInstaller.install(wlConfig, mode);
121
+ console.log(result.success ? `✅ ${result.message}` : `❌ ${result.message}`);
122
+ console.log(` Config: ${result.configPath}`);
123
+ }
124
+ else if (subcommand === 'cursor') {
125
+ const scope = args['global'] ? 'global' : args['project'] ? 'project' : 'global';
126
+ const workspaceRoot = scope === 'project' ? process.cwd() : undefined;
127
+ const result = await cursor_1.CursorInstaller.install(scope, workspaceRoot, wlConfig, mode);
128
+ console.log(result.success ? `✅ ${result.message}` : `❌ ${result.message}`);
129
+ console.log(` Config: ${result.configPath}`);
130
+ }
131
+ else {
132
+ console.error(`Unknown install target: ${subcommand}`);
133
+ console.error('Available targets: claude, cursor');
134
+ process.exit(1);
135
+ }
136
+ }
137
+ async function cmdUninstall(subcommand, args) {
138
+ if (subcommand === 'claude') {
139
+ const result = await claude_desktop_1.ClaudeDesktopInstaller.uninstall();
140
+ console.log(result.success ? `✅ ${result.message}` : `❌ ${result.message}`);
141
+ console.log(` Config: ${result.configPath}`);
142
+ }
143
+ else if (subcommand === 'cursor') {
144
+ const scope = args['global'] ? 'global' : args['project'] ? 'project' : 'global';
145
+ const result = await cursor_1.CursorInstaller.uninstall(scope);
146
+ console.log(result.success ? `✅ ${result.message}` : `❌ ${result.message}`);
147
+ console.log(` Config: ${result.configPath}`);
148
+ }
149
+ else {
150
+ console.error(`Unknown uninstall target: ${subcommand}`);
151
+ process.exit(1);
152
+ }
153
+ }
154
+ function cmdStatus() {
155
+ console.log('WeaveLink Server Info');
156
+ console.log('─────────────────────');
157
+ const server = new mcp_server_1.WeaveLinkServer();
158
+ const info = server.getServerInfo();
159
+ console.log(`Name : ${info.name}`);
160
+ console.log(`Version: ${info.version}`);
161
+ console.log(`Tools : ${info.tools.length}`);
162
+ info.tools.forEach(t => console.log(` - ${t.name}: ${t.description}`));
163
+ console.log('\nConfig Paths:');
164
+ console.log(` Claude Desktop: ${claude_desktop_1.ClaudeDesktopInstaller.getConfigPath()}`);
165
+ console.log(` Cursor (global): ${cursor_1.CursorInstaller.getConfigPath('global')}`);
166
+ console.log(` Cursor (project): ${cursor_1.CursorInstaller.getConfigPath('project', process.cwd())}`);
167
+ }
168
+ function cmdKeygen() {
169
+ const key = (0, auth_1.generateApiKey)();
170
+ console.log(`Generated API key:\n\n ${key}\n\nSet it via: WEAVE_API_KEY=${key}`);
171
+ }
172
+ function cmdHelp() {
173
+ console.log(`
174
+ WeaveLink — OpenWeave MCP Server
175
+
176
+ USAGE
177
+ weave-link <command> [options]
178
+
179
+ COMMANDS
180
+ start Start the WeaveLink server
181
+ install <target> Install WeaveLink into an AI client (claude, cursor)
182
+ uninstall <target> Remove WeaveLink from an AI client
183
+ status Show server info and config paths
184
+ keygen Generate a new random API key
185
+ help Show this help message
186
+
187
+ START OPTIONS
188
+ --mode <stdio|http> Transport mode (default: http)
189
+ --port <port> Port to listen on (default: 3001)
190
+ --host <host> Host to bind to (default: 127.0.0.1)
191
+ --api-key <key> API key (or use WEAVE_API_KEY env var)
192
+ --no-auth Disable API key authentication
193
+ --verbose Enable verbose output
194
+
195
+ INSTALL OPTIONS
196
+ --mode <stdio|http> Config mode to generate (default: stdio)
197
+ --port <port> Port (for http mode)
198
+ --global Install at global scope (Cursor)
199
+ --project Install at project scope (Cursor)
200
+
201
+ EXAMPLES
202
+ weave-link start --port 3001 --api-key mykey
203
+ weave-link start --mode stdio --no-auth
204
+ weave-link install claude
205
+ weave-link install cursor --project
206
+ WEAVE_API_KEY=mykey weave-link start
207
+ `);
208
+ }
209
+ // ──────────────────────────────────────────────────────────
210
+ // Entry point
211
+ // ──────────────────────────────────────────────────────────
212
+ async function main() {
213
+ const args = parseArgs(process.argv.slice(2));
214
+ const command = args['command'];
215
+ const subcommand = args['subcommand'];
216
+ switch (command) {
217
+ case 'start':
218
+ await cmdStart(args);
219
+ break;
220
+ case 'install':
221
+ await cmdInstall(subcommand, args);
222
+ break;
223
+ case 'uninstall':
224
+ await cmdUninstall(subcommand, args);
225
+ break;
226
+ case 'status':
227
+ cmdStatus();
228
+ break;
229
+ case 'keygen':
230
+ cmdKeygen();
231
+ break;
232
+ case 'help':
233
+ case '--help':
234
+ case undefined:
235
+ cmdHelp();
236
+ break;
237
+ default:
238
+ console.error(`Unknown command: ${command}`);
239
+ cmdHelp();
240
+ process.exit(1);
241
+ }
242
+ }
243
+ main().catch((err) => {
244
+ console.error('[WeaveLink] Fatal error:', err);
245
+ process.exit(1);
246
+ });
247
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * HTTP Transport — M9: Remote WeaveLink
3
+ *
4
+ * Provides an HTTP server with JSON-RPC-style endpoints and
5
+ * optional Server-Sent Events (SSE) for push notifications.
6
+ *
7
+ * Endpoints:
8
+ * GET / → server info (no auth)
9
+ * GET /health → liveness check (no auth)
10
+ * GET /tools → list available tools (auth optional)
11
+ * POST /tools/call → invoke a tool (auth required)
12
+ * GET /events → SSE stream (auth required)
13
+ *
14
+ * Zero runtime dependencies — uses Node built-ins only.
15
+ */
16
+ import { WeaveLinkServer } from './mcp-server';
17
+ import { AuthManager } from './auth';
18
+ export interface HttpTransportConfig {
19
+ port?: number;
20
+ host?: string;
21
+ /**
22
+ * If true, sets CORS headers allowing any origin.
23
+ * Useful for local dashboard / VS Code webviews.
24
+ */
25
+ cors?: boolean;
26
+ /** Printed to stdout on startup. */
27
+ verbose?: boolean;
28
+ }
29
+ export declare class HttpTransport {
30
+ private server;
31
+ private weaveLinkServer;
32
+ private auth;
33
+ private config;
34
+ private sseClients;
35
+ private startTime;
36
+ constructor(weaveLinkServer?: WeaveLinkServer, auth?: AuthManager, config?: HttpTransportConfig);
37
+ /**
38
+ * Start listening on the configured port.
39
+ */
40
+ start(): Promise<void>;
41
+ /**
42
+ * Stop the server and disconnect all SSE clients.
43
+ */
44
+ stop(): Promise<void>;
45
+ isRunning(): boolean;
46
+ getPort(): number;
47
+ getConnectedClients(): number;
48
+ private dispatch;
49
+ private handleInfo;
50
+ private handleHealth;
51
+ private handleListTools;
52
+ private handleCallTool;
53
+ private handleSSE;
54
+ private sendSSE;
55
+ /**
56
+ * Broadcast a message to all connected SSE clients.
57
+ */
58
+ broadcast(message: {
59
+ event: string;
60
+ data: unknown;
61
+ }): void;
62
+ private readBody;
63
+ private json;
64
+ }
65
+ //# sourceMappingURL=http-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-transport.d.ts","sourceRoot":"","sources":["../src/http-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAErC,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oCAAoC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAiBD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,SAAS,CAAqB;gBAGpC,eAAe,CAAC,EAAE,eAAe,EACjC,IAAI,CAAC,EAAE,WAAW,EAClB,MAAM,CAAC,EAAE,mBAAmB;IAgB9B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB3B,SAAS,IAAI,OAAO;IAIpB,OAAO,IAAI,MAAM;IAIjB,mBAAmB,IAAI,MAAM;IAM7B,OAAO,CAAC,QAAQ;IAyChB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,cAAc;IAsCtB,OAAO,CAAC,SAAS;IA8BjB,OAAO,CAAC,OAAO;IAKf;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAsB1D,OAAO,CAAC,QAAQ;IAoBhB,OAAO,CAAC,IAAI;CAQb"}