@toon-protocol/client-mcp 0.26.2

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 (40) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +261 -0
  3. package/dist/anon-proxy-6N362VEV-M7AX2QD7.js +24 -0
  4. package/dist/anon-proxy-6N362VEV-M7AX2QD7.js.map +1 -0
  5. package/dist/chunk-245J23EB.js +278 -0
  6. package/dist/chunk-245J23EB.js.map +1 -0
  7. package/dist/chunk-2SGZPDGE.js +625 -0
  8. package/dist/chunk-2SGZPDGE.js.map +1 -0
  9. package/dist/chunk-32QD72IL.js +83 -0
  10. package/dist/chunk-32QD72IL.js.map +1 -0
  11. package/dist/chunk-5YIZ2JQO.js +205 -0
  12. package/dist/chunk-5YIZ2JQO.js.map +1 -0
  13. package/dist/chunk-LR7W2ISE.js +657 -0
  14. package/dist/chunk-LR7W2ISE.js.map +1 -0
  15. package/dist/chunk-QTDCFXPF.js +2802 -0
  16. package/dist/chunk-QTDCFXPF.js.map +1 -0
  17. package/dist/chunk-VA7XC4FD.js +185 -0
  18. package/dist/chunk-VA7XC4FD.js.map +1 -0
  19. package/dist/chunk-WMYY5I3H.js +10818 -0
  20. package/dist/chunk-WMYY5I3H.js.map +1 -0
  21. package/dist/daemon.d.ts +1 -0
  22. package/dist/daemon.js +137 -0
  23. package/dist/daemon.js.map +1 -0
  24. package/dist/ed25519-OFFWPWRE.js +26 -0
  25. package/dist/ed25519-OFFWPWRE.js.map +1 -0
  26. package/dist/gateway-QOK47RKS-HB65KIKC.js +15 -0
  27. package/dist/gateway-QOK47RKS-HB65KIKC.js.map +1 -0
  28. package/dist/hmac-7WSXTWW4.js +11 -0
  29. package/dist/hmac-7WSXTWW4.js.map +1 -0
  30. package/dist/index.d.ts +642 -0
  31. package/dist/index.js +59 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/mcp.d.ts +1 -0
  34. package/dist/mcp.js +80 -0
  35. package/dist/mcp.js.map +1 -0
  36. package/dist/sha512-LMOIUNFJ.js +33 -0
  37. package/dist/sha512-LMOIUNFJ.js.map +1 -0
  38. package/dist/socks5-WTJBYGME-IXWLQDE7.js +138 -0
  39. package/dist/socks5-WTJBYGME-IXWLQDE7.js.map +1 -0
  40. package/package.json +59 -0
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
package/dist/daemon.js ADDED
@@ -0,0 +1,137 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __cr } from 'module'; const require = __cr(import.meta.url);
3
+ import {
4
+ ClientRunner,
5
+ registerRoutes
6
+ } from "./chunk-2SGZPDGE.js";
7
+ import {
8
+ ControlClient,
9
+ ToonClient,
10
+ acquireLock,
11
+ defaultConfigPath,
12
+ isProcessAlive,
13
+ readConfigFile,
14
+ readPid,
15
+ releaseLock,
16
+ resolveConfig,
17
+ spawnDaemonDetached,
18
+ waitForReady
19
+ } from "./chunk-WMYY5I3H.js";
20
+ import "./chunk-32QD72IL.js";
21
+ import "./chunk-QTDCFXPF.js";
22
+ import "./chunk-LR7W2ISE.js";
23
+ import "./chunk-VA7XC4FD.js";
24
+ import "./chunk-245J23EB.js";
25
+
26
+ // src/daemon.ts
27
+ import Fastify from "fastify";
28
+ function baseUrl(config) {
29
+ return `http://127.0.0.1:${config.httpPort}`;
30
+ }
31
+ function loadResolvedConfig() {
32
+ const path = process.env["TOON_CLIENT_CONFIG"] ?? defaultConfigPath();
33
+ return resolveConfig(readConfigFile(path));
34
+ }
35
+ async function runForeground() {
36
+ acquireLock();
37
+ const config = loadResolvedConfig();
38
+ const log = (msg) => console.error(msg);
39
+ const runner = new ClientRunner({
40
+ config,
41
+ createClient: () => new ToonClient(config.toonClientConfig),
42
+ logger: log
43
+ });
44
+ const app = Fastify({ logger: false });
45
+ registerRoutes(app, runner);
46
+ runner.start();
47
+ await app.listen({ host: "127.0.0.1", port: config.httpPort });
48
+ log(`[toon-clientd] listening on ${baseUrl(config)}`);
49
+ let shuttingDown = false;
50
+ const shutdown = async (signal) => {
51
+ if (shuttingDown) return;
52
+ shuttingDown = true;
53
+ log(`[toon-clientd] received ${signal}, shutting down`);
54
+ try {
55
+ await app.close();
56
+ } catch {
57
+ }
58
+ await runner.stop();
59
+ releaseLock();
60
+ setTimeout(() => process.exit(0), 500).unref();
61
+ };
62
+ process.on("SIGTERM", () => void shutdown("SIGTERM"));
63
+ process.on("SIGINT", () => void shutdown("SIGINT"));
64
+ }
65
+ async function start() {
66
+ const config = loadResolvedConfig();
67
+ const url = baseUrl(config);
68
+ const existing = readPid();
69
+ if (existing !== null && isProcessAlive(existing)) {
70
+ console.log(`toon-clientd already running (pid ${existing}) at ${url}`);
71
+ return;
72
+ }
73
+ const pid = spawnDaemonDetached();
74
+ const ok = await waitForReady(url, 2e4);
75
+ if (ok) {
76
+ console.log(`toon-clientd started (pid ${pid}) at ${url}`);
77
+ } else {
78
+ console.error(
79
+ `toon-clientd spawned (pid ${pid}) but did not become reachable at ${url} in time. Check the daemon log.`
80
+ );
81
+ process.exitCode = 1;
82
+ }
83
+ }
84
+ async function stop() {
85
+ const pid = readPid();
86
+ if (pid === null || !isProcessAlive(pid)) {
87
+ console.log("toon-clientd is not running");
88
+ releaseLock();
89
+ return;
90
+ }
91
+ process.kill(pid, "SIGTERM");
92
+ for (let i = 0; i < 40; i++) {
93
+ if (!isProcessAlive(pid)) break;
94
+ await new Promise((r) => setTimeout(r, 100));
95
+ }
96
+ console.log(`toon-clientd stopped (pid ${pid})`);
97
+ }
98
+ async function status() {
99
+ const config = loadResolvedConfig();
100
+ const client = new ControlClient({ baseUrl: baseUrl(config) });
101
+ try {
102
+ const s = await client.status();
103
+ console.log(JSON.stringify(s, null, 2));
104
+ } catch {
105
+ console.log(JSON.stringify({ running: false }, null, 2));
106
+ process.exitCode = 1;
107
+ }
108
+ }
109
+ async function main() {
110
+ const cmd = process.argv[2] ?? "run";
111
+ switch (cmd) {
112
+ case "run":
113
+ await runForeground();
114
+ break;
115
+ case "start":
116
+ await start();
117
+ break;
118
+ case "stop":
119
+ await stop();
120
+ break;
121
+ case "status":
122
+ await status();
123
+ break;
124
+ default:
125
+ console.error(
126
+ `Unknown command "${cmd}". Usage: toon-clientd <run|start|stop|status>`
127
+ );
128
+ process.exitCode = 1;
129
+ }
130
+ }
131
+ main().catch((err) => {
132
+ console.error(
133
+ err instanceof Error ? err.stack ?? err.message : String(err)
134
+ );
135
+ process.exitCode = 1;
136
+ });
137
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/daemon.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * `toon-clientd` — the always-on, detached TOON client daemon. It owns the two\n * long-lived connections that cannot live in an ephemeral agent session:\n * • a BTP session to the apex/connector (paid writes), and\n * • a persistent town-relay Nostr-WS subscription (free reads),\n * plus the payment channels (with a persisted nonce watermark) and the signer.\n *\n * Subcommands:\n * toon-clientd run Run the daemon in the foreground (used internally by\n * the detached spawn; logs to stdout).\n * toon-clientd start Spawn the daemon detached and wait until reachable.\n * toon-clientd stop Stop a running daemon (SIGTERM the locked PID).\n * toon-clientd status Print the daemon status as JSON.\n */\n\nimport Fastify from 'fastify';\nimport { ToonClient } from '@toon-protocol/client';\nimport {\n defaultConfigPath,\n readConfigFile,\n resolveConfig,\n type ResolvedDaemonConfig,\n} from './daemon/config.js';\nimport { ClientRunner, type ToonClientLike } from './daemon/client-runner.js';\nimport { registerRoutes } from './daemon/routes.js';\nimport {\n acquireLock,\n isProcessAlive,\n readPid,\n releaseLock,\n spawnDaemonDetached,\n waitForReady,\n} from './daemon/lifecycle.js';\nimport { ControlClient } from './control-client.js';\n\nfunction baseUrl(config: ResolvedDaemonConfig): string {\n return `http://127.0.0.1:${config.httpPort}`;\n}\n\nfunction loadResolvedConfig(): ResolvedDaemonConfig {\n const path = process.env['TOON_CLIENT_CONFIG'] ?? defaultConfigPath();\n return resolveConfig(readConfigFile(path));\n}\n\n/** Run the daemon in the foreground (the detached child's actual work). */\nasync function runForeground(): Promise<void> {\n acquireLock();\n const config = loadResolvedConfig();\n const log = (msg: string): void => console.error(msg);\n\n const runner = new ClientRunner({\n config,\n createClient: () =>\n new ToonClient(config.toonClientConfig) as unknown as ToonClientLike,\n logger: log,\n });\n\n const app = Fastify({ logger: false });\n registerRoutes(app, runner);\n\n // Begin bootstrap (non-blocking) before listening so /status is immediately\n // reachable and reports `bootstrapping: true` while anon/BTP come up.\n runner.start();\n\n await app.listen({ host: '127.0.0.1', port: config.httpPort });\n log(`[toon-clientd] listening on ${baseUrl(config)}`);\n\n let shuttingDown = false;\n const shutdown = async (signal: string): Promise<void> => {\n if (shuttingDown) return;\n shuttingDown = true;\n log(`[toon-clientd] received ${signal}, shutting down`);\n try {\n await app.close();\n } catch {\n /* ignore */\n }\n await runner.stop();\n releaseLock();\n setTimeout(() => process.exit(0), 500).unref();\n };\n process.on('SIGTERM', () => void shutdown('SIGTERM'));\n process.on('SIGINT', () => void shutdown('SIGINT'));\n}\n\n/** Spawn the daemon detached and wait until the control plane responds. */\nasync function start(): Promise<void> {\n const config = loadResolvedConfig();\n const url = baseUrl(config);\n const existing = readPid();\n if (existing !== null && isProcessAlive(existing)) {\n console.log(`toon-clientd already running (pid ${existing}) at ${url}`);\n return;\n }\n const pid = spawnDaemonDetached();\n const ok = await waitForReady(url, 20_000);\n if (ok) {\n console.log(`toon-clientd started (pid ${pid}) at ${url}`);\n } else {\n console.error(\n `toon-clientd spawned (pid ${pid}) but did not become reachable at ${url} in time. ` +\n `Check the daemon log.`\n );\n process.exitCode = 1;\n }\n}\n\n/** Stop a running daemon via SIGTERM on the locked PID. */\nasync function stop(): Promise<void> {\n const pid = readPid();\n if (pid === null || !isProcessAlive(pid)) {\n console.log('toon-clientd is not running');\n releaseLock();\n return;\n }\n process.kill(pid, 'SIGTERM');\n // Wait briefly for the process to exit.\n for (let i = 0; i < 40; i++) {\n if (!isProcessAlive(pid)) break;\n await new Promise((r) => setTimeout(r, 100));\n }\n console.log(`toon-clientd stopped (pid ${pid})`);\n}\n\n/** Print the daemon status JSON. */\nasync function status(): Promise<void> {\n const config = loadResolvedConfig();\n const client = new ControlClient({ baseUrl: baseUrl(config) });\n try {\n const s = await client.status();\n console.log(JSON.stringify(s, null, 2));\n } catch {\n console.log(JSON.stringify({ running: false }, null, 2));\n process.exitCode = 1;\n }\n}\n\nasync function main(): Promise<void> {\n const cmd = process.argv[2] ?? 'run';\n switch (cmd) {\n case 'run':\n await runForeground();\n break;\n case 'start':\n await start();\n break;\n case 'stop':\n await stop();\n break;\n case 'status':\n await status();\n break;\n default:\n console.error(\n `Unknown command \"${cmd}\". Usage: toon-clientd <run|start|stop|status>`\n );\n process.exitCode = 1;\n }\n}\n\nmain().catch((err) => {\n console.error(\n err instanceof Error ? (err.stack ?? err.message) : String(err)\n );\n process.exitCode = 1;\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,26 @@
1
+ import { createRequire as __cr } from 'module'; const require = __cr(import.meta.url);
2
+ import {
3
+ ED25519_TORSION_SUBGROUP,
4
+ _map_to_curve_elligator2_curve25519,
5
+ ed25519,
6
+ ed25519_hasher,
7
+ ed25519ctx,
8
+ ed25519ph,
9
+ ristretto255,
10
+ ristretto255_hasher,
11
+ ristretto255_oprf,
12
+ x25519
13
+ } from "./chunk-QTDCFXPF.js";
14
+ export {
15
+ ED25519_TORSION_SUBGROUP,
16
+ _map_to_curve_elligator2_curve25519,
17
+ ed25519,
18
+ ed25519_hasher,
19
+ ed25519ctx,
20
+ ed25519ph,
21
+ ristretto255,
22
+ ristretto255_hasher,
23
+ ristretto255_oprf,
24
+ x25519
25
+ };
26
+ //# sourceMappingURL=ed25519-OFFWPWRE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,15 @@
1
+ import { createRequire as __cr } from 'module'; const require = __cr(import.meta.url);
2
+
3
+ // ../client/dist/gateway-QOK47RKS.js
4
+ function rewriteUrlsForGateway(gatewayUrl, btpUrl, connectorUrl) {
5
+ const base = gatewayUrl.replace(/\/$/, "");
6
+ const wsBase = base.replace(/^https:/, "wss:").replace(/^http:/, "ws:");
7
+ return {
8
+ btpUrl: btpUrl ? `${wsBase}/btp` : void 0,
9
+ connectorUrl: connectorUrl ? `${base}/api` : void 0
10
+ };
11
+ }
12
+ export {
13
+ rewriteUrlsForGateway
14
+ };
15
+ //# sourceMappingURL=gateway-QOK47RKS-HB65KIKC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../client/src/transport/gateway.ts"],"sourcesContent":["/**\n * Gateway transport for browser environments.\n *\n * Rewrites BTP and HTTP URLs to route through an ator gateway that handles\n * SOCKS5 proxying server-side. Browser clients connect to the gateway via\n * standard WebSocket/HTTP — no special transport code needed.\n */\n\n/**\n * Rewrites btpUrl and connectorUrl to route through a gateway.\n *\n * Gateway endpoint conventions:\n * - WebSocket: `ws(s)://<gateway>/btp` — proxies BTP connections\n * - HTTP: `http(s)://<gateway>/api` — proxies connector admin API\n *\n * @param gatewayUrl - Base URL of the ator gateway (http:// or https://)\n * @param btpUrl - Original BTP WebSocket URL (optional)\n * @param connectorUrl - Original connector HTTP URL (optional)\n */\nexport function rewriteUrlsForGateway(\n gatewayUrl: string,\n btpUrl?: string,\n connectorUrl?: string\n): { btpUrl?: string; connectorUrl?: string } {\n const base = gatewayUrl.replace(/\\/$/, '');\n\n // Derive WebSocket scheme from HTTP scheme\n const wsBase = base.replace(/^https:/, 'wss:').replace(/^http:/, 'ws:');\n\n return {\n btpUrl: btpUrl ? `${wsBase}/btp` : undefined,\n connectorUrl: connectorUrl ? `${base}/api` : undefined,\n };\n}\n"],"mappings":";;;AAmBO,SAAS,sBACd,YACA,QACA,cAC4C;AAC5C,QAAM,OAAO,WAAW,QAAQ,OAAO,EAAE;AAGzC,QAAM,SAAS,KAAK,QAAQ,WAAW,MAAM,EAAE,QAAQ,UAAU,KAAK;AAEtE,SAAO;IACL,QAAQ,SAAS,GAAG,MAAM,SAAS;IACnC,cAAc,eAAe,GAAG,IAAI,SAAS;EAC/C;AACF;","names":[]}
@@ -0,0 +1,11 @@
1
+ import { createRequire as __cr } from 'module'; const require = __cr(import.meta.url);
2
+ import {
3
+ HMAC,
4
+ hmac
5
+ } from "./chunk-32QD72IL.js";
6
+ import "./chunk-VA7XC4FD.js";
7
+ export {
8
+ HMAC,
9
+ hmac
10
+ };
11
+ //# sourceMappingURL=hmac-7WSXTWW4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}