@intutic/sync-daemon 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.
Files changed (200) hide show
  1. package/README.md +2 -2
  2. package/dist/agentReporter.d.ts +205 -0
  3. package/dist/agentReporter.d.ts.map +1 -0
  4. package/dist/agentReporter.js +394 -0
  5. package/dist/agentReporter.js.map +1 -0
  6. package/dist/configReader.d.ts +39 -2
  7. package/dist/configReader.d.ts.map +1 -1
  8. package/dist/configReader.js +56 -2
  9. package/dist/configReader.js.map +1 -1
  10. package/dist/configWriter.d.ts +51 -1
  11. package/dist/configWriter.d.ts.map +1 -1
  12. package/dist/configWriter.js +490 -63
  13. package/dist/configWriter.js.map +1 -1
  14. package/dist/harness/antigravityHooks.d.ts.map +1 -1
  15. package/dist/harness/antigravityHooks.js +33 -55
  16. package/dist/harness/antigravityHooks.js.map +1 -1
  17. package/dist/harness/claudeCodeHooks.d.ts +47 -13
  18. package/dist/harness/claudeCodeHooks.d.ts.map +1 -1
  19. package/dist/harness/claudeCodeHooks.js +323 -55
  20. package/dist/harness/claudeCodeHooks.js.map +1 -1
  21. package/dist/harness/claudeDesktopHooks.d.ts.map +1 -1
  22. package/dist/harness/claudeDesktopHooks.js +35 -48
  23. package/dist/harness/claudeDesktopHooks.js.map +1 -1
  24. package/dist/harness/clineHooks.d.ts.map +1 -1
  25. package/dist/harness/clineHooks.js +42 -34
  26. package/dist/harness/clineHooks.js.map +1 -1
  27. package/dist/harness/codexHooks.d.ts +36 -0
  28. package/dist/harness/codexHooks.d.ts.map +1 -0
  29. package/dist/harness/codexHooks.js +227 -0
  30. package/dist/harness/codexHooks.js.map +1 -0
  31. package/dist/harness/continueHooks.d.ts +45 -5
  32. package/dist/harness/continueHooks.d.ts.map +1 -1
  33. package/dist/harness/continueHooks.js +225 -5
  34. package/dist/harness/continueHooks.js.map +1 -1
  35. package/dist/harness/cursorHooks.d.ts +31 -0
  36. package/dist/harness/cursorHooks.d.ts.map +1 -1
  37. package/dist/harness/cursorHooks.js +78 -49
  38. package/dist/harness/cursorHooks.js.map +1 -1
  39. package/dist/harness/dshHooks.d.ts +198 -0
  40. package/dist/harness/dshHooks.d.ts.map +1 -0
  41. package/dist/harness/dshHooks.js +569 -0
  42. package/dist/harness/dshHooks.js.map +1 -0
  43. package/dist/harness/gateBody.d.ts +422 -0
  44. package/dist/harness/gateBody.d.ts.map +1 -0
  45. package/dist/harness/gateBody.js +1816 -0
  46. package/dist/harness/gateBody.js.map +1 -0
  47. package/dist/harness/gateKind.d.ts +164 -0
  48. package/dist/harness/gateKind.d.ts.map +1 -0
  49. package/dist/harness/gateKind.js +143 -0
  50. package/dist/harness/gateKind.js.map +1 -0
  51. package/dist/harness/githubCopilotHooks.d.ts +54 -0
  52. package/dist/harness/githubCopilotHooks.d.ts.map +1 -0
  53. package/dist/harness/githubCopilotHooks.js +218 -0
  54. package/dist/harness/githubCopilotHooks.js.map +1 -0
  55. package/dist/harness/gooseHooks.d.ts.map +1 -1
  56. package/dist/harness/gooseHooks.js +67 -37
  57. package/dist/harness/gooseHooks.js.map +1 -1
  58. package/dist/harness/grokHooks.d.ts +77 -0
  59. package/dist/harness/grokHooks.d.ts.map +1 -0
  60. package/dist/harness/grokHooks.js +350 -0
  61. package/dist/harness/grokHooks.js.map +1 -0
  62. package/dist/harness/hermesHooks.d.ts.map +1 -1
  63. package/dist/harness/hermesHooks.js +26 -55
  64. package/dist/harness/hermesHooks.js.map +1 -1
  65. package/dist/harness/holdRedaction.d.ts +69 -0
  66. package/dist/harness/holdRedaction.d.ts.map +1 -0
  67. package/dist/harness/holdRedaction.js +211 -0
  68. package/dist/harness/holdRedaction.js.map +1 -0
  69. package/dist/harness/jetbrainsXmlConfig.d.ts +51 -0
  70. package/dist/harness/jetbrainsXmlConfig.d.ts.map +1 -0
  71. package/dist/harness/jetbrainsXmlConfig.js +151 -0
  72. package/dist/harness/jetbrainsXmlConfig.js.map +1 -0
  73. package/dist/harness/mcpAutoWrite.d.ts +100 -3
  74. package/dist/harness/mcpAutoWrite.d.ts.map +1 -1
  75. package/dist/harness/mcpAutoWrite.js +712 -90
  76. package/dist/harness/mcpAutoWrite.js.map +1 -1
  77. package/dist/harness/museHooks.d.ts +53 -0
  78. package/dist/harness/museHooks.d.ts.map +1 -0
  79. package/dist/harness/museHooks.js +273 -0
  80. package/dist/harness/museHooks.js.map +1 -0
  81. package/dist/harness/n8nHooks.d.ts +25 -9
  82. package/dist/harness/n8nHooks.d.ts.map +1 -1
  83. package/dist/harness/n8nHooks.js +174 -9
  84. package/dist/harness/n8nHooks.js.map +1 -1
  85. package/dist/harness/openCodeHooks.d.ts +93 -0
  86. package/dist/harness/openCodeHooks.d.ts.map +1 -0
  87. package/dist/harness/openCodeHooks.js +248 -0
  88. package/dist/harness/openCodeHooks.js.map +1 -0
  89. package/dist/harness/openWebuiHooks.d.ts.map +1 -1
  90. package/dist/harness/openWebuiHooks.js +56 -11
  91. package/dist/harness/openWebuiHooks.js.map +1 -1
  92. package/dist/harness/openclawHooks.d.ts.map +1 -1
  93. package/dist/harness/openclawHooks.js +30 -54
  94. package/dist/harness/openclawHooks.js.map +1 -1
  95. package/dist/harness/openhandsHooks.d.ts.map +1 -1
  96. package/dist/harness/openhandsHooks.js +35 -41
  97. package/dist/harness/openhandsHooks.js.map +1 -1
  98. package/dist/harness/piHooks.d.ts.map +1 -1
  99. package/dist/harness/piHooks.js +31 -58
  100. package/dist/harness/piHooks.js.map +1 -1
  101. package/dist/harness/protectedPaths.d.ts +353 -0
  102. package/dist/harness/protectedPaths.d.ts.map +1 -0
  103. package/dist/harness/protectedPaths.js +805 -0
  104. package/dist/harness/protectedPaths.js.map +1 -0
  105. package/dist/harness/rooCodeHooks.d.ts.map +1 -1
  106. package/dist/harness/rooCodeHooks.js +34 -48
  107. package/dist/harness/rooCodeHooks.js.map +1 -1
  108. package/dist/harness/windsurfHooks.d.ts +72 -0
  109. package/dist/harness/windsurfHooks.d.ts.map +1 -1
  110. package/dist/harness/windsurfHooks.js +172 -58
  111. package/dist/harness/windsurfHooks.js.map +1 -1
  112. package/dist/harness/windsurfJetBrainsProxy.d.ts +78 -0
  113. package/dist/harness/windsurfJetBrainsProxy.d.ts.map +1 -0
  114. package/dist/harness/windsurfJetBrainsProxy.js +159 -0
  115. package/dist/harness/windsurfJetBrainsProxy.js.map +1 -0
  116. package/dist/hashReporter.js +1 -1
  117. package/dist/hashReporter.js.map +1 -1
  118. package/dist/index.d.ts +12 -6
  119. package/dist/index.d.ts.map +1 -1
  120. package/dist/index.js +14 -6
  121. package/dist/index.js.map +1 -1
  122. package/dist/integrityStore.d.ts +0 -8
  123. package/dist/integrityStore.d.ts.map +1 -1
  124. package/dist/integrityStore.js +6 -29
  125. package/dist/integrityStore.js.map +1 -1
  126. package/dist/lib/approvedBypasses.d.ts +76 -0
  127. package/dist/lib/approvedBypasses.d.ts.map +1 -0
  128. package/dist/lib/approvedBypasses.js +140 -0
  129. package/dist/lib/approvedBypasses.js.map +1 -0
  130. package/dist/lib/complianceProbes.d.ts.map +1 -1
  131. package/dist/lib/complianceProbes.js +5 -0
  132. package/dist/lib/complianceProbes.js.map +1 -1
  133. package/dist/lib/decisionsDigest.d.ts +99 -0
  134. package/dist/lib/decisionsDigest.d.ts.map +1 -0
  135. package/dist/lib/decisionsDigest.js +199 -0
  136. package/dist/lib/decisionsDigest.js.map +1 -0
  137. package/dist/lib/egressPolicy.d.ts +69 -0
  138. package/dist/lib/egressPolicy.d.ts.map +1 -0
  139. package/dist/lib/egressPolicy.js +126 -0
  140. package/dist/lib/egressPolicy.js.map +1 -0
  141. package/dist/lib/gitWorktrees.d.ts +140 -0
  142. package/dist/lib/gitWorktrees.d.ts.map +1 -0
  143. package/dist/lib/gitWorktrees.js +191 -0
  144. package/dist/lib/gitWorktrees.js.map +1 -0
  145. package/dist/lib/policySnapshot.d.ts +224 -0
  146. package/dist/lib/policySnapshot.d.ts.map +1 -0
  147. package/dist/lib/policySnapshot.js +637 -0
  148. package/dist/lib/policySnapshot.js.map +1 -0
  149. package/dist/lib/processPoller.d.ts +44 -0
  150. package/dist/lib/processPoller.d.ts.map +1 -1
  151. package/dist/lib/processPoller.js +176 -1
  152. package/dist/lib/processPoller.js.map +1 -1
  153. package/dist/lib/runtimeEnv.d.ts +8 -0
  154. package/dist/lib/runtimeEnv.d.ts.map +1 -1
  155. package/dist/lib/runtimeEnv.js +3 -0
  156. package/dist/lib/runtimeEnv.js.map +1 -1
  157. package/dist/localTrajectoryHeuristics.d.ts +51 -0
  158. package/dist/localTrajectoryHeuristics.d.ts.map +1 -0
  159. package/dist/localTrajectoryHeuristics.js +90 -0
  160. package/dist/localTrajectoryHeuristics.js.map +1 -0
  161. package/dist/sessionReporter.d.ts +70 -0
  162. package/dist/sessionReporter.d.ts.map +1 -0
  163. package/dist/sessionReporter.js +140 -0
  164. package/dist/sessionReporter.js.map +1 -0
  165. package/dist/skillWriter.d.ts +1 -1
  166. package/dist/skillWriter.d.ts.map +1 -1
  167. package/dist/skillWriter.js +6 -3
  168. package/dist/skillWriter.js.map +1 -1
  169. package/dist/syncLoop.d.ts +105 -3
  170. package/dist/syncLoop.d.ts.map +1 -1
  171. package/dist/syncLoop.js +397 -65
  172. package/dist/syncLoop.js.map +1 -1
  173. package/dist/trajectoryMonitor.d.ts +2 -0
  174. package/dist/trajectoryMonitor.d.ts.map +1 -1
  175. package/dist/trajectoryMonitor.js +57 -0
  176. package/dist/trajectoryMonitor.js.map +1 -1
  177. package/dist/watcher/driftWatcher.d.ts.map +1 -1
  178. package/dist/watcher/driftWatcher.js +12 -3
  179. package/dist/watcher/driftWatcher.js.map +1 -1
  180. package/dist/watcher/settingsGuard.d.ts +23 -0
  181. package/dist/watcher/settingsGuard.d.ts.map +1 -1
  182. package/dist/watcher/settingsGuard.js +202 -17
  183. package/dist/watcher/settingsGuard.js.map +1 -1
  184. package/package.json +37 -6
  185. package/dist/brainIndexer.d.ts +0 -51
  186. package/dist/brainIndexer.d.ts.map +0 -1
  187. package/dist/brainIndexer.js +0 -148
  188. package/dist/brainIndexer.js.map +0 -1
  189. package/dist/harness/cursorHooksJson.d.ts +0 -29
  190. package/dist/harness/cursorHooksJson.d.ts.map +0 -1
  191. package/dist/harness/cursorHooksJson.js +0 -130
  192. package/dist/harness/cursorHooksJson.js.map +0 -1
  193. package/dist/harness/gooseHooksWriter.d.ts +0 -27
  194. package/dist/harness/gooseHooksWriter.d.ts.map +0 -1
  195. package/dist/harness/gooseHooksWriter.js +0 -147
  196. package/dist/harness/gooseHooksWriter.js.map +0 -1
  197. package/dist/harness/openhandsHooksWriter.d.ts +0 -23
  198. package/dist/harness/openhandsHooksWriter.d.ts.map +0 -1
  199. package/dist/harness/openhandsHooksWriter.js +0 -146
  200. package/dist/harness/openhandsHooksWriter.js.map +0 -1
@@ -15,21 +15,97 @@ import * as node_path from 'node:path';
15
15
  import * as node_os from 'node:os';
16
16
  import { z } from 'zod';
17
17
  import { createLogger } from '@intutic/logger';
18
+ import { emitJsGate, emitJsFailClosedPrelude, emitPreImageCapture, REVIEW_REQUESTS_BASENAME as GATE_REVIEW_REQUESTS_BASENAME, REVIEW_REQUESTS_LOG as GATE_REVIEW_REQUESTS_LOG, REVIEW_REQUEST_VERSION as GATE_REVIEW_REQUEST_VERSION, } from './gateBody.js';
19
+ import { emitRedactor } from './holdRedaction.js';
18
20
  const log = createLogger('sync-claude-hooks');
21
+ /**
22
+ * Coerces an unvalidated settings value to a string array, dropping anything else.
23
+ *
24
+ * `settings.json` is a file the user edits by hand, so `permissions.deny` being
25
+ * an array of strings is a convention, not a guarantee. Spreading a bare string
26
+ * would splice it into the deny list one character at a time.
27
+ */
28
+ function toStringArray(value) {
29
+ return Array.isArray(value) ? value.filter((v) => typeof v === 'string') : [];
30
+ }
19
31
  /** Path to the local hook event log file appended by generated hook scripts. */
20
32
  export const HOOK_EVENTS_LOG = '.intutic/events/hook-events.jsonl';
33
+ /**
34
+ * The hold record's file and version live in gateBody.ts since v8, beside the
35
+ * one hold branch every gate shares; re-exported here because the drain and
36
+ * its callers import them from this module.
37
+ */
38
+ export const REVIEW_REQUESTS_BASENAME = GATE_REVIEW_REQUESTS_BASENAME;
39
+ export const REVIEW_REQUESTS_LOG = GATE_REVIEW_REQUESTS_LOG;
40
+ export const REVIEW_REQUEST_VERSION = GATE_REVIEW_REQUEST_VERSION;
21
41
  // Zod schema to parse SOP evaluation criteria and tool restrictions
42
+ /**
43
+ * Keeps the strings and drops everything else, instead of rejecting the array.
44
+ *
45
+ * `z.array(z.string())` fails the WHOLE object on one bad element, and
46
+ * `safeParse` failing here discards the entire block — every valid pattern and
47
+ * every valid hold along with the one bad entry. That is TD-310's shape one
48
+ * layer down: a batch rejected as a unit because of a single member, with the
49
+ * loss silent.
50
+ *
51
+ * A malformed entry is dropped and the rest of the policy still compiles.
52
+ */
53
+ const stringList = z.preprocess((v) => (Array.isArray(v) ? v.filter((x) => typeof x === 'string') : v), z.array(z.string()).default([]));
22
54
  export const SopHookConstraintsSchema = z.object({
23
- highRiskTools: z.array(z.string()).default([]),
24
- patterns: z.array(z.string()).default([]),
55
+ highRiskTools: stringList,
56
+ patterns: stringList,
57
+ /**
58
+ * Actions that must not run until a human has approved the run.
59
+ *
60
+ * Distinct from `patterns`, which is a permanent denial. This is a *hold*: the
61
+ * action is legitimate, and someone wants to see it before it happens.
62
+ *
63
+ * This is the half of the review gate that is genuinely pre-execution. The
64
+ * proxy can only refuse the request *after* a harness has already run the tool
65
+ * — it sees the call in the next message. The hook runs before, so declaring
66
+ * `action:deploy` here stops the push itself, not merely everything after it.
67
+ */
68
+ reviewBefore: stringList,
25
69
  });
26
70
  /**
27
71
  * Extracts constraints from SOP registry entries.
28
72
  * Looks inside SOP markdown content for structured JSON/YAML blocks or parses settings.
29
73
  */
74
+ /**
75
+ * The front-matter key this harness re-parses, lowercased once.
76
+ *
77
+ * The Rust side owns this directive; the TS side reads it a second time because
78
+ * the two gates run in different runtimes with no shared parser, and a fixture
79
+ * test pins them together.
80
+ */
81
+ const REVIEW_BEFORE_KEY = 'review_before:';
82
+ /**
83
+ * Strip surrounding quotes and brackets in one linear pass.
84
+ *
85
+ * Replaces `/^["'[]+|["'\]]+$/g`, which CodeQL flagged as polynomial: the
86
+ * trailing alternative is `+` anchored to end-of-string, so a token that is a
87
+ * long run of quote characters and never reaches the end makes the engine
88
+ * retry from every position. `content` is SOP text, and an agent that can write
89
+ * a SOP file chooses it — so that was a denial of service against the daemon
90
+ * doing the governing.
91
+ *
92
+ * Mirrors Rust's `trim_matches(['"', '\'', '[', ']'])` in `sops.rs`, which is
93
+ * what this parser is pinned against, and which was never a regex.
94
+ */
95
+ function trimQuotesAndBrackets(value) {
96
+ const isTrimmable = (c) => c === '"' || c === "'" || c === '[' || c === ']';
97
+ let start = 0;
98
+ let end = value.length;
99
+ while (start < end && isTrimmable(value[start]))
100
+ start++;
101
+ while (end > start && isTrimmable(value[end - 1]))
102
+ end--;
103
+ return value.slice(start, end);
104
+ }
30
105
  export function parseSopConstraints(sops, settings) {
31
106
  const highRiskToolsSet = new Set();
32
107
  const patternsSet = new Set();
108
+ const reviewBeforeSet = new Set();
33
109
  // 1. Parse from workspace settings if present
34
110
  // Treat settings as Record<string, unknown> for legacy field access (highRiskTools, patterns)
35
111
  if (settings) {
@@ -40,6 +116,12 @@ export function parseSopConstraints(sops, settings) {
40
116
  if (Array.isArray(s['patterns'])) {
41
117
  s['patterns'].forEach((p) => typeof p === 'string' && patternsSet.add(p));
42
118
  }
119
+ // Same omission, second delivery path. Settings and the SOP block are both
120
+ // ways the control plane hands down a constraint; dropping it in one of them
121
+ // makes the behaviour depend on which route happened to carry it.
122
+ if (Array.isArray(s['reviewBefore'])) {
123
+ s['reviewBefore'].forEach((r) => typeof r === 'string' && reviewBeforeSet.add(r));
124
+ }
43
125
  }
44
126
  // 2. Parse from SOP content
45
127
  for (const sop of sops) {
@@ -56,6 +138,15 @@ export function parseSopConstraints(sops, settings) {
56
138
  if (validated.success) {
57
139
  validated.data.highRiskTools.forEach((t) => highRiskToolsSet.add(t));
58
140
  validated.data.patterns.forEach((p) => patternsSet.add(p));
141
+ // `reviewBefore` was declared on the schema, validated here, and
142
+ // then not copied — so a hold delivered through this block parsed
143
+ // clean and reached nothing. Only the front-matter `review_before:`
144
+ // line ever populated the set.
145
+ //
146
+ // This block is the seam the learning loop writes through, so the
147
+ // omission was the difference between a learned rule enforcing and
148
+ // a learned rule being reported as installed while doing nothing.
149
+ validated.data.reviewBefore.forEach((r) => reviewBeforeSet.add(r));
59
150
  }
60
151
  }
61
152
  catch {
@@ -82,10 +173,42 @@ export function parseSopConstraints(sops, settings) {
82
173
  highRiskToolsSet.add(toolMatch[1].trim());
83
174
  }
84
175
  }
176
+ // `review_before:` front matter.
177
+ //
178
+ // The same directive the proxy reads from `.intutic/sops/*.md`, parsed a
179
+ // second time here because the two gates live in different runtimes and
180
+ // there is no shared parser. Kept deliberately simple — one comma-separated
181
+ // line — and pinned against the Rust side by a fixture test, because two
182
+ // parsers for one directive is exactly how a rule ends up enforced at one
183
+ // gate and silently ignored at the other.
184
+ //
185
+ // Scanned line by line rather than with `/^\s*review_before:\s*(.+)$/gim`,
186
+ // and trimmed with a linear pass rather than `/^["'[]+|["'\]]+$/g`. Both
187
+ // regexes were polynomial on input this function does not control: `content`
188
+ // is SOP file text, and an agent that can write a SOP file chooses it. A run
189
+ // of whitespace that never reaches `review_before:` makes the first
190
+ // backtrack from every start position, and a run of quotes that never
191
+ // reaches end-of-string does the same to the second — so a crafted SOP could
192
+ // hang the sync daemon, which is the process enforcing governance.
193
+ //
194
+ // The replacement is also closer to the Rust side it is pinned against:
195
+ // `sops.rs` uses `trim()` and `trim_matches(['"', '\'', '[', ']'])`, neither
196
+ // of which is a regex.
197
+ for (const rawLine of content.split('\n')) {
198
+ const line = rawLine.trimStart();
199
+ if (!line.toLowerCase().startsWith(REVIEW_BEFORE_KEY))
200
+ continue;
201
+ for (const token of line.slice(REVIEW_BEFORE_KEY.length).split(',')) {
202
+ const cleaned = trimQuotesAndBrackets(token.trim());
203
+ if (cleaned)
204
+ reviewBeforeSet.add(cleaned);
205
+ }
206
+ }
85
207
  }
86
208
  return {
87
209
  highRiskTools: Array.from(highRiskToolsSet),
88
210
  patterns: Array.from(patternsSet),
211
+ reviewBefore: Array.from(reviewBeforeSet),
89
212
  };
90
213
  }
91
214
  /**
@@ -119,7 +242,7 @@ export async function updatePreToolUseHooks(workspaceRoot, sops, settings, contr
119
242
  hooks: [
120
243
  {
121
244
  type: 'command',
122
- command: `node ${node_path.join(workspaceRoot, '.intutic', 'hooks', 'pre-tool-check.js')}`,
245
+ command: `node ${node_path.join(workspaceRoot, '.intutic', 'hooks', 'claude-code-check.js')}`,
123
246
  timeout: 10,
124
247
  statusMessage: 'Verifying tool execution against Intutic SOP policy...',
125
248
  },
@@ -135,6 +258,13 @@ export async function updatePreToolUseHooks(workspaceRoot, sops, settings, contr
135
258
  hookEntry('Edit'),
136
259
  hookEntry('Write'),
137
260
  hookEntry('MultiEdit'),
261
+ // M3: Claude Code names an MCP tool call `mcp__<server>__<tool>` —
262
+ // this matcher is what routes those calls into the same gate script
263
+ // at all. The gate body itself (gateBody.ts, v6) is what actually
264
+ // understands the shape once it arrives — the `#mcpservers`
265
+ // allowlist check and any `mcp__github__.*`-shaped SOP rule both need
266
+ // this matcher present to ever see the call.
267
+ hookEntry('mcp__.*'),
138
268
  ],
139
269
  },
140
270
  };
@@ -145,6 +275,14 @@ export async function updatePreToolUseHooks(workspaceRoot, sops, settings, contr
145
275
  const hookEventsDir = node_path.join(workspaceRoot, '.intutic', 'events');
146
276
  await node_fs.mkdir(hookEventsDir, { recursive: true });
147
277
  const hookEventsLog = node_path.join(hookEventsDir, 'hook-events.jsonl');
278
+ // Where the hook records a review hold. The daemon watches this directory
279
+ // already, so no new watcher is needed to notice one.
280
+ //
281
+ // Append-only JSONL, not a single `.json`. It was one file written with
282
+ // `writeFileSync`, so a second hold in the same drain window silently
283
+ // destroyed the first — and holds cluster, because an agent that trips one
284
+ // review rule usually trips it again on the next step.
285
+ const reviewRequestFile = node_path.join(hookEventsDir, REVIEW_REQUESTS_BASENAME);
148
286
  const hookScriptContent = `
149
287
  /**
150
288
  * Intutic PreToolUse execution gate.
@@ -154,6 +292,7 @@ export async function updatePreToolUseHooks(workspaceRoot, sops, settings, contr
154
292
  * and drained to the control plane by the sync-daemon on each cycle.
155
293
  * Control plane: ${controlPlaneUrl ?? 'https://api.intutic.ai'}
156
294
  */
295
+ ${emitJsFailClosedPrelude({ harness: 'claude-code', contract: 'exit2' })}
157
296
  const path = require('path');
158
297
  const os = require('os');
159
298
  const fs = require('fs');
@@ -173,35 +312,46 @@ try {
173
312
  });
174
313
  } catch { /* runtime.env not yet written — use defaults */ }
175
314
 
176
- // Governance-sensitive paths that no agent may modify.
177
- // Editing these files is how privilege escalation occurs.
178
- const PROTECTED_PATHS = [
179
- path.join(os.homedir(), '.claude', 'settings.json'),
180
- path.join(os.homedir(), '.claude', 'settings.local.json'),
181
- '.claude/settings.json',
182
- '.claude/settings.local.json',
183
- '.intutic/hooks',
184
- '.intutic/integrity.json',
185
- '.intutic/context_integrity.json',
186
- ];
315
+ // Governance-sensitive paths and command shapes that no agent may reach.
316
+ //
317
+ // This block used to be hand-built here, and it read \`...UNIVERSAL_PROTECTED_PATHS,\`
318
+ // with no \${} — so the identifier was emitted as literal source text into a
319
+ // script that never imports it. Node threw ReferenceError on line 30 of the
320
+ // generated file, before the gate did anything: the protected-path check, the
321
+ // shell-bypass check and the review_before hold were all dead for Claude Code,
322
+ // the harness most people run. A PreToolUse hook exiting 1 is a hook error, not
323
+ // a block, so tool calls proceeded ungoverned and nothing said so.
324
+ //
325
+ // It is emitted from harness/gateBody.ts now. That does not make the escaping
326
+ // easier; it makes there be one of it, with one set of tests.
327
+ ${emitPreImageCapture()}
328
+ ${emitJsGate({ harness: 'claude-code', contract: 'exit2', reviewRequestFile })}
329
+ ${emitRedactor()}
187
330
 
188
331
  /**
189
332
  * Appends a governance event to the local hook-events log.
190
333
  * Uses synchronous append (O_APPEND is atomic for single-write < PIPE_BUF).
191
334
  * The sync-daemon drains this file on each cycle and POSTs to the control plane.
192
335
  */
193
- function logEvent(verdict, toolName, reason) {
336
+ function logEvent(verdict, toolName, reason, sessionId) {
194
337
  try {
195
338
  const ts = new Date().toISOString();
196
339
  const incidentId = crypto.createHash('sha1').update(ts + toolName + _intuticWsId).digest('hex').slice(0, 16);
197
340
  const entry = JSON.stringify({
198
- event: verdict === 'blocked' ? 'tool_blocked' : 'tool_allowed',
341
+ // Passed through, not collapsed to two values: the advisory tier emits
342
+ // 'tool_flagged', and a ternary here silently recorded it as an allow.
343
+ event: verdict,
199
344
  toolName,
200
345
  reason: reason || '',
201
346
  workspaceId: _intuticWsId,
202
347
  harnessType: ${JSON.stringify(harnessType)},
203
348
  timestamp: ts,
204
349
  incidentId,
350
+ // TD-209: Claude Code's PreToolUse contract puts session_id on stdin;
351
+ // it was parsed and dropped, so trust decay and enforcement logging fell
352
+ // back to the synthetic per-workspace session and could never attribute
353
+ // a block to the person whose agent made it.
354
+ ...(sessionId ? { sessionId } : {}),
205
355
  }) + '\\n';
206
356
  // Path B: reliable file append (sync-daemon drains on FSEvents change)
207
357
  fs.appendFileSync(${JSON.stringify(hookEventsLog)}, entry, { flag: 'a' });
@@ -231,55 +381,75 @@ function logEvent(verdict, toolName, reason) {
231
381
  } catch { /* never crash the hook */ }
232
382
  }
233
383
 
384
+ // Review holds (\`review_before:\` / \`REQUIRE_APPROVAL:\`) are evaluated by the
385
+ // shared gate above since gate body v8: a \`hold\` rule in the policy snapshot
386
+ // refuses the call, records it to .intutic/events/review-requests.jsonl for
387
+ // the daemon to drain, and honours an exact, unexpired approved bypass from
388
+ // ~/.intutic/hooks/approved-bypasses.jsonl. The bespoke copy of that logic
389
+ // this file used to carry — the one no other harness had — is gone.
390
+
234
391
  // Read stdin containing Claude's tool context
235
392
  let inputData = '';
236
393
  process.stdin.on('data', (chunk) => { inputData += chunk; });
237
394
  process.stdin.on('end', () => {
238
395
  try {
239
396
  const ctx = JSON.parse(inputData);
397
+ // An envelope carrying none of the tool fields extracts to empty strings,
398
+ // which match no rule — an allow. Refused instead; see the guard itself.
399
+ intuticGuardEnvelope(ctx, ['tool_name', 'toolName', 'tool_input', 'toolInput'],
400
+ (v, t, r) => logEvent(v, t, r, String(ctx.session_id || ctx.sessionId || '')));
240
401
  const toolName = (ctx.tool_name || ctx.toolName || '').toLowerCase();
402
+ // Case preserved for review matching: an operator writes \`review_before: Write\`,
403
+ // and the harness calls the tool \`Write\`.
404
+ const rawToolName = ctx.tool_name || ctx.toolName || '';
405
+ const sessionId = ctx.session_id || ctx.sessionId || '';
241
406
  const toolInput = ctx.tool_input || ctx.toolInput || {};
242
407
  const toolInputStr = JSON.stringify(toolInput);
243
408
 
244
- // 1. Protected-path guard — block any file-modification tool targeting
245
- // governance-sensitive paths regardless of SOP pattern list.
246
- if (['edit', 'write', 'multiedit'].includes(toolName)) {
247
- const targetPath = toolInput.path || toolInput.file_path ||
248
- toolInput.new_path || toolInput.target || '';
249
- for (const p of PROTECTED_PATHS) {
250
- if (targetPath.includes(p) || String(targetPath).startsWith(p)) {
251
- const reason = \`Attempt to modify governance-protected path: "\${targetPath}". \` +
252
- 'To change governance policy, update your SOP via the Intutic control plane.';
253
- console.error(\`[Intutic Guardrail] BLOCKED: \${reason}\`);
254
- logEvent('blocked', toolName, reason);
255
- process.exit(2);
256
- }
257
- }
258
- }
409
+ // Protected paths and shell-bypass patterns, from the shared gate.
410
+ //
411
+ // Both checks used to be gated on the tool name: paths only for
412
+ // edit/write/multiedit, commands only for a fixed list of five shell tool
413
+ // names. Any tool outside those lists walked past both. The shared gate keys
414
+ // on the *arguments* instead, so a tool name nobody anticipated is no longer
415
+ // a way through.
416
+ const targetPath = toolInput.path || toolInput.file_path || toolInput.filePath ||
417
+ toolInput.new_path || toolInput.target || toolInput.notebook_path || '';
418
+ const shellCmd = String(toolInput.command || toolInput.cmd || toolInput.script || '');
419
+ intuticGate(rawToolName, targetPath, shellCmd,
420
+ (v, t, r) => logEvent(v, t, r, sessionId), _intuticWsId, toolInput, sessionId);
421
+
422
+ // 2. Review holds: handled inside intuticGate (gate body v8) — see the
423
+ // note above the stdin handler.
259
424
 
260
- // 2. SOP-compiled pattern blacklist
425
+ // 3. SOP-compiled pattern blacklist
261
426
  const patterns = ${JSON.stringify(constraints.patterns)};
262
427
  for (const pattern of patterns) {
263
428
  if (toolInputStr.includes(pattern)) {
264
429
  const reason = \`Policy violation matching pattern: "\${pattern}"\`;
265
430
  console.error(\`[Intutic Guardrail] Blocked execution of tool "\${toolName}" due to \${reason}\`);
266
- logEvent('blocked', toolName, reason);
431
+ logEvent('tool_blocked', toolName, reason, sessionId);
267
432
  process.exit(2);
268
433
  }
269
434
  }
270
435
 
271
- logEvent('allowed', toolName, '');
436
+ logEvent('tool_allowed', toolName, '', sessionId);
272
437
  process.exit(0);
273
438
  } catch (err) {
274
439
  // Fail CLOSED — any hook execution error blocks the tool call.
275
440
  // The sync daemon will rewrite this hook on the next sync cycle.
276
441
  console.error('[Intutic Guardrail] Hook error (blocking for safety):', err);
277
- logEvent('blocked', 'unknown', String(err));
442
+ logEvent('tool_blocked', 'unknown', String(err), '');
278
443
  process.exit(2);
279
444
  }
280
445
  });
281
446
  `.trim();
282
- await node_fs.writeFile(node_path.join(hookScriptDir, 'pre-tool-check.js'), hookScriptContent, 'utf-8');
447
+ // Named after its writer. This and cursorHooks both emitted
448
+ // `pre-tool-check.js` into `<root>/.intutic/hooks/`, so on any machine running
449
+ // both harnesses the second writer silently overwrote the first and one
450
+ // harness ran the other's gate. `generatedGateBehaviour.test.ts` asserts the
451
+ // artifact set is a partition, so the collision cannot come back unnoticed.
452
+ await node_fs.writeFile(node_path.join(hookScriptDir, 'claude-code-check.js'), hookScriptContent, 'utf-8');
283
453
  // Write local settings config
284
454
  const localClaudeDir = node_path.join(workspaceRoot, '.claude');
285
455
  await node_fs.mkdir(localClaudeDir, { recursive: true });
@@ -333,7 +503,11 @@ process.stdin.on('end', () => {
333
503
  ...existingGlobal,
334
504
  permissions: {
335
505
  ...existingGlobal.permissions,
336
- deny: Array.from(new Set([...(existingGlobal.permissions?.deny || []), ...denyRules])),
506
+ // `permissions` comes from the user's settings.json, so its shape is a
507
+ // claim rather than a guarantee — narrow instead of asserting. A `deny`
508
+ // that is not an array (someone hand-edited it to a string) would
509
+ // otherwise spread character by character into the deny list.
510
+ deny: Array.from(new Set([...toStringArray(existingGlobal.permissions?.['deny']), ...denyRules])),
337
511
  },
338
512
  hooks: {
339
513
  ...existingGlobal.hooks,
@@ -358,11 +532,22 @@ process.stdin.on('end', () => {
358
532
  * @param apiKey - Workspace API key (Bearer token)
359
533
  * @returns number of events drained (0 if log was empty or network failed)
360
534
  */
361
- export async function drainHookEvents(workspaceRoot, controlPlaneUrl, apiKey) {
362
- const logPath = node_path.join(workspaceRoot, '.intutic', 'events', 'hook-events.jsonl');
535
+ /**
536
+ * Drains one append-only JSONL log to a control-plane endpoint.
537
+ *
538
+ * Extracted because there are two of these now — hook events and review holds —
539
+ * and the delivery semantics below are the part that must not diverge. TD-310
540
+ * was exactly that: a batch the control plane could never accept was retained
541
+ * and re-sent every cycle, so the log never drained again and every later event
542
+ * behind it was lost, silently. A second hand-written copy of this logic is a
543
+ * second chance to get that wrong.
544
+ *
545
+ * @returns the number of records delivered; 0 on any failure.
546
+ */
547
+ async function drainJsonlLog(opts) {
363
548
  let raw;
364
549
  try {
365
- raw = await node_fs.readFile(logPath, 'utf-8');
550
+ raw = await node_fs.readFile(opts.logPath, 'utf-8');
366
551
  }
367
552
  catch {
368
553
  return 0; // File doesn't exist yet — nothing to drain
@@ -370,45 +555,128 @@ export async function drainHookEvents(workspaceRoot, controlPlaneUrl, apiKey) {
370
555
  const lines = raw.trim().split('\n').filter(Boolean);
371
556
  if (lines.length === 0)
372
557
  return 0;
373
- const events = [];
558
+ const records = [];
374
559
  for (const line of lines) {
375
560
  try {
376
- events.push(JSON.parse(line));
561
+ records.push(JSON.parse(line));
377
562
  }
378
563
  catch {
379
- log.warn({ line }, 'Skipping malformed hook event log line');
564
+ log.warn({ line, label: opts.label }, 'Skipping malformed log line');
380
565
  }
381
566
  }
382
- if (events.length === 0) {
383
- await node_fs.writeFile(logPath, '', 'utf-8');
567
+ if (records.length === 0) {
568
+ await node_fs.writeFile(opts.logPath, '', 'utf-8');
384
569
  return 0;
385
570
  }
386
571
  try {
387
572
  // Use native fetch (Node 18+ — required minimum for this monorepo)
388
- const response = await fetch(`${controlPlaneUrl}/api/v1/hook-events`, {
573
+ const response = await fetch(opts.endpoint, {
389
574
  method: 'POST',
390
575
  headers: {
391
576
  'Content-Type': 'application/json',
392
- 'Authorization': `Bearer ${apiKey}`,
577
+ 'Authorization': `Bearer ${opts.apiKey}`,
393
578
  },
394
- body: JSON.stringify({ events }),
579
+ body: JSON.stringify(opts.bodyFor(records)),
395
580
  signal: AbortSignal.timeout(10_000),
396
581
  });
397
582
  if (response.ok) {
398
- // Truncate the log — events successfully delivered
399
- await node_fs.writeFile(logPath, '', 'utf-8');
400
- log.info({ count: events.length }, 'Hook events drained to control plane');
401
- return events.length;
583
+ // Truncate the log — records successfully delivered
584
+ await node_fs.writeFile(opts.logPath, '', 'utf-8');
585
+ log.info({ count: records.length, label: opts.label }, 'Drained to control plane');
586
+ return records.length;
402
587
  }
403
- else {
404
- log.warn({ status: response.status, count: events.length }, 'Control plane rejected hook events — retaining log for next cycle');
588
+ // A 4xx will never succeed on retry, and retaining the log means re-sending
589
+ // the identical rejected batch on every cycle from now on. That does not
590
+ // delay delivery of these records — it stops delivery of *all* later ones,
591
+ // silently, because the log never drains again.
592
+ //
593
+ // This was live: adding an event type to the gates without adding it to the
594
+ // control plane's enum made one ordinary advisory event poison every batch
595
+ // behind it. The control plane now drops unknown events instead of
596
+ // rejecting the batch, so this path should be unreachable for that cause —
597
+ // but "should be unreachable" is exactly what was believed before, and the
598
+ // cost of being wrong is the whole pipeline.
599
+ //
600
+ // So: move the batch aside rather than dropping or retrying it. Nothing is
601
+ // lost, a human can inspect it, and the live log drains.
602
+ if (response.status >= 400 && response.status < 500) {
603
+ const rejectedPath = opts.logPath.replace(/\.jsonl$/, '.rejected.jsonl');
604
+ let body = '';
605
+ try {
606
+ body = (await response.text()).slice(0, 500);
607
+ }
608
+ catch {
609
+ // The status is the part that matters; a missing body must not throw here.
610
+ }
611
+ try {
612
+ await node_fs.appendFile(rejectedPath, lines.join('\n') + '\n', 'utf-8');
613
+ await node_fs.writeFile(opts.logPath, '', 'utf-8');
614
+ }
615
+ catch (err) {
616
+ // If we cannot set it aside, retaining is better than losing it.
617
+ log.error({ err, status: response.status, label: opts.label }, 'Could not quarantine rejected batch — retaining log');
618
+ return 0;
619
+ }
620
+ log.error({ status: response.status, count: records.length, rejectedPath, body, label: opts.label }, 'Control plane rejected the batch with a client error — quarantined so the log can ' +
621
+ 'keep draining. These records were NOT delivered.');
405
622
  return 0;
406
623
  }
624
+ // 5xx or anything else: transient. Retain and retry, which is what the
625
+ // retention behaviour was actually designed for.
626
+ log.warn({ status: response.status, count: records.length, label: opts.label }, 'Control plane rejected the batch — retaining log for next cycle');
627
+ return 0;
407
628
  }
408
629
  catch (err) {
409
630
  // Network failure — retain log for retry on next cycle
410
- log.warn({ err, count: events.length }, 'Failed to drain hook events — will retry on next sync cycle');
631
+ log.warn({ err, count: records.length, label: opts.label }, 'Failed to drain — will retry on next sync cycle');
411
632
  return 0;
412
633
  }
413
634
  }
635
+ /**
636
+ * Drains the local hook-events log file and POSTs all accumulated governance
637
+ * events to the control plane in a single batch request.
638
+ *
639
+ * Called by the sync-daemon's main loop (syncLoop.ts) on every cycle, after
640
+ * the main sync operations. On success, the log file is truncated to prevent
641
+ * unbounded growth. On network failure, events remain in the log and will be
642
+ * retried on the next cycle.
643
+ */
644
+ export async function drainHookEvents(workspaceRoot, controlPlaneUrl, apiKey) {
645
+ return drainJsonlLog({
646
+ logPath: node_path.join(workspaceRoot, '.intutic', 'events', 'hook-events.jsonl'),
647
+ endpoint: `${controlPlaneUrl}/api/v1/hook-events`,
648
+ apiKey,
649
+ bodyFor: (events) => ({ events }),
650
+ label: 'hook events',
651
+ });
652
+ }
653
+ /**
654
+ * Drains review holds — the pre-execution half of `review_before:`.
655
+ *
656
+ * The hook writes a hold and exits 2, which stops the tool before it runs. That
657
+ * file had no reader: the comment beside the write claimed "the daemon picks the
658
+ * request up and tells the control plane", and no daemon code opened it. So the
659
+ * hold blocked the action and the decision behind it went nowhere — which is
660
+ * also why the decision-mining queue had four route readers and no writer.
661
+ *
662
+ * This is the writer. Delivering a hold always becomes a row and a review card;
663
+ * whether resolving it can also let the retried call through is conditional,
664
+ * not automatic. Approving through `POST /api/v1/decisions/:id/review` (or the
665
+ * Slack button) writes a short-lived, exact-match bypass ONLY when the
666
+ * workspace has opted in with `reviewHoldBypassEnabled`, and even then it
667
+ * covers only the identical call, for at most `reviewHoldBypassTtlMinutes`.
668
+ * A workspace that never sets that flag gets the original, unconditional
669
+ * observe-only behaviour. See `gateBody.ts`'s `intuticApprovedBypass` (every gate, since v8)
670
+ * and `decisionMiningService.ts`'s `maybeWriteReviewHoldBypass` for the
671
+ * mechanism.
672
+ */
673
+ export async function drainReviewRequests(workspaceRoot, controlPlaneUrl, apiKey) {
674
+ return drainJsonlLog({
675
+ logPath: node_path.join(workspaceRoot, '.intutic', 'events', REVIEW_REQUESTS_BASENAME),
676
+ endpoint: `${controlPlaneUrl}/api/v1/decisions`,
677
+ apiKey,
678
+ bodyFor: (holds) => ({ holds }),
679
+ label: 'review holds',
680
+ });
681
+ }
414
682
  //# sourceMappingURL=claudeCodeHooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claudeCodeHooks.js","sourceRoot":"","sources":["../../src/harness/claudeCodeHooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claudeCodeHooks.js","sourceRoot":"","sources":["../../src/harness/claudeCodeHooks.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"claudeDesktopHooks.d.ts","sourceRoot":"","sources":["../../src/harness/claudeDesktopHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAqMH;;;;;;;;;;GAUG;AACH,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,WAAW,SAAK,GACf,OAAO,CAAC,IAAI,CAAC,CAsEf"}
1
+ {"version":3,"file":"claudeDesktopHooks.d.ts","sourceRoot":"","sources":["../../src/harness/claudeDesktopHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAqLH;;;;;;;;;;GAUG;AACH,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,WAAW,SAAK,GACf,OAAO,CAAC,IAAI,CAAC,CAyEf"}