@lannguyensi/harness 0.37.0 → 0.39.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.
Files changed (110) hide show
  1. package/CHANGELOG.md +35 -1
  2. package/dist/cli/add/index.js +10 -2
  3. package/dist/cli/add/index.js.map +1 -1
  4. package/dist/cli/add/mutate.d.ts +2 -0
  5. package/dist/cli/add/mutate.js.map +1 -1
  6. package/dist/cli/adopt/derive.d.ts +11 -1
  7. package/dist/cli/adopt/derive.js +28 -2
  8. package/dist/cli/adopt/derive.js.map +1 -1
  9. package/dist/cli/adopt/index.js +21 -13
  10. package/dist/cli/adopt/index.js.map +1 -1
  11. package/dist/cli/apply/apply.js +31 -3
  12. package/dist/cli/apply/apply.js.map +1 -1
  13. package/dist/cli/apply/generate-settings.d.ts +43 -0
  14. package/dist/cli/apply/generate-settings.js +53 -0
  15. package/dist/cli/apply/generate-settings.js.map +1 -1
  16. package/dist/cli/audit.d.ts +7 -0
  17. package/dist/cli/audit.js +11 -1
  18. package/dist/cli/audit.js.map +1 -1
  19. package/dist/cli/diff/git.d.ts +13 -0
  20. package/dist/cli/diff/git.js +25 -0
  21. package/dist/cli/diff/git.js.map +1 -1
  22. package/dist/cli/diff/index.d.ts +7 -0
  23. package/dist/cli/diff/index.js +82 -7
  24. package/dist/cli/diff/index.js.map +1 -1
  25. package/dist/cli/doctor/format.js +21 -0
  26. package/dist/cli/doctor/format.js.map +1 -1
  27. package/dist/cli/doctor/index.d.ts +33 -0
  28. package/dist/cli/doctor/index.js +103 -35
  29. package/dist/cli/doctor/index.js.map +1 -1
  30. package/dist/cli/doctor/types.d.ts +23 -0
  31. package/dist/cli/explain.js +7 -0
  32. package/dist/cli/explain.js.map +1 -1
  33. package/dist/cli/index.js +4 -0
  34. package/dist/cli/index.js.map +1 -1
  35. package/dist/cli/init/profiles.d.ts +1 -1
  36. package/dist/cli/init/profiles.js +9 -0
  37. package/dist/cli/init/profiles.js.map +1 -1
  38. package/dist/cli/init/templates.d.ts +1 -1
  39. package/dist/cli/init/templates.js +19 -0
  40. package/dist/cli/init/templates.js.map +1 -1
  41. package/dist/cli/loader.js +9 -1
  42. package/dist/cli/loader.js.map +1 -1
  43. package/dist/cli/pack/hook-bootstrap.d.ts +60 -0
  44. package/dist/cli/pack/hook-bootstrap.js +116 -0
  45. package/dist/cli/pack/hook-bootstrap.js.map +1 -0
  46. package/dist/cli/pack/hook-branch-protection.js +14 -53
  47. package/dist/cli/pack/hook-branch-protection.js.map +1 -1
  48. package/dist/cli/pack/hook-codex-pre-tool-use.js +20 -50
  49. package/dist/cli/pack/hook-codex-pre-tool-use.js.map +1 -1
  50. package/dist/cli/pack/hook-codex-stop.js +2 -13
  51. package/dist/cli/pack/hook-codex-stop.js.map +1 -1
  52. package/dist/cli/pack/hook-codex-user-prompt-submit.js +2 -13
  53. package/dist/cli/pack/hook-codex-user-prompt-submit.js.map +1 -1
  54. package/dist/cli/pack/hook-post-tool-use.js +4 -32
  55. package/dist/cli/pack/hook-post-tool-use.js.map +1 -1
  56. package/dist/cli/pack/hook-pre-tool-use.js +32 -93
  57. package/dist/cli/pack/hook-pre-tool-use.js.map +1 -1
  58. package/dist/cli/pack/hook-runtime-reality.js +3 -13
  59. package/dist/cli/pack/hook-runtime-reality.js.map +1 -1
  60. package/dist/cli/pack/hook-solution-acceptance-writeguard.js +2 -13
  61. package/dist/cli/pack/hook-solution-acceptance-writeguard.js.map +1 -1
  62. package/dist/cli/pack/hook-solution-acceptance.js +25 -57
  63. package/dist/cli/pack/hook-solution-acceptance.js.map +1 -1
  64. package/dist/cli/pack/hook-stay-in-scope.js +3 -23
  65. package/dist/cli/pack/hook-stay-in-scope.js.map +1 -1
  66. package/dist/cli/pack/hook-track-active-claim.js +4 -32
  67. package/dist/cli/pack/hook-track-active-claim.js.map +1 -1
  68. package/dist/cli/policy/intercept.d.ts +10 -0
  69. package/dist/cli/policy/intercept.js +60 -24
  70. package/dist/cli/policy/intercept.js.map +1 -1
  71. package/dist/cli/validate/checks.d.ts +24 -0
  72. package/dist/cli/validate/checks.js +138 -0
  73. package/dist/cli/validate/checks.js.map +1 -1
  74. package/dist/io/merge-settings.d.ts +23 -1
  75. package/dist/io/merge-settings.js +120 -10
  76. package/dist/io/merge-settings.js.map +1 -1
  77. package/dist/io/read-regular-file.d.ts +32 -0
  78. package/dist/io/read-regular-file.js +34 -0
  79. package/dist/io/read-regular-file.js.map +1 -0
  80. package/dist/policies/index.d.ts +1 -1
  81. package/dist/policies/index.js +1 -1
  82. package/dist/policies/index.js.map +1 -1
  83. package/dist/policies/ledger-client.d.ts +41 -0
  84. package/dist/policies/ledger-client.js +199 -94
  85. package/dist/policies/ledger-client.js.map +1 -1
  86. package/dist/policy-packs/builtin/solution-acceptance-runtime.d.ts +4 -3
  87. package/dist/policy-packs/builtin/solution-acceptance-runtime.js +11 -20
  88. package/dist/policy-packs/builtin/solution-acceptance-runtime.js.map +1 -1
  89. package/dist/policy-packs/builtin/understanding-before-execution-runtime.d.ts +21 -0
  90. package/dist/policy-packs/builtin/understanding-before-execution-runtime.js +44 -20
  91. package/dist/policy-packs/builtin/understanding-before-execution-runtime.js.map +1 -1
  92. package/dist/policy-packs/builtin/understanding-before-execution.d.ts +2 -2
  93. package/dist/runtime/index.d.ts +1 -1
  94. package/dist/runtime/index.js +1 -1
  95. package/dist/runtime/index.js.map +1 -1
  96. package/dist/runtime/intercept.d.ts +18 -0
  97. package/dist/runtime/intercept.js +53 -9
  98. package/dist/runtime/intercept.js.map +1 -1
  99. package/dist/runtime/ledger-record.d.ts +24 -0
  100. package/dist/runtime/ledger-record.js +50 -0
  101. package/dist/runtime/ledger-record.js.map +1 -1
  102. package/dist/schema/grounding.js +22 -0
  103. package/dist/schema/grounding.js.map +1 -1
  104. package/dist/schema/index.js +41 -4
  105. package/dist/schema/index.js.map +1 -1
  106. package/dist/schema/memory.js +9 -0
  107. package/dist/schema/memory.js.map +1 -1
  108. package/dist/schema/risk.js +10 -6
  109. package/dist/schema/risk.js.map +1 -1
  110. package/package.json +5 -1
@@ -1,3 +1,4 @@
1
+ import { spawnSync } from "node:child_process";
1
2
  import * as fs from "node:fs";
2
3
  import * as os from "node:os";
3
4
  import * as path from "node:path";
@@ -274,6 +275,140 @@ export function checkSolutionAcceptanceProducer(manifest) {
274
275
  }
275
276
  return [];
276
277
  }
278
+ /**
279
+ * The orchestrator-workflow knob the grounding-mcp producer reads
280
+ * (`resolveOwKnob`). Repo-relative on purpose: the knob belongs to the
281
+ * repository whose completions the OW arm gates.
282
+ */
283
+ export const OW_KNOB_REL_PATH = ".ai/solution-acceptance.json";
284
+ export function createDefaultGitIgnoreProbe(cwd) {
285
+ return (relPath) => {
286
+ const res = spawnSync("git", ["check-ignore", "-q", "--", relPath], {
287
+ cwd: cwd ?? process.cwd(),
288
+ stdio: "ignore",
289
+ });
290
+ if (res.error)
291
+ return null;
292
+ if (res.status === 0)
293
+ return true;
294
+ if (res.status === 1)
295
+ return false;
296
+ return null; // 128: not a git repository (or another fatal git error)
297
+ };
298
+ }
299
+ // Knob-reachability lint (task 24f6ceb9, ow-review-2026-07-01). The OW arm
300
+ // of solution-acceptance reads repo state: the knob above plus run
301
+ // completeness under `.ai/runs/`. When the knob path is git-ignored the
302
+ // repo CANNOT commit its enforcement posture, so in a fresh clone or a git
303
+ // worktree `.ai/runs/` is absent, the default `auto` knob silently skips
304
+ // the OW arm, and the gate that exists to prevent process skipping is
305
+ // itself skipped exactly where process skipping happens. Warn (not error):
306
+ // the preflight floor still gates every completion; only the OW arm is
307
+ // affected. A `null` probe answer (non-repo cwd, git missing) skips the
308
+ // check — validate must stay usable for pure home-config linting.
309
+ export function checkSolutionAcceptanceKnobIgnored(manifest, probe) {
310
+ const pack = manifest.policy_packs.find((p) => p.name === "solution-acceptance");
311
+ if (!pack || !pack.enabled)
312
+ return [];
313
+ if (probe(OW_KNOB_REL_PATH) !== true)
314
+ return [];
315
+ return [
316
+ {
317
+ severity: "warning",
318
+ path: "policy_packs",
319
+ message: `solution-acceptance: the orchestrator-workflow knob ${OW_KNOB_REL_PATH} ` +
320
+ `is git-ignored in this repository, so the OW enforcement posture cannot ` +
321
+ `be committed. In a fresh clone or git worktree .ai/runs/ is absent and ` +
322
+ `the default "auto" knob silently skips the OW arm — exactly where ` +
323
+ `process skipping happens. Narrow the ignore to .ai/runs/ (run state ` +
324
+ `stays local) and commit ${OW_KNOB_REL_PATH}; see ` +
325
+ `docs/policy-packs/solution-acceptance.md ("Repo state and gitignore").`,
326
+ },
327
+ ];
328
+ }
329
+ // Self-attestation disclosure (task 43b107f2, harness-review-2026-07-01).
330
+ // The generic `requires:`/`ledger_tag` engine matches substrings in ledger
331
+ // content that the GATED AGENT can write directly via
332
+ // `mcp__agent-grounding__ledger_add` — whoever can write the ledger can open
333
+ // the gate. The two builtin packs were hardened to filesystem markers after
334
+ // exactly this class of self-approval bug (docs/CLI.md, branch-protection),
335
+ // but a custom block-policy is only as strong as its evidence producer.
336
+ //
337
+ // Heuristic: warn only when a `block` policy declares NO `producers:` at
338
+ // all — the evidence source is then undocumented and the operator has made
339
+ // no visible trust decision. A declared producer, even an agent-executable
340
+ // `mcp`/`bash` one, IS the schema's way of stating the intended evidence
341
+ // flow (same philosophy as the doctor producer-gap refinement, task
342
+ // f97e152f): the full/team templates deliberately ship mcp-producer
343
+ // process-gates whose purpose is forcing a review-subagent step, and
344
+ // warning on every one of them would train operators to ignore warnings.
345
+ // What an agent-executable producer MEANS for the trust model (advisory
346
+ // against the gated agent) is taught by the tripwire in
347
+ // docs/writing-custom-policies.md, which the producer docs link to.
348
+ export function checkPolicySelfAttestation(manifest) {
349
+ const diags = [];
350
+ for (let i = 0; i < manifest.policies.length; i++) {
351
+ const p = manifest.policies[i];
352
+ // block-only on purpose: a require_approval policy's canonical unblock
353
+ // path is the operator verb (`harness approve risk`), an ask-semantics
354
+ // flow that exists independent of producers:, so absence of producers
355
+ // there does not mean the evidence source is undocumented.
356
+ if (p === undefined || p.enforcement !== "block")
357
+ continue;
358
+ if (p.producers !== undefined && p.producers.length > 0)
359
+ continue;
360
+ diags.push({
361
+ severity: "warning",
362
+ path: `policies[${i}]`,
363
+ message: `policy "${p.name}" blocks on requires.ledger_tag but declares no ` +
364
+ `producers: — the evidence source is undocumented, and the tag is ` +
365
+ `satisfied by ANY ledger writer, including the gated agent itself ` +
366
+ `via mcp__agent-grounding__ledger_add (advisory against the agent ` +
367
+ `it gates). Declare a producers: entry naming the intended evidence ` +
368
+ `flow — an ask-kind producer for operator-in-the-loop approval ` +
369
+ `(alongside the mcp recovery producer the schema requires), or an ` +
370
+ `agent recipe if the gate is a deliberate process gate. See ` +
371
+ `docs/writing-custom-policies.md ("The trust model").`,
372
+ });
373
+ }
374
+ return diags;
375
+ }
376
+ // M7 validate lint: a policy that gates on risk.* / action.reversible clauses
377
+ // WITHOUT an environment.name clause fires on EVERY unclassified command in
378
+ // EVERY environment because those three clauses fail-closed to matched=true
379
+ // when the action is unclassified ("unknown is not safe"). This is almost
380
+ // never what the operator intends: an unscoped risk policy becomes a blanket
381
+ // gate on any command the classifier does not recognise. See docs/risk-gate.md.
382
+ export function checkPolicyRiskWithoutEnvScope(manifest) {
383
+ const diags = [];
384
+ for (let i = 0; i < manifest.policies.length; i++) {
385
+ const p = manifest.policies[i];
386
+ if (!p?.when)
387
+ continue;
388
+ const when = p.when;
389
+ // The three clauses that fail-closed to matched=true for an unclassified
390
+ // action. An environment.name clause constrains the scope, so we only
391
+ // warn when it is absent.
392
+ const hasUnclassifiedFallbackClause = when["risk.severity_at_least"] !== undefined ||
393
+ when["risk.category_in"] !== undefined ||
394
+ when["action.reversible"] !== undefined;
395
+ const hasEnvNameScope = when["environment.name"] !== undefined;
396
+ if (hasUnclassifiedFallbackClause && !hasEnvNameScope) {
397
+ diags.push({
398
+ severity: "warning",
399
+ path: `policies[${i}]`,
400
+ message: `policy "${p.name}" declares a when: block with ` +
401
+ `risk.severity_at_least / risk.category_in / action.reversible ` +
402
+ `but no environment.name scope: those clauses fail-closed to ` +
403
+ `matched=true for any unclassified command, so this policy fires ` +
404
+ `on every unclassified action in every environment. ` +
405
+ `Add an environment.name clause to scope the policy to a specific ` +
406
+ `environment. See docs/risk-gate.md.`,
407
+ });
408
+ }
409
+ }
410
+ return diags;
411
+ }
277
412
  // Phase 6 #2: surface pack-resolution problems at lint time, not at
278
413
  // `harness apply` time. Delegates to the shared `checkPolicyPackSources`
279
414
  // so the apply path (which now also fails loudly on these conditions)
@@ -317,8 +452,11 @@ export function runAssetChecks(manifest, opts = {}) {
317
452
  ...checkBuiltinDrift(manifest, opts),
318
453
  ...checkPolicyGroundingMcp(manifest),
319
454
  ...checkSolutionAcceptanceProducer(manifest),
455
+ ...checkSolutionAcceptanceKnobIgnored(manifest, opts.gitIgnoreProbe ?? createDefaultGitIgnoreProbe()),
320
456
  ...checkPolicyPacks(manifest),
321
457
  ...checkPolicyPackConfigsAsDiagnostics(manifest),
458
+ ...checkPolicyRiskWithoutEnvScope(manifest),
459
+ ...checkPolicySelfAttestation(manifest),
322
460
  ];
323
461
  }
324
462
  export const __testables = {
@@ -1 +1 @@
1
- {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../../src/cli/validate/checks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../../src/cli/validate/checks.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,30 @@
1
+ export interface MergeOptions {
2
+ /**
3
+ * Server names harness itself wrote into the generated settings.json
4
+ * on the PREVIOUS apply (from `.last-apply`). Used to tell "operator
5
+ * hand-added" apart from "harness-written before, since removed or
6
+ * disabled in the manifest". Omit when no prior apply is recorded.
7
+ */
8
+ previouslyGeneratedMcpNames?: ReadonlySet<string>;
9
+ }
1
10
  export interface MergeResult {
2
11
  merged: Record<string, unknown>;
3
12
  replacedKeys: string[];
4
13
  preservedKeys: string[];
5
14
  addedKeys: string[];
15
+ /** Owned keys that were deep-merged instead of wholesale-replaced. */
16
+ deepMergedKeys: string[];
17
+ /**
18
+ * Server names inside `mcpServers` that exist only in the target file
19
+ * (operator hand-adds) and survived the deep merge.
20
+ */
21
+ preservedMcpServers: string[];
22
+ /**
23
+ * Server names dropped because harness wrote them on a previous apply
24
+ * but the current manifest no longer emits them (removed or
25
+ * `enabled: false`).
26
+ */
27
+ removedMcpServers: string[];
6
28
  }
7
- export declare function mergeSettings(existing: Record<string, unknown> | null, generated: Record<string, unknown>): MergeResult;
29
+ export declare function mergeSettings(existing: Record<string, unknown> | null, generated: Record<string, unknown>, opts?: MergeOptions): MergeResult;
8
30
  export declare function summarizeMerge(target: string, r: MergeResult): string;
@@ -1,22 +1,87 @@
1
1
  // 3-way merge for `harness apply --target <path> --merge`.
2
2
  //
3
3
  // Merge semantics: harness owns whichever top-level keys appear in the
4
- // generated output (today: `hooks`; once the sibling `tools.mcp` task
5
- // lands: also `mcpServers`). Owned keys are *replaced* wholesale; every
6
- // other key in the existing target file is preserved verbatim.
4
+ // generated output (today: `hooks` and `mcpServers`). Owned keys are
5
+ // replaced wholesale — EXCEPT `mcpServers`, which is deep-merged by
6
+ // server name (task 059b669c, operator decision 2026-07-02). Per name:
7
+ //
8
+ // - declared in the current generated output → generated value wins
9
+ // (the manifest stays the source of truth for what it declares);
10
+ // - absent from the generated output but recorded as harness-written
11
+ // on a PREVIOUS apply (`previouslyGeneratedMcpNames`, derived from
12
+ // `.last-apply`) → DROPPED: the operator removed or disabled the
13
+ // server in the manifest, and `enabled: false` must stay an
14
+ // effective kill switch on --merge targets;
15
+ // - absent from both → operator hand-add, preserved verbatim.
16
+ //
17
+ // Without the provenance set (no `.last-apply` yet, a record with no
18
+ // settings.json entry, or a corrupt record), unknown names are
19
+ // preserved — the conservative reading, since dropping could destroy
20
+ // an operator hand-add.
21
+ //
22
+ // `hooks` stays wholesale-owned: its nested array-of-groups shape has
23
+ // no stable identity key to merge on, so partial ownership would be
24
+ // ambiguous; hand-added hooks belong in the manifest (documented in
25
+ // docs/for-humans.md).
7
26
  //
8
27
  // Insertion order: existing keys first (stable diff against the prior
9
28
  // file), then any new generated keys appended at the end. Owned keys
10
29
  // keep their existing position so a re-apply doesn't churn on-disk
11
- // ordering.
12
- export function mergeSettings(existing, generated) {
30
+ // ordering. Inside a deep-merged mcpServers block the same rule holds.
31
+ //
32
+ // Accumulators are null-prototype objects: a server literally named
33
+ // `__proto__` in the target file must round-trip as an own property,
34
+ // not hit the inherited prototype setter.
35
+ function isRecord(x) {
36
+ return typeof x === "object" && x !== null && !Array.isArray(x);
37
+ }
38
+ export function mergeSettings(existing, generated, opts = {}) {
13
39
  const replaced = [];
14
40
  const added = [];
15
41
  const preserved = [];
16
- const out = {};
42
+ const deepMerged = [];
43
+ const preservedMcpServers = [];
44
+ const removedMcpServers = [];
45
+ const out = Object.create(null);
17
46
  if (existing) {
18
47
  for (const k of Object.keys(existing)) {
19
- if (k in generated) {
48
+ if (k === "mcpServers" && isRecord(existing[k])) {
49
+ const inGenerated = Object.prototype.hasOwnProperty.call(generated, k);
50
+ if (inGenerated && !isRecord(generated[k])) {
51
+ // Malformed generated side: wholesale, generated wins.
52
+ out[k] = generated[k];
53
+ replaced.push(k);
54
+ continue;
55
+ }
56
+ if (!inGenerated && opts.previouslyGeneratedMcpNames === undefined) {
57
+ // The manifest emits no servers AND no provenance is
58
+ // available: nothing here is provably harness-written, so the
59
+ // key is not ours to touch.
60
+ out[k] = existing[k];
61
+ preserved.push(k);
62
+ continue;
63
+ }
64
+ // Deep merge — also when the generated output has NO mcpServers
65
+ // key at all (every declared server removed or disabled): the
66
+ // provenance set still identifies the harness-written leftovers
67
+ // that must be dropped so enabled:false stays a kill switch.
68
+ const r = mergeMcpServers(existing[k], inGenerated ? generated[k] : {}, opts.previouslyGeneratedMcpNames);
69
+ preservedMcpServers.push(...r.operatorNames);
70
+ removedMcpServers.push(...r.removedNames);
71
+ if (inGenerated || Object.keys(r.merged).length > 0) {
72
+ out[k] = r.merged;
73
+ }
74
+ // else: every entry was harness-written and dropped, and the
75
+ // generated output has no mcpServers key — omit it, mirroring
76
+ // what a fresh (non-merge) apply would write.
77
+ deepMerged.push(k);
78
+ continue;
79
+ }
80
+ if (Object.prototype.hasOwnProperty.call(generated, k)) {
81
+ // Wholesale replace: harness owns the key. Also the fallback
82
+ // when the existing mcpServers is not an object (malformed
83
+ // target) — the generated shape wins rather than merging into
84
+ // a corrupt value.
20
85
  out[k] = generated[k];
21
86
  replaced.push(k);
22
87
  }
@@ -27,21 +92,66 @@ export function mergeSettings(existing, generated) {
27
92
  }
28
93
  }
29
94
  for (const k of Object.keys(generated)) {
30
- if (existing && k in existing)
95
+ if (existing && Object.prototype.hasOwnProperty.call(existing, k))
31
96
  continue;
32
97
  out[k] = generated[k];
33
98
  added.push(k);
34
99
  }
35
- return { merged: out, replacedKeys: replaced, preservedKeys: preserved, addedKeys: added };
100
+ return {
101
+ merged: out,
102
+ replacedKeys: replaced,
103
+ preservedKeys: preserved,
104
+ addedKeys: added,
105
+ deepMergedKeys: deepMerged,
106
+ preservedMcpServers,
107
+ removedMcpServers,
108
+ };
109
+ }
110
+ /**
111
+ * Union by server name with provenance (see the module header for the
112
+ * three per-name cases). Existing insertion order is kept, new
113
+ * generated names are appended in their generated (lexical) order.
114
+ */
115
+ function mergeMcpServers(existing, generated, previouslyGenerated) {
116
+ const merged = Object.create(null);
117
+ const operatorNames = [];
118
+ const removedNames = [];
119
+ for (const name of Object.keys(existing)) {
120
+ if (Object.prototype.hasOwnProperty.call(generated, name)) {
121
+ merged[name] = generated[name];
122
+ }
123
+ else if (previouslyGenerated?.has(name)) {
124
+ removedNames.push(name);
125
+ }
126
+ else {
127
+ merged[name] = existing[name];
128
+ operatorNames.push(name);
129
+ }
130
+ }
131
+ for (const name of Object.keys(generated)) {
132
+ if (Object.prototype.hasOwnProperty.call(existing, name))
133
+ continue;
134
+ merged[name] = generated[name];
135
+ }
136
+ return { merged, operatorNames, removedNames };
36
137
  }
37
138
  export function summarizeMerge(target, r) {
38
139
  const replacedFrag = r.replacedKeys.length
39
140
  ? `replaced ${r.replacedKeys.length} owned key${r.replacedKeys.length === 1 ? "" : "s"} (${r.replacedKeys.join(", ")})`
40
141
  : "replaced 0 owned keys";
142
+ const deepMergedFrag = r.deepMergedKeys.length
143
+ ? `, deep-merged ${r.deepMergedKeys.join(", ")}`
144
+ : "";
41
145
  const addedFrag = r.addedKeys.length
42
146
  ? `, added ${r.addedKeys.length} (${r.addedKeys.join(", ")})`
43
147
  : "";
44
148
  const preservedFrag = `, preserved ${r.preservedKeys.length} other key${r.preservedKeys.length === 1 ? "" : "s"}`;
45
- return `merged into ${target}: ${replacedFrag}${addedFrag}${preservedFrag}`;
149
+ const keptFrag = r.preservedMcpServers.length
150
+ ? `, kept ${r.preservedMcpServers.length} operator-added mcpServer${r.preservedMcpServers.length === 1 ? "" : "s"} (${r.preservedMcpServers.join(", ")})`
151
+ : "";
152
+ const droppedFrag = r.removedMcpServers.length
153
+ ? `, dropped ${r.removedMcpServers.length} manifest-removed mcpServer${r.removedMcpServers.length === 1 ? "" : "s"} (${r.removedMcpServers.join(", ")})`
154
+ : "";
155
+ return `merged into ${target}: ${replacedFrag}${deepMergedFrag}${addedFrag}${preservedFrag}${keptFrag}${droppedFrag}`;
46
156
  }
47
157
  //# sourceMappingURL=merge-settings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge-settings.js","sourceRoot":"","sources":["../../src/io/merge-settings.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,EAAE;AACF,uEAAuE;AACvE,sEAAsE;AACtE,wEAAwE;AACxE,+DAA+D;AAC/D,EAAE;AACF,sEAAsE;AACtE,qEAAqE;AACrE,mEAAmE;AACnE,YAAY;AASZ,MAAM,UAAU,aAAa,CAC3B,QAAwC,EACxC,SAAkC;IAElC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,GAAG,GAA4B,EAAE,CAAC;IAExC,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;gBACnB,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBACtB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACrB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACvC,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ;YAAE,SAAS;QACxC,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,CAAc;IAC3D,MAAM,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM;QACxC,CAAC,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,MAAM,aAAa,CAAC,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QACvH,CAAC,CAAC,uBAAuB,CAAC;IAC5B,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM;QAClC,CAAC,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QAC7D,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,aAAa,GAAG,eAAe,CAAC,CAAC,aAAa,CAAC,MAAM,aAAa,CAAC,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAClH,OAAO,eAAe,MAAM,KAAK,YAAY,GAAG,SAAS,GAAG,aAAa,EAAE,CAAC;AAC9E,CAAC"}
1
+ {"version":3,"file":"merge-settings.js","sourceRoot":"","sources":["../../src/io/merge-settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Result of a symlink-rejecting regular-file read. The kinds are deliberately
3
+ * fine-grained because the gate readers need to keep their distinct deny
4
+ * details (missing vs symlink vs not-regular) and one caller treats
5
+ * exists-but-unreadable as "existence already satisfied the gate".
6
+ */
7
+ export type RegularFileRead = {
8
+ kind: "ok";
9
+ content: string;
10
+ } | {
11
+ kind: "missing";
12
+ } | {
13
+ kind: "symlink";
14
+ } | {
15
+ kind: "not-regular";
16
+ } | {
17
+ kind: "unreadable";
18
+ };
19
+ /**
20
+ * Read a marker/verdict file as utf8, refusing symlinks and non-regular
21
+ * files. lstat (NOT stat): defense-in-depth against a symlink at the marker
22
+ * path pointing at an arbitrary target the agent controls. In today's threat
23
+ * model the agent has no Edit / Write / Bash path to plant such a symlink
24
+ * (the same PreToolUse hook gates all three), but the gate contract is to
25
+ * assume the agent is hostile, so the lstat reject is cheap insurance
26
+ * (agent-tasks/d39f160e).
27
+ *
28
+ * This is THE shared implementation for every gate-marker read; a future
29
+ * defensive fix (e.g. closing the lstat/read race with O_NOFOLLOW, ENOTDIR
30
+ * handling) belongs here and nowhere else.
31
+ */
32
+ export declare function readRegularFileRejectingSymlink(filePath: string): RegularFileRead;
@@ -0,0 +1,34 @@
1
+ import * as fs from "node:fs";
2
+ /**
3
+ * Read a marker/verdict file as utf8, refusing symlinks and non-regular
4
+ * files. lstat (NOT stat): defense-in-depth against a symlink at the marker
5
+ * path pointing at an arbitrary target the agent controls. In today's threat
6
+ * model the agent has no Edit / Write / Bash path to plant such a symlink
7
+ * (the same PreToolUse hook gates all three), but the gate contract is to
8
+ * assume the agent is hostile, so the lstat reject is cheap insurance
9
+ * (agent-tasks/d39f160e).
10
+ *
11
+ * This is THE shared implementation for every gate-marker read; a future
12
+ * defensive fix (e.g. closing the lstat/read race with O_NOFOLLOW, ENOTDIR
13
+ * handling) belongs here and nowhere else.
14
+ */
15
+ export function readRegularFileRejectingSymlink(filePath) {
16
+ let stat;
17
+ try {
18
+ stat = fs.lstatSync(filePath);
19
+ }
20
+ catch {
21
+ return { kind: "missing" };
22
+ }
23
+ if (stat.isSymbolicLink())
24
+ return { kind: "symlink" };
25
+ if (!stat.isFile())
26
+ return { kind: "not-regular" };
27
+ try {
28
+ return { kind: "ok", content: fs.readFileSync(filePath, "utf8") };
29
+ }
30
+ catch {
31
+ return { kind: "unreadable" };
32
+ }
33
+ }
34
+ //# sourceMappingURL=read-regular-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-regular-file.js","sourceRoot":"","sources":["../../src/io/read-regular-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAe9B;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,+BAA+B,CAAC,QAAgB;IAC9D,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,IAAI,CAAC,cAAc,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACtD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IACnD,IAAI,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAChC,CAAC;AACH,CAAC"}
@@ -1,5 +1,5 @@
1
1
  export { buildRecordHint, evaluateRequires, RequiresEvaluationError, type EvaluateRequiresOptions, type LedgerEntry, type RequiresEvaluation, type RequiresTrace, } from "./requires.js";
2
2
  export { parseDurationSeconds, InvalidDurationError } from "./duration.js";
3
3
  export { parseLedgerTimestamp } from "./timestamp.js";
4
- export { queryLedgerByTag, type LedgerClientOptions, type LedgerQueryResult, type QueryLedgerOptions, } from "./ledger-client.js";
4
+ export { openLedgerSession, queryLedgerByTag, type LedgerClientOptions, type LedgerQueryResult, type LedgerSession, type LedgerSessionCallResult, type LedgerSessionQuery, type QueryLedgerOptions, } from "./ledger-client.js";
5
5
  export { validateExtractGrammar, parseExtractExpression, evaluateExtract, substituteTemplate, ExtractGrammarError, type ExtractBuiltins, type ExtractEventContext, type ExtractEvaluation, type ExtractPath, type ExtractSegment, type ExtractTraceEntry, type ExtractTraceSource, type SubstituteTemplateResult, } from "./extract.js";
@@ -1,6 +1,6 @@
1
1
  export { buildRecordHint, evaluateRequires, RequiresEvaluationError, } from "./requires.js";
2
2
  export { parseDurationSeconds, InvalidDurationError } from "./duration.js";
3
3
  export { parseLedgerTimestamp } from "./timestamp.js";
4
- export { queryLedgerByTag, } from "./ledger-client.js";
4
+ export { openLedgerSession, queryLedgerByTag, } from "./ledger-client.js";
5
5
  export { validateExtractGrammar, parseExtractExpression, evaluateExtract, substituteTemplate, ExtractGrammarError, } from "./extract.js";
6
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/policies/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,uBAAuB,GAKxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EACL,gBAAgB,GAIjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,GASpB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/policies/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,uBAAuB,GAKxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GAOjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,GASpB,MAAM,cAAc,CAAC"}
@@ -36,4 +36,45 @@ export type LedgerQueryResult = {
36
36
  kind: "degraded";
37
37
  reason: string;
38
38
  };
39
+ /** Arguments to `LedgerSession.querySummary` — per-call, unlike the
40
+ * connection-scoped `LedgerClientOptions`. */
41
+ export interface LedgerSessionQuery {
42
+ sessionId: string;
43
+ sinceIso?: string;
44
+ contentPrefix?: string;
45
+ }
46
+ /**
47
+ * Result of a generic `LedgerSession.callTool` round-trip. Three-way so a
48
+ * caller can distinguish a server-side JSON-RPC error (retryable with a
49
+ * different payload — the `policy_decision` → `fact` fallback) from a
50
+ * degraded transport (spawn failure / exit / timeout — nothing to retry).
51
+ */
52
+ export type LedgerSessionCallResult = {
53
+ status: "ok";
54
+ payload: unknown;
55
+ } | {
56
+ status: "error";
57
+ errorMessage: string;
58
+ } | {
59
+ status: "degraded";
60
+ reason: string;
61
+ };
62
+ /**
63
+ * One grounding-mcp connection serving multiple calls.
64
+ *
65
+ * The PreToolUse runtime gate evaluates K policies per tool event, and each
66
+ * used to spawn its own subprocess for the query plus a second one for the
67
+ * audit record — 2K sequential spawns per event, the fail-open-under-load
68
+ * risk the 2026-07-01 review flagged against the 30s hook budget. A session
69
+ * spawns ONE subprocess lazily on first use, performs the initialize
70
+ * handshake once, and multiplexes every subsequent `ledger_summary` /
71
+ * `ledger_add` over the same stdio pipe. `dispose()` terminates the child;
72
+ * the owner (e.g. the intercept CLI wrapper) MUST call it when done.
73
+ */
74
+ export interface LedgerSession {
75
+ querySummary(query: LedgerSessionQuery): Promise<LedgerQueryResult>;
76
+ callTool(name: string, args: Record<string, unknown>): Promise<LedgerSessionCallResult>;
77
+ dispose(): void;
78
+ }
79
+ export declare function openLedgerSession(opts: LedgerClientOptions): LedgerSession;
39
80
  export declare function queryLedgerByTag(opts: QueryLedgerOptions): Promise<LedgerQueryResult>;