@coderifts/agent-guard 8.4.0 → 9.0.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 (96) hide show
  1. package/README.md +35 -22
  2. package/dist/cjs/auto-derive.d.ts +74 -0
  3. package/dist/cjs/auto-derive.d.ts.map +1 -0
  4. package/dist/cjs/auto-derive.js +272 -0
  5. package/dist/cjs/auto-derive.js.map +1 -0
  6. package/dist/cjs/auto-recheck.d.ts +76 -0
  7. package/dist/cjs/auto-recheck.d.ts.map +1 -0
  8. package/dist/cjs/auto-recheck.js +240 -0
  9. package/dist/cjs/auto-recheck.js.map +1 -0
  10. package/dist/cjs/cas-attestation.d.ts +35 -2
  11. package/dist/cjs/cas-attestation.d.ts.map +1 -1
  12. package/dist/cjs/cas-attestation.js +105 -2
  13. package/dist/cjs/cas-attestation.js.map +1 -1
  14. package/dist/cjs/deploy-bind.d.ts +9 -7
  15. package/dist/cjs/deploy-bind.d.ts.map +1 -1
  16. package/dist/cjs/deploy-bind.js +9 -3
  17. package/dist/cjs/deploy-bind.js.map +1 -1
  18. package/dist/cjs/deploy-gate.d.ts +54 -6
  19. package/dist/cjs/deploy-gate.d.ts.map +1 -1
  20. package/dist/cjs/deploy-gate.js +73 -12
  21. package/dist/cjs/deploy-gate.js.map +1 -1
  22. package/dist/cjs/deploy-receipt-token.d.ts +59 -0
  23. package/dist/cjs/deploy-receipt-token.d.ts.map +1 -0
  24. package/dist/cjs/deploy-receipt-token.js +245 -0
  25. package/dist/cjs/deploy-receipt-token.js.map +1 -0
  26. package/dist/cjs/execution-proof.d.ts +25 -0
  27. package/dist/cjs/execution-proof.d.ts.map +1 -1
  28. package/dist/cjs/execution-proof.js +6 -0
  29. package/dist/cjs/execution-proof.js.map +1 -1
  30. package/dist/cjs/final-answer-proof.d.ts.map +1 -1
  31. package/dist/cjs/final-answer-proof.js +20 -1
  32. package/dist/cjs/final-answer-proof.js.map +1 -1
  33. package/dist/cjs/guard.d.ts.map +1 -1
  34. package/dist/cjs/guard.js +10 -1
  35. package/dist/cjs/guard.js.map +1 -1
  36. package/dist/cjs/index.d.ts +10 -4
  37. package/dist/cjs/index.d.ts.map +1 -1
  38. package/dist/cjs/index.js +23 -2
  39. package/dist/cjs/index.js.map +1 -1
  40. package/dist/cjs/tool-registry.d.ts.map +1 -1
  41. package/dist/cjs/tool-registry.js +36 -6
  42. package/dist/cjs/tool-registry.js.map +1 -1
  43. package/dist/cjs/types.d.ts +45 -1
  44. package/dist/cjs/types.d.ts.map +1 -1
  45. package/dist/cjs/with-coderifts.d.ts +16 -0
  46. package/dist/cjs/with-coderifts.d.ts.map +1 -1
  47. package/dist/cjs/with-coderifts.js +9 -0
  48. package/dist/cjs/with-coderifts.js.map +1 -1
  49. package/dist/esm/auto-derive.d.ts +74 -0
  50. package/dist/esm/auto-derive.d.ts.map +1 -0
  51. package/dist/esm/auto-derive.js +265 -0
  52. package/dist/esm/auto-derive.js.map +1 -0
  53. package/dist/esm/auto-recheck.d.ts +76 -0
  54. package/dist/esm/auto-recheck.d.ts.map +1 -0
  55. package/dist/esm/auto-recheck.js +234 -0
  56. package/dist/esm/auto-recheck.js.map +1 -0
  57. package/dist/esm/cas-attestation.d.ts +35 -2
  58. package/dist/esm/cas-attestation.d.ts.map +1 -1
  59. package/dist/esm/cas-attestation.js +103 -2
  60. package/dist/esm/cas-attestation.js.map +1 -1
  61. package/dist/esm/deploy-bind.d.ts +9 -7
  62. package/dist/esm/deploy-bind.d.ts.map +1 -1
  63. package/dist/esm/deploy-bind.js +9 -3
  64. package/dist/esm/deploy-bind.js.map +1 -1
  65. package/dist/esm/deploy-gate.d.ts +54 -6
  66. package/dist/esm/deploy-gate.d.ts.map +1 -1
  67. package/dist/esm/deploy-gate.js +70 -12
  68. package/dist/esm/deploy-gate.js.map +1 -1
  69. package/dist/esm/deploy-receipt-token.d.ts +59 -0
  70. package/dist/esm/deploy-receipt-token.d.ts.map +1 -0
  71. package/dist/esm/deploy-receipt-token.js +241 -0
  72. package/dist/esm/deploy-receipt-token.js.map +1 -0
  73. package/dist/esm/execution-proof.d.ts +25 -0
  74. package/dist/esm/execution-proof.d.ts.map +1 -1
  75. package/dist/esm/execution-proof.js +6 -0
  76. package/dist/esm/execution-proof.js.map +1 -1
  77. package/dist/esm/final-answer-proof.d.ts.map +1 -1
  78. package/dist/esm/final-answer-proof.js +20 -1
  79. package/dist/esm/final-answer-proof.js.map +1 -1
  80. package/dist/esm/guard.d.ts.map +1 -1
  81. package/dist/esm/guard.js +11 -2
  82. package/dist/esm/guard.js.map +1 -1
  83. package/dist/esm/index.d.ts +10 -4
  84. package/dist/esm/index.d.ts.map +1 -1
  85. package/dist/esm/index.js +7 -2
  86. package/dist/esm/index.js.map +1 -1
  87. package/dist/esm/tool-registry.d.ts.map +1 -1
  88. package/dist/esm/tool-registry.js +36 -6
  89. package/dist/esm/tool-registry.js.map +1 -1
  90. package/dist/esm/types.d.ts +45 -1
  91. package/dist/esm/types.d.ts.map +1 -1
  92. package/dist/esm/with-coderifts.d.ts +16 -0
  93. package/dist/esm/with-coderifts.d.ts.map +1 -1
  94. package/dist/esm/with-coderifts.js +9 -0
  95. package/dist/esm/with-coderifts.js.map +1 -1
  96. package/package.json +2 -2
@@ -0,0 +1,265 @@
1
+ /**
2
+ * S1 auto-derive — wrap-layer before/after pair from the tool call + current-state readers.
3
+ *
4
+ * Default OFF. Frozen guardToolCall is unchanged. Host args.artifacts always win.
5
+ * BEFORE comes from a reader of the SAME target (fs path / api / db / registry).
6
+ * AFTER is the call's intended write content. Missing target → before:null
7
+ * (derivation_note before_unavailable); empty file → before:"".
8
+ *
9
+ * Reader throw/timeout → today's fragment path (binder lift); never block on derivation.
10
+ * Observation-only: derivation is not a fingerprint preimage field.
11
+ */
12
+ import { promises as fsp } from 'node:fs';
13
+ import { classifyByName } from './artifact-resolver.js';
14
+ export const AUTO_DERIVE_SOURCE = 'guard_auto_derived';
15
+ export const AUTO_DERIVE_READ_TIMEOUT_MS = 2000;
16
+ function iso() {
17
+ return new Date().toISOString();
18
+ }
19
+ function emit(config, e) {
20
+ if (config.onEvent) {
21
+ try {
22
+ config.onEvent(e);
23
+ }
24
+ catch { /* onEvent never throws out */ }
25
+ }
26
+ }
27
+ /** Default fs reader: utf8 contents, ENOENT → null (absent ≠ empty). Other errors throw. */
28
+ export async function defaultFsReader(filePath) {
29
+ try {
30
+ return await fsp.readFile(filePath, 'utf8');
31
+ }
32
+ catch (err) {
33
+ const code = err && typeof err === 'object' && 'code' in err
34
+ ? String(err.code)
35
+ : '';
36
+ if (code === 'ENOENT')
37
+ return null;
38
+ throw err;
39
+ }
40
+ }
41
+ function looksLikeResolveConfig(o) {
42
+ return 'ssotPrefer' in o
43
+ || 'generatedGlobs' in o
44
+ || 'pathTypeHints' in o
45
+ || 'openApiAssembly' in o
46
+ || 'maxRefDepth' in o;
47
+ }
48
+ function looksLikeReaders(o) {
49
+ const r = o;
50
+ return typeof r.fs === 'function'
51
+ || typeof r.api === 'function'
52
+ || typeof r.db === 'function'
53
+ || typeof r.registry === 'function';
54
+ }
55
+ export function normalizeAutoDerive(raw) {
56
+ if (raw === true)
57
+ return { readers: { fs: defaultFsReader } };
58
+ if (!raw || raw === false || typeof raw !== 'object')
59
+ return null;
60
+ const o = raw;
61
+ const cfg = {};
62
+ if (o.resolveConfig && typeof o.resolveConfig === 'object')
63
+ cfg.resolveConfig = o.resolveConfig;
64
+ if (o.readers && typeof o.readers === 'object') {
65
+ if (looksLikeReaders(o.readers)) {
66
+ cfg.readers = { ...o.readers };
67
+ }
68
+ else if (looksLikeResolveConfig(o.readers)) {
69
+ cfg.resolveConfig = o.readers;
70
+ }
71
+ }
72
+ if (!cfg.readers)
73
+ cfg.readers = {};
74
+ if (typeof cfg.readers.fs !== 'function')
75
+ cfg.readers.fs = defaultFsReader;
76
+ return cfg;
77
+ }
78
+ function rawRecord(args) {
79
+ if (!args || typeof args !== 'object' || Array.isArray(args))
80
+ return null;
81
+ return args;
82
+ }
83
+ function hostSuppliedArtifacts(args) {
84
+ const a = rawRecord(args);
85
+ return !!(a && Array.isArray(a.artifacts));
86
+ }
87
+ function targetFromArgs(a) {
88
+ if (typeof a.path === 'string' && a.path.length > 0)
89
+ return { kind: 'fs', key: a.path };
90
+ if (typeof a.url === 'string' && a.url.length > 0)
91
+ return { kind: 'api', key: a.url };
92
+ if (typeof a.endpoint === 'string' && a.endpoint.length > 0)
93
+ return { kind: 'api', key: a.endpoint };
94
+ if (typeof a.table === 'string' && a.table.length > 0) {
95
+ const id = a.id != null ? String(a.id) : '';
96
+ return { kind: 'db', key: id ? `${a.table}/${id}` : a.table };
97
+ }
98
+ if (typeof a.key === 'string' && a.key.length > 0)
99
+ return { kind: 'registry', key: a.key };
100
+ return null;
101
+ }
102
+ function intendedAfter(a, before) {
103
+ for (const k of ['contents', 'content', 'new_content', 'new_contents']) {
104
+ if (typeof a[k] === 'string')
105
+ return a[k];
106
+ }
107
+ const oldS = typeof a.old_string === 'string' ? a.old_string : null;
108
+ const newS = typeof a.new_string === 'string' ? a.new_string : null;
109
+ if (newS == null)
110
+ return null;
111
+ if (typeof before === 'string' && oldS && oldS.length > 0 && before.includes(oldS)) {
112
+ return before.replace(oldS, newS);
113
+ }
114
+ if (newS.length > 0)
115
+ return newS;
116
+ return null;
117
+ }
118
+ function typeForTarget(target, a, resolveConfig) {
119
+ if (typeof a.type === 'string' && a.type) {
120
+ const t = a.type;
121
+ if (t === 'openapi' || t === 'graphql' || t === 'grpc' || t === 'asyncapi' || t === 'mcp_manifest') {
122
+ return t;
123
+ }
124
+ }
125
+ if (target.kind === 'fs') {
126
+ const hinted = resolveConfig && resolveConfig.pathTypeHints
127
+ ? resolveConfig.pathTypeHints[target.key]
128
+ : undefined;
129
+ if (hinted)
130
+ return hinted;
131
+ return classifyByName(target.key);
132
+ }
133
+ return null;
134
+ }
135
+ async function withTimeout(p, ms) {
136
+ let timer;
137
+ try {
138
+ return await Promise.race([
139
+ p,
140
+ new Promise((_, reject) => {
141
+ timer = setTimeout(() => {
142
+ const e = new Error(`autoDerive reader timed out after ${ms}ms`);
143
+ e.name = 'TimeoutError';
144
+ reject(e);
145
+ }, Math.max(1, ms));
146
+ }),
147
+ ]);
148
+ }
149
+ finally {
150
+ if (timer)
151
+ clearTimeout(timer);
152
+ }
153
+ }
154
+ async function readCurrent(readers, target) {
155
+ const fn = readers[target.kind];
156
+ if (typeof fn !== 'function') {
157
+ const err = new Error(`autoDerive: no ${target.kind} reader`);
158
+ err.code = 'NO_READER';
159
+ throw err;
160
+ }
161
+ return withTimeout(Promise.resolve(fn(target.key)), AUTO_DERIVE_READ_TIMEOUT_MS);
162
+ }
163
+ /**
164
+ * Derive a before/after pair onto the call descriptor when the host did not supply artifacts.
165
+ * Never throws out — reader failures return the bound call with fragment_only + failed.cause.
166
+ */
167
+ export async function runAutoDerive(args) {
168
+ const bound = args.bound;
169
+ if (hostSuppliedArtifacts(args.rawArgs)) {
170
+ return {
171
+ call: bound,
172
+ derivation: { mode: 'host_supplied', targets: [] },
173
+ };
174
+ }
175
+ const a = rawRecord(args.rawArgs) || rawRecord(bound.arguments);
176
+ if (!a) {
177
+ return { call: bound, derivation: { mode: 'fragment_only', targets: [] } };
178
+ }
179
+ const target = targetFromArgs(a);
180
+ if (!target) {
181
+ return { call: bound, derivation: { mode: 'fragment_only', targets: [] } };
182
+ }
183
+ const type = typeForTarget(target, a, args.cfg.resolveConfig);
184
+ if (!type) {
185
+ return {
186
+ call: bound,
187
+ derivation: {
188
+ mode: 'fragment_only',
189
+ targets: [target],
190
+ notes: [{ target: target.key, note: 'not_contract_path' }],
191
+ },
192
+ };
193
+ }
194
+ const readers = args.cfg.readers || { fs: defaultFsReader };
195
+ let before;
196
+ try {
197
+ before = await readCurrent(readers, target);
198
+ }
199
+ catch (err) {
200
+ const name = err && typeof err === 'object' && 'name' in err
201
+ ? String(err.name)
202
+ : '';
203
+ const cause = name === 'TimeoutError' ? 'reader_timeout' : 'reader_threw';
204
+ emit(args.config, { type: 'derive_failed', at: iso(), cause });
205
+ return {
206
+ call: bound,
207
+ derivation: {
208
+ mode: 'fragment_only',
209
+ targets: [target],
210
+ notes: [{
211
+ target: target.key,
212
+ note: cause === 'reader_timeout' ? 'reader_timeout' : 'reader_threw',
213
+ }],
214
+ },
215
+ failed: { cause },
216
+ };
217
+ }
218
+ const after = intendedAfter(a, before);
219
+ if (after == null) {
220
+ return {
221
+ call: bound,
222
+ derivation: { mode: 'fragment_only', targets: [target] },
223
+ };
224
+ }
225
+ const notes = [];
226
+ if (before === null) {
227
+ notes.push({ target: target.key, note: 'before_unavailable' });
228
+ // Absence must not erase a binder-lifted fragment pair (old_string/new_string).
229
+ if (Array.isArray(bound.artifacts) && bound.artifacts.length > 0) {
230
+ return {
231
+ call: bound,
232
+ derivation: {
233
+ mode: 'fragment_only',
234
+ targets: [target],
235
+ notes,
236
+ },
237
+ };
238
+ }
239
+ }
240
+ const derived = {
241
+ id: `${type}:${target.key}`,
242
+ type,
243
+ before,
244
+ after,
245
+ source: AUTO_DERIVE_SOURCE,
246
+ };
247
+ const call = {
248
+ ...bound,
249
+ artifacts: [derived],
250
+ };
251
+ return {
252
+ call,
253
+ derivation: {
254
+ mode: 'auto_derived',
255
+ targets: [target],
256
+ ...(notes.length ? { notes } : {}),
257
+ },
258
+ };
259
+ }
260
+ export function attachDerivation(outcome, derivation) {
261
+ if (!derivation)
262
+ return outcome;
263
+ return { ...outcome, derivation };
264
+ }
265
+ //# sourceMappingURL=auto-derive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-derive.js","sourceRoot":"","sources":["../../src/auto-derive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * S6 auto-recheck loop — host-side orchestration AFTER a BLOCK with a remediation_transaction.
3
+ *
4
+ * Default OFF. The frozen guardToolCall is unchanged; this wraps it. The guard never writes
5
+ * artifacts: the host's applyFix applies the fix (honesty line). After applyFix true, artifacts
6
+ * are re-resolved FRESH (resolve() from artifact-resolver when resolveInput is supplied, else
7
+ * the host-updated call / rebind).
8
+ *
9
+ * recheck_scope is an OUTPUT on the BLOCK envelope (app remediation-transaction.js). The
10
+ * preflight request does not accept a scope hint (measured SDK / authorizeChangeSet) — so
11
+ * each attempt is a FULL re-preflight. Noted, not faked.
12
+ *
13
+ * Nothing here enters a fingerprint preimage (host orchestration only).
14
+ */
15
+ import type { GuardConfig, GuardOutcome, ToolCallDescriptor, ExecuteFactory, GuardToolCallContext } from './types.js';
16
+ import type { RemediationTransactionView } from './remediation-loop-attestation.js';
17
+ import type { ResolveInput, ResolveConfig } from './artifact-resolver.js';
18
+ /** Hard cap on RE-preflights per original call. */
19
+ export declare const AUTO_RECHECK_MAX_CAP = 3;
20
+ export type RecheckTrailEntry = {
21
+ attempt: number;
22
+ decision_id: string | null;
23
+ fingerprint: string | null;
24
+ execution_action: string | null;
25
+ };
26
+ export type RecheckStopReason = 'no_progress' | 'apply_fix_declined' | 'apply_fix_threw' | 'exhausted';
27
+ export type RecheckObservation = {
28
+ recheck_trail?: ReadonlyArray<RecheckTrailEntry>;
29
+ /** 849 metric feed. Present only when the loop ran. value true iff a recheck landed allow-class. */
30
+ fixed_after_block?: {
31
+ value: true | null;
32
+ attempt_count: number | null;
33
+ };
34
+ recheck_stop_reason?: RecheckStopReason;
35
+ };
36
+ export type AutoRecheckApplyFixContext = {
37
+ call: ToolCallDescriptor;
38
+ attempt: number;
39
+ outcome: GuardOutcome<unknown>;
40
+ };
41
+ export type AutoRecheckConfig = {
42
+ /**
43
+ * Bound on RE-preflights per original call. Allowed 1–3; values above 3 clamp to 3.
44
+ * Values below 1 disable the loop.
45
+ */
46
+ maxAttempts: number;
47
+ /**
48
+ * HOST applies the fix. The guard never writes artifacts.
49
+ * false / throw → loop ends, original BLOCK stands.
50
+ */
51
+ applyFix: (remediation: RemediationTransactionView, context: AutoRecheckApplyFixContext) => boolean | Promise<boolean>;
52
+ /**
53
+ * Optional. After applyFix true, produce a fresh git snapshot for resolve() (CAP-202).
54
+ * When absent, the loop re-runs `rebind` / uses artifacts the host attached on context.call.
55
+ */
56
+ resolveInput?: () => ResolveInput | Promise<ResolveInput>;
57
+ resolveConfig?: ResolveConfig;
58
+ };
59
+ export declare function clampMaxAttempts(n: unknown): number;
60
+ export declare function normalizeAutoRecheck(raw: unknown): AutoRecheckConfig | null;
61
+ export type AutoRecheckLoopArgs<T> = {
62
+ call: ToolCallDescriptor;
63
+ factory: ExecuteFactory<T>;
64
+ config: GuardConfig;
65
+ callContext?: GuardToolCallContext;
66
+ rebind: () => ToolCallDescriptor | Promise<ToolCallDescriptor>;
67
+ /** Re-collect freshness VALUES from the FRESH call (full re-preflight). */
68
+ refreshContext?: (call: ToolCallDescriptor) => Promise<GuardToolCallContext | undefined>;
69
+ };
70
+ /**
71
+ * First call is always a normal guardToolCall. The loop runs only when autoRecheck is
72
+ * normalized (applyFix present, maxAttempts in 1–3) AND the outcome is BLOCK with a
73
+ * remediation_transaction.
74
+ */
75
+ export declare function runAutoRecheckLoop<T>(args: AutoRecheckLoopArgs<T>): Promise<GuardOutcome<T>>;
76
+ //# sourceMappingURL=auto-recheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-recheck.d.ts","sourceRoot":"","sources":["../../src/auto-recheck.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EAEZ,kBAAkB,EAClB,cAAc,EAEd,oBAAoB,EAGrB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAEpF,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE1E,mDAAmD;AACnD,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GACzB,aAAa,GACb,oBAAoB,GACpB,iBAAiB,GACjB,WAAW,CAAC;AAEhB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACjD,oGAAoG;IACpG,iBAAiB,CAAC,EAAE;QAAE,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;QAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACzE,mBAAmB,CAAC,EAAE,iBAAiB,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,kBAAkB,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,QAAQ,EAAE,CACR,WAAW,EAAE,0BAA0B,EACvC,OAAO,EAAE,0BAA0B,KAChC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1D,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B,CAAC;AAYF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAMnD;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CAU3E;AAuHD,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI;IACnC,IAAI,EAAE,kBAAkB,CAAC;IACzB,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,MAAM,EAAE,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC/D,2EAA2E;IAC3E,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAAC;CAC1F,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CA4ElG"}
@@ -0,0 +1,234 @@
1
+ /**
2
+ * S6 auto-recheck loop — host-side orchestration AFTER a BLOCK with a remediation_transaction.
3
+ *
4
+ * Default OFF. The frozen guardToolCall is unchanged; this wraps it. The guard never writes
5
+ * artifacts: the host's applyFix applies the fix (honesty line). After applyFix true, artifacts
6
+ * are re-resolved FRESH (resolve() from artifact-resolver when resolveInput is supplied, else
7
+ * the host-updated call / rebind).
8
+ *
9
+ * recheck_scope is an OUTPUT on the BLOCK envelope (app remediation-transaction.js). The
10
+ * preflight request does not accept a scope hint (measured SDK / authorizeChangeSet) — so
11
+ * each attempt is a FULL re-preflight. Noted, not faked.
12
+ *
13
+ * Nothing here enters a fingerprint preimage (host orchestration only).
14
+ */
15
+ import { guardToolCall } from './guard.js';
16
+ import { readRemediationTransaction } from './remediation-loop-attestation.js';
17
+ import { resolve as resolveArtifacts } from './artifact-resolver.js';
18
+ /** Hard cap on RE-preflights per original call. */
19
+ export const AUTO_RECHECK_MAX_CAP = 3;
20
+ function iso() {
21
+ return new Date().toISOString();
22
+ }
23
+ function emit(config, e) {
24
+ if (config.onEvent) {
25
+ try {
26
+ config.onEvent(e);
27
+ }
28
+ catch { /* onEvent never throws out */ }
29
+ }
30
+ }
31
+ export function clampMaxAttempts(n) {
32
+ const v = typeof n === 'number' ? n : Number(n);
33
+ if (!Number.isFinite(v))
34
+ return 0;
35
+ const i = Math.floor(v);
36
+ if (i < 1)
37
+ return 0;
38
+ return i > AUTO_RECHECK_MAX_CAP ? AUTO_RECHECK_MAX_CAP : i;
39
+ }
40
+ export function normalizeAutoRecheck(raw) {
41
+ if (!raw || typeof raw !== 'object')
42
+ return null;
43
+ const o = raw;
44
+ if (typeof o.applyFix !== 'function')
45
+ return null;
46
+ const maxAttempts = clampMaxAttempts(o.maxAttempts);
47
+ if (maxAttempts < 1)
48
+ return null;
49
+ const cfg = { maxAttempts, applyFix: o.applyFix };
50
+ if (typeof o.resolveInput === 'function')
51
+ cfg.resolveInput = o.resolveInput;
52
+ if (o.resolveConfig && typeof o.resolveConfig === 'object')
53
+ cfg.resolveConfig = o.resolveConfig;
54
+ return cfg;
55
+ }
56
+ function envelopeOf(outcome) {
57
+ const v = outcome.verdict;
58
+ if (v && 'envelope' in v && v.envelope && typeof v.envelope === 'object') {
59
+ return v.envelope;
60
+ }
61
+ return null;
62
+ }
63
+ function fingerprintOf(outcome) {
64
+ const env = envelopeOf(outcome);
65
+ if (env && typeof env.fingerprint === 'string' && env.fingerprint)
66
+ return env.fingerprint;
67
+ const fp = outcome.proof && outcome.proof.binds_to && outcome.proof.binds_to.change_fp;
68
+ return typeof fp === 'string' && fp ? fp : null;
69
+ }
70
+ function decisionIdOf(outcome) {
71
+ const env = envelopeOf(outcome);
72
+ if (env && typeof env.decision_id === 'string' && env.decision_id)
73
+ return env.decision_id;
74
+ const id = outcome.proof && outcome.proof.decision_id;
75
+ return typeof id === 'string' && id ? id : null;
76
+ }
77
+ function executionActionOf(outcome) {
78
+ const v = outcome.verdict;
79
+ if (v && 'action' in v && typeof v.action === 'string')
80
+ return v.action;
81
+ return null;
82
+ }
83
+ function isAllowClass(outcome) {
84
+ const v = outcome.verdict;
85
+ if (!v || typeof v !== 'object')
86
+ return false;
87
+ // Kind only — UnavailableVerdict can carry action CONTINUE / CONTINUE_WITH_MONITORING
88
+ // on OPEN_PASSTHROUGH / LKG_SUBSTITUTION; that is not allow-class.
89
+ return v.kind === 'ALLOW' || v.kind === 'MONITOR';
90
+ }
91
+ function isBlockWithRemediation(outcome) {
92
+ const v = outcome.verdict;
93
+ if (!v || v.kind !== 'BLOCK')
94
+ return null;
95
+ return readRemediationTransaction(envelopeOf(outcome));
96
+ }
97
+ function trailEntry(outcome, attempt) {
98
+ return Object.freeze({
99
+ attempt,
100
+ decision_id: decisionIdOf(outcome),
101
+ fingerprint: fingerprintOf(outcome),
102
+ execution_action: executionActionOf(outcome),
103
+ });
104
+ }
105
+ function attachObservation(outcome, trail, extras) {
106
+ const frozenTrail = Object.freeze(trail.map((e) => Object.freeze({ ...e })));
107
+ const proof = Object.freeze({
108
+ ...outcome.proof,
109
+ recheck_trail: frozenTrail,
110
+ });
111
+ const obs = { recheck_trail: frozenTrail };
112
+ if (extras.stop)
113
+ obs.recheck_stop_reason = extras.stop;
114
+ const recheckCount = Math.max(0, trail.length - 1);
115
+ if (extras.fixed === true) {
116
+ obs.fixed_after_block = { value: true, attempt_count: recheckCount };
117
+ }
118
+ else if (trail.length > 0) {
119
+ obs.fixed_after_block = { value: null, attempt_count: recheckCount > 0 ? recheckCount : null };
120
+ }
121
+ return { ...outcome, proof, ...obs };
122
+ }
123
+ /**
124
+ * Keep T2's hashed artifacts and the factory's arguments.artifacts the same array.
125
+ * wrapWithGuard executes `redacted.arguments`; a descriptor that preflights ART_FIXED
126
+ * while arguments still hold the BLOCK-era payload would authorize one change set and
127
+ * apply another.
128
+ */
129
+ function withFreshArtifacts(call, artifacts) {
130
+ const next = { ...call, artifacts };
131
+ const args = next.arguments;
132
+ if (args && typeof args === 'object' && !Array.isArray(args)) {
133
+ next.arguments = { ...args, artifacts };
134
+ }
135
+ return next;
136
+ }
137
+ async function freshCall(cfg, current, rebind, artifactsBeforeFix) {
138
+ // Host-updated call first so applyFix mutations of arguments / filesTouched / diff survive.
139
+ let next = { ...current };
140
+ if (typeof cfg.resolveInput === 'function') {
141
+ const input = await cfg.resolveInput();
142
+ const resolved = resolveArtifacts(input, cfg.resolveConfig);
143
+ if (resolved.artifacts && resolved.artifacts.length > 0) {
144
+ return withFreshArtifacts(next, resolved.artifacts);
145
+ }
146
+ }
147
+ const hostReplacedArtifacts = Array.isArray(current.artifacts)
148
+ && current.artifacts !== artifactsBeforeFix;
149
+ if (hostReplacedArtifacts) {
150
+ return withFreshArtifacts(next, current.artifacts);
151
+ }
152
+ const rebound = await Promise.resolve(rebind());
153
+ if (Array.isArray(rebound.artifacts) && rebound.artifacts.length > 0) {
154
+ return withFreshArtifacts(next, rebound.artifacts);
155
+ }
156
+ return next;
157
+ }
158
+ /**
159
+ * First call is always a normal guardToolCall. The loop runs only when autoRecheck is
160
+ * normalized (applyFix present, maxAttempts in 1–3) AND the outcome is BLOCK with a
161
+ * remediation_transaction.
162
+ */
163
+ export async function runAutoRecheckLoop(args) {
164
+ const cfg = normalizeAutoRecheck(args.config.autoRecheck);
165
+ const first = await guardToolCall(args.call, args.factory, args.config, args.callContext);
166
+ if (!cfg)
167
+ return first;
168
+ const remediation0 = isBlockWithRemediation(first);
169
+ if (!remediation0)
170
+ return first;
171
+ const trail = [trailEntry(first, 0)];
172
+ let currentCall = args.call;
173
+ let previous = first;
174
+ let previousFp = fingerprintOf(first);
175
+ let remediation = remediation0;
176
+ for (let i = 1; i <= cfg.maxAttempts; i++) {
177
+ const artifactsBeforeFix = currentCall.artifacts;
178
+ const ctx = {
179
+ call: currentCall,
180
+ attempt: i,
181
+ outcome: previous,
182
+ };
183
+ let applied = false;
184
+ try {
185
+ applied = (await cfg.applyFix(remediation, ctx)) === true;
186
+ }
187
+ catch {
188
+ emit(args.config, {
189
+ type: 'recheck_attempt',
190
+ at: iso(),
191
+ attempt: i,
192
+ decisionId: decisionIdOf(previous) ?? undefined,
193
+ from_fp: previousFp,
194
+ to_fp: previousFp,
195
+ cause: 'apply_fix_threw',
196
+ });
197
+ return attachObservation(first, trail, { stop: 'apply_fix_threw' });
198
+ }
199
+ if (!applied) {
200
+ return attachObservation(first, trail, { stop: 'apply_fix_declined' });
201
+ }
202
+ currentCall = await freshCall(cfg, ctx.call, args.rebind, artifactsBeforeFix);
203
+ const nextCtx = args.refreshContext
204
+ ? await args.refreshContext(currentCall)
205
+ : args.callContext;
206
+ const next = await guardToolCall(currentCall, args.factory, args.config, nextCtx);
207
+ const toFp = fingerprintOf(next);
208
+ trail.push(trailEntry(next, i));
209
+ emit(args.config, {
210
+ type: 'recheck_attempt',
211
+ at: iso(),
212
+ attempt: i,
213
+ decisionId: decisionIdOf(next) ?? undefined,
214
+ from_fp: previousFp,
215
+ to_fp: toFp,
216
+ });
217
+ // Same fingerprint as the previous attempt → no progress. Stop; last decision stands.
218
+ if (previousFp != null && toFp != null && previousFp === toFp) {
219
+ return attachObservation(next, trail, { stop: 'no_progress' });
220
+ }
221
+ if (isAllowClass(next)) {
222
+ return attachObservation(next, trail, { fixed: true });
223
+ }
224
+ const remNext = isBlockWithRemediation(next);
225
+ if (!remNext) {
226
+ return attachObservation(next, trail, {});
227
+ }
228
+ previous = next;
229
+ previousFp = toFp;
230
+ remediation = remNext;
231
+ }
232
+ return attachObservation(previous, trail, { stop: 'exhausted' });
233
+ }
234
+ //# sourceMappingURL=auto-recheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-recheck.js","sourceRoot":"","sources":["../../src/auto-recheck.ts"],"names":[],"mappings":"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"}