attenu-guard 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/README.md +8 -2
  3. package/dist/cjs/adapters/langgraph.d.ts +27 -3
  4. package/dist/cjs/adapters/langgraph.d.ts.map +1 -1
  5. package/dist/cjs/adapters/langgraph.js +290 -11
  6. package/dist/cjs/adapters/langgraph.js.map +1 -1
  7. package/dist/cjs/audit.d.ts +38 -1
  8. package/dist/cjs/audit.d.ts.map +1 -1
  9. package/dist/cjs/audit.js +69 -8
  10. package/dist/cjs/audit.js.map +1 -1
  11. package/dist/cjs/canonical.d.ts +19 -0
  12. package/dist/cjs/canonical.d.ts.map +1 -1
  13. package/dist/cjs/canonical.js +60 -2
  14. package/dist/cjs/canonical.js.map +1 -1
  15. package/dist/cjs/ceilings.d.ts.map +1 -1
  16. package/dist/cjs/ceilings.js +18 -0
  17. package/dist/cjs/ceilings.js.map +1 -1
  18. package/dist/cjs/chain.d.ts +32 -0
  19. package/dist/cjs/chain.d.ts.map +1 -1
  20. package/dist/cjs/chain.js +0 -0
  21. package/dist/cjs/chain.js.map +1 -1
  22. package/dist/cjs/cli.d.ts.map +1 -1
  23. package/dist/cjs/cli.js +4 -0
  24. package/dist/cjs/cli.js.map +1 -1
  25. package/dist/cjs/evidence.d.ts +41 -2
  26. package/dist/cjs/evidence.d.ts.map +1 -1
  27. package/dist/cjs/evidence.js +571 -13
  28. package/dist/cjs/evidence.js.map +1 -1
  29. package/dist/cjs/guard.d.ts +163 -9
  30. package/dist/cjs/guard.d.ts.map +1 -1
  31. package/dist/cjs/guard.js +426 -26
  32. package/dist/cjs/guard.js.map +1 -1
  33. package/dist/cjs/index.d.ts +12 -9
  34. package/dist/cjs/index.d.ts.map +1 -1
  35. package/dist/cjs/index.js +24 -5
  36. package/dist/cjs/index.js.map +1 -1
  37. package/dist/cjs/params.d.ts +52 -0
  38. package/dist/cjs/params.d.ts.map +1 -0
  39. package/dist/cjs/params.js +97 -0
  40. package/dist/cjs/params.js.map +1 -0
  41. package/dist/cjs/reasons.d.ts +89 -1
  42. package/dist/cjs/reasons.d.ts.map +1 -1
  43. package/dist/cjs/reasons.js +99 -3
  44. package/dist/cjs/reasons.js.map +1 -1
  45. package/dist/cjs/version.d.ts +10 -0
  46. package/dist/cjs/version.d.ts.map +1 -0
  47. package/dist/cjs/version.js +13 -0
  48. package/dist/cjs/version.js.map +1 -0
  49. package/dist/cjs/wire.d.ts.map +1 -1
  50. package/dist/cjs/wire.js +7 -0
  51. package/dist/cjs/wire.js.map +1 -1
  52. package/dist/esm/adapters/langgraph.d.ts +27 -3
  53. package/dist/esm/adapters/langgraph.d.ts.map +1 -1
  54. package/dist/esm/adapters/langgraph.js +290 -11
  55. package/dist/esm/adapters/langgraph.js.map +1 -1
  56. package/dist/esm/audit.d.ts +38 -1
  57. package/dist/esm/audit.d.ts.map +1 -1
  58. package/dist/esm/audit.js +68 -8
  59. package/dist/esm/audit.js.map +1 -1
  60. package/dist/esm/canonical.d.ts +19 -0
  61. package/dist/esm/canonical.d.ts.map +1 -1
  62. package/dist/esm/canonical.js +58 -1
  63. package/dist/esm/canonical.js.map +1 -1
  64. package/dist/esm/ceilings.d.ts.map +1 -1
  65. package/dist/esm/ceilings.js +19 -1
  66. package/dist/esm/ceilings.js.map +1 -1
  67. package/dist/esm/chain.d.ts +32 -0
  68. package/dist/esm/chain.d.ts.map +1 -1
  69. package/dist/esm/chain.js +0 -0
  70. package/dist/esm/chain.js.map +1 -1
  71. package/dist/esm/cli.d.ts.map +1 -1
  72. package/dist/esm/cli.js +4 -0
  73. package/dist/esm/cli.js.map +1 -1
  74. package/dist/esm/evidence.d.ts +41 -2
  75. package/dist/esm/evidence.d.ts.map +1 -1
  76. package/dist/esm/evidence.js +570 -12
  77. package/dist/esm/evidence.js.map +1 -1
  78. package/dist/esm/guard.d.ts +163 -9
  79. package/dist/esm/guard.d.ts.map +1 -1
  80. package/dist/esm/guard.js +393 -27
  81. package/dist/esm/guard.js.map +1 -1
  82. package/dist/esm/index.d.ts +12 -9
  83. package/dist/esm/index.d.ts.map +1 -1
  84. package/dist/esm/index.js +8 -6
  85. package/dist/esm/index.js.map +1 -1
  86. package/dist/esm/params.d.ts +52 -0
  87. package/dist/esm/params.d.ts.map +1 -0
  88. package/dist/esm/params.js +92 -0
  89. package/dist/esm/params.js.map +1 -0
  90. package/dist/esm/reasons.d.ts +89 -1
  91. package/dist/esm/reasons.d.ts.map +1 -1
  92. package/dist/esm/reasons.js +97 -2
  93. package/dist/esm/reasons.js.map +1 -1
  94. package/dist/esm/version.d.ts +10 -0
  95. package/dist/esm/version.d.ts.map +1 -0
  96. package/dist/esm/version.js +10 -0
  97. package/dist/esm/version.js.map +1 -0
  98. package/dist/esm/wire.d.ts.map +1 -1
  99. package/dist/esm/wire.js +8 -1
  100. package/dist/esm/wire.js.map +1 -1
  101. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -6,6 +6,68 @@ follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.4.0] — 2026-08-31
10
+
11
+ ### Added
12
+ - **Execution binding**, opt-in per chain via `Guard.issue(agentId, authority, {schemaVersion: 2})`
13
+ (schema version 1 is unchanged and remains the default): `check`/`recordDenial` now allocate a
14
+ `callId` (fail-closed, with meters restored, if `crypto.randomBytes` throws) and return it on
15
+ `Decision.callId`; `check` gains `authorizedParams`/`capture`/`adapter` options and refuses
16
+ further calls once the node is `complete()`d (`ReasonCode.NODE_FINALIZED`).
17
+ `Guard.recordOutcome(callId, bodyState, options)` binds what a body-owning wrapper observed
18
+ afterwards — `returned`/`raised`/`abandoned`/`deferred`, with `errorCode` required exactly when
19
+ raised. `complete()` returns a plain `boolean` on a `schemaVersion: 1` chain (byte-and-type
20
+ unchanged from every prior release) and a `CompletionResult` on `schemaVersion: 2` only — see
21
+ its doc comment for the JavaScript limits of its truthiness bridge, since unlike Python's
22
+ `__bool__`, `if (guard.complete())` cannot be made to read `false` there — and refuses on v2
23
+ while calls are pending; `revoke`/`revokeAgent` snapshot still-pending callIds onto the `kill`
24
+ entry as `pending_at_kill` without clearing them, so a late `recordOutcome` after a kill is
25
+ still accepted. `check`/`recordOutcome` roll back meters and re-throw on ANY pre-commit failure
26
+ (not only a `crypto.randomBytes` failure), and `recordOutcome` marks a call outcomed only after
27
+ its append actually commits, so a pre-commit failure leaves the call retryable. `Guard.issue`
28
+ refuses `{schemaVersion: 2, auditOverwrite: true}` — the restart rule has no escape hatch on v2.
29
+ Arguments are committed via `params_c14n_v1` (`params.ts`): `SHA-256(rawSalt || JCS(params))`,
30
+ never the raw value; validated against the language-neutral vector file also published for
31
+ Python (`test/fixtures/params_c14n_v1.json`). `verifyBundle` gains `execution_binding`: per-call
32
+ observed/unobserved/unaccounted (an outcome must be bound correctly — right node, right order —
33
+ to count as observed), per-node finalized/in_progress/revoked/revoked_with_pending, an aggregate
34
+ clean/incomplete/failed, and `params_coverage` (computed over every valid allow) as its own axis
35
+ — `{status: "not applicable"}` for a schema-version-1 bundle. `verifyBundle` also gains
36
+ `root_version_mismatch`/`mixed_entry_versions` checks (a chain is created at one schema version
37
+ and never mixes), requires exactly one root event (`checks.root`), does strict, null-aware,
38
+ type-checked schema validation on every conditional field (`capture`/`adapter` are now
39
+ REQUIRED, not merely paired, on every v2 allow — a bare `check()` with no `capture` supplied
40
+ gets a truthful guard-attributed `pre_hook_only` default rather than leaving the ledger silent;
41
+ any allow-only field on a `deny`, or any v2-only field on a `schemaVersion: 1` entry
42
+ — `v2_field_on_v1` — is invalid), and accepts an optional `expectedAnchor`/`expectedHead` to
43
+ verify against an independently retained reference point instead of only the bundle's own
44
+ enclosed anchor. `AuditLog` gains `CommittedAuditError` (a
45
+ post-commit persistence failure after the entry is already in the in-memory chain) and
46
+ overwrite protection (constructing over a `path` that already names a non-empty ledger now
47
+ throws unless `overwrite: true`). The LangGraph adapter (`adapters/langgraph`) is the reference
48
+ wiring: `guardNode`/`guardTool` snapshot a call's arguments once, immutably, before invocation
49
+ and call `recordOutcome` on a `schemaVersion: 2` guard, sync and async, reporting a
50
+ generator/promise-like result as `deferred` and an `AbortController`-driven cancellation as
51
+ `abandoned`; wrapping an async callable on a `schemaVersion: 1` guard stays byte-and-type
52
+ unchanged (never itself becomes an async function). Mirrors attenu-guard (Python) 0.9.0's
53
+ execution-binding layer plus its post-review merge-gate hardening, byte-for-byte on every
54
+ reason-code string; ported test suite: `test/execution-binding.test.ts` (82 cases),
55
+ `test/params-c14n-vectors.test.ts` (the shared parity vectors), plus adapter and evidence
56
+ coverage in `test/adapter-langgraph.test.ts`/`test/evidence.test.ts`.
57
+
58
+ ## [0.3.1] — 2026-08-30
59
+
60
+ ### Fixed
61
+ - Integers beyond the RFC 8785 safe range (±(2**53-1)) are now rejected — at canonicalization, at
62
+ `RowLimit`/`SpendCap`/`CallLimit` construction, and by `load` (as `malformed`) — instead of
63
+ silently colliding with a neighbouring integer once serialized as a double. The interop suite
64
+ will show 20 vectors, and `valid_jcs_big_integer`/`valid_jcs_exponent_form` will pin different
65
+ values, once the Python package ships them; until then the affected interop assertions are a
66
+ known, expected failure (see the README note on `npm run fixtures`).
67
+ - `verifyBundle` and `AuditLog.verifyAnchor` now check the bundle/anchor schema version and chain
68
+ identity instead of ignoring them, so a bundle for the wrong version or the wrong chain no
69
+ longer verifies.
70
+
9
71
  ## [0.3.0] — 2026-08-29
10
72
 
11
73
  ### Changed
package/README.md CHANGED
@@ -66,6 +66,12 @@ run; the anchor is reported as `not checked`, and `ok` then means *consistent*
66
66
  rather than *verified* — a consistent full rewrite by someone holding the signing
67
67
  key cannot be excluded without the key.
68
68
 
69
+ > **Want to try this before wiring it in?** The repo ships a sample: from a clone,
70
+ > `npx attenu-guard@latest verify test/fixtures/clean_ed25519.bundle.json --pubkey d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a`
71
+ > prints the same `anchor=verified` / `OK` result shown above. For the three-bundle
72
+ > version — clean, tampered, widened, each a different kind of failure — see the
73
+ > [Python library's walkthrough](https://github.com/attenu-io/attenu-guard/blob/main/examples/verify/README.md).
74
+
69
75
  ## Guard a delegation chain
70
76
 
71
77
  ```ts
@@ -159,7 +165,7 @@ ledger, and one bundle per tamper mode with the report Python produces for each.
159
165
  The suite reproduces all of it, and a separate test writes a ledger and bundle
160
166
  here and has the Python CLI verify them, so both directions are covered.
161
167
 
162
- Version 0.2 uses [RFC 8785 JCS](https://www.rfc-editor.org/rfc/rfc8785) for every
168
+ Versions 0.2 and later use [RFC 8785 JCS](https://www.rfc-editor.org/rfc/rfc8785) for every
163
169
  signed or hashed JSON surface: Delegation Tokens, ledger entries, anchors and
164
170
  evidence bundles. Tokens, ledger entries, anchors and bundles emit
165
171
  `"c14n":"JCS"` as an informational label. Verifiers enforce JCS from canonical
@@ -168,7 +174,7 @@ numbers, lone UTF-16 surrogates and non-canonical spellings are rejected instead
168
174
  of being normalized after verification.
169
175
 
170
176
  This is the only supported format. There is no 0.1 compatibility reader or
171
- dual-signing mode. The 17 committed interop vectors include the separating cases
177
+ dual-signing mode. The 19 committed interop vectors include the separating cases
172
178
  for number spelling, raw Unicode, UTF-16 member ordering, large integers,
173
179
  duplicates, non-finite values and an unmarked canonical header.
174
180
 
@@ -35,6 +35,22 @@
35
35
  * this adapter does not prescribe which. It guarantees only that the tool body
36
36
  * never executes on a denial.
37
37
  *
38
+ * ## Execution binding (0.9.0, reference wiring for this adapter)
39
+ *
40
+ * When `guard`'s chain was issued with `schemaVersion: 2` (see `Guard.issue`), `guardNode` also
41
+ * passes `capture`/`adapter`/`authorizedParams` to `check` and calls `guard.recordOutcome` once
42
+ * the wrapped callable finishes — `Capture.WRAPPER_ASYNC` when `fn` is a genuine `async function`
43
+ * (`fn.constructor.name === "AsyncFunction"`, the same test Python's `inspect.iscoroutinefunction`
44
+ * makes), `Capture.WRAPPER_SYNC` otherwise. `authorizedParams`/`invokedParams` are
45
+ * `{args: [...]}` built from exactly what the wrapped callable is called with — JavaScript has no
46
+ * separate `kwargs`, so unlike the Python adapter's `{args, kwargs}` this carries only `args`; a
47
+ * LangGraph.js node in any case receives one state object, not Python's `(*args, **kwargs)`. They
48
+ * are unchanged between the two observations here, since this decorator itself never mutates
49
+ * them; a framework that DOES mutate arguments between authorization and invocation is where a
50
+ * real substitution would become visible. On a `schemaVersion: 1` chain (the default), this
51
+ * adapter behaves exactly as it did before 0.9.0: no `capture`/`authorizedParams`, no
52
+ * `recordOutcome` call. Every other framework adapter is unchanged in this release.
53
+ *
38
54
  * ## Delegation
39
55
  *
40
56
  * Handing work to a sub-agent is the delegation moment. `delegateTo` mints the
@@ -52,7 +68,7 @@
52
68
  import { type Guard } from "../guard.js";
53
69
  import type { Authority } from "../authority.js";
54
70
  import type { Context } from "../ceilings.js";
55
- import type { Decision } from "../reasons.js";
71
+ import { type Decision } from "../reasons.js";
56
72
  /** Options shared by every guarded wrapper. */
57
73
  export interface GuardOptions {
58
74
  /**
@@ -81,7 +97,9 @@ export type GuardedNode<F extends (...args: any[]) => any> = F & {
81
97
  * `guard.check(toolScope, {context, tool})`. On a denial this throws
82
98
  * `AuthorityDenied` and the wrapped callable is NEVER invoked. Otherwise it
83
99
  * calls through with the original arguments and returns the result unchanged —
84
- * including a promise, which is passed along untouched.
100
+ * including a promise, which is passed along untouched. On a `schemaVersion: 2`
101
+ * guard, also binds the call's outcome via `guard.recordOutcome` — see the
102
+ * module doc comment's "Execution binding" section.
85
103
  *
86
104
  * Use the Guard for the SPECIFIC agent this callable belongs to, not the
87
105
  * orchestrator's broader one, so a denial reflects that node's real, narrowed
@@ -125,7 +143,13 @@ export interface GuardToolOptions extends GuardOptions {
125
143
  * The context function receives the raw invoke arguments. `ToolNode` passes a
126
144
  * tool call object, so the arguments the model proposed are at `input.args`;
127
145
  * a direct `tool.invoke({...})` passes them at the top level. `toolArgs` below
128
- * reads either shape.
146
+ * reads either shape — and, on a `schemaVersion: 2` guard, feeds a single
147
+ * IMMUTABLE snapshot taken BEFORE `tool.invoke` runs, reused for both
148
+ * `authorizedParams` and `invokedParams`: this adapter's closest analogue of "the
149
+ * exact tool-call JSON object" the execution-binding spec names (see the module
150
+ * doc comment's "Execution binding" section; this is the one construct in this
151
+ * adapter that wraps a tool BODY, so it is the reference wiring for
152
+ * `recordOutcome`, mirroring `guardNode` above).
129
153
  */
130
154
  export declare function guardTool<T extends ToolLike>(guard: Guard, tool: T, options?: GuardToolOptions): T;
131
155
  /** Marker properties, so a caller can tell a guarded tool from a bare one. */
@@ -1 +1 @@
1
- {"version":3,"file":"langgraph.d.ts","sourceRoot":"","sources":["../../../src/adapters/langgraph.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"langgraph.d.ts","sourceRoot":"","sources":["../../../src/adapters/langgraph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkEG;AAEH,OAAO,EAAqC,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAsB,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGlE,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC;IACxC,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,8EAA8E;AAC9E,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG;IAC/D,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;CACvB,CAAC;AAgEF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACzD,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,CAAC,EACL,OAAO,GAAE,YAAiB,GACzB,WAAW,CAAC,CAAC,CAAC,CAsGhB;AAED,6EAA6E;AAC7E,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;CACjF;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAC9D,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,CAAC,EACL,OAAO,GAAE,YAAiB,GACzB,WAAW,CAAC,CAAC,CAAC,CAIhB;AAED,uEAAuE;AACvE,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;IACtC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IACpD,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC;CACpD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,QAAQ,EAC1C,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,CAAC,EACP,OAAO,GAAE,gBAAqB,GAC7B,CAAC,CAkIH;AAED,8EAA8E;AAC9E,eAAO,MAAM,YAAY,kBAAkB,CAAC;AAC5C,eAAO,MAAM,YAAY,kBAAkB,CAAC;AAE5C,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;IACjE,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC;CACpD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,QAAQ,EAC3C,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,OAAO,GAAE,iBAAsB,GAC9B,CAAC,EAAE,CAUL;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAMxD;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,SAAS,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,GAAG,KAAK,CAEzE;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAQ7D"}
@@ -36,6 +36,22 @@
36
36
  * this adapter does not prescribe which. It guarantees only that the tool body
37
37
  * never executes on a denial.
38
38
  *
39
+ * ## Execution binding (0.9.0, reference wiring for this adapter)
40
+ *
41
+ * When `guard`'s chain was issued with `schemaVersion: 2` (see `Guard.issue`), `guardNode` also
42
+ * passes `capture`/`adapter`/`authorizedParams` to `check` and calls `guard.recordOutcome` once
43
+ * the wrapped callable finishes — `Capture.WRAPPER_ASYNC` when `fn` is a genuine `async function`
44
+ * (`fn.constructor.name === "AsyncFunction"`, the same test Python's `inspect.iscoroutinefunction`
45
+ * makes), `Capture.WRAPPER_SYNC` otherwise. `authorizedParams`/`invokedParams` are
46
+ * `{args: [...]}` built from exactly what the wrapped callable is called with — JavaScript has no
47
+ * separate `kwargs`, so unlike the Python adapter's `{args, kwargs}` this carries only `args`; a
48
+ * LangGraph.js node in any case receives one state object, not Python's `(*args, **kwargs)`. They
49
+ * are unchanged between the two observations here, since this decorator itself never mutates
50
+ * them; a framework that DOES mutate arguments between authorization and invocation is where a
51
+ * real substitution would become visible. On a `schemaVersion: 1` chain (the default), this
52
+ * adapter behaves exactly as it did before 0.9.0: no `capture`/`authorizedParams`, no
53
+ * `recordOutcome` call. Every other framework adapter is unchanged in this release.
54
+ *
39
55
  * ## Delegation
40
56
  *
41
57
  * Handing work to a sub-agent is the delegation moment. `delegateTo` mints the
@@ -93,6 +109,71 @@ exports.toolArgs = toolArgs;
93
109
  exports.delegateTo = delegateTo;
94
110
  exports.isLangGraphAvailable = isLangGraphAvailable;
95
111
  const guard_js_1 = require("../guard.js");
112
+ const reasons_js_1 = require("../reasons.js");
113
+ const version_js_1 = require("../version.js");
114
+ /**
115
+ * An IMMUTABLE snapshot of the call's arguments, taken BEFORE the wrapped callable runs and
116
+ * reused for BOTH `authorizedParams` (`check`) and `invokedParams` (`recordOutcome`) — so a
117
+ * callable that mutates its own inputs in place cannot make this adapter observe two different
118
+ * values for what was actually one call's arguments (see the module doc comment's "Execution
119
+ * binding" section; no `kwargs` — JavaScript has no separate keyword-argument bag).
120
+ */
121
+ function snapshotParams(args) {
122
+ const raw = { args: [...args] };
123
+ try {
124
+ return structuredClone(raw);
125
+ }
126
+ catch {
127
+ // Best-effort: something in here isn't structured-cloneable (a live socket, a function, ...).
128
+ // Fall back to the shallow copy — a residual risk only if THAT specific object is later
129
+ // mutated in place, a rare edge case documented here rather than silently claimed away.
130
+ return raw;
131
+ }
132
+ }
133
+ /**
134
+ * `true` if `result` is a generator/async-generator/promise-like value whose consumption this
135
+ * wrapper does not itself observe — spec's `deferred`: "the record covers the call, not the
136
+ * eventual exhaustion." A promise counts too (the closest JavaScript analogue of Python's
137
+ * `asyncio.Future`/`concurrent.futures.Future`): the async branch here already `await`s `fn`
138
+ * itself, so a bare promise surfacing as `result` there means `fn` returned ANOTHER promise
139
+ * without awaiting it, which is exactly the same "not actually consumed" situation.
140
+ */
141
+ function isDeferredResult(result) {
142
+ if (result === null || typeof result !== "object")
143
+ return false;
144
+ const r = result;
145
+ if (typeof r["next"] === "function" && typeof r[Symbol.iterator] === "function")
146
+ return true;
147
+ if (typeof r["next"] === "function" && typeof r[Symbol.asyncIterator] === "function")
148
+ return true;
149
+ if (typeof r["then"] === "function")
150
+ return true;
151
+ return false;
152
+ }
153
+ function bodyStateFor(result) {
154
+ return isDeferredResult(result) ? reasons_js_1.BodyState.DEFERRED : reasons_js_1.BodyState.RETURNED;
155
+ }
156
+ /**
157
+ * `true` for the JavaScript analogue of Python's `asyncio.CancelledError`: an `AbortController`/
158
+ * `AbortSignal`-driven abort, surfaced as a `DOMException`/`Error` named `"AbortError"` — the
159
+ * standard shape Node and the Fetch/Web platform both use. There is no single universal async
160
+ * cancellation exception type in JavaScript the way `asyncio.CancelledError` is in Python, so this
161
+ * is the best-grounded, most widely applicable translation rather than a exact 1:1 port.
162
+ */
163
+ function isAbortError(exc) {
164
+ return exc instanceof Error && exc.name === "AbortError";
165
+ }
166
+ /** The class/constructor name of a thrown value — JavaScript's nearest analogue of Python's `type(exc).__name__`. */
167
+ function errorCodeOf(exc) {
168
+ if (exc instanceof Error)
169
+ return exc.constructor.name || "Error";
170
+ if (exc === null)
171
+ return "null";
172
+ return typeof exc === "object" ? "object" : typeof exc;
173
+ }
174
+ function elapsedMs(start) {
175
+ return Math.round(performance.now() - start);
176
+ }
96
177
  /**
97
178
  * Wrap a callable so every call is authorized through `guard` first.
98
179
  *
@@ -100,7 +181,9 @@ const guard_js_1 = require("../guard.js");
100
181
  * `guard.check(toolScope, {context, tool})`. On a denial this throws
101
182
  * `AuthorityDenied` and the wrapped callable is NEVER invoked. Otherwise it
102
183
  * calls through with the original arguments and returns the result unchanged —
103
- * including a promise, which is passed along untouched.
184
+ * including a promise, which is passed along untouched. On a `schemaVersion: 2`
185
+ * guard, also binds the call's outcome via `guard.recordOutcome` — see the
186
+ * module doc comment's "Execution binding" section.
104
187
  *
105
188
  * Use the Guard for the SPECIFIC agent this callable belongs to, not the
106
189
  * orchestrator's broader one, so a denial reflects that node's real, narrowed
@@ -108,18 +191,102 @@ const guard_js_1 = require("../guard.js");
108
191
  */
109
192
  function guardNode(guard, toolScope, fn, options = {}) {
110
193
  const resolvedTool = options.tool !== undefined ? options.tool : (fn.name || null);
111
- const wrapped = function (...args) {
194
+ const isAsyncFn = fn.constructor.name === "AsyncFunction";
195
+ // guard.schemaVersion never changes for a guard's lifetime, so it is safe (and correct: a
196
+ // wrapper's sync-vs-async SHAPE must be fixed at definition time, not per-call) to decide it
197
+ // once, here, at decoration time.
198
+ const v2 = guard.schemaVersion === 2;
199
+ const capture = isAsyncFn ? reasons_js_1.Capture.WRAPPER_ASYNC : reasons_js_1.Capture.WRAPPER_SYNC;
200
+ const adapterInfo = {
201
+ module: "attenu-guard/adapters/langgraph",
202
+ version: version_js_1.VERSION,
203
+ hookPath: `guardNode:${fn.name || toolScope}`,
204
+ };
205
+ function authorize(args, snapshot) {
112
206
  const context = options.contextFn ? options.contextFn(...args) : {};
207
+ const extra = v2 ? { capture, adapter: adapterInfo, authorizedParams: snapshot ?? undefined } : {};
113
208
  const decision = guard.check(toolScope, {
114
209
  context,
115
210
  tool: resolvedTool,
116
211
  disposition: options.disposition ?? null,
117
212
  metered: options.metered ?? false,
213
+ ...extra,
118
214
  });
119
215
  if (!decision.allowed)
120
216
  throw new guard_js_1.AuthorityDenied(decision);
121
- return fn.apply(this, args);
122
- };
217
+ return decision;
218
+ }
219
+ let wrapped;
220
+ if (isAsyncFn && v2) {
221
+ wrapped = (async function (...args) {
222
+ const snapshot = snapshotParams(args);
223
+ const decision = authorize(args, snapshot);
224
+ const start = performance.now();
225
+ try {
226
+ const result = await fn.apply(this, args);
227
+ guard.recordOutcome(decision.callId, bodyStateFor(result), {
228
+ invokedParams: snapshot,
229
+ durationMs: elapsedMs(start),
230
+ });
231
+ return result;
232
+ }
233
+ catch (exc) {
234
+ // The wrapper stopped observing while the body may still run — exactly spec's
235
+ // `abandoned`, not `raised`. Still re-thrown: cancellation must propagate normally.
236
+ if (isAbortError(exc)) {
237
+ guard.recordOutcome(decision.callId, reasons_js_1.BodyState.ABANDONED, {
238
+ invokedParams: snapshot,
239
+ durationMs: elapsedMs(start),
240
+ });
241
+ }
242
+ else {
243
+ guard.recordOutcome(decision.callId, reasons_js_1.BodyState.RAISED, {
244
+ errorCode: errorCodeOf(exc),
245
+ invokedParams: snapshot,
246
+ durationMs: elapsedMs(start),
247
+ });
248
+ }
249
+ throw exc;
250
+ }
251
+ });
252
+ }
253
+ else if (isAsyncFn) {
254
+ // v1 (schemaVersion: 1, the default): EXACTLY the pre-0.9.0 shape — a plain SYNC wrapper
255
+ // that authorizes, then returns fn(...args) UNAWAITED. The caller awaits the returned
256
+ // promise itself, as it always has; `wrapped` is never itself an async function on v1, even
257
+ // when `fn` is.
258
+ wrapped = (function (...args) {
259
+ authorize(args, null);
260
+ return fn.apply(this, args);
261
+ });
262
+ }
263
+ else {
264
+ wrapped = (function (...args) {
265
+ if (!v2) {
266
+ authorize(args, null);
267
+ return fn.apply(this, args);
268
+ }
269
+ const snapshot = snapshotParams(args);
270
+ const decision = authorize(args, snapshot);
271
+ const start = performance.now();
272
+ try {
273
+ const result = fn.apply(this, args);
274
+ guard.recordOutcome(decision.callId, bodyStateFor(result), {
275
+ invokedParams: snapshot,
276
+ durationMs: elapsedMs(start),
277
+ });
278
+ return result;
279
+ }
280
+ catch (exc) {
281
+ guard.recordOutcome(decision.callId, reasons_js_1.BodyState.RAISED, {
282
+ errorCode: errorCodeOf(exc),
283
+ invokedParams: snapshot,
284
+ durationMs: elapsedMs(start),
285
+ });
286
+ throw exc;
287
+ }
288
+ });
289
+ }
123
290
  Object.defineProperties(wrapped, {
124
291
  name: { value: fn.name, configurable: true },
125
292
  guard: { value: guard, enumerable: true },
@@ -149,26 +316,138 @@ function addGuardedNode(graph, name, guard, toolScope, fn, options = {}) {
149
316
  * The context function receives the raw invoke arguments. `ToolNode` passes a
150
317
  * tool call object, so the arguments the model proposed are at `input.args`;
151
318
  * a direct `tool.invoke({...})` passes them at the top level. `toolArgs` below
152
- * reads either shape.
319
+ * reads either shape — and, on a `schemaVersion: 2` guard, feeds a single
320
+ * IMMUTABLE snapshot taken BEFORE `tool.invoke` runs, reused for both
321
+ * `authorizedParams` and `invokedParams`: this adapter's closest analogue of "the
322
+ * exact tool-call JSON object" the execution-binding spec names (see the module
323
+ * doc comment's "Execution binding" section; this is the one construct in this
324
+ * adapter that wraps a tool BODY, so it is the reference wiring for
325
+ * `recordOutcome`, mirroring `guardNode` above).
153
326
  */
154
327
  function guardTool(guard, tool, options = {}) {
155
328
  const scope = options.scope ?? tool.name;
156
329
  const label = options.tool !== undefined ? options.tool : tool.name;
157
- const guardedInvoke = (input, config) => {
330
+ const isAsyncInvoke = tool.invoke.constructor.name === "AsyncFunction";
331
+ // guard.schemaVersion never changes for a guard's lifetime — decided once, at wrap time, same
332
+ // as guardNode.
333
+ const v2 = guard.schemaVersion === 2;
334
+ const capture = isAsyncInvoke ? reasons_js_1.Capture.WRAPPER_ASYNC : reasons_js_1.Capture.WRAPPER_SYNC;
335
+ const adapterInfo = {
336
+ module: "attenu-guard/adapters/langgraph",
337
+ version: version_js_1.VERSION,
338
+ hookPath: `guardTool:${tool.name}`,
339
+ };
340
+ function snapshotToolParams(input) {
341
+ const raw = toolArgs(input);
342
+ try {
343
+ return structuredClone(raw);
344
+ }
345
+ catch {
346
+ return raw;
347
+ }
348
+ }
349
+ function authorize(input, config, snapshot) {
158
350
  const context = options.contextFn ? options.contextFn(input, config) : {};
351
+ const extra = v2 ? { capture, adapter: adapterInfo, authorizedParams: snapshot ?? undefined } : {};
159
352
  const decision = guard.check(scope, {
160
353
  context,
161
354
  tool: label,
162
355
  disposition: options.disposition ?? null,
163
356
  metered: options.metered ?? false,
357
+ ...extra,
164
358
  });
165
- if (!decision.allowed) {
166
- if (options.onDenied)
167
- return options.onDenied(decision, input);
359
+ if (!decision.allowed)
168
360
  throw new guard_js_1.AuthorityDenied(decision);
361
+ return decision;
362
+ }
363
+ /** `authorize`, but returns `{denied: ...}` instead of throwing when `onDenied` is set. */
364
+ function authorizeOrDenied(input, config, snapshot) {
365
+ try {
366
+ return { decision: authorize(input, config, snapshot) };
169
367
  }
170
- return tool.invoke(input, config);
171
- };
368
+ catch (exc) {
369
+ if (exc instanceof guard_js_1.AuthorityDenied && options.onDenied) {
370
+ return { denied: options.onDenied(exc.decision, input) };
371
+ }
372
+ throw exc;
373
+ }
374
+ }
375
+ let guardedInvoke;
376
+ if (isAsyncInvoke && v2) {
377
+ guardedInvoke = async (input, config) => {
378
+ const snapshot = snapshotToolParams(input);
379
+ const outcome = authorizeOrDenied(input, config, snapshot);
380
+ if ("denied" in outcome)
381
+ return outcome.denied;
382
+ const start = performance.now();
383
+ try {
384
+ const result = await tool.invoke(input, config);
385
+ guard.recordOutcome(outcome.decision.callId, bodyStateFor(result), {
386
+ invokedParams: snapshot,
387
+ durationMs: elapsedMs(start),
388
+ });
389
+ return result;
390
+ }
391
+ catch (exc) {
392
+ if (isAbortError(exc)) {
393
+ guard.recordOutcome(outcome.decision.callId, reasons_js_1.BodyState.ABANDONED, {
394
+ invokedParams: snapshot,
395
+ durationMs: elapsedMs(start),
396
+ });
397
+ }
398
+ else {
399
+ guard.recordOutcome(outcome.decision.callId, reasons_js_1.BodyState.RAISED, {
400
+ errorCode: errorCodeOf(exc),
401
+ invokedParams: snapshot,
402
+ durationMs: elapsedMs(start),
403
+ });
404
+ }
405
+ throw exc;
406
+ }
407
+ };
408
+ }
409
+ else if (isAsyncInvoke) {
410
+ // v1: EXACTLY the pre-0.9.0 shape — a plain SYNC function that authorizes, then returns
411
+ // tool.invoke(...) UNAWAITED (the caller — typically ToolNode's own `await` — consumes the
412
+ // returned promise itself, as it always has).
413
+ guardedInvoke = (input, config) => {
414
+ const outcome = authorizeOrDenied(input, config, null);
415
+ if ("denied" in outcome)
416
+ return outcome.denied;
417
+ return tool.invoke(input, config);
418
+ };
419
+ }
420
+ else {
421
+ guardedInvoke = (input, config) => {
422
+ if (!v2) {
423
+ const outcome = authorizeOrDenied(input, config, null);
424
+ if ("denied" in outcome)
425
+ return outcome.denied;
426
+ return tool.invoke(input, config);
427
+ }
428
+ const snapshot = snapshotToolParams(input);
429
+ const outcome = authorizeOrDenied(input, config, snapshot);
430
+ if ("denied" in outcome)
431
+ return outcome.denied;
432
+ const start = performance.now();
433
+ try {
434
+ const result = tool.invoke(input, config);
435
+ guard.recordOutcome(outcome.decision.callId, bodyStateFor(result), {
436
+ invokedParams: snapshot,
437
+ durationMs: elapsedMs(start),
438
+ });
439
+ return result;
440
+ }
441
+ catch (exc) {
442
+ guard.recordOutcome(outcome.decision.callId, reasons_js_1.BodyState.RAISED, {
443
+ errorCode: errorCodeOf(exc),
444
+ invokedParams: snapshot,
445
+ durationMs: elapsedMs(start),
446
+ });
447
+ throw exc;
448
+ }
449
+ };
450
+ }
172
451
  return new Proxy(tool, {
173
452
  get(target, prop, receiver) {
174
453
  if (prop === "invoke")
@@ -1 +1 @@
1
- {"version":3,"file":"langgraph.js","sourceRoot":"","sources":["../../../src/adapters/langgraph.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"langgraph.js","sourceRoot":"","sources":["../../../src/adapters/langgraph.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@
11
11
  * identical content — see `canonical.ts` for how that is guaranteed.
12
12
  */
13
13
  import { type CJson } from "./canonical.js";
14
+ import type { Decision } from "./reasons.js";
14
15
  import type { Signer } from "./wire.js";
15
16
  export declare const SCHEMA_VERSION = 1;
16
17
  export declare const GENESIS: string;
@@ -36,16 +37,52 @@ export interface Anchor {
36
37
  }
37
38
  /** `sha256(prev_hash || canonical(event-without-hash))`, as hex. */
38
39
  export declare function hashEntry(prevHash: string, payload: LedgerEntry): string;
40
+ /**
41
+ * Thrown by `AuditLog.append` when the entry was committed to the in-memory chain but persisting
42
+ * it afterward (the audit-path file write, or a sink) threw.
43
+ *
44
+ * The entry IS committed — it is in `.entries`/`.head()` and every later `hash`/`prev_hash` is
45
+ * computed on top of it. Callers must not retry the operation that produced this entry merely
46
+ * because this was thrown: retrying would record it a second time. The original error is chained
47
+ * as `.cause` (the standard `Error` cause, same as Python's `__cause__`).
48
+ */
49
+ export declare class CommittedAuditError extends Error {
50
+ readonly entry: LedgerEntry;
51
+ /**
52
+ * Set by `Guard.check`/`Guard.recordDenial` before this propagates out of them (0.9.0
53
+ * execution binding — spec section 1: "carries the committed entry and the decision"). Absent
54
+ * for a `CommittedAuditError` raised by an `AuditLog` used directly, without a `Guard`.
55
+ */
56
+ decision?: Decision;
57
+ constructor(entry: LedgerEntry, cause: unknown);
58
+ }
39
59
  export interface AuditLogInit {
40
60
  /** Where to append the `.jsonl` ledger. Omit for an in-memory log. */
41
61
  path?: string | null;
42
62
  /** Local sinks; each gets every entry after the file write. */
43
63
  sinks?: readonly Sink[];
64
+ /**
65
+ * 0.9.0: the schema version this WHOLE chain is created at (1, the default and unchanged
66
+ * behaviour, or 2 — execution binding). Stated once, on `v` of every entry (see
67
+ * `Guard.issue({schemaVersion})`); a chain never mixes schema versions.
68
+ */
69
+ schemaVersion?: number;
70
+ /**
71
+ * Allow constructing over a `path` that already names a non-empty file, replacing it. Default
72
+ * `false`: refuse (`Error`) rather than silently truncate a pre-existing ledger.
73
+ */
74
+ overwrite?: boolean;
44
75
  }
45
76
  /** Append-only, hash-chained decision log. */
46
77
  export declare class AuditLog {
47
78
  readonly path: string | null;
48
- private readonly sinks;
79
+ readonly schemaVersion: number;
80
+ /**
81
+ * Local sinks; each gets every entry after the file write. Public and mutable (not just
82
+ * constructor-supplied) so a caller — or a test simulating a post-commit persistence failure —
83
+ * can swap them in after construction.
84
+ */
85
+ sinks: readonly Sink[];
49
86
  private prev;
50
87
  private seq;
51
88
  private readonly _entries;
@@ -1 +1 @@
1
- {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/audit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/audit.ts"],"names":[],"mappings":"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"}