@coderifts/agent-guard 6.2.0 → 6.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.
- package/README.md +36 -10
- package/dist/cjs/cas-adapters/api.d.ts +94 -0
- package/dist/cjs/cas-adapters/api.d.ts.map +1 -0
- package/dist/cjs/cas-adapters/api.js +120 -0
- package/dist/cjs/cas-adapters/api.js.map +1 -0
- package/dist/cjs/cas-adapters/db.d.ts +93 -0
- package/dist/cjs/cas-adapters/db.d.ts.map +1 -0
- package/dist/cjs/cas-adapters/db.js +139 -0
- package/dist/cjs/cas-adapters/db.js.map +1 -0
- package/dist/cjs/cas-adapters/registry.d.ts +88 -0
- package/dist/cjs/cas-adapters/registry.d.ts.map +1 -0
- package/dist/cjs/cas-adapters/registry.js +120 -0
- package/dist/cjs/cas-adapters/registry.js.map +1 -0
- package/dist/cjs/cas-attestation.d.ts +94 -0
- package/dist/cjs/cas-attestation.d.ts.map +1 -0
- package/dist/cjs/cas-attestation.js +133 -0
- package/dist/cjs/cas-attestation.js.map +1 -0
- package/dist/cjs/deploy-gate.d.ts +10 -1
- package/dist/cjs/deploy-gate.d.ts.map +1 -1
- package/dist/cjs/deploy-gate.js +14 -10
- package/dist/cjs/deploy-gate.js.map +1 -1
- package/dist/cjs/execute-tool-call.d.ts +100 -0
- package/dist/cjs/execute-tool-call.d.ts.map +1 -0
- package/dist/cjs/execute-tool-call.js +334 -0
- package/dist/cjs/execute-tool-call.js.map +1 -0
- package/dist/cjs/execution-time-fingerprint.d.ts +8 -0
- package/dist/cjs/execution-time-fingerprint.d.ts.map +1 -1
- package/dist/cjs/execution-time-fingerprint.js +13 -1
- package/dist/cjs/execution-time-fingerprint.js.map +1 -1
- package/dist/cjs/guard.d.ts.map +1 -1
- package/dist/cjs/guard.js +28 -9
- package/dist/cjs/guard.js.map +1 -1
- package/dist/cjs/index.d.ts +13 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +51 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/merge-gate.d.ts +8 -0
- package/dist/cjs/merge-gate.d.ts.map +1 -1
- package/dist/cjs/merge-gate.js +19 -12
- package/dist/cjs/merge-gate.js.map +1 -1
- package/dist/cjs/remediation-loop-attestation.d.ts +125 -0
- package/dist/cjs/remediation-loop-attestation.d.ts.map +1 -0
- package/dist/cjs/remediation-loop-attestation.js +186 -0
- package/dist/cjs/remediation-loop-attestation.js.map +1 -0
- package/dist/cjs/types.d.ts +20 -3
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/with-coderifts.d.ts +9 -0
- package/dist/cjs/with-coderifts.d.ts.map +1 -1
- package/dist/cjs/with-coderifts.js +3 -0
- package/dist/cjs/with-coderifts.js.map +1 -1
- package/dist/esm/cas-adapters/api.d.ts +94 -0
- package/dist/esm/cas-adapters/api.d.ts.map +1 -0
- package/dist/esm/cas-adapters/api.js +116 -0
- package/dist/esm/cas-adapters/api.js.map +1 -0
- package/dist/esm/cas-adapters/db.d.ts +93 -0
- package/dist/esm/cas-adapters/db.d.ts.map +1 -0
- package/dist/esm/cas-adapters/db.js +135 -0
- package/dist/esm/cas-adapters/db.js.map +1 -0
- package/dist/esm/cas-adapters/registry.d.ts +88 -0
- package/dist/esm/cas-adapters/registry.d.ts.map +1 -0
- package/dist/esm/cas-adapters/registry.js +116 -0
- package/dist/esm/cas-adapters/registry.js.map +1 -0
- package/dist/esm/cas-attestation.d.ts +94 -0
- package/dist/esm/cas-attestation.d.ts.map +1 -0
- package/dist/esm/cas-attestation.js +127 -0
- package/dist/esm/cas-attestation.js.map +1 -0
- package/dist/esm/deploy-gate.d.ts +10 -1
- package/dist/esm/deploy-gate.d.ts.map +1 -1
- package/dist/esm/deploy-gate.js +14 -10
- package/dist/esm/deploy-gate.js.map +1 -1
- package/dist/esm/execute-tool-call.d.ts +100 -0
- package/dist/esm/execute-tool-call.d.ts.map +1 -0
- package/dist/esm/execute-tool-call.js +325 -0
- package/dist/esm/execute-tool-call.js.map +1 -0
- package/dist/esm/execution-time-fingerprint.d.ts +8 -0
- package/dist/esm/execution-time-fingerprint.d.ts.map +1 -1
- package/dist/esm/execution-time-fingerprint.js +11 -0
- package/dist/esm/execution-time-fingerprint.js.map +1 -1
- package/dist/esm/guard.d.ts.map +1 -1
- package/dist/esm/guard.js +29 -10
- package/dist/esm/guard.js.map +1 -1
- package/dist/esm/index.d.ts +13 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +16 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/merge-gate.d.ts +8 -0
- package/dist/esm/merge-gate.d.ts.map +1 -1
- package/dist/esm/merge-gate.js +19 -12
- package/dist/esm/merge-gate.js.map +1 -1
- package/dist/esm/remediation-loop-attestation.d.ts +125 -0
- package/dist/esm/remediation-loop-attestation.d.ts.map +1 -0
- package/dist/esm/remediation-loop-attestation.js +179 -0
- package/dist/esm/remediation-loop-attestation.js.map +1 -0
- package/dist/esm/types.d.ts +20 -3
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/with-coderifts.d.ts +9 -0
- package/dist/esm/with-coderifts.d.ts.map +1 -1
- package/dist/esm/with-coderifts.js +3 -0
- package/dist/esm/with-coderifts.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Option A safe dispatcher — per-framework execute wrappers that run a tool call
|
|
3
|
+
* through the protected table AND always return a proof-bound framework message.
|
|
4
|
+
*
|
|
5
|
+
* Closes the manual-binder gap (audit D): hosts that use these faces cannot
|
|
6
|
+
* forget bind*GuardOutcome — the return type is ONLY the ProofBound* brand.
|
|
7
|
+
*
|
|
8
|
+
* MECHANISM (measured, tool-registry.ts wrapWithGuard):
|
|
9
|
+
* ProtectedTool.execute for mutators returns guardToolCall(...) → GuardOutcome.
|
|
10
|
+
* No parallel guard path: the dispatcher only calls tool.execute on the table.
|
|
11
|
+
*
|
|
12
|
+
* REACHABILITY (do not overclaim):
|
|
13
|
+
* Same residual as GuardExecutionProof.limits.calls_outside_guarded_path_invisible
|
|
14
|
+
* and withCodeRifts composition honesty — calls outside the returned table remain
|
|
15
|
+
* invisible. This dispatcher only covers calls it is given against the table.
|
|
16
|
+
*
|
|
17
|
+
* BLOCK branch: binder no-result path (never fabricates a tool result) + measured
|
|
18
|
+
* DecisionResultEnvelope fields surfaced when present (decision_id, decision,
|
|
19
|
+
* execution_action, required_action, next_actions, breaking_changes). No invented
|
|
20
|
+
* remediation (ID850 lives in the app, not here).
|
|
21
|
+
*/
|
|
22
|
+
import type { GuardOutcome, DecisionResultEnvelope } from './types.js';
|
|
23
|
+
import type { ProtectedTool } from './tool-registry.js';
|
|
24
|
+
import { type BindOpenAIGuardOutcomeArgs, type ProofBoundOpenAIToolMessage } from './adapters/openai.js';
|
|
25
|
+
import { type BindAnthropicGuardOutcomeArgs, type ProofBoundAnthropicToolResult } from './adapters/anthropic.js';
|
|
26
|
+
import { type BindGeminiGuardOutcomeArgs, type ProofBoundGeminiFunctionResponse } from './adapters/gemini.js';
|
|
27
|
+
import { type BindLangGraphGuardOutcomeArgs, type ProofBoundLangGraphToolMessage } from './adapters/langgraph.js';
|
|
28
|
+
/**
|
|
29
|
+
* Accepts a bare ProtectedTool[] or a withCodeRifts / withCodeRifts* result that
|
|
30
|
+
* carries `tools` and/or `protected_tools`.
|
|
31
|
+
*/
|
|
32
|
+
export type ProtectedToolTableInput = readonly ProtectedTool[] | {
|
|
33
|
+
tools?: readonly ProtectedTool[];
|
|
34
|
+
protected_tools?: readonly ProtectedTool[];
|
|
35
|
+
};
|
|
36
|
+
/** Measured shape: every arm has executed + executionAttempted + proof + verdict. */
|
|
37
|
+
export declare function isGuardOutcome(x: unknown): x is GuardOutcome<unknown>;
|
|
38
|
+
/**
|
|
39
|
+
* Locate tool by name on the protected table and invoke its execute.
|
|
40
|
+
* Mutators return GuardOutcome (guardToolCall); unknown → typed refusal outcome.
|
|
41
|
+
*
|
|
42
|
+
* Does NOT claim reachability outside the table
|
|
43
|
+
* (limits.calls_outside_guarded_path_invisible).
|
|
44
|
+
*/
|
|
45
|
+
export declare function executeProtectedTool(table: ProtectedToolTableInput, toolName: string, args: unknown): Promise<GuardOutcome<unknown>>;
|
|
46
|
+
/**
|
|
47
|
+
* Fields lifted only when present on DecisionResultEnvelope (producer schema).
|
|
48
|
+
* required_action is DISPLAY ONLY per schema — never a control source / remediation enginge.
|
|
49
|
+
* No invented remediation structures (ID850 is app-side).
|
|
50
|
+
*/
|
|
51
|
+
export type SurfacedEnvelopeFields = {
|
|
52
|
+
decision_id?: string;
|
|
53
|
+
decision?: string;
|
|
54
|
+
execution_action?: string;
|
|
55
|
+
required_action?: string | null;
|
|
56
|
+
next_actions?: unknown;
|
|
57
|
+
breaking_changes?: number | null;
|
|
58
|
+
};
|
|
59
|
+
export declare function surfaceEnvelopeFields(envelope: DecisionResultEnvelope | null | undefined): SurfacedEnvelopeFields | null;
|
|
60
|
+
export type ExecuteOpenAIToolCallArgs = {
|
|
61
|
+
/** Protected table or withCodeRifts / withCodeRiftsOpenAI result. */
|
|
62
|
+
tools: ProtectedToolTableInput;
|
|
63
|
+
/** Model tool_call_id this message answers. */
|
|
64
|
+
tool_call_id: string;
|
|
65
|
+
/** Function/tool name as returned by the model. */
|
|
66
|
+
name: string;
|
|
67
|
+
/** Tool arguments (object or JSON string). */
|
|
68
|
+
arguments?: unknown;
|
|
69
|
+
serialize?: BindOpenAIGuardOutcomeArgs<unknown>['serialize'];
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* OpenAI face: protected table + one tool_call → ProofBoundOpenAIToolMessage only.
|
|
73
|
+
* Return type is branded — host cannot type-check a forgotten-proof path.
|
|
74
|
+
*/
|
|
75
|
+
export declare function executeOpenAIToolCall(args: ExecuteOpenAIToolCallArgs): Promise<ProofBoundOpenAIToolMessage>;
|
|
76
|
+
export type ExecuteAnthropicToolCallArgs = {
|
|
77
|
+
tools: ProtectedToolTableInput;
|
|
78
|
+
tool_use_id: string;
|
|
79
|
+
name: string;
|
|
80
|
+
arguments?: unknown;
|
|
81
|
+
serialize?: BindAnthropicGuardOutcomeArgs<unknown>['serialize'];
|
|
82
|
+
};
|
|
83
|
+
export declare function executeAnthropicToolCall(args: ExecuteAnthropicToolCallArgs): Promise<ProofBoundAnthropicToolResult>;
|
|
84
|
+
export type ExecuteGeminiToolCallArgs = {
|
|
85
|
+
tools: ProtectedToolTableInput;
|
|
86
|
+
/** Gemini function name (also used as BindGemini name). */
|
|
87
|
+
name: string;
|
|
88
|
+
arguments?: unknown;
|
|
89
|
+
serialize?: BindGeminiGuardOutcomeArgs<unknown>['serialize'];
|
|
90
|
+
};
|
|
91
|
+
export declare function executeGeminiToolCall(args: ExecuteGeminiToolCallArgs): Promise<ProofBoundGeminiFunctionResponse>;
|
|
92
|
+
export type ExecuteLangGraphToolCallArgs = {
|
|
93
|
+
tools: ProtectedToolTableInput;
|
|
94
|
+
tool_call_id: string;
|
|
95
|
+
name: string;
|
|
96
|
+
arguments?: unknown;
|
|
97
|
+
serialize?: BindLangGraphGuardOutcomeArgs<unknown>['serialize'];
|
|
98
|
+
};
|
|
99
|
+
export declare function executeLangGraphToolCall(args: ExecuteLangGraphToolCallArgs): Promise<ProofBoundLangGraphToolMessage>;
|
|
100
|
+
//# sourceMappingURL=execute-tool-call.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-tool-call.d.ts","sourceRoot":"","sources":["../../src/execute-tool-call.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Option A safe dispatcher — per-framework execute wrappers that run a tool call
|
|
3
|
+
* through the protected table AND always return a proof-bound framework message.
|
|
4
|
+
*
|
|
5
|
+
* Closes the manual-binder gap (audit D): hosts that use these faces cannot
|
|
6
|
+
* forget bind*GuardOutcome — the return type is ONLY the ProofBound* brand.
|
|
7
|
+
*
|
|
8
|
+
* MECHANISM (measured, tool-registry.ts wrapWithGuard):
|
|
9
|
+
* ProtectedTool.execute for mutators returns guardToolCall(...) → GuardOutcome.
|
|
10
|
+
* No parallel guard path: the dispatcher only calls tool.execute on the table.
|
|
11
|
+
*
|
|
12
|
+
* REACHABILITY (do not overclaim):
|
|
13
|
+
* Same residual as GuardExecutionProof.limits.calls_outside_guarded_path_invisible
|
|
14
|
+
* and withCodeRifts composition honesty — calls outside the returned table remain
|
|
15
|
+
* invisible. This dispatcher only covers calls it is given against the table.
|
|
16
|
+
*
|
|
17
|
+
* BLOCK branch: binder no-result path (never fabricates a tool result) + measured
|
|
18
|
+
* DecisionResultEnvelope fields surfaced when present (decision_id, decision,
|
|
19
|
+
* execution_action, required_action, next_actions, breaking_changes). No invented
|
|
20
|
+
* remediation (ID850 lives in the app, not here).
|
|
21
|
+
*/
|
|
22
|
+
import { buildExecutionProof } from './execution-proof.js';
|
|
23
|
+
import { bindOpenAIGuardOutcome, } from './adapters/openai.js';
|
|
24
|
+
import { bindAnthropicGuardOutcome, } from './adapters/anthropic.js';
|
|
25
|
+
import { bindGeminiGuardOutcome, } from './adapters/gemini.js';
|
|
26
|
+
import { bindLangGraphGuardOutcome, } from './adapters/langgraph.js';
|
|
27
|
+
function resolveProtectedTools(table) {
|
|
28
|
+
if (Array.isArray(table))
|
|
29
|
+
return table;
|
|
30
|
+
if (table && typeof table === 'object') {
|
|
31
|
+
const bag = table;
|
|
32
|
+
if (Array.isArray(bag.protected_tools) && bag.protected_tools.length > 0) {
|
|
33
|
+
return bag.protected_tools;
|
|
34
|
+
}
|
|
35
|
+
if (Array.isArray(bag.tools)) {
|
|
36
|
+
// withCodeRifts returns tools as ProtectedTool[]; OpenAI face also has tools as shape defs —
|
|
37
|
+
// prefer protected_tools when both exist (OpenAI). When only tools, use if they have execute.
|
|
38
|
+
const withExecute = bag.tools.filter((t) => t && typeof t === 'object' && typeof t.execute === 'function');
|
|
39
|
+
if (withExecute.length > 0)
|
|
40
|
+
return withExecute;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
function findTool(table, name) {
|
|
46
|
+
const tools = resolveProtectedTools(table);
|
|
47
|
+
return tools.find((t) => t && t.name === name);
|
|
48
|
+
}
|
|
49
|
+
// ── GuardOutcome detection ───────────────────────────────────────────────────
|
|
50
|
+
/** Measured shape: every arm has executed + executionAttempted + proof + verdict. */
|
|
51
|
+
export function isGuardOutcome(x) {
|
|
52
|
+
if (!x || typeof x !== 'object')
|
|
53
|
+
return false;
|
|
54
|
+
const o = x;
|
|
55
|
+
return (typeof o.executed === 'boolean'
|
|
56
|
+
&& typeof o.executionAttempted === 'boolean'
|
|
57
|
+
&& o.proof != null
|
|
58
|
+
&& typeof o.proof === 'object'
|
|
59
|
+
&& o.verdict != null
|
|
60
|
+
&& typeof o.verdict === 'object');
|
|
61
|
+
}
|
|
62
|
+
// ── Synthetic outcomes (unknown tool / non-outcome execute returns) ──────────
|
|
63
|
+
const FRESHNESS_NOT_CONFIGURED = Object.freeze({
|
|
64
|
+
wiring: 'NOT_CONFIGURED',
|
|
65
|
+
write_style: false,
|
|
66
|
+
require_freshness: false,
|
|
67
|
+
});
|
|
68
|
+
const CW_NOT_REPORTED = Object.freeze({
|
|
69
|
+
conditional_write: 'not_reported',
|
|
70
|
+
require_conditional_write: false,
|
|
71
|
+
write_style: false,
|
|
72
|
+
});
|
|
73
|
+
/**
|
|
74
|
+
* Unknown tool name — typed refusal via binder no-result path.
|
|
75
|
+
* Uses CONFIG_ERROR integrity UNAVAILABLE (not a fabricated ALLOW).
|
|
76
|
+
* Never throws so the host cannot catch-and-fall-back to raw.
|
|
77
|
+
*/
|
|
78
|
+
function unknownToolOutcome(toolName) {
|
|
79
|
+
const verdict = {
|
|
80
|
+
kind: 'UNAVAILABLE',
|
|
81
|
+
cause: 'CONFIG_ERROR',
|
|
82
|
+
failPolicy: 'closed',
|
|
83
|
+
resolution: 'CLOSED',
|
|
84
|
+
action: 'STOP',
|
|
85
|
+
decisionMissing: true,
|
|
86
|
+
unavailableCount: 1,
|
|
87
|
+
};
|
|
88
|
+
const proof = buildExecutionProof({
|
|
89
|
+
preflighted: false,
|
|
90
|
+
executionAttempted: false,
|
|
91
|
+
executed: false,
|
|
92
|
+
enforced: false,
|
|
93
|
+
verdict,
|
|
94
|
+
});
|
|
95
|
+
// Annotate verdict for body text; proof already has verdict_kind.
|
|
96
|
+
void toolName;
|
|
97
|
+
return {
|
|
98
|
+
executionAttempted: false,
|
|
99
|
+
executed: false,
|
|
100
|
+
enforced: false,
|
|
101
|
+
verdict,
|
|
102
|
+
preflighted: false,
|
|
103
|
+
proof,
|
|
104
|
+
freshness: FRESHNESS_NOT_CONFIGURED,
|
|
105
|
+
conditional_write: CW_NOT_REPORTED,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Readonly / passthrough tools return raw values (not GuardOutcome).
|
|
110
|
+
* Wrap as unenforced executed SKIPPED so binders still produce ProofBound*.
|
|
111
|
+
*/
|
|
112
|
+
function wrapRawAsOutcome(result) {
|
|
113
|
+
const verdict = {
|
|
114
|
+
kind: 'SKIPPED',
|
|
115
|
+
reason: 'NOT_A_CONTRACT_CALL',
|
|
116
|
+
signals: ['dispatcher_passthrough'],
|
|
117
|
+
detectorVersion: 'execute-tool-call',
|
|
118
|
+
};
|
|
119
|
+
const proof = buildExecutionProof({
|
|
120
|
+
preflighted: false,
|
|
121
|
+
executionAttempted: true,
|
|
122
|
+
executed: true,
|
|
123
|
+
enforced: false,
|
|
124
|
+
verdict,
|
|
125
|
+
result,
|
|
126
|
+
});
|
|
127
|
+
return {
|
|
128
|
+
executionAttempted: true,
|
|
129
|
+
executed: true,
|
|
130
|
+
enforced: false,
|
|
131
|
+
result,
|
|
132
|
+
verdict,
|
|
133
|
+
preflighted: false,
|
|
134
|
+
proof,
|
|
135
|
+
freshness: FRESHNESS_NOT_CONFIGURED,
|
|
136
|
+
conditional_write: CW_NOT_REPORTED,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
function wrapThrownAsOutcome(error) {
|
|
140
|
+
const verdict = {
|
|
141
|
+
kind: 'SKIPPED',
|
|
142
|
+
reason: 'NOT_A_CONTRACT_CALL',
|
|
143
|
+
signals: ['dispatcher_passthrough_throw'],
|
|
144
|
+
detectorVersion: 'execute-tool-call',
|
|
145
|
+
};
|
|
146
|
+
const proof = buildExecutionProof({
|
|
147
|
+
preflighted: false,
|
|
148
|
+
executionAttempted: true,
|
|
149
|
+
executed: false,
|
|
150
|
+
enforced: false,
|
|
151
|
+
verdict,
|
|
152
|
+
error,
|
|
153
|
+
});
|
|
154
|
+
return {
|
|
155
|
+
executionAttempted: true,
|
|
156
|
+
executed: false,
|
|
157
|
+
enforced: false,
|
|
158
|
+
error,
|
|
159
|
+
verdict,
|
|
160
|
+
preflighted: false,
|
|
161
|
+
proof,
|
|
162
|
+
freshness: FRESHNESS_NOT_CONFIGURED,
|
|
163
|
+
conditional_write: CW_NOT_REPORTED,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
// ── Core: execute through table → GuardOutcome ───────────────────────────────
|
|
167
|
+
/**
|
|
168
|
+
* Locate tool by name on the protected table and invoke its execute.
|
|
169
|
+
* Mutators return GuardOutcome (guardToolCall); unknown → typed refusal outcome.
|
|
170
|
+
*
|
|
171
|
+
* Does NOT claim reachability outside the table
|
|
172
|
+
* (limits.calls_outside_guarded_path_invisible).
|
|
173
|
+
*/
|
|
174
|
+
export async function executeProtectedTool(table, toolName, args) {
|
|
175
|
+
const tool = findTool(table, toolName);
|
|
176
|
+
if (!tool) {
|
|
177
|
+
return unknownToolOutcome(toolName);
|
|
178
|
+
}
|
|
179
|
+
try {
|
|
180
|
+
const raw = await tool.execute(args);
|
|
181
|
+
if (isGuardOutcome(raw))
|
|
182
|
+
return raw;
|
|
183
|
+
// Readonly passthrough: raw factory return, not a GuardOutcome.
|
|
184
|
+
return wrapRawAsOutcome(raw);
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
// Guarded mutators absorb factory throws into GuardOutcome; passthrough may throw.
|
|
188
|
+
return wrapThrownAsOutcome(err);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
export function surfaceEnvelopeFields(envelope) {
|
|
192
|
+
if (!envelope || typeof envelope !== 'object')
|
|
193
|
+
return null;
|
|
194
|
+
const e = envelope;
|
|
195
|
+
const out = {};
|
|
196
|
+
if (typeof e.decision_id === 'string')
|
|
197
|
+
out.decision_id = e.decision_id;
|
|
198
|
+
if (typeof e.decision === 'string')
|
|
199
|
+
out.decision = e.decision;
|
|
200
|
+
if (typeof e.execution_action === 'string')
|
|
201
|
+
out.execution_action = e.execution_action;
|
|
202
|
+
if ('required_action' in e) {
|
|
203
|
+
out.required_action = e.required_action == null ? null : String(e.required_action);
|
|
204
|
+
}
|
|
205
|
+
if ('next_actions' in e)
|
|
206
|
+
out.next_actions = e.next_actions;
|
|
207
|
+
if ('breaking_changes' in e) {
|
|
208
|
+
out.breaking_changes =
|
|
209
|
+
typeof e.breaking_changes === 'number' ? e.breaking_changes : e.breaking_changes === null ? null : undefined;
|
|
210
|
+
if (out.breaking_changes === undefined)
|
|
211
|
+
delete out.breaking_changes;
|
|
212
|
+
}
|
|
213
|
+
return Object.keys(out).length > 0 ? out : null;
|
|
214
|
+
}
|
|
215
|
+
function envelopeFromOutcome(outcome) {
|
|
216
|
+
const v = outcome.verdict;
|
|
217
|
+
if (v && typeof v === 'object' && 'envelope' in v && v.envelope && typeof v.envelope === 'object') {
|
|
218
|
+
return v.envelope;
|
|
219
|
+
}
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
/** Append measured envelope surface to a string body (OpenAI/Anthropic/LangGraph). */
|
|
223
|
+
function appendEnvelopeSurface(body, outcome) {
|
|
224
|
+
if (outcome.executionAttempted !== false)
|
|
225
|
+
return body;
|
|
226
|
+
const fields = surfaceEnvelopeFields(envelopeFromOutcome(outcome));
|
|
227
|
+
if (!fields)
|
|
228
|
+
return body;
|
|
229
|
+
return (body
|
|
230
|
+
+ '\n\n[CodeRifts decision envelope — measured fields only; not a remediation engine]\n'
|
|
231
|
+
+ JSON.stringify(fields, null, 2));
|
|
232
|
+
}
|
|
233
|
+
/** Merge measured envelope into Gemini response object (no fabricated result key). */
|
|
234
|
+
function mergeEnvelopeIntoGeminiResponse(response, outcome) {
|
|
235
|
+
if (outcome.executionAttempted !== false)
|
|
236
|
+
return response;
|
|
237
|
+
const fields = surfaceEnvelopeFields(envelopeFromOutcome(outcome));
|
|
238
|
+
if (!fields)
|
|
239
|
+
return response;
|
|
240
|
+
return { ...response, decision_envelope: fields };
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* OpenAI face: protected table + one tool_call → ProofBoundOpenAIToolMessage only.
|
|
244
|
+
* Return type is branded — host cannot type-check a forgotten-proof path.
|
|
245
|
+
*/
|
|
246
|
+
export async function executeOpenAIToolCall(args) {
|
|
247
|
+
const callArgs = parseMaybeJsonArgs(args.arguments);
|
|
248
|
+
const outcome = await executeProtectedTool(args.tools, args.name, callArgs);
|
|
249
|
+
const bound = bindOpenAIGuardOutcome(outcome, {
|
|
250
|
+
tool_call_id: args.tool_call_id,
|
|
251
|
+
serialize: args.serialize,
|
|
252
|
+
});
|
|
253
|
+
if (outcome.executionAttempted === false) {
|
|
254
|
+
const content = appendEnvelopeSurface(bound.content, outcome);
|
|
255
|
+
return { role: 'tool', tool_call_id: args.tool_call_id, content };
|
|
256
|
+
}
|
|
257
|
+
return bound;
|
|
258
|
+
}
|
|
259
|
+
export async function executeAnthropicToolCall(args) {
|
|
260
|
+
const callArgs = parseMaybeJsonArgs(args.arguments);
|
|
261
|
+
const outcome = await executeProtectedTool(args.tools, args.name, callArgs);
|
|
262
|
+
const bound = bindAnthropicGuardOutcome(outcome, {
|
|
263
|
+
tool_use_id: args.tool_use_id,
|
|
264
|
+
serialize: args.serialize,
|
|
265
|
+
});
|
|
266
|
+
if (outcome.executionAttempted === false) {
|
|
267
|
+
const content = appendEnvelopeSurface(bound.content, outcome);
|
|
268
|
+
return {
|
|
269
|
+
type: 'tool_result',
|
|
270
|
+
tool_use_id: args.tool_use_id,
|
|
271
|
+
content,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
return bound;
|
|
275
|
+
}
|
|
276
|
+
export async function executeGeminiToolCall(args) {
|
|
277
|
+
const callArgs = parseMaybeJsonArgs(args.arguments);
|
|
278
|
+
const outcome = await executeProtectedTool(args.tools, args.name, callArgs);
|
|
279
|
+
const bound = bindGeminiGuardOutcome(outcome, {
|
|
280
|
+
name: args.name,
|
|
281
|
+
serialize: args.serialize,
|
|
282
|
+
});
|
|
283
|
+
if (outcome.executionAttempted === false) {
|
|
284
|
+
const response = mergeEnvelopeIntoGeminiResponse({ ...bound.functionResponse.response }, outcome);
|
|
285
|
+
return {
|
|
286
|
+
functionResponse: { name: args.name, response },
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
return bound;
|
|
290
|
+
}
|
|
291
|
+
export async function executeLangGraphToolCall(args) {
|
|
292
|
+
const callArgs = parseMaybeJsonArgs(args.arguments);
|
|
293
|
+
const outcome = await executeProtectedTool(args.tools, args.name, callArgs);
|
|
294
|
+
const bound = bindLangGraphGuardOutcome(outcome, {
|
|
295
|
+
tool_call_id: args.tool_call_id,
|
|
296
|
+
name: args.name,
|
|
297
|
+
serialize: args.serialize,
|
|
298
|
+
});
|
|
299
|
+
if (outcome.executionAttempted === false) {
|
|
300
|
+
const content = appendEnvelopeSurface(bound.content, outcome);
|
|
301
|
+
const msg = {
|
|
302
|
+
content,
|
|
303
|
+
tool_call_id: args.tool_call_id,
|
|
304
|
+
name: args.name,
|
|
305
|
+
};
|
|
306
|
+
return msg;
|
|
307
|
+
}
|
|
308
|
+
return bound;
|
|
309
|
+
}
|
|
310
|
+
// ── helpers ──────────────────────────────────────────────────────────────────
|
|
311
|
+
function parseMaybeJsonArgs(args) {
|
|
312
|
+
if (typeof args === 'string') {
|
|
313
|
+
const s = args.trim();
|
|
314
|
+
if (s.length === 0)
|
|
315
|
+
return {};
|
|
316
|
+
try {
|
|
317
|
+
return JSON.parse(s);
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
return { _raw: args };
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return args === undefined ? {} : args;
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=execute-tool-call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-tool-call.js","sourceRoot":"","sources":["../../src/execute-tool-call.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,14 @@ export declare const EXECUTION_TIME_FP_REASONS: Readonly<{
|
|
|
36
36
|
readonly MISSING_ARTIFACTS: "missing_artifacts";
|
|
37
37
|
}>;
|
|
38
38
|
export type ExecutionTimeFpReason = (typeof EXECUTION_TIME_FP_REASONS)[keyof typeof EXECUTION_TIME_FP_REASONS];
|
|
39
|
+
/**
|
|
40
|
+
* Warn-mode classification: unmeasurable ≠ drift.
|
|
41
|
+
* - fingerprint_stale_at_execute → real drift (loud: execution_state_drift_observed)
|
|
42
|
+
* - missing_artifacts / missing_authorized_fingerprint → nothing to measure (quiet: execution_state_unmeasurable)
|
|
43
|
+
*/
|
|
44
|
+
export declare function isUnmeasurableExecutionStateReason(reason: string): boolean;
|
|
45
|
+
/** Fixed note on the quiet warn event — not evidence of drift, not evidence of safety. */
|
|
46
|
+
export declare const EXECUTION_STATE_UNMEASURABLE_NOTE = "nothing to measure \u2014 not evidence of drift, not evidence of safety";
|
|
39
47
|
export type ExecutionTimeFingerprintVerdict = {
|
|
40
48
|
match: boolean;
|
|
41
49
|
reason: ExecutionTimeFpReason;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-time-fingerprint.d.ts","sourceRoot":"","sources":["../../src/execution-time-fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAoB3C,+EAA+E;AAC/E,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC/C,SAAS,EAAE,QAAQ,EAAE,EACrB,OAAO,CAAC,EAAE,wBAAwB,GAAG,IAAI,GACxC,MAAM,CAwBR;AAED,+FAA+F;AAC/F,eAAO,MAAM,yBAAyB;;IAEpC,6EAA6E;;IAE7E,6EAA6E;;;;EAIpE,CAAC;AAEZ,MAAM,MAAM,qBAAqB,GAC/B,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,OAAO,yBAAyB,CAAC,CAAC;AAE7E,MAAM,MAAM,+BAA+B,GAAG;IAC5C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,qBAAqB,CAAC;IAC9B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GACnD,MAAM,GAAG,IAAI,CAYf;AAED,MAAM,MAAM,iCAAiC,GAAG;IAC9C,gFAAgF;IAChF,SAAS,EAAE,QAAQ,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC;IACzC,0EAA0E;IAC1E,OAAO,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC1C,8DAA8D;IAC9D,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC3C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,GAAE,iCAA4D,GACjE,+BAA+B,CAyCjC"}
|
|
1
|
+
{"version":3,"file":"execution-time-fingerprint.d.ts","sourceRoot":"","sources":["../../src/execution-time-fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAoB3C,+EAA+E;AAC/E,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC/C,SAAS,EAAE,QAAQ,EAAE,EACrB,OAAO,CAAC,EAAE,wBAAwB,GAAG,IAAI,GACxC,MAAM,CAwBR;AAED,+FAA+F;AAC/F,eAAO,MAAM,yBAAyB;;IAEpC,6EAA6E;;IAE7E,6EAA6E;;;;EAIpE,CAAC;AAEZ,MAAM,MAAM,qBAAqB,GAC/B,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,OAAO,yBAAyB,CAAC,CAAC;AAE7E;;;;GAIG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAK1E;AAED,0FAA0F;AAC1F,eAAO,MAAM,iCAAiC,4EACwB,CAAC;AAEvE,MAAM,MAAM,+BAA+B,GAAG;IAC5C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,qBAAqB,CAAC;IAC9B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GACnD,MAAM,GAAG,IAAI,CAYf;AAED,MAAM,MAAM,iCAAiC,GAAG;IAC9C,gFAAgF;IAChF,SAAS,EAAE,QAAQ,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC;IACzC,0EAA0E;IAC1E,OAAO,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC1C,8DAA8D;IAC9D,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC3C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,GAAE,iCAA4D,GACjE,+BAA+B,CAyCjC"}
|
|
@@ -61,6 +61,17 @@ export const EXECUTION_TIME_FP_REASONS = Object.freeze({
|
|
|
61
61
|
MISSING_AUTHORIZED_FINGERPRINT: 'missing_authorized_fingerprint',
|
|
62
62
|
MISSING_ARTIFACTS: 'missing_artifacts',
|
|
63
63
|
});
|
|
64
|
+
/**
|
|
65
|
+
* Warn-mode classification: unmeasurable ≠ drift.
|
|
66
|
+
* - fingerprint_stale_at_execute → real drift (loud: execution_state_drift_observed)
|
|
67
|
+
* - missing_artifacts / missing_authorized_fingerprint → nothing to measure (quiet: execution_state_unmeasurable)
|
|
68
|
+
*/
|
|
69
|
+
export function isUnmeasurableExecutionStateReason(reason) {
|
|
70
|
+
return (reason === EXECUTION_TIME_FP_REASONS.MISSING_ARTIFACTS
|
|
71
|
+
|| reason === EXECUTION_TIME_FP_REASONS.MISSING_AUTHORIZED_FINGERPRINT);
|
|
72
|
+
}
|
|
73
|
+
/** Fixed note on the quiet warn event — not evidence of drift, not evidence of safety. */
|
|
74
|
+
export const EXECUTION_STATE_UNMEASURABLE_NOTE = 'nothing to measure — not evidence of drift, not evidence of safety';
|
|
64
75
|
/**
|
|
65
76
|
* Extract the authorized fingerprint from a decision envelope / receipt view.
|
|
66
77
|
* Authorize path: fingerprint === input_fingerprint === crbundle.v1 hash.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-time-fingerprint.js","sourceRoot":"","sources":["../../src/execution-time-fingerprint.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"execution-time-fingerprint.js","sourceRoot":"","sources":["../../src/execution-time-fingerprint.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/guard.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EACV,WAAW,EAAE,YAAY,EACT,kBAAkB,EAAE,cAAc,EAEnD,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EACV,WAAW,EAAE,YAAY,EACT,kBAAkB,EAAE,cAAc,EAEnD,MAAM,YAAY,CAAC;AAWpB,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAGL,KAAK,2BAA2B,EACjC,MAAM,wBAAwB,CAAC;AAwShC;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,CAAC,EACnC,IAAI,EAAE,kBAAkB,EACxB,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,EACjC,MAAM,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,oBAAoB,GAAG,2BAA2B,GAC/D,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAkU1B"}
|
package/dist/esm/guard.js
CHANGED
|
@@ -12,7 +12,7 @@ import { readDecision, isClosedAction } from './read-decision.js';
|
|
|
12
12
|
import { builtinDetector } from './detector.js';
|
|
13
13
|
import { bindReceiptToEnvelope } from './receipt-binding.js';
|
|
14
14
|
import { evaluateEnvelope } from './enforcement-gate.js';
|
|
15
|
-
import { checkExecutionTimeFingerprint } from './execution-time-fingerprint.js';
|
|
15
|
+
import { checkExecutionTimeFingerprint, isUnmeasurableExecutionStateReason, EXECUTION_STATE_UNMEASURABLE_NOTE, } from './execution-time-fingerprint.js';
|
|
16
16
|
import { buildExecutionProof } from './execution-proof.js';
|
|
17
17
|
import { buildFreshnessBasis, isWriteStyleCall, } from './freshness.js';
|
|
18
18
|
import { buildConditionalWriteBasis, } from './conditional-write.js';
|
|
@@ -530,18 +530,37 @@ export async function guardToolCall(call, executeFactory, config, callContext) {
|
|
|
530
530
|
if (!et.match) {
|
|
531
531
|
if (execStateMode === true) {
|
|
532
532
|
// enforce path — behaviorally identical to step 1 (block; do not change).
|
|
533
|
+
// @7 candidate (not this pass): split the refusal cause so missing_authorized_fingerprint /
|
|
534
|
+
// missing_artifacts do not collapse into EXECUTION_STATE_DRIFT (consumers may match that
|
|
535
|
+
// cause string). Changing the cause value is a breaking surface — leave true-mode as-is.
|
|
533
536
|
breakerRecord(config);
|
|
534
537
|
return closedIntegrity(config, 'EXECUTION_STATE_DRIFT', failPolicy, fctx, cwctx, redacted, detection.artifacts);
|
|
535
538
|
}
|
|
536
|
-
// warn path —
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
539
|
+
// warn path — split signals (step3a noise-fix for a future default-to-warn):
|
|
540
|
+
// real drift (fingerprint_stale_at_execute) → execution_state_drift_observed (loud, shape frozen)
|
|
541
|
+
// unmeasurable (missing_artifacts | missing_authorized_fingerprint) → execution_state_unmeasurable
|
|
542
|
+
// Then fall through to executeFactory either way.
|
|
543
|
+
if (isUnmeasurableExecutionStateReason(et.reason)) {
|
|
544
|
+
emit(config, {
|
|
545
|
+
type: 'execution_state_unmeasurable',
|
|
546
|
+
at: iso(),
|
|
547
|
+
decisionId: envelope.decision_id,
|
|
548
|
+
current_fingerprint: et.current_fingerprint,
|
|
549
|
+
authorized_fingerprint: et.authorized_fingerprint,
|
|
550
|
+
reason: et.reason,
|
|
551
|
+
note: EXECUTION_STATE_UNMEASURABLE_NOTE,
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
else {
|
|
555
|
+
emit(config, {
|
|
556
|
+
type: 'execution_state_drift_observed',
|
|
557
|
+
at: iso(),
|
|
558
|
+
decisionId: envelope.decision_id,
|
|
559
|
+
current_fingerprint: et.current_fingerprint,
|
|
560
|
+
authorized_fingerprint: et.authorized_fingerprint,
|
|
561
|
+
reason: et.reason,
|
|
562
|
+
});
|
|
563
|
+
}
|
|
545
564
|
}
|
|
546
565
|
// match in warn or enforce → proceed silently (no matched event — drift-only telemetry).
|
|
547
566
|
}
|