@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,50 @@
1
+ const SHORTHAND_RE = /^([0-9]+)(s|m|h|d)$/;
2
+ const ISO_RE = /^P(?!$)(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)W)?(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?)?$/;
3
+ const SECONDS = {
4
+ s: 1,
5
+ m: 60,
6
+ h: 60 * 60,
7
+ d: 24 * 60 * 60,
8
+ };
9
+ const ISO_SECONDS = {
10
+ year: 365 * 24 * 60 * 60,
11
+ month: 30 * 24 * 60 * 60,
12
+ week: 7 * 24 * 60 * 60,
13
+ day: 24 * 60 * 60,
14
+ hour: 60 * 60,
15
+ minute: 60,
16
+ second: 1,
17
+ };
18
+ export class InvalidDurationError extends Error {
19
+ value;
20
+ constructor(value) {
21
+ super(`invalid duration "${value}": expected shorthand like "24h" / "30m" / "7d" / "60s" or an ISO-8601 duration like "PT1H" / "P1D"`);
22
+ this.value = value;
23
+ this.name = "InvalidDurationError";
24
+ }
25
+ }
26
+ export function parseDurationSeconds(value) {
27
+ const trimmed = value.trim();
28
+ const short = SHORTHAND_RE.exec(trimmed);
29
+ if (short) {
30
+ const n = Number.parseInt(short[1], 10);
31
+ const unit = short[2];
32
+ return n * SECONDS[unit];
33
+ }
34
+ const iso = ISO_RE.exec(trimmed);
35
+ if (iso) {
36
+ const [, y, mo, w, d, h, mi, s] = iso;
37
+ const total = (Number(y ?? 0) * ISO_SECONDS.year) +
38
+ (Number(mo ?? 0) * ISO_SECONDS.month) +
39
+ (Number(w ?? 0) * ISO_SECONDS.week) +
40
+ (Number(d ?? 0) * ISO_SECONDS.day) +
41
+ (Number(h ?? 0) * ISO_SECONDS.hour) +
42
+ (Number(mi ?? 0) * ISO_SECONDS.minute) +
43
+ (Number(s ?? 0) * ISO_SECONDS.second);
44
+ if (total === 0)
45
+ throw new InvalidDurationError(value);
46
+ return total;
47
+ }
48
+ throw new InvalidDurationError(value);
49
+ }
50
+ //# sourceMappingURL=duration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration.js","sourceRoot":"","sources":["../../src/policies/duration.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAC3C,MAAM,MAAM,GACV,6FAA6F,CAAC;AAEhG,MAAM,OAAO,GAAG;IACd,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE,GAAG,EAAE;IACV,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;CACP,CAAC;AAEX,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;IACxB,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;IACxB,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;IACtB,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;IACjB,IAAI,EAAE,EAAE,GAAG,EAAE;IACb,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,CAAC;CACD,CAAC;AAEX,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACjB;IAA5B,YAA4B,KAAa;QACvC,KAAK,CACH,qBAAqB,KAAK,qGAAqG,CAChI,CAAC;QAHwB,UAAK,GAAL,KAAK,CAAQ;QAIvC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAyB,CAAC;QAC9C,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;QACtC,MAAM,KAAK,GACT,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC;YACnC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;YACrC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC;YACnC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC;YAClC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC;YACnC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC;YACtC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,KAAK,KAAK,CAAC;YAAE,MAAM,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,50 @@
1
+ declare const NAMESPACES: readonly ["toolArgs", "event", "session", "git"];
2
+ type Namespace = (typeof NAMESPACES)[number];
3
+ export declare class ExtractGrammarError extends Error {
4
+ readonly expression: string;
5
+ constructor(message: string, expression: string);
6
+ }
7
+ export type ExtractSegment = {
8
+ kind: "identifier";
9
+ key: string;
10
+ } | {
11
+ kind: "bracket";
12
+ key: string;
13
+ };
14
+ export interface ExtractPath {
15
+ namespace: Namespace;
16
+ segments: ExtractSegment[];
17
+ }
18
+ export declare function parseExtractExpression(expr: string): ExtractPath;
19
+ export declare function validateExtractGrammar(expr: string): void;
20
+ export interface ExtractEventContext {
21
+ toolArgs?: unknown;
22
+ event?: unknown;
23
+ session?: unknown;
24
+ git?: unknown;
25
+ }
26
+ export interface ExtractBuiltins {
27
+ SESSION_ID: string;
28
+ REPO: string;
29
+ BRANCH: string;
30
+ TOOL_NAME: string;
31
+ CWD: string;
32
+ }
33
+ export type ExtractTraceSource = "extract" | "builtin" | "missing";
34
+ export interface ExtractTraceEntry {
35
+ var: string;
36
+ expression: string;
37
+ resolved: string;
38
+ source: ExtractTraceSource;
39
+ }
40
+ export interface ExtractEvaluation {
41
+ values: Record<string, string>;
42
+ traceData: ExtractTraceEntry[];
43
+ }
44
+ export declare function evaluateExtract(extracts: Record<string, string>, ctx: ExtractEventContext, builtins: ExtractBuiltins): ExtractEvaluation;
45
+ export interface SubstituteTemplateResult {
46
+ result: string;
47
+ missing: string[];
48
+ }
49
+ export declare function substituteTemplate(template: string, values: Record<string, string>): SubstituteTemplateResult;
50
+ export {};
@@ -0,0 +1,190 @@
1
+ // Phase 4 #2 — trigger.extract evaluator
2
+ //
3
+ // TODO(Phase 4 #4): replace `src/schema/extract.ts` EXTRACT_ROOT_RE with
4
+ // a `parseExtractExpression`-backed `.refine`. The schema today rejects the
5
+ // bracket-quoted form this parser supports; #4 is when validate enhancements
6
+ // land and the two surfaces get unified.
7
+ //
8
+ // Implements the JSONPath-restricted DSL described in ARCHITECTURE.md §6
9
+ // "trigger.extract: generic variable extraction":
10
+ //
11
+ // <namespace>.<segment>(<segment>)*
12
+ //
13
+ // where namespace ∈ { toolArgs, event, session, git } and a segment is either
14
+ // `.identifier` or `["quoted key"]` (single or double quotes). The grammar
15
+ // deliberately rejects function calls, numeric/slice indices, and any other
16
+ // JSON-Path constructs so validate-time analysis stays statically decidable.
17
+ const NAMESPACES = ["toolArgs", "event", "session", "git"];
18
+ const NAMESPACE_RE = /^(toolArgs|event|session|git)\b/;
19
+ const IDENTIFIER_RE = /^[A-Za-z_][A-Za-z0-9_]*/;
20
+ const NUMERIC_INDEX_RE = /^-?\d/;
21
+ export class ExtractGrammarError extends Error {
22
+ expression;
23
+ constructor(message, expression) {
24
+ super(`extract expression "${expression}": ${message}`);
25
+ this.expression = expression;
26
+ this.name = "ExtractGrammarError";
27
+ }
28
+ }
29
+ export function parseExtractExpression(expr) {
30
+ if (typeof expr !== "string" || expr.length === 0) {
31
+ throw new ExtractGrammarError("expression must be a non-empty string", String(expr));
32
+ }
33
+ const rootMatch = NAMESPACE_RE.exec(expr);
34
+ if (!rootMatch) {
35
+ const ident = IDENTIFIER_RE.exec(expr);
36
+ if (ident) {
37
+ throw new ExtractGrammarError(`unknown namespace \`${ident[0]}\``, expr);
38
+ }
39
+ throw new ExtractGrammarError("expression must begin with one of toolArgs / event / session / git", expr);
40
+ }
41
+ const namespace = rootMatch[1];
42
+ let i = rootMatch[0].length;
43
+ const segments = [];
44
+ while (i < expr.length) {
45
+ const ch = expr[i];
46
+ if (ch === ".") {
47
+ i++;
48
+ const id = IDENTIFIER_RE.exec(expr.slice(i));
49
+ if (!id) {
50
+ throw new ExtractGrammarError(`expected identifier after '.'`, expr);
51
+ }
52
+ i += id[0].length;
53
+ if (expr[i] === "(") {
54
+ throw new ExtractGrammarError("function calls not allowed", expr);
55
+ }
56
+ segments.push({ kind: "identifier", key: id[0] });
57
+ }
58
+ else if (ch === "[") {
59
+ i++;
60
+ const next = expr[i];
61
+ if (next === undefined) {
62
+ throw new ExtractGrammarError("unterminated bracket accessor", expr);
63
+ }
64
+ if (NUMERIC_INDEX_RE.test(next)) {
65
+ throw new ExtractGrammarError("array indices not allowed", expr);
66
+ }
67
+ if (next !== '"' && next !== "'") {
68
+ throw new ExtractGrammarError("bracket accessor must be a quoted string key", expr);
69
+ }
70
+ const quote = next;
71
+ i++;
72
+ const end = expr.indexOf(quote, i);
73
+ if (end === -1) {
74
+ throw new ExtractGrammarError("unterminated quoted bracket key", expr);
75
+ }
76
+ const key = expr.slice(i, end);
77
+ if (key.length === 0) {
78
+ throw new ExtractGrammarError("empty bracket key", expr);
79
+ }
80
+ i = end + 1;
81
+ if (expr[i] !== "]") {
82
+ throw new ExtractGrammarError("expected ']' after bracket key", expr);
83
+ }
84
+ i++;
85
+ segments.push({ kind: "bracket", key });
86
+ }
87
+ else if (ch === "(") {
88
+ throw new ExtractGrammarError("function calls not allowed", expr);
89
+ }
90
+ else {
91
+ throw new ExtractGrammarError(`unexpected character '${ch}'`, expr);
92
+ }
93
+ }
94
+ if (segments.length === 0) {
95
+ throw new ExtractGrammarError("expression must include at least one segment after the namespace", expr);
96
+ }
97
+ return { namespace, segments };
98
+ }
99
+ export function validateExtractGrammar(expr) {
100
+ parseExtractExpression(expr);
101
+ }
102
+ function walkPath(path, ctx) {
103
+ let cursor = ctx[path.namespace];
104
+ for (const seg of path.segments) {
105
+ if (cursor === undefined || cursor === null)
106
+ return undefined;
107
+ if (typeof cursor !== "object" || Array.isArray(cursor))
108
+ return undefined;
109
+ cursor = cursor[seg.key];
110
+ }
111
+ return cursor;
112
+ }
113
+ /**
114
+ * Stringify a resolved extract value for substitution into a `${VAR}` template.
115
+ * Strings pass through; numbers/booleans/bigints get `String(...)`. Objects and
116
+ * arrays fall through to `JSON.stringify` — uncommon for v1 paths but stable
117
+ * enough that audit / `explain --trace` consumers can rely on the shape.
118
+ */
119
+ function stringifyResolved(value) {
120
+ if (typeof value === "string")
121
+ return value;
122
+ if (typeof value === "number" || typeof value === "boolean")
123
+ return String(value);
124
+ if (typeof value === "bigint")
125
+ return value.toString();
126
+ return JSON.stringify(value);
127
+ }
128
+ const BUILTIN_NAMES = [
129
+ "SESSION_ID",
130
+ "REPO",
131
+ "BRANCH",
132
+ "TOOL_NAME",
133
+ "CWD",
134
+ ];
135
+ export function evaluateExtract(extracts, ctx, builtins) {
136
+ const values = {};
137
+ const traceData = [];
138
+ // Builtins first; an extract entry with the same name overrides both the
139
+ // value and the trace row so the trace stays one-row-per-variable.
140
+ for (const name of BUILTIN_NAMES) {
141
+ if (Object.prototype.hasOwnProperty.call(extracts, name))
142
+ continue;
143
+ const v = builtins[name];
144
+ values[name] = v;
145
+ traceData.push({
146
+ var: name,
147
+ expression: `<builtin:${name}>`,
148
+ resolved: v,
149
+ source: "builtin",
150
+ });
151
+ }
152
+ for (const [varName, expr] of Object.entries(extracts)) {
153
+ const path = parseExtractExpression(expr);
154
+ const raw = walkPath(path, ctx);
155
+ if (raw === undefined || raw === null) {
156
+ const placeholder = `\${${varName}}`;
157
+ values[varName] = placeholder;
158
+ traceData.push({
159
+ var: varName,
160
+ expression: expr,
161
+ resolved: placeholder,
162
+ source: "missing",
163
+ });
164
+ continue;
165
+ }
166
+ const resolved = stringifyResolved(raw);
167
+ values[varName] = resolved;
168
+ traceData.push({
169
+ var: varName,
170
+ expression: expr,
171
+ resolved,
172
+ source: "extract",
173
+ });
174
+ }
175
+ return { values, traceData };
176
+ }
177
+ const TEMPLATE_VAR_RE = /\$\{([A-Z][A-Z0-9_]*)\}/g;
178
+ export function substituteTemplate(template, values) {
179
+ const missing = [];
180
+ const result = template.replace(TEMPLATE_VAR_RE, (whole, name) => {
181
+ if (Object.prototype.hasOwnProperty.call(values, name)) {
182
+ return values[name];
183
+ }
184
+ if (!missing.includes(name))
185
+ missing.push(name);
186
+ return whole;
187
+ });
188
+ return { result, missing };
189
+ }
190
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/policies/extract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { evaluateRequires, RequiresEvaluationError, type EvaluateRequiresOptions, type LedgerEntry, type RequiresEvaluation, type RequiresTrace, } from "./requires.js";
2
+ export { parseDurationSeconds, InvalidDurationError } from "./duration.js";
3
+ export { parseLedgerTimestamp } from "./timestamp.js";
4
+ export { queryLedgerByTag, type LedgerClientOptions, type LedgerQueryResult, type QueryLedgerOptions, } from "./ledger-client.js";
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";
@@ -0,0 +1,6 @@
1
+ export { evaluateRequires, RequiresEvaluationError, } from "./requires.js";
2
+ export { parseDurationSeconds, InvalidDurationError } from "./duration.js";
3
+ export { parseLedgerTimestamp } from "./timestamp.js";
4
+ export { queryLedgerByTag, } from "./ledger-client.js";
5
+ export { validateExtractGrammar, parseExtractExpression, evaluateExtract, substituteTemplate, ExtractGrammarError, } from "./extract.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/policies/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,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"}
@@ -0,0 +1,39 @@
1
+ import type { LedgerEntry } from "./requires.js";
2
+ export interface LedgerClientOptions {
3
+ /** argv[0..]: the grounding-mcp binary + flags. e.g. `["node", "/path/to/grounding-mcp/dist/server.js"]`. */
4
+ mcpCommand: string[];
5
+ /** Extra env merged onto process.env. */
6
+ mcpEnv?: Record<string, string>;
7
+ /** Working dir for the spawned server. */
8
+ cwd?: string;
9
+ /** Per-call timeout. Default 5 000 ms. */
10
+ timeoutMs?: number;
11
+ }
12
+ export interface QueryLedgerOptions extends LedgerClientOptions {
13
+ /** Required: grounding session whose entries should be returned. */
14
+ sessionId: string;
15
+ /**
16
+ * Phase 5 #5 — optional ISO-8601 UTC cutoff. When the connected
17
+ * grounding-mcp advertises support for `sinceIso` on `ledger_summary`
18
+ * (detected via tools/list), the filter is pushed server-side and
19
+ * the wire payload is narrowed to rows newer than the cutoff. Old
20
+ * servers silently ignore the option and the full session is
21
+ * returned, so consumers must continue to apply their own client-
22
+ * side window filter (this only ever reduces wire bytes).
23
+ */
24
+ sinceIso?: string;
25
+ /**
26
+ * Phase 5 #5 — optional content-prefix filter. Same shape as
27
+ * `sinceIso`: server-side narrowing only when supported, no
28
+ * contract change for client-side post-filtering.
29
+ */
30
+ contentPrefix?: string;
31
+ }
32
+ export type LedgerQueryResult = {
33
+ kind: "ok";
34
+ entries: LedgerEntry[];
35
+ } | {
36
+ kind: "degraded";
37
+ reason: string;
38
+ };
39
+ export declare function queryLedgerByTag(opts: QueryLedgerOptions): Promise<LedgerQueryResult>;