@coderifts/agent-guard 9.3.0 → 9.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -16
- package/dist/cjs/adapters/anthropic.d.ts +3 -0
- package/dist/cjs/adapters/anthropic.d.ts.map +1 -1
- package/dist/cjs/adapters/anthropic.js +5 -23
- package/dist/cjs/adapters/anthropic.js.map +1 -1
- package/dist/cjs/adapters/gemini.d.ts +3 -0
- package/dist/cjs/adapters/gemini.d.ts.map +1 -1
- package/dist/cjs/adapters/gemini.js +5 -24
- package/dist/cjs/adapters/gemini.js.map +1 -1
- package/dist/cjs/adapters/langgraph.d.ts +40 -6
- package/dist/cjs/adapters/langgraph.d.ts.map +1 -1
- package/dist/cjs/adapters/langgraph.js +75 -30
- package/dist/cjs/adapters/langgraph.js.map +1 -1
- package/dist/cjs/adapters/openai.d.ts +3 -0
- package/dist/cjs/adapters/openai.d.ts.map +1 -1
- package/dist/cjs/adapters/openai.js +5 -22
- package/dist/cjs/adapters/openai.js.map +1 -1
- package/dist/cjs/cas-adapters/fs-default-wire.d.ts +15 -0
- package/dist/cjs/cas-adapters/fs-default-wire.d.ts.map +1 -0
- package/dist/cjs/cas-adapters/fs-default-wire.js +76 -0
- package/dist/cjs/cas-adapters/fs-default-wire.js.map +1 -0
- package/dist/cjs/coverage-observed.d.ts +45 -0
- package/dist/cjs/coverage-observed.d.ts.map +1 -0
- package/dist/cjs/coverage-observed.js +140 -0
- package/dist/cjs/coverage-observed.js.map +1 -0
- package/dist/cjs/execution-proof.d.ts +7 -0
- package/dist/cjs/execution-proof.d.ts.map +1 -1
- package/dist/cjs/execution-proof.js +4 -0
- package/dist/cjs/execution-proof.js.map +1 -1
- package/dist/cjs/final-answer-proof.d.ts.map +1 -1
- package/dist/cjs/final-answer-proof.js +8 -0
- package/dist/cjs/final-answer-proof.js.map +1 -1
- package/dist/cjs/gate-refusal.d.ts +14 -0
- package/dist/cjs/gate-refusal.d.ts.map +1 -0
- package/dist/cjs/gate-refusal.js +85 -0
- package/dist/cjs/gate-refusal.js.map +1 -0
- package/dist/cjs/guard.d.ts.map +1 -1
- package/dist/cjs/guard.js +15 -0
- package/dist/cjs/guard.js.map +1 -1
- package/dist/cjs/index.d.ts +5 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +18 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/tool-registry.d.ts.map +1 -1
- package/dist/cjs/tool-registry.js +5 -1
- package/dist/cjs/tool-registry.js.map +1 -1
- package/dist/cjs/types.d.ts +11 -0
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/with-coderifts.d.ts +14 -2
- package/dist/cjs/with-coderifts.d.ts.map +1 -1
- package/dist/cjs/with-coderifts.js +37 -4
- package/dist/cjs/with-coderifts.js.map +1 -1
- package/dist/esm/adapters/anthropic.d.ts +3 -0
- package/dist/esm/adapters/anthropic.d.ts.map +1 -1
- package/dist/esm/adapters/anthropic.js +3 -21
- package/dist/esm/adapters/anthropic.js.map +1 -1
- package/dist/esm/adapters/gemini.d.ts +3 -0
- package/dist/esm/adapters/gemini.d.ts.map +1 -1
- package/dist/esm/adapters/gemini.js +3 -22
- package/dist/esm/adapters/gemini.js.map +1 -1
- package/dist/esm/adapters/langgraph.d.ts +40 -6
- package/dist/esm/adapters/langgraph.d.ts.map +1 -1
- package/dist/esm/adapters/langgraph.js +69 -28
- package/dist/esm/adapters/langgraph.js.map +1 -1
- package/dist/esm/adapters/openai.d.ts +3 -0
- package/dist/esm/adapters/openai.d.ts.map +1 -1
- package/dist/esm/adapters/openai.js +4 -21
- package/dist/esm/adapters/openai.js.map +1 -1
- package/dist/esm/cas-adapters/fs-default-wire.d.ts +15 -0
- package/dist/esm/cas-adapters/fs-default-wire.d.ts.map +1 -0
- package/dist/esm/cas-adapters/fs-default-wire.js +72 -0
- package/dist/esm/cas-adapters/fs-default-wire.js.map +1 -0
- package/dist/esm/coverage-observed.d.ts +45 -0
- package/dist/esm/coverage-observed.d.ts.map +1 -0
- package/dist/esm/coverage-observed.js +136 -0
- package/dist/esm/coverage-observed.js.map +1 -0
- package/dist/esm/execution-proof.d.ts +7 -0
- package/dist/esm/execution-proof.d.ts.map +1 -1
- package/dist/esm/execution-proof.js +4 -0
- package/dist/esm/execution-proof.js.map +1 -1
- package/dist/esm/final-answer-proof.d.ts.map +1 -1
- package/dist/esm/final-answer-proof.js +8 -0
- package/dist/esm/final-answer-proof.js.map +1 -1
- package/dist/esm/gate-refusal.d.ts +14 -0
- package/dist/esm/gate-refusal.d.ts.map +1 -0
- package/dist/esm/gate-refusal.js +78 -0
- package/dist/esm/gate-refusal.js.map +1 -0
- package/dist/esm/guard.d.ts.map +1 -1
- package/dist/esm/guard.js +15 -0
- package/dist/esm/guard.js.map +1 -1
- package/dist/esm/index.d.ts +5 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +5 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/tool-registry.d.ts.map +1 -1
- package/dist/esm/tool-registry.js +5 -1
- package/dist/esm/tool-registry.js.map +1 -1
- package/dist/esm/types.d.ts +11 -0
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/with-coderifts.d.ts +14 -2
- package/dist/esm/with-coderifts.d.ts.map +1 -1
- package/dist/esm/with-coderifts.js +37 -4
- package/dist/esm/with-coderifts.js.map +1 -1
- package/package.json +1 -1
|
@@ -13,10 +13,18 @@
|
|
|
13
13
|
* owns the framework import and wires descriptors into tool() / ToolNode /
|
|
14
14
|
* bind_tools / StateGraph themselves.
|
|
15
15
|
*
|
|
16
|
-
* Descriptor shape (dependency-free
|
|
17
|
-
* { name, description
|
|
16
|
+
* Descriptor shape (dependency-free, StructuredTool-compatible for createReactAgent):
|
|
17
|
+
* { name, description, schema, func, invoke, lc_runnable: true }
|
|
18
|
+
* Measured against @langchain/langgraph createReactAgent tools:
|
|
19
|
+
* ToolNode | (StructuredToolInterface | DynamicTool | RunnableToolLike)[]
|
|
20
|
+
* (@langchain/langgraph@0.2.74 d.ts; current npm 1.4.12). Runtime isRunnable
|
|
21
|
+
* requires lc_runnable === true; ToolNode drops non-matching tools and the
|
|
22
|
+
* model sees "Tool not found" — NEVER return that silent shape.
|
|
18
23
|
* - schema = JSON Schema from ProtectedTool.inputSchema (or empty object schema)
|
|
19
24
|
* - func / invoke = the GUARDED execute (same function reference) — never the raw tool
|
|
25
|
+
* - description always set (fallback to name) — StructuredToolInterface requires it
|
|
26
|
+
* NO hard @langchain/* dependency: duck-type the measured surface. If a tool would
|
|
27
|
+
* still fail that check, throw LangGraphToolsNotStructuredError (named, with the fix).
|
|
20
28
|
*
|
|
21
29
|
* Honesty (do not "upgrade" assurance):
|
|
22
30
|
* - composition_assurance is passed through EXACTLY as the core reported it
|
|
@@ -34,6 +42,36 @@
|
|
|
34
42
|
*/
|
|
35
43
|
import { withCodeRifts } from '../with-coderifts.js';
|
|
36
44
|
import { attachProofToAgentResponse } from '../final-answer-proof.js';
|
|
45
|
+
import { formatGateRefusalBody, formatGuardError, verdictKind, } from '../gate-refusal.js';
|
|
46
|
+
/**
|
|
47
|
+
* Named error — thrown instead of returning tools createReactAgent would silently drop.
|
|
48
|
+
* Never a model-visible "Tool not found".
|
|
49
|
+
*/
|
|
50
|
+
export class LangGraphToolsNotStructuredError extends Error {
|
|
51
|
+
constructor(message) {
|
|
52
|
+
super(message
|
|
53
|
+
?? 'withCodeRiftsLangGraph() tools are not StructuredTool-compatible for createReactAgent. '
|
|
54
|
+
+ 'createReactAgent (@langchain/langgraph) requires StructuredToolInterface | DynamicTool | '
|
|
55
|
+
+ 'RunnableToolLike (name, description, schema, invoke, lc_runnable). '
|
|
56
|
+
+ 'Fix: wrap with tool() from @langchain/core/tools — see README (LangChain / LangGraph).');
|
|
57
|
+
this.name = 'LangGraphToolsNotStructuredError';
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* True iff `t` matches the measured createReactAgent tool surface
|
|
62
|
+
* (StructuredToolInterface | DynamicTool | RunnableToolLike).
|
|
63
|
+
*/
|
|
64
|
+
export function isLangGraphReactAgentTool(t) {
|
|
65
|
+
if (!t || typeof t !== 'object')
|
|
66
|
+
return false;
|
|
67
|
+
const o = t;
|
|
68
|
+
return typeof o.name === 'string' && o.name.length > 0
|
|
69
|
+
&& typeof o.description === 'string'
|
|
70
|
+
&& o.schema != null && typeof o.schema === 'object' && !Array.isArray(o.schema)
|
|
71
|
+
&& typeof o.invoke === 'function'
|
|
72
|
+
&& typeof o.func === 'function'
|
|
73
|
+
&& o.lc_runnable === true;
|
|
74
|
+
}
|
|
37
75
|
/** Empty JSON Schema object — used when a ProtectedTool has no inputSchema. */
|
|
38
76
|
const EMPTY_SCHEMA = Object.freeze({
|
|
39
77
|
type: 'object',
|
|
@@ -51,15 +89,21 @@ export function protectedToolToLangGraph(tool) {
|
|
|
51
89
|
? tool.inputSchema
|
|
52
90
|
: { ...EMPTY_SCHEMA };
|
|
53
91
|
// Guarded execute only — never a raw unwrapped executor.
|
|
54
|
-
const guarded = (args) => Promise.resolve(tool.execute(args));
|
|
92
|
+
const guarded = (args, _config) => Promise.resolve().then(() => tool.execute(args));
|
|
93
|
+
const description = tool.description != null && tool.description !== ''
|
|
94
|
+
? tool.description
|
|
95
|
+
: tool.name;
|
|
55
96
|
const out = {
|
|
56
97
|
name: tool.name,
|
|
98
|
+
description,
|
|
57
99
|
schema,
|
|
58
100
|
func: guarded,
|
|
59
101
|
invoke: guarded,
|
|
102
|
+
lc_runnable: true,
|
|
60
103
|
};
|
|
61
|
-
if (
|
|
62
|
-
|
|
104
|
+
if (!isLangGraphReactAgentTool(out)) {
|
|
105
|
+
throw new LangGraphToolsNotStructuredError(`protectedToolToLangGraph(${JSON.stringify(tool.name)}): tool is not createReactAgent-consumable. `
|
|
106
|
+
+ 'Fix: wrap with tool() from @langchain/core/tools — see README (LangChain / LangGraph).');
|
|
63
107
|
}
|
|
64
108
|
return out;
|
|
65
109
|
}
|
|
@@ -68,13 +112,29 @@ export function protectedToolToLangGraph(tool) {
|
|
|
68
112
|
* Does NOT call the guard — pure map over an already-protected list.
|
|
69
113
|
*/
|
|
70
114
|
export function toLangGraphTools(protectedTools) {
|
|
71
|
-
return protectedTools.map(protectedToolToLangGraph);
|
|
115
|
+
return bindLangGraphTools(protectedTools.map(protectedToolToLangGraph));
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Assert (and return) tools that createReactAgent can consume.
|
|
119
|
+
* Throws LangGraphToolsNotStructuredError — never a silent "Tool not found".
|
|
120
|
+
*/
|
|
121
|
+
export function bindLangGraphTools(tools) {
|
|
122
|
+
const out = [];
|
|
123
|
+
for (const t of tools) {
|
|
124
|
+
if (!isLangGraphReactAgentTool(t)) {
|
|
125
|
+
const n = t && typeof t === 'object' && 'name' in t ? String(t.name) : '?';
|
|
126
|
+
throw new LangGraphToolsNotStructuredError(`bindLangGraphTools: ${JSON.stringify(n)} is not StructuredTool-compatible for createReactAgent. `
|
|
127
|
+
+ 'Fix: wrap with tool() from @langchain/core/tools — see README (LangChain / LangGraph).');
|
|
128
|
+
}
|
|
129
|
+
out.push(t);
|
|
130
|
+
}
|
|
131
|
+
return out;
|
|
72
132
|
}
|
|
73
133
|
/**
|
|
74
134
|
* Build LangGraph/LangChain-ready guarded tool descriptors from raw tools + client + operation.
|
|
75
135
|
*
|
|
76
136
|
* Calls withCodeRifts internally (guard logic stays in the core). Returns:
|
|
77
|
-
* - `tools` —
|
|
137
|
+
* - `tools` — StructuredTool-compatible descriptors { name, description, schema, func, invoke, lc_runnable }
|
|
78
138
|
* - `protected_tools` — same guarded tools
|
|
79
139
|
* - assurance objects from the core, passed through untouched
|
|
80
140
|
*
|
|
@@ -99,6 +159,7 @@ export function langGraphToolAdapter(result) {
|
|
|
99
159
|
registry_report: result.registry_report,
|
|
100
160
|
composition_assurance: result.composition_assurance,
|
|
101
161
|
receipt_thread: result.receipt_thread,
|
|
162
|
+
coverage_observed: result.coverage_observed,
|
|
102
163
|
};
|
|
103
164
|
if (result.repository !== undefined) {
|
|
104
165
|
out.repository = result.repository;
|
|
@@ -134,10 +195,7 @@ export function bindLangGraphGuardOutcome(outcome, args) {
|
|
|
134
195
|
body = serialize(outcome.result);
|
|
135
196
|
}
|
|
136
197
|
else if (outcome.executionAttempted === false) {
|
|
137
|
-
|
|
138
|
-
body =
|
|
139
|
-
`CodeRifts gate did not permit execution (verdict: ${kind}). `
|
|
140
|
-
+ 'No tool result was produced.';
|
|
198
|
+
body = formatGateRefusalBody(outcome);
|
|
141
199
|
}
|
|
142
200
|
else {
|
|
143
201
|
const err = 'error' in outcome ? outcome.error : undefined;
|
|
@@ -157,21 +215,4 @@ export function bindLangGraphGuardOutcome(outcome, args) {
|
|
|
157
215
|
}
|
|
158
216
|
return msg;
|
|
159
217
|
}
|
|
160
|
-
function verdictKind(outcome) {
|
|
161
|
-
return outcome.verdict && typeof outcome.verdict === 'object' && 'kind' in outcome.verdict
|
|
162
|
-
? String(outcome.verdict.kind)
|
|
163
|
-
: 'UNKNOWN';
|
|
164
|
-
}
|
|
165
|
-
function formatGuardError(err) {
|
|
166
|
-
if (err instanceof Error)
|
|
167
|
-
return err.message || err.name || 'Error';
|
|
168
|
-
if (typeof err === 'string')
|
|
169
|
-
return err;
|
|
170
|
-
try {
|
|
171
|
-
return JSON.stringify(err);
|
|
172
|
-
}
|
|
173
|
-
catch {
|
|
174
|
-
return String(err);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
218
|
//# sourceMappingURL=langgraph.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"langgraph.js","sourceRoot":"","sources":["../../../src/adapters/langgraph.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"langgraph.js","sourceRoot":"","sources":["../../../src/adapters/langgraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
* LangGraph / Anthropic adapters follow the same thin-converter pattern later.
|
|
23
23
|
*/
|
|
24
24
|
import type { WithCodeRiftsInput, WithCodeRiftsResult, CompositionAssurance, ReceiptThreadHandle } from '../with-coderifts.js';
|
|
25
|
+
import type { CoverageObservedHandle } from '../coverage-observed.js';
|
|
25
26
|
import type { ProtectedTool, RegistryCoverageReport } from '../tool-registry.js';
|
|
26
27
|
import type { GuardOutcome } from '../types.js';
|
|
27
28
|
/**
|
|
@@ -61,6 +62,8 @@ export type WithCodeRiftsOpenAIResult = {
|
|
|
61
62
|
composition_assurance: CompositionAssurance;
|
|
62
63
|
/** Per-composition receipt cursor — NOT product-truth chain evidence. */
|
|
63
64
|
receipt_thread: ReceiptThreadHandle;
|
|
65
|
+
/** Observed coverage for this withCodeRifts run. Half A always; Half B via reportToolDispatch. */
|
|
66
|
+
coverage_observed: CoverageObservedHandle;
|
|
64
67
|
repository?: string;
|
|
65
68
|
};
|
|
66
69
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/adapters/openai.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;
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/adapters/openai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQhD;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,2EAA2E;QAC3E,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACrC,CAAC;CACH,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,+EAA+E;IAC/E,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B;;;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,kGAAkG;IAClG,iBAAiB,EAAE,sBAAsB,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAQF;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG,kBAAkB,CAgB7E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,GAAG,kBAAkB,EAAE,CAE5F;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,yBAAyB,CAGxF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,GAAG,yBAAyB,CAexF;AAID;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,OAAO,CAAC,MAAM,iBAAiB,EAAE,OAAO,MAAM,CAAC;AAC/C,MAAM,MAAM,2BAA2B,GAAG,iBAAiB,GAAG;IAC5D,QAAQ,CAAC,YAAY,EAAE,OAAO,iBAAiB,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,0BAA0B,CAAC,CAAC,IAAI;IAC1C,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,CAAC;IAClC;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gCAAgC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAgBrE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EACxB,IAAI,EAAE,0BAA0B,CAAC,CAAC,CAAC,GAClC,2BAA2B,CAgC7B"}
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
*/
|
|
24
24
|
import { withCodeRifts } from '../with-coderifts.js';
|
|
25
25
|
import { attachProofToAgentResponse } from '../final-answer-proof.js';
|
|
26
|
+
import { formatGateRefusalBody, formatGuardError, verdictKind, } from '../gate-refusal.js';
|
|
26
27
|
/** Empty JSON Schema object — used when a ProtectedTool has no inputSchema. */
|
|
27
28
|
const EMPTY_PARAMETERS = Object.freeze({
|
|
28
29
|
type: 'object',
|
|
@@ -83,6 +84,7 @@ export function openAIToolAdapter(result) {
|
|
|
83
84
|
registry_report: result.registry_report,
|
|
84
85
|
composition_assurance: result.composition_assurance,
|
|
85
86
|
receipt_thread: result.receipt_thread,
|
|
87
|
+
coverage_observed: result.coverage_observed,
|
|
86
88
|
};
|
|
87
89
|
if (result.repository !== undefined) {
|
|
88
90
|
out.repository = result.repository;
|
|
@@ -133,20 +135,13 @@ export function bindOpenAIGuardOutcome(outcome, args) {
|
|
|
133
135
|
}
|
|
134
136
|
else if (outcome.executionAttempted === false) {
|
|
135
137
|
// Blocked before factory — no result; never fabricate one.
|
|
136
|
-
|
|
137
|
-
? String(outcome.verdict.kind)
|
|
138
|
-
: 'UNKNOWN';
|
|
139
|
-
body =
|
|
140
|
-
`CodeRifts gate did not permit execution (verdict: ${kind}). `
|
|
141
|
-
+ 'No tool result was produced.';
|
|
138
|
+
body = formatGateRefusalBody(outcome);
|
|
142
139
|
}
|
|
143
140
|
else {
|
|
144
141
|
// executionAttempted && !executed → factory threw; error is present.
|
|
145
142
|
const err = 'error' in outcome ? outcome.error : undefined;
|
|
146
143
|
const errText = formatGuardError(err);
|
|
147
|
-
const kind = outcome
|
|
148
|
-
? String(outcome.verdict.kind)
|
|
149
|
-
: 'UNKNOWN';
|
|
144
|
+
const kind = verdictKind(outcome);
|
|
150
145
|
body =
|
|
151
146
|
`Tool execution failed after gate decision (verdict: ${kind}): ${errText}`;
|
|
152
147
|
}
|
|
@@ -162,16 +157,4 @@ export function bindOpenAIGuardOutcome(outcome, args) {
|
|
|
162
157
|
};
|
|
163
158
|
return msg;
|
|
164
159
|
}
|
|
165
|
-
function formatGuardError(err) {
|
|
166
|
-
if (err instanceof Error)
|
|
167
|
-
return err.message || err.name || 'Error';
|
|
168
|
-
if (typeof err === 'string')
|
|
169
|
-
return err;
|
|
170
|
-
try {
|
|
171
|
-
return JSON.stringify(err);
|
|
172
|
-
}
|
|
173
|
-
catch {
|
|
174
|
-
return String(err);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
160
|
//# sourceMappingURL=openai.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/adapters/openai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/adapters/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ExecuteIfUnchangedOutcome } from '../conditional-write.js';
|
|
2
|
+
/** Unambiguous fs target: a non-empty `path` string on tool arguments (Write convention). */
|
|
3
|
+
export declare function inferFsPathFromArgs(args: unknown): string | null;
|
|
4
|
+
/**
|
|
5
|
+
* Full-file body for a Write-style tool. `contents` wins; `content` only when this
|
|
6
|
+
* is not an Edit (no old_string/new_string). Fragments are not a whole-file CAS.
|
|
7
|
+
*/
|
|
8
|
+
export declare function inferFullFileWriteContent(args: unknown): string | null;
|
|
9
|
+
/**
|
|
10
|
+
* Wire the FS adapter when path + full-file contents are both present.
|
|
11
|
+
* Otherwise run the host write unchanged. If the host already returned an
|
|
12
|
+
* ExecuteIfUnchangedOutcome, pass it through (do not wrap again).
|
|
13
|
+
*/
|
|
14
|
+
export declare function wrapWriteWithFsCas<T>(args: unknown, write: () => Promise<T> | T): Promise<T | ExecuteIfUnchangedOutcome<unknown>>;
|
|
15
|
+
//# sourceMappingURL=fs-default-wire.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-default-wire.d.ts","sourceRoot":"","sources":["../../../src/cas-adapters/fs-default-wire.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAGzE,6FAA6F;AAC7F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAQhE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAQtE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAC1B,OAAO,CAAC,CAAC,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC,CAmBjD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default-wire helper for the FS CAS adapter.
|
|
3
|
+
*
|
|
4
|
+
* Only when the target AND the full-file body are unambiguously inferable
|
|
5
|
+
* (`args.path` + `args.contents` / `args.content`, Write-style). Edit fragments
|
|
6
|
+
* (`old_string`/`new_string`) are NOT a full-file write — leave those opt-in.
|
|
7
|
+
* API / DB / registry adapters stay opt-in.
|
|
8
|
+
*
|
|
9
|
+
* This layer performs writeFileIfUnchanged (the FS adapter), not a token
|
|
10
|
+
* pre-check around an unconditional host write — that would be a silent
|
|
11
|
+
* `committed` claim.
|
|
12
|
+
*/
|
|
13
|
+
'use strict';
|
|
14
|
+
import { isExecuteIfUnchangedOutcome } from '../cas-attestation.js';
|
|
15
|
+
import { createFsVersionToken, writeFileIfUnchanged } from './fs.js';
|
|
16
|
+
/** Unambiguous fs target: a non-empty `path` string on tool arguments (Write convention). */
|
|
17
|
+
export function inferFsPathFromArgs(args) {
|
|
18
|
+
if (!args || typeof args !== 'object')
|
|
19
|
+
return null;
|
|
20
|
+
const path = args.path;
|
|
21
|
+
if (typeof path !== 'string')
|
|
22
|
+
return null;
|
|
23
|
+
const trimmed = path.trim();
|
|
24
|
+
if (!trimmed)
|
|
25
|
+
return null;
|
|
26
|
+
if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(trimmed))
|
|
27
|
+
return null;
|
|
28
|
+
return trimmed;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Full-file body for a Write-style tool. `contents` wins; `content` only when this
|
|
32
|
+
* is not an Edit (no old_string/new_string). Fragments are not a whole-file CAS.
|
|
33
|
+
*/
|
|
34
|
+
export function inferFullFileWriteContent(args) {
|
|
35
|
+
if (!args || typeof args !== 'object')
|
|
36
|
+
return null;
|
|
37
|
+
const a = args;
|
|
38
|
+
if (typeof a.contents === 'string')
|
|
39
|
+
return a.contents;
|
|
40
|
+
if (typeof a.content === 'string' && a.old_string == null && a.new_string == null) {
|
|
41
|
+
return a.content;
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Wire the FS adapter when path + full-file contents are both present.
|
|
47
|
+
* Otherwise run the host write unchanged. If the host already returned an
|
|
48
|
+
* ExecuteIfUnchangedOutcome, pass it through (do not wrap again).
|
|
49
|
+
*/
|
|
50
|
+
export async function wrapWriteWithFsCas(args, write) {
|
|
51
|
+
const filePath = inferFsPathFromArgs(args);
|
|
52
|
+
const content = inferFullFileWriteContent(args);
|
|
53
|
+
if (filePath && content != null) {
|
|
54
|
+
let expected;
|
|
55
|
+
try {
|
|
56
|
+
expected = await createFsVersionToken(filePath);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return write();
|
|
60
|
+
}
|
|
61
|
+
return writeFileIfUnchanged({
|
|
62
|
+
path: filePath,
|
|
63
|
+
expected_token: expected,
|
|
64
|
+
content,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
const raw = await write();
|
|
68
|
+
if (isExecuteIfUnchangedOutcome(raw))
|
|
69
|
+
return raw;
|
|
70
|
+
return raw;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=fs-default-wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-default-wire.js","sourceRoot":"","sources":["../../../src/cas-adapters/fs-default-wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,YAAY,CAAC;AAEb,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAErE,6FAA6F;AAC7F,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACnD,MAAM,IAAI,GAAI,IAA2B,CAAC,IAAI,CAAC;IAC/C,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,IAAI,+BAA+B,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAa;IACrD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACnD,MAAM,CAAC,GAAG,IAA+B,CAAC;IAC1C,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,QAAQ,CAAC;IACtD,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,IAAI,IAAI,IAAI,CAAC,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;QAClF,OAAO,CAAC,CAAC,OAAO,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAa,EACb,KAA2B;IAE3B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,QAAQ,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QAChC,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,EAAE,CAAC;QACjB,CAAC;QACD,OAAO,oBAAoB,CAAC;YAC1B,IAAI,EAAE,QAAQ;YACd,cAAc,EAAE,QAAQ;YACxB,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,KAAK,EAAE,CAAC;IAC1B,IAAI,2BAA2B,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACjD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export type CoverageObservedClass = 'UNKNOWN_OUTSIDE_SCOPE' | 'INCOMPLETE_OBSERVED' | 'COMPLETE_OBSERVED';
|
|
2
|
+
export type CoverageDispatch = {
|
|
3
|
+
name: string;
|
|
4
|
+
/** Host timestamp if they have one. Accepted and discarded — the snapshot is counts, not a trail. */
|
|
5
|
+
at?: string;
|
|
6
|
+
};
|
|
7
|
+
type CoverageObservedBase = {
|
|
8
|
+
governed_calls: number;
|
|
9
|
+
tools: readonly string[];
|
|
10
|
+
};
|
|
11
|
+
export type CoverageObservedUnknown = CoverageObservedBase & {
|
|
12
|
+
class: 'UNKNOWN_OUTSIDE_SCOPE';
|
|
13
|
+
};
|
|
14
|
+
export type CoverageObservedIncomplete = CoverageObservedBase & {
|
|
15
|
+
class: 'INCOMPLETE_OBSERVED';
|
|
16
|
+
total_calls: number;
|
|
17
|
+
ungoverned_calls: number;
|
|
18
|
+
ungoverned_tools: readonly string[];
|
|
19
|
+
};
|
|
20
|
+
export type CoverageObservedComplete = CoverageObservedBase & {
|
|
21
|
+
class: 'COMPLETE_OBSERVED';
|
|
22
|
+
total_calls: number;
|
|
23
|
+
ungoverned_calls: number;
|
|
24
|
+
ungoverned_tools: readonly string[];
|
|
25
|
+
};
|
|
26
|
+
export type CoverageObserved = CoverageObservedUnknown | CoverageObservedIncomplete | CoverageObservedComplete;
|
|
27
|
+
export type CoverageObservedHandle = {
|
|
28
|
+
snapshot: () => CoverageObserved;
|
|
29
|
+
reportToolDispatch: (ev: CoverageDispatch) => void;
|
|
30
|
+
reportToolDispatchBatch: (evs: readonly CoverageDispatch[]) => void;
|
|
31
|
+
};
|
|
32
|
+
export type CoverageObserver = {
|
|
33
|
+
setTableNames: (names: readonly string[]) => void;
|
|
34
|
+
recordGoverned: (name: string) => void;
|
|
35
|
+
snapshot: () => CoverageObserved;
|
|
36
|
+
handle: CoverageObservedHandle;
|
|
37
|
+
};
|
|
38
|
+
export declare function createCoverageObserver(): CoverageObserver;
|
|
39
|
+
export declare function freezeCoverageObserved(obs: CoverageObserved): CoverageObserved;
|
|
40
|
+
/**
|
|
41
|
+
* Proof / T3 human line. Half B absent vs named ungoverned vs complete host report.
|
|
42
|
+
*/
|
|
43
|
+
export declare function formatCoverageObservedLine(obs: CoverageObserved): string;
|
|
44
|
+
export {};
|
|
45
|
+
//# sourceMappingURL=coverage-observed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-observed.d.ts","sourceRoot":"","sources":["../../src/coverage-observed.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,qBAAqB,GAC7B,uBAAuB,GACvB,qBAAqB,GACrB,mBAAmB,CAAC;AAExB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,qGAAqG;IACrG,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,oBAAoB,GAAG;IAC3D,KAAK,EAAE,uBAAuB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,oBAAoB,GAAG;IAC9D,KAAK,EAAE,qBAAqB,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,oBAAoB,GAAG;IAC5D,KAAK,EAAE,mBAAmB,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GACxB,uBAAuB,GACvB,0BAA0B,GAC1B,wBAAwB,CAAC;AAE7B,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,MAAM,gBAAgB,CAAC;IACjC,kBAAkB,EAAE,CAAC,EAAE,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACnD,uBAAuB,EAAE,CAAC,GAAG,EAAE,SAAS,gBAAgB,EAAE,KAAK,IAAI,CAAC;CACrE,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,aAAa,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,CAAC;IAClD,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,MAAM,gBAAgB,CAAC;IACjC,MAAM,EAAE,sBAAsB,CAAC;CAChC,CAAC;AAaF,wBAAgB,sBAAsB,IAAI,gBAAgB,CAuEzD;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,GAAG,gBAAgB,CAiB9E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAcxE"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage attestation — what the guard MEASURED about tool traffic, not what it
|
|
3
|
+
* assumed at registration time.
|
|
4
|
+
*
|
|
5
|
+
* Half A (always): counts execute() through the returned table (governed_calls / tools).
|
|
6
|
+
* Half B (optional host report): total_calls / ungoverned_* — OMITTED when the host
|
|
7
|
+
* never reported, never zero. Absence ≠ zero.
|
|
8
|
+
*
|
|
9
|
+
* Observation only. Not a verdict input. Not a preimage field.
|
|
10
|
+
*
|
|
11
|
+
* Run scope: one withCodeRifts instance (same lifetime as receipt_thread). There is
|
|
12
|
+
* no process-wide session; this is the smallest honest run.
|
|
13
|
+
*/
|
|
14
|
+
'use strict';
|
|
15
|
+
function uniqueInOrder(names) {
|
|
16
|
+
const seen = new Set();
|
|
17
|
+
const out = [];
|
|
18
|
+
for (const n of names) {
|
|
19
|
+
if (seen.has(n))
|
|
20
|
+
continue;
|
|
21
|
+
seen.add(n);
|
|
22
|
+
out.push(n);
|
|
23
|
+
}
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
export function createCoverageObserver() {
|
|
27
|
+
const table = new Set();
|
|
28
|
+
const governed = [];
|
|
29
|
+
const host = [];
|
|
30
|
+
let hostReported = false;
|
|
31
|
+
function snapshot() {
|
|
32
|
+
const tools = uniqueInOrder(governed);
|
|
33
|
+
if (!hostReported) {
|
|
34
|
+
return freezeCoverageObserved({
|
|
35
|
+
class: 'UNKNOWN_OUTSIDE_SCOPE',
|
|
36
|
+
governed_calls: governed.length,
|
|
37
|
+
tools,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
const ungovernedList = host.filter((n) => !table.has(n));
|
|
41
|
+
if (ungovernedList.length > 0) {
|
|
42
|
+
return freezeCoverageObserved({
|
|
43
|
+
class: 'INCOMPLETE_OBSERVED',
|
|
44
|
+
governed_calls: governed.length,
|
|
45
|
+
tools,
|
|
46
|
+
total_calls: host.length,
|
|
47
|
+
ungoverned_calls: ungovernedList.length,
|
|
48
|
+
ungoverned_tools: uniqueInOrder(ungovernedList),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return freezeCoverageObserved({
|
|
52
|
+
class: 'COMPLETE_OBSERVED',
|
|
53
|
+
governed_calls: governed.length,
|
|
54
|
+
tools,
|
|
55
|
+
total_calls: host.length,
|
|
56
|
+
ungoverned_calls: 0,
|
|
57
|
+
ungoverned_tools: [],
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function reportOne(ev) {
|
|
61
|
+
if (!ev || typeof ev.name !== 'string')
|
|
62
|
+
return false;
|
|
63
|
+
const name = ev.name.trim();
|
|
64
|
+
if (!name)
|
|
65
|
+
return false;
|
|
66
|
+
host.push(name);
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
const handle = {
|
|
70
|
+
snapshot,
|
|
71
|
+
reportToolDispatch(ev) {
|
|
72
|
+
if (reportOne(ev))
|
|
73
|
+
hostReported = true;
|
|
74
|
+
},
|
|
75
|
+
reportToolDispatchBatch(evs) {
|
|
76
|
+
// An actual array (including []) is a supplied report. A non-array is not.
|
|
77
|
+
if (!Array.isArray(evs))
|
|
78
|
+
return;
|
|
79
|
+
hostReported = true;
|
|
80
|
+
for (const ev of evs)
|
|
81
|
+
reportOne(ev);
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
return {
|
|
85
|
+
setTableNames(names) {
|
|
86
|
+
table.clear();
|
|
87
|
+
if (!Array.isArray(names) && !names)
|
|
88
|
+
return;
|
|
89
|
+
for (const n of names) {
|
|
90
|
+
if (typeof n === 'string' && n)
|
|
91
|
+
table.add(n);
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
recordGoverned(name) {
|
|
95
|
+
if (typeof name === 'string' && name)
|
|
96
|
+
governed.push(name);
|
|
97
|
+
},
|
|
98
|
+
snapshot,
|
|
99
|
+
handle,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
export function freezeCoverageObserved(obs) {
|
|
103
|
+
const tools = Object.freeze(obs.tools.slice());
|
|
104
|
+
if (obs.class === 'UNKNOWN_OUTSIDE_SCOPE') {
|
|
105
|
+
return Object.freeze({
|
|
106
|
+
class: 'UNKNOWN_OUTSIDE_SCOPE',
|
|
107
|
+
governed_calls: obs.governed_calls,
|
|
108
|
+
tools,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return Object.freeze({
|
|
112
|
+
class: obs.class,
|
|
113
|
+
governed_calls: obs.governed_calls,
|
|
114
|
+
tools,
|
|
115
|
+
total_calls: obs.total_calls,
|
|
116
|
+
ungoverned_calls: obs.ungoverned_calls,
|
|
117
|
+
ungoverned_tools: Object.freeze((obs.ungoverned_tools || []).slice()),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Proof / T3 human line. Half B absent vs named ungoverned vs complete host report.
|
|
122
|
+
*/
|
|
123
|
+
export function formatCoverageObservedLine(obs) {
|
|
124
|
+
const n = obs.governed_calls;
|
|
125
|
+
const callWord = n === 1 ? 'call' : 'calls';
|
|
126
|
+
if (obs.class === 'UNKNOWN_OUTSIDE_SCOPE') {
|
|
127
|
+
return `governed ${n} ${callWord}; traffic outside the guarded table not observable from here`;
|
|
128
|
+
}
|
|
129
|
+
if (obs.class === 'INCOMPLETE_OBSERVED') {
|
|
130
|
+
const names = obs.ungoverned_tools.join(', ');
|
|
131
|
+
return (`governed ${n}/${obs.total_calls} dispatched calls; `
|
|
132
|
+
+ `${obs.ungoverned_calls} outside the guarded table: ${names}`);
|
|
133
|
+
}
|
|
134
|
+
return `governed ${n}/${obs.total_calls} dispatched calls; 0 outside the guarded table`;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=coverage-observed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-observed.js","sourceRoot":"","sources":["../../src/coverage-observed.ts"],"names":[],"mappings":"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"}
|
|
@@ -145,6 +145,11 @@ export type GuardExecutionProof = {
|
|
|
145
145
|
fingerprint: string | null;
|
|
146
146
|
execution_action: string | null;
|
|
147
147
|
}>;
|
|
148
|
+
/**
|
|
149
|
+
* Observed tool-traffic coverage (withCodeRifts run). Observation only; omitted
|
|
150
|
+
* when no observer is wired. Not a preimage field.
|
|
151
|
+
*/
|
|
152
|
+
coverage_observed?: import('./coverage-observed.js').CoverageObserved;
|
|
148
153
|
};
|
|
149
154
|
export type ProofBuildInput = {
|
|
150
155
|
preflighted: boolean;
|
|
@@ -179,6 +184,8 @@ export type ProofBuildInput = {
|
|
|
179
184
|
fingerprint: string | null;
|
|
180
185
|
execution_action: string | null;
|
|
181
186
|
}>;
|
|
187
|
+
/** Coverage snapshot (observation). Omit when no observer. */
|
|
188
|
+
coverageObserved?: import('./coverage-observed.js').CoverageObserved;
|
|
182
189
|
};
|
|
183
190
|
/**
|
|
184
191
|
* Runtime twin of the type-level enforced⟺receiptVerified invariant.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-proof.d.ts","sourceRoot":"","sources":["../../src/execution-proof.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"execution-proof.d.ts","sourceRoot":"","sources":["../../src/execution-proof.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* package, or that an absent field means compliance. Those limits are explicit on every block.
|
|
19
19
|
*/
|
|
20
20
|
import { createHash } from 'node:crypto';
|
|
21
|
+
import { freezeCoverageObserved } from './coverage-observed.js';
|
|
21
22
|
/** Machine-readable schema id for this block. */
|
|
22
23
|
export const EXECUTION_PROOF_SPEC = 'guard-execution-proof.v1';
|
|
23
24
|
const LIMITS = Object.freeze({
|
|
@@ -175,6 +176,9 @@ export function buildExecutionProof(input) {
|
|
|
175
176
|
if (Array.isArray(input.recheckTrail) && input.recheckTrail.length > 0) {
|
|
176
177
|
proof.recheck_trail = Object.freeze(input.recheckTrail.map((e) => Object.freeze({ ...e })));
|
|
177
178
|
}
|
|
179
|
+
if (input.coverageObserved && typeof input.coverageObserved === 'object') {
|
|
180
|
+
proof.coverage_observed = freezeCoverageObserved(input.coverageObserved);
|
|
181
|
+
}
|
|
178
182
|
return freezeProof(proof);
|
|
179
183
|
}
|
|
180
184
|
function freezeMonitoringDelivery(d) {
|