@intutic/mcp-governance-proxy 1.9.0 → 1.10.1
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 +28 -0
- package/dist/anomaly/detectors.d.ts +129 -0
- package/dist/anomaly/detectors.d.ts.map +1 -0
- package/dist/anomaly/detectors.js +368 -0
- package/dist/anomaly/detectors.js.map +1 -0
- package/dist/anomaly/index.d.ts +52 -0
- package/dist/anomaly/index.d.ts.map +1 -0
- package/dist/anomaly/index.js +71 -0
- package/dist/anomaly/index.js.map +1 -0
- package/dist/config.d.ts +107 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +129 -6
- package/dist/config.js.map +1 -1
- package/dist/daemon/healthMonitor.d.ts.map +1 -1
- package/dist/daemon/healthMonitor.js +45 -46
- package/dist/daemon/healthMonitor.js.map +1 -1
- package/dist/daemon/index.d.ts +15 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +78 -9
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/instrumentation.d.ts +20 -0
- package/dist/daemon/instrumentation.d.ts.map +1 -0
- package/dist/daemon/instrumentation.js +61 -0
- package/dist/daemon/instrumentation.js.map +1 -0
- package/dist/daemon/policyCache.d.ts +83 -0
- package/dist/daemon/policyCache.d.ts.map +1 -1
- package/dist/daemon/policyCache.js +280 -11
- package/dist/daemon/policyCache.js.map +1 -1
- package/dist/daemon/statusReporter.d.ts +12 -0
- package/dist/daemon/statusReporter.d.ts.map +1 -0
- package/dist/daemon/statusReporter.js +130 -0
- package/dist/daemon/statusReporter.js.map +1 -0
- package/dist/daemon/telemetryBatcher.d.ts +3 -1
- package/dist/daemon/telemetryBatcher.d.ts.map +1 -1
- package/dist/daemon/telemetryBatcher.js +56 -13
- package/dist/daemon/telemetryBatcher.js.map +1 -1
- package/dist/daemonClient.d.ts +1 -1
- package/dist/daemonClient.d.ts.map +1 -1
- package/dist/daemonClient.js +0 -2
- package/dist/daemonClient.js.map +1 -1
- package/dist/dlp.d.ts +19 -0
- package/dist/dlp.d.ts.map +1 -1
- package/dist/dlp.js +95 -18
- package/dist/dlp.js.map +1 -1
- package/dist/emitter.d.ts +40 -2
- package/dist/emitter.d.ts.map +1 -1
- package/dist/emitter.js +27 -5
- package/dist/emitter.js.map +1 -1
- package/dist/index.js +13 -2
- package/dist/index.js.map +1 -1
- package/dist/injection.d.ts +46 -0
- package/dist/injection.d.ts.map +1 -0
- package/dist/injection.js +147 -0
- package/dist/injection.js.map +1 -0
- package/dist/interceptor.d.ts +131 -1
- package/dist/interceptor.d.ts.map +1 -1
- package/dist/interceptor.js +301 -5
- package/dist/interceptor.js.map +1 -1
- package/dist/policy.d.ts +110 -2
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +206 -5
- package/dist/policy.js.map +1 -1
- package/dist/proxy.d.ts +205 -0
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +572 -65
- package/dist/proxy.js.map +1 -1
- package/dist/remoteBridge.d.ts +51 -0
- package/dist/remoteBridge.d.ts.map +1 -0
- package/dist/remoteBridge.js +182 -0
- package/dist/remoteBridge.js.map +1 -0
- package/dist/session.d.ts +158 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +206 -0
- package/dist/session.js.map +1 -0
- package/dist/sessionScope.d.ts +51 -0
- package/dist/sessionScope.d.ts.map +1 -0
- package/dist/sessionScope.js +94 -0
- package/dist/sessionScope.js.map +1 -0
- package/dist/sessionStore.d.ts +69 -0
- package/dist/sessionStore.d.ts.map +1 -0
- package/dist/sessionStore.js +143 -0
- package/dist/sessionStore.js.map +1 -0
- package/dist/tofu.d.ts +112 -0
- package/dist/tofu.d.ts.map +1 -0
- package/dist/tofu.js +180 -0
- package/dist/tofu.js.map +1 -0
- package/dist/toolPoison.d.ts +32 -0
- package/dist/toolPoison.d.ts.map +1 -0
- package/dist/toolPoison.js +81 -0
- package/dist/toolPoison.js.map +1 -0
- package/dist/valkeyErrors.d.ts +17 -0
- package/dist/valkeyErrors.d.ts.map +1 -0
- package/dist/valkeyErrors.js +24 -0
- package/dist/valkeyErrors.js.map +1 -0
- package/dist/wasm/context.d.ts +57 -0
- package/dist/wasm/context.d.ts.map +1 -0
- package/dist/wasm/context.js +59 -0
- package/dist/wasm/context.js.map +1 -0
- package/dist/wasm/hostImports.d.ts +43 -0
- package/dist/wasm/hostImports.d.ts.map +1 -0
- package/dist/wasm/hostImports.js +158 -0
- package/dist/wasm/hostImports.js.map +1 -0
- package/dist/wasm/loader.d.ts +95 -0
- package/dist/wasm/loader.d.ts.map +1 -0
- package/dist/wasm/loader.js +198 -0
- package/dist/wasm/loader.js.map +1 -0
- package/dist/wasm/referencedFiles.d.ts +115 -0
- package/dist/wasm/referencedFiles.d.ts.map +1 -0
- package/dist/wasm/referencedFiles.js +366 -0
- package/dist/wasm/referencedFiles.js.map +1 -0
- package/dist/wasm/runner.d.ts +91 -0
- package/dist/wasm/runner.d.ts.map +1 -0
- package/dist/wasm/runner.js +308 -0
- package/dist/wasm/runner.js.map +1 -0
- package/dist/wasm/watch.d.ts +5 -0
- package/dist/wasm/watch.d.ts.map +1 -0
- package/dist/wasm/watch.js +54 -0
- package/dist/wasm/watch.js.map +1 -0
- package/dist/wasm/worker.d.ts +39 -0
- package/dist/wasm/worker.d.ts.map +1 -0
- package/dist/wasm/worker.js +245 -0
- package/dist/wasm/worker.js.map +1 -0
- package/package.json +14 -4
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* anomaly/index.ts — Public entry point for Phase 2 anomaly detection:
|
|
3
|
+
* disposition resolution (the config promotion-invariant) and the reask
|
|
4
|
+
* escalation constant, layered on top of `detectors.ts`'s pure detector
|
|
5
|
+
* functions.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
export * from './detectors.js';
|
|
10
|
+
/**
|
|
11
|
+
* Ported from `packages/proxy/src/plugins/anomaly/mod.rs`'s
|
|
12
|
+
* `REASK_MAX_ATTEMPTS` (confirmed: `pub const REASK_MAX_ATTEMPTS: u32 = 3;`).
|
|
13
|
+
* How many times one session may trip the same reask finding before it
|
|
14
|
+
* hardens into an unconditional block.
|
|
15
|
+
*/
|
|
16
|
+
export const REASK_MAX_ATTEMPTS = 3;
|
|
17
|
+
/**
|
|
18
|
+
* The Rust-source-declared disposition CEILING for each of the 7 ported
|
|
19
|
+
* detectors — copied from the `disposition` field each `detectors.ts`
|
|
20
|
+
* function's own finding already carries, restated here as a lookup table
|
|
21
|
+
* so `resolveEffectiveDisposition` can validate a config override against it
|
|
22
|
+
* even when no finding fired yet (an `'off'` override skips evaluation
|
|
23
|
+
* entirely — see `resolveEffectiveDisposition`).
|
|
24
|
+
*/
|
|
25
|
+
export const DETECTOR_BASE_DISPOSITION = {
|
|
26
|
+
consecutive_repeat: 'reask',
|
|
27
|
+
ping_pong_cycle: 'reask',
|
|
28
|
+
landmark_cycle: 'steer',
|
|
29
|
+
tool_diversity_collapse: 'steer',
|
|
30
|
+
code_as_action: 'kill',
|
|
31
|
+
tool_poisoning: 'steer',
|
|
32
|
+
dlp_escalation: 'kill',
|
|
33
|
+
};
|
|
34
|
+
const SEVERITY = { off: 0, steer: 1, reask: 2, kill: 3 };
|
|
35
|
+
/**
|
|
36
|
+
* Resolves the EFFECTIVE disposition for one finding, honoring:
|
|
37
|
+
*
|
|
38
|
+
* 1. `mode: 'off'` — this detector class is disabled outright (caller should
|
|
39
|
+
* skip evaluation before this is even called, but `'off'` is handled here
|
|
40
|
+
* too as a defensive floor).
|
|
41
|
+
* 2. `mode: 'warn'` — every finding is capped at `'steer'` (report, never
|
|
42
|
+
* block), regardless of what the detector itself declared.
|
|
43
|
+
* 3. A per-detector override (`mcpAnomalyOverrides`) — capped at
|
|
44
|
+
* `min(override, the detector's own Rust-declared disposition)`.
|
|
45
|
+
*
|
|
46
|
+
* **The invariant this function exists to enforce, mirrored from
|
|
47
|
+
* `plugins/anomaly/mod.rs`'s promotion rule**: config may only ever DEMOTE a
|
|
48
|
+
* finding toward `steer`/`off`, never promote it past what
|
|
49
|
+
* `DETECTOR_BASE_DISPOSITION` (or, equivalently, `finding.disposition`
|
|
50
|
+
* itself — the two must always agree, since `detectors.ts` never emits a
|
|
51
|
+
* disposition other than each function's declared one) already declares. An
|
|
52
|
+
* override of `'kill'` on `landmark_cycle` (whose Rust source only ever
|
|
53
|
+
* disposes `steer`) has no effect — `min(kill, steer) = steer` — because the
|
|
54
|
+
* Rust proxy has never measured `landmark_cycle`'s false-positive rate at
|
|
55
|
+
* `kill` severity, and this proxy inherits that same unmeasured status
|
|
56
|
+
* rather than re-deciding it locally.
|
|
57
|
+
*/
|
|
58
|
+
export function resolveEffectiveDisposition(finding, mode, overrides) {
|
|
59
|
+
if (mode === 'off')
|
|
60
|
+
return 'off';
|
|
61
|
+
const modeCeiling = mode === 'warn' ? 'steer' : finding.disposition;
|
|
62
|
+
const override = overrides[finding.detectorId];
|
|
63
|
+
const candidates = [finding.disposition, modeCeiling];
|
|
64
|
+
if (override !== undefined)
|
|
65
|
+
candidates.push(override);
|
|
66
|
+
// The lowest severity among: what the detector declared, what the global
|
|
67
|
+
// mode ceils at, and any per-detector override — never higher than any of
|
|
68
|
+
// the three, which is exactly the "only demote" guarantee.
|
|
69
|
+
return candidates.reduce((min, c) => (SEVERITY[c] < SEVERITY[min] ? c : min));
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/anomaly/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,cAAc,gBAAgB,CAAA;AAE9B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAA;AAEnC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAA0C;IAC9E,kBAAkB,EAAE,OAAO;IAC3B,eAAe,EAAE,OAAO;IACxB,cAAc,EAAE,OAAO;IACvB,uBAAuB,EAAE,OAAO;IAChC,cAAc,EAAE,MAAM;IACtB,cAAc,EAAE,OAAO;IACvB,cAAc,EAAE,MAAM;CACvB,CAAA;AAED,MAAM,QAAQ,GAAkD,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;AAIvG;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAAuB,EACvB,IAAiB,EACjB,SAAwD;IAExD,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,KAAK,CAAA;IAEhC,MAAM,WAAW,GAAwB,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAA;IACxF,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IAE9C,MAAM,UAAU,GAA4B,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;IAC9E,IAAI,QAAQ,KAAK,SAAS;QAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAErD,yEAAyE;IACzE,0EAA0E;IAC1E,2DAA2D;IAC3D,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;AAC/E,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -23,7 +23,11 @@ export interface ProxyConfig {
|
|
|
23
23
|
failOpen: boolean;
|
|
24
24
|
/**
|
|
25
25
|
* MCP proxy deployment model ('per-session' | 'daemon').
|
|
26
|
-
* WS-5 Q2 —
|
|
26
|
+
* WS-5 Q2 — 'daemon' is active: when set, policy lookups are answered by the
|
|
27
|
+
* long-lived daemon over its Unix socket (see policy.ts) instead of a
|
|
28
|
+
* per-process fetch from the control plane. What is NOT active is daemon
|
|
29
|
+
* health telemetry — the health-snapshot route was removed and the dashboard
|
|
30
|
+
* flag is hardcoded off, so daemon health is not reported anywhere.
|
|
27
31
|
*/
|
|
28
32
|
mcpProxyMode: string;
|
|
29
33
|
/**
|
|
@@ -32,6 +36,108 @@ export interface ProxyConfig {
|
|
|
32
36
|
* entry that exposes Intutic governance tools to the harness.
|
|
33
37
|
*/
|
|
34
38
|
standalone: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Server identity, from `--server-name <name>` — the flag
|
|
41
|
+
* `services/sync-daemon/src/harness/mcpAutoWrite.ts`'s `wrapWithProxy` has
|
|
42
|
+
* threaded onto every wrapped invocation since Phase D, but which nothing
|
|
43
|
+
* read until now. Used for the server-level allowlist check
|
|
44
|
+
* (`mcpAllowedServers`, interceptor.ts) and TOFU pinning (tofu.ts) — both
|
|
45
|
+
* need to know which real server this proxy process is fronting.
|
|
46
|
+
* Defaults to `'unknown'`, matching `workspaceId`'s own unset default.
|
|
47
|
+
*/
|
|
48
|
+
serverName: string;
|
|
49
|
+
/**
|
|
50
|
+
* Remote MCP server URL, from `--remote-url <url>`. When set, the proxy's
|
|
51
|
+
* upstream is an HTTP/SSE MCP server (remoteBridge.ts) instead of a spawned
|
|
52
|
+
* stdio child process — `realServerCommand` is empty in that case, and
|
|
53
|
+
* `loadConfig` rejects a config that sets both (see the mutual-exclusion
|
|
54
|
+
* check below). `undefined` in every other mode.
|
|
55
|
+
*/
|
|
56
|
+
remoteUrl?: string;
|
|
57
|
+
/**
|
|
58
|
+
* Remote transport selection, from `--remote-transport <sse|http>`. Only
|
|
59
|
+
* meaningful when `remoteUrl` is set. Defaults to `'http'`
|
|
60
|
+
* (`StreamableHTTPClientTransport` — the SDK's current, non-deprecated
|
|
61
|
+
* transport) when `--remote-url` is passed without an explicit
|
|
62
|
+
* `--remote-transport`.
|
|
63
|
+
*/
|
|
64
|
+
remoteTransport?: 'sse' | 'http';
|
|
65
|
+
/**
|
|
66
|
+
* Auth headers for the remote MCP connection (e.g. `Authorization: Bearer
|
|
67
|
+
* <token>`), parsed from the `INTUTIC_REMOTE_HEADERS` env var — a JSON
|
|
68
|
+
* object string. Deliberately NOT a CLI flag: argv is visible to any local
|
|
69
|
+
* process via `ps`, and these headers carry bearer tokens/API keys that
|
|
70
|
+
* must never leak that way. Empty object when unset, malformed, or not a
|
|
71
|
+
* plain JSON object.
|
|
72
|
+
*/
|
|
73
|
+
remoteHeaders: Record<string, string>;
|
|
74
|
+
/**
|
|
75
|
+
* Default prompt-injection disposition (injection.ts / interceptor.ts),
|
|
76
|
+
* from `INTUTIC_MCP_INJECTION_ACTION` — the env-var fallback for
|
|
77
|
+
* standalone/open-core use documented on `PolicyClient.getInjectionAction`
|
|
78
|
+
* (policy.ts), which the control plane's `mcpInjectionAction` policy field
|
|
79
|
+
* overrides when present. Defaults to `'warn'`, matching the Rust proxy's
|
|
80
|
+
* own steer-not-kill posture for injection: `PromptInjectionDetector`
|
|
81
|
+
* (detectors.rs) never disposes `Kill` on its own — only `Reask` (at the
|
|
82
|
+
* ≥2-technique/untrusted-source threshold) or `Steer` below it — so a
|
|
83
|
+
* default of unconditional blocking would be a stricter posture than the
|
|
84
|
+
* capability this was ported from.
|
|
85
|
+
*/
|
|
86
|
+
mcpInjectionAction: 'warn' | 'block';
|
|
87
|
+
/**
|
|
88
|
+
* Default anomaly-detection mode (anomaly/index.ts, Phase 2), from
|
|
89
|
+
* `INTUTIC_MCP_ANOMALY_MODE` — the env-var fallback for standalone/
|
|
90
|
+
* open-core use, overridden by the control plane's `mcpAnomalyMode` policy
|
|
91
|
+
* field when present (`PolicyClient.getAnomalyMode`). Defaults to
|
|
92
|
+
* `'enforce'`: unlike injection scanning, 5 of the 7 ported anomaly
|
|
93
|
+
* detectors already carry a non-`kill` Rust-declared ceiling
|
|
94
|
+
* (`consecutive_repeat`/`ping_pong_cycle` reask, `landmark_cycle`/
|
|
95
|
+
* `tool_diversity_collapse`/`tool_poisoning` steer), so "enforce" here
|
|
96
|
+
* still respects every detector's own measured-or-unmeasured severity via
|
|
97
|
+
* `resolveEffectiveDisposition` — it is not a blanket "block on suspicion"
|
|
98
|
+
* setting.
|
|
99
|
+
*/
|
|
100
|
+
mcpAnomalyMode: 'enforce' | 'warn' | 'off';
|
|
101
|
+
/**
|
|
102
|
+
* Per-detector disposition override map, from `INTUTIC_MCP_ANOMALY_OVERRIDES`
|
|
103
|
+
* — a JSON object string, same "env var, not a CLI flag" treatment as
|
|
104
|
+
* `remoteHeaders` (though these values are not secrets; the JSON-object
|
|
105
|
+
* convention is just kept consistent). Keys are detector ids
|
|
106
|
+
* (`anomaly/index.ts`'s `DETECTOR_BASE_DISPOSITION`); values are
|
|
107
|
+
* `'steer' | 'reask' | 'kill' | 'off'`, clamped at each detector's own
|
|
108
|
+
* Rust-declared ceiling by `resolveEffectiveDisposition` — never able to
|
|
109
|
+
* promote past it. Overridden wholesale by the control plane's
|
|
110
|
+
* `mcpAnomalyOverrides` policy field when present. Empty object when
|
|
111
|
+
* unset, malformed, or not a plain JSON object.
|
|
112
|
+
*/
|
|
113
|
+
mcpAnomalyOverrides: Record<string, 'steer' | 'reask' | 'kill' | 'off'>;
|
|
114
|
+
/**
|
|
115
|
+
* The "config" tier of Phase 3's WASM rule directory resolution — ported
|
|
116
|
+
* from `local_loader.rs`'s `resolve_local_dir`, whose three-tier order is
|
|
117
|
+
* `INTUTIC_WASM_DIR` env var (checked directly inside
|
|
118
|
+
* `wasm/loader.ts`'s `resolveWasmDir`, not here) → this config value →
|
|
119
|
+
* `~/.intutic/wasm` home default. Sourced from `~/.intutic/env/runtime.env`'s
|
|
120
|
+
* `INTUTIC_WASM_LOCAL_DIR` — the closest local analogue this package has
|
|
121
|
+
* to the Rust proxy's `intutic_settings.wasm_local_dir` dashboard setting
|
|
122
|
+
* (there is no control-plane-delivered equivalent on the MCP policy
|
|
123
|
+
* channel). `undefined` when unset, which `resolveWasmDir` reads as
|
|
124
|
+
* "fall through to the home default."
|
|
125
|
+
*/
|
|
126
|
+
mcpWasmDir: string | undefined;
|
|
127
|
+
/**
|
|
128
|
+
* The Valkey the session window is shared through (Wave 5.3, TD-437):
|
|
129
|
+
* `INTUTIC_VALKEY_URL` or `VALKEY_URL` from the environment, else
|
|
130
|
+
* `INTUTIC_VALKEY_URL` from runtime.env (written by `intutic connect` / the
|
|
131
|
+
* sync daemon when their local Valkey is running). No localhost default —
|
|
132
|
+
* a stdio proxy must not probe a Valkey nobody configured; absent means
|
|
133
|
+
* the per-process window, exactly as before.
|
|
134
|
+
*/
|
|
135
|
+
valkeyUrl: string | undefined;
|
|
136
|
+
/**
|
|
137
|
+
* The shared-window scope this process shares with its sibling proxies
|
|
138
|
+
* (`sessionScope.ts`); `undefined` = per-process window.
|
|
139
|
+
*/
|
|
140
|
+
sessionScope: string | undefined;
|
|
35
141
|
}
|
|
36
142
|
/**
|
|
37
143
|
* Load the proxy configuration from runtime.env + CLI args + environment.
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,WAAW,WAAW;IAC1B,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAA;IACnB,0DAA0D;IAC1D,eAAe,EAAE,MAAM,CAAA;IACvB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAA;IACd,qFAAqF;IACrF,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAC3B,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAA;IACtB,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAA;IACnB,6EAA6E;IAC7E,QAAQ,EAAE,OAAO,CAAA;IACjB;;;;;;;OAOG;IACH,YAAY,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,UAAU,EAAE,OAAO,CAAA;IACnB;;;;;;;;OAQG;IACH,UAAU,EAAE,MAAM,CAAA;IAClB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IAChC;;;;;;;OAOG;IACH,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC;;;;;;;;;;;OAWG;IACH,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAA;IACpC;;;;;;;;;;;;OAYG;IACH,cAAc,EAAE,SAAS,GAAG,MAAM,GAAG,KAAK,CAAA;IAC1C;;;;;;;;;;;OAWG;IACH,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC,CAAA;IACvE;;;;;;;;;;;OAWG;IACH,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B;;;;;;;OAOG;IACH,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;CACjC;AAyHD;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,WAAW,CAAC,CA+G7F"}
|
package/dist/config.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
9
|
import * as node_fs from 'node:fs/promises';
|
|
10
|
+
import { deriveSessionScope } from './sessionScope.js';
|
|
10
11
|
import * as node_os from 'node:os';
|
|
11
12
|
import * as node_path from 'node:path';
|
|
12
13
|
const DEFAULT_EVENTS_PATH = node_path.join(node_os.homedir(), '.intutic', 'events', 'hook-events.jsonl');
|
|
@@ -41,23 +42,92 @@ async function parseEnvFile(filePath) {
|
|
|
41
42
|
return result;
|
|
42
43
|
}
|
|
43
44
|
/**
|
|
44
|
-
* Parse CLI arguments for --workspace-id
|
|
45
|
+
* Parse CLI arguments for --workspace-id, --server-name, --remote-url,
|
|
46
|
+
* --remote-transport, and the real server command (after --).
|
|
45
47
|
*/
|
|
46
48
|
function parseCliArgs(argv) {
|
|
47
49
|
let workspaceId;
|
|
50
|
+
let serverName;
|
|
51
|
+
let remoteUrl;
|
|
52
|
+
let remoteTransport;
|
|
48
53
|
let separatorIndex = -1;
|
|
49
54
|
for (let i = 0; i < argv.length; i++) {
|
|
50
55
|
if (argv[i] === '--workspace-id' && i + 1 < argv.length) {
|
|
51
56
|
workspaceId = argv[i + 1];
|
|
52
57
|
i++; // skip value
|
|
53
58
|
}
|
|
59
|
+
else if (argv[i] === '--server-name' && i + 1 < argv.length) {
|
|
60
|
+
serverName = argv[i + 1];
|
|
61
|
+
i++; // skip value
|
|
62
|
+
}
|
|
63
|
+
else if (argv[i] === '--remote-url' && i + 1 < argv.length) {
|
|
64
|
+
remoteUrl = argv[i + 1];
|
|
65
|
+
i++; // skip value
|
|
66
|
+
}
|
|
67
|
+
else if (argv[i] === '--remote-transport' && i + 1 < argv.length) {
|
|
68
|
+
remoteTransport = argv[i + 1];
|
|
69
|
+
i++; // skip value
|
|
70
|
+
}
|
|
54
71
|
else if (argv[i] === '--') {
|
|
55
72
|
separatorIndex = i;
|
|
56
73
|
break;
|
|
57
74
|
}
|
|
58
75
|
}
|
|
59
76
|
const realServerCommand = separatorIndex !== -1 ? argv.slice(separatorIndex + 1) : [];
|
|
60
|
-
return { workspaceId, realServerCommand };
|
|
77
|
+
return { workspaceId, serverName, remoteUrl, remoteTransport, realServerCommand };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Parse `INTUTIC_REMOTE_HEADERS` — a JSON object string of header name/value
|
|
81
|
+
* pairs carried via environment variable rather than argv (see
|
|
82
|
+
* `ProxyConfig.remoteHeaders`'s doc comment for why). Never throws: a
|
|
83
|
+
* missing, malformed, or non-object value degrades to "no extra headers"
|
|
84
|
+
* rather than crashing config load over a bad env var.
|
|
85
|
+
*/
|
|
86
|
+
function parseRemoteHeaders(raw) {
|
|
87
|
+
if (!raw)
|
|
88
|
+
return {};
|
|
89
|
+
let parsed;
|
|
90
|
+
try {
|
|
91
|
+
parsed = JSON.parse(raw);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return {};
|
|
95
|
+
}
|
|
96
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
|
|
97
|
+
return {};
|
|
98
|
+
const headers = {};
|
|
99
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
100
|
+
if (typeof value === 'string')
|
|
101
|
+
headers[key] = value;
|
|
102
|
+
}
|
|
103
|
+
return headers;
|
|
104
|
+
}
|
|
105
|
+
const VALID_ANOMALY_OVERRIDE_VALUES = new Set(['steer', 'reask', 'kill', 'off']);
|
|
106
|
+
/**
|
|
107
|
+
* Parse `INTUTIC_MCP_ANOMALY_OVERRIDES` — a JSON object string of detector-id
|
|
108
|
+
* → disposition-override pairs. Never throws: a missing, malformed, or
|
|
109
|
+
* non-object value degrades to "no overrides," same posture as
|
|
110
|
+
* `parseRemoteHeaders`.
|
|
111
|
+
*/
|
|
112
|
+
function parseAnomalyOverrides(raw) {
|
|
113
|
+
if (!raw)
|
|
114
|
+
return {};
|
|
115
|
+
let parsed;
|
|
116
|
+
try {
|
|
117
|
+
parsed = JSON.parse(raw);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return {};
|
|
121
|
+
}
|
|
122
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
|
|
123
|
+
return {};
|
|
124
|
+
const overrides = {};
|
|
125
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
126
|
+
if (typeof value === 'string' && VALID_ANOMALY_OVERRIDE_VALUES.has(value)) {
|
|
127
|
+
overrides[key] = value;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return overrides;
|
|
61
131
|
}
|
|
62
132
|
/**
|
|
63
133
|
* Load the proxy configuration from runtime.env + CLI args + environment.
|
|
@@ -65,8 +135,14 @@ function parseCliArgs(argv) {
|
|
|
65
135
|
export async function loadConfig(argv = process.argv.slice(2)) {
|
|
66
136
|
const runtimeEnv = await parseEnvFile(RUNTIME_ENV_PATH);
|
|
67
137
|
const cli = parseCliArgs(argv);
|
|
138
|
+
// `INTUTIC_HOST` is what the sync daemon actually writes to runtime.env
|
|
139
|
+
// (`runtimeEnv.ts`) and what the hook scripts read. This loader read only
|
|
140
|
+
// `INTUTIC_CONTROL_PLANE_URL`, which nothing writes there, so every
|
|
141
|
+
// per-session proxy on a connected machine fetched policy from
|
|
142
|
+
// localhost:3001 unless the shell happened to export the variable (TD-490).
|
|
68
143
|
const controlPlaneUrl = process.env['INTUTIC_CONTROL_PLANE_URL'] ??
|
|
69
144
|
runtimeEnv['INTUTIC_CONTROL_PLANE_URL'] ??
|
|
145
|
+
runtimeEnv['INTUTIC_HOST'] ??
|
|
70
146
|
'http://localhost:3001';
|
|
71
147
|
const apiKey = process.env['INTUTIC_API_KEY'] ??
|
|
72
148
|
runtimeEnv['INTUTIC_API_KEY'] ??
|
|
@@ -79,12 +155,49 @@ export async function loadConfig(argv = process.argv.slice(2)) {
|
|
|
79
155
|
runtimeEnv['INTUTIC_EVENTS_FILE'] ??
|
|
80
156
|
DEFAULT_EVENTS_PATH;
|
|
81
157
|
const failOpen = (runtimeEnv['INTUTIC_MCP_FAIL_OPEN'] ?? 'true').toLowerCase() !== 'false';
|
|
158
|
+
// 'daemon' is honoured downstream: policy.ts routes policy lookups through
|
|
159
|
+
// the daemon's Unix socket when this is set. No warning here — the mode does
|
|
160
|
+
// what it says.
|
|
82
161
|
const mcpProxyMode = runtimeEnv['INTUTIC_MCP_PROXY_MODE'] ?? 'per-session';
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
162
|
+
const serverName = cli.serverName ?? 'unknown';
|
|
163
|
+
// Remote (HTTP/SSE) bridge mode and stdio proxy mode are mutually
|
|
164
|
+
// exclusive upstream modes — `--remote-url` together with a positional
|
|
165
|
+
// stdio command (`--` followed by a command) is a config error, not a
|
|
166
|
+
// "remote wins" or "stdio wins" fallback. Caught here rather than left to
|
|
167
|
+
// whichever of remoteBridge.ts/runProxy happened to be invoked, so the
|
|
168
|
+
// failure surfaces at config-load time with a clear reason (index.ts's
|
|
169
|
+
// existing `loadConfig` catch already writes config errors to stderr and
|
|
170
|
+
// exits 1 — this reuses that path, not a new one).
|
|
171
|
+
if (cli.remoteUrl !== undefined && cli.realServerCommand.length > 0) {
|
|
172
|
+
throw new Error('Configuration error: --remote-url and a stdio server command (after --) are ' +
|
|
173
|
+
'mutually exclusive upstream modes. Wrap either a remote (HTTP/SSE) MCP server ' +
|
|
174
|
+
'(--remote-url) or a local stdio command (-- <command> [args...]), not both.');
|
|
175
|
+
}
|
|
176
|
+
let remoteTransport;
|
|
177
|
+
if (cli.remoteUrl !== undefined) {
|
|
178
|
+
if (cli.remoteTransport === undefined) {
|
|
179
|
+
// StreamableHTTPClientTransport is the SDK's current, non-deprecated
|
|
180
|
+
// transport — SSEClientTransport exists only for servers that have not
|
|
181
|
+
// migrated off the older SSE transport, so it defaults on rather than off.
|
|
182
|
+
remoteTransport = 'http';
|
|
183
|
+
}
|
|
184
|
+
else if (cli.remoteTransport === 'sse' || cli.remoteTransport === 'http') {
|
|
185
|
+
remoteTransport = cli.remoteTransport;
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
throw new Error(`Configuration error: --remote-transport must be "sse" or "http" (got "${cli.remoteTransport}").`);
|
|
189
|
+
}
|
|
86
190
|
}
|
|
87
|
-
const standalone = cli.realServerCommand.length === 0;
|
|
191
|
+
const standalone = cli.realServerCommand.length === 0 && cli.remoteUrl === undefined;
|
|
192
|
+
const mcpInjectionAction = (process.env['INTUTIC_MCP_INJECTION_ACTION'] ?? runtimeEnv['INTUTIC_MCP_INJECTION_ACTION']) === 'block'
|
|
193
|
+
? 'block'
|
|
194
|
+
: 'warn';
|
|
195
|
+
const valkeyUrl = (process.env['INTUTIC_VALKEY_URL'] ?? process.env['VALKEY_URL'] ?? runtimeEnv['INTUTIC_VALKEY_URL'] ?? '').trim() || undefined;
|
|
196
|
+
// Derived here, in the already-async loader, so the proxy constructor stays
|
|
197
|
+
// synchronous and tests can hand a scope in directly.
|
|
198
|
+
const sessionScope = await deriveSessionScope(workspaceId);
|
|
199
|
+
const rawAnomalyMode = process.env['INTUTIC_MCP_ANOMALY_MODE'] ?? runtimeEnv['INTUTIC_MCP_ANOMALY_MODE'];
|
|
200
|
+
const mcpAnomalyMode = rawAnomalyMode === 'warn' || rawAnomalyMode === 'off' ? rawAnomalyMode : 'enforce';
|
|
88
201
|
return {
|
|
89
202
|
workspaceId,
|
|
90
203
|
controlPlaneUrl,
|
|
@@ -95,6 +208,16 @@ export async function loadConfig(argv = process.argv.slice(2)) {
|
|
|
95
208
|
failOpen,
|
|
96
209
|
mcpProxyMode,
|
|
97
210
|
standalone,
|
|
211
|
+
serverName,
|
|
212
|
+
remoteUrl: cli.remoteUrl,
|
|
213
|
+
remoteTransport,
|
|
214
|
+
remoteHeaders: parseRemoteHeaders(process.env['INTUTIC_REMOTE_HEADERS']),
|
|
215
|
+
mcpInjectionAction,
|
|
216
|
+
mcpAnomalyMode,
|
|
217
|
+
mcpAnomalyOverrides: parseAnomalyOverrides(process.env['INTUTIC_MCP_ANOMALY_OVERRIDES']),
|
|
218
|
+
mcpWasmDir: runtimeEnv['INTUTIC_WASM_LOCAL_DIR'] || undefined,
|
|
219
|
+
valkeyUrl,
|
|
220
|
+
sessionScope,
|
|
98
221
|
};
|
|
99
222
|
}
|
|
100
223
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAClC,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"healthMonitor.d.ts","sourceRoot":"","sources":["../../src/daemon/healthMonitor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"healthMonitor.d.ts","sourceRoot":"","sources":["../../src/daemon/healthMonitor.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAM,MAAM,CAAA;IAChB,GAAG,EAAO,MAAM,CAAA;IAChB,kBAAkB,CAAC,EAAE,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAW,MAAM,CAAA;IAC3B,MAAM,EAAe,SAAS,GAAG,UAAU,GAAG,aAAa,CAAA;IAC3D,YAAY,CAAC,EAAQ,MAAM,CAAA;IAC3B,YAAY,CAAC,EAAQ,MAAM,CAAA;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,SAAS,EAAY,MAAM,CAAA;CAC5B;AAoID,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAE5D;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAyBzC;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED,wBAAgB,iBAAiB,IAAI,eAAe,EAAE,CAErD"}
|
|
@@ -17,12 +17,39 @@ import { createLogger } from '@intutic/logger';
|
|
|
17
17
|
const logger = createLogger('mcp-proxy.healthMonitor');
|
|
18
18
|
const HEARTBEAT_MS = 30_000;
|
|
19
19
|
const PROBE_TIMEOUT = 5_000;
|
|
20
|
-
const CP_URL = process.env['CONTROL_PLANE_URL'] ?? 'http://localhost:3001';
|
|
21
|
-
const DAEMON_API_KEY = process.env['INTUTIC_API_KEY'] ?? '';
|
|
22
|
-
const WORKSPACE_ID = process.env['INTUTIC_WORKSPACE_ID'] ?? '';
|
|
23
20
|
const servers = [];
|
|
24
21
|
const latestHealth = new Map();
|
|
25
22
|
let timer = null;
|
|
23
|
+
function isRecord(value) {
|
|
24
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Pulls the server map out of a parsed harness config. The file is written by
|
|
28
|
+
* Claude Code / Claude Desktop / Cursor, not by us, so its contents are
|
|
29
|
+
* `unknown` until checked: `mcpServers` (or the older `mcp`) may be absent, or
|
|
30
|
+
* be a scalar or an array rather than an object.
|
|
31
|
+
*/
|
|
32
|
+
function readServerMap(parsed) {
|
|
33
|
+
if (!isRecord(parsed))
|
|
34
|
+
return {};
|
|
35
|
+
const map = parsed['mcpServers'] ?? parsed['mcp'];
|
|
36
|
+
return isRecord(map) ? map : {};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Derives a probe URL from one entry of a harness config's server map.
|
|
40
|
+
* Returns '' when the entry declares neither a usable `url` nor `command`.
|
|
41
|
+
*/
|
|
42
|
+
function entryToUrl(entry) {
|
|
43
|
+
if (!isRecord(entry))
|
|
44
|
+
return '';
|
|
45
|
+
const url = entry['url'];
|
|
46
|
+
if (typeof url === 'string' && url.length > 0)
|
|
47
|
+
return url;
|
|
48
|
+
const command = entry['command'];
|
|
49
|
+
if (typeof command === 'string' && command.length > 0)
|
|
50
|
+
return `stdio://${command}`;
|
|
51
|
+
return '';
|
|
52
|
+
}
|
|
26
53
|
function discoverServers() {
|
|
27
54
|
const discovered = [];
|
|
28
55
|
const homedir = os.homedir();
|
|
@@ -45,18 +72,10 @@ function discoverServers() {
|
|
|
45
72
|
continue;
|
|
46
73
|
const raw = fs.readFileSync(configPath, 'utf8');
|
|
47
74
|
const parsed = JSON.parse(raw);
|
|
48
|
-
const
|
|
49
|
-
for (const [name, entry] of Object.entries(mcpServers)) {
|
|
75
|
+
for (const [name, entry] of Object.entries(readServerMap(parsed))) {
|
|
50
76
|
if (name === 'intutic')
|
|
51
77
|
continue; // Skip self
|
|
52
|
-
const
|
|
53
|
-
let url = '';
|
|
54
|
-
if (serverEntry.url) {
|
|
55
|
-
url = serverEntry.url;
|
|
56
|
-
}
|
|
57
|
-
else if (serverEntry.command) {
|
|
58
|
-
url = `stdio://${serverEntry.command}`;
|
|
59
|
-
}
|
|
78
|
+
const url = entryToUrl(entry);
|
|
60
79
|
if (url && !discovered.some(s => s.name === name)) {
|
|
61
80
|
discovered.push({
|
|
62
81
|
name,
|
|
@@ -66,7 +85,14 @@ function discoverServers() {
|
|
|
66
85
|
}
|
|
67
86
|
}
|
|
68
87
|
}
|
|
69
|
-
catch {
|
|
88
|
+
catch {
|
|
89
|
+
// This config path belongs to a harness the user may not have installed,
|
|
90
|
+
// so an unreadable or malformed file is the expected case, not an error:
|
|
91
|
+
// discovery probes Claude Code, Claude Desktop and Cursor locations and
|
|
92
|
+
// most machines have only one. Skip this path and keep discovering the
|
|
93
|
+
// others — a parse failure on one config must not cost us the servers
|
|
94
|
+
// declared in the rest.
|
|
95
|
+
}
|
|
70
96
|
}
|
|
71
97
|
return discovered;
|
|
72
98
|
}
|
|
@@ -118,35 +144,6 @@ async function probeServer(server) {
|
|
|
118
144
|
}
|
|
119
145
|
});
|
|
120
146
|
}
|
|
121
|
-
async function uploadSnapshots(snapshots) {
|
|
122
|
-
if (snapshots.length === 0 || !WORKSPACE_ID)
|
|
123
|
-
return;
|
|
124
|
-
const body = JSON.stringify({ mcpServers: snapshots });
|
|
125
|
-
const url = new URL('/api/v1/mcp-daemon/health-snapshot', CP_URL);
|
|
126
|
-
const isHttps = url.protocol === 'https:';
|
|
127
|
-
const lib = isHttps ? https : http;
|
|
128
|
-
return new Promise((resolve) => {
|
|
129
|
-
const req = lib.request({
|
|
130
|
-
hostname: url.hostname,
|
|
131
|
-
port: url.port,
|
|
132
|
-
path: url.pathname,
|
|
133
|
-
method: 'POST',
|
|
134
|
-
headers: {
|
|
135
|
-
'Content-Type': 'application/json',
|
|
136
|
-
'Content-Length': Buffer.byteLength(body),
|
|
137
|
-
'Authorization': `Bearer ${DAEMON_API_KEY}`,
|
|
138
|
-
'x-workspace-id': WORKSPACE_ID
|
|
139
|
-
}
|
|
140
|
-
}, (res) => {
|
|
141
|
-
res.resume();
|
|
142
|
-
resolve();
|
|
143
|
-
});
|
|
144
|
-
req.on('error', () => resolve());
|
|
145
|
-
req.setTimeout(5000, () => { req.destroy(); resolve(); });
|
|
146
|
-
req.write(body);
|
|
147
|
-
req.end();
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
147
|
export function registerServer(server) {
|
|
151
148
|
servers.push(server);
|
|
152
149
|
}
|
|
@@ -167,9 +164,11 @@ export function startHealthMonitor() {
|
|
|
167
164
|
logger.warn({ serverName: server.name }, 'mcp_daemon.mcp_server_down');
|
|
168
165
|
}
|
|
169
166
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
167
|
+
// Health stays local: getHealthSnapshot()/latestHealth serve the proxy's
|
|
168
|
+
// own health_check. The former uploader posted to
|
|
169
|
+
// /api/v1/mcp-daemon/health-snapshot, a route stripped from the control
|
|
170
|
+
// plane — every 30s heartbeat silently 404'd and the snapshots were
|
|
171
|
+
// discarded. Restore an ingest route before re-adding an upload.
|
|
173
172
|
}, HEARTBEAT_MS);
|
|
174
173
|
timer.unref();
|
|
175
174
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"healthMonitor.js","sourceRoot":"","sources":["../../src/daemon/healthMonitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,IAAI,MAAO,WAAW,CAAA;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,MAAM,MAAM,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAA;AAEtD,MAAM,YAAY,GAAG,MAAM,CAAA;AAC3B,MAAM,aAAa,GAAG,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"healthMonitor.js","sourceRoot":"","sources":["../../src/daemon/healthMonitor.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/index.d.ts
CHANGED
|
@@ -1,2 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* intutic-mcp-daemon entry point
|
|
3
|
+
*
|
|
4
|
+
* Long-lived process listening on ~/.intutic/mcp-proxy.sock.
|
|
5
|
+
* Manages policy cache, telemetry batching, and MCP server health monitoring.
|
|
6
|
+
*
|
|
7
|
+
* LLD #28: MCP Daemon Mode, WS-5MCP
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* node dist/daemon/index.js
|
|
11
|
+
* (managed by LaunchAgent / systemd via `intutic daemon mcp start`)
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
import './instrumentation.js';
|
|
2
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,sBAAsB,CAAA"}
|