@animalabs/agent-framework 0.31.0 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. package/README.md +204 -14
  2. package/dist/src/admission/admit.d.ts +18 -0
  3. package/dist/src/admission/admit.d.ts.map +1 -1
  4. package/dist/src/admission/admit.js +16 -3
  5. package/dist/src/admission/admit.js.map +1 -1
  6. package/dist/src/agent.d.ts +185 -78
  7. package/dist/src/agent.d.ts.map +1 -1
  8. package/dist/src/agent.js +279 -102
  9. package/dist/src/agent.js.map +1 -1
  10. package/dist/src/api/mcp-server-core.d.ts.map +1 -1
  11. package/dist/src/api/mcp-server-core.js +50 -12
  12. package/dist/src/api/mcp-server-core.js.map +1 -1
  13. package/dist/src/api/server.d.ts.map +1 -1
  14. package/dist/src/api/server.js +4 -20
  15. package/dist/src/api/server.js.map +1 -1
  16. package/dist/src/code-execution/isolate/scripts.d.ts +12 -8
  17. package/dist/src/code-execution/isolate/scripts.d.ts.map +1 -1
  18. package/dist/src/code-execution/isolate/scripts.js +24 -0
  19. package/dist/src/code-execution/isolate/scripts.js.map +1 -1
  20. package/dist/src/config-checks.d.ts +7 -0
  21. package/dist/src/config-checks.d.ts.map +1 -1
  22. package/dist/src/config-checks.js +14 -0
  23. package/dist/src/config-checks.js.map +1 -1
  24. package/dist/src/context-manager-errors.d.ts +25 -0
  25. package/dist/src/context-manager-errors.d.ts.map +1 -0
  26. package/dist/src/context-manager-errors.js +31 -0
  27. package/dist/src/context-manager-errors.js.map +1 -0
  28. package/dist/src/context-options.d.ts +67 -0
  29. package/dist/src/context-options.d.ts.map +1 -0
  30. package/dist/src/context-options.js +85 -0
  31. package/dist/src/context-options.js.map +1 -0
  32. package/dist/src/deferred-import.d.ts +93 -0
  33. package/dist/src/deferred-import.d.ts.map +1 -0
  34. package/dist/src/deferred-import.js +177 -0
  35. package/dist/src/deferred-import.js.map +1 -0
  36. package/dist/src/dendrite/audience.d.ts +223 -0
  37. package/dist/src/dendrite/audience.d.ts.map +1 -0
  38. package/dist/src/dendrite/audience.js +202 -0
  39. package/dist/src/dendrite/audience.js.map +1 -0
  40. package/dist/src/dendrite/index.d.ts +5 -3
  41. package/dist/src/dendrite/index.d.ts.map +1 -1
  42. package/dist/src/dendrite/index.js +2 -1
  43. package/dist/src/dendrite/index.js.map +1 -1
  44. package/dist/src/dendrite/presets.d.ts +10 -5
  45. package/dist/src/dendrite/presets.d.ts.map +1 -1
  46. package/dist/src/dendrite/presets.js +17 -5
  47. package/dist/src/dendrite/presets.js.map +1 -1
  48. package/dist/src/dendrite/registry.d.ts +62 -7
  49. package/dist/src/dendrite/registry.d.ts.map +1 -1
  50. package/dist/src/dendrite/registry.js +179 -10
  51. package/dist/src/dendrite/registry.js.map +1 -1
  52. package/dist/src/dendrite/types.d.ts +91 -8
  53. package/dist/src/dendrite/types.d.ts.map +1 -1
  54. package/dist/src/foreign-rounds.d.ts +69 -0
  55. package/dist/src/foreign-rounds.d.ts.map +1 -0
  56. package/dist/src/foreign-rounds.js +152 -0
  57. package/dist/src/foreign-rounds.js.map +1 -0
  58. package/dist/src/framework.d.ts +1977 -820
  59. package/dist/src/framework.d.ts.map +1 -1
  60. package/dist/src/framework.js +7571 -3457
  61. package/dist/src/framework.js.map +1 -1
  62. package/dist/src/gate/event-gate.d.ts +85 -15
  63. package/dist/src/gate/event-gate.d.ts.map +1 -1
  64. package/dist/src/gate/event-gate.js +421 -47
  65. package/dist/src/gate/event-gate.js.map +1 -1
  66. package/dist/src/gate/index.d.ts +1 -1
  67. package/dist/src/gate/index.d.ts.map +1 -1
  68. package/dist/src/gate/index.js.map +1 -1
  69. package/dist/src/gate/rule-scope.d.ts +30 -0
  70. package/dist/src/gate/rule-scope.d.ts.map +1 -0
  71. package/dist/src/gate/rule-scope.js +41 -0
  72. package/dist/src/gate/rule-scope.js.map +1 -0
  73. package/dist/src/gate/suppress-script-worker.d.ts +2 -0
  74. package/dist/src/gate/suppress-script-worker.d.ts.map +1 -0
  75. package/dist/src/gate/suppress-script-worker.js +103 -0
  76. package/dist/src/gate/suppress-script-worker.js.map +1 -0
  77. package/dist/src/gate/suppress-scripts.d.ts +105 -0
  78. package/dist/src/gate/suppress-scripts.d.ts.map +1 -0
  79. package/dist/src/gate/suppress-scripts.js +403 -0
  80. package/dist/src/gate/suppress-scripts.js.map +1 -0
  81. package/dist/src/gate/suppression-review.d.ts +143 -0
  82. package/dist/src/gate/suppression-review.d.ts.map +1 -0
  83. package/dist/src/gate/suppression-review.js +463 -0
  84. package/dist/src/gate/suppression-review.js.map +1 -0
  85. package/dist/src/gate/suppression-stats.d.ts +125 -0
  86. package/dist/src/gate/suppression-stats.d.ts.map +1 -0
  87. package/dist/src/gate/suppression-stats.js +214 -0
  88. package/dist/src/gate/suppression-stats.js.map +1 -0
  89. package/dist/src/gate/types.d.ts +135 -7
  90. package/dist/src/gate/types.d.ts.map +1 -1
  91. package/dist/src/gate/wake-onboarding.d.ts +119 -0
  92. package/dist/src/gate/wake-onboarding.d.ts.map +1 -0
  93. package/dist/src/gate/wake-onboarding.js +277 -0
  94. package/dist/src/gate/wake-onboarding.js.map +1 -0
  95. package/dist/src/held-writes.d.ts +31 -23
  96. package/dist/src/held-writes.d.ts.map +1 -1
  97. package/dist/src/held-writes.js +44 -59
  98. package/dist/src/held-writes.js.map +1 -1
  99. package/dist/src/index.d.ts +5 -2
  100. package/dist/src/index.d.ts.map +1 -1
  101. package/dist/src/index.js +3 -0
  102. package/dist/src/index.js.map +1 -1
  103. package/dist/src/jsonrpc-envelope.d.ts +69 -0
  104. package/dist/src/jsonrpc-envelope.d.ts.map +1 -0
  105. package/dist/src/jsonrpc-envelope.js +66 -0
  106. package/dist/src/jsonrpc-envelope.js.map +1 -0
  107. package/dist/src/mcpl/channel-registry.d.ts +131 -15
  108. package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
  109. package/dist/src/mcpl/channel-registry.js +290 -46
  110. package/dist/src/mcpl/channel-registry.js.map +1 -1
  111. package/dist/src/mcpl/checkpoint-manager.d.ts +2 -4
  112. package/dist/src/mcpl/checkpoint-manager.d.ts.map +1 -1
  113. package/dist/src/mcpl/checkpoint-manager.js.map +1 -1
  114. package/dist/src/mcpl/feature-set-manager.d.ts +2 -4
  115. package/dist/src/mcpl/feature-set-manager.d.ts.map +1 -1
  116. package/dist/src/mcpl/feature-set-manager.js.map +1 -1
  117. package/dist/src/mcpl/inbound-source.d.ts +2 -1
  118. package/dist/src/mcpl/inbound-source.d.ts.map +1 -1
  119. package/dist/src/mcpl/inbound-source.js +2 -1
  120. package/dist/src/mcpl/inbound-source.js.map +1 -1
  121. package/dist/src/mcpl/inference-router.d.ts +6 -6
  122. package/dist/src/mcpl/inference-router.d.ts.map +1 -1
  123. package/dist/src/mcpl/inference-router.js.map +1 -1
  124. package/dist/src/mcpl/push-coalescer.d.ts +132 -22
  125. package/dist/src/mcpl/push-coalescer.d.ts.map +1 -1
  126. package/dist/src/mcpl/push-coalescer.js +105 -15
  127. package/dist/src/mcpl/push-coalescer.js.map +1 -1
  128. package/dist/src/mcpl/push-handler.d.ts +9 -7
  129. package/dist/src/mcpl/push-handler.d.ts.map +1 -1
  130. package/dist/src/mcpl/push-handler.js.map +1 -1
  131. package/dist/src/mcpl/server-connection.d.ts +13 -10
  132. package/dist/src/mcpl/server-connection.d.ts.map +1 -1
  133. package/dist/src/mcpl/server-connection.js +134 -56
  134. package/dist/src/mcpl/server-connection.js.map +1 -1
  135. package/dist/src/mcpl/tool-classes.d.ts.map +1 -1
  136. package/dist/src/mcpl/tool-classes.js +3 -0
  137. package/dist/src/mcpl/tool-classes.js.map +1 -1
  138. package/dist/src/mcpl/types.d.ts +8 -2
  139. package/dist/src/mcpl/types.d.ts.map +1 -1
  140. package/dist/src/mcpl/types.js.map +1 -1
  141. package/dist/src/module-registry.d.ts +24 -1
  142. package/dist/src/module-registry.d.ts.map +1 -1
  143. package/dist/src/module-registry.js +68 -18
  144. package/dist/src/module-registry.js.map +1 -1
  145. package/dist/src/modules/discord/index.d.ts +45 -8
  146. package/dist/src/modules/discord/index.d.ts.map +1 -1
  147. package/dist/src/modules/discord/index.js +237 -86
  148. package/dist/src/modules/discord/index.js.map +1 -1
  149. package/dist/src/modules/history/index.d.ts +59 -0
  150. package/dist/src/modules/history/index.d.ts.map +1 -1
  151. package/dist/src/modules/history/index.js +432 -67
  152. package/dist/src/modules/history/index.js.map +1 -1
  153. package/dist/src/modules/history/semantic.d.ts +6 -5
  154. package/dist/src/modules/history/semantic.d.ts.map +1 -1
  155. package/dist/src/modules/history/semantic.js +15 -22
  156. package/dist/src/modules/history/semantic.js.map +1 -1
  157. package/dist/src/modules/workspace/disk-agreement.d.ts +1 -1
  158. package/dist/src/modules/workspace/disk-agreement.js +1 -1
  159. package/dist/src/modules/workspace/index.d.ts +28 -7
  160. package/dist/src/modules/workspace/index.d.ts.map +1 -1
  161. package/dist/src/modules/workspace/index.js +76 -22
  162. package/dist/src/modules/workspace/index.js.map +1 -1
  163. package/dist/src/notice-tags.d.ts +10 -1
  164. package/dist/src/notice-tags.d.ts.map +1 -1
  165. package/dist/src/notice-tags.js +10 -1
  166. package/dist/src/notice-tags.js.map +1 -1
  167. package/dist/src/operator-log.d.ts +36 -3
  168. package/dist/src/operator-log.d.ts.map +1 -1
  169. package/dist/src/operator-log.js +2 -2
  170. package/dist/src/operator-log.js.map +1 -1
  171. package/dist/src/presentation.d.ts +746 -0
  172. package/dist/src/presentation.d.ts.map +1 -0
  173. package/dist/src/presentation.js +1435 -0
  174. package/dist/src/presentation.js.map +1 -0
  175. package/dist/src/prose-drafts.d.ts +15 -11
  176. package/dist/src/prose-drafts.d.ts.map +1 -1
  177. package/dist/src/prose-drafts.js +16 -12
  178. package/dist/src/prose-drafts.js.map +1 -1
  179. package/dist/src/read-marks.d.ts +192 -0
  180. package/dist/src/read-marks.d.ts.map +1 -0
  181. package/dist/src/read-marks.js +242 -0
  182. package/dist/src/read-marks.js.map +1 -0
  183. package/dist/src/recovery/offline-branch.d.ts +91 -6
  184. package/dist/src/recovery/offline-branch.d.ts.map +1 -1
  185. package/dist/src/recovery/offline-branch.js +273 -29
  186. package/dist/src/recovery/offline-branch.js.map +1 -1
  187. package/dist/src/recovery/recover-cli.js +22 -3
  188. package/dist/src/recovery/recover-cli.js.map +1 -1
  189. package/dist/src/send-tools.d.ts +5 -9
  190. package/dist/src/send-tools.d.ts.map +1 -1
  191. package/dist/src/send-tools.js +40 -7
  192. package/dist/src/send-tools.js.map +1 -1
  193. package/dist/src/stored-injections.d.ts +2 -2
  194. package/dist/src/stored-injections.js +2 -2
  195. package/dist/src/stored-removal.d.ts +17 -4
  196. package/dist/src/stored-removal.d.ts.map +1 -1
  197. package/dist/src/stored-removal.js +29 -5
  198. package/dist/src/stored-removal.js.map +1 -1
  199. package/dist/src/tool-result-guard.d.ts +12 -1
  200. package/dist/src/tool-result-guard.d.ts.map +1 -1
  201. package/dist/src/tool-result-guard.js +42 -8
  202. package/dist/src/tool-result-guard.js.map +1 -1
  203. package/dist/src/tune-out/coordinator.d.ts +1159 -79
  204. package/dist/src/tune-out/coordinator.d.ts.map +1 -1
  205. package/dist/src/tune-out/coordinator.js +3709 -363
  206. package/dist/src/tune-out/coordinator.js.map +1 -1
  207. package/dist/src/tune-out/tools.d.ts +114 -17
  208. package/dist/src/tune-out/tools.d.ts.map +1 -1
  209. package/dist/src/tune-out/tools.js +87 -27
  210. package/dist/src/tune-out/tools.js.map +1 -1
  211. package/dist/src/tune-out/window-anchor.d.ts +143 -0
  212. package/dist/src/tune-out/window-anchor.d.ts.map +1 -0
  213. package/dist/src/tune-out/window-anchor.js +202 -0
  214. package/dist/src/tune-out/window-anchor.js.map +1 -0
  215. package/dist/src/types/agent.d.ts +86 -31
  216. package/dist/src/types/agent.d.ts.map +1 -1
  217. package/dist/src/types/events.d.ts +2 -0
  218. package/dist/src/types/events.d.ts.map +1 -1
  219. package/dist/src/types/framework.d.ts +43 -21
  220. package/dist/src/types/framework.d.ts.map +1 -1
  221. package/dist/src/types/module.d.ts +180 -69
  222. package/dist/src/types/module.d.ts.map +1 -1
  223. package/dist/src/types/trace.d.ts +510 -36
  224. package/dist/src/types/trace.d.ts.map +1 -1
  225. package/package.json +3 -3
  226. package/src/admission/admit.ts +32 -3
  227. package/src/agent.ts +323 -120
  228. package/src/api/mcp-server-core.ts +54 -17
  229. package/src/api/server.ts +4 -23
  230. package/src/code-execution/isolate/scripts.ts +28 -3
  231. package/src/config-checks.ts +14 -0
  232. package/src/context-manager-errors.ts +37 -0
  233. package/src/context-options.ts +96 -0
  234. package/src/deferred-import.ts +239 -0
  235. package/src/dendrite/audience.ts +315 -0
  236. package/src/dendrite/index.ts +14 -2
  237. package/src/dendrite/presets.ts +18 -6
  238. package/src/dendrite/registry.ts +209 -12
  239. package/src/dendrite/types.ts +92 -8
  240. package/src/foreign-rounds.ts +199 -0
  241. package/src/framework.ts +7814 -3585
  242. package/src/gate/event-gate.ts +428 -65
  243. package/src/gate/index.ts +3 -0
  244. package/src/gate/rule-scope.ts +45 -0
  245. package/src/gate/suppress-script-worker.ts +89 -0
  246. package/src/gate/suppress-scripts.ts +414 -0
  247. package/src/gate/suppression-review.ts +517 -0
  248. package/src/gate/suppression-stats.ts +314 -0
  249. package/src/gate/types.ts +141 -7
  250. package/src/gate/wake-onboarding.ts +309 -0
  251. package/src/held-writes.ts +49 -60
  252. package/src/index.ts +9 -2
  253. package/src/jsonrpc-envelope.ts +81 -0
  254. package/src/mcpl/channel-registry.ts +353 -85
  255. package/src/mcpl/checkpoint-manager.ts +3 -2
  256. package/src/mcpl/feature-set-manager.ts +2 -1
  257. package/src/mcpl/inbound-source.ts +2 -1
  258. package/src/mcpl/inference-router.ts +7 -4
  259. package/src/mcpl/push-coalescer.ts +193 -34
  260. package/src/mcpl/push-handler.ts +10 -5
  261. package/src/mcpl/server-connection.ts +141 -60
  262. package/src/mcpl/tool-classes.ts +3 -0
  263. package/src/mcpl/types.ts +8 -2
  264. package/src/module-registry.ts +73 -17
  265. package/src/modules/discord/index.ts +229 -81
  266. package/src/modules/history/index.ts +439 -70
  267. package/src/modules/history/semantic.ts +15 -21
  268. package/src/modules/workspace/disk-agreement.ts +1 -1
  269. package/src/modules/workspace/index.ts +85 -23
  270. package/src/notice-tags.ts +10 -1
  271. package/src/operator-log.ts +36 -3
  272. package/src/presentation.ts +1676 -0
  273. package/src/prose-drafts.ts +16 -12
  274. package/src/read-marks.ts +328 -0
  275. package/src/recovery/offline-branch.ts +346 -32
  276. package/src/recovery/recover-cli.ts +21 -3
  277. package/src/send-tools.ts +40 -7
  278. package/src/stored-injections.ts +2 -2
  279. package/src/stored-removal.ts +31 -7
  280. package/src/tool-result-guard.ts +41 -7
  281. package/src/tune-out/coordinator.ts +4089 -457
  282. package/src/tune-out/tools.ts +160 -43
  283. package/src/tune-out/window-anchor.ts +277 -0
  284. package/src/types/agent.ts +90 -31
  285. package/src/types/events.ts +2 -0
  286. package/src/types/framework.ts +43 -21
  287. package/src/types/module.ts +181 -68
  288. package/src/types/trace.ts +542 -40
  289. package/dist/src/reasoning-loss-notice.d.ts +0 -23
  290. package/dist/src/reasoning-loss-notice.d.ts.map +0 -1
  291. package/dist/src/reasoning-loss-notice.js +0 -52
  292. package/dist/src/reasoning-loss-notice.js.map +0 -1
  293. package/dist/src/reasoning-loss.d.ts +0 -24
  294. package/dist/src/reasoning-loss.d.ts.map +0 -1
  295. package/dist/src/reasoning-loss.js +0 -102
  296. package/dist/src/reasoning-loss.js.map +0 -1
  297. package/src/reasoning-loss-notice.ts +0 -64
  298. package/src/reasoning-loss.ts +0 -120
@@ -0,0 +1,403 @@
1
+ /**
2
+ * SuppressScripts — the agent's own logic for its suppress rules
3
+ * (`suppress.script`): a function `(event, state) => boolean` the rule's
4
+ * events are passed to, true hiding the event. `state` is the rule's own
5
+ * JSON object, which the script reads and changes as it likes, so a rule can
6
+ * hide what it has seen before, count, or keep a window of its own. The
7
+ * framework keeps each rule's state between events and across restarts, in
8
+ * `suppress-state.json` beside gate.json, and starts it afresh when the
9
+ * rule's script changes or the rule is removed.
10
+ *
11
+ * The scripts run on one worker thread, called synchronously from the gate
12
+ * (Atomics.wait) with a timeout, as gate.js is (gate-script.ts): a robustness
13
+ * boundary for code the agent wrote, not a security sandbox. Every failure
14
+ * lets the event go on to the rules after the script's (as a script that
15
+ * says show does): a script that throws, times out, isn't a function, or
16
+ * leaves a state that can't be kept. Its state then stays as it was, and the
17
+ * failure is counted and named in gate_status. A timeout stops the worker; a
18
+ * fresh one loads every script again, one at a time, so a script whose own
19
+ * loading hangs is set aside without the others. A script that times out
20
+ * MAX_TIMEOUTS_IN_WINDOW times in its last TIMEOUT_WINDOW runs, probes
21
+ * included, stops being run until its script changes: each timeout blocks the
22
+ * caller's thread for the timeout and a worker's restart, so neither a script
23
+ * that always hangs nor one that hangs now and then goes on costing that. A
24
+ * worker that fails to start or answer is tried again with a later event,
25
+ * each try later than the last, since a try can block for LOAD_TIMEOUT_MS.
26
+ *
27
+ * The worker starts with the first rule that has a script, so a gate with
28
+ * none runs no thread.
29
+ */
30
+ import { createHash } from 'node:crypto';
31
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
32
+ import { dirname, join } from 'node:path';
33
+ import { fileURLToPath } from 'node:url';
34
+ import { Worker } from 'node:worker_threads';
35
+ const WORKER_PATH = join(dirname(fileURLToPath(import.meta.url)), 'suppress-script-worker.js');
36
+ /** The most a rule's state may hold, as JSON (bytes). */
37
+ export const MAX_SUPPRESS_STATE_BYTES = 64 * 1024;
38
+ /** Room for an answer: the state, and the rest of the answer around it. */
39
+ const SAB_SIZE = 8 + 2 * MAX_SUPPRESS_STATE_BYTES + 16_384;
40
+ /** How long one event's call may take before the script is stopped and the event shown (ms). */
41
+ export const DEFAULT_SUPPRESS_SCRIPT_TIMEOUT_MS = 50;
42
+ /** How long compiling one script may take, the worker's start included (ms). */
43
+ const LOAD_TIMEOUT_MS = 3_000;
44
+ /** Timeouts within a script's last TIMEOUT_WINDOW runs after which it isn't run again until its script changes. */
45
+ export const MAX_TIMEOUTS_IN_WINDOW = 3;
46
+ export const TIMEOUT_WINDOW = 20;
47
+ /** How long after the worker failed to start or answer a later event first tries loading the scripts again (ms); doubled each failed try, up to the most. */
48
+ const WORKER_RETRY_MS = 5_000;
49
+ const WORKER_RETRY_MAX_MS = 5 * 60_000;
50
+ /** How soon after a state changes it's written to disk (ms), and how long a failed write waits to be tried again. */
51
+ const SAVE_DELAY_MS = 2_000;
52
+ const SAVE_RETRY_MS = 30_000;
53
+ const hashOf = (script) => createHash('sha256').update(script).digest('hex');
54
+ const message = (e) => (e instanceof Error ? e.message : String(e));
55
+ const isRecord = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
56
+ /** Saved states as read from disk: entries that aren't a script hash and an object state are skipped and named; a file of another shape throws. */
57
+ function readSaved(raw, path) {
58
+ const out = new Map();
59
+ if (!isRecord(raw) || raw.version !== 1 || !isRecord(raw.rules))
60
+ throw new Error('it holds no version 1 states');
61
+ const skipped = [];
62
+ for (const [name, entry] of Object.entries(raw.rules)) {
63
+ if (isRecord(entry) && typeof entry.script === 'string' && isRecord(entry.state))
64
+ out.set(name, { script: entry.script, state: entry.state });
65
+ else
66
+ skipped.push(name);
67
+ }
68
+ if (skipped.length > 0)
69
+ console.error(`[gate] suppress-rule states in ${path}: ${skipped.map((n) => JSON.stringify(n)).join(', ')} can't be read, so those rules start afresh`);
70
+ return out;
71
+ }
72
+ export class SuppressScripts {
73
+ opts;
74
+ /** The worker and its own shared buffer: a worker stopped after a timeout may still write to the buffer it had. */
75
+ channel;
76
+ dec = new TextDecoder();
77
+ rules = new Map();
78
+ /** States read from disk, by rule, kept until the rule with that script is synced or forgotten. */
79
+ saved = new Map();
80
+ saveTimer = null;
81
+ disposed = false;
82
+ /** Whether the first sync, with every rule in force, has run: saved states it didn't take are then retired. */
83
+ synced = false;
84
+ /** When a later event may try loading again, after loading failed for want of a worker (not a script's own error). */
85
+ workerRetryAt = null;
86
+ workerRetryDelay = WORKER_RETRY_MS;
87
+ constructor(opts = {}) {
88
+ this.opts = opts;
89
+ if (opts.statePath && existsSync(opts.statePath)) {
90
+ try {
91
+ this.saved = readSaved(JSON.parse(readFileSync(opts.statePath, 'utf-8')), opts.statePath);
92
+ }
93
+ catch (error) {
94
+ // Moved aside, so the next save doesn't write over a file a later release wrote.
95
+ const aside = `${opts.statePath}.unreadable`;
96
+ let moved = '';
97
+ try {
98
+ renameSync(opts.statePath, aside);
99
+ moved = ` It's kept as ${aside}.`;
100
+ }
101
+ catch { /* the save may yet fail too; the log says what was read */ }
102
+ console.error(`[gate] suppress-rule states in ${opts.statePath} can't be read, so every rule's state starts afresh.${moved}`, error);
103
+ }
104
+ }
105
+ }
106
+ get timeoutMs() { return this.opts.timeoutMs ?? DEFAULT_SUPPRESS_SCRIPT_TIMEOUT_MS; }
107
+ /**
108
+ * Bring the scripts in step with the rules in force: compile new and
109
+ * changed ones, drop removed ones. A rule keeps its state while its script
110
+ * is the same text; a new or changed script starts from `{}`, or from the
111
+ * state saved for that very script before a restart.
112
+ */
113
+ sync(rules) {
114
+ if (this.disposed)
115
+ return;
116
+ const wanted = new Map(rules.filter((r) => typeof r.script === 'string').map((r) => [r.name, r.script]));
117
+ let changed = false;
118
+ for (const name of [...this.rules.keys()]) {
119
+ if (wanted.get(name) !== this.rules.get(name).script) {
120
+ this.rules.delete(name);
121
+ changed = true;
122
+ }
123
+ }
124
+ for (const [name, script] of wanted) {
125
+ if (this.rules.has(name))
126
+ continue;
127
+ const hash = hashOf(script);
128
+ const saved = this.saved.get(name);
129
+ this.saved.delete(name);
130
+ this.rules.set(name, {
131
+ script, hash, state: saved && saved.script === hash ? saved.state : {}, loaded: false, disabled: null,
132
+ runs: 0, hidden: 0, errors: 0, timeouts: 0, recentRuns: [], lastError: null,
133
+ });
134
+ changed = true;
135
+ }
136
+ // States saved for rules that weren't in force at the first sync are
137
+ // retired: the rule was removed while the host was down, and one made
138
+ // later under the name starts afresh.
139
+ if (!this.synced) {
140
+ this.synced = true;
141
+ if (this.saved.size > 0) {
142
+ this.saved.clear();
143
+ changed = true;
144
+ }
145
+ }
146
+ if (!changed)
147
+ return;
148
+ this.scheduleSave();
149
+ if (this.rules.size === 0) {
150
+ this.stopWorker();
151
+ return;
152
+ }
153
+ this.load();
154
+ }
155
+ /** Forget a rule's script and state (a rule removed or redefined), a state saved for it before a restart included. */
156
+ forget(name) {
157
+ const had = this.rules.delete(name) || this.saved.delete(name);
158
+ if (had)
159
+ this.scheduleSave();
160
+ if (this.rules.size === 0)
161
+ this.stopWorker();
162
+ }
163
+ /**
164
+ * Whether `script` compiles to a function, run on the worker: an error's
165
+ * text, or null. For wake_add_rule, before it saves a rule.
166
+ */
167
+ check(script) {
168
+ const answer = this.call({ type: 'check', script }, LOAD_TIMEOUT_MS);
169
+ if ('timeout' in answer) {
170
+ this.load(); // the worker was stopped: the rules' scripts go to a fresh one
171
+ return `compiling it took over ${LOAD_TIMEOUT_MS / 1000} s`;
172
+ }
173
+ // A gate with no scripts runs no thread, this check's included.
174
+ if (this.rules.size === 0)
175
+ this.stopWorker();
176
+ return typeof answer.error === 'string' ? answer.error : null;
177
+ }
178
+ /**
179
+ * Run a rule's script for one event. `commit` keeps the state it leaves and
180
+ * counts the run; without it (a probe) the state is as before. Undefined
181
+ * when the rule has no script; `{ error }` when the script failed, and the
182
+ * event goes on to the rules after it.
183
+ */
184
+ run(name, event, commit) {
185
+ const rule = this.rules.get(name);
186
+ if (!rule)
187
+ return undefined;
188
+ if (rule.disabled)
189
+ return { error: rule.disabled };
190
+ // A load that failed for want of a worker is tried again, later each time.
191
+ if (!rule.loaded && this.workerRetryAt !== null && Date.now() >= this.workerRetryAt)
192
+ this.load();
193
+ if (!rule.loaded)
194
+ return { error: rule.lastError ?? 'the script is not loaded' };
195
+ const answer = this.call({ type: 'eval', name, event, state: rule.state }, this.timeoutMs);
196
+ if ('timeout' in answer) {
197
+ // The worker was stopped; every script goes to a fresh one. A probe's
198
+ // timeout counts toward setting the script aside too: it costs the same.
199
+ const error = `it took over ${this.timeoutMs} ms, so it was stopped`;
200
+ if (commit)
201
+ rule.runs++;
202
+ rule.timeouts++;
203
+ rule.lastError = error;
204
+ if (this.noteRun(rule, true) >= MAX_TIMEOUTS_IN_WINDOW) {
205
+ rule.disabled = `it took over ${this.timeoutMs} ms ${MAX_TIMEOUTS_IN_WINDOW} times in its last ${TIMEOUT_WINDOW} runs, so it isn't run again until its script changes`;
206
+ rule.lastError = rule.disabled;
207
+ }
208
+ this.load();
209
+ return { error };
210
+ }
211
+ this.noteRun(rule, false);
212
+ if (!commit)
213
+ return typeof answer.error === 'string' ? { error: answer.error } : { hide: answer.hide === true };
214
+ rule.runs++;
215
+ if (typeof answer.error === 'string') {
216
+ rule.errors++;
217
+ rule.lastError = answer.error;
218
+ return { error: answer.error };
219
+ }
220
+ const next = isRecord(answer.state) ? answer.state : {};
221
+ if (JSON.stringify(next) !== JSON.stringify(rule.state)) {
222
+ rule.state = next;
223
+ this.scheduleSave();
224
+ }
225
+ const hide = answer.hide === true;
226
+ if (hide)
227
+ rule.hidden++;
228
+ return { hide };
229
+ }
230
+ /** One run in the rule's recent runs: how many of them timed out. */
231
+ noteRun(rule, timedOut) {
232
+ rule.recentRuns.push(timedOut);
233
+ if (rule.recentRuns.length > TIMEOUT_WINDOW)
234
+ rule.recentRuns.shift();
235
+ return rule.recentRuns.filter(Boolean).length;
236
+ }
237
+ status(name) {
238
+ const rule = this.rules.get(name);
239
+ if (!rule)
240
+ return undefined;
241
+ return {
242
+ loaded: rule.loaded, ...(rule.disabled ? { disabled: rule.disabled } : {}),
243
+ runs: rule.runs, hidden: rule.hidden, errors: rule.errors, timeouts: rule.timeouts,
244
+ lastError: rule.lastError, stateBytes: Buffer.byteLength(JSON.stringify(rule.state)),
245
+ };
246
+ }
247
+ /** A rule's state as its script left it (a copy). */
248
+ stateOf(name) {
249
+ const rule = this.rules.get(name);
250
+ return rule ? structuredClone(rule.state) : undefined;
251
+ }
252
+ dispose() {
253
+ if (this.disposed)
254
+ return;
255
+ this.flush();
256
+ this.disposed = true;
257
+ this.stopWorker();
258
+ }
259
+ /** Write the states now, if a write is due. */
260
+ flush() {
261
+ if (!this.saveTimer)
262
+ return;
263
+ clearTimeout(this.saveTimer);
264
+ this.saveTimer = null;
265
+ this.save();
266
+ }
267
+ /**
268
+ * Load every script that isn't set aside into the worker, one at a time,
269
+ * on a clean slate. A script whose loading times out is set aside (it
270
+ * would stop the worker each time), and the rest are loaded again on the
271
+ * fresh worker that follows.
272
+ */
273
+ load() {
274
+ if (this.rules.size === 0)
275
+ return;
276
+ for (let attempt = 0; attempt <= this.rules.size; attempt++) {
277
+ const reset = this.call({ type: 'reset' }, LOAD_TIMEOUT_MS);
278
+ if ('timeout' in reset || typeof reset.error === 'string') {
279
+ const why = 'timeout' in reset ? `the script worker didn't answer within ${LOAD_TIMEOUT_MS / 1000} s` : reset.error;
280
+ for (const rule of this.rules.values()) {
281
+ rule.loaded = false;
282
+ rule.lastError = rule.disabled ?? `${why}; it's tried again with a later event`;
283
+ }
284
+ this.workerRetryAt = Date.now() + this.workerRetryDelay;
285
+ this.workerRetryDelay = Math.min(WORKER_RETRY_MAX_MS, this.workerRetryDelay * 2);
286
+ return;
287
+ }
288
+ this.workerRetryAt = null;
289
+ this.workerRetryDelay = WORKER_RETRY_MS;
290
+ let restarted = false;
291
+ for (const [name, rule] of this.rules) {
292
+ if (rule.disabled) {
293
+ rule.loaded = false;
294
+ continue;
295
+ }
296
+ const answer = this.call({ type: 'load', name, script: rule.script }, LOAD_TIMEOUT_MS);
297
+ if ('timeout' in answer) {
298
+ rule.loaded = false;
299
+ rule.disabled = `compiling it took over ${LOAD_TIMEOUT_MS / 1000} s, so it isn't run until its rule changes`;
300
+ rule.lastError = rule.disabled;
301
+ restarted = true;
302
+ break;
303
+ }
304
+ if (typeof answer.error === 'string') {
305
+ rule.loaded = false;
306
+ rule.lastError = `it doesn't compile: ${answer.error}`;
307
+ }
308
+ else {
309
+ rule.loaded = true;
310
+ }
311
+ }
312
+ if (!restarted)
313
+ return;
314
+ }
315
+ }
316
+ /** One message to the worker, waited for: its answer, or a timeout, after which the worker is stopped (the caller loads the scripts again). */
317
+ call(msg, timeoutMs) {
318
+ if (this.disposed)
319
+ return { error: 'the gate is stopped' };
320
+ const channel = this.ensureWorker();
321
+ if (!channel)
322
+ return { error: 'the script worker could not start' };
323
+ const { worker, ctrl, data } = channel;
324
+ Atomics.store(ctrl, 0, 0);
325
+ try {
326
+ worker.postMessage(msg);
327
+ }
328
+ catch (e) {
329
+ return { error: message(e) };
330
+ }
331
+ if (Atomics.wait(ctrl, 0, 0, timeoutMs) === 'timed-out') {
332
+ this.stopWorker();
333
+ return { timeout: true };
334
+ }
335
+ const length = Atomics.load(ctrl, 1);
336
+ try {
337
+ return JSON.parse(this.dec.decode(data.slice(0, length)));
338
+ }
339
+ catch {
340
+ return { error: 'the script worker gave an unreadable answer' };
341
+ }
342
+ }
343
+ ensureWorker() {
344
+ if (this.channel)
345
+ return this.channel;
346
+ try {
347
+ const sab = new SharedArrayBuffer(SAB_SIZE);
348
+ const worker = new Worker(WORKER_PATH, { workerData: { sab, maxStateBytes: MAX_SUPPRESS_STATE_BYTES } });
349
+ worker.on('error', (e) => { console.error('[gate] the suppress-script worker failed:', e); });
350
+ // A worker that dies on its own (a script's stray asynchronous throw) is
351
+ // no one's timeout: the next run loads the scripts on a fresh one.
352
+ worker.once('exit', () => {
353
+ if (this.channel?.worker !== worker)
354
+ return;
355
+ this.channel = undefined;
356
+ for (const rule of this.rules.values())
357
+ rule.loaded = false;
358
+ this.workerRetryAt = 0;
359
+ });
360
+ worker.unref();
361
+ this.channel = { worker, ctrl: new Int32Array(sab, 0, 2), data: new Uint8Array(sab, 8) };
362
+ return this.channel;
363
+ }
364
+ catch (error) {
365
+ console.error('[gate] the suppress-script worker could not start:', error);
366
+ return undefined;
367
+ }
368
+ }
369
+ stopWorker() {
370
+ if (!this.channel)
371
+ return;
372
+ void this.channel.worker.terminate().catch(() => { });
373
+ this.channel = undefined;
374
+ }
375
+ scheduleSave(delayMs = SAVE_DELAY_MS) {
376
+ if (!this.opts.statePath || this.saveTimer || this.disposed)
377
+ return;
378
+ this.saveTimer = setTimeout(() => { this.saveTimer = null; this.save(); }, delayMs);
379
+ this.saveTimer.unref?.();
380
+ }
381
+ save() {
382
+ const path = this.opts.statePath;
383
+ if (!path)
384
+ return;
385
+ // A null-prototype object, so a rule named "__proto__" is an entry like any other.
386
+ const rules = Object.create(null);
387
+ for (const [name, saved] of this.saved)
388
+ rules[name] = saved;
389
+ for (const [name, rule] of this.rules)
390
+ rules[name] = { script: rule.hash, state: rule.state };
391
+ try {
392
+ mkdirSync(dirname(path), { recursive: true });
393
+ const temp = `${path}.${process.pid}.tmp`;
394
+ writeFileSync(temp, `${JSON.stringify({ version: 1, rules }, null, 2)}\n`);
395
+ renameSync(temp, path);
396
+ }
397
+ catch (error) {
398
+ console.error(`[gate] suppress-rule states couldn't be written to ${path}; they're kept in memory and written again shortly:`, error);
399
+ this.scheduleSave(SAVE_RETRY_MS);
400
+ }
401
+ }
402
+ }
403
+ //# sourceMappingURL=suppress-scripts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suppress-scripts.js","sourceRoot":"","sources":["../../../src/gate/suppress-scripts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ import type { DetailedUsage, Membrane, NormalizedRequest } from '@animalabs/membrane';
2
+ import type { SuppressedEventRecord } from './suppression-stats.js';
3
+ import type { SuppressionReviewOptions } from './types.js';
4
+ import type { TraceEventInput } from '../types/trace.js';
5
+ export declare const DEFAULT_REVIEW_INTERVAL_MS: number;
6
+ export declare const MIN_REVIEW_INTERVAL_MS: number;
7
+ export declare const MAX_REVIEW_INTERVAL_MS: number;
8
+ export declare const DEFAULT_REVIEW_MODEL = "claude-haiku-5-5";
9
+ export declare const DEFAULT_REVIEW_MAX_EVENTS = 60;
10
+ /**
11
+ * Characters of event text the reviewer reads for one rule, shared among its
12
+ * sample: a short event takes what it needs and a long one the rest
13
+ * (eventTextCap), so what makes a long message matter past its start is
14
+ * read. Chosen, not measured: with the default sample it keeps one rule's
15
+ * request to roughly 8,000 input tokens, which a review every two hours can
16
+ * afford.
17
+ */
18
+ export declare const EVENT_TEXT_BUDGET = 24000;
19
+ /** A suppress rule as the review knows it. */
20
+ export interface ReviewRuleInfo {
21
+ name: string;
22
+ description: string;
23
+ match?: unknown;
24
+ /** The rule's script, which decides which matching events it hides. */
25
+ script?: string;
26
+ }
27
+ /** One rule's review. */
28
+ export interface RuleReview {
29
+ rule: string;
30
+ /** The description judged against: the rule's own, or its last known one for a removed rule. */
31
+ description?: string;
32
+ /** Whether gate.json has the rule now. */
33
+ inForce: boolean;
34
+ /** Events it hid in the period. */
35
+ suppressed: number;
36
+ /** Of those, how many the reviewer read. */
37
+ read: number;
38
+ /** `fits`: nothing flagged; `flagged`: some events flagged; `error`: the reviewer couldn't answer; `unjudged`: no description to judge against. */
39
+ verdict: 'fits' | 'flagged' | 'error' | 'unjudged';
40
+ flagged: SuppressedEventRecord[];
41
+ /** The reviewer's one-line note, or what went wrong. */
42
+ note?: string;
43
+ }
44
+ export interface SuppressionReviewSummary {
45
+ fromMs: number;
46
+ toMs: number;
47
+ rules: RuleReview[];
48
+ total: number;
49
+ flagged: number;
50
+ }
51
+ export interface SuppressionReviewDeps {
52
+ /** The agent whose message slot is reviewed and who is told: the primary resident. */
53
+ agentName(): string | undefined;
54
+ /** The membrane the reviewer calls for that agent (the framework's judge membrane). */
55
+ membraneFor(agentName: string): Membrane;
56
+ /** The suppressed rows stored in the agent's slot, at or after `sinceMs` and before `untilMs`, oldest first. */
57
+ records(agentName: string, sinceMs: number, untilMs: number): SuppressedEventRecord[];
58
+ /** The suppress rules in force. */
59
+ rules(): ReviewRuleInfo[];
60
+ /** Tell the agent: store the notice, and wake it when `wake`. Throws when the notice can't be written. */
61
+ deliver(agentName: string, text: string, wake: boolean, summary: SuppressionReviewSummary): void;
62
+ recordUsage?(agentName: string, usage: DetailedUsage): void;
63
+ emitTrace?(event: TraceEventInput): void;
64
+ /** Where the review keeps what it reviewed through; left out, nothing is kept and a restart starts afresh. */
65
+ statePath?: string;
66
+ /** Whether a review may run now (not while the host is quiesced or stopping); a review not run waits for the next. */
67
+ mayRun?(): boolean;
68
+ /** Whether the agent has dump_suppressed (a workspace), for the notice to point at it. */
69
+ dumpAvailable?(): boolean;
70
+ now?(): number;
71
+ }
72
+ /** The options as the review runs them: each at its default or within its bounds. */
73
+ export declare function reviewSettings(options?: SuppressionReviewOptions): {
74
+ intervalMs: number;
75
+ model: string;
76
+ notify: "always" | "flagged";
77
+ wakeOnFlag: boolean;
78
+ maxEventsPerRule: number;
79
+ timeoutMs: number;
80
+ effort: "high" | "low" | "medium" | "none";
81
+ };
82
+ /** `max` of `items`, spread evenly from the first to the last; all of them when there are no more. */
83
+ export declare function spread<T>(items: readonly T[], max: number): T[];
84
+ /**
85
+ * The most characters any event may take so that the sample fits `budget`:
86
+ * every event shorter than it is read whole, and the budget they leave is
87
+ * shared among the rest.
88
+ */
89
+ export declare function eventTextCap(lengths: readonly number[], budget: number): number;
90
+ /** The reviewer's request for one rule's events. */
91
+ export declare function reviewRequest(rule: {
92
+ name: string;
93
+ description: string;
94
+ match?: unknown;
95
+ script?: string;
96
+ }, events: readonly SuppressedEventRecord[], hidden: number, period: {
97
+ fromMs: number;
98
+ toMs: number;
99
+ }, settings: ReturnType<typeof reviewSettings>): NormalizedRequest;
100
+ /** The reviewer's answer read from its text, or undefined when it holds none this can use. */
101
+ export declare function parseReviewAnswer(text: string, count: number): {
102
+ flagged: number[];
103
+ note: string;
104
+ } | undefined;
105
+ /** The `[suppression review]` notice the agent is told; `dump` when it has dump_suppressed to point at. */
106
+ export declare function reviewNoticeText(summary: SuppressionReviewSummary, opts?: {
107
+ dump?: boolean;
108
+ }): string;
109
+ export declare class SuppressionReview {
110
+ private readonly deps;
111
+ private readonly settings;
112
+ private readonly now;
113
+ private timer;
114
+ private running;
115
+ private stopped;
116
+ private readonly inFlight;
117
+ private reviewedThrough;
118
+ private readonly retryFrom;
119
+ private readonly descriptions;
120
+ constructor(deps: SuppressionReviewDeps, options?: SuppressionReviewOptions);
121
+ /** A rule's description as it stands when it hides a row: the one its rows are judged against later, though the rule be gone by then. */
122
+ noteRule(name: string, description: string): void;
123
+ get intervalMs(): number;
124
+ get nextReviewAfter(): number;
125
+ /** Schedule reviews: the first when the interval since the last review is up, and no sooner than a minute from now. */
126
+ start(): void;
127
+ stop(): void;
128
+ private schedule;
129
+ /**
130
+ * Review what was hidden since the last review, tell the agent, and record
131
+ * how far it reviewed. A call while a review runs gets that review's
132
+ * result. Null when no review ran: no agent is registered, the host isn't
133
+ * taking one now (mayRun, asked again before the agent is told), or the
134
+ * agent changed while the reviewer was asked; the next review covers the
135
+ * period. A review whose notice couldn't be written throws, and the next
136
+ * review covers its period again.
137
+ */
138
+ runOnce(): Promise<SuppressionReviewSummary | null>;
139
+ private review;
140
+ private judge;
141
+ private saveState;
142
+ }
143
+ //# sourceMappingURL=suppression-review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suppression-review.d.ts","sourceRoot":"","sources":["../../../src/gate/suppression-review.ts"],"names":[],"mappings":"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"}