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.
Files changed (79) hide show
  1. package/README.md +40 -130
  2. package/cordis.patch.yml +5 -0
  3. package/lib/client.d.ts +8 -2
  4. package/lib/client.d.ts.map +1 -1
  5. package/lib/client.js +4627 -6732
  6. package/lib/guard-core.js +74 -15
  7. package/lib/guard-core.js.map +1 -1
  8. package/lib/guard-loop-core.js +158 -24
  9. package/lib/guard-loop-core.js.map +1 -1
  10. package/lib/guard.js +228 -85
  11. package/lib/guard.js.map +1 -1
  12. package/lib/host-face.js +1 -0
  13. package/lib/host-face.js.map +1 -1
  14. package/lib/index.js +11 -1
  15. package/lib/index.js.map +1 -1
  16. package/lib/invoke.js +16 -10
  17. package/lib/invoke.js.map +1 -1
  18. package/lib/policy-state.js +29 -1
  19. package/lib/policy-state.js.map +1 -1
  20. package/lib/policy.js +178 -10
  21. package/lib/policy.js.map +1 -1
  22. package/lib/registry.js +12 -2
  23. package/lib/registry.js.map +1 -1
  24. package/lib/server/call-index-remote.js +110 -0
  25. package/lib/server/call-index-remote.js.map +1 -0
  26. package/lib/server/remote.js +13 -0
  27. package/lib/server/remote.js.map +1 -1
  28. package/lib/types/guard-core.d.ts +91 -6
  29. package/lib/types/guard-core.d.ts.map +1 -1
  30. package/lib/types/guard-loop-core.d.ts +64 -3
  31. package/lib/types/guard-loop-core.d.ts.map +1 -1
  32. package/lib/types/guard.d.ts +7 -1
  33. package/lib/types/guard.d.ts.map +1 -1
  34. package/lib/types/host-face.d.ts.map +1 -1
  35. package/lib/types/index.d.ts +5 -0
  36. package/lib/types/index.d.ts.map +1 -1
  37. package/lib/types/invoke.d.ts.map +1 -1
  38. package/lib/types/policy-state.d.ts +6 -0
  39. package/lib/types/policy-state.d.ts.map +1 -1
  40. package/lib/types/policy.d.ts +34 -3
  41. package/lib/types/policy.d.ts.map +1 -1
  42. package/lib/types/registry.d.ts.map +1 -1
  43. package/lib/types/server/call-index-remote.d.ts +17 -0
  44. package/lib/types/server/call-index-remote.d.ts.map +1 -0
  45. package/lib/types/server/remote.d.ts +9 -0
  46. package/lib/types/server/remote.d.ts.map +1 -1
  47. package/lib/types/usage/call-index-core.d.ts +152 -0
  48. package/lib/types/usage/call-index-core.d.ts.map +1 -0
  49. package/lib/types/usage/call-index-host-face.d.ts +44 -0
  50. package/lib/types/usage/call-index-host-face.d.ts.map +1 -0
  51. package/lib/types/usage/call-index-host.d.ts +7 -0
  52. package/lib/types/usage/call-index-host.d.ts.map +1 -0
  53. package/lib/types/usage/call-index-query.d.ts +97 -0
  54. package/lib/types/usage/call-index-query.d.ts.map +1 -0
  55. package/lib/types/usage/call-index-runtime.d.ts +46 -0
  56. package/lib/types/usage/call-index-runtime.d.ts.map +1 -0
  57. package/lib/types/usage/call-index-scope.d.ts +59 -0
  58. package/lib/types/usage/call-index-scope.d.ts.map +1 -0
  59. package/lib/types/usage/call-index-wire.d.ts +286 -0
  60. package/lib/types/usage/call-index-wire.d.ts.map +1 -0
  61. package/lib/types/usage/session-index.d.ts +149 -0
  62. package/lib/types/usage/session-index.d.ts.map +1 -0
  63. package/lib/usage/call-index-core.js +761 -0
  64. package/lib/usage/call-index-core.js.map +1 -0
  65. package/lib/usage/call-index-host-face.js +77 -0
  66. package/lib/usage/call-index-host-face.js.map +1 -0
  67. package/lib/usage/call-index-host.js +13 -0
  68. package/lib/usage/call-index-host.js.map +1 -0
  69. package/lib/usage/call-index-query.js +669 -0
  70. package/lib/usage/call-index-query.js.map +1 -0
  71. package/lib/usage/call-index-runtime.js +376 -0
  72. package/lib/usage/call-index-runtime.js.map +1 -0
  73. package/lib/usage/call-index-scope.js +79 -0
  74. package/lib/usage/call-index-scope.js.map +1 -0
  75. package/lib/usage/call-index-wire.js +490 -0
  76. package/lib/usage/call-index-wire.js.map +1 -0
  77. package/lib/usage/session-index.js +600 -0
  78. package/lib/usage/session-index.js.map +1 -0
  79. package/package.json +5 -5
package/lib/guard-core.js CHANGED
@@ -1,5 +1,69 @@
1
- import { createHash } from 'node:crypto';
2
- import { createGuardLoopState } from "./guard-loop-core.js";
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
- pendingBlockSignatures: new Set(),
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.pendingBlockSignatures.clear();
227
+ state.pendingBlockCandidates.clear();
169
228
  state.blockedLoopSignatures.clear();
170
229
  state.deniedCallIds.clear();
171
230
  state.localLoopDenials = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"guard-core.js","sourceRoot":"","sources":["../src/guard-core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"guard-core.js","sourceRoot":"","sources":["../src/guard-core.ts"],"names":[],"mappings":"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"}
@@ -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 canonicalJson(value, seen = new Set()) {
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
- let result;
24
- if (Array.isArray(value)) {
25
- result = `[${value.map(item => canonicalJson(item, seen)).join(',')}]`;
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
- result = `{${Object.keys(record).sort().map(key => `${JSON.stringify(key)}:${canonicalJson(record[key], seen)}`).join(',')}}`;
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 result;
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 sha256(`${name}\0${canonicalJson(argumentsValue)}`);
149
+ return boundedHash(name, argumentsValue);
39
150
  }
40
- /** Fingerprint a result/error transiently; raw content is never returned or retained. */
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 sha256(`${outcome}\0${canonicalJson(value)}`);
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
- const thresholds = [...(options.repeatThresholds ?? DEFAULT_REPEAT_THRESHOLDS)].sort((a, b) => a - b);
120
- if (thresholds.length === 0 || thresholds.some(value => !Number.isSafeInteger(value) || value < 2)
121
- || new Set(thresholds).size !== thresholds.length) {
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
- const warning = alternatingCycle ? 'alternating-cycle' : repeatThreshold !== undefined ? 'repeat' : 'none';
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
- && (cycleEvidence !== 'none'
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":"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"}
1
+ {"version":3,"file":"guard-loop-core.js","sourceRoot":"","sources":["../src/guard-loop-core.ts"],"names":[],"mappings":"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"}