@darkiceinteractive/mcp-conductor 2.0.0-alpha.1 → 3.0.0-beta.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.
- package/README.md +35 -5
- package/dist/bin/cli.d.ts +20 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +260 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/bridge/http-server.d.ts +35 -0
- package/dist/bridge/http-server.d.ts.map +1 -1
- package/dist/bridge/http-server.js +51 -2
- package/dist/bridge/http-server.js.map +1 -1
- package/dist/bridge/index.d.ts +1 -0
- package/dist/bridge/index.d.ts.map +1 -1
- package/dist/bridge/index.js +1 -0
- package/dist/bridge/index.js.map +1 -1
- package/dist/bridge/pool.d.ts +95 -0
- package/dist/bridge/pool.d.ts.map +1 -0
- package/dist/bridge/pool.js +384 -0
- package/dist/bridge/pool.js.map +1 -0
- package/dist/cache/cache.d.ts +64 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +209 -0
- package/dist/cache/cache.js.map +1 -0
- package/dist/cache/delta.d.ts +32 -0
- package/dist/cache/delta.d.ts.map +1 -0
- package/dist/cache/delta.js +131 -0
- package/dist/cache/delta.js.map +1 -0
- package/dist/cache/disk.d.ts +65 -0
- package/dist/cache/disk.d.ts.map +1 -0
- package/dist/cache/disk.js +238 -0
- package/dist/cache/disk.js.map +1 -0
- package/dist/cache/index.d.ts +53 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +12 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/key.d.ts +44 -0
- package/dist/cache/key.d.ts.map +1 -0
- package/dist/cache/key.js +83 -0
- package/dist/cache/key.js.map +1 -0
- package/dist/cache/lru.d.ts +57 -0
- package/dist/cache/lru.d.ts.map +1 -0
- package/dist/cache/lru.js +112 -0
- package/dist/cache/lru.js.map +1 -0
- package/dist/cache/policy.d.ts +34 -0
- package/dist/cache/policy.d.ts.map +1 -0
- package/dist/cache/policy.js +95 -0
- package/dist/cache/policy.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +33 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +135 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/export-servers.d.ts +22 -0
- package/dist/cli/commands/export-servers.d.ts.map +1 -0
- package/dist/cli/commands/export-servers.js +45 -0
- package/dist/cli/commands/export-servers.js.map +1 -0
- package/dist/cli/commands/import-servers.d.ts +57 -0
- package/dist/cli/commands/import-servers.d.ts.map +1 -0
- package/dist/cli/commands/import-servers.js +137 -0
- package/dist/cli/commands/import-servers.js.map +1 -0
- package/dist/cli/commands/routing.d.ts +34 -0
- package/dist/cli/commands/routing.d.ts.map +1 -0
- package/dist/cli/commands/routing.js +60 -0
- package/dist/cli/commands/routing.js.map +1 -0
- package/dist/cli/commands/test-server.d.ts +34 -0
- package/dist/cli/commands/test-server.d.ts.map +1 -0
- package/dist/cli/commands/test-server.js +86 -0
- package/dist/cli/commands/test-server.js.map +1 -0
- package/dist/cli/daemon.d.ts +60 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +244 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/replay.d.ts +16 -0
- package/dist/cli/replay.d.ts.map +1 -0
- package/dist/cli/replay.js +89 -0
- package/dist/cli/replay.js.map +1 -0
- package/dist/cli/wizard/setup.d.ts +12 -0
- package/dist/cli/wizard/setup.d.ts.map +1 -0
- package/dist/cli/wizard/setup.js +71 -0
- package/dist/cli/wizard/setup.js.map +1 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +4 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/schema.d.ts +34 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/daemon/client.d.ts +99 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +292 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/discovery.d.ts +50 -0
- package/dist/daemon/discovery.d.ts.map +1 -0
- package/dist/daemon/discovery.js +104 -0
- package/dist/daemon/discovery.js.map +1 -0
- package/dist/daemon/index.d.ts +16 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +11 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/sandbox-api.d.ts +45 -0
- package/dist/daemon/sandbox-api.d.ts.map +1 -0
- package/dist/daemon/sandbox-api.js +74 -0
- package/dist/daemon/sandbox-api.js.map +1 -0
- package/dist/daemon/server.d.ts +65 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +373 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/shared-kv.d.ts +81 -0
- package/dist/daemon/shared-kv.d.ts.map +1 -0
- package/dist/daemon/shared-kv.js +215 -0
- package/dist/daemon/shared-kv.js.map +1 -0
- package/dist/daemon/shared-lock.d.ts +71 -0
- package/dist/daemon/shared-lock.d.ts.map +1 -0
- package/dist/daemon/shared-lock.js +119 -0
- package/dist/daemon/shared-lock.js.map +1 -0
- package/dist/hub/mcp-hub.d.ts +23 -0
- package/dist/hub/mcp-hub.d.ts.map +1 -1
- package/dist/hub/mcp-hub.js +34 -1
- package/dist/hub/mcp-hub.js.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/observability/anomaly.d.ts +67 -0
- package/dist/observability/anomaly.d.ts.map +1 -0
- package/dist/observability/anomaly.js +141 -0
- package/dist/observability/anomaly.js.map +1 -0
- package/dist/observability/cost-predictor.d.ts +49 -0
- package/dist/observability/cost-predictor.d.ts.map +1 -0
- package/dist/observability/cost-predictor.js +145 -0
- package/dist/observability/cost-predictor.js.map +1 -0
- package/dist/observability/hot-path.d.ts +49 -0
- package/dist/observability/hot-path.d.ts.map +1 -0
- package/dist/observability/hot-path.js +125 -0
- package/dist/observability/hot-path.js.map +1 -0
- package/dist/observability/index.d.ts +10 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +10 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/replay.d.ts +104 -0
- package/dist/observability/replay.d.ts.map +1 -0
- package/dist/observability/replay.js +239 -0
- package/dist/observability/replay.js.map +1 -0
- package/dist/registry/built-in-recommendations.d.ts +54 -0
- package/dist/registry/built-in-recommendations.d.ts.map +1 -0
- package/dist/registry/built-in-recommendations.js +65 -0
- package/dist/registry/built-in-recommendations.js.map +1 -0
- package/dist/registry/events.d.ts +26 -0
- package/dist/registry/events.d.ts.map +1 -0
- package/dist/registry/events.js +22 -0
- package/dist/registry/events.js.map +1 -0
- package/dist/registry/index.d.ts +159 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +12 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/registry.d.ts +87 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +294 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/registry/snapshot.d.ts +42 -0
- package/dist/registry/snapshot.d.ts.map +1 -0
- package/dist/registry/snapshot.js +71 -0
- package/dist/registry/snapshot.js.map +1 -0
- package/dist/registry/typegen.d.ts +48 -0
- package/dist/registry/typegen.d.ts.map +1 -0
- package/dist/registry/typegen.js +200 -0
- package/dist/registry/typegen.js.map +1 -0
- package/dist/registry/validator.d.ts +23 -0
- package/dist/registry/validator.d.ts.map +1 -0
- package/dist/registry/validator.js +50 -0
- package/dist/registry/validator.js.map +1 -0
- package/dist/reliability/breaker.d.ts +57 -0
- package/dist/reliability/breaker.d.ts.map +1 -0
- package/dist/reliability/breaker.js +130 -0
- package/dist/reliability/breaker.js.map +1 -0
- package/dist/reliability/errors.d.ts +78 -0
- package/dist/reliability/errors.d.ts.map +1 -0
- package/dist/reliability/errors.js +160 -0
- package/dist/reliability/errors.js.map +1 -0
- package/dist/reliability/gateway.d.ts +88 -0
- package/dist/reliability/gateway.d.ts.map +1 -0
- package/dist/reliability/gateway.js +180 -0
- package/dist/reliability/gateway.js.map +1 -0
- package/dist/reliability/index.d.ts +20 -0
- package/dist/reliability/index.d.ts.map +1 -0
- package/dist/reliability/index.js +16 -0
- package/dist/reliability/index.js.map +1 -0
- package/dist/reliability/profile.d.ts +49 -0
- package/dist/reliability/profile.d.ts.map +1 -0
- package/dist/reliability/profile.js +58 -0
- package/dist/reliability/profile.js.map +1 -0
- package/dist/reliability/retry.d.ts +39 -0
- package/dist/reliability/retry.d.ts.map +1 -0
- package/dist/reliability/retry.js +51 -0
- package/dist/reliability/retry.js.map +1 -0
- package/dist/reliability/timeout.d.ts +34 -0
- package/dist/reliability/timeout.d.ts.map +1 -0
- package/dist/reliability/timeout.js +53 -0
- package/dist/reliability/timeout.js.map +1 -0
- package/dist/runtime/executor.d.ts.map +1 -1
- package/dist/runtime/executor.js +122 -14
- package/dist/runtime/executor.js.map +1 -1
- package/dist/runtime/findtool/embed.d.ts +28 -0
- package/dist/runtime/findtool/embed.d.ts.map +1 -0
- package/dist/runtime/findtool/embed.js +85 -0
- package/dist/runtime/findtool/embed.js.map +1 -0
- package/dist/runtime/findtool/index.d.ts +52 -0
- package/dist/runtime/findtool/index.d.ts.map +1 -0
- package/dist/runtime/findtool/index.js +78 -0
- package/dist/runtime/findtool/index.js.map +1 -0
- package/dist/runtime/findtool/vector-index.d.ts +53 -0
- package/dist/runtime/findtool/vector-index.d.ts.map +1 -0
- package/dist/runtime/findtool/vector-index.js +71 -0
- package/dist/runtime/findtool/vector-index.js.map +1 -0
- package/dist/runtime/helpers/budget.d.ts +27 -0
- package/dist/runtime/helpers/budget.d.ts.map +1 -0
- package/dist/runtime/helpers/budget.js +103 -0
- package/dist/runtime/helpers/budget.js.map +1 -0
- package/dist/runtime/helpers/compact.d.ts +32 -0
- package/dist/runtime/helpers/compact.d.ts.map +1 -0
- package/dist/runtime/helpers/compact.js +93 -0
- package/dist/runtime/helpers/compact.js.map +1 -0
- package/dist/runtime/helpers/delta.d.ts +45 -0
- package/dist/runtime/helpers/delta.d.ts.map +1 -0
- package/dist/runtime/helpers/delta.js +116 -0
- package/dist/runtime/helpers/delta.js.map +1 -0
- package/dist/runtime/helpers/index.d.ts +16 -0
- package/dist/runtime/helpers/index.d.ts.map +1 -0
- package/dist/runtime/helpers/index.js +13 -0
- package/dist/runtime/helpers/index.js.map +1 -0
- package/dist/runtime/helpers/summarize.d.ts +24 -0
- package/dist/runtime/helpers/summarize.d.ts.map +1 -0
- package/dist/runtime/helpers/summarize.js +124 -0
- package/dist/runtime/helpers/summarize.js.map +1 -0
- package/dist/runtime/helpers/worker-preload.d.ts +25 -0
- package/dist/runtime/helpers/worker-preload.d.ts.map +1 -0
- package/dist/runtime/helpers/worker-preload.js +223 -0
- package/dist/runtime/helpers/worker-preload.js.map +1 -0
- package/dist/runtime/index.d.ts +1 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +1 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/pool/index.d.ts +11 -0
- package/dist/runtime/pool/index.d.ts.map +1 -0
- package/dist/runtime/pool/index.js +8 -0
- package/dist/runtime/pool/index.js.map +1 -0
- package/dist/runtime/pool/recycle.d.ts +44 -0
- package/dist/runtime/pool/recycle.d.ts.map +1 -0
- package/dist/runtime/pool/recycle.js +50 -0
- package/dist/runtime/pool/recycle.js.map +1 -0
- package/dist/runtime/pool/worker-pool.d.ts +77 -0
- package/dist/runtime/pool/worker-pool.d.ts.map +1 -0
- package/dist/runtime/pool/worker-pool.js +216 -0
- package/dist/runtime/pool/worker-pool.js.map +1 -0
- package/dist/runtime/pool/worker.d.ts +80 -0
- package/dist/runtime/pool/worker.d.ts.map +1 -0
- package/dist/runtime/pool/worker.js +324 -0
- package/dist/runtime/pool/worker.js.map +1 -0
- package/dist/server/mcp-server.d.ts +3 -0
- package/dist/server/mcp-server.d.ts.map +1 -1
- package/dist/server/mcp-server.js +457 -3
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/server/passthrough-registrar.d.ts +123 -0
- package/dist/server/passthrough-registrar.d.ts.map +1 -0
- package/dist/server/passthrough-registrar.js +199 -0
- package/dist/server/passthrough-registrar.js.map +1 -0
- package/dist/skills/skills-engine.d.ts +9 -1
- package/dist/skills/skills-engine.d.ts.map +1 -1
- package/dist/skills/skills-engine.js +20 -3
- package/dist/skills/skills-engine.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/tokenize.d.ts +55 -0
- package/dist/utils/tokenize.d.ts.map +1 -0
- package/dist/utils/tokenize.js +205 -0
- package/dist/utils/tokenize.js.map +1 -0
- package/dist/version.d.ts +3 -3
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +3 -3
- package/dist/version.js.map +1 -1
- package/package.json +13 -3
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tailscale Peer Discovery for MCP Conductor Daemon.
|
|
3
|
+
*
|
|
4
|
+
* Provides helpers to resolve a daemon's address on the Tailscale mesh by
|
|
5
|
+
* hostname. The implementation queries the local Tailscale CLI (`tailscale
|
|
6
|
+
* status --json`) which must already be authenticated. No additional Tailscale
|
|
7
|
+
* API token is required — this works entirely through the local socket that
|
|
8
|
+
* the Tailscale daemon exposes.
|
|
9
|
+
*
|
|
10
|
+
* Cross-daemon mesh locking is deferred to v3.1; this module's v3.0 role is:
|
|
11
|
+
* 1. Resolve a Tailscale hostname → IP so DaemonClient can connect via TCP.
|
|
12
|
+
* 2. Detect whether Tailscale is available at all (graceful fallback to Unix
|
|
13
|
+
* socket when Tailscale is absent).
|
|
14
|
+
*
|
|
15
|
+
* @module daemon/discovery
|
|
16
|
+
*/
|
|
17
|
+
import { execFile } from 'node:child_process';
|
|
18
|
+
import { logger } from '../utils/logger.js';
|
|
19
|
+
/**
|
|
20
|
+
* Runs the Tailscale CLI and returns its JSON output.
|
|
21
|
+
* Extracted so tests can override via `vi.spyOn(discovery, '_runCli')`.
|
|
22
|
+
*/
|
|
23
|
+
async function runTailscaleCli(bin) {
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
execFile(bin, ['status', '--json'], { timeout: 5000 }, (err, stdout) => {
|
|
26
|
+
if (err)
|
|
27
|
+
reject(err);
|
|
28
|
+
else
|
|
29
|
+
resolve(stdout);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resolves daemon addresses on the Tailscale mesh by querying the local
|
|
35
|
+
* Tailscale CLI.
|
|
36
|
+
*/
|
|
37
|
+
export class TailscaleDiscovery {
|
|
38
|
+
tailscaleBin;
|
|
39
|
+
cacheTtlMs;
|
|
40
|
+
cache = null;
|
|
41
|
+
/**
|
|
42
|
+
* Internal CLI runner — override in tests via `vi.spyOn(instance, '_runCli')`.
|
|
43
|
+
*/
|
|
44
|
+
_runCli;
|
|
45
|
+
constructor(options = {}) {
|
|
46
|
+
this.tailscaleBin = options.tailscaleBin ?? 'tailscale';
|
|
47
|
+
this.cacheTtlMs = options.cacheTtlMs ?? 10_000;
|
|
48
|
+
this._runCli = runTailscaleCli;
|
|
49
|
+
}
|
|
50
|
+
async status() {
|
|
51
|
+
if (this.cache && Date.now() < this.cache.expiresAt) {
|
|
52
|
+
return this.cache.status;
|
|
53
|
+
}
|
|
54
|
+
const result = await this.queryTailscaleCli();
|
|
55
|
+
this.cache = { expiresAt: Date.now() + this.cacheTtlMs, status: result };
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
async resolve(hostname) {
|
|
59
|
+
const st = await this.status();
|
|
60
|
+
if (!st.available)
|
|
61
|
+
return null;
|
|
62
|
+
if (st.selfHostname?.toLowerCase() === hostname.toLowerCase()) {
|
|
63
|
+
return st.selfIp ?? null;
|
|
64
|
+
}
|
|
65
|
+
const peer = st.peers.find((p) => p.hostname.toLowerCase() === hostname.toLowerCase());
|
|
66
|
+
return peer?.tailscaleIp ?? null;
|
|
67
|
+
}
|
|
68
|
+
async isAvailable() {
|
|
69
|
+
const st = await this.status();
|
|
70
|
+
return st.available;
|
|
71
|
+
}
|
|
72
|
+
invalidateCache() {
|
|
73
|
+
this.cache = null;
|
|
74
|
+
}
|
|
75
|
+
async queryTailscaleCli() {
|
|
76
|
+
try {
|
|
77
|
+
const stdout = await this._runCli(this.tailscaleBin);
|
|
78
|
+
const raw = JSON.parse(stdout);
|
|
79
|
+
const self = raw.Self;
|
|
80
|
+
const peers = [];
|
|
81
|
+
for (const peer of Object.values(raw.Peer ?? {})) {
|
|
82
|
+
const ip = peer.TailscaleIPs?.[0];
|
|
83
|
+
if (!ip || !peer.HostName)
|
|
84
|
+
continue;
|
|
85
|
+
peers.push({
|
|
86
|
+
hostname: peer.HostName,
|
|
87
|
+
tailscaleIp: ip,
|
|
88
|
+
online: peer.Online ?? false,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
available: true,
|
|
93
|
+
selfHostname: self?.HostName,
|
|
94
|
+
selfIp: self?.TailscaleIPs?.[0],
|
|
95
|
+
peers,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
logger.debug('TailscaleDiscovery: Tailscale CLI unavailable', { error: String(err) });
|
|
100
|
+
return { available: false, peers: [] };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/daemon/discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Conductor Daemon — public API barrel.
|
|
3
|
+
*
|
|
4
|
+
* @module daemon
|
|
5
|
+
*/
|
|
6
|
+
export { DaemonServer } from './server.js';
|
|
7
|
+
export type { DaemonServerOptions, DaemonStats } from './server.js';
|
|
8
|
+
export { DaemonClient } from './client.js';
|
|
9
|
+
export type { DaemonClientOptions } from './client.js';
|
|
10
|
+
export { TailscaleDiscovery } from './discovery.js';
|
|
11
|
+
export type { TailscalePeer, TailscaleStatus } from './discovery.js';
|
|
12
|
+
export { SharedKV } from './shared-kv.js';
|
|
13
|
+
export type { KVSetOptions, SharedKVOptions } from './shared-kv.js';
|
|
14
|
+
export { SharedLock, LockTimeoutError } from './shared-lock.js';
|
|
15
|
+
export type { LockHandle, LockAcquireOptions } from './shared-lock.js';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAErE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAChE,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Conductor Daemon — public API barrel.
|
|
3
|
+
*
|
|
4
|
+
* @module daemon
|
|
5
|
+
*/
|
|
6
|
+
export { DaemonServer } from './server.js';
|
|
7
|
+
export { DaemonClient } from './client.js';
|
|
8
|
+
export { TailscaleDiscovery } from './discovery.js';
|
|
9
|
+
export { SharedKV } from './shared-kv.js';
|
|
10
|
+
export { SharedLock, LockTimeoutError } from './shared-lock.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGpD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sandbox `mcp.shared.*` API.
|
|
3
|
+
*
|
|
4
|
+
* Provides the shared KV, lock, broadcast, and subscribe surfaces that are
|
|
5
|
+
* injected into the sandbox runtime when a DaemonClient is available.
|
|
6
|
+
*
|
|
7
|
+
* When no daemon is available (v2 mode), all operations are no-ops or return
|
|
8
|
+
* null so existing code paths are not broken.
|
|
9
|
+
*
|
|
10
|
+
* This module is imported by the worker preload hook (Agent D's Phase 5 hook)
|
|
11
|
+
* via:
|
|
12
|
+
*
|
|
13
|
+
* import { createSharedApi } from '../daemon/sandbox-api.js';
|
|
14
|
+
* const mcp = { ..., shared: createSharedApi(daemonClient) };
|
|
15
|
+
*
|
|
16
|
+
* @module daemon/sandbox-api
|
|
17
|
+
*/
|
|
18
|
+
import type { DaemonClient } from './client.js';
|
|
19
|
+
export interface SharedKVApi {
|
|
20
|
+
get<T>(key: string): Promise<T | null>;
|
|
21
|
+
set<T>(key: string, value: T, options?: {
|
|
22
|
+
ttl?: number;
|
|
23
|
+
}): Promise<void>;
|
|
24
|
+
delete(key: string): Promise<void>;
|
|
25
|
+
list(prefix?: string): Promise<string[]>;
|
|
26
|
+
}
|
|
27
|
+
export interface SharedApi {
|
|
28
|
+
kv: SharedKVApi;
|
|
29
|
+
lock(key: string, options?: {
|
|
30
|
+
timeoutMs?: number;
|
|
31
|
+
}): Promise<{
|
|
32
|
+
release: () => Promise<void>;
|
|
33
|
+
}>;
|
|
34
|
+
broadcast(channel: string, message: unknown): Promise<void>;
|
|
35
|
+
subscribe(channel: string, handler: (msg: unknown) => void): Promise<{
|
|
36
|
+
unsubscribe: () => void;
|
|
37
|
+
}>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Create the `mcp.shared` API bound to a live DaemonClient.
|
|
41
|
+
*
|
|
42
|
+
* Pass `null` for `client` to get a no-op stub (standalone mode).
|
|
43
|
+
*/
|
|
44
|
+
export declare function createSharedApi(client: DaemonClient | null): SharedApi;
|
|
45
|
+
//# sourceMappingURL=sandbox-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-api.d.ts","sourceRoot":"","sources":["../../src/daemon/sandbox-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,WAAW,CAAC;IAChB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC,CAAC;IAC/F,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC,CAAC;CACnG;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,CAiCtE"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sandbox `mcp.shared.*` API.
|
|
3
|
+
*
|
|
4
|
+
* Provides the shared KV, lock, broadcast, and subscribe surfaces that are
|
|
5
|
+
* injected into the sandbox runtime when a DaemonClient is available.
|
|
6
|
+
*
|
|
7
|
+
* When no daemon is available (v2 mode), all operations are no-ops or return
|
|
8
|
+
* null so existing code paths are not broken.
|
|
9
|
+
*
|
|
10
|
+
* This module is imported by the worker preload hook (Agent D's Phase 5 hook)
|
|
11
|
+
* via:
|
|
12
|
+
*
|
|
13
|
+
* import { createSharedApi } from '../daemon/sandbox-api.js';
|
|
14
|
+
* const mcp = { ..., shared: createSharedApi(daemonClient) };
|
|
15
|
+
*
|
|
16
|
+
* @module daemon/sandbox-api
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Create the `mcp.shared` API bound to a live DaemonClient.
|
|
20
|
+
*
|
|
21
|
+
* Pass `null` for `client` to get a no-op stub (standalone mode).
|
|
22
|
+
*/
|
|
23
|
+
export function createSharedApi(client) {
|
|
24
|
+
if (client === null) {
|
|
25
|
+
return createNoopSharedApi();
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
kv: {
|
|
29
|
+
async get(key) {
|
|
30
|
+
return client.kvGet(key);
|
|
31
|
+
},
|
|
32
|
+
async set(key, value, options) {
|
|
33
|
+
return client.kvSet(key, value, options);
|
|
34
|
+
},
|
|
35
|
+
async delete(key) {
|
|
36
|
+
return client.kvDelete(key);
|
|
37
|
+
},
|
|
38
|
+
async list(prefix) {
|
|
39
|
+
return client.kvList(prefix);
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
async lock(key, options) {
|
|
43
|
+
return client.lockAcquire(key, options);
|
|
44
|
+
},
|
|
45
|
+
async broadcast(channel, message) {
|
|
46
|
+
return client.broadcast(channel, message);
|
|
47
|
+
},
|
|
48
|
+
async subscribe(channel, handler) {
|
|
49
|
+
return Promise.resolve(client.subscribe(channel, handler));
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* No-op shared API for when no daemon is available (v2 standalone mode).
|
|
55
|
+
* All KV operations return null / empty results; locks are immediate no-ops.
|
|
56
|
+
*/
|
|
57
|
+
function createNoopSharedApi() {
|
|
58
|
+
return {
|
|
59
|
+
kv: {
|
|
60
|
+
async get(_key) { return null; },
|
|
61
|
+
async set(_key, _value) { },
|
|
62
|
+
async delete(_key) { },
|
|
63
|
+
async list(_prefix) { return []; },
|
|
64
|
+
},
|
|
65
|
+
async lock(_key) {
|
|
66
|
+
return { release: async () => { } };
|
|
67
|
+
},
|
|
68
|
+
async broadcast(_channel, _message) { },
|
|
69
|
+
async subscribe(_channel, _handler) {
|
|
70
|
+
return { unsubscribe: () => { } };
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=sandbox-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-api.js","sourceRoot":"","sources":["../../src/daemon/sandbox-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAkBH;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAA2B;IACzD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,mBAAmB,EAAE,CAAC;IAC/B,CAAC;IAED,OAAO;QACL,EAAE,EAAE;YACF,KAAK,CAAC,GAAG,CAAI,GAAW;gBACtB,OAAO,MAAM,CAAC,KAAK,CAAI,GAAG,CAAC,CAAC;YAC9B,CAAC;YACD,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,KAAQ,EAAE,OAA0B;gBAC5D,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAC3C,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,GAAW;gBACtB,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,MAAe;gBACxB,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC;SACF;QAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,OAAgC;YACtD,OAAO,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,OAAe,EAAE,OAAgB;YAC/C,OAAO,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,OAAe,EAAE,OAA+B;YAC9D,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7D,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB;IAC1B,OAAO;QACL,EAAE,EAAE;YACF,KAAK,CAAC,GAAG,CAAI,IAAY,IAAuB,OAAO,IAAI,CAAC,CAAC,CAAC;YAC9D,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,MAAe,IAAkB,CAAC;YAC1D,KAAK,CAAC,MAAM,CAAC,IAAY,IAAkB,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,OAAgB,IAAuB,OAAO,EAAE,CAAC,CAAC,CAAC;SAC/D;QACD,KAAK,CAAC,IAAI,CAAC,IAAY;YACrB,OAAO,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,CAAC;QACrC,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,QAAiB,IAAG,CAAC;QACvD,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,QAAgC;YAChE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Conductor Daemon Server.
|
|
3
|
+
*
|
|
4
|
+
* Listens on a Unix domain socket (primary) and optionally a TCP port (for
|
|
5
|
+
* Tailscale-mesh clients). Enforces HMAC-SHA256 auth on every connection using
|
|
6
|
+
* the shared secret loaded from `~/.mcp-conductor/daemon-auth.json`.
|
|
7
|
+
*
|
|
8
|
+
* Protocol (newline-delimited JSON):
|
|
9
|
+
* Client → Server: { id, method, params }
|
|
10
|
+
* Server → Client: { id, result } | { id, error }
|
|
11
|
+
*
|
|
12
|
+
* The daemon owns a SharedKV, SharedLock, and in-process pub/sub bus that all
|
|
13
|
+
* connected clients share.
|
|
14
|
+
*
|
|
15
|
+
* @module daemon/server
|
|
16
|
+
*/
|
|
17
|
+
import { SharedKV } from './shared-kv.js';
|
|
18
|
+
import { SharedLock } from './shared-lock.js';
|
|
19
|
+
export interface DaemonStats {
|
|
20
|
+
uptime: number;
|
|
21
|
+
connectedClients: number;
|
|
22
|
+
kvKeys: number;
|
|
23
|
+
activeLocks: boolean;
|
|
24
|
+
requestsHandled: number;
|
|
25
|
+
}
|
|
26
|
+
export interface DaemonServerOptions {
|
|
27
|
+
socketPath?: string;
|
|
28
|
+
tcpPort?: number;
|
|
29
|
+
tailscaleHostname?: string;
|
|
30
|
+
auth?: {
|
|
31
|
+
sharedSecretPath?: string;
|
|
32
|
+
sharedSecret?: string;
|
|
33
|
+
};
|
|
34
|
+
kvOptions?: ConstructorParameters<typeof SharedKV>[0];
|
|
35
|
+
}
|
|
36
|
+
export declare class DaemonServer {
|
|
37
|
+
private readonly socketPath;
|
|
38
|
+
private readonly tcpPort?;
|
|
39
|
+
private readonly sharedSecret;
|
|
40
|
+
private readonly kv;
|
|
41
|
+
private readonly lock;
|
|
42
|
+
private readonly bus;
|
|
43
|
+
private unixServer?;
|
|
44
|
+
private tcpServer?;
|
|
45
|
+
/** Map from socket to per-client state (including lock handles). */
|
|
46
|
+
private readonly clients;
|
|
47
|
+
private readonly startTime;
|
|
48
|
+
private requestsHandled;
|
|
49
|
+
private running;
|
|
50
|
+
constructor(options?: DaemonServerOptions);
|
|
51
|
+
start(): Promise<void>;
|
|
52
|
+
shutdown(): Promise<void>;
|
|
53
|
+
stats(): DaemonStats;
|
|
54
|
+
private startUnixServer;
|
|
55
|
+
private startTcpServer;
|
|
56
|
+
private closeServer;
|
|
57
|
+
private handleConnection;
|
|
58
|
+
private handleAuth;
|
|
59
|
+
private handleRequest;
|
|
60
|
+
private dispatch;
|
|
61
|
+
private sendRaw;
|
|
62
|
+
get kvStore(): SharedKV;
|
|
63
|
+
get lockRegistry(): SharedLock;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAWH,OAAO,EAAE,QAAQ,EAAqB,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAmB,MAAM,kBAAkB,CAAC;AAqF/D,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAMD,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,IAAI,CAAC,EAAE;QACL,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,SAAS,CAAC,EAAE,qBAAqB,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;CACvD;AAMD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAmB;IAEvC,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAY;IAC9B,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAC1D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,mBAAwB;IAevC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBtB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B/B,KAAK,IAAI,WAAW;IAcpB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,gBAAgB;IAyExB,OAAO,CAAC,UAAU;YAgCJ,aAAa;YAcb,QAAQ;IAoGtB,OAAO,CAAC,OAAO;IAcf,IAAI,OAAO,IAAI,QAAQ,CAAoB;IAC3C,IAAI,YAAY,IAAI,UAAU,CAAsB;CACrD"}
|