wicked-crew 0.7.46 → 0.7.48

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 (263) hide show
  1. package/dist/api/capture.d.ts +2 -2
  2. package/dist/api/chat-citations.d.ts +10 -1
  3. package/dist/api/chat-citations.d.ts.map +1 -1
  4. package/dist/api/chat-citations.js +28 -0
  5. package/dist/api/chat-citations.js.map +1 -1
  6. package/dist/api/chat-scope.d.ts +4 -2
  7. package/dist/api/chat-scope.d.ts.map +1 -1
  8. package/dist/api/chat-scope.js +35 -3
  9. package/dist/api/chat-scope.js.map +1 -1
  10. package/dist/api/chat-transcripts.d.ts +23 -1
  11. package/dist/api/chat-transcripts.d.ts.map +1 -1
  12. package/dist/api/chat-transcripts.js +61 -6
  13. package/dist/api/chat-transcripts.js.map +1 -1
  14. package/dist/api/delivery-index.d.ts +21 -0
  15. package/dist/api/delivery-index.d.ts.map +1 -1
  16. package/dist/api/delivery-index.js +36 -0
  17. package/dist/api/delivery-index.js.map +1 -1
  18. package/dist/api/elicitation-cache.d.ts +12 -0
  19. package/dist/api/elicitation-cache.d.ts.map +1 -1
  20. package/dist/api/elicitation-cache.js +17 -1
  21. package/dist/api/elicitation-cache.js.map +1 -1
  22. package/dist/api/eval-sample.d.ts +12 -12
  23. package/dist/api/governance-steering.d.ts.map +1 -1
  24. package/dist/api/governance-steering.js +1 -0
  25. package/dist/api/governance-steering.js.map +1 -1
  26. package/dist/api/mcp.d.ts +4 -4
  27. package/dist/api/policy-landing.d.ts +55 -0
  28. package/dist/api/policy-landing.d.ts.map +1 -0
  29. package/dist/api/policy-landing.js +174 -0
  30. package/dist/api/policy-landing.js.map +1 -0
  31. package/dist/api/recording.d.ts +228 -0
  32. package/dist/api/recording.d.ts.map +1 -0
  33. package/dist/api/recording.js +1140 -0
  34. package/dist/api/recording.js.map +1 -0
  35. package/dist/api/routes.d.ts +42 -39
  36. package/dist/api/routes.d.ts.map +1 -1
  37. package/dist/api/routes.js +362 -107
  38. package/dist/api/routes.js.map +1 -1
  39. package/dist/api/run-timing-index.d.ts +17 -0
  40. package/dist/api/run-timing-index.d.ts.map +1 -1
  41. package/dist/api/run-timing-index.js +43 -1
  42. package/dist/api/run-timing-index.js.map +1 -1
  43. package/dist/api/server.d.ts +27 -0
  44. package/dist/api/server.d.ts.map +1 -1
  45. package/dist/api/server.js +168 -4
  46. package/dist/api/server.js.map +1 -1
  47. package/dist/api/testing.d.ts +4 -4
  48. package/dist/api/testing.d.ts.map +1 -1
  49. package/dist/api/testing.js +3 -0
  50. package/dist/api/testing.js.map +1 -1
  51. package/dist/api/watch-routes.d.ts +30 -0
  52. package/dist/api/watch-routes.d.ts.map +1 -0
  53. package/dist/api/watch-routes.js +104 -0
  54. package/dist/api/watch-routes.js.map +1 -0
  55. package/dist/campaigns/routes.d.ts +2 -2
  56. package/dist/cli/index.d.ts.map +1 -1
  57. package/dist/cli/index.js +20 -2
  58. package/dist/cli/index.js.map +1 -1
  59. package/dist/core/adapter.d.ts +52 -1
  60. package/dist/core/adapter.d.ts.map +1 -1
  61. package/dist/core/adapter.js +193 -5
  62. package/dist/core/adapter.js.map +1 -1
  63. package/dist/core/run-identity.js +1 -1
  64. package/dist/core/run-identity.js.map +1 -1
  65. package/dist/core/walkthrough-root.d.ts +21 -0
  66. package/dist/core/walkthrough-root.d.ts.map +1 -0
  67. package/dist/core/walkthrough-root.js +66 -0
  68. package/dist/core/walkthrough-root.js.map +1 -0
  69. package/dist/decisions/chat-recorder.d.ts +129 -0
  70. package/dist/decisions/chat-recorder.d.ts.map +1 -0
  71. package/dist/decisions/chat-recorder.js +367 -0
  72. package/dist/decisions/chat-recorder.js.map +1 -0
  73. package/dist/decisions/consider.d.ts +102 -0
  74. package/dist/decisions/consider.d.ts.map +1 -0
  75. package/dist/decisions/consider.js +207 -0
  76. package/dist/decisions/consider.js.map +1 -0
  77. package/dist/decisions/derive.d.ts +79 -0
  78. package/dist/decisions/derive.d.ts.map +1 -0
  79. package/dist/decisions/derive.js +282 -0
  80. package/dist/decisions/derive.js.map +1 -0
  81. package/dist/decisions/events.d.ts +25 -0
  82. package/dist/decisions/events.d.ts.map +1 -0
  83. package/dist/decisions/events.js +24 -0
  84. package/dist/decisions/events.js.map +1 -0
  85. package/dist/decisions/ingest.d.ts +51 -0
  86. package/dist/decisions/ingest.d.ts.map +1 -0
  87. package/dist/decisions/ingest.js +100 -0
  88. package/dist/decisions/ingest.js.map +1 -0
  89. package/dist/decisions/land.d.ts +100 -0
  90. package/dist/decisions/land.d.ts.map +1 -0
  91. package/dist/decisions/land.js +466 -0
  92. package/dist/decisions/land.js.map +1 -0
  93. package/dist/decisions/ledger.d.ts +60 -0
  94. package/dist/decisions/ledger.d.ts.map +1 -0
  95. package/dist/decisions/ledger.js +246 -0
  96. package/dist/decisions/ledger.js.map +1 -0
  97. package/dist/decisions/routes.d.ts +10 -0
  98. package/dist/decisions/routes.d.ts.map +1 -0
  99. package/dist/decisions/routes.js +141 -0
  100. package/dist/decisions/routes.js.map +1 -0
  101. package/dist/decisions/rules-text.d.ts +21 -0
  102. package/dist/decisions/rules-text.d.ts.map +1 -0
  103. package/dist/decisions/rules-text.js +50 -0
  104. package/dist/decisions/rules-text.js.map +1 -0
  105. package/dist/decisions/types.d.ts +120 -0
  106. package/dist/decisions/types.d.ts.map +1 -0
  107. package/dist/decisions/types.js +19 -0
  108. package/dist/decisions/types.js.map +1 -0
  109. package/dist/editors/csp.d.ts +31 -0
  110. package/dist/editors/csp.d.ts.map +1 -0
  111. package/dist/editors/csp.js +46 -0
  112. package/dist/editors/csp.js.map +1 -0
  113. package/dist/editors/pack-install.d.ts +28 -0
  114. package/dist/editors/pack-install.d.ts.map +1 -0
  115. package/dist/editors/pack-install.js +153 -0
  116. package/dist/editors/pack-install.js.map +1 -0
  117. package/dist/editors/registry.d.ts +142 -0
  118. package/dist/editors/registry.d.ts.map +1 -0
  119. package/dist/editors/registry.js +255 -0
  120. package/dist/editors/registry.js.map +1 -0
  121. package/dist/editors/routes.d.ts +46 -0
  122. package/dist/editors/routes.d.ts.map +1 -0
  123. package/dist/editors/routes.js +166 -0
  124. package/dist/editors/routes.js.map +1 -0
  125. package/dist/interactive/bridge-pool.d.ts +7 -2
  126. package/dist/interactive/bridge-pool.d.ts.map +1 -1
  127. package/dist/interactive/bridge-pool.js +6 -1
  128. package/dist/interactive/bridge-pool.js.map +1 -1
  129. package/dist/interactive/draft-events.d.ts.map +1 -1
  130. package/dist/interactive/draft-events.js +1 -0
  131. package/dist/interactive/draft-events.js.map +1 -1
  132. package/dist/interactive/theme-events.d.ts +119 -0
  133. package/dist/interactive/theme-events.d.ts.map +1 -0
  134. package/dist/interactive/theme-events.js +606 -0
  135. package/dist/interactive/theme-events.js.map +1 -0
  136. package/dist/projects/events.d.ts.map +1 -1
  137. package/dist/projects/events.js +2 -1
  138. package/dist/projects/events.js.map +1 -1
  139. package/dist/projects/routes.d.ts +2 -2
  140. package/dist/projects/state-home-preflight.d.ts.map +1 -1
  141. package/dist/projects/state-home-preflight.js +3 -0
  142. package/dist/projects/state-home-preflight.js.map +1 -1
  143. package/dist/projects/state-home-registry.d.ts.map +1 -1
  144. package/dist/projects/state-home-registry.js +2 -0
  145. package/dist/projects/state-home-registry.js.map +1 -1
  146. package/dist/projects/state-home.d.ts +6 -0
  147. package/dist/projects/state-home.d.ts.map +1 -1
  148. package/dist/projects/state-home.js +28 -1
  149. package/dist/projects/state-home.js.map +1 -1
  150. package/dist/qe/acceptance.d.ts +45 -4
  151. package/dist/qe/acceptance.d.ts.map +1 -1
  152. package/dist/qe/acceptance.js +93 -4
  153. package/dist/qe/acceptance.js.map +1 -1
  154. package/dist/qe/ledger.d.ts +20 -0
  155. package/dist/qe/ledger.d.ts.map +1 -1
  156. package/dist/qe/ledger.js +34 -0
  157. package/dist/qe/ledger.js.map +1 -1
  158. package/dist/qe/walkthrough-acceptance.d.ts +82 -0
  159. package/dist/qe/walkthrough-acceptance.d.ts.map +1 -0
  160. package/dist/qe/walkthrough-acceptance.js +248 -0
  161. package/dist/qe/walkthrough-acceptance.js.map +1 -0
  162. package/dist/skills/base-skill.d.ts.map +1 -1
  163. package/dist/skills/base-skill.js +3 -2
  164. package/dist/skills/base-skill.js.map +1 -1
  165. package/dist/skills/plugin-source.d.ts +19 -1
  166. package/dist/skills/plugin-source.d.ts.map +1 -1
  167. package/dist/skills/plugin-source.js +31 -2
  168. package/dist/skills/plugin-source.js.map +1 -1
  169. package/dist/skills/runtime.d.ts +11 -2
  170. package/dist/skills/runtime.d.ts.map +1 -1
  171. package/dist/skills/runtime.js +29 -1
  172. package/dist/skills/runtime.js.map +1 -1
  173. package/dist/skills/store.d.ts +14 -1
  174. package/dist/skills/store.d.ts.map +1 -1
  175. package/dist/skills/store.js +19 -5
  176. package/dist/skills/store.js.map +1 -1
  177. package/dist/standing-orders/routes.d.ts +22 -22
  178. package/dist/standing-orders/store.d.ts +10 -10
  179. package/dist/watch/checks/check-failed.d.ts +24 -0
  180. package/dist/watch/checks/check-failed.d.ts.map +1 -0
  181. package/dist/watch/checks/check-failed.js +56 -0
  182. package/dist/watch/checks/check-failed.js.map +1 -0
  183. package/dist/watch/checks/claim-vs-evidence.d.ts +30 -0
  184. package/dist/watch/checks/claim-vs-evidence.d.ts.map +1 -0
  185. package/dist/watch/checks/claim-vs-evidence.js +152 -0
  186. package/dist/watch/checks/claim-vs-evidence.js.map +1 -0
  187. package/dist/watch/checks/deliver-audit.d.ts +19 -0
  188. package/dist/watch/checks/deliver-audit.d.ts.map +1 -0
  189. package/dist/watch/checks/deliver-audit.js +129 -0
  190. package/dist/watch/checks/deliver-audit.js.map +1 -0
  191. package/dist/watch/checks/index.d.ts +8 -0
  192. package/dist/watch/checks/index.d.ts.map +1 -0
  193. package/dist/watch/checks/index.js +24 -0
  194. package/dist/watch/checks/index.js.map +1 -0
  195. package/dist/watch/checks/lag.d.ts +24 -0
  196. package/dist/watch/checks/lag.d.ts.map +1 -0
  197. package/dist/watch/checks/lag.js +55 -0
  198. package/dist/watch/checks/lag.js.map +1 -0
  199. package/dist/watch/checks/quiet-after-claim.d.ts +17 -0
  200. package/dist/watch/checks/quiet-after-claim.d.ts.map +1 -0
  201. package/dist/watch/checks/quiet-after-claim.js +89 -0
  202. package/dist/watch/checks/quiet-after-claim.js.map +1 -0
  203. package/dist/watch/checks/ungated.d.ts +12 -0
  204. package/dist/watch/checks/ungated.d.ts.map +1 -0
  205. package/dist/watch/checks/ungated.js +64 -0
  206. package/dist/watch/checks/ungated.js.map +1 -0
  207. package/dist/watch/checks/warned-rule.d.ts +26 -0
  208. package/dist/watch/checks/warned-rule.d.ts.map +1 -0
  209. package/dist/watch/checks/warned-rule.js +126 -0
  210. package/dist/watch/checks/warned-rule.js.map +1 -0
  211. package/dist/watch/emit.d.ts +122 -0
  212. package/dist/watch/emit.d.ts.map +1 -0
  213. package/dist/watch/emit.js +443 -0
  214. package/dist/watch/emit.js.map +1 -0
  215. package/dist/watch/events.d.ts +21 -0
  216. package/dist/watch/events.d.ts.map +1 -0
  217. package/dist/watch/events.js +21 -0
  218. package/dist/watch/events.js.map +1 -0
  219. package/dist/watch/keys.d.ts +15 -0
  220. package/dist/watch/keys.d.ts.map +1 -0
  221. package/dist/watch/keys.js +23 -0
  222. package/dist/watch/keys.js.map +1 -0
  223. package/dist/watch/lanes.d.ts +41 -0
  224. package/dist/watch/lanes.d.ts.map +1 -0
  225. package/dist/watch/lanes.js +73 -0
  226. package/dist/watch/lanes.js.map +1 -0
  227. package/dist/watch/loader.d.ts +47 -0
  228. package/dist/watch/loader.d.ts.map +1 -0
  229. package/dist/watch/loader.js +178 -0
  230. package/dist/watch/loader.js.map +1 -0
  231. package/dist/watch/registry.d.ts +166 -0
  232. package/dist/watch/registry.d.ts.map +1 -0
  233. package/dist/watch/registry.js +589 -0
  234. package/dist/watch/registry.js.map +1 -0
  235. package/dist/watch/ring.d.ts +32 -0
  236. package/dist/watch/ring.d.ts.map +1 -0
  237. package/dist/watch/ring.js +90 -0
  238. package/dist/watch/ring.js.map +1 -0
  239. package/dist/watch/router.d.ts +25 -0
  240. package/dist/watch/router.d.ts.map +1 -0
  241. package/dist/watch/router.js +87 -0
  242. package/dist/watch/router.js.map +1 -0
  243. package/dist/watch/sources.d.ts +42 -0
  244. package/dist/watch/sources.d.ts.map +1 -0
  245. package/dist/watch/sources.js +104 -0
  246. package/dist/watch/sources.js.map +1 -0
  247. package/dist/watch/types.d.ts +129 -0
  248. package/dist/watch/types.d.ts.map +1 -0
  249. package/dist/watch/types.js +6 -0
  250. package/dist/watch/types.js.map +1 -0
  251. package/endpoint-manifest.json +272 -1
  252. package/package.json +3 -2
  253. package/watch/entries/claim-vs-evidence.json +13 -0
  254. package/watch/entries/deliver-audit.json +17 -0
  255. package/watch/entries/quiet-after-claim.json +16 -0
  256. package/watch/entries/registry-check-failed.json +12 -0
  257. package/watch/entries/registry-lagging.json +12 -0
  258. package/watch/entries/risky-call.json +12 -0
  259. package/watch/entries/ungated.json +13 -0
  260. package/dist/api/demo.d.ts +0 -90
  261. package/dist/api/demo.d.ts.map +0 -1
  262. package/dist/api/demo.js +0 -492
  263. package/dist/api/demo.js.map +0 -1
@@ -0,0 +1,443 @@
1
+ /**
2
+ * The emitter and the feed fold (DES-TRIGGER-REGISTRY-001 §4.6-§4.8).
3
+ *
4
+ * EMIT. Outputs are micro-batched (every 2 s, or at 16 waiting) and each row goes to the bus through
5
+ * the engine (`emitOnBus`). A key already on the bus resolves to the existing row: success. A failed
6
+ * emit is retried at 1, 2 and 4 s, then DROPPED with an audit line `watch.emit.failed` and counted
7
+ * in `health.emit.failed` [D-3]: watch rows are advisory, so a lost one is disclosed, never retried
8
+ * forever and never blocking.
9
+ *
10
+ * FOLD. The bus is the one record. The feed is hydrated once at arm from the bus history, then
11
+ * updated only from rows this emitter saw acknowledged, so `GET /watch` never re-reads the bus.
12
+ *
13
+ * RATE. Past an entry's `emit.rate.per_run` rows on one run, a roll-up row stands for the rest: each
14
+ * further output raises the next roll-up row (`rolled_up` = how many it stands for) and clears the
15
+ * previous one with `reason: "rolled_up"`, `replaced_by` the new row (§4.7).
16
+ */
17
+ import { emitOnBus, readBus } from '../core/bus.js';
18
+ import { redactString } from '../mcp/redact.js';
19
+ import { WATCH_BUS_DOMAIN, WATCH_BUS_SUBDOMAIN, WATCH_FINDING_CLEARED, WATCH_FINDING_PREFIX, WATCH_FINDING_RAISED, WATCH_PRODUCER, } from './events.js';
20
+ import { clearedKey, watchIdOf } from './keys.js';
21
+ /** Facts are capped (§4.5): each string redacted and ≤ 200 chars, the whole object ≤ 4 KB. */
22
+ const FACT_STRING_MAX = 200;
23
+ const FACTS_MAX_BYTES = 4096;
24
+ const SENTENCE_MAX = 300;
25
+ const BATCH = 16;
26
+ const RETRY_MS = [1_000, 2_000, 4_000];
27
+ function capString(s, max) {
28
+ const r = redactString(s);
29
+ return r.length > max ? `${r.slice(0, max - 1)}…` : r;
30
+ }
31
+ const FACT_DEPTH_MAX = 6;
32
+ /** Every string redacted and capped at any depth; deeper than the cap, or a cycle, becomes a marker. */
33
+ function scrub(value, depth = 0, seen = new WeakSet()) {
34
+ if (typeof value === 'string')
35
+ return capString(value, FACT_STRING_MAX);
36
+ if (typeof value === 'bigint')
37
+ return value.toString();
38
+ if (value === null || typeof value !== 'object')
39
+ return typeof value === 'function' || typeof value === 'symbol' ? undefined : value;
40
+ if (seen.has(value))
41
+ return '[cycle]';
42
+ if (depth >= FACT_DEPTH_MAX)
43
+ return '[too deep]';
44
+ seen.add(value);
45
+ const out = Array.isArray(value)
46
+ ? value.slice(0, 50).map((v) => scrub(v, depth + 1, seen))
47
+ : Object.fromEntries(Object.entries(value).map(([k, v]) => [k, scrub(v, depth + 1, seen)]));
48
+ seen.delete(value);
49
+ return out;
50
+ }
51
+ /** Redacted, capped facts; an over-size object is replaced by a marker rather than cut mid-structure. */
52
+ export function scrubFacts(facts) {
53
+ const out = scrub(facts ?? {});
54
+ return Buffer.byteLength(JSON.stringify(out), 'utf8') <= FACTS_MAX_BYTES ? out : { truncated: true };
55
+ }
56
+ /** The in-memory feed: keyed by `watch_id`, plus the (run, entry, subject) → `watch_id` index. */
57
+ /** Rows the feed holds (the routes serve at most 500): the bus stays the full record. */
58
+ const FEED_MAX_ROWS = 20_000;
59
+ /** Rate states held, one per (run, entry); an evicted one is rebuilt from the feed if it recurs. */
60
+ const RATE_MAX = 5_000;
61
+ /**
62
+ * The in-memory feed, BOUNDED (the daemon's bus is never swept, so a lifetime fold would grow
63
+ * without limit): past `maxRows` the oldest cleared row goes first, then the oldest row. The bus
64
+ * stays the record; an evicted row re-raised by a replay resolves to its existing bus row.
65
+ */
66
+ export class WatchFeed {
67
+ maxRows;
68
+ rows = new Map();
69
+ orphanClears = new Map();
70
+ /** Cleared rows in clearing order: the first eviction candidates. */
71
+ clearedOrder = new Set();
72
+ constructor(maxRows = FEED_MAX_ROWS) {
73
+ this.maxRows = maxRows;
74
+ }
75
+ get orphanCount() {
76
+ return this.orphanClears.size;
77
+ }
78
+ evict() {
79
+ while (this.rows.size > this.maxRows) {
80
+ const victim = this.clearedOrder.values().next().value ?? this.rows.keys().next().value;
81
+ if (victim === undefined)
82
+ return;
83
+ this.rows.delete(victim);
84
+ this.clearedOrder.delete(victim);
85
+ }
86
+ }
87
+ has(watchId) {
88
+ return this.rows.has(watchId);
89
+ }
90
+ get(watchId) {
91
+ return this.rows.get(watchId);
92
+ }
93
+ addRaised(f) {
94
+ if (this.rows.has(f.watch_id))
95
+ return;
96
+ const orphan = this.orphanClears.get(f.watch_id) ?? null;
97
+ this.orphanClears.delete(f.watch_id);
98
+ this.rows.set(f.watch_id, { raised: f, cleared: orphan });
99
+ if (orphan !== null)
100
+ this.clearedOrder.add(f.watch_id);
101
+ this.evict();
102
+ }
103
+ addCleared(c) {
104
+ const row = this.rows.get(c.watch_id);
105
+ if (row === undefined) {
106
+ this.orphanClears.set(c.watch_id, c);
107
+ if (this.orphanClears.size > this.maxRows) {
108
+ const oldest = this.orphanClears.keys().next().value;
109
+ if (oldest !== undefined)
110
+ this.orphanClears.delete(oldest);
111
+ }
112
+ }
113
+ else if (row.cleared === null) {
114
+ row.cleared = c;
115
+ this.clearedOrder.add(c.watch_id);
116
+ }
117
+ }
118
+ /** Fold one bus row (the boot hydrate). */
119
+ foldBusRow(eventType, payload) {
120
+ if (payload === null || typeof payload !== 'object')
121
+ return;
122
+ if (eventType === WATCH_FINDING_RAISED)
123
+ this.addRaised(payload);
124
+ else if (eventType === WATCH_FINDING_CLEARED)
125
+ this.addCleared(payload);
126
+ }
127
+ /** Rows of one (run, entry), roll-ups apart (the rate count, rebuilt after a restart). */
128
+ countFor(runId, entryId) {
129
+ let plain = 0;
130
+ const rollups = [];
131
+ for (const { raised } of this.rows.values()) {
132
+ if (raised.run_id !== runId || raised.entry_id !== entryId)
133
+ continue;
134
+ if (raised.rolled_up > 0)
135
+ rollups.push(raised);
136
+ else
137
+ plain++;
138
+ }
139
+ return { plain, rollups };
140
+ }
141
+ }
142
+ export class WatchEmitter {
143
+ deps;
144
+ feed = new WatchFeed();
145
+ failed = 0;
146
+ proposalsFailed = 0;
147
+ pending = [];
148
+ queuedKeys = new Set();
149
+ /** Raised rows dropped after their retries (a clearing that depends on one is skipped). */
150
+ failedKeys = new Set();
151
+ /** Raised rows taken out of `pending` and on their way to the bus (a clearing can still find them). */
152
+ inflight = new Map();
153
+ rate = new Map();
154
+ /** The newest watch row on the bus at hydrate: an emit resolving to an id at or below it found an OLD row. */
155
+ hydratedTail = 0;
156
+ timer = null;
157
+ flushing = null;
158
+ now;
159
+ sleep;
160
+ constructor(deps) {
161
+ this.deps = deps;
162
+ this.now = deps.now ?? Date.now;
163
+ this.sleep = deps.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms).unref()));
164
+ }
165
+ /** Hydrate the feed once from the bus history (§4.8 step 1). */
166
+ async hydrate() {
167
+ const rows = await readBus(this.deps.dbPath, WATCH_FINDING_PREFIX, { history: true });
168
+ for (const r of rows) {
169
+ this.feed.foldBusRow(r.event_type, r.payload);
170
+ if (r.event_id > this.hydratedTail)
171
+ this.hydratedTail = r.event_id;
172
+ }
173
+ return rows.length;
174
+ }
175
+ start() {
176
+ const ms = this.deps.flushMs ?? 2_000;
177
+ if (ms <= 0 || this.timer !== null)
178
+ return;
179
+ this.timer = setInterval(() => void this.flush(), ms);
180
+ this.timer.unref();
181
+ }
182
+ async stop() {
183
+ if (this.timer !== null)
184
+ clearInterval(this.timer);
185
+ this.timer = null;
186
+ await this.flush();
187
+ }
188
+ get waiting() {
189
+ return this.pending.length;
190
+ }
191
+ rateOf(runId, entryId) {
192
+ const k = `${runId ?? '-'}\u0000${entryId}`;
193
+ let s = this.rate.get(k);
194
+ if (s === undefined) {
195
+ // Rebuilt from the feed after a restart, so the count and the roll-up chain carry on.
196
+ const { plain, rollups } = this.feed.countFor(runId, entryId);
197
+ const rollup = new Map();
198
+ for (const r of rollups) {
199
+ const att = String(r.attempt ?? '-');
200
+ const prev = rollup.get(att);
201
+ if (prev === undefined || r.rolled_up > prev.n)
202
+ rollup.set(att, { n: r.rolled_up, watchId: r.watch_id });
203
+ }
204
+ s = { plain, rollup };
205
+ this.rate.set(k, s);
206
+ if (this.rate.size > RATE_MAX) {
207
+ const oldest = this.rate.keys().next().value;
208
+ if (oldest !== undefined && oldest !== k)
209
+ this.rate.delete(oldest);
210
+ }
211
+ }
212
+ return s;
213
+ }
214
+ envelope(entry, runId, ord, attempt, re) {
215
+ const projectId = runId !== null ? this.deps.projectOf(runId) : undefined;
216
+ return {
217
+ run_id: runId,
218
+ ord,
219
+ attempt,
220
+ by: `watch:${entry.id}@${entry.version}`,
221
+ at: this.now(),
222
+ re,
223
+ entry_id: entry.id,
224
+ entry_version: entry.version,
225
+ ...(projectId !== undefined ? { project_id: projectId } : {}),
226
+ };
227
+ }
228
+ /**
229
+ * Queue a raise for `out` (rate and roll-up applied). `replay`: the input came from the boot
230
+ * replay; over the rate such an output is DROPPED rather than rolled up, because the first life
231
+ * may already have counted it and a roll-up row cannot tell (the count may then read low after a
232
+ * restart, never high — a duplicate row is the failure G4 rules out).
233
+ */
234
+ raise(entry, runId, out, anchorAt, replay = false) {
235
+ const watchId = watchIdOf(runId, entry.id, entry.version, out.subject);
236
+ if (this.feed.has(watchId) || this.queuedKeys.has(watchId))
237
+ return; // a replay: already the record
238
+ const rate = this.rateOf(runId, entry.id);
239
+ const ord = out.ord ?? null;
240
+ const attempt = out.attempt ?? null;
241
+ const base = (subject, rolledUp, sentence) => ({
242
+ ...this.envelope(entry, runId, ord, attempt, out.re),
243
+ watch_id: watchIdOf(runId, entry.id, entry.version, subject),
244
+ check: entry.check,
245
+ kind: out.kind ?? entry.emit.as,
246
+ severity: out.severity ?? entry.emit.severity,
247
+ watch_kind: entry.emit.watch_kind,
248
+ attach: entry.emit.attach,
249
+ sentence: capString(sentence, SENTENCE_MAX),
250
+ facts: scrubFacts(out.facts),
251
+ anchor: runId !== null ? { run_id: runId, ord, attempt, at: anchorAt } : null,
252
+ evidence: out.evidence ?? [],
253
+ model: null,
254
+ rolled_up: rolledUp,
255
+ });
256
+ if (rate.plain < entry.emit.rate.per_run) {
257
+ rate.plain++;
258
+ this.push(WATCH_FINDING_RAISED, base(out.subject, 0, out.sentence), entry.emit.as === 'proposal', { plainOf: rate });
259
+ return;
260
+ }
261
+ if (replay)
262
+ return;
263
+ // Over the rate: the next roll-up row for this attempt replaces the previous one.
264
+ const att = String(attempt ?? '-');
265
+ const prev = rate.rollup.get(att);
266
+ const n = (prev?.n ?? 0) + 1;
267
+ const row = base(`rollup:${att}#${n}`, n, `${n} more like this on this run (latest: ${out.sentence})`);
268
+ rate.rollup.set(att, { n, watchId: row.watch_id });
269
+ // Coalesce a burst: while the previous roll-up row has not reached the bus yet, it is REPLACED
270
+ // in the batch (its clearing would only name a row nobody ever saw), and a waiting clearing
271
+ // that pointed at it now points at the new row.
272
+ const waiting = prev === undefined ? -1 : this.pending.findIndex((p) => p.eventType === WATCH_FINDING_RAISED && p.key === prev.watchId);
273
+ if (prev !== undefined && waiting !== -1) {
274
+ const replaced = this.pending[waiting];
275
+ this.queuedKeys.delete(prev.watchId);
276
+ this.queuedKeys.add(row.watch_id);
277
+ this.failedKeys.delete(row.watch_id);
278
+ // The chain falls back to where the REPLACED row would have restored it.
279
+ this.pending[waiting] = {
280
+ eventType: WATCH_FINDING_RAISED,
281
+ key: row.watch_id,
282
+ payload: row,
283
+ proposal: false,
284
+ restore: { rate, att, to: replaced.restore?.to },
285
+ };
286
+ for (const p of this.pending) {
287
+ const c = p.payload;
288
+ if (p.eventType === WATCH_FINDING_CLEARED && c.reason === 'rolled_up' && c.replaced_by === prev.watchId) {
289
+ c.replaced_by = row.watch_id;
290
+ p.dependsOn = row.watch_id;
291
+ }
292
+ }
293
+ return;
294
+ }
295
+ this.push(WATCH_FINDING_RAISED, row, false, { restore: { rate, att, to: prev } });
296
+ if (prev !== undefined) {
297
+ this.push(WATCH_FINDING_CLEARED, {
298
+ ...this.envelope(entry, runId, ord, attempt, out.re),
299
+ watch_id: prev.watchId,
300
+ reason: 'rolled_up',
301
+ replaced_by: row.watch_id,
302
+ }, false, { dependsOn: row.watch_id });
303
+ }
304
+ }
305
+ /** Queue the clearing of the row `subject` names (no-op when it was never raised or is already cleared). */
306
+ clear(entry, runId, subject, how, re = 'resolved') {
307
+ const watchId = watchIdOf(runId, entry.id, entry.version, subject);
308
+ return this.clearById(watchId, how, re);
309
+ }
310
+ /** Queue the clearing of `watchId` (dismiss uses this directly). */
311
+ clearById(watchId, how, re = 'resolved') {
312
+ const row = this.feed.get(watchId);
313
+ const queuedRaise = this.pending.find((p) => p.eventType === WATCH_FINDING_RAISED && p.payload.watch_id === watchId);
314
+ const unacked = queuedRaise?.payload ?? this.inflight.get(watchId);
315
+ const raised = row?.raised ?? unacked;
316
+ if (raised === undefined || (row !== undefined && row.cleared !== null) || this.queuedKeys.has(clearedKey(watchId)))
317
+ return false;
318
+ const payload = {
319
+ run_id: raised.run_id,
320
+ ord: raised.ord,
321
+ attempt: raised.attempt,
322
+ by: raised.by,
323
+ at: this.now(),
324
+ re,
325
+ watch_id: watchId,
326
+ entry_id: raised.entry_id,
327
+ entry_version: raised.entry_version,
328
+ ...(raised.project_id !== undefined ? { project_id: raised.project_id } : {}),
329
+ ...how,
330
+ };
331
+ // Not yet acknowledged: the clearing waits on its raise, and is skipped if that raise is dropped.
332
+ this.push(WATCH_FINDING_CLEARED, payload, false, row === undefined ? { dependsOn: watchId } : {});
333
+ return true;
334
+ }
335
+ push(eventType, payload, proposal, extra = {}) {
336
+ const key = eventType === WATCH_FINDING_RAISED ? payload.watch_id : clearedKey(payload.watch_id);
337
+ this.queuedKeys.add(key);
338
+ if (eventType === WATCH_FINDING_RAISED)
339
+ this.failedKeys.delete(key);
340
+ this.pending.push({ eventType, key, payload, proposal, ...extra });
341
+ if (this.pending.length >= BATCH)
342
+ void this.flush();
343
+ }
344
+ /** Emit everything waiting, in order. Concurrent calls share one pass. */
345
+ flush() {
346
+ if (this.flushing !== null)
347
+ return this.flushing.then(() => (this.pending.length > 0 ? this.flush() : undefined));
348
+ this.flushing = this.drain().finally(() => {
349
+ this.flushing = null;
350
+ });
351
+ return this.flushing;
352
+ }
353
+ async drain() {
354
+ while (this.pending.length > 0) {
355
+ const batch = this.pending.splice(0, BATCH);
356
+ for (const p of batch)
357
+ if (p.eventType === WATCH_FINDING_RAISED)
358
+ this.inflight.set(p.key, p.payload);
359
+ for (const p of batch) {
360
+ try {
361
+ await this.emitOne(p);
362
+ }
363
+ finally {
364
+ this.inflight.delete(p.key);
365
+ }
366
+ }
367
+ }
368
+ }
369
+ async emitOne(p) {
370
+ if (p.dependsOn !== undefined && this.failedKeys.has(p.dependsOn)) {
371
+ // Its raised row never reached the bus: a clearing pointing at it would name nothing.
372
+ this.queuedKeys.delete(p.key);
373
+ return;
374
+ }
375
+ const idempotency = p.eventType === WATCH_FINDING_RAISED ? raisedKeyOf(p.payload) : clearedKey(p.payload.watch_id);
376
+ const wasNew = p.eventType === WATCH_FINDING_RAISED && !this.feed.has(p.payload.watch_id);
377
+ let lastErr = null;
378
+ let eventId = 0;
379
+ for (let i = 0; i <= RETRY_MS.length; i++) {
380
+ try {
381
+ eventId = await emitOnBus(this.deps.dbPath, {
382
+ event_type: p.eventType,
383
+ domain: WATCH_BUS_DOMAIN,
384
+ subdomain: WATCH_BUS_SUBDOMAIN,
385
+ payload: p.payload,
386
+ producer_id: WATCH_PRODUCER,
387
+ idempotency_key: idempotency,
388
+ });
389
+ lastErr = null;
390
+ break;
391
+ }
392
+ catch (err) {
393
+ lastErr = err;
394
+ if (i < RETRY_MS.length)
395
+ await this.sleep(RETRY_MS[i]);
396
+ }
397
+ }
398
+ this.queuedKeys.delete(p.key);
399
+ if (lastErr !== null) {
400
+ this.failed++;
401
+ if (p.eventType === WATCH_FINDING_RAISED) {
402
+ this.failedKeys.add(p.key);
403
+ // Give back what the dropped row took: its rate slot, or its place at the head of the chain.
404
+ if (p.plainOf !== undefined)
405
+ p.plainOf.plain = Math.max(0, p.plainOf.plain - 1);
406
+ if (p.restore !== undefined && p.restore.rate.rollup.get(p.restore.att)?.watchId === p.key) {
407
+ if (p.restore.to === undefined)
408
+ p.restore.rate.rollup.delete(p.restore.att);
409
+ else
410
+ p.restore.rate.rollup.set(p.restore.att, p.restore.to);
411
+ }
412
+ }
413
+ this.deps.auditEmitFailed({
414
+ event_type: p.eventType,
415
+ watch_id: p.payload.watch_id,
416
+ entry_id: p.payload.entry_id,
417
+ error: lastErr instanceof Error ? lastErr.message : String(lastErr),
418
+ });
419
+ return;
420
+ }
421
+ if (p.eventType === WATCH_FINDING_RAISED)
422
+ this.feed.addRaised(p.payload);
423
+ else
424
+ this.feed.addCleared(p.payload);
425
+ this.deps.onAck?.(p.eventType, p.payload);
426
+ // An emit that resolved to a row older than this boot's hydrate (one the bounded feed had
427
+ // evicted) is not new: its proposal was filed when it was first raised.
428
+ if (p.proposal && wasNew && eventId > this.hydratedTail && this.deps.submitProposal !== undefined) {
429
+ try {
430
+ await this.deps.submitProposal(p.payload);
431
+ }
432
+ catch (err) {
433
+ this.proposalsFailed++;
434
+ this.deps.log?.(`[watch] proposal for ${p.payload.watch_id} not filed: ${err instanceof Error ? err.message : String(err)}`);
435
+ }
436
+ }
437
+ }
438
+ }
439
+ /** The raised row's idempotency key: `watch_id` is `"w-"` + the key (keys.ts `watchIdOf`). */
440
+ function raisedKeyOf(f) {
441
+ return f.watch_id.slice(2);
442
+ }
443
+ //# sourceMappingURL=emit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/watch/emit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The watch registry's bus facts (DES-TRIGGER-REGISTRY-001 §4.5, TR-W5a).
3
+ *
4
+ * One owner: crew's watch registry. The event types carry the grammar's bare `crew` segment
5
+ * (`wicked.crew.watch_finding.raised`); the DOMAIN COLUMN is the product-scoped plugin name, as
6
+ * `projects/events.ts` spells it. Declared as `const`s in a file the core event-catalog generator
7
+ * scans (`gen_event_catalog.py` seam list, TR-W3), so the catalog and the emitter cannot drift.
8
+ */
9
+ /** A check produced a finding, a flag or a proposal. */
10
+ export declare const WATCH_FINDING_RAISED = "wicked.crew.watch_finding.raised";
11
+ /** The condition resolved, the operator dismissed it, or a roll-up replaced it. */
12
+ export declare const WATCH_FINDING_CLEARED = "wicked.crew.watch_finding.cleared";
13
+ /** The prefix both types share: the `/ws` relay's tap and the boot hydrate read it. */
14
+ export declare const WATCH_FINDING_PREFIX = "wicked.crew.watch_finding.";
15
+ /** Crew's bus domain column (the `projects/events.ts` precedent). */
16
+ export declare const WATCH_BUS_DOMAIN = "wicked-crew";
17
+ export declare const WATCH_BUS_SUBDOMAIN = "watch";
18
+ export declare const WATCH_PRODUCER = "wicked-crew";
19
+ /** The ONE envelope type the relay puts on `/ws` (api-types `WatchEventFrame`). */
20
+ export declare const WATCH_EVENT_FRAME = "watchEvent";
21
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/watch/events.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wDAAwD;AACxD,eAAO,MAAM,oBAAoB,qCAAqC,CAAC;AACvE,mFAAmF;AACnF,eAAO,MAAM,qBAAqB,sCAAsC,CAAC;AAEzE,uFAAuF;AACvF,eAAO,MAAM,oBAAoB,+BAA+B,CAAC;AAEjE,qEAAqE;AACrE,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAC9C,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAC3C,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAE5C,mFAAmF;AACnF,eAAO,MAAM,iBAAiB,eAAe,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The watch registry's bus facts (DES-TRIGGER-REGISTRY-001 §4.5, TR-W5a).
3
+ *
4
+ * One owner: crew's watch registry. The event types carry the grammar's bare `crew` segment
5
+ * (`wicked.crew.watch_finding.raised`); the DOMAIN COLUMN is the product-scoped plugin name, as
6
+ * `projects/events.ts` spells it. Declared as `const`s in a file the core event-catalog generator
7
+ * scans (`gen_event_catalog.py` seam list, TR-W3), so the catalog and the emitter cannot drift.
8
+ */
9
+ /** A check produced a finding, a flag or a proposal. */
10
+ export const WATCH_FINDING_RAISED = 'wicked.crew.watch_finding.raised';
11
+ /** The condition resolved, the operator dismissed it, or a roll-up replaced it. */
12
+ export const WATCH_FINDING_CLEARED = 'wicked.crew.watch_finding.cleared';
13
+ /** The prefix both types share: the `/ws` relay's tap and the boot hydrate read it. */
14
+ export const WATCH_FINDING_PREFIX = 'wicked.crew.watch_finding.';
15
+ /** Crew's bus domain column (the `projects/events.ts` precedent). */
16
+ export const WATCH_BUS_DOMAIN = 'wicked-crew';
17
+ export const WATCH_BUS_SUBDOMAIN = 'watch';
18
+ export const WATCH_PRODUCER = 'wicked-crew';
19
+ /** The ONE envelope type the relay puts on `/ws` (api-types `WatchEventFrame`). */
20
+ export const WATCH_EVENT_FRAME = 'watchEvent';
21
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/watch/events.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wDAAwD;AACxD,MAAM,CAAC,MAAM,oBAAoB,GAAG,kCAAkC,CAAC;AACvE,mFAAmF;AACnF,MAAM,CAAC,MAAM,qBAAqB,GAAG,mCAAmC,CAAC;AAEzE,uFAAuF;AACvF,MAAM,CAAC,MAAM,oBAAoB,GAAG,4BAA4B,CAAC;AAEjE,qEAAqE;AACrE,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAC9C,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAC3C,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;AAE5C,mFAAmF;AACnF,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Watch row keys (DES-TRIGGER-REGISTRY-001 §4.5).
3
+ *
4
+ * Every key is `deterministic_key` byte for byte (wicked-core `crate::bus::deterministic_key`,
5
+ * reproduced in `team/key.ts` and pinned there to the DES-TEAMING-002 vectors) over producer-
6
+ * assigned identity only: never content, never a clock. A replay or an at-least-once redelivery
7
+ * therefore resolves to the row already on the bus (the engine's unique index is the dedupe).
8
+ */
9
+ /** The raised row's key: `["watch", raised, run_id | "-", entry_id, entry_version, subject]`. */
10
+ export declare function raisedKey(runId: string | null, entryId: string, entryVersion: number, subject: string): string;
11
+ /** `watch_id` = `"w-"` + the raised row's key. */
12
+ export declare function watchIdOf(runId: string | null, entryId: string, entryVersion: number, subject: string): string;
13
+ /** The cleared row's key: `["watch", cleared, watch_id, "cleared"]`. One clearing per row. */
14
+ export declare function clearedKey(watchId: string): string;
15
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/watch/keys.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,iGAAiG;AACjG,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9G;AAED,kDAAkD;AAClD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9G;AAED,8FAA8F;AAC9F,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Watch row keys (DES-TRIGGER-REGISTRY-001 §4.5).
3
+ *
4
+ * Every key is `deterministic_key` byte for byte (wicked-core `crate::bus::deterministic_key`,
5
+ * reproduced in `team/key.ts` and pinned there to the DES-TEAMING-002 vectors) over producer-
6
+ * assigned identity only: never content, never a clock. A replay or an at-least-once redelivery
7
+ * therefore resolves to the row already on the bus (the engine's unique index is the dedupe).
8
+ */
9
+ import { deterministicKey } from '../team/key.js';
10
+ import { WATCH_FINDING_CLEARED, WATCH_FINDING_RAISED } from './events.js';
11
+ /** The raised row's key: `["watch", raised, run_id | "-", entry_id, entry_version, subject]`. */
12
+ export function raisedKey(runId, entryId, entryVersion, subject) {
13
+ return deterministicKey(['watch', WATCH_FINDING_RAISED, runId ?? '-', entryId, String(entryVersion), subject]);
14
+ }
15
+ /** `watch_id` = `"w-"` + the raised row's key. */
16
+ export function watchIdOf(runId, entryId, entryVersion, subject) {
17
+ return `w-${raisedKey(runId, entryId, entryVersion, subject)}`;
18
+ }
19
+ /** The cleared row's key: `["watch", cleared, watch_id, "cleared"]`. One clearing per row. */
20
+ export function clearedKey(watchId) {
21
+ return deterministicKey(['watch', WATCH_FINDING_CLEARED, watchId, 'cleared']);
22
+ }
23
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/watch/keys.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE1E,iGAAiG;AACjG,MAAM,UAAU,SAAS,CAAC,KAAoB,EAAE,OAAe,EAAE,YAAoB,EAAE,OAAe;IACpG,OAAO,gBAAgB,CAAC,CAAC,OAAO,EAAE,oBAAoB,EAAE,KAAK,IAAI,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACjH,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,SAAS,CAAC,KAAoB,EAAE,OAAe,EAAE,YAAoB,EAAE,OAAe;IACpG,OAAO,KAAK,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,gBAAgB,CAAC,CAAC,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;AAChF,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * The check lanes (DES-TRIGGER-REGISTRY-001 §4.6).
3
+ *
4
+ * DETERMINISTIC. In-process and sequential (the registry drains one input at a time, so a run's
5
+ * inputs are evaluated in order). Each check has a 5 ms budget: a breach is counted, not cut. A
6
+ * check that throws or does not settle within its timeout yields NO output (a failed check never
7
+ * emits "fine") and is reported to the registry, which raises `registry-check-failed` past its
8
+ * threshold.
9
+ *
10
+ * LLM. Not in this slice: the `llm:*` lane, its seat port and `Core.checkOnce` land with TR-W9a/W9.
11
+ * No shipped check is `lane: "llm"`, and the registry refuses to run one (health `llm.enabled:false`).
12
+ */
13
+ import type { CheckCtx, CheckOutput, KeyPointInput, LoadedEntry, RunWatchState, WatchCheck } from './types.js';
14
+ export interface LaneStats {
15
+ runs: number;
16
+ budgetBreaches: number;
17
+ failures: number;
18
+ timeouts: number;
19
+ }
20
+ export interface DeterministicLaneOptions {
21
+ /** Per-check budget, ms (a breach is counted). */
22
+ budgetMs?: number;
23
+ /** A check that has not settled by then is abandoned and counted as timed out. */
24
+ timeoutMs?: number;
25
+ /** A check threw or timed out. */
26
+ onFailure?: (entryId: string, reason: 'threw' | 'timeout', err: unknown) => void;
27
+ clock?: () => number;
28
+ }
29
+ export declare class DeterministicLane {
30
+ private readonly opts;
31
+ /** The failure report, guarded: a throwing reporter never makes `run` reject. */
32
+ private report;
33
+ readonly stats: LaneStats;
34
+ private readonly budgetMs;
35
+ private readonly timeoutMs;
36
+ private readonly clock;
37
+ constructor(opts?: DeterministicLaneOptions);
38
+ /** Never throws. */
39
+ run(check: WatchCheck, entry: LoadedEntry, input: KeyPointInput, state: RunWatchState, ctx: CheckCtx): Promise<CheckOutput[]>;
40
+ }
41
+ //# sourceMappingURL=lanes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lanes.d.ts","sourceRoot":"","sources":["../../src/watch/lanes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE/G,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,SAAS,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IACjF,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB;AAID,qBAAa,iBAAiB;IAehB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAdjC,iFAAiF;IACjF,OAAO,CAAC,MAAM;IAQd,QAAQ,CAAC,KAAK,EAAE,SAAS,CAA4D;IACrF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;gBAER,IAAI,GAAE,wBAA6B;IAMhE,oBAAoB;IACd,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CA+BpI"}