dsh-thinking-guard 0.1.17 → 0.1.20
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 +40 -130
- package/cordis.patch.yml +5 -0
- package/lib/client.d.ts +8 -2
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +4627 -6732
- package/lib/guard-core.js +74 -15
- package/lib/guard-core.js.map +1 -1
- package/lib/guard-loop-core.js +158 -24
- package/lib/guard-loop-core.js.map +1 -1
- package/lib/guard.js +228 -85
- package/lib/guard.js.map +1 -1
- package/lib/host-face.js +1 -0
- package/lib/host-face.js.map +1 -1
- package/lib/index.js +11 -1
- package/lib/index.js.map +1 -1
- package/lib/invoke.js +16 -10
- package/lib/invoke.js.map +1 -1
- package/lib/policy-state.js +29 -1
- package/lib/policy-state.js.map +1 -1
- package/lib/policy.js +178 -10
- package/lib/policy.js.map +1 -1
- package/lib/registry.js +12 -2
- package/lib/registry.js.map +1 -1
- package/lib/server/call-index-remote.js +110 -0
- package/lib/server/call-index-remote.js.map +1 -0
- package/lib/server/remote.js +13 -0
- package/lib/server/remote.js.map +1 -1
- package/lib/types/guard-core.d.ts +91 -6
- package/lib/types/guard-core.d.ts.map +1 -1
- package/lib/types/guard-loop-core.d.ts +64 -3
- package/lib/types/guard-loop-core.d.ts.map +1 -1
- package/lib/types/guard.d.ts +7 -1
- package/lib/types/guard.d.ts.map +1 -1
- package/lib/types/host-face.d.ts.map +1 -1
- package/lib/types/index.d.ts +5 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/invoke.d.ts.map +1 -1
- package/lib/types/policy-state.d.ts +6 -0
- package/lib/types/policy-state.d.ts.map +1 -1
- package/lib/types/policy.d.ts +34 -3
- package/lib/types/policy.d.ts.map +1 -1
- package/lib/types/registry.d.ts.map +1 -1
- package/lib/types/server/call-index-remote.d.ts +17 -0
- package/lib/types/server/call-index-remote.d.ts.map +1 -0
- package/lib/types/server/remote.d.ts +9 -0
- package/lib/types/server/remote.d.ts.map +1 -1
- package/lib/types/usage/call-index-core.d.ts +152 -0
- package/lib/types/usage/call-index-core.d.ts.map +1 -0
- package/lib/types/usage/call-index-host-face.d.ts +44 -0
- package/lib/types/usage/call-index-host-face.d.ts.map +1 -0
- package/lib/types/usage/call-index-host.d.ts +7 -0
- package/lib/types/usage/call-index-host.d.ts.map +1 -0
- package/lib/types/usage/call-index-query.d.ts +97 -0
- package/lib/types/usage/call-index-query.d.ts.map +1 -0
- package/lib/types/usage/call-index-runtime.d.ts +46 -0
- package/lib/types/usage/call-index-runtime.d.ts.map +1 -0
- package/lib/types/usage/call-index-scope.d.ts +59 -0
- package/lib/types/usage/call-index-scope.d.ts.map +1 -0
- package/lib/types/usage/call-index-wire.d.ts +286 -0
- package/lib/types/usage/call-index-wire.d.ts.map +1 -0
- package/lib/types/usage/session-index.d.ts +149 -0
- package/lib/types/usage/session-index.d.ts.map +1 -0
- package/lib/usage/call-index-core.js +761 -0
- package/lib/usage/call-index-core.js.map +1 -0
- package/lib/usage/call-index-host-face.js +77 -0
- package/lib/usage/call-index-host-face.js.map +1 -0
- package/lib/usage/call-index-host.js +13 -0
- package/lib/usage/call-index-host.js.map +1 -0
- package/lib/usage/call-index-query.js +669 -0
- package/lib/usage/call-index-query.js.map +1 -0
- package/lib/usage/call-index-runtime.js +376 -0
- package/lib/usage/call-index-runtime.js.map +1 -0
- package/lib/usage/call-index-scope.js +79 -0
- package/lib/usage/call-index-scope.js.map +1 -0
- package/lib/usage/call-index-wire.js +490 -0
- package/lib/usage/call-index-wire.js.map +1 -0
- package/lib/usage/session-index.js +600 -0
- package/lib/usage/session-index.js.map +1 -0
- package/package.json +5 -5
package/lib/guard-core.js
CHANGED
|
@@ -1,5 +1,69 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { DEFAULT_REPEAT_THRESHOLDS, createGuardLoopState, normalizeRepeatThresholds, } from "./guard-loop-core.js";
|
|
2
|
+
/** Saturating increment: counters stay finite and exact for any real session. */
|
|
3
|
+
function bumpCounter(value) {
|
|
4
|
+
return value >= Number.MAX_SAFE_INTEGER ? value : value + 1;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Bounded, process-lifetime Guard counters.
|
|
8
|
+
*
|
|
9
|
+
* Deliberately not per-Agent or per-Turn: the question the settings page asks is
|
|
10
|
+
* "has this process's Guard been working at all", which a per-turn counter would
|
|
11
|
+
* answer with a zero every time the page is opened mid-turn. Mutators are total
|
|
12
|
+
* (they cannot throw), so instrumentation can never turn a real tool call into a
|
|
13
|
+
* failure.
|
|
14
|
+
*/
|
|
15
|
+
export class GuardStatsRecorder {
|
|
16
|
+
startedAt;
|
|
17
|
+
observations = 0;
|
|
18
|
+
repeatReminders = 0;
|
|
19
|
+
cycleReminders = 0;
|
|
20
|
+
denials = 0;
|
|
21
|
+
successes = 0;
|
|
22
|
+
errors = 0;
|
|
23
|
+
cancellations = 0;
|
|
24
|
+
lastReminderAt;
|
|
25
|
+
lastDenialAt;
|
|
26
|
+
constructor(now = Date.now()) {
|
|
27
|
+
this.startedAt = now;
|
|
28
|
+
}
|
|
29
|
+
/** Record one call the detector observed, by its outcome class. */
|
|
30
|
+
observe(outcome, _now = Date.now()) {
|
|
31
|
+
this.observations = bumpCounter(this.observations);
|
|
32
|
+
if (outcome === 'success')
|
|
33
|
+
this.successes = bumpCounter(this.successes);
|
|
34
|
+
else if (outcome === 'error')
|
|
35
|
+
this.errors = bumpCounter(this.errors);
|
|
36
|
+
else if (outcome === 'cancelled')
|
|
37
|
+
this.cancellations = bumpCounter(this.cancellations);
|
|
38
|
+
}
|
|
39
|
+
/** Record one reminder that was really delivered to the Agent. */
|
|
40
|
+
remind(kind, now = Date.now()) {
|
|
41
|
+
if (kind === 'cycle')
|
|
42
|
+
this.cycleReminders = bumpCounter(this.cycleReminders);
|
|
43
|
+
else
|
|
44
|
+
this.repeatReminders = bumpCounter(this.repeatReminders);
|
|
45
|
+
this.lastReminderAt = now;
|
|
46
|
+
}
|
|
47
|
+
/** Record one local denial that was really enforced. */
|
|
48
|
+
deny(now = Date.now()) {
|
|
49
|
+
this.denials = bumpCounter(this.denials);
|
|
50
|
+
this.lastDenialAt = now;
|
|
51
|
+
}
|
|
52
|
+
/** Frozen, content-free copy. Safe to serialize over the remote wire. */
|
|
53
|
+
snapshot() {
|
|
54
|
+
return {
|
|
55
|
+
observations: this.observations,
|
|
56
|
+
reminders: { repeat: this.repeatReminders, cycle: this.cycleReminders },
|
|
57
|
+
denials: this.denials,
|
|
58
|
+
outcomes: { success: this.successes, error: this.errors, cancelled: this.cancellations },
|
|
59
|
+
...(this.lastReminderAt !== undefined ? { lastReminderAt: this.lastReminderAt } : {}),
|
|
60
|
+
...(this.lastDenialAt !== undefined ? { lastDenialAt: this.lastDenialAt } : {}),
|
|
61
|
+
since: this.startedAt,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** Counters for this process; imported by the policy service that serves them. */
|
|
66
|
+
export const processGuardStats = new GuardStatsRecorder();
|
|
3
67
|
export const DEFAULT_GUARD_PROFILES = {
|
|
4
68
|
quick: {
|
|
5
69
|
softSteps: 3,
|
|
@@ -46,6 +110,7 @@ export const DEFAULT_GUARD_CONFIG = {
|
|
|
46
110
|
duplicateHardBlock: false,
|
|
47
111
|
profiles: DEFAULT_GUARD_PROFILES,
|
|
48
112
|
hostIntegration: DEFAULT_HOST_INTEGRATION,
|
|
113
|
+
repeatThresholds: DEFAULT_REPEAT_THRESHOLDS,
|
|
49
114
|
};
|
|
50
115
|
function assertPositiveInteger(name, value) {
|
|
51
116
|
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value <= 0) {
|
|
@@ -84,6 +149,10 @@ export function validateGuardConfig(input = {}) {
|
|
|
84
149
|
assertPositiveInteger('hostIntegration.maxNoProgressCycles', host.maxNoProgressCycles);
|
|
85
150
|
if (host.loopBreakMode !== 'stop-next-step')
|
|
86
151
|
throw new Error('hostIntegration.loopBreakMode must be stop-next-step');
|
|
152
|
+
// An absent list falls back to the shipped default; a present one must be legal.
|
|
153
|
+
const repeatThresholds = input.repeatThresholds === undefined
|
|
154
|
+
? DEFAULT_REPEAT_THRESHOLDS
|
|
155
|
+
: normalizeRepeatThresholds(input.repeatThresholds);
|
|
87
156
|
return {
|
|
88
157
|
...DEFAULT_GUARD_CONFIG,
|
|
89
158
|
...input,
|
|
@@ -97,19 +166,9 @@ export function validateGuardConfig(input = {}) {
|
|
|
97
166
|
profiles,
|
|
98
167
|
duplicateWarnAfter,
|
|
99
168
|
hostIntegration: host,
|
|
169
|
+
repeatThresholds,
|
|
100
170
|
};
|
|
101
171
|
}
|
|
102
|
-
export function canonicalJson(value) {
|
|
103
|
-
if (value === null || typeof value !== 'object')
|
|
104
|
-
return JSON.stringify(value) ?? 'undefined';
|
|
105
|
-
if (Array.isArray(value))
|
|
106
|
-
return `[${value.map(canonicalJson).join(',')}]`;
|
|
107
|
-
const object = value;
|
|
108
|
-
return `{${Object.keys(object).sort().map(key => `${JSON.stringify(key)}:${canonicalJson(object[key])}`).join(',')}}`;
|
|
109
|
-
}
|
|
110
|
-
export function toolSignature(name, argumentsValue) {
|
|
111
|
-
return createHash('sha256').update(name).update('\0').update(canonicalJson(argumentsValue)).digest('hex');
|
|
112
|
-
}
|
|
113
172
|
export class GuardStateStore {
|
|
114
173
|
states = new WeakMap();
|
|
115
174
|
beginTurn(agent, turn, now = Date.now()) {
|
|
@@ -124,7 +183,7 @@ export class GuardStateStore {
|
|
|
124
183
|
dispatchRecords: new Map(),
|
|
125
184
|
pendingLoopObservations: new Map(),
|
|
126
185
|
loopState: createGuardLoopState(turn),
|
|
127
|
-
|
|
186
|
+
pendingBlockCandidates: new Map(),
|
|
128
187
|
blockedLoopSignatures: new Set(),
|
|
129
188
|
deniedCallIds: new Set(),
|
|
130
189
|
localLoopDenials: 0,
|
|
@@ -165,7 +224,7 @@ export class EfficiencyGuard {
|
|
|
165
224
|
state.dispatchRecords.clear();
|
|
166
225
|
state.pendingLoopObservations.clear();
|
|
167
226
|
state.loopState = createGuardLoopState(state.turn);
|
|
168
|
-
state.
|
|
227
|
+
state.pendingBlockCandidates.clear();
|
|
169
228
|
state.blockedLoopSignatures.clear();
|
|
170
229
|
state.deniedCallIds.clear();
|
|
171
230
|
state.localLoopDenials = 0;
|
package/lib/guard-core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard-core.js","sourceRoot":"","sources":["../src/guard-core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"guard-core.js","sourceRoot":"","sources":["../src/guard-core.ts"],"names":[],"mappings":"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"}
|
package/lib/guard-loop-core.js
CHANGED
|
@@ -1,46 +1,166 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
2
|
export const LOOP_HISTORY_LIMIT = 16;
|
|
3
3
|
export const DEFAULT_REPEAT_THRESHOLDS = Object.freeze([3, 5, 8]);
|
|
4
|
+
/** Smallest accepted repeat threshold. */
|
|
5
|
+
export const REPEAT_THRESHOLD_MIN = 2;
|
|
6
|
+
/** Largest accepted repeat threshold. */
|
|
7
|
+
export const REPEAT_THRESHOLD_MAX = 50;
|
|
8
|
+
/** How many thresholds one configuration may carry. */
|
|
9
|
+
export const REPEAT_THRESHOLD_LIMIT = 5;
|
|
10
|
+
/**
|
|
11
|
+
* Validate a repeat-threshold list and return a frozen copy.
|
|
12
|
+
*
|
|
13
|
+
* One shared validator so the settings page, the persisted state file and the
|
|
14
|
+
* detector cannot disagree about what a legal list is. It throws instead of
|
|
15
|
+
* coercing: silently sorting, deduplicating or clamping would make the settings
|
|
16
|
+
* page claim a behaviour the detector does not have.
|
|
17
|
+
*/
|
|
18
|
+
export function normalizeRepeatThresholds(value, label = 'repeatThresholds') {
|
|
19
|
+
if (!Array.isArray(value))
|
|
20
|
+
throw new Error(`${label} must be an array of integers`);
|
|
21
|
+
if (value.length < 1 || value.length > REPEAT_THRESHOLD_LIMIT) {
|
|
22
|
+
throw new Error(`${label} must contain 1 to ${REPEAT_THRESHOLD_LIMIT} integers`);
|
|
23
|
+
}
|
|
24
|
+
const normalized = [];
|
|
25
|
+
for (const entry of value) {
|
|
26
|
+
if (typeof entry !== 'number' || !Number.isSafeInteger(entry)
|
|
27
|
+
|| entry < REPEAT_THRESHOLD_MIN || entry > REPEAT_THRESHOLD_MAX) {
|
|
28
|
+
throw new Error(`${label} must contain integers between ${REPEAT_THRESHOLD_MIN} and ${REPEAT_THRESHOLD_MAX}`);
|
|
29
|
+
}
|
|
30
|
+
if (normalized.length > 0 && entry <= normalized[normalized.length - 1]) {
|
|
31
|
+
throw new Error(`${label} must be strictly increasing`);
|
|
32
|
+
}
|
|
33
|
+
normalized.push(entry);
|
|
34
|
+
}
|
|
35
|
+
return Object.freeze(normalized);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Fingerprint budgets, checked *while* canonicalizing.
|
|
39
|
+
*
|
|
40
|
+
* Exceeding any budget abandons the fingerprint entirely. A truncated canonical
|
|
41
|
+
* form would still look complete and could make two different results compare
|
|
42
|
+
* equal — the false "no progress" evidence this guard must never invent.
|
|
43
|
+
*
|
|
44
|
+
* - `FINGERPRINT_MAX_NODES`: values visited (object keys charge bytes only).
|
|
45
|
+
* A 1000-row x 5-field tool result is ~6k nodes; 20k still fingerprints a
|
|
46
|
+
* ~3300-row table in a few milliseconds.
|
|
47
|
+
* - `FINGERPRINT_MAX_DEPTH`: nesting levels, root = 1. The recursive walk
|
|
48
|
+
* overflows the stack at ~2000 object levels on the bundled Node 22 runtime
|
|
49
|
+
* with the default stack (measured), so 64 keeps ~30x headroom and is still
|
|
50
|
+
* far deeper than any real payload (`content[] -> block -> value` is depth 4).
|
|
51
|
+
* - `FINGERPRINT_MAX_BYTES`: UTF-8 bytes of the canonical JSON. 256 KiB covers
|
|
52
|
+
* ordinary file reads, search hits and multi-hundred-KB JSON in under 1 ms,
|
|
53
|
+
* while a multi-megabyte result is rejected before it is fully materialized.
|
|
54
|
+
*/
|
|
55
|
+
export const FINGERPRINT_MAX_NODES = 20_000;
|
|
56
|
+
export const FINGERPRINT_MAX_DEPTH = 64;
|
|
57
|
+
export const FINGERPRINT_MAX_BYTES = 256 * 1024;
|
|
58
|
+
/** Internal signal: this value cannot be fingerprinted within budget. */
|
|
59
|
+
export class GuardFingerprintBudgetError extends Error {
|
|
60
|
+
limit;
|
|
61
|
+
constructor(limit) {
|
|
62
|
+
super(`guard fingerprint budget exceeded: ${limit}`);
|
|
63
|
+
this.name = 'GuardFingerprintBudgetError';
|
|
64
|
+
this.limit = limit;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
4
67
|
export function createGuardLoopState(turn) {
|
|
5
68
|
return { turn, history: [] };
|
|
6
69
|
}
|
|
7
|
-
function
|
|
70
|
+
function chargeBytes(budget, text) {
|
|
71
|
+
budget.bytes += Buffer.byteLength(text, 'utf8');
|
|
72
|
+
if (budget.bytes > FINGERPRINT_MAX_BYTES)
|
|
73
|
+
throw new GuardFingerprintBudgetError('bytes');
|
|
74
|
+
return text;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Canonical JSON with hard node/depth/byte budgets.
|
|
78
|
+
*
|
|
79
|
+
* Throws `GuardFingerprintBudgetError` the moment a budget is crossed instead of
|
|
80
|
+
* returning a partial string, because a partial string is indistinguishable from
|
|
81
|
+
* a complete one. The cycle check stays a `TypeError` so cyclic input keeps its
|
|
82
|
+
* own error class.
|
|
83
|
+
*/
|
|
84
|
+
function canonicalJson(value, depth, budget, seen) {
|
|
85
|
+
budget.nodes += 1;
|
|
86
|
+
if (budget.nodes > FINGERPRINT_MAX_NODES)
|
|
87
|
+
throw new GuardFingerprintBudgetError('nodes');
|
|
88
|
+
if (depth > FINGERPRINT_MAX_DEPTH)
|
|
89
|
+
throw new GuardFingerprintBudgetError('depth');
|
|
8
90
|
if (value === null)
|
|
9
|
-
return 'null';
|
|
91
|
+
return chargeBytes(budget, 'null');
|
|
10
92
|
if (typeof value === 'string' || typeof value === 'boolean')
|
|
11
|
-
return JSON.stringify(value);
|
|
93
|
+
return chargeBytes(budget, JSON.stringify(value));
|
|
12
94
|
if (typeof value === 'number')
|
|
13
|
-
return Number.isFinite(value) ? JSON.stringify(value) : 'null';
|
|
95
|
+
return chargeBytes(budget, Number.isFinite(value) ? JSON.stringify(value) : 'null');
|
|
14
96
|
if (typeof value === 'undefined')
|
|
15
|
-
return '"[undefined]"';
|
|
16
|
-
if (typeof value === 'bigint')
|
|
17
|
-
return JSON.stringify(value.toString());
|
|
97
|
+
return chargeBytes(budget, '"[undefined]"');
|
|
18
98
|
if (typeof value !== 'object')
|
|
19
|
-
return JSON.stringify(String(value));
|
|
99
|
+
return chargeBytes(budget, JSON.stringify(String(value)));
|
|
20
100
|
if (seen.has(value))
|
|
21
101
|
throw new TypeError('Cannot fingerprint a cyclic value');
|
|
22
102
|
seen.add(value);
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
103
|
+
const isArray = Array.isArray(value);
|
|
104
|
+
const open = chargeBytes(budget, isArray ? '[' : '{');
|
|
105
|
+
let body = '';
|
|
106
|
+
if (isArray) {
|
|
107
|
+
const items = value;
|
|
108
|
+
for (let index = 0; index < items.length; index += 1) {
|
|
109
|
+
if (index > 0)
|
|
110
|
+
body += chargeBytes(budget, ',');
|
|
111
|
+
body += canonicalJson(items[index], depth + 1, budget, seen);
|
|
112
|
+
}
|
|
26
113
|
}
|
|
27
114
|
else {
|
|
28
115
|
const record = value;
|
|
29
|
-
|
|
116
|
+
for (const key of Object.keys(record).sort()) {
|
|
117
|
+
if (body.length > 0)
|
|
118
|
+
body += chargeBytes(budget, ',');
|
|
119
|
+
body += chargeBytes(budget, `${JSON.stringify(key)}:`);
|
|
120
|
+
body += canonicalJson(record[key], depth + 1, budget, seen);
|
|
121
|
+
}
|
|
30
122
|
}
|
|
123
|
+
const close = chargeBytes(budget, isArray ? ']' : '}');
|
|
31
124
|
seen.delete(value);
|
|
32
|
-
return
|
|
125
|
+
return `${open}${body}${close}`;
|
|
33
126
|
}
|
|
34
127
|
function sha256(value) {
|
|
35
128
|
return createHash('sha256').update(value).digest('hex');
|
|
36
129
|
}
|
|
130
|
+
/**
|
|
131
|
+
* Fingerprint one canonical form, or `undefined` when it cannot be proven.
|
|
132
|
+
*
|
|
133
|
+
* Fail-open by construction: budget overflow, cycles, and a throwing getter on
|
|
134
|
+
* an otherwise plain object all resolve to "no fingerprint", never an exception
|
|
135
|
+
* for the caller. `undefined` is *not* evidence that two values are equal — see
|
|
136
|
+
* `fingerprintsMatch`.
|
|
137
|
+
*/
|
|
138
|
+
function boundedHash(prefix, value) {
|
|
139
|
+
try {
|
|
140
|
+
const canonical = canonicalJson(value, 1, { nodes: 0, bytes: 0 }, new Set());
|
|
141
|
+
return sha256(`${prefix}\0${canonical}`);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** Bounded argument signature; `undefined` means this call is not comparable. */
|
|
37
148
|
export function guardToolSignature(name, argumentsValue) {
|
|
38
|
-
return
|
|
149
|
+
return boundedHash(name, argumentsValue);
|
|
39
150
|
}
|
|
40
|
-
/**
|
|
151
|
+
/**
|
|
152
|
+
* Fingerprint a result/error transiently; raw content is never returned or
|
|
153
|
+
* retained. `undefined` means "cannot prove the result did not change".
|
|
154
|
+
*/
|
|
41
155
|
export function guardResultFingerprint(outcome, value) {
|
|
42
|
-
return
|
|
156
|
+
return boundedHash(outcome, value);
|
|
43
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* Two entries match only when *both* carry a fingerprint. A missing fingerprint
|
|
160
|
+
* means "cannot prove no progress happened" and must never be read as "results
|
|
161
|
+
* are identical" — otherwise every oversized result would become no-progress
|
|
162
|
+
* evidence and could be denied.
|
|
163
|
+
*/
|
|
44
164
|
function fingerprintsMatch(a, b) {
|
|
45
165
|
return a.outcome === b.outcome
|
|
46
166
|
&& a.resultFingerprint !== undefined
|
|
@@ -78,6 +198,10 @@ function noopDecision() {
|
|
|
78
198
|
* Pure bounded detector. It never enforces a step, call-count, or duration budget.
|
|
79
199
|
* Alternating cycles warn; a local-block candidate requires matching result/error
|
|
80
200
|
* fingerprints for every leg of the repeated cycle.
|
|
201
|
+
*
|
|
202
|
+
* An observation whose argument signature exceeds the fingerprint budget is
|
|
203
|
+
* dropped exactly like an excluded tool: without a stable signature there is no
|
|
204
|
+
* comparable history entry, so no reminder and no block candidate is produced.
|
|
81
205
|
*/
|
|
82
206
|
export function observeGuardLoop(previousState, turn, observation, options = {}) {
|
|
83
207
|
const base = previousState.turn === turn ? previousState : createGuardLoopState(turn);
|
|
@@ -85,6 +209,8 @@ export function observeGuardLoop(previousState, turn, observation, options = {})
|
|
|
85
209
|
return { state: base, decision: noopDecision() };
|
|
86
210
|
}
|
|
87
211
|
const signature = observation.signature ?? guardToolSignature(observation.name, observation.arguments);
|
|
212
|
+
if (signature === undefined)
|
|
213
|
+
return { state: base, decision: noopDecision() };
|
|
88
214
|
const fingerprint = observation.resultFingerprint
|
|
89
215
|
?? (Object.hasOwn(observation, 'result') ? guardResultFingerprint(observation.outcome, observation.result) : undefined);
|
|
90
216
|
const current = {
|
|
@@ -116,18 +242,25 @@ export function observeGuardLoop(previousState, turn, observation, options = {})
|
|
|
116
242
|
cycleEvidence = 'unchanged-cycle';
|
|
117
243
|
}
|
|
118
244
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
throw new Error('repeatThresholds must contain unique integers >= 2');
|
|
123
|
-
}
|
|
245
|
+
// Sorted before validation so an unsorted but otherwise legal list keeps working;
|
|
246
|
+
// the shared validator then enforces range, count and strict ordering.
|
|
247
|
+
const thresholds = normalizeRepeatThresholds([...(options.repeatThresholds ?? DEFAULT_REPEAT_THRESHOLDS)].sort((a, b) => a - b));
|
|
124
248
|
const repeatThreshold = thresholds.includes(repeatCount) ? repeatCount : undefined;
|
|
125
|
-
|
|
249
|
+
// Repeat detection and cycle detection are independent switches: neither may
|
|
250
|
+
// suppress the other. `repeatCount` keeps counting even when reminders are off.
|
|
251
|
+
const repeatEnabled = options.repeatDetection !== false;
|
|
252
|
+
const warning = alternatingCycle ? 'alternating-cycle' : repeatEnabled && repeatThreshold !== undefined ? 'repeat' : 'none';
|
|
126
253
|
const noProgressEvidence = cycleEvidence !== 'none' ? cycleEvidence : exactEvidence;
|
|
254
|
+
const repeatCandidate = repeatEnabled && exactEvidence !== 'none' && repeatCount >= thresholds[thresholds.length - 1];
|
|
255
|
+
const cycleCandidate = cycleEvidence !== 'none';
|
|
256
|
+
const blockSource = cycleCandidate
|
|
257
|
+
? 'cycle'
|
|
258
|
+
: repeatCandidate
|
|
259
|
+
? 'repeat'
|
|
260
|
+
: undefined;
|
|
127
261
|
const blockCandidate = options.noProgressProtection !== false
|
|
128
262
|
&& !options.warnOnlyTools?.has(observation.name)
|
|
129
|
-
&&
|
|
130
|
-
|| (exactEvidence !== 'none' && repeatCount >= thresholds[thresholds.length - 1]));
|
|
263
|
+
&& blockSource !== undefined;
|
|
131
264
|
return {
|
|
132
265
|
state: { turn, history: nextHistory },
|
|
133
266
|
decision: {
|
|
@@ -138,6 +271,7 @@ export function observeGuardLoop(previousState, turn, observation, options = {})
|
|
|
138
271
|
warning,
|
|
139
272
|
...(repeatThreshold !== undefined ? { repeatThreshold } : {}),
|
|
140
273
|
blockCandidate,
|
|
274
|
+
...(blockCandidate && blockSource !== undefined ? { blockSource } : {}),
|
|
141
275
|
noProgressEvidence,
|
|
142
276
|
},
|
|
143
277
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard-loop-core.js","sourceRoot":"","sources":["../src/guard-loop-core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAA;AACpC,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAU,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"guard-loop-core.js","sourceRoot":"","sources":["../src/guard-loop-core.ts"],"names":[],"mappings":"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"}
|