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

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 +92 -0
  13. package/lib/authority.d.ts.map +1 -0
  14. package/lib/authority.js +205 -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 +232 -0
  107. package/lib/owner-replies.js.map +1 -0
  108. package/lib/peers.d.ts +622 -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 +625 -0
  121. package/lib/service.d.ts.map +1 -0
  122. package/lib/service.js +2388 -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 +789 -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,100 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { WorkItemError } from "./types.js";
3
+ const HOUR_MS = 3_600_000;
4
+ /** Error codes that leave the evaluation pending instead of recording a final refusal. */
5
+ const DEFERRED = new Set(['storage', 'disabled']);
6
+ const sha256 = (text) => createHash('sha256').update(text, 'utf8').digest('hex');
7
+ /** Stable decision id over the evaluated row, rule and Policy version; never the text. */
8
+ export function intakeDecisionIdFor(record) {
9
+ return `intake:${sha256(JSON.stringify(['work-items/intake-decision/v1', record.source, record.sourceEventId, record.ruleId, record.policyVersion]))}`;
10
+ }
11
+ /** Metadata-only mandate: the brief names the rule and event, never the inbound text. */
12
+ export function intakeDecisionFor(record, config, budgetRemaining) {
13
+ const ref = `${record.source}/${record.sourceEventId}/${record.ruleId}@${record.policyVersion}`;
14
+ return Object.freeze({
15
+ protocol: 'work-items/execute-decision/v1',
16
+ decisionId: intakeDecisionIdFor(record),
17
+ verdict: 'execute',
18
+ origin: 'inferred',
19
+ mode: 'auto',
20
+ policyRuleId: record.ruleId,
21
+ budgetRemaining,
22
+ mandate: Object.freeze({
23
+ kind: config.kind,
24
+ title: `Intake ${record.source}:${record.sourceEventId}`,
25
+ brief: `Inferred intake ${record.source} event ${record.sourceEventId} was accepted by rule ${record.ruleId} under Policy ${record.policyVersion}.`,
26
+ originBindingId: config.originBindingId,
27
+ acceptanceRef: `intake-evaluation:${ref}`,
28
+ }),
29
+ });
30
+ }
31
+ export class WorkItemIntakeAdmissionBridge {
32
+ #config;
33
+ #maxPerRun;
34
+ #store;
35
+ #admit;
36
+ #log;
37
+ #now;
38
+ #lastError = null;
39
+ constructor(options) {
40
+ this.#config = options.config;
41
+ this.#maxPerRun = options.maxPerRun;
42
+ this.#store = options.store;
43
+ this.#admit = options.admit;
44
+ this.#log = options.log;
45
+ this.#now = options.now ?? (() => Date.now());
46
+ }
47
+ /** One bounded pass over accepting evaluations without an admission row; never throws. */
48
+ run() {
49
+ const store = this.#store();
50
+ if (store === undefined)
51
+ return [];
52
+ const written = [];
53
+ try {
54
+ for (const evaluation of store.pendingIntakeAdmissions(this.#maxPerRun)) {
55
+ const record = this.#decide(store, evaluation);
56
+ if (record !== undefined)
57
+ written.push(record);
58
+ }
59
+ }
60
+ catch (error) {
61
+ this.#fail(error);
62
+ }
63
+ return Object.freeze(written);
64
+ }
65
+ lastError() {
66
+ return this.#lastError;
67
+ }
68
+ /** `undefined` leaves the row pending for the next wake (a transient storage failure). */
69
+ #decide(store, evaluation) {
70
+ const decisionId = intakeDecisionIdFor(evaluation);
71
+ const key = { source: evaluation.source, sourceEventId: evaluation.sourceEventId, ruleId: evaluation.ruleId, policyVersion: evaluation.policyVersion, decisionId };
72
+ if (this.#config.mode === 'observe')
73
+ return store.recordIntakeAdmission({ ...key, mode: 'observe', outcome: 'would-admit', reasonCode: null, itemId: null });
74
+ const budget = Math.max(0, this.#config.maxPerHour - store.countIntakeAdmitted(this.#now() - HOUR_MS));
75
+ let result;
76
+ try {
77
+ result = this.#admit(intakeDecisionFor(evaluation, this.#config, budget));
78
+ }
79
+ catch (error) {
80
+ // A storage fault or a closing service may clear; anything else is a final refusal under its code.
81
+ if (!(error instanceof WorkItemError) || DEFERRED.has(error.code)) {
82
+ this.#fail(error);
83
+ return undefined;
84
+ }
85
+ return store.recordIntakeAdmission({ ...key, mode: 'auto', outcome: 'refused', reasonCode: error.code, itemId: null });
86
+ }
87
+ if (result.outcome === 'refused')
88
+ return store.recordIntakeAdmission({ ...key, mode: 'auto', outcome: 'refused', reasonCode: result.reasonCode, itemId: null });
89
+ // A crash before this write re-runs the same decision id next wake and records `replayed`.
90
+ return store.recordIntakeAdmission({ ...key, mode: 'auto', outcome: result.outcome, reasonCode: null, itemId: result.item.id });
91
+ }
92
+ #fail(error) {
93
+ const message = error instanceof Error ? error.message : String(error);
94
+ const repeated = this.#lastError === message;
95
+ this.#lastError = message;
96
+ if (!repeated)
97
+ this.#log(`assistant-work-items: intake admission deferred: ${message}`);
98
+ }
99
+ }
100
+ //# sourceMappingURL=intake-admission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intake-admission.js","sourceRoot":"","sources":["../src/intake-admission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAKxC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AA+B1C,MAAM,OAAO,GAAG,SAAS,CAAA;AACzB,0FAA0F;AAC1F,MAAM,QAAQ,GAAmC,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAA;AACjF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAExF,0FAA0F;AAC1F,MAAM,UAAU,mBAAmB,CAAC,MAAqG;IACvI,OAAO,UAAU,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,+BAA+B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAA;AACxJ,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,iBAAiB,CAAC,MAAsC,EAAE,MAA6B,EAAE,eAAuB;IAC9H,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,aAAa,EAAE,CAAA;IAC/F,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,QAAQ,EAAE,gCAAgC;QAC1C,UAAU,EAAE,mBAAmB,CAAC,MAAM,CAAC;QACvC,OAAO,EAAE,SAAS;QAClB,MAAM,EAAE,UAAU;QAClB,IAAI,EAAE,MAAM;QACZ,YAAY,EAAE,MAAM,CAAC,MAAM;QAC3B,eAAe;QACf,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE,UAAU,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,aAAa,EAAE;YACxD,KAAK,EAAE,mBAAmB,MAAM,CAAC,MAAM,UAAU,MAAM,CAAC,aAAa,yBAAyB,MAAM,CAAC,MAAM,iBAAiB,MAAM,CAAC,aAAa,GAAG;YACnJ,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,aAAa,EAAE,qBAAqB,GAAG,EAAE;SAC1C,CAAC;KACH,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,OAAO,6BAA6B;IAC/B,OAAO,CAAuB;IAC9B,UAAU,CAAQ;IAClB,MAAM,CAAiC;IACvC,MAAM,CAAoE;IAC1E,IAAI,CAA2B;IAC/B,IAAI,CAAc;IAC3B,UAAU,GAAkB,IAAI,CAAA;IAEhC,YAAY,OAOX;QACC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAA;QAC7B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAA;QACnC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAA;QAC3B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAA;QAC3B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAA;QACvB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IAC/C,CAAC;IAED,0FAA0F;IAC1F,GAAG;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;QAC3B,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,CAAA;QAClC,MAAM,OAAO,GAAoC,EAAE,CAAA;QACnD,IAAI,CAAC;YACH,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;gBAC9C,IAAI,MAAM,KAAK,SAAS;oBAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAChD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC/B,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;IAED,0FAA0F;IAC1F,OAAO,CAAC,KAAoB,EAAE,UAA0C;QACtE,MAAM,UAAU,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAA;QAClD,MAAM,GAAG,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC,aAAa,EAAE,UAAU,EAAE,CAAA;QAClK,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC,qBAAqB,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5J,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,CAAC,CAAA;QACtG,IAAI,MAAmC,CAAA;QACvC,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;QAC3E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,mGAAmG;YACnG,IAAI,CAAC,CAAC,KAAK,YAAY,aAAa,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAAC,OAAO,SAAS,CAAA;YAAC,CAAC;YAC1G,OAAO,KAAK,CAAC,qBAAqB,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QACxH,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC,qBAAqB,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QAC/J,2FAA2F;QAC3F,OAAO,KAAK,CAAC,qBAAqB,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IACjI,CAAC;IAED,KAAK,CAAC,KAAc;QAClB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,KAAK,OAAO,CAAA;QAC5C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAA;QACzB,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,oDAAoD,OAAO,EAAE,CAAC,CAAA;IACzF,CAAC;CACF"}
@@ -0,0 +1,74 @@
1
+ import type { NormalizedIntakeEvaluation } from './config.ts';
2
+ import type { WorkItemIntakeRecord } from './intake.ts';
3
+ import { type IntakeEvaluationInspection, type IntakeEvaluationLevel, type IntakeModelEvaluator, type WorkItemIntakeEvaluationRecord } from './intake-evaluation.ts';
4
+ import type { WorkItemStore } from './store.ts';
5
+ /**
6
+ * WP20 stage 3: observe-only model evaluation of stored `inferred` intake rows.
7
+ *
8
+ * The ledger stores only a content digest, so the authenticated text exists
9
+ * only on the inbound path. It is held in a bounded in-memory map, never
10
+ * written; persisted results carry quote offsets, not quote text. Evaluation
11
+ * runs on the inbound call (bounded async) and on the existing scheduler wake;
12
+ * this module owns no loop or timer of its own beyond the contract's per-call
13
+ * timeout.
14
+ */
15
+ export interface WorkItemIntakeEvaluationRule {
16
+ readonly ruleId: string;
17
+ /** Host-computed strongest level this rule allows; the model may only lower it. */
18
+ readonly ceiling: IntakeEvaluationLevel;
19
+ }
20
+ export interface WorkItemIntakeEvaluationPolicy {
21
+ readonly version: string;
22
+ readonly rules: readonly WorkItemIntakeEvaluationRule[];
23
+ }
24
+ /** Host-only injectable supplier: the Policy snapshot and the model call. */
25
+ export interface WorkItemIntakeEvaluatorRegistration {
26
+ readonly protocol: 1;
27
+ /** Read synchronously at enqueue, dispatch and completion; a changed version re-queues. */
28
+ readonly policy: () => WorkItemIntakeEvaluationPolicy;
29
+ readonly evaluate: IntakeModelEvaluator;
30
+ }
31
+ export interface WorkItemIntakeEvaluationHealth extends IntakeEvaluationInspection {
32
+ readonly enabled: true;
33
+ readonly registered: boolean;
34
+ readonly policyVersion: string | null;
35
+ /** Authenticated texts held in memory for (re-)evaluation. */
36
+ readonly heldTexts: number;
37
+ /** Inferred rows not queued because the text bound was full of unsettled work. */
38
+ readonly skipped: number;
39
+ /** Settled decisions whose store write failed and awaits a backed-off retry. */
40
+ readonly unpersisted: number;
41
+ readonly persisted: Readonly<{
42
+ decided: number;
43
+ unavailable: number;
44
+ }>;
45
+ readonly lastError: string | null;
46
+ }
47
+ export declare const MAX_HELD_INTAKE_TEXTS = 256;
48
+ /** Same bound Delivery applies to the transient inbound text, in UTF-16 code units. */
49
+ export declare const MAX_INTAKE_SOURCE_TEXT = 65536;
50
+ /** `true` when `text` is a bounded string whose SHA-256 is `digest`. */
51
+ export declare function authenticatesIntakeText(text: unknown, digest: string | null | undefined): text is string;
52
+ export declare class WorkItemIntakeEvaluationRuntime {
53
+ #private;
54
+ constructor(options: {
55
+ config: NormalizedIntakeEvaluation;
56
+ store: () => WorkItemStore | undefined;
57
+ log: (message: string) => void;
58
+ now?: () => number;
59
+ setTimer?: (ms: number, callback: () => void) => () => void;
60
+ });
61
+ /** One supplier at a time; the returned disposer drops the queue (persisted results stay). */
62
+ register(registration: WorkItemIntakeEvaluatorRegistration): () => void;
63
+ /**
64
+ * Inbound path: queue every current rule for one stored `inferred` row whose
65
+ * digest the text matches, then kick one bounded run. Synchronous enqueue,
66
+ * asynchronous evaluation; never throws.
67
+ */
68
+ observe(record: WorkItemIntakeRecord, text: string): void;
69
+ /** Scheduler wake or Host drive: re-match on a Policy change, run due items, persist results. */
70
+ run(): Promise<readonly WorkItemIntakeEvaluationRecord[]>;
71
+ health(): WorkItemIntakeEvaluationHealth;
72
+ close(): void;
73
+ }
74
+ //# sourceMappingURL=intake-evaluation-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intake-evaluation-runtime.d.ts","sourceRoot":"","sources":["../src/intake-evaluation-runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAIL,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,8BAA8B,EACpC,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAG/C;;;;;;;;;GASG;AAEH,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,mFAAmF;IACnF,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAA;CACxC;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,4BAA4B,EAAE,CAAA;CACxD;AAED,6EAA6E;AAC7E,MAAM,WAAW,mCAAmC;IAClD,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;IACpB,2FAA2F;IAC3F,QAAQ,CAAC,MAAM,EAAE,MAAM,8BAA8B,CAAA;IACrD,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAA;CACxC;AAED,MAAM,WAAW,8BAA+B,SAAQ,0BAA0B;IAChF,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAA;IACtB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IACrC,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,kFAAkF;IAClF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,gFAAgF;IAChF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACtE,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAClC;AAqBD,eAAO,MAAM,qBAAqB,MAAM,CAAA;AACxC,uFAAuF;AACvF,eAAO,MAAM,sBAAsB,QAAS,CAAA;AAO5C,wEAAwE;AACxE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,IAAI,MAAM,CAExG;AA2BD,qBAAa,+BAA+B;;gBAoB9B,OAAO,EAAE;QACnB,MAAM,EAAE,0BAA0B,CAAA;QAClC,KAAK,EAAE,MAAM,aAAa,GAAG,SAAS,CAAA;QACtC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;QAC9B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;QAClB,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAA;KAC5D;IAQD,8FAA8F;IAC9F,QAAQ,CAAC,YAAY,EAAE,mCAAmC,GAAG,MAAM,IAAI;IAuCvE;;;;OAIG;IACH,OAAO,CAAC,MAAM,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAkBzD,iGAAiG;IAC3F,GAAG,IAAI,OAAO,CAAC,SAAS,8BAA8B,EAAE,CAAC;IA0B/D,MAAM,IAAI,8BAA8B;IAiBxC,KAAK,IAAI,IAAI;CA+Gd"}
@@ -0,0 +1,343 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { INTAKE_EVALUATION_LEVELS, InferredIntakeEvaluationQueue, } from "./intake-evaluation.js";
3
+ import { WorkItemError } from "./types.js";
4
+ const MAX_RULES = 16;
5
+ export const MAX_HELD_INTAKE_TEXTS = 256;
6
+ /** Same bound Delivery applies to the transient inbound text, in UTF-16 code units. */
7
+ export const MAX_INTAKE_SOURCE_TEXT = 65_536;
8
+ const MAX_HELD_TEXTS = MAX_HELD_INTAKE_TEXTS;
9
+ /** Failed writes back off exponentially in refreshes: 1, 2, 4, … capped at this many. */
10
+ const MAX_PERSIST_RETRY_INTERVAL = 64;
11
+ const POLICY_ID = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u;
12
+ const sha256 = (text) => createHash('sha256').update(text, 'utf8').digest('hex');
13
+ /** `true` when `text` is a bounded string whose SHA-256 is `digest`. */
14
+ export function authenticatesIntakeText(text, digest) {
15
+ return typeof text === 'string' && text.length <= MAX_INTAKE_SOURCE_TEXT && typeof digest === 'string' && sha256(text) === digest;
16
+ }
17
+ const candidateIdOf = (source, sourceEventId) => `${source}:${sourceEventId}`;
18
+ /** Read and validate one Policy snapshot; anything malformed is `undefined` (nothing is evaluated). */
19
+ function readPolicy(registration) {
20
+ try {
21
+ const raw = registration.policy();
22
+ if (typeof raw !== 'object' || raw === null)
23
+ return undefined;
24
+ const version = raw['version'], rules = raw['rules'];
25
+ if (typeof version !== 'string' || !POLICY_ID.test(version) || !Array.isArray(rules) || rules.length > MAX_RULES)
26
+ return undefined;
27
+ const seen = new Set();
28
+ const copy = [];
29
+ for (let i = 0; i < rules.length; i++) {
30
+ const rule = rules[i];
31
+ if (typeof rule !== 'object' || rule === null)
32
+ return undefined;
33
+ const ruleId = rule['ruleId'], ceiling = rule['ceiling'];
34
+ if (typeof ruleId !== 'string' || !POLICY_ID.test(ruleId) || seen.has(ruleId))
35
+ return undefined;
36
+ if (typeof ceiling !== 'string' || !INTAKE_EVALUATION_LEVELS.includes(ceiling))
37
+ return undefined;
38
+ seen.add(ruleId);
39
+ copy.push(Object.freeze({ ruleId, ceiling: ceiling }));
40
+ }
41
+ return Object.freeze({ version, rules: Object.freeze(copy) });
42
+ }
43
+ catch {
44
+ return undefined;
45
+ }
46
+ }
47
+ export class WorkItemIntakeEvaluationRuntime {
48
+ #config;
49
+ #store;
50
+ #log;
51
+ #now;
52
+ #setTimer;
53
+ #texts = new Map();
54
+ /** Held texts already queued under the current Policy version (cleared when it moves). */
55
+ #enqueued = new Set();
56
+ /** Decisions settled in the queue whose store write failed; retried on a refresh backoff. */
57
+ #unpersisted = new Map();
58
+ /** Refreshes with a readable Policy; the clock for write-retry backoff. */
59
+ #refreshes = 0;
60
+ #registration;
61
+ #queue;
62
+ #version;
63
+ #skipped = 0;
64
+ #lastError = null;
65
+ #closed = false;
66
+ constructor(options) {
67
+ this.#config = options.config;
68
+ this.#store = options.store;
69
+ this.#log = options.log;
70
+ this.#now = options.now ?? (() => Date.now());
71
+ this.#setTimer = options.setTimer;
72
+ }
73
+ /** One supplier at a time; the returned disposer drops the queue (persisted results stay). */
74
+ register(registration) {
75
+ if (this.#closed)
76
+ throw new WorkItemError('disabled', 'intake evaluation is closed');
77
+ if (registration === null || typeof registration !== 'object' || registration.protocol !== 1
78
+ || typeof registration.policy !== 'function' || typeof registration.evaluate !== 'function') {
79
+ throw new WorkItemError('invalid-input', 'intake evaluator registration is invalid');
80
+ }
81
+ if (this.#registration !== undefined)
82
+ throw new WorkItemError('invalid-state', 'an intake evaluator is already registered');
83
+ const evaluate = registration.evaluate;
84
+ this.#registration = registration;
85
+ this.#version = undefined;
86
+ this.#queue = new InferredIntakeEvaluationQueue({
87
+ evaluator: request => evaluate(request),
88
+ // An unreadable Policy maps to a version no candidate carries, so nothing runs.
89
+ policyVersion: () => readPolicy(registration)?.version ?? '\0unavailable',
90
+ mode: () => 'observe',
91
+ now: this.#now,
92
+ ...(this.#setTimer === undefined ? {} : { setTimer: this.#setTimer }),
93
+ timeoutMs: this.#config.timeoutMs,
94
+ maxConsecutiveFailures: this.#config.maxConsecutiveFailures,
95
+ maxPerRun: this.#config.maxPerRun,
96
+ budget: { maxCalls: this.#config.maxCallsPerHour, windowMs: 3_600_000 },
97
+ maxPending: MAX_HELD_TEXTS * MAX_RULES,
98
+ maxRetained: MAX_HELD_TEXTS * MAX_RULES,
99
+ });
100
+ let live = true;
101
+ return () => {
102
+ if (!live)
103
+ return;
104
+ live = false;
105
+ if (this.#registration !== registration)
106
+ return;
107
+ this.#registration = undefined;
108
+ this.#queue = undefined;
109
+ this.#version = undefined;
110
+ // Without a supplier nothing can evaluate the held texts; do not keep bodies around.
111
+ this.#texts.clear();
112
+ this.#enqueued.clear();
113
+ this.#unpersisted.clear();
114
+ };
115
+ }
116
+ /**
117
+ * Inbound path: queue every current rule for one stored `inferred` row whose
118
+ * digest the text matches, then kick one bounded run. Synchronous enqueue,
119
+ * asynchronous evaluation; never throws.
120
+ */
121
+ observe(record, text) {
122
+ try {
123
+ if (this.#closed || this.#queue === undefined)
124
+ return;
125
+ if (record.decision !== 'stored' || record.strength !== 'inferred')
126
+ return;
127
+ if (!authenticatesIntakeText(text, record.contentDigest))
128
+ return;
129
+ const id = candidateIdOf(record.source, record.sourceEventId);
130
+ const held = Object.freeze({ source: record.source, sourceEventId: record.sourceEventId, text, digest: record.contentDigest });
131
+ if (!this.#texts.has(id) && !this.#makeRoom()) {
132
+ this.#skipped++;
133
+ return;
134
+ }
135
+ this.#texts.delete(id);
136
+ this.#texts.set(id, held);
137
+ // Queues this text (and any held text not yet queued under the current Policy).
138
+ this.#refresh();
139
+ void this.run();
140
+ }
141
+ catch (error) {
142
+ this.#fail(error);
143
+ }
144
+ }
145
+ /** Scheduler wake or Host drive: re-match on a Policy change, run due items, persist results. */
146
+ async run() {
147
+ const queue = this.#queue;
148
+ if (this.#closed || queue === undefined)
149
+ return [];
150
+ try {
151
+ this.#refresh();
152
+ // Snapshot the texts this run may persist, so an unregister mid-run does not drop its results.
153
+ const texts = new Map(this.#texts);
154
+ const decisions = await queue.runDue();
155
+ const persisted = decisions.flatMap(decision => this.#persist(decision, texts));
156
+ // A Policy change during the run left entries awaiting re-match; queue them now for the next run.
157
+ if (this.#queue === queue)
158
+ this.#refresh();
159
+ else {
160
+ // Unregistered or replaced mid-run: no refresh of this queue will retry these writes,
161
+ // so drop the ones this run left behind instead of holding their quotes indefinitely.
162
+ for (const decision of decisions) {
163
+ const key = keyOf(decision);
164
+ if (this.#unpersisted.get(key)?.decision === decision)
165
+ this.#unpersisted.delete(key);
166
+ }
167
+ }
168
+ return Object.freeze(persisted);
169
+ }
170
+ catch (error) {
171
+ this.#fail(error);
172
+ return [];
173
+ }
174
+ }
175
+ health() {
176
+ const empty = { queued: 0, decided: 0, unavailable: 0, awaitingRematch: 0, callsInWindow: 0, budgetExhausted: false };
177
+ let persisted = { decided: 0, unavailable: 0 };
178
+ try {
179
+ persisted = { ...(this.#store()?.countIntakeEvaluations() ?? persisted) };
180
+ }
181
+ catch { /* reported as zero */ }
182
+ return Object.freeze({
183
+ ...(this.#queue?.inspect() ?? empty),
184
+ enabled: true,
185
+ registered: this.#registration !== undefined,
186
+ policyVersion: this.#registration === undefined ? null : readPolicy(this.#registration)?.version ?? null,
187
+ heldTexts: this.#texts.size,
188
+ skipped: this.#skipped,
189
+ unpersisted: this.#unpersisted.size,
190
+ persisted: Object.freeze(persisted),
191
+ lastError: this.#lastError,
192
+ });
193
+ }
194
+ close() {
195
+ this.#closed = true;
196
+ this.#registration = undefined;
197
+ this.#queue = undefined;
198
+ this.#texts.clear();
199
+ this.#enqueued.clear();
200
+ this.#unpersisted.clear();
201
+ }
202
+ /**
203
+ * Idempotently queue every held text not yet queued under the current
204
+ * Policy version: a version move re-queues all of them, and a text held
205
+ * while the Policy was unreadable is queued once it is readable again.
206
+ */
207
+ #refresh() {
208
+ const registration = this.#registration;
209
+ if (registration === undefined)
210
+ return;
211
+ const policy = readPolicy(registration);
212
+ if (policy === undefined) {
213
+ this.#lastError = 'policy-unavailable';
214
+ return;
215
+ }
216
+ if (this.#lastError === 'policy-unavailable')
217
+ this.#lastError = null;
218
+ const refresh = ++this.#refreshes;
219
+ for (const entry of this.#unpersisted.values())
220
+ if (entry.retryAt <= refresh)
221
+ this.#persist(entry.decision);
222
+ if (policy.version !== this.#version) {
223
+ this.#version = policy.version;
224
+ this.#enqueued.clear();
225
+ }
226
+ for (const [id, held] of this.#texts) {
227
+ if (!this.#enqueued.has(id) && this.#enqueue(held, policy))
228
+ this.#enqueued.add(id);
229
+ }
230
+ }
231
+ /** `false` when the text could not be fully queued and must be retried on the next refresh. */
232
+ #enqueue(held, policy) {
233
+ const queue = this.#queue;
234
+ const store = this.#store();
235
+ if (queue === undefined || store === undefined)
236
+ return false;
237
+ const candidateId = candidateIdOf(held.source, held.sourceEventId);
238
+ let complete = true;
239
+ for (const rule of policy.rules) {
240
+ const candidate = Object.freeze({
241
+ candidateId, ruleId: rule.ruleId, strength: 'inferred', policyVersion: policy.version,
242
+ sourceText: held.text, sourceDigest: held.digest, ceiling: rule.ceiling,
243
+ });
244
+ const stored = store.getIntakeEvaluation(held.source, held.sourceEventId, rule.ruleId, policy.version);
245
+ // A persisted result re-seeds the queue so the same row and rule is never evaluated twice.
246
+ const result = queue.enqueue(candidate, stored === undefined ? undefined : priorOf(candidateId, stored, held.text));
247
+ if (result.state === 'decided' && !result.decision.reasons.includes('source-unauthenticated'))
248
+ this.#persist(result.decision);
249
+ else if (result.state === 'rejected') {
250
+ complete = false;
251
+ if (result.reason !== 'stale-policy')
252
+ this.#lastError = `enqueue-${result.reason}`;
253
+ }
254
+ }
255
+ return complete;
256
+ }
257
+ #persist(decision, texts = this.#texts) {
258
+ const key = keyOf(decision);
259
+ const held = texts.get(decision.candidateId);
260
+ const store = this.#store();
261
+ if (held === undefined || store === undefined) {
262
+ this.#unpersisted.delete(key);
263
+ this.#lastError = 'persist-unavailable';
264
+ return [];
265
+ }
266
+ try {
267
+ const quoteSpans = decision.quotes.map(quote => {
268
+ const start = held.text.indexOf(quote);
269
+ return Object.freeze([start, start + quote.length]);
270
+ });
271
+ const { record } = store.recordIntakeEvaluation({
272
+ source: held.source, sourceEventId: held.sourceEventId, ruleId: decision.ruleId, policyVersion: decision.policyVersion,
273
+ sourceDigest: decision.sourceDigest, mode: decision.mode, status: decision.status, level: decision.level,
274
+ proposedLevel: decision.proposedLevel, ceiling: decision.ceiling, quoteSpans, reasons: decision.reasons,
275
+ wouldAccept: decision.wouldAccept, attempts: decision.attempts, decidedAt: Math.trunc(decision.decidedAt),
276
+ });
277
+ this.#unpersisted.delete(key);
278
+ return [record];
279
+ }
280
+ catch (error) {
281
+ // A transient failure (e.g. SQLITE_BUSY) is retried; a row that exists after all is final.
282
+ // An unreadable check counts as not written, so it never escapes into the caller's run.
283
+ let written = false;
284
+ try {
285
+ written = store.getIntakeEvaluation(held.source, held.sourceEventId, decision.ruleId, decision.policyVersion) !== undefined;
286
+ }
287
+ catch { /* not written */ }
288
+ const prior = this.#unpersisted.get(key);
289
+ const message = messageOf(error);
290
+ if (written)
291
+ this.#unpersisted.delete(key);
292
+ else {
293
+ const failures = (prior?.failures ?? 0) + 1;
294
+ const retryAt = this.#refreshes + Math.min(2 ** (failures - 1), MAX_PERSIST_RETRY_INTERVAL);
295
+ this.#unpersisted.set(key, Object.freeze({ decision, failures, retryAt, message }));
296
+ }
297
+ this.#fail(error, prior?.message === message);
298
+ return [];
299
+ }
300
+ }
301
+ /**
302
+ * Evict the oldest held text whose every current rule already has a
303
+ * persisted row. A decision settled in the queue but not yet written (an
304
+ * in-flight run persists only when it returns) does not count, so its
305
+ * text stays held until the result is on disk.
306
+ */
307
+ #makeRoom() {
308
+ if (this.#texts.size < MAX_HELD_TEXTS)
309
+ return true;
310
+ const policy = this.#registration === undefined ? undefined : readPolicy(this.#registration);
311
+ const store = this.#store();
312
+ if (policy === undefined || store === undefined)
313
+ return false;
314
+ for (const [id, held] of this.#texts) {
315
+ const persisted = policy.rules.every(rule => store.getIntakeEvaluation(held.source, held.sourceEventId, rule.ruleId, policy.version) !== undefined);
316
+ if (persisted) {
317
+ this.#texts.delete(id);
318
+ this.#enqueued.delete(id);
319
+ return true;
320
+ }
321
+ }
322
+ return false;
323
+ }
324
+ /** `repeated` suppresses the log line for a retry that failed with the same message as before. */
325
+ #fail(error, repeated = false) {
326
+ this.#lastError = error instanceof WorkItemError ? error.code : 'evaluation-failed';
327
+ if (!repeated)
328
+ this.#log(`assistant-work-items: intake evaluation failed: ${messageOf(error)}`);
329
+ }
330
+ }
331
+ const keyOf = (decision) => `${decision.candidateId}\0${decision.ruleId}\0${decision.policyVersion}`;
332
+ const messageOf = (error) => error instanceof Error ? error.message : String(error);
333
+ /** Rebuild a persisted result as a queue prior; quote spans are re-read from the held text. */
334
+ function priorOf(candidateId, record, text) {
335
+ return Object.freeze({
336
+ candidateId, ruleId: record.ruleId, sourceDigest: record.sourceDigest, policyVersion: record.policyVersion,
337
+ mode: record.mode, status: record.status, level: record.level, proposedLevel: record.proposedLevel, ceiling: record.ceiling,
338
+ quotes: Object.freeze(record.quoteSpans.map(([start, end]) => text.slice(start, end))),
339
+ reasons: record.reasons, wouldAccept: record.wouldAccept, effect: 'none',
340
+ attempts: record.attempts, decidedAt: record.decidedAt,
341
+ });
342
+ }
343
+ //# sourceMappingURL=intake-evaluation-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intake-evaluation-runtime.js","sourceRoot":"","sources":["../src/intake-evaluation-runtime.ts"],"names":[],"mappings":"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"}