@coderifts/agent-guard 6.0.0 → 6.2.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 (76) hide show
  1. package/README.md +105 -4
  2. package/dist/cjs/adapters/anthropic.d.ts +26 -0
  3. package/dist/cjs/adapters/anthropic.d.ts.map +1 -1
  4. package/dist/cjs/adapters/anthropic.js +68 -0
  5. package/dist/cjs/adapters/anthropic.js.map +1 -1
  6. package/dist/cjs/adapters/gemini.d.ts +39 -0
  7. package/dist/cjs/adapters/gemini.d.ts.map +1 -1
  8. package/dist/cjs/adapters/gemini.js +83 -0
  9. package/dist/cjs/adapters/gemini.js.map +1 -1
  10. package/dist/cjs/adapters/langgraph.d.ts +29 -0
  11. package/dist/cjs/adapters/langgraph.d.ts.map +1 -1
  12. package/dist/cjs/adapters/langgraph.js +70 -0
  13. package/dist/cjs/adapters/langgraph.js.map +1 -1
  14. package/dist/cjs/adapters/openai.d.ts +44 -0
  15. package/dist/cjs/adapters/openai.d.ts.map +1 -1
  16. package/dist/cjs/adapters/openai.js +86 -0
  17. package/dist/cjs/adapters/openai.js.map +1 -1
  18. package/dist/cjs/cas-adapters/fs.d.ts +79 -0
  19. package/dist/cjs/cas-adapters/fs.d.ts.map +1 -0
  20. package/dist/cjs/cas-adapters/fs.js +224 -0
  21. package/dist/cjs/cas-adapters/fs.js.map +1 -0
  22. package/dist/cjs/conditional-write.d.ts +66 -0
  23. package/dist/cjs/conditional-write.d.ts.map +1 -1
  24. package/dist/cjs/conditional-write.js +72 -1
  25. package/dist/cjs/conditional-write.js.map +1 -1
  26. package/dist/cjs/execution-time-fingerprint.d.ts +65 -0
  27. package/dist/cjs/execution-time-fingerprint.d.ts.map +1 -0
  28. package/dist/cjs/execution-time-fingerprint.js +129 -0
  29. package/dist/cjs/execution-time-fingerprint.js.map +1 -0
  30. package/dist/cjs/guard.d.ts.map +1 -1
  31. package/dist/cjs/guard.js +35 -0
  32. package/dist/cjs/guard.js.map +1 -1
  33. package/dist/cjs/index.d.ts +13 -10
  34. package/dist/cjs/index.d.ts.map +1 -1
  35. package/dist/cjs/index.js +33 -3
  36. package/dist/cjs/index.js.map +1 -1
  37. package/dist/cjs/types.d.ts +23 -1
  38. package/dist/cjs/types.d.ts.map +1 -1
  39. package/dist/esm/adapters/anthropic.d.ts +26 -0
  40. package/dist/esm/adapters/anthropic.d.ts.map +1 -1
  41. package/dist/esm/adapters/anthropic.js +66 -0
  42. package/dist/esm/adapters/anthropic.js.map +1 -1
  43. package/dist/esm/adapters/gemini.d.ts +39 -0
  44. package/dist/esm/adapters/gemini.d.ts.map +1 -1
  45. package/dist/esm/adapters/gemini.js +81 -0
  46. package/dist/esm/adapters/gemini.js.map +1 -1
  47. package/dist/esm/adapters/langgraph.d.ts +29 -0
  48. package/dist/esm/adapters/langgraph.d.ts.map +1 -1
  49. package/dist/esm/adapters/langgraph.js +68 -0
  50. package/dist/esm/adapters/langgraph.js.map +1 -1
  51. package/dist/esm/adapters/openai.d.ts +44 -0
  52. package/dist/esm/adapters/openai.d.ts.map +1 -1
  53. package/dist/esm/adapters/openai.js +84 -0
  54. package/dist/esm/adapters/openai.js.map +1 -1
  55. package/dist/esm/cas-adapters/fs.d.ts +79 -0
  56. package/dist/esm/cas-adapters/fs.d.ts.map +1 -0
  57. package/dist/esm/cas-adapters/fs.js +185 -0
  58. package/dist/esm/cas-adapters/fs.js.map +1 -0
  59. package/dist/esm/conditional-write.d.ts +66 -0
  60. package/dist/esm/conditional-write.d.ts.map +1 -1
  61. package/dist/esm/conditional-write.js +69 -0
  62. package/dist/esm/conditional-write.js.map +1 -1
  63. package/dist/esm/execution-time-fingerprint.d.ts +65 -0
  64. package/dist/esm/execution-time-fingerprint.d.ts.map +1 -0
  65. package/dist/esm/execution-time-fingerprint.js +123 -0
  66. package/dist/esm/execution-time-fingerprint.js.map +1 -0
  67. package/dist/esm/guard.d.ts.map +1 -1
  68. package/dist/esm/guard.js +35 -0
  69. package/dist/esm/guard.js.map +1 -1
  70. package/dist/esm/index.d.ts +13 -10
  71. package/dist/esm/index.d.ts.map +1 -1
  72. package/dist/esm/index.js +15 -6
  73. package/dist/esm/index.js.map +1 -1
  74. package/dist/esm/types.d.ts +23 -1
  75. package/dist/esm/types.d.ts.map +1 -1
  76. package/package.json +1 -1
package/README.md CHANGED
@@ -22,7 +22,11 @@ stays free of git/fs. Production PR artifact derivation:
22
22
 
23
23
  **TOCTOU is unclosed.** Resolving content proves what was true *at measurement time*;
24
24
  a host that then writes unconditionally still races. Neither the example nor this
25
- package supplies a version token or conditional write.
25
+ package supplies a version token or conditional write. An **opt-in** execution-state
26
+ recheck can *detect* (or enforce against) drift between the authorized change set and
27
+ the artifacts still held at execute time — see **`requireExecutionStateMatch`** below.
28
+ That is a detection/enforcement aid for the residual race, **not** a full TOCTOU
29
+ closure (hosts that write unconditionally still race; conditional write remains host-side).
26
30
 
27
31
  ```typescript
28
32
  import { guardToolCall } from '@coderifts/agent-guard';
@@ -49,6 +53,58 @@ if (!outcome.executed) console.error('blocked:', outcome.verdict);
49
53
  // Retry ONLY when outcome.executionAttempted === false (the safe-to-retry signal).
50
54
  ```
51
55
 
56
+ #### `requireExecutionStateMatch` — opt-in execution-state recheck (ID842)
57
+
58
+ After a fully enforceable ALLOW/MONITOR decision and **immediately before** `executeFactory`,
59
+ the guard can recompute the execution-time change-set fingerprint (crbundle.v1 over the
60
+ **current** `artifacts[]` the guard already holds) and compare it to what the receipt
61
+ authorized. Config field on `GuardConfig` (tri-state):
62
+
63
+ ```ts
64
+ requireExecutionStateMatch?: boolean | 'warn';
65
+ ```
66
+
67
+ | Mode | Value | Behavior |
68
+ |---|---|---|
69
+ | **OFF** (default) | `false` / absent | No recheck. Residual execution-state race as described under “TOCTOU is unclosed.” |
70
+ | **Warn** (report-only) | `'warn'` | Rechecks. On **drift**, emits `execution_state_drift_observed` via **`onEvent`**, then **proceeds** (does not block). On match, silent (drift-only telemetry). Use this to gather production drift data without changing who executes. |
71
+ | **Enforce** | `true` | Rechecks. On drift, **blocks** with integrity cause `EXECUTION_STATE_DRIFT` (factory never runs). Byte-identical to the original enforce path. |
72
+
73
+ Recommended adoption path: **off → `'warn'` (observe) → `true` (enforce)** once your own
74
+ telemetry shows drift is rare and real. A default flip to enforce is a later, versioned
75
+ product decision — not this mode’s job.
76
+
77
+ Warn-mode event (host-side only; the guard does **not** phone home), on `GuardConfig.onEvent`:
78
+
79
+ ```ts
80
+ {
81
+ type: 'execution_state_drift_observed';
82
+ at: string; // ISO timestamp
83
+ decisionId?: string;
84
+ current_fingerprint: string | null;
85
+ authorized_fingerprint: string | null;
86
+ reason: string;
87
+ }
88
+ ```
89
+
90
+ ```typescript
91
+ const outcome = await guardToolCall(call, executeFactory, {
92
+ client,
93
+ operation: 'merge',
94
+ requireExecutionStateMatch: 'warn', // opt-in telemetry; still proceeds on drift
95
+ onEvent: (e) => {
96
+ if (e.type === 'execution_state_drift_observed') {
97
+ // host metrics / log — you own retention; nothing is sent to CodeRifts from here
98
+ console.warn('execution-state drift', e.decisionId, e.reason, e.current_fingerprint);
99
+ }
100
+ },
101
+ });
102
+ ```
103
+
104
+ Honesty: this aids **detection** (warn) or **hard stop** (enforce) for execution-state
105
+ mismatch at the guard boundary. It does **not** close TOCTOU proper — measurement-to-commit
106
+ and host-side unconditional writes remain; see Guarantees.
107
+
52
108
  > **Supply `artifacts[]` with content.** If the guard detects a contract change (e.g. from
53
109
  > `filesTouched`/`diff`) but you did **not** supply `artifacts[]` with `before`/`after`, it fails
54
110
  > closed **locally** with `outcome.verdict.cause === 'MISSING_ARTIFACT_CONTENT'` — the tool does not
@@ -109,6 +165,44 @@ const answer = attachProofToAgentResponse('I applied the authorized edit.', outc
109
165
 
110
166
  See `examples/final-answer-proof.mjs` for verified vs skipped side by side.
111
167
 
168
+ ### Framework proof-binders (ID827, guard@6.1)
169
+
170
+ After `guardToolCall` returns a `GuardOutcome`, the binders map that **whole outcome** into the
171
+ framework’s **tool-result** shape so the execution proof travels back to the model in the tool
172
+ message — not only in a human final answer.
173
+
174
+ | Function | Id arg | Target field |
175
+ |---|---|---|
176
+ | `bindOpenAIGuardOutcome(outcome, { tool_call_id })` | `tool_call_id` | OpenAI tool message `content` (string) |
177
+ | `bindAnthropicGuardOutcome(outcome, { tool_use_id })` | `tool_use_id` | Anthropic `tool_result` `content` (string) |
178
+ | `bindGeminiGuardOutcome(outcome, { name })` | function `name` | Gemini `functionResponse.response` — a **structured object** `{ result, final_answer_proof, … }` (not a text field) |
179
+ | `bindLangGraphGuardOutcome(outcome, { tool_call_id, name? })` | `tool_call_id` (+ optional `name`) | LangGraph/LangChain ToolMessage `content` (string) |
180
+
181
+ **Behaviour (all four):** take the full `GuardOutcome` (ALLOW / BLOCK / APPROVAL / SKIPPED / error
182
+ arms); always embed `outcome.proof` (present on every arm); on a blocked arm state that the gate
183
+ did not permit execution with **no fabricated tool result**; on factory-error arms report the
184
+ failure + proof. Pure and non-mutating. No framework SDK dependency — minimal local types only.
185
+ Return types are type-level branded (`ProofBoundOpenAIToolMessage`, etc.) so the compiler can
186
+ distinguish a proof-bound tool result from a raw one (proof-forgotten *detection*, not
187
+ prevention). Proof formatting reuses `attachProofToAgentResponse` / `renderFinalAnswerProof`.
188
+
189
+ OpenAI-compatible providers (Grok, Kimi, Qwen, DeepSeek, …) use **`bindOpenAIGuardOutcome`** for
190
+ their tool-results — same ChatCompletions tool-message shape.
191
+
192
+ ```typescript
193
+ import { guardToolCall, bindOpenAIGuardOutcome } from '@coderifts/agent-guard';
194
+
195
+ const outcome = await guardToolCall(
196
+ { toolName: 'edit_file', arguments: args, filesTouched: [path] },
197
+ async (_envelope, redacted) => doEdit(redacted),
198
+ { client },
199
+ );
200
+
201
+ // Send this tool message back to the model (chat.completions messages[]).
202
+ const toolMessage = bindOpenAIGuardOutcome(outcome, { tool_call_id: toolCall.id });
203
+ // { role: 'tool', tool_call_id, content: '<result or gate message> + rendered proof' }
204
+ ```
205
+
112
206
  **OpenAI tool-calling (ID632 reference adapter).** Same input; OpenAI-shaped `tools` for
113
207
  `chat.completions`, plus the same unflattened assurance objects. Shape conversion only — does
114
208
  **not** claim product-level inescapability the core does not:
@@ -130,10 +224,14 @@ const {
130
224
 
131
225
  See also `examples/openai-adapter.mjs` (not published in the npm tarball).
132
226
 
133
- **OpenAI-compatible models (no extra adapter).** DeepSeek, Kimi (Moonshot), and Qwen use the
134
- same ChatCompletions tool-calling format as OpenAI (`{ type: 'function', function: { name,
227
+ **OpenAI-compatible models (no extra adapter).** DeepSeek and Kimi (Moonshot) use the same
228
+ ChatCompletions tool-calling format as OpenAI (`{ type: 'function', function: { name,
135
229
  description, parameters } }`). Use **`withCodeRiftsOpenAI`** and point your client `baseURL`
136
230
  (and API key) at their endpoint — zero new adapters, same guarded tools + unflattened assurance.
231
+ Tool-results use **`bindOpenAIGuardOutcome`** the same way as OpenAI.
232
+
233
+ **Qwen (Alibaba DashScope).** OpenAI-compatible via Model Studio compatible-mode — use
234
+ **`withCodeRiftsOpenAI`**, point `baseURL` at the DashScope compatible endpoint. Zero new adapters.
137
235
 
138
236
  **Grok (xAI).** Also OpenAI-compatible tool calling — use **`withCodeRiftsOpenAI`** with the xAI `baseURL`.
139
237
 
@@ -640,7 +738,10 @@ Pass both on `withCodeRifts({ …, onEvent, monitoringSinkWired: true })`, or on
640
738
  measurement-to-commit race remains: content resolved at measurement time can change before the
641
739
  host commits. Closing that needs a host-side conditional write (compare-and-swap on a version
642
740
  token) — this package never writes, and reports `conditional_write` as a host assertion it
643
- cannot verify.
741
+ cannot verify. Opt-in **`requireExecutionStateMatch`** (`false` / `'warn'` / `true`) can
742
+ recheck the execution-time fingerprint before the factory (warn = telemetry via
743
+ `execution_state_drift_observed`; true = block with `EXECUTION_STATE_DRIFT`) — a detection or
744
+ enforcement aid, **not** a full TOCTOU closure. See the subsection above.
644
745
  - **Retry-safe** — `executionAttempted` is the only safe-to-retry signal; a post-authorization throw
645
746
  is `executionAttempted:true` (the remote side effect may have landed).
646
747
  - **`enforced:true` only on a LIVE, receipt-verified `ALLOW`/`MONITOR`** — never on cached/LKG,
@@ -23,6 +23,7 @@
23
23
  */
24
24
  import type { WithCodeRiftsInput, WithCodeRiftsResult, CompositionAssurance, ReceiptThreadHandle } from '../with-coderifts.js';
25
25
  import type { ProtectedTool, RegistryCoverageReport } from '../tool-registry.js';
26
+ import type { GuardOutcome } from '../types.js';
26
27
  /**
27
28
  * Anthropic Messages API `tools[]` element (tool_use definition).
28
29
  * @see https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/overview
@@ -87,4 +88,29 @@ export declare function withCodeRiftsAnthropic(input: WithCodeRiftsInput): WithC
87
88
  * Does not re-run the guard; does not invent assurance.
88
89
  */
89
90
  export declare function anthropicToolAdapter(result: WithCodeRiftsResult): WithCodeRiftsAnthropicResult;
91
+ /**
92
+ * Minimal Anthropic tool_result content block. No @anthropic-ai/sdk dependency.
93
+ * @see https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/overview
94
+ */
95
+ export type AnthropicToolResult = {
96
+ type: 'tool_result';
97
+ tool_use_id: string;
98
+ content: string;
99
+ };
100
+ declare const __proofBoundAnthropicBrand: unique symbol;
101
+ export type ProofBoundAnthropicToolResult = AnthropicToolResult & {
102
+ readonly __proofBound: typeof __proofBoundAnthropicBrand;
103
+ };
104
+ export type BindAnthropicGuardOutcomeArgs<T> = {
105
+ /** Anthropic tool_use block id this tool_result answers. */
106
+ tool_use_id: string;
107
+ serialize?: (result: T) => string;
108
+ };
109
+ export declare function defaultSerializeAnthropicToolResult<T>(result: T): string;
110
+ /**
111
+ * Map a full GuardOutcome into an Anthropic tool_result block with proof embedded.
112
+ * Same arm mapping as bindOpenAIGuardOutcome; id field is tool_use_id.
113
+ */
114
+ export declare function bindAnthropicGuardOutcome<T>(outcome: GuardOutcome<T>, args: BindAnthropicGuardOutcomeArgs<T>): ProofBoundAnthropicToolResult;
115
+ export {};
90
116
  //# sourceMappingURL=anthropic.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/adapters/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAEjF;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACzC,iFAAiF;IACjF,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB;;;OAGG;IACH,eAAe,EAAE,aAAa,EAAE,CAAC;IACjC,wDAAwD;IACxD,eAAe,EAAE,sBAAsB,CAAC;IACxC;;;;OAIG;IACH,qBAAqB,EAAE,oBAAoB,CAAC;IAC5C,yEAAyE;IACzE,cAAc,EAAE,mBAAmB,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAQF;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,aAAa,CAgB3E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,GAAG,aAAa,EAAE,CAE1F;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,4BAA4B,CAG9F;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,GAAG,4BAA4B,CAc9F"}
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/adapters/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACzC,iFAAiF;IACjF,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB;;;OAGG;IACH,eAAe,EAAE,aAAa,EAAE,CAAC;IACjC,wDAAwD;IACxD,eAAe,EAAE,sBAAsB,CAAC;IACxC;;;;OAIG;IACH,qBAAqB,EAAE,oBAAoB,CAAC;IAC5C,yEAAyE;IACzE,cAAc,EAAE,mBAAmB,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAQF;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,aAAa,CAgB3E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,GAAG,aAAa,EAAE,CAE1F;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,4BAA4B,CAG9F;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,GAAG,4BAA4B,CAc9F;AAID;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,OAAO,CAAC,MAAM,0BAA0B,EAAE,OAAO,MAAM,CAAC;AACxD,MAAM,MAAM,6BAA6B,GAAG,mBAAmB,GAAG;IAChE,QAAQ,CAAC,YAAY,EAAE,OAAO,0BAA0B,CAAC;CAC1D,CAAC;AAEF,MAAM,MAAM,6BAA6B,CAAC,CAAC,IAAI;IAC7C,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,CAAC;CACnC,CAAC;AAEF,wBAAgB,mCAAmC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAgBxE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EACzC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EACxB,IAAI,EAAE,6BAA6B,CAAC,CAAC,CAAC,GACrC,6BAA6B,CA0B/B"}
@@ -27,7 +27,10 @@ exports.protectedToolToAnthropic = protectedToolToAnthropic;
27
27
  exports.toAnthropicTools = toAnthropicTools;
28
28
  exports.withCodeRiftsAnthropic = withCodeRiftsAnthropic;
29
29
  exports.anthropicToolAdapter = anthropicToolAdapter;
30
+ exports.defaultSerializeAnthropicToolResult = defaultSerializeAnthropicToolResult;
31
+ exports.bindAnthropicGuardOutcome = bindAnthropicGuardOutcome;
30
32
  const with_coderifts_js_1 = require("../with-coderifts.js");
33
+ const final_answer_proof_js_1 = require("../final-answer-proof.js");
31
34
  /** Empty JSON Schema object — used when a ProtectedTool has no inputSchema. */
32
35
  const EMPTY_INPUT_SCHEMA = Object.freeze({
33
36
  type: 'object',
@@ -94,4 +97,69 @@ function anthropicToolAdapter(result) {
94
97
  }
95
98
  return out;
96
99
  }
100
+ function defaultSerializeAnthropicToolResult(result) {
101
+ if (typeof result === 'string')
102
+ return result;
103
+ if (typeof result === 'number'
104
+ || typeof result === 'boolean'
105
+ || typeof result === 'bigint'
106
+ || result === null
107
+ || result === undefined) {
108
+ return String(result);
109
+ }
110
+ try {
111
+ return JSON.stringify(result);
112
+ }
113
+ catch {
114
+ return String(result);
115
+ }
116
+ }
117
+ /**
118
+ * Map a full GuardOutcome into an Anthropic tool_result block with proof embedded.
119
+ * Same arm mapping as bindOpenAIGuardOutcome; id field is tool_use_id.
120
+ */
121
+ function bindAnthropicGuardOutcome(outcome, args) {
122
+ const tool_use_id = args.tool_use_id;
123
+ const serialize = args.serialize ?? defaultSerializeAnthropicToolResult;
124
+ let body;
125
+ if (outcome.executed === true) {
126
+ body = serialize(outcome.result);
127
+ }
128
+ else if (outcome.executionAttempted === false) {
129
+ const kind = verdictKind(outcome);
130
+ body =
131
+ `CodeRifts gate did not permit execution (verdict: ${kind}). `
132
+ + 'No tool result was produced.';
133
+ }
134
+ else {
135
+ const err = 'error' in outcome ? outcome.error : undefined;
136
+ const kind = verdictKind(outcome);
137
+ body =
138
+ `Tool execution failed after gate decision (verdict: ${kind}): ${formatGuardError(err)}`;
139
+ }
140
+ const content = (0, final_answer_proof_js_1.attachProofToAgentResponse)(body, outcome.proof);
141
+ const block = {
142
+ type: 'tool_result',
143
+ tool_use_id,
144
+ content,
145
+ };
146
+ return block;
147
+ }
148
+ function verdictKind(outcome) {
149
+ return outcome.verdict && typeof outcome.verdict === 'object' && 'kind' in outcome.verdict
150
+ ? String(outcome.verdict.kind)
151
+ : 'UNKNOWN';
152
+ }
153
+ function formatGuardError(err) {
154
+ if (err instanceof Error)
155
+ return err.message || err.name || 'Error';
156
+ if (typeof err === 'string')
157
+ return err;
158
+ try {
159
+ return JSON.stringify(err);
160
+ }
161
+ catch {
162
+ return String(err);
163
+ }
164
+ }
97
165
  //# sourceMappingURL=anthropic.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/adapters/anthropic.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;AA2DH,4DAgBC;AAMD,4CAEC;AAYD,wDAGC;AAQD,oDAcC;AAtHD,4DAAqD;AA+CrD,+EAA+E;AAC/E,MAAM,kBAAkB,GAA4B,MAAM,CAAC,MAAM,CAAC;IAChE,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE,EAAE;CACf,CAAC,CAAC;AAEH;;;GAGG;AACH,SAAgB,wBAAwB,CAAC,IAAmB;IAC1D,MAAM,YAAY,GAChB,IAAI,CAAC,WAAW,IAAI,IAAI;WACrB,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;WACpC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;QACjC,CAAC,CAAE,IAAI,CAAC,WAAuC;QAC/C,CAAC,CAAC,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAEhC,MAAM,GAAG,GAAkB;QACzB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,YAAY;KACb,CAAC;IACF,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,EAAE,EAAE,CAAC;QACxD,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,cAAwC;IACvE,OAAO,cAAc,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,sBAAsB,CAAC,KAAyB;IAC9D,MAAM,IAAI,GAAwB,IAAA,iCAAa,EAAC,KAAK,CAAC,CAAC;IACvD,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,MAA2B;IAC9D,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC;IACrC,MAAM,KAAK,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAChD,MAAM,GAAG,GAAiC;QACxC,KAAK;QACL,eAAe;QACf,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;QACnD,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC;IACF,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/adapters/anthropic.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,7 @@
29
29
  */
30
30
  import type { WithCodeRiftsInput, WithCodeRiftsResult, CompositionAssurance, ReceiptThreadHandle } from '../with-coderifts.js';
31
31
  import type { ProtectedTool, RegistryCoverageReport } from '../tool-registry.js';
32
+ import type { GuardOutcome } from '../types.js';
32
33
  /**
33
34
  * One Gemini function declaration (inside functionDeclarations[]).
34
35
  * @see https://ai.google.dev/gemini-api/docs/function-calling
@@ -111,4 +112,42 @@ export declare function withCodeRiftsGemini(input: WithCodeRiftsInput): WithCode
111
112
  * Does not re-run the guard; does not invent assurance.
112
113
  */
113
114
  export declare function geminiToolAdapter(result: WithCodeRiftsResult): WithCodeRiftsGeminiResult;
115
+ /**
116
+ * Minimal Gemini functionResponse part. No @google/generative-ai dependency.
117
+ * `response` is a structured object (not a text string).
118
+ * @see https://ai.google.dev/gemini-api/docs/function-calling
119
+ */
120
+ export type GeminiFunctionResponse = {
121
+ functionResponse: {
122
+ name: string;
123
+ response: Record<string, unknown>;
124
+ };
125
+ };
126
+ declare const __proofBoundGeminiBrand: unique symbol;
127
+ export type ProofBoundGeminiFunctionResponse = GeminiFunctionResponse & {
128
+ readonly __proofBound: typeof __proofBoundGeminiBrand;
129
+ };
130
+ export type BindGeminiGuardOutcomeArgs<T> = {
131
+ /** Gemini function name this functionResponse answers. */
132
+ name: string;
133
+ /**
134
+ * Optional result projector into the response.result field.
135
+ * Default keeps JSON-friendly values as-is (objects/arrays/primitives);
136
+ * non-JSON values fall back to String().
137
+ */
138
+ serialize?: (result: T) => unknown;
139
+ };
140
+ /**
141
+ * Default Gemini result payload value (structured, not forced through JSON.stringify).
142
+ */
143
+ export declare function defaultSerializeGeminiToolResult<T>(result: T): unknown;
144
+ /**
145
+ * Map a full GuardOutcome into a Gemini functionResponse part with proof embedded.
146
+ *
147
+ * GEMINI SPECIAL: response is an OBJECT (not a text field):
148
+ * - executed: { result, final_answer_proof, final_answer_proof_text } via attachProofToAgentResponse
149
+ * - blocked/error: { gate_message, final_answer_proof, … } — no fabricated `result` key
150
+ */
151
+ export declare function bindGeminiGuardOutcome<T>(outcome: GuardOutcome<T>, args: BindGeminiGuardOutcomeArgs<T>): ProofBoundGeminiFunctionResponse;
152
+ export {};
114
153
  //# sourceMappingURL=gemini.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/adapters/gemini.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAEjF;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,oBAAoB,EAAE,yBAAyB,EAAE,CAAC;CACnD,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC;;;OAGG;IACH,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB;;;OAGG;IACH,eAAe,EAAE,aAAa,EAAE,CAAC;IACjC,wDAAwD;IACxD,eAAe,EAAE,sBAAsB,CAAC;IACxC;;;;OAIG;IACH,qBAAqB,EAAE,oBAAoB,CAAC;IAC5C,yEAAyE;IACzE,cAAc,EAAE,mBAAmB,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAQF;;;GAGG;AACH,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,aAAa,GAAG,yBAAyB,CAgBjG;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,GAAG,UAAU,EAAE,CAKpF;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,yBAAyB,CAGxF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,GAAG,yBAAyB,CAcxF"}
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/adapters/gemini.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,aAAa,CAAC;AAGrE;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,oBAAoB,EAAE,yBAAyB,EAAE,CAAC;CACnD,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC;;;OAGG;IACH,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB;;;OAGG;IACH,eAAe,EAAE,aAAa,EAAE,CAAC;IACjC,wDAAwD;IACxD,eAAe,EAAE,sBAAsB,CAAC;IACxC;;;;OAIG;IACH,qBAAqB,EAAE,oBAAoB,CAAC;IAC5C,yEAAyE;IACzE,cAAc,EAAE,mBAAmB,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAQF;;;GAGG;AACH,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,aAAa,GAAG,yBAAyB,CAgBjG;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,GAAG,UAAU,EAAE,CAKpF;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,yBAAyB,CAGxF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,GAAG,yBAAyB,CAcxF;AAID;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,gBAAgB,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACnC,CAAC;CACH,CAAC;AAEF,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,MAAM,CAAC;AACrD,MAAM,MAAM,gCAAgC,GAAG,sBAAsB,GAAG;IACtE,QAAQ,CAAC,YAAY,EAAE,OAAO,uBAAuB,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,0BAA0B,CAAC,CAAC,IAAI;IAC1C,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC;CACpC,CAAC;AAEF;;GAEG;AACH,wBAAgB,gCAAgC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,CAqBtE;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EACxB,IAAI,EAAE,0BAA0B,CAAC,CAAC,CAAC,GAClC,gCAAgC,CAoClC"}
@@ -33,7 +33,10 @@ exports.protectedToolToFunctionDeclaration = protectedToolToFunctionDeclaration;
33
33
  exports.toGeminiTools = toGeminiTools;
34
34
  exports.withCodeRiftsGemini = withCodeRiftsGemini;
35
35
  exports.geminiToolAdapter = geminiToolAdapter;
36
+ exports.defaultSerializeGeminiToolResult = defaultSerializeGeminiToolResult;
37
+ exports.bindGeminiGuardOutcome = bindGeminiGuardOutcome;
36
38
  const with_coderifts_js_1 = require("../with-coderifts.js");
39
+ const final_answer_proof_js_1 = require("../final-answer-proof.js");
37
40
  /** Empty OpenAPI-like JSON Schema — used when a ProtectedTool has no inputSchema. */
38
41
  const EMPTY_PARAMETERS = Object.freeze({
39
42
  type: 'object',
@@ -107,4 +110,84 @@ function geminiToolAdapter(result) {
107
110
  }
108
111
  return out;
109
112
  }
113
+ /**
114
+ * Default Gemini result payload value (structured, not forced through JSON.stringify).
115
+ */
116
+ function defaultSerializeGeminiToolResult(result) {
117
+ if (result === null
118
+ || result === undefined
119
+ || typeof result === 'string'
120
+ || typeof result === 'number'
121
+ || typeof result === 'boolean') {
122
+ return result;
123
+ }
124
+ if (typeof result === 'bigint')
125
+ return String(result);
126
+ if (typeof result === 'object') {
127
+ try {
128
+ // Ensure JSON-serializable by round-trip when possible; on failure keep shallow.
129
+ JSON.stringify(result);
130
+ return result;
131
+ }
132
+ catch {
133
+ return String(result);
134
+ }
135
+ }
136
+ return String(result);
137
+ }
138
+ /**
139
+ * Map a full GuardOutcome into a Gemini functionResponse part with proof embedded.
140
+ *
141
+ * GEMINI SPECIAL: response is an OBJECT (not a text field):
142
+ * - executed: { result, final_answer_proof, final_answer_proof_text } via attachProofToAgentResponse
143
+ * - blocked/error: { gate_message, final_answer_proof, … } — no fabricated `result` key
144
+ */
145
+ function bindGeminiGuardOutcome(outcome, args) {
146
+ const name = args.name;
147
+ const serialize = args.serialize ?? defaultSerializeGeminiToolResult;
148
+ let base;
149
+ if (outcome.executed === true) {
150
+ base = { result: serialize(outcome.result) };
151
+ }
152
+ else if (outcome.executionAttempted === false) {
153
+ const kind = verdictKind(outcome);
154
+ base = {
155
+ gate_message: `CodeRifts gate did not permit execution (verdict: ${kind}). `
156
+ + 'No tool result was produced.',
157
+ };
158
+ }
159
+ else {
160
+ const err = 'error' in outcome ? outcome.error : undefined;
161
+ const kind = verdictKind(outcome);
162
+ base = {
163
+ gate_message: `Tool execution failed after gate decision (verdict: ${kind}): ${formatGuardError(err)}`,
164
+ };
165
+ }
166
+ // Reuse attachProofToAgentResponse object path → adds final_answer_proof + final_answer_proof_text.
167
+ const bound = (0, final_answer_proof_js_1.attachProofToAgentResponse)(base, outcome.proof);
168
+ const part = {
169
+ functionResponse: {
170
+ name,
171
+ response: bound,
172
+ },
173
+ };
174
+ return part;
175
+ }
176
+ function verdictKind(outcome) {
177
+ return outcome.verdict && typeof outcome.verdict === 'object' && 'kind' in outcome.verdict
178
+ ? String(outcome.verdict.kind)
179
+ : 'UNKNOWN';
180
+ }
181
+ function formatGuardError(err) {
182
+ if (err instanceof Error)
183
+ return err.message || err.name || 'Error';
184
+ if (typeof err === 'string')
185
+ return err;
186
+ try {
187
+ return JSON.stringify(err);
188
+ }
189
+ catch {
190
+ return String(err);
191
+ }
192
+ }
110
193
  //# sourceMappingURL=gemini.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/adapters/gemini.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;;AA2EH,gFAgBC;AASD,sCAKC;AAYD,kDAGC;AAQD,8CAcC;AA5ID,4DAAqD;AA+DrD,qFAAqF;AACrF,MAAM,gBAAgB,GAA4B,MAAM,CAAC,MAAM,CAAC;IAC9D,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE,EAAE;CACf,CAAC,CAAC;AAEH;;;GAGG;AACH,SAAgB,kCAAkC,CAAC,IAAmB;IACpE,MAAM,UAAU,GACd,IAAI,CAAC,WAAW,IAAI,IAAI;WACrB,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;WACpC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;QACjC,CAAC,CAAE,IAAI,CAAC,WAAuC;QAC/C,CAAC,CAAC,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAE9B,MAAM,GAAG,GAA8B;QACrC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,UAAU;KACX,CAAC;IACF,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,EAAE,EAAE,CAAC;QACxD,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,aAAa,CAAC,cAAwC;IACpE,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3C,OAAO,CAAC;YACN,oBAAoB,EAAE,cAAc,CAAC,GAAG,CAAC,kCAAkC,CAAC;SAC7E,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,mBAAmB,CAAC,KAAyB;IAC3D,MAAM,IAAI,GAAwB,IAAA,iCAAa,EAAC,KAAK,CAAC,CAAC;IACvD,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,MAA2B;IAC3D,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC;IACrC,MAAM,KAAK,GAAG,aAAa,CAAC,eAAe,CAAC,CAAC;IAC7C,MAAM,GAAG,GAA8B;QACrC,KAAK;QACL,eAAe;QACf,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;QACnD,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC;IACF,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/adapters/gemini.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,7 @@
34
34
  */
35
35
  import type { WithCodeRiftsInput, WithCodeRiftsResult, CompositionAssurance, ReceiptThreadHandle } from '../with-coderifts.js';
36
36
  import type { ProtectedTool, RegistryCoverageReport } from '../tool-registry.js';
37
+ import type { GuardOutcome } from '../types.js';
37
38
  /**
38
39
  * Framework-agnostic LangChain/LangGraph tool descriptor (no package import).
39
40
  *
@@ -114,4 +115,32 @@ export declare function withCodeRiftsLangGraph(input: WithCodeRiftsInput): WithC
114
115
  * Does not re-run the guard; does not invent assurance.
115
116
  */
116
117
  export declare function langGraphToolAdapter(result: WithCodeRiftsResult): WithCodeRiftsLangGraphResult;
118
+ /**
119
+ * Minimal LangChain ToolMessage-shaped plain object (no @langchain/* dependency).
120
+ * Host may wrap into ToolMessage: new ToolMessage({ content, tool_call_id, name? }).
121
+ * @see https://js.langchain.com/docs/concepts/messages
122
+ */
123
+ export type LangGraphToolMessage = {
124
+ content: string;
125
+ tool_call_id: string;
126
+ name?: string;
127
+ };
128
+ declare const __proofBoundLangGraphBrand: unique symbol;
129
+ export type ProofBoundLangGraphToolMessage = LangGraphToolMessage & {
130
+ readonly __proofBound: typeof __proofBoundLangGraphBrand;
131
+ };
132
+ export type BindLangGraphGuardOutcomeArgs<T> = {
133
+ /** LangChain/LangGraph tool_call_id this ToolMessage answers. */
134
+ tool_call_id: string;
135
+ /** Optional tool name (ToolMessage.name). */
136
+ name?: string;
137
+ serialize?: (result: T) => string;
138
+ };
139
+ export declare function defaultSerializeLangGraphToolResult<T>(result: T): string;
140
+ /**
141
+ * Map a full GuardOutcome into a LangGraph/LangChain ToolMessage shape with proof embedded.
142
+ * Same arm mapping as bindOpenAIGuardOutcome; id field is tool_call_id.
143
+ */
144
+ export declare function bindLangGraphGuardOutcome<T>(outcome: GuardOutcome<T>, args: BindLangGraphGuardOutcomeArgs<T>): ProofBoundLangGraphToolMessage;
145
+ export {};
117
146
  //# sourceMappingURL=langgraph.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"langgraph.d.ts","sourceRoot":"","sources":["../../../src/adapters/langgraph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAEjF;;;;;;;;GAQG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC;;;OAGG;IACH,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C;;;OAGG;IACH,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7C,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACzC,iFAAiF;IACjF,KAAK,EAAE,uBAAuB,EAAE,CAAC;IACjC;;;OAGG;IACH,eAAe,EAAE,aAAa,EAAE,CAAC;IACjC,wDAAwD;IACxD,eAAe,EAAE,sBAAsB,CAAC;IACxC;;;;OAIG;IACH,qBAAqB,EAAE,oBAAoB,CAAC;IAC5C,yEAAyE;IACzE,cAAc,EAAE,mBAAmB,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAQF;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,uBAAuB,CAqBrF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,GAAG,uBAAuB,EAAE,CAEpG;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,4BAA4B,CAG9F;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,GAAG,4BAA4B,CAc9F"}
1
+ {"version":3,"file":"langgraph.d.ts","sourceRoot":"","sources":["../../../src/adapters/langgraph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD;;;;;;;;GAQG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC;;;OAGG;IACH,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C;;;OAGG;IACH,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7C,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACzC,iFAAiF;IACjF,KAAK,EAAE,uBAAuB,EAAE,CAAC;IACjC;;;OAGG;IACH,eAAe,EAAE,aAAa,EAAE,CAAC;IACjC,wDAAwD;IACxD,eAAe,EAAE,sBAAsB,CAAC;IACxC;;;;OAIG;IACH,qBAAqB,EAAE,oBAAoB,CAAC;IAC5C,yEAAyE;IACzE,cAAc,EAAE,mBAAmB,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAQF;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,uBAAuB,CAqBrF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,GAAG,uBAAuB,EAAE,CAEpG;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,4BAA4B,CAG9F;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,GAAG,4BAA4B,CAc9F;AAID;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,OAAO,CAAC,MAAM,0BAA0B,EAAE,OAAO,MAAM,CAAC;AACxD,MAAM,MAAM,8BAA8B,GAAG,oBAAoB,GAAG;IAClE,QAAQ,CAAC,YAAY,EAAE,OAAO,0BAA0B,CAAC;CAC1D,CAAC;AAEF,MAAM,MAAM,6BAA6B,CAAC,CAAC,IAAI;IAC7C,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,CAAC;CACnC,CAAC;AAEF,wBAAgB,mCAAmC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAgBxE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EACzC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EACxB,IAAI,EAAE,6BAA6B,CAAC,CAAC,CAAC,GACrC,8BAA8B,CA4BhC"}
@@ -38,7 +38,10 @@ exports.protectedToolToLangGraph = protectedToolToLangGraph;
38
38
  exports.toLangGraphTools = toLangGraphTools;
39
39
  exports.withCodeRiftsLangGraph = withCodeRiftsLangGraph;
40
40
  exports.langGraphToolAdapter = langGraphToolAdapter;
41
+ exports.defaultSerializeLangGraphToolResult = defaultSerializeLangGraphToolResult;
42
+ exports.bindLangGraphGuardOutcome = bindLangGraphGuardOutcome;
41
43
  const with_coderifts_js_1 = require("../with-coderifts.js");
44
+ const final_answer_proof_js_1 = require("../final-answer-proof.js");
42
45
  /** Empty JSON Schema object — used when a ProtectedTool has no inputSchema. */
43
46
  const EMPTY_SCHEMA = Object.freeze({
44
47
  type: 'object',
@@ -110,4 +113,71 @@ function langGraphToolAdapter(result) {
110
113
  }
111
114
  return out;
112
115
  }
116
+ function defaultSerializeLangGraphToolResult(result) {
117
+ if (typeof result === 'string')
118
+ return result;
119
+ if (typeof result === 'number'
120
+ || typeof result === 'boolean'
121
+ || typeof result === 'bigint'
122
+ || result === null
123
+ || result === undefined) {
124
+ return String(result);
125
+ }
126
+ try {
127
+ return JSON.stringify(result);
128
+ }
129
+ catch {
130
+ return String(result);
131
+ }
132
+ }
133
+ /**
134
+ * Map a full GuardOutcome into a LangGraph/LangChain ToolMessage shape with proof embedded.
135
+ * Same arm mapping as bindOpenAIGuardOutcome; id field is tool_call_id.
136
+ */
137
+ function bindLangGraphGuardOutcome(outcome, args) {
138
+ const tool_call_id = args.tool_call_id;
139
+ const serialize = args.serialize ?? defaultSerializeLangGraphToolResult;
140
+ let body;
141
+ if (outcome.executed === true) {
142
+ body = serialize(outcome.result);
143
+ }
144
+ else if (outcome.executionAttempted === false) {
145
+ const kind = verdictKind(outcome);
146
+ body =
147
+ `CodeRifts gate did not permit execution (verdict: ${kind}). `
148
+ + 'No tool result was produced.';
149
+ }
150
+ else {
151
+ const err = 'error' in outcome ? outcome.error : undefined;
152
+ const kind = verdictKind(outcome);
153
+ body =
154
+ `Tool execution failed after gate decision (verdict: ${kind}): ${formatGuardError(err)}`;
155
+ }
156
+ const content = (0, final_answer_proof_js_1.attachProofToAgentResponse)(body, outcome.proof);
157
+ const msg = {
158
+ content,
159
+ tool_call_id,
160
+ };
161
+ if (args.name != null && args.name !== '') {
162
+ msg.name = args.name;
163
+ }
164
+ return msg;
165
+ }
166
+ function verdictKind(outcome) {
167
+ return outcome.verdict && typeof outcome.verdict === 'object' && 'kind' in outcome.verdict
168
+ ? String(outcome.verdict.kind)
169
+ : 'UNKNOWN';
170
+ }
171
+ function formatGuardError(err) {
172
+ if (err instanceof Error)
173
+ return err.message || err.name || 'Error';
174
+ if (typeof err === 'string')
175
+ return err;
176
+ try {
177
+ return JSON.stringify(err);
178
+ }
179
+ catch {
180
+ return String(err);
181
+ }
182
+ }
113
183
  //# sourceMappingURL=langgraph.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"langgraph.js","sourceRoot":"","sources":["../../../src/adapters/langgraph.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;;AA2EH,4DAqBC;AAMD,4CAEC;AAYD,wDAGC;AAQD,oDAcC;AA3ID,4DAAqD;AA8DrD,+EAA+E;AAC/E,MAAM,YAAY,GAA4B,MAAM,CAAC,MAAM,CAAC;IAC1D,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE,EAAE;CACf,CAAC,CAAC;AAEH;;;;GAIG;AACH,SAAgB,wBAAwB,CAAC,IAAmB;IAC1D,MAAM,MAAM,GACV,IAAI,CAAC,WAAW,IAAI,IAAI;WACrB,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;WACpC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;QACjC,CAAC,CAAE,IAAI,CAAC,WAAuC;QAC/C,CAAC,CAAC,EAAE,GAAG,YAAY,EAAE,CAAC;IAE1B,yDAAyD;IACzD,MAAM,OAAO,GAAG,CAAC,IAAa,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAEvE,MAAM,GAAG,GAA4B;QACnC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM;QACN,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,OAAO;KAChB,CAAC;IACF,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,EAAE,EAAE,CAAC;QACxD,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,cAAwC;IACvE,OAAO,cAAc,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,sBAAsB,CAAC,KAAyB;IAC9D,MAAM,IAAI,GAAwB,IAAA,iCAAa,EAAC,KAAK,CAAC,CAAC;IACvD,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,MAA2B;IAC9D,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC;IACrC,MAAM,KAAK,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAChD,MAAM,GAAG,GAAiC;QACxC,KAAK;QACL,eAAe;QACf,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;QACnD,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC;IACF,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"langgraph.js","sourceRoot":"","sources":["../../../src/adapters/langgraph.ts"],"names":[],"mappings":"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"}