@dsh-enhanced/assistant-work-items 0.0.0-stage → 0.1.67

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 (152) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +685 -2
  3. package/cordis.patch.yml +11 -0
  4. package/lib/acceptance-binding.d.ts +86 -0
  5. package/lib/acceptance-binding.d.ts.map +1 -0
  6. package/lib/acceptance-binding.js +250 -0
  7. package/lib/acceptance-binding.js.map +1 -0
  8. package/lib/admission.d.ts +95 -0
  9. package/lib/admission.d.ts.map +1 -0
  10. package/lib/admission.js +642 -0
  11. package/lib/admission.js.map +1 -0
  12. package/lib/authority.d.ts +99 -0
  13. package/lib/authority.d.ts.map +1 -0
  14. package/lib/authority.js +233 -0
  15. package/lib/authority.js.map +1 -0
  16. package/lib/config.d.ts +365 -0
  17. package/lib/config.d.ts.map +1 -0
  18. package/lib/config.js +672 -0
  19. package/lib/config.js.map +1 -0
  20. package/lib/continuation-contract.d.ts +126 -0
  21. package/lib/continuation-contract.d.ts.map +1 -0
  22. package/lib/continuation-contract.js +109 -0
  23. package/lib/continuation-contract.js.map +1 -0
  24. package/lib/continuation-record.d.ts +32 -0
  25. package/lib/continuation-record.d.ts.map +1 -0
  26. package/lib/continuation-record.js +57 -0
  27. package/lib/continuation-record.js.map +1 -0
  28. package/lib/continuation.d.ts +89 -0
  29. package/lib/continuation.d.ts.map +1 -0
  30. package/lib/continuation.js +607 -0
  31. package/lib/continuation.js.map +1 -0
  32. package/lib/diagnosis-contract.d.ts +95 -0
  33. package/lib/diagnosis-contract.d.ts.map +1 -0
  34. package/lib/diagnosis-contract.js +167 -0
  35. package/lib/diagnosis-contract.js.map +1 -0
  36. package/lib/diagnosis.d.ts +70 -0
  37. package/lib/diagnosis.d.ts.map +1 -0
  38. package/lib/diagnosis.js +466 -0
  39. package/lib/diagnosis.js.map +1 -0
  40. package/lib/dispatch.d.ts +100 -0
  41. package/lib/dispatch.d.ts.map +1 -0
  42. package/lib/dispatch.js +317 -0
  43. package/lib/dispatch.js.map +1 -0
  44. package/lib/engineering-context.d.ts +86 -0
  45. package/lib/engineering-context.d.ts.map +1 -0
  46. package/lib/engineering-context.js +263 -0
  47. package/lib/engineering-context.js.map +1 -0
  48. package/lib/evaluation.d.ts +125 -0
  49. package/lib/evaluation.d.ts.map +1 -0
  50. package/lib/evaluation.js +295 -0
  51. package/lib/evaluation.js.map +1 -0
  52. package/lib/event-follow.d.ts +93 -0
  53. package/lib/event-follow.d.ts.map +1 -0
  54. package/lib/event-follow.js +150 -0
  55. package/lib/event-follow.js.map +1 -0
  56. package/lib/feedback-targets.d.ts +91 -0
  57. package/lib/feedback-targets.d.ts.map +1 -0
  58. package/lib/feedback-targets.js +362 -0
  59. package/lib/feedback-targets.js.map +1 -0
  60. package/lib/index.d.ts +27 -0
  61. package/lib/index.d.ts.map +1 -0
  62. package/lib/index.js +25 -0
  63. package/lib/index.js.map +1 -0
  64. package/lib/intake-admission.d.ts +49 -0
  65. package/lib/intake-admission.d.ts.map +1 -0
  66. package/lib/intake-admission.js +100 -0
  67. package/lib/intake-admission.js.map +1 -0
  68. package/lib/intake-evaluation-runtime.d.ts +74 -0
  69. package/lib/intake-evaluation-runtime.d.ts.map +1 -0
  70. package/lib/intake-evaluation-runtime.js +343 -0
  71. package/lib/intake-evaluation-runtime.js.map +1 -0
  72. package/lib/intake-evaluation.d.ts +180 -0
  73. package/lib/intake-evaluation.d.ts.map +1 -0
  74. package/lib/intake-evaluation.js +440 -0
  75. package/lib/intake-evaluation.js.map +1 -0
  76. package/lib/intake.d.ts +118 -0
  77. package/lib/intake.d.ts.map +1 -0
  78. package/lib/intake.js +137 -0
  79. package/lib/intake.js.map +1 -0
  80. package/lib/ledger.d.ts +86 -0
  81. package/lib/ledger.d.ts.map +1 -0
  82. package/lib/ledger.js +145 -0
  83. package/lib/ledger.js.map +1 -0
  84. package/lib/mandate.d.ts +45 -0
  85. package/lib/mandate.d.ts.map +1 -0
  86. package/lib/mandate.js +168 -0
  87. package/lib/mandate.js.map +1 -0
  88. package/lib/outcome.d.ts +137 -0
  89. package/lib/outcome.d.ts.map +1 -0
  90. package/lib/outcome.js +303 -0
  91. package/lib/outcome.js.map +1 -0
  92. package/lib/owner-access.d.ts +35 -0
  93. package/lib/owner-access.d.ts.map +1 -0
  94. package/lib/owner-access.js +152 -0
  95. package/lib/owner-access.js.map +1 -0
  96. package/lib/owner-continuation.d.ts +27 -0
  97. package/lib/owner-continuation.d.ts.map +1 -0
  98. package/lib/owner-continuation.js +131 -0
  99. package/lib/owner-continuation.js.map +1 -0
  100. package/lib/owner-recall.d.ts +85 -0
  101. package/lib/owner-recall.d.ts.map +1 -0
  102. package/lib/owner-recall.js +134 -0
  103. package/lib/owner-recall.js.map +1 -0
  104. package/lib/owner-replies.d.ts +44 -0
  105. package/lib/owner-replies.d.ts.map +1 -0
  106. package/lib/owner-replies.js +268 -0
  107. package/lib/owner-replies.js.map +1 -0
  108. package/lib/peers.d.ts +624 -0
  109. package/lib/peers.d.ts.map +1 -0
  110. package/lib/peers.js +10 -0
  111. package/lib/peers.js.map +1 -0
  112. package/lib/policy-notice.d.ts +31 -0
  113. package/lib/policy-notice.d.ts.map +1 -0
  114. package/lib/policy-notice.js +137 -0
  115. package/lib/policy-notice.js.map +1 -0
  116. package/lib/reply-contract.d.ts +67 -0
  117. package/lib/reply-contract.d.ts.map +1 -0
  118. package/lib/reply-contract.js +58 -0
  119. package/lib/reply-contract.js.map +1 -0
  120. package/lib/service.d.ts +632 -0
  121. package/lib/service.d.ts.map +1 -0
  122. package/lib/service.js +2447 -0
  123. package/lib/service.js.map +1 -0
  124. package/lib/settlement.d.ts +74 -0
  125. package/lib/settlement.d.ts.map +1 -0
  126. package/lib/settlement.js +233 -0
  127. package/lib/settlement.js.map +1 -0
  128. package/lib/signals.d.ts +176 -0
  129. package/lib/signals.d.ts.map +1 -0
  130. package/lib/signals.js +497 -0
  131. package/lib/signals.js.map +1 -0
  132. package/lib/store.d.ts +791 -0
  133. package/lib/store.d.ts.map +1 -0
  134. package/lib/store.js +3266 -0
  135. package/lib/store.js.map +1 -0
  136. package/lib/tools.d.ts +7 -0
  137. package/lib/tools.d.ts.map +1 -0
  138. package/lib/tools.js +443 -0
  139. package/lib/tools.js.map +1 -0
  140. package/lib/types.d.ts +831 -0
  141. package/lib/types.d.ts.map +1 -0
  142. package/lib/types.js +29 -0
  143. package/lib/types.js.map +1 -0
  144. package/lib/version.d.ts +2 -0
  145. package/lib/version.d.ts.map +1 -0
  146. package/lib/version.js +2 -0
  147. package/lib/version.js.map +1 -0
  148. package/lib/workspace.d.ts +43 -0
  149. package/lib/workspace.d.ts.map +1 -0
  150. package/lib/workspace.js +137 -0
  151. package/lib/workspace.js.map +1 -0
  152. package/package.json +101 -3
@@ -0,0 +1,180 @@
1
+ /**
2
+ * WP20 inferred-candidate model-evaluation contract.
3
+ *
4
+ * A pure, in-process queue: the only outward call is the injected
5
+ * `evaluator`. It never writes storage, delivers, notifies or admits work;
6
+ * every decision is returned to the caller, which owns persistence (the intake
7
+ * ledger) and any effect. Observe mode always yields `effect: 'none'` and only
8
+ * records `wouldAccept`.
9
+ *
10
+ * Composition with the intake ledger's Host strength grade
11
+ * (`explicit | inferred | ignore`): only `inferred` items are enqueued here
12
+ * (`strength: 'inferred'` is required). `explicit` items are admitted by the
13
+ * deterministic gate without a model call, and `ignore` items are filtered.
14
+ */
15
+ /** Ordered weakest → strongest. A model verdict may lower, never raise, the Host ceiling. */
16
+ export declare const INTAKE_EVALUATION_LEVELS: readonly ["ignore", "digest", "notify", "accept"];
17
+ export type IntakeEvaluationLevel = typeof INTAKE_EVALUATION_LEVELS[number];
18
+ export type IntakeEvaluationMode = 'observe' | 'auto';
19
+ export declare const INTAKE_EVALUATION_REASONS: readonly ["source-unauthenticated", "ceiling-ignore", "malformed-output", "quote-bound-exceeded", "quote-missing", "quote-not-in-source", "upgrade-clamped", "consecutive-failures"];
20
+ export type IntakeEvaluationReason = typeof INTAKE_EVALUATION_REASONS[number];
21
+ /** One inferred candidate matched by one Policy rule. */
22
+ export interface InferredIntakeCandidate {
23
+ readonly candidateId: string;
24
+ readonly ruleId: string;
25
+ /** Host strength grade; only `inferred` is model-evaluated. */
26
+ readonly strength: 'inferred';
27
+ /** Policy version the Host matched `ruleId` and computed `ceiling` under. */
28
+ readonly policyVersion: string;
29
+ /** Host-authenticated source text; quotes are checked against exactly this string. */
30
+ readonly sourceText: string;
31
+ /** Host-attested SHA-256 hex of the UTF-8 `sourceText`. */
32
+ readonly sourceDigest: string;
33
+ /** Host-computed strength; the evaluation result is clamped to it. */
34
+ readonly ceiling: IntakeEvaluationLevel;
35
+ }
36
+ export interface IntakeModelRequest {
37
+ readonly candidateId: string;
38
+ readonly ruleId: string;
39
+ readonly policyVersion: string;
40
+ readonly sourceText: string;
41
+ readonly ceiling: IntakeEvaluationLevel;
42
+ readonly signal: AbortSignal;
43
+ }
44
+ /** Expected evaluator output shape; anything else is `malformed-output`. */
45
+ export interface IntakeModelVerdict {
46
+ readonly level: IntakeEvaluationLevel;
47
+ readonly quotes: readonly string[];
48
+ }
49
+ export type IntakeModelEvaluator = (request: IntakeModelRequest) => Promise<unknown>;
50
+ export interface IntakeEvaluationDecision {
51
+ readonly candidateId: string;
52
+ readonly ruleId: string;
53
+ readonly sourceDigest: string;
54
+ readonly policyVersion: string;
55
+ readonly mode: IntakeEvaluationMode;
56
+ readonly status: 'decided' | 'unavailable';
57
+ readonly level: IntakeEvaluationLevel;
58
+ /** The model's raw level when it was well-formed, else `null`. */
59
+ readonly proposedLevel: IntakeEvaluationLevel | null;
60
+ readonly ceiling: IntakeEvaluationLevel;
61
+ /** Only verified quotes; empty whenever any quote failed verification. */
62
+ readonly quotes: readonly string[];
63
+ readonly reasons: readonly IntakeEvaluationReason[];
64
+ readonly wouldAccept: boolean;
65
+ /** `apply` only in auto mode for a decided, non-ignore level. */
66
+ readonly effect: 'none' | 'apply';
67
+ readonly attempts: number;
68
+ readonly decidedAt: number;
69
+ }
70
+ export type IntakeEnqueueResult = {
71
+ readonly state: 'queued';
72
+ readonly prior?: 'adopted' | 'rejected';
73
+ } | {
74
+ readonly state: 'duplicate';
75
+ } | {
76
+ readonly state: 'decided';
77
+ readonly decision: IntakeEvaluationDecision;
78
+ } | {
79
+ readonly state: 'rejected';
80
+ readonly reason: 'invalid-candidate' | 'stale-policy' | 'conflict' | 'queue-full';
81
+ };
82
+ export interface IntakeEvaluationOptions {
83
+ readonly evaluator: IntakeModelEvaluator;
84
+ /** Current Policy version, read at enqueue, dispatch and completion. */
85
+ readonly policyVersion: () => string;
86
+ readonly mode: () => IntakeEvaluationMode;
87
+ readonly now?: () => number;
88
+ readonly setTimer?: (ms: number, callback: () => void) => () => void;
89
+ /** Capped at the 32-bit timer maximum so it never wraps to an immediate timeout. */
90
+ readonly timeoutMs?: number;
91
+ readonly maxConsecutiveFailures?: number;
92
+ readonly backoffBaseMs?: number;
93
+ readonly backoffMaxMs?: number;
94
+ /** Sliding-window call budget; timed-out and failed calls count. */
95
+ readonly budget?: {
96
+ readonly maxCalls: number;
97
+ readonly windowMs: number;
98
+ };
99
+ readonly maxPerRun?: number;
100
+ /** Bound on not-yet-decided candidates for the current Policy version. */
101
+ readonly maxPending?: number;
102
+ /** Bound on all retained entries; the oldest settled or stale entries are evicted first. */
103
+ readonly maxRetained?: number;
104
+ readonly maxQuotes?: number;
105
+ /** Per-quote bound in UTF-16 code units. */
106
+ readonly maxQuoteChars?: number;
107
+ }
108
+ export interface IntakeEvaluationInspection {
109
+ readonly queued: number;
110
+ readonly decided: number;
111
+ readonly unavailable: number;
112
+ /** Entries matched under an older Policy version; re-enqueue under the current one to re-evaluate. */
113
+ readonly awaitingRematch: number;
114
+ readonly callsInWindow: number;
115
+ readonly budgetExhausted: boolean;
116
+ }
117
+ /**
118
+ * Evaluates each (candidate, rule) exactly once per Policy version.
119
+ *
120
+ * - Budget: at most `budget.maxCalls` evaluator calls per sliding window; when
121
+ * exhausted, due items stay queued untouched. Late results after a timeout
122
+ * are discarded; the call was already charged at dispatch.
123
+ * - Failure (timeout, throw, rejection): re-queued with exponential backoff
124
+ * capped at `backoffMaxMs`; the `maxConsecutiveFailures`-th consecutive
125
+ * failure settles as `unavailable` (level `ignore`, no effect).
126
+ * - Policy staleness: a candidate carries the Policy version its rule and
127
+ * ceiling were matched under. A result whose Policy version changed during
128
+ * the call is discarded; entries (settled or not) on an older version are
129
+ * never evaluated or returned and wait for the Host to re-enqueue the
130
+ * candidate as re-matched under the current version, which replaces them.
131
+ */
132
+ export declare class InferredIntakeEvaluationQueue {
133
+ #private;
134
+ constructor(options: IntakeEvaluationOptions);
135
+ /**
136
+ * Queue one candidate/rule matched under the current Policy version.
137
+ * `prior` re-seeds a decision persisted by the caller (e.g. after restart)
138
+ * so the rule is not evaluated again. It is not authenticated (the caller's
139
+ * ledger is the trust root) but must be internally consistent with this
140
+ * candidate; it is rebuilt from its checked fields, and an inconsistent
141
+ * prior is reported as `prior: 'rejected'` and the candidate is evaluated.
142
+ */
143
+ enqueue(candidate: InferredIntakeCandidate, prior?: IntakeEvaluationDecision): IntakeEnqueueResult;
144
+ /**
145
+ * Current-version decision for one candidate/rule, if settled. `effect`
146
+ * reflects the current mode: outside auto mode it is always `none`.
147
+ */
148
+ decision(candidateId: string, ruleId: string): IntakeEvaluationDecision | undefined;
149
+ inspect(): IntakeEvaluationInspection;
150
+ /**
151
+ * Evaluate up to `maxPerRun` due current-version items sequentially and
152
+ * return the decisions settled in this run. Re-entrant calls return `[]`.
153
+ */
154
+ runDue(): Promise<IntakeEvaluationDecision[]>;
155
+ }
156
+ /**
157
+ * One persisted evaluation of one intake row under one rule and Policy
158
+ * version (schema 11). Quotes are stored only as UTF-16 `[start, end)` spans
159
+ * into the authenticated source text, so no body excerpt reaches disk; a
160
+ * holder of the same text can rebuild them, everyone else sees offsets only.
161
+ */
162
+ export interface WorkItemIntakeEvaluationRecord {
163
+ readonly source: string;
164
+ readonly sourceEventId: string;
165
+ readonly ruleId: string;
166
+ readonly policyVersion: string;
167
+ readonly sourceDigest: string;
168
+ readonly mode: IntakeEvaluationMode;
169
+ readonly status: IntakeEvaluationDecision['status'];
170
+ readonly level: IntakeEvaluationLevel;
171
+ readonly proposedLevel: IntakeEvaluationLevel | null;
172
+ readonly ceiling: IntakeEvaluationLevel;
173
+ readonly quoteSpans: readonly (readonly [number, number])[];
174
+ readonly reasons: readonly IntakeEvaluationReason[];
175
+ readonly wouldAccept: boolean;
176
+ readonly attempts: number;
177
+ readonly decidedAt: number;
178
+ readonly recordedAt: number;
179
+ }
180
+ //# sourceMappingURL=intake-evaluation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intake-evaluation.d.ts","sourceRoot":"","sources":["../src/intake-evaluation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,440 @@
1
+ import { createHash } from 'node:crypto';
2
+ /**
3
+ * WP20 inferred-candidate model-evaluation contract.
4
+ *
5
+ * A pure, in-process queue: the only outward call is the injected
6
+ * `evaluator`. It never writes storage, delivers, notifies or admits work;
7
+ * every decision is returned to the caller, which owns persistence (the intake
8
+ * ledger) and any effect. Observe mode always yields `effect: 'none'` and only
9
+ * records `wouldAccept`.
10
+ *
11
+ * Composition with the intake ledger's Host strength grade
12
+ * (`explicit | inferred | ignore`): only `inferred` items are enqueued here
13
+ * (`strength: 'inferred'` is required). `explicit` items are admitted by the
14
+ * deterministic gate without a model call, and `ignore` items are filtered.
15
+ */
16
+ /** Ordered weakest → strongest. A model verdict may lower, never raise, the Host ceiling. */
17
+ export const INTAKE_EVALUATION_LEVELS = ['ignore', 'digest', 'notify', 'accept'];
18
+ export const INTAKE_EVALUATION_REASONS = [
19
+ 'source-unauthenticated',
20
+ 'ceiling-ignore',
21
+ 'malformed-output',
22
+ 'quote-bound-exceeded',
23
+ 'quote-missing',
24
+ 'quote-not-in-source',
25
+ 'upgrade-clamped',
26
+ 'consecutive-failures',
27
+ ];
28
+ const MAX_TIMER_MS = 2_147_483_647;
29
+ const rank = (level) => INTAKE_EVALUATION_LEVELS.indexOf(level);
30
+ const isLevel = (value) => typeof value === 'string' && INTAKE_EVALUATION_LEVELS.includes(value);
31
+ const isReason = (value) => typeof value === 'string' && INTAKE_EVALUATION_REASONS.includes(value);
32
+ const sha256 = (text) => createHash('sha256').update(text, 'utf8').digest('hex');
33
+ const keyOf = (c) => `${c.candidateId}\0${c.ruleId}`;
34
+ const positive = (value, fallback) => value !== undefined && Number.isSafeInteger(value) && value > 0 ? value : fallback;
35
+ const defaultTimer = (ms, callback) => {
36
+ const handle = setTimeout(callback, ms);
37
+ handle.unref?.();
38
+ return () => clearTimeout(handle);
39
+ };
40
+ const TIMEOUT = Symbol('timeout');
41
+ /**
42
+ * Evaluates each (candidate, rule) exactly once per Policy version.
43
+ *
44
+ * - Budget: at most `budget.maxCalls` evaluator calls per sliding window; when
45
+ * exhausted, due items stay queued untouched. Late results after a timeout
46
+ * are discarded; the call was already charged at dispatch.
47
+ * - Failure (timeout, throw, rejection): re-queued with exponential backoff
48
+ * capped at `backoffMaxMs`; the `maxConsecutiveFailures`-th consecutive
49
+ * failure settles as `unavailable` (level `ignore`, no effect).
50
+ * - Policy staleness: a candidate carries the Policy version its rule and
51
+ * ceiling were matched under. A result whose Policy version changed during
52
+ * the call is discarded; entries (settled or not) on an older version are
53
+ * never evaluated or returned and wait for the Host to re-enqueue the
54
+ * candidate as re-matched under the current version, which replaces them.
55
+ */
56
+ export class InferredIntakeEvaluationQueue {
57
+ #evaluator;
58
+ #policyVersion;
59
+ #mode;
60
+ #now;
61
+ #setTimer;
62
+ #timeoutMs;
63
+ #maxFailures;
64
+ #backoffBaseMs;
65
+ #backoffMaxMs;
66
+ #maxCalls;
67
+ #windowMs;
68
+ #maxPerRun;
69
+ #maxPending;
70
+ #maxRetained;
71
+ #maxQuotes;
72
+ #maxQuoteChars;
73
+ #entries = new Map();
74
+ #calls = [];
75
+ #seq = 0;
76
+ #running = false;
77
+ constructor(options) {
78
+ this.#evaluator = options.evaluator;
79
+ this.#policyVersion = options.policyVersion;
80
+ this.#mode = options.mode;
81
+ this.#now = options.now ?? (() => Date.now());
82
+ this.#setTimer = options.setTimer ?? defaultTimer;
83
+ this.#timeoutMs = Math.min(positive(options.timeoutMs, 30_000), MAX_TIMER_MS);
84
+ this.#maxFailures = positive(options.maxConsecutiveFailures, 3);
85
+ this.#backoffBaseMs = positive(options.backoffBaseMs, 1_000);
86
+ this.#backoffMaxMs = Math.max(this.#backoffBaseMs, positive(options.backoffMaxMs, 60_000));
87
+ this.#maxCalls = positive(options.budget?.maxCalls, 20);
88
+ this.#windowMs = positive(options.budget?.windowMs, 3_600_000);
89
+ this.#maxPerRun = positive(options.maxPerRun, 5);
90
+ this.#maxPending = positive(options.maxPending, 1_000);
91
+ this.#maxRetained = Math.max(this.#maxPending, positive(options.maxRetained, 10_000));
92
+ this.#maxQuotes = positive(options.maxQuotes, 4);
93
+ this.#maxQuoteChars = positive(options.maxQuoteChars, 280);
94
+ }
95
+ /**
96
+ * Queue one candidate/rule matched under the current Policy version.
97
+ * `prior` re-seeds a decision persisted by the caller (e.g. after restart)
98
+ * so the rule is not evaluated again. It is not authenticated (the caller's
99
+ * ledger is the trust root) but must be internally consistent with this
100
+ * candidate; it is rebuilt from its checked fields, and an inconsistent
101
+ * prior is reported as `prior: 'rejected'` and the candidate is evaluated.
102
+ */
103
+ enqueue(candidate, prior) {
104
+ const frozen = snapshotCandidate(candidate);
105
+ if (!frozen)
106
+ return { state: 'rejected', reason: 'invalid-candidate' };
107
+ const version = this.#policyVersion();
108
+ if (frozen.policyVersion !== version)
109
+ return { state: 'rejected', reason: 'stale-policy' };
110
+ if (sha256(frozen.sourceText) !== frozen.sourceDigest) {
111
+ // Not retained: an authentic re-enqueue for the same key must not be blocked.
112
+ return { state: 'decided', decision: this.#build(frozen, 0, 'decided', 'ignore', null, [], ['source-unauthenticated']) };
113
+ }
114
+ const key = keyOf(frozen);
115
+ const existing = this.#entries.get(key);
116
+ if (existing && existing.candidate.policyVersion === version) {
117
+ const same = existing.candidate.sourceText === frozen.sourceText
118
+ && existing.candidate.sourceDigest === frozen.sourceDigest
119
+ && existing.candidate.ceiling === frozen.ceiling;
120
+ return same ? { state: 'duplicate' } : { state: 'rejected', reason: 'conflict' };
121
+ }
122
+ // Any existing entry is from an older Policy version: the re-match replaces it.
123
+ const adopted = prior === undefined ? undefined : this.#adoptPrior(frozen, prior);
124
+ const settlesNow = adopted !== undefined || frozen.ceiling === 'ignore';
125
+ if (!settlesNow && this.#pendingCount(version) >= this.#maxPending)
126
+ return { state: 'rejected', reason: 'queue-full' };
127
+ if (existing)
128
+ this.#entries.delete(key);
129
+ else if (!this.#makeRoom(version))
130
+ return { state: 'rejected', reason: 'queue-full' };
131
+ const entry = { candidate: frozen, seq: this.#seq++, state: 'queued', failures: 0, attempts: 0, nextAt: this.#now(), decision: undefined };
132
+ this.#entries.set(key, entry);
133
+ if (adopted) {
134
+ entry.state = 'decided';
135
+ entry.decision = adopted;
136
+ entry.attempts = adopted.attempts;
137
+ return { state: 'queued', prior: 'adopted' };
138
+ }
139
+ if (frozen.ceiling === 'ignore') {
140
+ // Nothing a downgrade-only model could change; do not spend budget.
141
+ return { state: 'decided', decision: this.#settle(entry, 'decided', 'ignore', null, [], ['ceiling-ignore']) };
142
+ }
143
+ return prior === undefined ? { state: 'queued' } : { state: 'queued', prior: 'rejected' };
144
+ }
145
+ /**
146
+ * Current-version decision for one candidate/rule, if settled. `effect`
147
+ * reflects the current mode: outside auto mode it is always `none`.
148
+ */
149
+ decision(candidateId, ruleId) {
150
+ const entry = this.#entries.get(keyOf({ candidateId, ruleId }));
151
+ const decision = entry?.state === 'decided' ? entry.decision : undefined;
152
+ if (!decision || entry?.candidate.policyVersion !== this.#policyVersion())
153
+ return undefined;
154
+ return decision.effect === 'apply' && this.#mode() !== 'auto' ? Object.freeze({ ...decision, effect: 'none' }) : decision;
155
+ }
156
+ inspect() {
157
+ this.#pruneCalls();
158
+ const version = this.#policyVersion();
159
+ let queued = 0, decided = 0, unavailable = 0, awaitingRematch = 0;
160
+ for (const entry of this.#entries.values()) {
161
+ if (entry.candidate.policyVersion !== version)
162
+ awaitingRematch++;
163
+ else if (entry.state !== 'decided')
164
+ queued++;
165
+ else if (entry.decision?.status === 'unavailable')
166
+ unavailable++;
167
+ else
168
+ decided++;
169
+ }
170
+ return { queued, decided, unavailable, awaitingRematch, callsInWindow: this.#calls.length, budgetExhausted: this.#calls.length >= this.#maxCalls };
171
+ }
172
+ /**
173
+ * Evaluate up to `maxPerRun` due current-version items sequentially and
174
+ * return the decisions settled in this run. Re-entrant calls return `[]`.
175
+ */
176
+ async runDue() {
177
+ if (this.#running)
178
+ return [];
179
+ this.#running = true;
180
+ try {
181
+ const version = this.#policyVersion();
182
+ const now = this.#now();
183
+ const due = [...this.#entries.values()]
184
+ .filter(entry => entry.state === 'queued' && entry.candidate.policyVersion === version && entry.nextAt <= now)
185
+ .sort((a, b) => a.nextAt - b.nextAt || a.seq - b.seq)
186
+ .slice(0, this.#maxPerRun);
187
+ const settled = [];
188
+ for (const entry of due) {
189
+ // Re-check after every await: the entry may have been replaced or the Policy moved on.
190
+ if (this.#entries.get(keyOf(entry.candidate)) !== entry || entry.state !== 'queued'
191
+ || entry.candidate.policyVersion !== this.#policyVersion())
192
+ continue;
193
+ this.#pruneCalls();
194
+ if (this.#calls.length >= this.#maxCalls)
195
+ break;
196
+ const decision = await this.#evaluate(entry);
197
+ if (decision)
198
+ settled.push(decision);
199
+ }
200
+ return settled;
201
+ }
202
+ finally {
203
+ this.#running = false;
204
+ }
205
+ }
206
+ async #evaluate(entry) {
207
+ const { candidate } = entry;
208
+ const version = candidate.policyVersion;
209
+ entry.state = 'inflight';
210
+ try {
211
+ entry.attempts++;
212
+ this.#calls.push(this.#now());
213
+ const controller = new AbortController();
214
+ let cancel = () => { };
215
+ const timeout = new Promise(resolve => {
216
+ cancel = this.#setTimer(this.#timeoutMs, () => { controller.abort(); resolve(TIMEOUT); });
217
+ });
218
+ let output;
219
+ try {
220
+ output = await Promise.race([
221
+ Promise.resolve().then(() => this.#evaluator({
222
+ candidateId: candidate.candidateId,
223
+ ruleId: candidate.ruleId,
224
+ policyVersion: version,
225
+ sourceText: candidate.sourceText,
226
+ ceiling: candidate.ceiling,
227
+ signal: controller.signal,
228
+ })),
229
+ timeout,
230
+ ]);
231
+ }
232
+ catch {
233
+ output = TIMEOUT;
234
+ }
235
+ finally {
236
+ cancel();
237
+ }
238
+ if (this.#policyVersion() !== version) {
239
+ // The Policy changed under the call: the verdict, rule match and
240
+ // ceiling all belong to a dead version. Wait for the Host's re-match.
241
+ entry.state = 'queued';
242
+ entry.failures = 0;
243
+ return undefined;
244
+ }
245
+ if (output === TIMEOUT) {
246
+ entry.failures++;
247
+ if (entry.failures >= this.#maxFailures) {
248
+ return this.#settle(entry, 'unavailable', 'ignore', null, [], ['consecutive-failures']);
249
+ }
250
+ entry.nextAt = this.#now() + Math.min(this.#backoffBaseMs * 2 ** (entry.failures - 1), this.#backoffMaxMs);
251
+ entry.state = 'queued';
252
+ return undefined;
253
+ }
254
+ entry.failures = 0;
255
+ const verdict = this.#judge(candidate, output);
256
+ return this.#settle(entry, 'decided', verdict.level, verdict.proposed, verdict.quotes, verdict.reasons);
257
+ }
258
+ finally {
259
+ // A throwing Host callback must not strand the entry in flight forever.
260
+ if (entry.state === 'inflight')
261
+ entry.state = 'queued';
262
+ }
263
+ }
264
+ #judge(candidate, output) {
265
+ const ignore = (proposed, reason) => ({ level: 'ignore', proposed, quotes: [], reasons: [reason] });
266
+ let level;
267
+ let read;
268
+ try {
269
+ if (typeof output !== 'object' || output === null)
270
+ return ignore(null, 'malformed-output');
271
+ // Read each field exactly once so getters/proxies cannot change answers between checks.
272
+ const record = output;
273
+ level = record.level;
274
+ if (!isLevel(level))
275
+ return ignore(null, 'malformed-output');
276
+ read = this.#readQuotes(record.quotes);
277
+ }
278
+ catch {
279
+ return ignore(null, 'malformed-output');
280
+ }
281
+ if (!read.ok)
282
+ return ignore(read.reason === 'malformed-output' ? null : level, read.reason);
283
+ const quotes = read.quotes;
284
+ if (!quotes.every(q => candidate.sourceText.includes(q)))
285
+ return ignore(level, 'quote-not-in-source');
286
+ if (level !== 'ignore' && quotes.length === 0)
287
+ return ignore(level, 'quote-missing');
288
+ if (rank(level) > rank(candidate.ceiling)) {
289
+ return { level: candidate.ceiling, proposed: level, quotes, reasons: ['upgrade-clamped'] };
290
+ }
291
+ return { level, proposed: level, quotes, reasons: [] };
292
+ }
293
+ /**
294
+ * Copy a quote list once by index (so sparse arrays cannot skip checks).
295
+ * Each quote must be a well-formed (no lone surrogate) string containing at
296
+ * least one non-whitespace character; bounds are count and UTF-16 length.
297
+ */
298
+ #readQuotes(value) {
299
+ if (!Array.isArray(value))
300
+ return { ok: false, reason: 'malformed-output' };
301
+ const length = value.length;
302
+ if (length > this.#maxQuotes)
303
+ return { ok: false, reason: 'quote-bound-exceeded' };
304
+ const quotes = [];
305
+ for (let i = 0; i < length; i++) {
306
+ const quote = value[i];
307
+ if (typeof quote !== 'string' || !quote.isWellFormed() || !/\S/u.test(quote))
308
+ return { ok: false, reason: 'malformed-output' };
309
+ if (quote.length > this.#maxQuoteChars)
310
+ return { ok: false, reason: 'quote-bound-exceeded' };
311
+ quotes.push(quote);
312
+ }
313
+ return { ok: true, quotes };
314
+ }
315
+ #adoptPrior(candidate, prior) {
316
+ try {
317
+ if (typeof prior !== 'object' || prior === null)
318
+ return undefined;
319
+ const p = prior;
320
+ const { mode, status, level, proposedLevel, attempts, decidedAt } = p;
321
+ if (p.candidateId !== candidate.candidateId || p.ruleId !== candidate.ruleId || p.sourceDigest !== candidate.sourceDigest
322
+ || p.policyVersion !== candidate.policyVersion || p.ceiling !== candidate.ceiling)
323
+ return undefined;
324
+ if (mode !== 'observe' && mode !== 'auto')
325
+ return undefined;
326
+ if (status !== 'decided' && status !== 'unavailable')
327
+ return undefined;
328
+ if (!isLevel(level) || rank(level) > rank(candidate.ceiling))
329
+ return undefined;
330
+ if (proposedLevel !== null && !isLevel(proposedLevel))
331
+ return undefined;
332
+ if (typeof attempts !== 'number' || !Number.isSafeInteger(attempts) || attempts < 0)
333
+ return undefined;
334
+ if (typeof decidedAt !== 'number' || !Number.isFinite(decidedAt))
335
+ return undefined;
336
+ const read = this.#readQuotes(p.quotes);
337
+ if (!read.ok || !read.quotes.every(q => candidate.sourceText.includes(q)))
338
+ return undefined;
339
+ const rawReasons = p.reasons;
340
+ if (!Array.isArray(rawReasons))
341
+ return undefined;
342
+ const reasons = [];
343
+ for (let i = 0; i < rawReasons.length; i++) {
344
+ const reason = rawReasons[i];
345
+ if (!isReason(reason) || reason === 'source-unauthenticated')
346
+ return undefined;
347
+ reasons.push(reason);
348
+ }
349
+ const failedOut = reasons.includes('consecutive-failures');
350
+ if ((status === 'unavailable') !== failedOut)
351
+ return undefined;
352
+ if (status === 'unavailable' && (level !== 'ignore' || read.quotes.length > 0 || reasons.length !== 1))
353
+ return undefined;
354
+ if (status === 'decided' && level !== 'ignore' && read.quotes.length === 0)
355
+ return undefined;
356
+ return this.#build(candidate, attempts, status, level, proposedLevel, read.quotes, reasons, mode, decidedAt);
357
+ }
358
+ catch {
359
+ return undefined;
360
+ }
361
+ }
362
+ #build(candidate, attempts, status, level, proposedLevel, quotes, reasons, mode = this.#mode() === 'auto' ? 'auto' : 'observe', decidedAt = this.#now()) {
363
+ return Object.freeze({
364
+ candidateId: candidate.candidateId,
365
+ ruleId: candidate.ruleId,
366
+ sourceDigest: candidate.sourceDigest,
367
+ policyVersion: candidate.policyVersion,
368
+ mode,
369
+ status,
370
+ level,
371
+ proposedLevel,
372
+ ceiling: candidate.ceiling,
373
+ quotes: Object.freeze([...quotes]),
374
+ reasons: Object.freeze([...reasons]),
375
+ wouldAccept: status === 'decided' && level === 'accept',
376
+ effect: mode === 'auto' && status === 'decided' && level !== 'ignore' ? 'apply' : 'none',
377
+ attempts,
378
+ decidedAt,
379
+ });
380
+ }
381
+ #settle(entry, status, level, proposedLevel, quotes, reasons) {
382
+ const decision = this.#build(entry.candidate, entry.attempts, status, level, proposedLevel, quotes, reasons);
383
+ entry.state = 'decided';
384
+ entry.decision = decision;
385
+ return decision;
386
+ }
387
+ #pendingCount(version) {
388
+ let pending = 0;
389
+ for (const entry of this.#entries.values()) {
390
+ if (entry.state !== 'decided' && entry.candidate.policyVersion === version)
391
+ pending++;
392
+ }
393
+ return pending;
394
+ }
395
+ /** Evict the oldest settled or stale entry when at `maxRetained`. */
396
+ #makeRoom(version) {
397
+ if (this.#entries.size < this.#maxRetained)
398
+ return true;
399
+ for (const [key, entry] of this.#entries) {
400
+ if (entry.state === 'decided' || entry.candidate.policyVersion !== version) {
401
+ this.#entries.delete(key);
402
+ return true;
403
+ }
404
+ }
405
+ return false;
406
+ }
407
+ #pruneCalls() {
408
+ const floor = this.#now() - this.#windowMs;
409
+ this.#calls = this.#calls.filter(at => at > floor);
410
+ }
411
+ }
412
+ /** Read each field once into a frozen copy, then validate the copy. */
413
+ function snapshotCandidate(candidate) {
414
+ try {
415
+ if (typeof candidate !== 'object' || candidate === null)
416
+ return undefined;
417
+ const c = candidate;
418
+ const copy = {
419
+ candidateId: c.candidateId,
420
+ ruleId: c.ruleId,
421
+ strength: c.strength,
422
+ policyVersion: c.policyVersion,
423
+ sourceText: c.sourceText,
424
+ sourceDigest: c.sourceDigest,
425
+ ceiling: c.ceiling,
426
+ };
427
+ const valid = typeof copy.candidateId === 'string' && copy.candidateId.length > 0
428
+ && typeof copy.ruleId === 'string' && copy.ruleId.length > 0
429
+ && copy.strength === 'inferred'
430
+ && typeof copy.policyVersion === 'string' && copy.policyVersion.length > 0
431
+ && typeof copy.sourceText === 'string'
432
+ && typeof copy.sourceDigest === 'string' && /^[0-9a-f]{64}$/u.test(copy.sourceDigest)
433
+ && isLevel(copy.ceiling);
434
+ return valid ? Object.freeze(copy) : undefined;
435
+ }
436
+ catch {
437
+ return undefined;
438
+ }
439
+ }
440
+ //# sourceMappingURL=intake-evaluation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intake-evaluation.js","sourceRoot":"","sources":["../src/intake-evaluation.ts"],"names":[],"mappings":"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"}