@lannguyensi/harness 0.5.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 (199) hide show
  1. package/CHANGELOG.md +552 -0
  2. package/LICENSE +21 -0
  3. package/README.md +154 -0
  4. package/dist/cli/add/index.d.ts +14 -0
  5. package/dist/cli/add/index.js +71 -0
  6. package/dist/cli/add/index.js.map +1 -0
  7. package/dist/cli/add/mutate.d.ts +39 -0
  8. package/dist/cli/add/mutate.js +36 -0
  9. package/dist/cli/add/mutate.js.map +1 -0
  10. package/dist/cli/adopt/derive.d.ts +38 -0
  11. package/dist/cli/adopt/derive.js +94 -0
  12. package/dist/cli/adopt/derive.js.map +1 -0
  13. package/dist/cli/adopt/index.d.ts +20 -0
  14. package/dist/cli/adopt/index.js +156 -0
  15. package/dist/cli/adopt/index.js.map +1 -0
  16. package/dist/cli/apply/apply.d.ts +49 -0
  17. package/dist/cli/apply/apply.js +333 -0
  18. package/dist/cli/apply/apply.js.map +1 -0
  19. package/dist/cli/apply/generate-memory-index.d.ts +17 -0
  20. package/dist/cli/apply/generate-memory-index.js +167 -0
  21. package/dist/cli/apply/generate-memory-index.js.map +1 -0
  22. package/dist/cli/apply/generate-settings.d.ts +15 -0
  23. package/dist/cli/apply/generate-settings.js +87 -0
  24. package/dist/cli/apply/generate-settings.js.map +1 -0
  25. package/dist/cli/apply/index.d.ts +1 -0
  26. package/dist/cli/apply/index.js +2 -0
  27. package/dist/cli/apply/index.js.map +1 -0
  28. package/dist/cli/audit.d.ts +36 -0
  29. package/dist/cli/audit.js +121 -0
  30. package/dist/cli/audit.js.map +1 -0
  31. package/dist/cli/describe.d.ts +13 -0
  32. package/dist/cli/describe.js +26 -0
  33. package/dist/cli/describe.js.map +1 -0
  34. package/dist/cli/diff/engine.d.ts +21 -0
  35. package/dist/cli/diff/engine.js +161 -0
  36. package/dist/cli/diff/engine.js.map +1 -0
  37. package/dist/cli/diff/git.d.ts +6 -0
  38. package/dist/cli/diff/git.js +32 -0
  39. package/dist/cli/diff/git.js.map +1 -0
  40. package/dist/cli/diff/index.d.ts +15 -0
  41. package/dist/cli/diff/index.js +39 -0
  42. package/dist/cli/diff/index.js.map +1 -0
  43. package/dist/cli/diff/since-apply.d.ts +57 -0
  44. package/dist/cli/diff/since-apply.js +255 -0
  45. package/dist/cli/diff/since-apply.js.map +1 -0
  46. package/dist/cli/doctor/format.d.ts +2 -0
  47. package/dist/cli/doctor/format.js +126 -0
  48. package/dist/cli/doctor/format.js.map +1 -0
  49. package/dist/cli/doctor/index.d.ts +14 -0
  50. package/dist/cli/doctor/index.js +281 -0
  51. package/dist/cli/doctor/index.js.map +1 -0
  52. package/dist/cli/doctor/types.d.ts +46 -0
  53. package/dist/cli/doctor/types.js +2 -0
  54. package/dist/cli/doctor/types.js.map +1 -0
  55. package/dist/cli/dry-run.d.ts +46 -0
  56. package/dist/cli/dry-run.js +168 -0
  57. package/dist/cli/dry-run.js.map +1 -0
  58. package/dist/cli/exit-codes.d.ts +10 -0
  59. package/dist/cli/exit-codes.js +15 -0
  60. package/dist/cli/exit-codes.js.map +1 -0
  61. package/dist/cli/explain.d.ts +14 -0
  62. package/dist/cli/explain.js +97 -0
  63. package/dist/cli/explain.js.map +1 -0
  64. package/dist/cli/export.d.ts +31 -0
  65. package/dist/cli/export.js +84 -0
  66. package/dist/cli/export.js.map +1 -0
  67. package/dist/cli/index.d.ts +8 -0
  68. package/dist/cli/index.js +549 -0
  69. package/dist/cli/index.js.map +1 -0
  70. package/dist/cli/init/index.d.ts +17 -0
  71. package/dist/cli/init/index.js +57 -0
  72. package/dist/cli/init/index.js.map +1 -0
  73. package/dist/cli/init/templates.d.ts +4 -0
  74. package/dist/cli/init/templates.js +175 -0
  75. package/dist/cli/init/templates.js.map +1 -0
  76. package/dist/cli/list.d.ts +12 -0
  77. package/dist/cli/list.js +118 -0
  78. package/dist/cli/list.js.map +1 -0
  79. package/dist/cli/loader.d.ts +24 -0
  80. package/dist/cli/loader.js +74 -0
  81. package/dist/cli/loader.js.map +1 -0
  82. package/dist/cli/main.d.ts +2 -0
  83. package/dist/cli/main.js +6 -0
  84. package/dist/cli/main.js.map +1 -0
  85. package/dist/cli/policy/intercept.d.ts +34 -0
  86. package/dist/cli/policy/intercept.js +172 -0
  87. package/dist/cli/policy/intercept.js.map +1 -0
  88. package/dist/cli/remove/index.d.ts +18 -0
  89. package/dist/cli/remove/index.js +95 -0
  90. package/dist/cli/remove/index.js.map +1 -0
  91. package/dist/cli/remove/mutate.d.ts +9 -0
  92. package/dist/cli/remove/mutate.js +68 -0
  93. package/dist/cli/remove/mutate.js.map +1 -0
  94. package/dist/cli/validate/checks.d.ts +23 -0
  95. package/dist/cli/validate/checks.js +253 -0
  96. package/dist/cli/validate/checks.js.map +1 -0
  97. package/dist/cli/validate/index.d.ts +18 -0
  98. package/dist/cli/validate/index.js +50 -0
  99. package/dist/cli/validate/index.js.map +1 -0
  100. package/dist/cli/validate/types.d.ts +7 -0
  101. package/dist/cli/validate/types.js +5 -0
  102. package/dist/cli/validate/types.js.map +1 -0
  103. package/dist/index.d.ts +15 -0
  104. package/dist/index.js +16 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/io/atomic-write.d.ts +8 -0
  107. package/dist/io/atomic-write.js +30 -0
  108. package/dist/io/atomic-write.js.map +1 -0
  109. package/dist/io/harness-lock.d.ts +33 -0
  110. package/dist/io/harness-lock.js +260 -0
  111. package/dist/io/harness-lock.js.map +1 -0
  112. package/dist/io/last-apply.d.ts +20 -0
  113. package/dist/io/last-apply.js +123 -0
  114. package/dist/io/last-apply.js.map +1 -0
  115. package/dist/io/lock.d.ts +11 -0
  116. package/dist/io/lock.js +33 -0
  117. package/dist/io/lock.js.map +1 -0
  118. package/dist/io/patch.d.ts +10 -0
  119. package/dist/io/patch.js +8 -0
  120. package/dist/io/patch.js.map +1 -0
  121. package/dist/io/restart-hints.d.ts +5 -0
  122. package/dist/io/restart-hints.js +59 -0
  123. package/dist/io/restart-hints.js.map +1 -0
  124. package/dist/io/three-state.d.ts +7 -0
  125. package/dist/io/three-state.js +20 -0
  126. package/dist/io/three-state.js.map +1 -0
  127. package/dist/io/validate-before-write.d.ts +12 -0
  128. package/dist/io/validate-before-write.js +23 -0
  129. package/dist/io/validate-before-write.js.map +1 -0
  130. package/dist/overrides/index.d.ts +2 -0
  131. package/dist/overrides/index.js +3 -0
  132. package/dist/overrides/index.js.map +1 -0
  133. package/dist/overrides/machines.d.ts +12 -0
  134. package/dist/overrides/machines.js +46 -0
  135. package/dist/overrides/machines.js.map +1 -0
  136. package/dist/overrides/merge.d.ts +6 -0
  137. package/dist/overrides/merge.js +173 -0
  138. package/dist/overrides/merge.js.map +1 -0
  139. package/dist/policies/duration.d.ts +5 -0
  140. package/dist/policies/duration.js +50 -0
  141. package/dist/policies/duration.js.map +1 -0
  142. package/dist/policies/extract.d.ts +50 -0
  143. package/dist/policies/extract.js +190 -0
  144. package/dist/policies/extract.js.map +1 -0
  145. package/dist/policies/index.d.ts +5 -0
  146. package/dist/policies/index.js +6 -0
  147. package/dist/policies/index.js.map +1 -0
  148. package/dist/policies/ledger-client.d.ts +39 -0
  149. package/dist/policies/ledger-client.js +378 -0
  150. package/dist/policies/ledger-client.js.map +1 -0
  151. package/dist/policies/requires.d.ts +44 -0
  152. package/dist/policies/requires.js +146 -0
  153. package/dist/policies/requires.js.map +1 -0
  154. package/dist/policies/timestamp.d.ts +14 -0
  155. package/dist/policies/timestamp.js +36 -0
  156. package/dist/policies/timestamp.js.map +1 -0
  157. package/dist/probes/mcp.d.ts +29 -0
  158. package/dist/probes/mcp.js +226 -0
  159. package/dist/probes/mcp.js.map +1 -0
  160. package/dist/probes/memory.d.ts +24 -0
  161. package/dist/probes/memory.js +89 -0
  162. package/dist/probes/memory.js.map +1 -0
  163. package/dist/runtime/index.d.ts +3 -0
  164. package/dist/runtime/index.js +4 -0
  165. package/dist/runtime/index.js.map +1 -0
  166. package/dist/runtime/intercept.d.ts +53 -0
  167. package/dist/runtime/intercept.js +181 -0
  168. package/dist/runtime/intercept.js.map +1 -0
  169. package/dist/runtime/ledger-record.d.ts +43 -0
  170. package/dist/runtime/ledger-record.js +239 -0
  171. package/dist/runtime/ledger-record.js.map +1 -0
  172. package/dist/runtime/session-id.d.ts +10 -0
  173. package/dist/runtime/session-id.js +37 -0
  174. package/dist/runtime/session-id.js.map +1 -0
  175. package/dist/schema/extract.d.ts +5 -0
  176. package/dist/schema/extract.js +23 -0
  177. package/dist/schema/extract.js.map +1 -0
  178. package/dist/schema/grounding.d.ts +65 -0
  179. package/dist/schema/grounding.js +21 -0
  180. package/dist/schema/grounding.js.map +1 -0
  181. package/dist/schema/hooks.d.ts +86 -0
  182. package/dist/schema/hooks.js +42 -0
  183. package/dist/schema/hooks.js.map +1 -0
  184. package/dist/schema/index.d.ts +961 -0
  185. package/dist/schema/index.js +55 -0
  186. package/dist/schema/index.js.map +1 -0
  187. package/dist/schema/memory.d.ts +131 -0
  188. package/dist/schema/memory.js +38 -0
  189. package/dist/schema/memory.js.map +1 -0
  190. package/dist/schema/policies.d.ts +412 -0
  191. package/dist/schema/policies.js +53 -0
  192. package/dist/schema/policies.js.map +1 -0
  193. package/dist/schema/requires.d.ts +115 -0
  194. package/dist/schema/requires.js +57 -0
  195. package/dist/schema/requires.js.map +1 -0
  196. package/dist/schema/tools.d.ts +283 -0
  197. package/dist/schema/tools.js +66 -0
  198. package/dist/schema/tools.js.map +1 -0
  199. package/package.json +63 -0
@@ -0,0 +1,43 @@
1
+ import { type LedgerEntry } from "../policies/index.js";
2
+ import type { PolicyDecision } from "./intercept.js";
3
+ export interface LedgerRecordOptions {
4
+ mcpCommand: string[];
5
+ mcpEnv?: Record<string, string>;
6
+ cwd?: string;
7
+ timeoutMs?: number;
8
+ }
9
+ export interface PolicyDecisionPayload {
10
+ name: string;
11
+ outcome: PolicyDecision["outcome"];
12
+ enforcement: PolicyDecision["enforcement"];
13
+ reason: string;
14
+ ledgerTag: string;
15
+ extractValues: Record<string, string>;
16
+ requiresEval?: {
17
+ matchedCount: number;
18
+ reason: string;
19
+ };
20
+ evaluatedAt: string;
21
+ }
22
+ export declare function payloadFromDecision(decision: PolicyDecision): PolicyDecisionPayload;
23
+ export declare function encodeLedgerContent(payload: PolicyDecisionPayload): string;
24
+ /**
25
+ * Phase 5 #9 — preferred sort key for policy_decision rows.
26
+ *
27
+ * `evidence-ledger` stores `createdAt` at 1-second precision (SQLite
28
+ * `datetime('now')`), so two decisions evaluated within the same wall-
29
+ * clock second tie at `bt - at === 0`, and a stable sort returns the
30
+ * earliest entry as "latest". The decoded payload's `evaluatedAt` is
31
+ * `Date.toISOString()` (millisecond precision), which actually
32
+ * distinguishes back-to-back fires. Use it as the primary key, with a
33
+ * `createdAt` fallback for any future encoding that lacks `evaluatedAt`.
34
+ *
35
+ * Returns `NaN` only when both fields are unparseable; callers should
36
+ * tolerate ties by treating equal results as preserve-order.
37
+ */
38
+ export declare function decisionSortKey(entry: LedgerEntry, payload: PolicyDecisionPayload): number;
39
+ export declare function decodeLedgerContent(content: string): PolicyDecisionPayload | null;
40
+ export declare function recordPolicyDecision(decision: PolicyDecision, sessionId: string, opts: LedgerRecordOptions): Promise<{
41
+ ok: boolean;
42
+ reason?: string;
43
+ }>;
@@ -0,0 +1,239 @@
1
+ // Phase 4 #5 — `policy_decision` audit-log writer.
2
+ //
3
+ // Writes one ledger entry per policy decision via grounding-mcp's
4
+ // `ledger_add` verb. The verb only accepts the four fact/hypothesis/rejected/
5
+ // unknown types, so we stash the structured payload as JSON inside `content`
6
+ // behind a `policy_decision:` prefix that `harness audit` and
7
+ // `harness explain --trace` (Phase 4 #6/#7) grep for.
8
+ import { spawn } from "node:child_process";
9
+ import { parseLedgerTimestamp } from "../policies/index.js";
10
+ const DEFAULT_TIMEOUT_MS = 5_000;
11
+ const SOURCE = "harness-policy-intercept";
12
+ const PREFIX = "policy_decision";
13
+ function expandHomePath(p) {
14
+ if (p === "~")
15
+ return process.env.HOME ?? "";
16
+ if (p.startsWith("~/"))
17
+ return `${process.env.HOME ?? ""}/${p.slice(2)}`;
18
+ return p;
19
+ }
20
+ export function payloadFromDecision(decision) {
21
+ return {
22
+ name: decision.policyName,
23
+ outcome: decision.outcome,
24
+ enforcement: decision.enforcement,
25
+ reason: decision.reason,
26
+ ledgerTag: decision.ledgerTag,
27
+ extractValues: decision.extractValues,
28
+ ...(decision.requiresEval && { requiresEval: decision.requiresEval }),
29
+ evaluatedAt: decision.evaluatedAt,
30
+ };
31
+ }
32
+ export function encodeLedgerContent(payload) {
33
+ return `${PREFIX}:${payload.name}:${payload.outcome} ${JSON.stringify(payload)}`;
34
+ }
35
+ /**
36
+ * Phase 5 #9 — preferred sort key for policy_decision rows.
37
+ *
38
+ * `evidence-ledger` stores `createdAt` at 1-second precision (SQLite
39
+ * `datetime('now')`), so two decisions evaluated within the same wall-
40
+ * clock second tie at `bt - at === 0`, and a stable sort returns the
41
+ * earliest entry as "latest". The decoded payload's `evaluatedAt` is
42
+ * `Date.toISOString()` (millisecond precision), which actually
43
+ * distinguishes back-to-back fires. Use it as the primary key, with a
44
+ * `createdAt` fallback for any future encoding that lacks `evaluatedAt`.
45
+ *
46
+ * Returns `NaN` only when both fields are unparseable; callers should
47
+ * tolerate ties by treating equal results as preserve-order.
48
+ */
49
+ export function decisionSortKey(entry, payload) {
50
+ const evaluatedMs = parseLedgerTimestamp(payload.evaluatedAt);
51
+ if (!Number.isNaN(evaluatedMs))
52
+ return evaluatedMs;
53
+ if (entry.createdAt instanceof Date)
54
+ return entry.createdAt.getTime();
55
+ return parseLedgerTimestamp(entry.createdAt);
56
+ }
57
+ export function decodeLedgerContent(content) {
58
+ if (!content.startsWith(`${PREFIX}:`))
59
+ return null;
60
+ const space = content.indexOf(" ");
61
+ if (space === -1)
62
+ return null;
63
+ try {
64
+ const obj = JSON.parse(content.slice(space + 1));
65
+ return obj;
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ export async function recordPolicyDecision(decision, sessionId, opts) {
72
+ const list = opts.mcpCommand;
73
+ if (!list || list.length === 0) {
74
+ return { ok: false, reason: "grounding-mcp command is empty" };
75
+ }
76
+ const exe = expandHomePath(list[0]);
77
+ const args = list.slice(1).map(expandHomePath);
78
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
79
+ const payload = payloadFromDecision(decision);
80
+ const content = encodeLedgerContent(payload);
81
+ return new Promise((resolve) => {
82
+ let child;
83
+ try {
84
+ child = spawn(exe, args, {
85
+ cwd: opts.cwd,
86
+ env: { ...process.env, ...(opts.mcpEnv ?? {}) },
87
+ stdio: ["pipe", "pipe", "pipe"],
88
+ });
89
+ }
90
+ catch (err) {
91
+ resolve({ ok: false, reason: `spawn failed: ${err.message}` });
92
+ return;
93
+ }
94
+ let settled = false;
95
+ const settle = (r) => {
96
+ if (settled)
97
+ return;
98
+ settled = true;
99
+ try {
100
+ child.kill("SIGTERM");
101
+ }
102
+ catch {
103
+ /* ignore */
104
+ }
105
+ resolve(r);
106
+ };
107
+ let stdoutBuf = "";
108
+ let stderrBuf = "";
109
+ let recordSent = false;
110
+ let fallbackSent = false;
111
+ /**
112
+ * Phase 5 #4 — write attempt with type='policy_decision'. When
113
+ * the connected grounding-mcp pre-dates that change, the call
114
+ * returns a zod / CHECK constraint error; we then retry with the
115
+ * legacy type='fact' + prefix-encoded content path.
116
+ */
117
+ const sendInitialAdd = () => {
118
+ child.stdin.write(`${JSON.stringify({
119
+ jsonrpc: "2.0",
120
+ id: 2,
121
+ method: "tools/call",
122
+ params: {
123
+ name: "ledger_add",
124
+ arguments: {
125
+ sessionId,
126
+ type: "policy_decision",
127
+ content,
128
+ source: SOURCE,
129
+ },
130
+ },
131
+ })}\n`);
132
+ };
133
+ const sendFallbackAdd = () => {
134
+ fallbackSent = true;
135
+ child.stdin.write(`${JSON.stringify({
136
+ jsonrpc: "2.0",
137
+ id: 3,
138
+ method: "tools/call",
139
+ params: {
140
+ name: "ledger_add",
141
+ arguments: {
142
+ sessionId,
143
+ type: "fact",
144
+ content,
145
+ source: SOURCE,
146
+ },
147
+ },
148
+ })}\n`);
149
+ };
150
+ child.stdout.on("data", (chunk) => {
151
+ stdoutBuf += chunk.toString("utf8");
152
+ let nl = stdoutBuf.indexOf("\n");
153
+ while (nl !== -1) {
154
+ const line = stdoutBuf.slice(0, nl).trim();
155
+ stdoutBuf = stdoutBuf.slice(nl + 1);
156
+ if (line) {
157
+ try {
158
+ const msg = JSON.parse(line);
159
+ if (msg.id === 1 && !recordSent) {
160
+ child.stdin.write(`${JSON.stringify({
161
+ jsonrpc: "2.0",
162
+ method: "notifications/initialized",
163
+ })}\n`);
164
+ sendInitialAdd();
165
+ recordSent = true;
166
+ }
167
+ else if (msg.id === 2) {
168
+ if (msg.error) {
169
+ // Likely an old grounding-mcp without the
170
+ // policy_decision enum value — retry once with the
171
+ // legacy fact-with-prefix encoding.
172
+ if (!fallbackSent) {
173
+ sendFallbackAdd();
174
+ return;
175
+ }
176
+ settle({
177
+ ok: false,
178
+ reason: `ledger_add error: ${msg.error.message ?? "unknown"}`,
179
+ });
180
+ return;
181
+ }
182
+ settle({ ok: true });
183
+ return;
184
+ }
185
+ else if (msg.id === 3) {
186
+ if (msg.error) {
187
+ settle({
188
+ ok: false,
189
+ reason: `ledger_add error: ${msg.error.message ?? "unknown"}`,
190
+ });
191
+ return;
192
+ }
193
+ settle({ ok: true });
194
+ return;
195
+ }
196
+ }
197
+ catch {
198
+ /* ignore non-JSON */
199
+ }
200
+ }
201
+ nl = stdoutBuf.indexOf("\n");
202
+ }
203
+ });
204
+ child.stderr.on("data", (c) => {
205
+ stderrBuf += c.toString("utf8");
206
+ });
207
+ child.on("error", (err) => {
208
+ settle({ ok: false, reason: `spawn failed: ${err.message}` });
209
+ });
210
+ child.on("exit", () => {
211
+ const tail = stderrBuf.trim().split("\n").pop()?.trim() || "(no stderr)";
212
+ settle({ ok: false, reason: `grounding-mcp exited: ${tail}` });
213
+ });
214
+ child.stdin.on("error", () => {
215
+ /* EPIPE; exit listener handles */
216
+ });
217
+ try {
218
+ child.stdin.write(`${JSON.stringify({
219
+ jsonrpc: "2.0",
220
+ id: 1,
221
+ method: "initialize",
222
+ params: {
223
+ protocolVersion: "2024-11-05",
224
+ capabilities: {},
225
+ clientInfo: { name: "harness-policy-intercept", version: "0.4.0" },
226
+ },
227
+ })}\n`);
228
+ }
229
+ catch (err) {
230
+ settle({ ok: false, reason: `init write failed: ${err.message}` });
231
+ return;
232
+ }
233
+ const t = setTimeout(() => {
234
+ settle({ ok: false, reason: `grounding-mcp timeout after ${timeoutMs}ms` });
235
+ }, timeoutMs);
236
+ t.unref();
237
+ });
238
+ }
239
+ //# sourceMappingURL=ledger-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-record.js","sourceRoot":"","sources":["../../src/runtime/ledger-record.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Resolve the active grounding session id.
3
+ *
4
+ * Empty strings are treated as "not provided" — both for the explicit
5
+ * argument and for the env var, since `--session ''` from a forgetful
6
+ * shell expansion or `CLAUDE_SESSION_ID=` from a stale exec env should
7
+ * fall through to the next tier rather than be honoured as a literal
8
+ * empty session.
9
+ */
10
+ export declare function resolveSessionId(explicit?: string): string;
@@ -0,0 +1,37 @@
1
+ // Phase 5 #2 — shared sessionId resolver.
2
+ //
3
+ // Three Phase 4 verbs (`audit`, `explain --trace`, `policy intercept`)
4
+ // previously defaulted to the literal string `"default"` when no
5
+ // session was given. Real Claude Code sessions are UUIDs that arrive
6
+ // via the hook event's `session_id`. When the user later runs
7
+ // `harness audit` or `harness explain --trace` without `--session`, the
8
+ // read path looked at `"default"` and silently returned an empty
9
+ // audit/trace even though the writes had landed correctly under the
10
+ // real UUID.
11
+ //
12
+ // This helper lifts the precedence chain into one place:
13
+ // 1. explicit value (from a `--session` flag or the runtime's
14
+ // `event.session_id`)
15
+ // 2. `$CLAUDE_SESSION_ID` env (set by the Claude Code harness inside
16
+ // every session)
17
+ // 3. literal `"default"` — preserves prior behaviour for ad-hoc
18
+ // invocations outside a Claude Code session.
19
+ const FALLBACK = "default";
20
+ /**
21
+ * Resolve the active grounding session id.
22
+ *
23
+ * Empty strings are treated as "not provided" — both for the explicit
24
+ * argument and for the env var, since `--session ''` from a forgetful
25
+ * shell expansion or `CLAUDE_SESSION_ID=` from a stale exec env should
26
+ * fall through to the next tier rather than be honoured as a literal
27
+ * empty session.
28
+ */
29
+ export function resolveSessionId(explicit) {
30
+ if (typeof explicit === "string" && explicit.length > 0)
31
+ return explicit;
32
+ const env = process.env.CLAUDE_SESSION_ID;
33
+ if (typeof env === "string" && env.length > 0)
34
+ return env;
35
+ return FALLBACK;
36
+ }
37
+ //# sourceMappingURL=session-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-id.js","sourceRoot":"","sources":["../../src/runtime/session-id.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,uEAAuE;AACvE,iEAAiE;AACjE,qEAAqE;AACrE,8DAA8D;AAC9D,wEAAwE;AACxE,iEAAiE;AACjE,oEAAoE;AACpE,aAAa;AACb,EAAE;AACF,yDAAyD;AACzD,gEAAgE;AAChE,2BAA2B;AAC3B,uEAAuE;AACvE,sBAAsB;AACtB,kEAAkE;AAClE,kDAAkD;AAElD,MAAM,QAAQ,GAAG,SAAS,CAAC;AAE3B;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAiB;IAChD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IACzE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC1C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAC1D,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { z } from "zod";
2
+ export declare const ExtractExpressionSchema: z.ZodEffects<z.ZodString, string, string>;
3
+ export type ExtractExpression = z.infer<typeof ExtractExpressionSchema>;
4
+ export declare const ExtractMapSchema: z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodEffects<z.ZodString, string, string>>, Record<string, string>, Record<string, string>>;
5
+ export type ExtractMap = z.infer<typeof ExtractMapSchema>;
@@ -0,0 +1,23 @@
1
+ import { z } from "zod";
2
+ import { ExtractGrammarError, validateExtractGrammar, } from "../policies/extract.js";
3
+ export const ExtractExpressionSchema = z.string().min(1).superRefine((v, ctx) => {
4
+ try {
5
+ validateExtractGrammar(v);
6
+ }
7
+ catch (err) {
8
+ if (err instanceof ExtractGrammarError) {
9
+ // Strip the leading `extract expression "<expr>": ` prefix so the
10
+ // message reads naturally next to the zod path. The path already
11
+ // points at the offending field.
12
+ const msg = err.message.replace(/^extract expression "[^"]*": /, "");
13
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: msg });
14
+ return;
15
+ }
16
+ throw err;
17
+ }
18
+ });
19
+ const VAR_NAME_RE = /^[A-Z][A-Z0-9_]*$/;
20
+ export const ExtractMapSchema = z
21
+ .record(ExtractExpressionSchema)
22
+ .refine((m) => Object.keys(m).every((k) => VAR_NAME_RE.test(k)), { message: "extract variable names must be SCREAMING_SNAKE_CASE" });
23
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/schema/extract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;IAC9E,IAAI,CAAC;QACH,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,mBAAmB,EAAE,CAAC;YACvC,kEAAkE;YAClE,iEAAiE;YACjE,iCAAiC;YACjC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC;YACrE,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC,CAAC,CAAC;AAIH,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAExC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC;KAC9B,MAAM,CAAC,uBAAuB,CAAC;KAC/B,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EACvD,EAAE,OAAO,EAAE,qDAAqD,EAAE,CACnE,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { z } from "zod";
2
+ export declare const GroundingSessionSchema: z.ZodObject<{
3
+ auto_start: z.ZodDefault<z.ZodBoolean>;
4
+ id_format: z.ZodDefault<z.ZodString>;
5
+ }, "strict", z.ZodTypeAny, {
6
+ auto_start: boolean;
7
+ id_format: string;
8
+ }, {
9
+ auto_start?: boolean | undefined;
10
+ id_format?: string | undefined;
11
+ }>;
12
+ export declare const EvidenceLedgerSchema: z.ZodObject<{
13
+ path: z.ZodDefault<z.ZodString>;
14
+ retention_days: z.ZodDefault<z.ZodNumber>;
15
+ }, "strict", z.ZodTypeAny, {
16
+ path: string;
17
+ retention_days: number;
18
+ }, {
19
+ path?: string | undefined;
20
+ retention_days?: number | undefined;
21
+ }>;
22
+ export declare const GroundingSchema: z.ZodObject<{
23
+ session: z.ZodDefault<z.ZodObject<{
24
+ auto_start: z.ZodDefault<z.ZodBoolean>;
25
+ id_format: z.ZodDefault<z.ZodString>;
26
+ }, "strict", z.ZodTypeAny, {
27
+ auto_start: boolean;
28
+ id_format: string;
29
+ }, {
30
+ auto_start?: boolean | undefined;
31
+ id_format?: string | undefined;
32
+ }>>;
33
+ evidence_ledger: z.ZodDefault<z.ZodObject<{
34
+ path: z.ZodDefault<z.ZodString>;
35
+ retention_days: z.ZodDefault<z.ZodNumber>;
36
+ }, "strict", z.ZodTypeAny, {
37
+ path: string;
38
+ retention_days: number;
39
+ }, {
40
+ path?: string | undefined;
41
+ retention_days?: number | undefined;
42
+ }>>;
43
+ policies_source: z.ZodDefault<z.ZodNullable<z.ZodString>>;
44
+ }, "strict", z.ZodTypeAny, {
45
+ session: {
46
+ auto_start: boolean;
47
+ id_format: string;
48
+ };
49
+ evidence_ledger: {
50
+ path: string;
51
+ retention_days: number;
52
+ };
53
+ policies_source: string | null;
54
+ }, {
55
+ session?: {
56
+ auto_start?: boolean | undefined;
57
+ id_format?: string | undefined;
58
+ } | undefined;
59
+ evidence_ledger?: {
60
+ path?: string | undefined;
61
+ retention_days?: number | undefined;
62
+ } | undefined;
63
+ policies_source?: string | null | undefined;
64
+ }>;
65
+ export type Grounding = z.infer<typeof GroundingSchema>;
@@ -0,0 +1,21 @@
1
+ import { z } from "zod";
2
+ export const GroundingSessionSchema = z
3
+ .object({
4
+ auto_start: z.boolean().default(true),
5
+ id_format: z.string().min(1).default("gs-{repo}-{rand:8}"),
6
+ })
7
+ .strict();
8
+ export const EvidenceLedgerSchema = z
9
+ .object({
10
+ path: z.string().min(1).default("~/.evidence-ledger/ledger.db"),
11
+ retention_days: z.number().int().positive().default(90),
12
+ })
13
+ .strict();
14
+ export const GroundingSchema = z
15
+ .object({
16
+ session: GroundingSessionSchema.default({}),
17
+ evidence_ledger: EvidenceLedgerSchema.default({}),
18
+ policies_source: z.string().min(1).nullable().default(null),
19
+ })
20
+ .strict();
21
+ //# sourceMappingURL=grounding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grounding.js","sourceRoot":"","sources":["../../src/schema/grounding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC;KACpC,MAAM,CAAC;IACN,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACrC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC;CAC3D,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC;KAClC,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,8BAA8B,CAAC;IAC/D,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;CACxD,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC;KAC7B,MAAM,CAAC;IACN,OAAO,EAAE,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3C,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC;IACjD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CAC5D,CAAC;KACD,MAAM,EAAE,CAAC"}
@@ -0,0 +1,86 @@
1
+ import { z } from "zod";
2
+ export declare const HookEventSchema: z.ZodEnum<["SessionStart", "UserPromptSubmit", "PreToolUse", "PostToolUse", "Stop", "SubagentStop", "PreCompact"]>;
3
+ export declare const HookBlockingSchema: z.ZodUnion<[z.ZodLiteral<false>, z.ZodLiteral<"soft">, z.ZodLiteral<"hard">]>;
4
+ export declare const HookSchema: z.ZodObject<{
5
+ name: z.ZodString;
6
+ event: z.ZodEnum<["SessionStart", "UserPromptSubmit", "PreToolUse", "PostToolUse", "Stop", "SubagentStop", "PreCompact"]>;
7
+ command: z.ZodString;
8
+ match: z.ZodOptional<z.ZodString>;
9
+ path_match: z.ZodOptional<z.ZodString>;
10
+ bash_match: z.ZodOptional<z.ZodString>;
11
+ blocking: z.ZodUnion<[z.ZodLiteral<false>, z.ZodLiteral<"soft">, z.ZodLiteral<"hard">]>;
12
+ budget_ms: z.ZodDefault<z.ZodNumber>;
13
+ description: z.ZodOptional<z.ZodString>;
14
+ }, "strict", z.ZodTypeAny, {
15
+ name: string;
16
+ event: "SessionStart" | "UserPromptSubmit" | "PreToolUse" | "PostToolUse" | "Stop" | "SubagentStop" | "PreCompact";
17
+ command: string;
18
+ blocking: false | "soft" | "hard";
19
+ budget_ms: number;
20
+ match?: string | undefined;
21
+ path_match?: string | undefined;
22
+ bash_match?: string | undefined;
23
+ description?: string | undefined;
24
+ }, {
25
+ name: string;
26
+ event: "SessionStart" | "UserPromptSubmit" | "PreToolUse" | "PostToolUse" | "Stop" | "SubagentStop" | "PreCompact";
27
+ command: string;
28
+ blocking: false | "soft" | "hard";
29
+ match?: string | undefined;
30
+ path_match?: string | undefined;
31
+ bash_match?: string | undefined;
32
+ budget_ms?: number | undefined;
33
+ description?: string | undefined;
34
+ }>;
35
+ export declare const HooksSchema: z.ZodEffects<z.ZodArray<z.ZodObject<{
36
+ name: z.ZodString;
37
+ event: z.ZodEnum<["SessionStart", "UserPromptSubmit", "PreToolUse", "PostToolUse", "Stop", "SubagentStop", "PreCompact"]>;
38
+ command: z.ZodString;
39
+ match: z.ZodOptional<z.ZodString>;
40
+ path_match: z.ZodOptional<z.ZodString>;
41
+ bash_match: z.ZodOptional<z.ZodString>;
42
+ blocking: z.ZodUnion<[z.ZodLiteral<false>, z.ZodLiteral<"soft">, z.ZodLiteral<"hard">]>;
43
+ budget_ms: z.ZodDefault<z.ZodNumber>;
44
+ description: z.ZodOptional<z.ZodString>;
45
+ }, "strict", z.ZodTypeAny, {
46
+ name: string;
47
+ event: "SessionStart" | "UserPromptSubmit" | "PreToolUse" | "PostToolUse" | "Stop" | "SubagentStop" | "PreCompact";
48
+ command: string;
49
+ blocking: false | "soft" | "hard";
50
+ budget_ms: number;
51
+ match?: string | undefined;
52
+ path_match?: string | undefined;
53
+ bash_match?: string | undefined;
54
+ description?: string | undefined;
55
+ }, {
56
+ name: string;
57
+ event: "SessionStart" | "UserPromptSubmit" | "PreToolUse" | "PostToolUse" | "Stop" | "SubagentStop" | "PreCompact";
58
+ command: string;
59
+ blocking: false | "soft" | "hard";
60
+ match?: string | undefined;
61
+ path_match?: string | undefined;
62
+ bash_match?: string | undefined;
63
+ budget_ms?: number | undefined;
64
+ description?: string | undefined;
65
+ }>, "many">, {
66
+ name: string;
67
+ event: "SessionStart" | "UserPromptSubmit" | "PreToolUse" | "PostToolUse" | "Stop" | "SubagentStop" | "PreCompact";
68
+ command: string;
69
+ blocking: false | "soft" | "hard";
70
+ budget_ms: number;
71
+ match?: string | undefined;
72
+ path_match?: string | undefined;
73
+ bash_match?: string | undefined;
74
+ description?: string | undefined;
75
+ }[], {
76
+ name: string;
77
+ event: "SessionStart" | "UserPromptSubmit" | "PreToolUse" | "PostToolUse" | "Stop" | "SubagentStop" | "PreCompact";
78
+ command: string;
79
+ blocking: false | "soft" | "hard";
80
+ match?: string | undefined;
81
+ path_match?: string | undefined;
82
+ bash_match?: string | undefined;
83
+ budget_ms?: number | undefined;
84
+ description?: string | undefined;
85
+ }[]>;
86
+ export type Hook = z.infer<typeof HookSchema>;
@@ -0,0 +1,42 @@
1
+ import { z } from "zod";
2
+ export const HookEventSchema = z.enum([
3
+ "SessionStart",
4
+ "UserPromptSubmit",
5
+ "PreToolUse",
6
+ "PostToolUse",
7
+ "Stop",
8
+ "SubagentStop",
9
+ "PreCompact",
10
+ ]);
11
+ export const HookBlockingSchema = z.union([
12
+ z.literal(false),
13
+ z.literal("soft"),
14
+ z.literal("hard"),
15
+ ]);
16
+ export const HookSchema = z
17
+ .object({
18
+ name: z.string().min(1),
19
+ event: HookEventSchema,
20
+ command: z.string().min(1),
21
+ match: z.string().min(1).optional(),
22
+ path_match: z.string().min(1).optional(),
23
+ bash_match: z.string().min(1).optional(),
24
+ blocking: HookBlockingSchema,
25
+ budget_ms: z.number().int().positive().default(30000),
26
+ description: z.string().optional(),
27
+ })
28
+ .strict();
29
+ export const HooksSchema = z.array(HookSchema).superRefine((hooks, ctx) => {
30
+ const seen = new Set();
31
+ hooks.forEach((h, i) => {
32
+ if (seen.has(h.name)) {
33
+ ctx.addIssue({
34
+ code: z.ZodIssueCode.custom,
35
+ path: [i, "name"],
36
+ message: `duplicate hook name: ${h.name}`,
37
+ });
38
+ }
39
+ seen.add(h.name);
40
+ });
41
+ });
42
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/schema/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC;IACpC,cAAc;IACd,kBAAkB;IAClB,YAAY;IACZ,aAAa;IACb,MAAM;IACN,cAAc;IACd,YAAY;CACb,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC;IACxC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAChB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACjB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;CAClB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC;KACxB,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,KAAK,EAAE,eAAe;IACtB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACnC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxC,QAAQ,EAAE,kBAAkB;IAC5B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACrD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACxE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,GAAG,CAAC,QAAQ,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC;gBACjB,OAAO,EAAE,wBAAwB,CAAC,CAAC,IAAI,EAAE;aAC1C,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}