@intutic/sync-daemon 2.2.0 → 2.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.
- package/README.md +1 -1
- package/dist/agentReporter.d.ts +23 -11
- package/dist/agentReporter.d.ts.map +1 -1
- package/dist/agentReporter.js +20 -13
- package/dist/agentReporter.js.map +1 -1
- package/dist/configReader.d.ts +1 -3
- package/dist/configReader.d.ts.map +1 -1
- package/dist/configReader.js +0 -2
- package/dist/configReader.js.map +1 -1
- package/dist/configWriter.d.ts +11 -12
- package/dist/configWriter.d.ts.map +1 -1
- package/dist/configWriter.js +35 -58
- package/dist/configWriter.js.map +1 -1
- package/dist/disconnect/harnesses.d.ts +0 -2
- package/dist/disconnect/harnesses.d.ts.map +1 -1
- package/dist/disconnect/harnesses.js +157 -80
- package/dist/disconnect/harnesses.js.map +1 -1
- package/dist/disconnect/index.d.ts.map +1 -1
- package/dist/disconnect/index.js +11 -1
- package/dist/disconnect/index.js.map +1 -1
- package/dist/disconnect/mcp.d.ts +21 -0
- package/dist/disconnect/mcp.d.ts.map +1 -1
- package/dist/disconnect/mcp.js +71 -0
- package/dist/disconnect/mcp.js.map +1 -1
- package/dist/disconnect/recognise.d.ts +2 -2
- package/dist/disconnect/recognise.d.ts.map +1 -1
- package/dist/disconnect/recognise.js +15 -5
- package/dist/disconnect/recognise.js.map +1 -1
- package/dist/harness/aiderConfigMerger.d.ts +28 -8
- package/dist/harness/aiderConfigMerger.d.ts.map +1 -1
- package/dist/harness/aiderConfigMerger.js +59 -11
- package/dist/harness/aiderConfigMerger.js.map +1 -1
- package/dist/harness/antigravityCliHooks.d.ts +61 -0
- package/dist/harness/antigravityCliHooks.d.ts.map +1 -0
- package/dist/harness/antigravityCliHooks.js +207 -0
- package/dist/harness/antigravityCliHooks.js.map +1 -0
- package/dist/harness/antigravityHooks.d.ts +12 -2
- package/dist/harness/antigravityHooks.d.ts.map +1 -1
- package/dist/harness/antigravityHooks.js +36 -16
- package/dist/harness/antigravityHooks.js.map +1 -1
- package/dist/harness/antigravityProducts.d.ts +40 -0
- package/dist/harness/antigravityProducts.d.ts.map +1 -0
- package/dist/harness/antigravityProducts.js +109 -0
- package/dist/harness/antigravityProducts.js.map +1 -0
- package/dist/harness/claudeAgentsMd.d.ts +29 -0
- package/dist/harness/claudeAgentsMd.d.ts.map +1 -0
- package/dist/harness/claudeAgentsMd.js +80 -0
- package/dist/harness/claudeAgentsMd.js.map +1 -0
- package/dist/harness/claudeCodeHooks.d.ts +6 -5
- package/dist/harness/claudeCodeHooks.d.ts.map +1 -1
- package/dist/harness/claudeCodeHooks.js +98 -24
- package/dist/harness/claudeCodeHooks.js.map +1 -1
- package/dist/harness/clineHooks.d.ts +0 -1
- package/dist/harness/clineHooks.d.ts.map +1 -1
- package/dist/harness/clineHooks.js +10 -4
- package/dist/harness/clineHooks.js.map +1 -1
- package/dist/harness/codexHooks.d.ts +2 -0
- package/dist/harness/codexHooks.d.ts.map +1 -1
- package/dist/harness/codexHooks.js +12 -4
- package/dist/harness/codexHooks.js.map +1 -1
- package/dist/harness/cursorHooks.d.ts +5 -2
- package/dist/harness/cursorHooks.d.ts.map +1 -1
- package/dist/harness/cursorHooks.js +9 -3
- package/dist/harness/cursorHooks.js.map +1 -1
- package/dist/harness/dshHooks.d.ts +5 -5
- package/dist/harness/dshHooks.d.ts.map +1 -1
- package/dist/harness/dshHooks.js +5 -5
- package/dist/harness/gateArtifacts.d.ts +35 -0
- package/dist/harness/gateArtifacts.d.ts.map +1 -0
- package/dist/harness/gateArtifacts.js +88 -0
- package/dist/harness/gateArtifacts.js.map +1 -0
- package/dist/harness/gateBody.d.ts +186 -69
- package/dist/harness/gateBody.d.ts.map +1 -1
- package/dist/harness/gateBody.js +820 -182
- package/dist/harness/gateBody.js.map +1 -1
- package/dist/harness/gateSightings.d.ts +47 -0
- package/dist/harness/gateSightings.d.ts.map +1 -0
- package/dist/harness/gateSightings.js +159 -0
- package/dist/harness/gateSightings.js.map +1 -0
- package/dist/harness/githubCopilotHooks.d.ts.map +1 -1
- package/dist/harness/githubCopilotHooks.js +7 -1
- package/dist/harness/githubCopilotHooks.js.map +1 -1
- package/dist/harness/gooseHardener.d.ts +0 -1
- package/dist/harness/gooseHardener.d.ts.map +1 -1
- package/dist/harness/gooseHardener.js +1 -1
- package/dist/harness/gooseHardener.js.map +1 -1
- package/dist/harness/gooseHooks.d.ts +14 -1
- package/dist/harness/gooseHooks.d.ts.map +1 -1
- package/dist/harness/gooseHooks.js +55 -29
- package/dist/harness/gooseHooks.js.map +1 -1
- package/dist/harness/grokHooks.d.ts +2 -2
- package/dist/harness/grokHooks.d.ts.map +1 -1
- package/dist/harness/grokHooks.js +11 -6
- package/dist/harness/grokHooks.js.map +1 -1
- package/dist/harness/hermesHooks.d.ts +18 -8
- package/dist/harness/hermesHooks.d.ts.map +1 -1
- package/dist/harness/hermesHooks.js +48 -17
- package/dist/harness/hermesHooks.js.map +1 -1
- package/dist/harness/mcpAutoWrite.d.ts +24 -9
- package/dist/harness/mcpAutoWrite.d.ts.map +1 -1
- package/dist/harness/mcpAutoWrite.js +218 -25
- package/dist/harness/mcpAutoWrite.js.map +1 -1
- package/dist/harness/museHooks.d.ts +3 -3
- package/dist/harness/museHooks.d.ts.map +1 -1
- package/dist/harness/museHooks.js +9 -5
- package/dist/harness/museHooks.js.map +1 -1
- package/dist/harness/n8nHooks.d.ts +0 -1
- package/dist/harness/n8nHooks.d.ts.map +1 -1
- package/dist/harness/n8nHooks.js +4 -1
- package/dist/harness/n8nHooks.js.map +1 -1
- package/dist/harness/openCodeHooks.d.ts +2 -2
- package/dist/harness/openCodeHooks.d.ts.map +1 -1
- package/dist/harness/openCodeHooks.js +7 -3
- package/dist/harness/openCodeHooks.js.map +1 -1
- package/dist/harness/openWebuiHooks.d.ts +0 -1
- package/dist/harness/openWebuiHooks.d.ts.map +1 -1
- package/dist/harness/openWebuiHooks.js +5 -1
- package/dist/harness/openWebuiHooks.js.map +1 -1
- package/dist/harness/openclawHooks.d.ts +70 -18
- package/dist/harness/openclawHooks.d.ts.map +1 -1
- package/dist/harness/openclawHooks.js +213 -161
- package/dist/harness/openclawHooks.js.map +1 -1
- package/dist/harness/openhandsHooks.d.ts +24 -10
- package/dist/harness/openhandsHooks.d.ts.map +1 -1
- package/dist/harness/openhandsHooks.js +49 -48
- package/dist/harness/openhandsHooks.js.map +1 -1
- package/dist/harness/piHooks.d.ts +52 -17
- package/dist/harness/piHooks.d.ts.map +1 -1
- package/dist/harness/piHooks.js +177 -166
- package/dist/harness/piHooks.js.map +1 -1
- package/dist/harness/protectedPaths.d.ts +107 -25
- package/dist/harness/protectedPaths.d.ts.map +1 -1
- package/dist/harness/protectedPaths.js +342 -48
- package/dist/harness/protectedPaths.js.map +1 -1
- package/dist/harness/rulesSection.d.ts +62 -0
- package/dist/harness/rulesSection.d.ts.map +1 -0
- package/dist/harness/rulesSection.js +145 -0
- package/dist/harness/rulesSection.js.map +1 -0
- package/dist/harness/windsurfHooks.d.ts +0 -1
- package/dist/harness/windsurfHooks.d.ts.map +1 -1
- package/dist/harness/windsurfHooks.js +4 -1
- package/dist/harness/windsurfHooks.js.map +1 -1
- package/dist/index.d.ts +12 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -9
- package/dist/index.js.map +1 -1
- package/dist/inventory.d.ts +53 -0
- package/dist/inventory.d.ts.map +1 -0
- package/dist/inventory.js +133 -0
- package/dist/inventory.js.map +1 -0
- package/dist/lib/complianceProbes.d.ts +2 -1
- package/dist/lib/complianceProbes.d.ts.map +1 -1
- package/dist/lib/complianceProbes.js +1 -1
- package/dist/lib/complianceProbes.js.map +1 -1
- package/dist/lib/decisionsDigest.d.ts +34 -16
- package/dist/lib/decisionsDigest.d.ts.map +1 -1
- package/dist/lib/decisionsDigest.js +105 -46
- package/dist/lib/decisionsDigest.js.map +1 -1
- package/dist/lib/egressPolicy.d.ts +2 -2
- package/dist/lib/egressPolicy.js +2 -2
- package/dist/lib/mcpRegistryPy.d.ts +11 -0
- package/dist/lib/mcpRegistryPy.d.ts.map +1 -0
- package/dist/lib/mcpRegistryPy.js +173 -0
- package/dist/lib/mcpRegistryPy.js.map +1 -0
- package/dist/lib/phrasesPy.d.ts +11 -0
- package/dist/lib/phrasesPy.d.ts.map +1 -0
- package/dist/lib/phrasesPy.js +351 -0
- package/dist/lib/phrasesPy.js.map +1 -0
- package/dist/lib/policySnapshot.d.ts +46 -10
- package/dist/lib/policySnapshot.d.ts.map +1 -1
- package/dist/lib/policySnapshot.js +136 -47
- package/dist/lib/policySnapshot.js.map +1 -1
- package/dist/lib/processPoller.d.ts.map +1 -1
- package/dist/lib/processPoller.js +9 -2
- package/dist/lib/processPoller.js.map +1 -1
- package/dist/lib/regexLinearity.d.ts +43 -0
- package/dist/lib/regexLinearity.d.ts.map +1 -0
- package/dist/lib/regexLinearity.js +275 -0
- package/dist/lib/regexLinearity.js.map +1 -0
- package/dist/lib/runtimeEnv.d.ts +1 -3
- package/dist/lib/runtimeEnv.d.ts.map +1 -1
- package/dist/lib/runtimeEnv.js +0 -2
- package/dist/lib/runtimeEnv.js.map +1 -1
- package/dist/lib/sequencePy.d.ts +10 -0
- package/dist/lib/sequencePy.d.ts.map +1 -0
- package/dist/lib/sequencePy.js +102 -0
- package/dist/lib/sequencePy.js.map +1 -0
- package/dist/sessionReporter.d.ts +17 -11
- package/dist/sessionReporter.d.ts.map +1 -1
- package/dist/sessionReporter.js +36 -23
- package/dist/sessionReporter.js.map +1 -1
- package/dist/skillWriter.d.ts +23 -5
- package/dist/skillWriter.d.ts.map +1 -1
- package/dist/skillWriter.js +159 -16
- package/dist/skillWriter.js.map +1 -1
- package/dist/syncCycle.d.ts.map +1 -1
- package/dist/syncCycle.js +21 -9
- package/dist/syncCycle.js.map +1 -1
- package/dist/trajectoryMonitor.d.ts +1 -3
- package/dist/trajectoryMonitor.d.ts.map +1 -1
- package/dist/trajectoryMonitor.js +1 -4
- package/dist/trajectoryMonitor.js.map +1 -1
- package/dist/watcher/driftWatcher.d.ts +0 -1
- package/dist/watcher/driftWatcher.d.ts.map +1 -1
- package/dist/watcher/driftWatcher.js +1 -2
- package/dist/watcher/driftWatcher.js.map +1 -1
- package/dist/watcher/settingsGuard.d.ts +33 -7
- package/dist/watcher/settingsGuard.d.ts.map +1 -1
- package/dist/watcher/settingsGuard.js +373 -61
- package/dist/watcher/settingsGuard.js.map +1 -1
- package/dist/watcher/vscodeHookSettings.d.ts +30 -0
- package/dist/watcher/vscodeHookSettings.d.ts.map +1 -0
- package/dist/watcher/vscodeHookSettings.js +170 -0
- package/dist/watcher/vscodeHookSettings.js.map +1 -0
- package/dist/wsClient.d.ts +0 -1
- package/dist/wsClient.d.ts.map +1 -1
- package/dist/wsClient.js +0 -1
- package/dist/wsClient.js.map +1 -1
- package/package.json +5 -5
- package/dist/harness/claudeDesktopHooks.d.ts +0 -33
- package/dist/harness/claudeDesktopHooks.d.ts.map +0 -1
- package/dist/harness/claudeDesktopHooks.js +0 -256
- package/dist/harness/claudeDesktopHooks.js.map +0 -1
- package/dist/harness/continueHooks.d.ts +0 -63
- package/dist/harness/continueHooks.d.ts.map +0 -1
- package/dist/harness/continueHooks.js +0 -250
- package/dist/harness/continueHooks.js.map +0 -1
- package/dist/harness/gateKind.d.ts +0 -164
- package/dist/harness/gateKind.d.ts.map +0 -1
- package/dist/harness/gateKind.js +0 -144
- package/dist/harness/gateKind.js.map +0 -1
- package/dist/harness/rooCodeHooks.d.ts +0 -31
- package/dist/harness/rooCodeHooks.d.ts.map +0 -1
- package/dist/harness/rooCodeHooks.js +0 -281
- package/dist/harness/rooCodeHooks.js.map +0 -1
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
* policy-snapshot evaluation), and — this is the part that is independently
|
|
21
21
|
* confirmed, unlike Muse Code's — signals a block by writing
|
|
22
22
|
* `{"decision":"deny","reason":"..."}` as JSON on **stdout** and exiting 0.
|
|
23
|
-
* That is a *different* stdout shape from Cline
|
|
24
|
-
* — Grok Build does not recognise `cancel`, and Cline
|
|
23
|
+
* That is a *different* stdout shape from Cline's `{"cancel":true}`
|
|
24
|
+
* — Grok Build does not recognise `cancel`, and Cline does not
|
|
25
25
|
* recognise `decision` — so this writer uses its own `BlockContract` value,
|
|
26
26
|
* `'stdout-decision-deny'` (see gateBody.ts's module doc for why the two
|
|
27
27
|
* stdout shapes are not folded into one contract), rather than reusing
|
|
@@ -71,7 +71,7 @@ import * as os from 'node:os';
|
|
|
71
71
|
import { parse as parseToml, stringify as stringifyToml } from 'smol-toml';
|
|
72
72
|
import { createLogger } from '@intutic/logger';
|
|
73
73
|
import { keepOriginal, writeOwnedFile } from '../disconnect/originals.js';
|
|
74
|
-
import { openaiBaseUrl } from '@intutic/shared-types';
|
|
74
|
+
import { HOOK_GATE_TIMEOUTS, openaiBaseUrl } from '@intutic/shared-types';
|
|
75
75
|
import { newIso } from '@intutic/id';
|
|
76
76
|
import { emitJsGate, emitJsFailClosedPrelude } from './gateBody.js';
|
|
77
77
|
const log = createLogger('sync-grok-hooks');
|
|
@@ -119,8 +119,9 @@ function buildHookRegistration(hookScriptPath) {
|
|
|
119
119
|
// Grok Build's documented default; stated explicitly rather than
|
|
120
120
|
// left to fall back, since a local policy-snapshot evaluation is
|
|
121
121
|
// cheap but a future default change upstream should not silently
|
|
122
|
-
// starve this hook.
|
|
123
|
-
|
|
122
|
+
// starve this hook. The gate's deadline is derived from it
|
|
123
|
+
// (gateDeadlineMs), because Grok Build runs the call when it expires.
|
|
124
|
+
timeout: HOOK_GATE_TIMEOUTS.grok.timeoutMs / 1000,
|
|
124
125
|
},
|
|
125
126
|
],
|
|
126
127
|
},
|
|
@@ -162,6 +163,9 @@ function logEvent(verdict, toolName, reason) {
|
|
|
162
163
|
try {
|
|
163
164
|
const ts = new Date().toISOString();
|
|
164
165
|
const incidentId = crypto.createHash('sha1').update(ts + toolName + _intuticWsId).digest('hex').slice(0, 16);
|
|
166
|
+
// The event's id: random, made once here, and resent with the line it is
|
|
167
|
+
// written into, so the control plane processes the event once.
|
|
168
|
+
const eventId = crypto.randomBytes(16).toString('hex');
|
|
165
169
|
const entry = JSON.stringify({
|
|
166
170
|
// Passed through, not collapsed to two values: the advisory tier emits
|
|
167
171
|
// 'tool_flagged', and a ternary here silently recorded it as an allow.
|
|
@@ -171,6 +175,7 @@ function logEvent(verdict, toolName, reason) {
|
|
|
171
175
|
harnessType: 'grok',
|
|
172
176
|
timestamp: ts,
|
|
173
177
|
incidentId,
|
|
178
|
+
eventId,
|
|
174
179
|
...(_intuticSessionId ? { sessionId: _intuticSessionId } : {}),
|
|
175
180
|
}) + '\\n';
|
|
176
181
|
fs.appendFileSync(${JSON.stringify(hookEventsLog)}, entry, { flag: 'a' });
|
|
@@ -212,7 +217,7 @@ process.stdin.on('end', () => {
|
|
|
212
217
|
const errMsg = String(err);
|
|
213
218
|
process.stderr.write('[Intutic Governance] Hook error (fail-closed): ' + errMsg + '\\n');
|
|
214
219
|
logEvent('tool_blocked', 'unknown', errMsg);
|
|
215
|
-
process.stdout.write(JSON.stringify({ decision: 'deny', reason: '[Intutic Governance] Hook error (fail-closed): ' + errMsg }) + '\\n');
|
|
220
|
+
process.stdout.write(JSON.stringify({ decision: 'deny', reason: '[Intutic Governance] Hook error (fail-closed): ' + errMsg, code: 'GATE_CRASHED', ruleId: null }) + '\\n');
|
|
216
221
|
process.exit(0);
|
|
217
222
|
}
|
|
218
223
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grokHooks.js","sourceRoot":"","sources":["../../src/harness/grokHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkEG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,WAAW,CAAA;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"grokHooks.js","sourceRoot":"","sources":["../../src/harness/grokHooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* hermesHooks.ts — Hermes AI agent governance hook injection.
|
|
3
3
|
*
|
|
4
4
|
* Hermes is a skills-based AI agent that reads `~/.hermes/config.yaml`
|
|
5
|
-
* for configuration.
|
|
5
|
+
* for configuration. The gate is a shell hook under `hooks.pre_tool_call`.
|
|
6
6
|
* This module:
|
|
7
7
|
*
|
|
8
8
|
* 1. YAML-safe-merges `~/.hermes/config.yaml` to register the hook command.
|
|
@@ -11,18 +11,28 @@
|
|
|
11
11
|
* 4. Writes `.intutic/env/hermes.env` — env snippet for IDE/shell integration.
|
|
12
12
|
*
|
|
13
13
|
* WS-C1 — Hermes harness (Phase 3 cross-harness defence)
|
|
14
|
-
* LLD #14 — Phase 3 cross-harness defence (Gap 3)
|
|
15
14
|
* HLD §3.14 — Three-Tier Defense Cascade (Tier 1 Native Gating)
|
|
16
15
|
*
|
|
17
16
|
* @module
|
|
18
17
|
*/
|
|
19
18
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
|
|
19
|
+
* The gate's shell-hook entry: \`fail_closed\` makes Hermes refuse the call
|
|
20
|
+
* when the gate times out, crashes or prints something it cannot read, where
|
|
21
|
+
* its default runs it; \`timeout\` replaces Hermes's 60 s default, and the
|
|
22
|
+
* gate refuses at its own deadline inside it. Hermes splits \`command\` with
|
|
23
|
+
* shlex, so a path with a space or a quote in it is quoted.
|
|
24
|
+
*/
|
|
25
|
+
export declare function hermesHookEntry(hookScriptPath: string): Record<string, unknown>;
|
|
26
|
+
/**
|
|
27
|
+
* Merge the hook registration into the Hermes config: the gate's entry is put
|
|
28
|
+
* in the \`hooks.pre_tool_call\` list, replacing an earlier one of ours, and
|
|
29
|
+
* everything else in the file — other hooks, MCP servers, comments — is kept.
|
|
30
|
+
* Edited through the \`yaml\` document model. A file that does not parse, or
|
|
31
|
+
* is not a mapping, or holds \`hooks\` or \`pre_tool_call\` in a shape Hermes
|
|
32
|
+
* would not read, is left untouched and reported.
|
|
33
|
+
*
|
|
34
|
+
* Earlier versions wrote \`hooks.preToolUse.command\`, which Hermes skips as an
|
|
35
|
+
* unknown event: that registration is removed.
|
|
26
36
|
*/
|
|
27
37
|
export declare function mergeHermesYaml(existing: string, hookScriptPath: string): string | null;
|
|
28
38
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hermesHooks.d.ts","sourceRoot":"","sources":["../../src/harness/hermesHooks.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"hermesHooks.d.ts","sourceRoot":"","sources":["../../src/harness/hermesHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAmGH;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAG/E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsBvF;AA6CD;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,WAAW,SAAK,GACf,OAAO,CAAC,IAAI,CAAC,CAqEf"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* hermesHooks.ts — Hermes AI agent governance hook injection.
|
|
3
3
|
*
|
|
4
4
|
* Hermes is a skills-based AI agent that reads `~/.hermes/config.yaml`
|
|
5
|
-
* for configuration.
|
|
5
|
+
* for configuration. The gate is a shell hook under `hooks.pre_tool_call`.
|
|
6
6
|
* This module:
|
|
7
7
|
*
|
|
8
8
|
* 1. YAML-safe-merges `~/.hermes/config.yaml` to register the hook command.
|
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
* 4. Writes `.intutic/env/hermes.env` — env snippet for IDE/shell integration.
|
|
12
12
|
*
|
|
13
13
|
* WS-C1 — Hermes harness (Phase 3 cross-harness defence)
|
|
14
|
-
* LLD #14 — Phase 3 cross-harness defence (Gap 3)
|
|
15
14
|
* HLD §3.14 — Three-Tier Defense Cascade (Tier 1 Native Gating)
|
|
16
15
|
*
|
|
17
16
|
* @module
|
|
@@ -21,9 +20,10 @@ import * as path from 'node:path';
|
|
|
21
20
|
import * as os from 'node:os';
|
|
22
21
|
import { createLogger } from '@intutic/logger';
|
|
23
22
|
import { keepOriginal, noteWritten } from '../disconnect/originals.js';
|
|
24
|
-
import { parseDocument, isMap } from 'yaml';
|
|
23
|
+
import { parseDocument, isMap, isSeq } from 'yaml';
|
|
25
24
|
import { newIso } from '@intutic/id';
|
|
26
|
-
import {
|
|
25
|
+
import { HOOK_TIMEOUT_SECONDS } from '@intutic/shared-types';
|
|
26
|
+
import { emitShellGate, SHELL_EXTRACT, emitShellFailClosed } from './gateBody.js';
|
|
27
27
|
const log = createLogger('sync-hermes-hooks');
|
|
28
28
|
/** Path to the Hermes global config file. */
|
|
29
29
|
const HERMES_CONFIG = path.join(os.homedir(), '.hermes', 'config.yaml');
|
|
@@ -39,7 +39,7 @@ function buildHermesCheckScript(proxyUrl, workspaceRoot, workspaceId) {
|
|
|
39
39
|
# Generated: ${newIso()}
|
|
40
40
|
# Workspace: ${workspaceId}
|
|
41
41
|
set -euo pipefail
|
|
42
|
-
${
|
|
42
|
+
${emitShellFailClosed('hermes')}
|
|
43
43
|
# Source runtime credentials (never embedded in this file)
|
|
44
44
|
if [ -f "${runtimeEnv}" ]; then
|
|
45
45
|
# shellcheck disable=SC1090
|
|
@@ -79,7 +79,11 @@ log_event() {
|
|
|
79
79
|
local ts; ts="\$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
80
80
|
# incidentId = sha1(timestamp + toolName + workspaceId).slice(0,16)
|
|
81
81
|
local incident_id; incident_id="\$(echo -n \"\${ts}\${tool}\${INTUTIC_WORKSPACE_ID}\" | sha1sum | cut -c1-16)"
|
|
82
|
-
|
|
82
|
+
# The event's id: random, made once here, and resent with the line it is
|
|
83
|
+
# written into, so the control plane processes the event once.
|
|
84
|
+
local event_id; event_id="\$(od -An -N16 -tx1 /dev/urandom 2>/dev/null | tr -d ' \\n' || true)"
|
|
85
|
+
[ -n "\$event_id" ] || event_id="\$(date +%s)\$\$\${RANDOM}\${RANDOM}\${RANDOM}"
|
|
86
|
+
local entry="{\\\"event\\\":\\\"\${verdict}\\\",\\\"toolName\\\":\\\"\${tool}\\\",\\\"reason\\\":\\\"\${reason}\\\",\\\"workspaceId\\\":\\\"\${INTUTIC_WORKSPACE_ID}\\\",\\\"harnessType\\\":\\\"hermes\\\",\\\"incidentId\\\":\\\"\${incident_id}\\\",\\\"eventId\\\":\\\"\${event_id}\\\",\\\"timestamp\\\":\\\"\${ts}\\\"}"
|
|
83
87
|
# Path B: reliable file append (sync-daemon drains on FSEvents change)
|
|
84
88
|
printf '%s\\n' "\$entry" >> "\$HOOK_EVENTS_LOG" 2>/dev/null || true
|
|
85
89
|
# Path A: fire-and-forget HTTP POST (near-real-time dashboard, non-blocking)
|
|
@@ -99,12 +103,26 @@ exit 0
|
|
|
99
103
|
}
|
|
100
104
|
// ─── YAML merge helpers ───────────────────────────────────────────────────────
|
|
101
105
|
/**
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
|
|
106
|
+
* The gate's shell-hook entry: \`fail_closed\` makes Hermes refuse the call
|
|
107
|
+
* when the gate times out, crashes or prints something it cannot read, where
|
|
108
|
+
* its default runs it; \`timeout\` replaces Hermes's 60 s default, and the
|
|
109
|
+
* gate refuses at its own deadline inside it. Hermes splits \`command\` with
|
|
110
|
+
* shlex, so a path with a space or a quote in it is quoted.
|
|
111
|
+
*/
|
|
112
|
+
export function hermesHookEntry(hookScriptPath) {
|
|
113
|
+
const command = /[\s'"\\]/.test(hookScriptPath) ? `'${hookScriptPath.replace(/'/g, `'"'"'`)}'` : hookScriptPath;
|
|
114
|
+
return { command, timeout: HOOK_TIMEOUT_SECONDS, fail_closed: true };
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Merge the hook registration into the Hermes config: the gate's entry is put
|
|
118
|
+
* in the \`hooks.pre_tool_call\` list, replacing an earlier one of ours, and
|
|
119
|
+
* everything else in the file — other hooks, MCP servers, comments — is kept.
|
|
120
|
+
* Edited through the \`yaml\` document model. A file that does not parse, or
|
|
121
|
+
* is not a mapping, or holds \`hooks\` or \`pre_tool_call\` in a shape Hermes
|
|
122
|
+
* would not read, is left untouched and reported.
|
|
123
|
+
*
|
|
124
|
+
* Earlier versions wrote \`hooks.preToolUse.command\`, which Hermes skips as an
|
|
125
|
+
* unknown event: that registration is removed.
|
|
108
126
|
*/
|
|
109
127
|
export function mergeHermesYaml(existing, hookScriptPath) {
|
|
110
128
|
const doc = parseDocument(existing);
|
|
@@ -114,12 +132,25 @@ export function mergeHermesYaml(existing, hookScriptPath) {
|
|
|
114
132
|
doc.contents = doc.createNode({});
|
|
115
133
|
if (!isMap(doc.contents))
|
|
116
134
|
return null;
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
}
|
|
120
|
-
catch {
|
|
121
|
-
// `hooks` or `hooks.preToolUse` is a scalar or list — not a shape to edit.
|
|
135
|
+
const hooks = doc.get('hooks');
|
|
136
|
+
if (hooks !== undefined && hooks !== null && !isMap(hooks))
|
|
122
137
|
return null;
|
|
138
|
+
const legacy = doc.getIn(['hooks', 'preToolUse', 'command']);
|
|
139
|
+
if (typeof legacy === 'string' && legacy.endsWith('hermes-check.sh'))
|
|
140
|
+
doc.deleteIn(['hooks', 'preToolUse']);
|
|
141
|
+
const list = doc.getIn(['hooks', 'pre_tool_call']);
|
|
142
|
+
if (list !== undefined && list !== null && !isSeq(list))
|
|
143
|
+
return null;
|
|
144
|
+
const entry = doc.createNode(hermesHookEntry(hookScriptPath));
|
|
145
|
+
if (isSeq(list)) {
|
|
146
|
+
list.items = list.items.filter((item) => {
|
|
147
|
+
const command = isMap(item) ? item.get('command') : undefined;
|
|
148
|
+
return !(typeof command === 'string' && /hermes-check\.sh'?$/.test(command));
|
|
149
|
+
});
|
|
150
|
+
list.items.push(entry);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
doc.setIn(['hooks', 'pre_tool_call'], doc.createNode([hermesHookEntry(hookScriptPath)]));
|
|
123
154
|
}
|
|
124
155
|
return doc.toString();
|
|
125
156
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hermesHooks.js","sourceRoot":"","sources":["../../src/harness/hermesHooks.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"hermesHooks.js","sourceRoot":"","sources":["../../src/harness/hermesHooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,12 +20,17 @@
|
|
|
20
20
|
* - Grok Build: ~/.grok/config.toml + <workspaceRoot>/.grok/config.toml
|
|
21
21
|
* ([mcp_servers.*] tables)
|
|
22
22
|
* - OpenCode: ~/.config/opencode/opencode.json + <workspaceRoot>/opencode.json
|
|
23
|
-
* (`mcp` block
|
|
23
|
+
* (`mcp` block; see `injectOpenCode`)
|
|
24
|
+
* - Gemini CLI: ~/.gemini/settings.json + <workspaceRoot>/.gemini/settings.json
|
|
25
|
+
* (`mcpServers`)
|
|
26
|
+
* - Antigravity: ~/.gemini/config/mcp_config.json (`mcpServers`)
|
|
27
|
+
* (both under the `antigravity` harness; see `injectAntigravity`)
|
|
24
28
|
*
|
|
25
|
-
* That is
|
|
29
|
+
* That is 17 config paths across 12 `HarnessType` values (Cursor, Grok
|
|
26
30
|
* Build and OpenCode each own two paths — global/project for Cursor and
|
|
27
|
-
* OpenCode, user/project for Grok Build
|
|
28
|
-
*
|
|
31
|
+
* OpenCode, user/project for Grok Build — and the `antigravity` harness
|
|
32
|
+
* three, for its two products). `discoverMcpServers` below reads all
|
|
33
|
+
* seventeen read-only, for reporting, plus Claude Code's project
|
|
29
34
|
* `.mcp.json`; the injectors above are the only thing that writes.
|
|
30
35
|
*
|
|
31
36
|
* # Grok Build's compat-path overlap — dedup, not a bug
|
|
@@ -59,8 +64,9 @@
|
|
|
59
64
|
* `command`-or-`url` shape every other JSON-map harness here uses — `wrapAllServers`
|
|
60
65
|
* / `wrapWithProxy` branch on exactly that, so a `streamable_http` entry is
|
|
61
66
|
* wrapped through the SAME remote-bridge path a `url`-keyed Claude Desktop/
|
|
62
|
-
* Windsurf entry gets, without new code.
|
|
63
|
-
*
|
|
67
|
+
* Windsurf entry gets, without new code. This is recorded as an assumption
|
|
68
|
+
* rather than a confirmation because the `muse` binary could not be installed
|
|
69
|
+
* to check it (see museHooks.ts).
|
|
64
70
|
*
|
|
65
71
|
* Proxy-wrapping convention:
|
|
66
72
|
* Each existing stdio MCP server entry is rewritten so that the governance
|
|
@@ -68,7 +74,7 @@
|
|
|
68
74
|
* after `--`, tagged with `--server-name <name>` so the proxy can attribute
|
|
69
75
|
* traffic to the server it fronts. A `__intutic_wrapped: true` flag is added
|
|
70
76
|
* to prevent double-wrapping. Remote (HTTP/SSE, `url`-keyed) entries are now
|
|
71
|
-
* ALSO wrapped —
|
|
77
|
+
* ALSO wrapped — the stdio→HTTP bridge phase closed the gap this
|
|
72
78
|
* comment used to describe as "left untouched": the entry is rewritten to
|
|
73
79
|
* spawn the SAME proxy binary in bridge mode (`--remote-url`/
|
|
74
80
|
* `--remote-transport`, headers riding in `INTUTIC_REMOTE_HEADERS` env, not
|
|
@@ -84,7 +90,6 @@
|
|
|
84
90
|
* every ~30s only works because `writeJsonFile` below is write-if-changed —
|
|
85
91
|
* an already-wrapped, unchanged config produces zero bytes written.
|
|
86
92
|
*
|
|
87
|
-
* LLD #14 — mcpAutoWrite.ts
|
|
88
93
|
* HLD §3.14 — GUI Harness Interception (MCP registration + Universal MCP Governance)
|
|
89
94
|
*
|
|
90
95
|
* @module
|
|
@@ -96,6 +101,12 @@ export interface DiscoveredMcpServer {
|
|
|
96
101
|
harness: string;
|
|
97
102
|
transport: 'stdio' | 'http' | 'sse' | 'unknown';
|
|
98
103
|
wrapped: boolean;
|
|
104
|
+
/**
|
|
105
|
+
* A remote server's URL, without its user name, password, query string or
|
|
106
|
+
* a token-shaped path segment (`sanitizeMcpEndpoint`). Absent for a local
|
|
107
|
+
* server: its command line can carry secrets and is never reported.
|
|
108
|
+
*/
|
|
109
|
+
endpoint?: string;
|
|
99
110
|
/**
|
|
100
111
|
* Set on a server the harness will start but the proxy cannot govern, with
|
|
101
112
|
* the reason. Today: an approved Claude Code project server that gets no
|
|
@@ -132,11 +143,15 @@ export declare function grokUserConfigPath(): string;
|
|
|
132
143
|
* is `~/.config/opencode/opencode.json` unless XDG_CONFIG_HOME is set (OpenCode
|
|
133
144
|
* resolves it through xdg-basedir). Only the `.json` spelling — see `injectOpenCode`. */
|
|
134
145
|
export declare function openCodeGlobalConfigPath(): string;
|
|
146
|
+
/** Gemini CLI's user settings, which also hold its `BeforeTool` gate (antigravityHooks.ts). */
|
|
147
|
+
export declare function geminiSettingsPath(): string;
|
|
148
|
+
/** Google Antigravity's global MCP servers, next to its `hooks.json` (antigravityCliHooks.ts). */
|
|
149
|
+
export declare function antigravityMcpConfigPath(): string;
|
|
135
150
|
/** The proxy binary path `resolveProxyBin` returns, in either of its two forms. */
|
|
136
151
|
export declare const PROXY_BIN_PATTERN: RegExp;
|
|
137
152
|
/**
|
|
138
153
|
* Discover every MCP server declared in any harness config this daemon knows
|
|
139
|
-
* how to parse — the same
|
|
154
|
+
* how to parse — the same 17 config paths / 12 harnesses `injectMcpServer`
|
|
140
155
|
* wraps — without writing anything. Used for reporting (agentReporter's
|
|
141
156
|
* `mcp_tools` facet) so visibility does not silently lag behind whatever
|
|
142
157
|
* `injectMcpServer` was last run against.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcpAutoWrite.d.ts","sourceRoot":"","sources":["../../src/harness/mcpAutoWrite.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"mcpAutoWrite.d.ts","sourceRoot":"","sources":["../../src/harness/mcpAutoWrite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+FG;AAkEH;gEACgE;AAChE,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAA;IAC/C,OAAO,EAAE,OAAO,CAAA;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAQD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAc7D;AAgBD,wBAAgB,uBAAuB,IAAI,MAAM,CAQhD;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAQ/C;AAUD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAMD,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAMD;;0FAE0F;AAC1F,wBAAgB,wBAAwB,IAAI,MAAM,CAGjD;AAMD,+FAA+F;AAC/F,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAMD,kGAAkG;AAClG,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAyyBD,mFAAmF;AACnF,eAAO,MAAM,iBAAiB,QAAoG,CAAA;AAimBlI;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAiB9F;AAID;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,EACrB,WAAW,SAAY,EACvB,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAO,GACzC,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
|