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,24 @@
1
+ /**
2
+ * `deterministic:lag` — the registry watching itself (entry `registry-lagging`, §4.3).
3
+ *
4
+ * Fed by the registry's own 30 s tick (and at once when the push ring sheds). Lagging means the
5
+ * ring is over its depth threshold, the bus pull is more than `tail_lag_ms` behind the bus tail, or
6
+ * the ring shed an input since the last tick. One flag per episode, run-less ("for whoever runs
7
+ * studio"); the episode's flag clears when a tick finds the registry caught up.
8
+ */
9
+ import { z } from 'zod';
10
+ import type { WatchCheck } from '../types.js';
11
+ declare const Threshold: z.ZodObject<{
12
+ queue_depth: z.ZodNumber;
13
+ tail_lag_ms: z.ZodNumber;
14
+ }, "strict", z.ZodTypeAny, {
15
+ queue_depth: number;
16
+ tail_lag_ms: number;
17
+ }, {
18
+ queue_depth: number;
19
+ tail_lag_ms: number;
20
+ }>;
21
+ type Threshold = z.infer<typeof Threshold>;
22
+ export declare const lagCheck: WatchCheck<Record<string, never>, Threshold>;
23
+ export {};
24
+ //# sourceMappingURL=lag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lag.d.ts","sourceRoot":"","sources":["../../../src/watch/checks/lag.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,QAAA,MAAM,SAAS;;;;;;;;;EAKJ,CAAC;AACZ,KAAK,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAO3C,eAAO,MAAM,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,CAuCjE,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * `deterministic:lag` — the registry watching itself (entry `registry-lagging`, §4.3).
3
+ *
4
+ * Fed by the registry's own 30 s tick (and at once when the push ring sheds). Lagging means the
5
+ * ring is over its depth threshold, the bus pull is more than `tail_lag_ms` behind the bus tail, or
6
+ * the ring shed an input since the last tick. One flag per episode, run-less ("for whoever runs
7
+ * studio"); the episode's flag clears when a tick finds the registry caught up.
8
+ */
9
+ import { z } from 'zod';
10
+ const Threshold = z
11
+ .object({
12
+ queue_depth: z.number().int().min(1).max(100_000),
13
+ tail_lag_ms: z.number().int().min(1_000).max(3_600_000),
14
+ })
15
+ .strict();
16
+ export const lagCheck = {
17
+ name: 'deterministic:lag',
18
+ lane: 'deterministic',
19
+ paramsSchema: z.object({}).strict(),
20
+ thresholdSchema: Threshold,
21
+ evaluate(_input, state, _params, t, ctx) {
22
+ const s = ctx.stats();
23
+ const bag = state.bag.get('lag') ?? { episode: null, shedSeen: 0 };
24
+ state.bag.set('lag', bag);
25
+ const shedNow = s.shedTotal > bag.shedSeen;
26
+ bag.shedSeen = s.shedTotal;
27
+ const lagging = s.queueDepth >= t.queue_depth || s.tailLagMs > t.tail_lag_ms || shedNow;
28
+ if (lagging && bag.episode === null) {
29
+ bag.episode = ctx.now();
30
+ const why = shedNow
31
+ ? 'it had to drop some low-priority events'
32
+ : s.tailLagMs > t.tail_lag_ms
33
+ ? `it is ${Math.round(s.tailLagMs / 1000)} s behind the event bus`
34
+ : `${s.queueDepth} events are waiting to be checked`;
35
+ return [
36
+ {
37
+ op: 'raise',
38
+ subject: `lag:${bag.episode}`,
39
+ sentence: `Watching is falling behind: ${why}.`,
40
+ facts: { queue_depth: s.queueDepth, queue_hwm: s.queueHwm, shed_total: s.shedTotal, tail_lag_ms: s.tailLagMs },
41
+ re: 'registry.tick',
42
+ },
43
+ ];
44
+ }
45
+ if (!lagging && bag.episode !== null) {
46
+ const subject = `lag:${bag.episode}`;
47
+ bag.episode = null;
48
+ return [{ op: 'clear', subject }];
49
+ }
50
+ return [];
51
+ },
52
+ coverage: () => null,
53
+ describe: (t) => `When ${t.queue_depth} or more events are waiting, watching is more than ${Math.round(t.tail_lag_ms / 1000)} s behind the bus, or an event had to be dropped`,
54
+ };
55
+ //# sourceMappingURL=lag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lag.js","sourceRoot":"","sources":["../../../src/watch/checks/lag.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `deterministic:quiet_after_claim` — entry `quiet-after-claim` (DES-TRIGGER-REGISTRY-001 §4.3
3
+ * row 5, TR-W5b).
4
+ *
5
+ * The watchdog's DETECTION frame (`workerStalled`, the `onFrame` tee) after the cursor unit handed
6
+ * back `unitOutputCaptured{stepStatus:"ok"}` — and with no `gateEvaluated` for that unit since — is
7
+ * a contradiction: the step says it is finished, yet nothing moved (R6 "contradicted").
8
+ *
9
+ * The frame carries no attempt and no quiet-start, and a restart never re-arms the watchdog clock,
10
+ * so the subject is `ord:attempt:after-claim` with the attempt from the CLAIM: one finding per
11
+ * claimed attempt however many quiet periods or restarts follow (the key resolves to the row
12
+ * already on the bus). Its gate arriving afterwards clears it. Thresholds stay the watchdog's
13
+ * (`workerStallMinutes`), so this entry has none of its own.
14
+ */
15
+ import type { WatchCheck } from '../types.js';
16
+ export declare const quietAfterClaimCheck: WatchCheck<Record<string, never>, Record<string, never>>;
17
+ //# sourceMappingURL=quiet-after-claim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quiet-after-claim.d.ts","sourceRoot":"","sources":["../../../src/watch/checks/quiet-after-claim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAiB9C,eAAO,MAAM,oBAAoB,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAiEzF,CAAC"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * `deterministic:quiet_after_claim` — entry `quiet-after-claim` (DES-TRIGGER-REGISTRY-001 §4.3
3
+ * row 5, TR-W5b).
4
+ *
5
+ * The watchdog's DETECTION frame (`workerStalled`, the `onFrame` tee) after the cursor unit handed
6
+ * back `unitOutputCaptured{stepStatus:"ok"}` — and with no `gateEvaluated` for that unit since — is
7
+ * a contradiction: the step says it is finished, yet nothing moved (R6 "contradicted").
8
+ *
9
+ * The frame carries no attempt and no quiet-start, and a restart never re-arms the watchdog clock,
10
+ * so the subject is `ord:attempt:after-claim` with the attempt from the CLAIM: one finding per
11
+ * claimed attempt however many quiet periods or restarts follow (the key resolves to the row
12
+ * already on the bus). Its gate arriving afterwards clears it. Thresholds stay the watchdog's
13
+ * (`workerStallMinutes`), so this entry has none of its own.
14
+ */
15
+ import { z } from 'zod';
16
+ export const quietAfterClaimCheck = {
17
+ name: 'deterministic:quiet_after_claim',
18
+ lane: 'deterministic',
19
+ paramsSchema: z.object({}).strict(),
20
+ thresholdSchema: z.object({}).strict(),
21
+ evaluate(input, state) {
22
+ const bag = state.bag.get('quiet') ?? { claims: new Map(), lastOrd: null, seen: 0 };
23
+ state.bag.set('quiet', bag);
24
+ const e = input.event;
25
+ const ord = typeof e['ord'] === 'number' ? e['ord'] : null;
26
+ switch (input.type) {
27
+ case 'unitOutputCaptured': {
28
+ bag.seen++;
29
+ if (ord === null || typeof e['attempt'] !== 'number')
30
+ return [];
31
+ if (e['stepStatus'] !== 'ok') {
32
+ bag.claims.delete(ord);
33
+ return [];
34
+ }
35
+ bag.claims.set(ord, { ord, attempt: e['attempt'], gated: false, raised: false });
36
+ bag.lastOrd = ord;
37
+ return [];
38
+ }
39
+ case 'gateEvaluated': {
40
+ if (ord === null)
41
+ return [];
42
+ const claim = bag.claims.get(ord);
43
+ if (claim === undefined)
44
+ return [];
45
+ claim.gated = true;
46
+ // Clear unconditionally: after a restart the replay rebuilds the claim with `raised: false`
47
+ // (watchdog frames are not replayed), yet the hydrated row may be open. A clear naming no
48
+ // row is a no-op in the emitter (codex on TR-W5b).
49
+ return [{ op: 'clear', subject: `${claim.ord}:${claim.attempt}:after-claim` }];
50
+ }
51
+ case 'workerStalled': {
52
+ bag.seen++;
53
+ // The DETECTION frame carries `quietForMs`; the engine's PTY-path event of the same name
54
+ // carries `stalledSecs` and is not this input.
55
+ if (typeof e['quietForMs'] !== 'number')
56
+ return [];
57
+ const at = ord ?? bag.lastOrd;
58
+ if (at === null)
59
+ return [];
60
+ const claim = bag.claims.get(at);
61
+ if (claim === undefined || claim.gated || claim.raised)
62
+ return [];
63
+ claim.raised = true;
64
+ const minutes = Math.max(1, Math.round(e['quietForMs'] / 60_000));
65
+ return [
66
+ {
67
+ op: 'raise',
68
+ subject: `${claim.ord}:${claim.attempt}:after-claim`,
69
+ sentence: `Says it's finished, but nothing new in ${minutes} min.`,
70
+ facts: { quiet_for_ms: e['quietForMs'] },
71
+ ord: claim.ord,
72
+ attempt: claim.attempt,
73
+ re: `workerStalled#${claim.ord}`,
74
+ },
75
+ ];
76
+ }
77
+ default:
78
+ return [];
79
+ }
80
+ },
81
+ coverage(state) {
82
+ const bag = state.bag.get('quiet');
83
+ if (bag !== undefined && bag.seen > 0)
84
+ return { state: 'checked' };
85
+ return { state: 'not_checked', reason: 'no step has handed back yet' };
86
+ },
87
+ describe: () => "When a step says it's finished but the run then goes quiet past the stall watchdog's threshold",
88
+ };
89
+ //# sourceMappingURL=quiet-after-claim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quiet-after-claim.js","sourceRoot":"","sources":["../../../src/watch/checks/quiet-after-claim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `deterministic:ungated` — entry `ungated` (DES-TRIGGER-REGISTRY-001 §4.3 row 2, TR-W5b).
3
+ *
4
+ * A projection of the engine's own `gateEvaluated.ungated` and `ungatedReason` (the entry's filter
5
+ * is empty, so every gate counts toward coverage; only `ungated === true` raises): it computes nothing, and a judge-verified PASS without a floor is gated and
6
+ * never flagged (S5). The engine says such a unit "must be rendered as UNGATED, never as pass", so
7
+ * the flag is a `problem`, never "Finished". `gateEvaluated` carries no attempt; the attempt comes
8
+ * from the unit's `unitOutputCaptured`, emitted before the gate runs (joined).
9
+ */
10
+ import type { WatchCheck } from '../types.js';
11
+ export declare const ungatedCheck: WatchCheck<Record<string, never>, Record<string, never>>;
12
+ //# sourceMappingURL=ungated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ungated.d.ts","sourceRoot":"","sources":["../../../src/watch/checks/ungated.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAY9C,eAAO,MAAM,YAAY,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CA8CjF,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * `deterministic:ungated` — entry `ungated` (DES-TRIGGER-REGISTRY-001 §4.3 row 2, TR-W5b).
3
+ *
4
+ * A projection of the engine's own `gateEvaluated.ungated` and `ungatedReason` (the entry's filter
5
+ * is empty, so every gate counts toward coverage; only `ungated === true` raises): it computes nothing, and a judge-verified PASS without a floor is gated and
6
+ * never flagged (S5). The engine says such a unit "must be rendered as UNGATED, never as pass", so
7
+ * the flag is a `problem`, never "Finished". `gateEvaluated` carries no attempt; the attempt comes
8
+ * from the unit's `unitOutputCaptured`, emitted before the gate runs (joined).
9
+ */
10
+ import { z } from 'zod';
11
+ const REASON_MAX = 200;
12
+ export const ungatedCheck = {
13
+ name: 'deterministic:ungated',
14
+ lane: 'deterministic',
15
+ paramsSchema: z.object({}).strict(),
16
+ thresholdSchema: z.object({}).strict(),
17
+ evaluate(input, state) {
18
+ const bag = state.bag.get('ungated') ?? { attemptByOrd: new Map(), gates: 0, silent: 0 };
19
+ state.bag.set('ungated', bag);
20
+ const e = input.event;
21
+ const ord = typeof e['ord'] === 'number' ? e['ord'] : null;
22
+ if (ord === null)
23
+ return [];
24
+ if (input.type === 'unitOutputCaptured') {
25
+ if (typeof e['attempt'] === 'number')
26
+ bag.attemptByOrd.set(ord, e['attempt']);
27
+ return [];
28
+ }
29
+ if (input.type !== 'gateEvaluated')
30
+ return [];
31
+ if (typeof e['ungated'] !== 'boolean') {
32
+ bag.silent++;
33
+ return [];
34
+ }
35
+ bag.gates++;
36
+ if (e['ungated'] !== true)
37
+ return [];
38
+ const attempt = bag.attemptByOrd.get(ord) ?? null;
39
+ const raw = typeof e['ungatedReason'] === 'string' ? e['ungatedReason'].trim() : '';
40
+ const reason = raw.length > REASON_MAX ? `${raw.slice(0, REASON_MAX - 1)}…` : raw;
41
+ return [
42
+ {
43
+ op: 'raise',
44
+ subject: `${ord}:${attempt ?? '-'}:ungated`,
45
+ sentence: reason !== '' ? `Nothing checked this step: ${reason}` : 'Nothing checked this step.',
46
+ facts: { ungated_reason: reason },
47
+ ord,
48
+ attempt,
49
+ re: `gateEvaluated#${ord}`,
50
+ },
51
+ ];
52
+ },
53
+ coverage(state) {
54
+ const bag = state.bag.get('ungated');
55
+ if (bag !== undefined && bag.gates > 0)
56
+ return { state: 'checked' };
57
+ if (bag !== undefined && bag.silent > 0) {
58
+ return { state: 'not_checked', reason: 'the engine is too old to say whether a step was checked' };
59
+ }
60
+ return { state: 'not_checked', reason: 'no step has reached its gate yet' };
61
+ },
62
+ describe: () => 'When a step finishes with nothing checking it: no checks, no judge, no policy',
63
+ };
64
+ //# sourceMappingURL=ungated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ungated.js","sourceRoot":"","sources":["../../../src/watch/checks/ungated.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * `deterministic:warned_rule` (DES-trigger-registry §4.3 row 7 "risky-call", §4.4; TR-W6).
3
+ *
4
+ * Steering already has the never-blocking class: a rule with `effect: warn` fires and is RECORDED on
5
+ * the decision without blocking, and (TR-W2) the gate fold replays every fired rule id on
6
+ * `governanceHookFired.firedPolicies`, whatever the decision. This check projects that: for each
7
+ * fired id whose rule is `warn`, one flag naming the rule — the operator asked to be told, not
8
+ * stopped. There is no second matcher; the rule's effect is read from the store the daemon already
9
+ * holds (`ctx.rules`, the registry's bounded snapshot of `listConformanceRules`).
10
+ *
11
+ * §7: the row names the rule ID and the tool, never the rule's text and never the command — a
12
+ * steering statement can be the operator's own words, and no operator text rides the bus. Studio
13
+ * resolves the id to the rule.
14
+ *
15
+ * Decisions: `deny` is the engine's own record (not this row). `allow` and `allow_with_conditions`
16
+ * both carry fired warn rules (the entry's filter is "any decision but deny").
17
+ *
18
+ * Timing: `governanceHookFired` is emitted at gate time, not live, so the flag appears when the unit
19
+ * reaches its gate — acceptable for an advisory flag (§4.3 row 7). Coverage: an engine whose frames
20
+ * carry no `firedPolicies` is "too old"; a store that cannot be read is "not readable".
21
+ */
22
+ import type { WatchCheck } from '../types.js';
23
+ /** Steering severity → watch severity: the flag is as loud as the rule asked to be. */
24
+ export declare function watchSeverityOf(ruleSeverity: string | undefined): 'high' | 'medium' | 'info';
25
+ export declare const warnedRuleCheck: WatchCheck<Record<string, never>, Record<string, never>>;
26
+ //# sourceMappingURL=warned-rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warned-rule.d.ts","sourceRoot":"","sources":["../../../src/watch/checks/warned-rule.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EAAe,UAAU,EAAkB,MAAM,aAAa,CAAC;AA+B3E,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAU5F;AAED,eAAO,MAAM,eAAe,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CA8EpF,CAAC"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * `deterministic:warned_rule` (DES-trigger-registry §4.3 row 7 "risky-call", §4.4; TR-W6).
3
+ *
4
+ * Steering already has the never-blocking class: a rule with `effect: warn` fires and is RECORDED on
5
+ * the decision without blocking, and (TR-W2) the gate fold replays every fired rule id on
6
+ * `governanceHookFired.firedPolicies`, whatever the decision. This check projects that: for each
7
+ * fired id whose rule is `warn`, one flag naming the rule — the operator asked to be told, not
8
+ * stopped. There is no second matcher; the rule's effect is read from the store the daemon already
9
+ * holds (`ctx.rules`, the registry's bounded snapshot of `listConformanceRules`).
10
+ *
11
+ * §7: the row names the rule ID and the tool, never the rule's text and never the command — a
12
+ * steering statement can be the operator's own words, and no operator text rides the bus. Studio
13
+ * resolves the id to the rule.
14
+ *
15
+ * Decisions: `deny` is the engine's own record (not this row). `allow` and `allow_with_conditions`
16
+ * both carry fired warn rules (the entry's filter is "any decision but deny").
17
+ *
18
+ * Timing: `governanceHookFired` is emitted at gate time, not live, so the flag appears when the unit
19
+ * reaches its gate — acceptable for an advisory flag (§4.3 row 7). Coverage: an engine whose frames
20
+ * carry no `firedPolicies` is "too old"; a store that cannot be read is "not readable".
21
+ */
22
+ import { z } from 'zod';
23
+ /** Frames one run may hold for a later read; past it they are counted lost and coverage says so. */
24
+ const WAITING_MAX = 50;
25
+ const num = (v) => (typeof v === 'number' && Number.isFinite(v) ? v : null);
26
+ /** Steering severity → watch severity: the flag is as loud as the rule asked to be. */
27
+ export function watchSeverityOf(ruleSeverity) {
28
+ switch (ruleSeverity) {
29
+ case 'critical':
30
+ case 'error':
31
+ return 'high';
32
+ case 'warn':
33
+ return 'medium';
34
+ default:
35
+ return 'info';
36
+ }
37
+ }
38
+ export const warnedRuleCheck = {
39
+ name: 'deterministic:warned_rule',
40
+ lane: 'deterministic',
41
+ paramsSchema: z.object({}).strict(),
42
+ thresholdSchema: z.object({}).strict(),
43
+ async evaluate(input, state, _params, _threshold, ctx) {
44
+ const bag = state.bag.get('warned') ?? { hooks: 0, silent: 0, waiting: [], lost: 0, raised: new Set() };
45
+ state.bag.set('warned', bag);
46
+ if (input.type !== 'governanceHookFired')
47
+ return [];
48
+ const e = input.event;
49
+ const decision = typeof e['decision'] === 'string' ? e['decision'] : '';
50
+ if (decision === 'deny')
51
+ return []; // the deny is the engine's own record; this row is the warn class
52
+ const fired = e['firedPolicies'];
53
+ if (!Array.isArray(fired)) {
54
+ bag.silent++;
55
+ return [];
56
+ }
57
+ bag.hooks++;
58
+ const ids = [...new Set(fired.filter((x) => typeof x === 'string' && x !== ''))];
59
+ const frame = ids.length === 0
60
+ ? null
61
+ : { ord: num(e['ord']), attempt: num(e['attempt']), tool: typeof e['toolName'] === 'string' && e['toolName'] !== '' ? e['toolName'] : 'a tool', decision, ids, at: input.at, replay: input.replay === true };
62
+ if (frame === null && bag.waiting.length === 0)
63
+ return [];
64
+ if (ctx.rules === undefined) {
65
+ if (frame !== null)
66
+ bag.lost++;
67
+ return [];
68
+ }
69
+ let rules;
70
+ try {
71
+ rules = await ctx.rules();
72
+ }
73
+ catch {
74
+ // Not classifiable now: keep the frame for the run's next readable one — never "no rule fired".
75
+ if (frame !== null) {
76
+ if (bag.waiting.length < WAITING_MAX)
77
+ bag.waiting.push(frame);
78
+ else
79
+ bag.lost++;
80
+ }
81
+ return [];
82
+ }
83
+ const todo = frame !== null ? [...bag.waiting, frame] : bag.waiting;
84
+ bag.waiting = [];
85
+ const out = [];
86
+ for (const f of todo) {
87
+ for (const id of f.ids) {
88
+ const rule = rules.get(id);
89
+ if (rule === undefined || rule.effect !== 'warn')
90
+ continue;
91
+ const subject = `${f.ord ?? '-'}:${f.attempt ?? '-'}:warned:${id}`;
92
+ if (bag.raised.has(subject))
93
+ continue;
94
+ bag.raised.add(subject);
95
+ out.push({
96
+ op: 'raise',
97
+ subject,
98
+ kind: 'flag',
99
+ severity: watchSeverityOf(rule.severity),
100
+ sentence: `A rule you asked to be warned about fired on ${f.tool}: ${id}.`,
101
+ facts: { rule_id: id, tool: f.tool, effect: 'warn', rule_severity: rule.severity, decision: f.decision },
102
+ ord: f.ord,
103
+ attempt: f.attempt,
104
+ re: `governanceHookFired#${f.ord ?? '-'}:${f.attempt ?? '-'}`,
105
+ // A kept frame's row carries the frame's own time and provenance (codex r2).
106
+ ...(f !== frame ? { at: f.at, replay: f.replay } : {}),
107
+ });
108
+ }
109
+ }
110
+ return out;
111
+ },
112
+ coverage(state) {
113
+ const bag = state.bag.get('warned');
114
+ if (bag !== undefined && bag.hooks > 0) {
115
+ if (bag.waiting.length > 0 || bag.lost > 0)
116
+ return { state: 'not_checked', reason: 'the rule store could not be read, so fired rules could not be classified' };
117
+ return { state: 'checked' };
118
+ }
119
+ if (bag !== undefined && bag.silent > 0) {
120
+ return { state: 'not_checked', reason: 'the engine is too old to carry the fired rules (needs wicked-core-ts >= 0.7.35)' };
121
+ }
122
+ return { state: 'not_checked', reason: 'no governed tool call has reached a gate yet' };
123
+ },
124
+ describe: () => 'When a governed tool call fires a steering rule the operator asked to be warned about (effect: warn)',
125
+ };
126
+ //# sourceMappingURL=warned-rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warned-rule.js","sourceRoot":"","sources":["../../../src/watch/checks/warned-rule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
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 type { WatchFinding, WatchFindingCleared } from 'wicked-crew-api-types';
18
+ import type { CheckOutput, LoadedEntry } from './types.js';
19
+ /** Redacted, capped facts; an over-size object is replaced by a marker rather than cut mid-structure. */
20
+ export declare function scrubFacts(facts: Record<string, unknown> | undefined): Record<string, unknown>;
21
+ /** One feed row: the raised payload, and its clearing once one was acknowledged. */
22
+ export interface FeedRow {
23
+ raised: WatchFinding;
24
+ cleared: WatchFindingCleared | null;
25
+ }
26
+ /**
27
+ * The in-memory feed, BOUNDED (the daemon's bus is never swept, so a lifetime fold would grow
28
+ * without limit): past `maxRows` the oldest cleared row goes first, then the oldest row. The bus
29
+ * stays the record; an evicted row re-raised by a replay resolves to its existing bus row.
30
+ */
31
+ export declare class WatchFeed {
32
+ private readonly maxRows;
33
+ readonly rows: Map<string, FeedRow>;
34
+ private readonly orphanClears;
35
+ /** Cleared rows in clearing order: the first eviction candidates. */
36
+ private readonly clearedOrder;
37
+ constructor(maxRows?: number);
38
+ get orphanCount(): number;
39
+ private evict;
40
+ has(watchId: string): boolean;
41
+ get(watchId: string): FeedRow | undefined;
42
+ addRaised(f: WatchFinding): void;
43
+ addCleared(c: WatchFindingCleared): void;
44
+ /** Fold one bus row (the boot hydrate). */
45
+ foldBusRow(eventType: string, payload: unknown): void;
46
+ /** Rows of one (run, entry), roll-ups apart (the rate count, rebuilt after a restart). */
47
+ countFor(runId: string | null, entryId: string): {
48
+ plain: number;
49
+ rollups: WatchFinding[];
50
+ };
51
+ }
52
+ export interface EmitterDeps {
53
+ dbPath: string;
54
+ projectOf: (runId: string) => string | undefined;
55
+ /** `audit.record('watch.emit.failed', …)` in the daemon. */
56
+ auditEmitFailed: (detail: Record<string, unknown>) => void;
57
+ /** The proposals sink (§4.11): crew's existing review queue. Never self-applied. */
58
+ submitProposal?: (finding: WatchFinding) => Promise<void>;
59
+ now?: () => number;
60
+ sleep?: (ms: number) => Promise<void>;
61
+ /** Flush cadence, ms (tests pass 0 and call `flush`). */
62
+ flushMs?: number;
63
+ log?: (msg: string) => void;
64
+ /** Called once per acknowledged row (the registry folds nothing else). */
65
+ onAck?: (eventType: string, payload: WatchFinding | WatchFindingCleared) => void;
66
+ }
67
+ export declare class WatchEmitter {
68
+ private readonly deps;
69
+ readonly feed: WatchFeed;
70
+ failed: number;
71
+ proposalsFailed: number;
72
+ private pending;
73
+ private readonly queuedKeys;
74
+ /** Raised rows dropped after their retries (a clearing that depends on one is skipped). */
75
+ private readonly failedKeys;
76
+ /** Raised rows taken out of `pending` and on their way to the bus (a clearing can still find them). */
77
+ private readonly inflight;
78
+ private readonly rate;
79
+ /** The newest watch row on the bus at hydrate: an emit resolving to an id at or below it found an OLD row. */
80
+ private hydratedTail;
81
+ private timer;
82
+ private flushing;
83
+ private readonly now;
84
+ private readonly sleep;
85
+ constructor(deps: EmitterDeps);
86
+ /** Hydrate the feed once from the bus history (§4.8 step 1). */
87
+ hydrate(): Promise<number>;
88
+ start(): void;
89
+ stop(): Promise<void>;
90
+ get waiting(): number;
91
+ private rateOf;
92
+ private envelope;
93
+ /**
94
+ * Queue a raise for `out` (rate and roll-up applied). `replay`: the input came from the boot
95
+ * replay; over the rate such an output is DROPPED rather than rolled up, because the first life
96
+ * may already have counted it and a roll-up row cannot tell (the count may then read low after a
97
+ * restart, never high — a duplicate row is the failure G4 rules out).
98
+ */
99
+ raise(entry: LoadedEntry, runId: string | null, out: Extract<CheckOutput, {
100
+ op: 'raise';
101
+ }>, anchorAt: number, replay?: boolean): void;
102
+ /** Queue the clearing of the row `subject` names (no-op when it was never raised or is already cleared). */
103
+ clear(entry: LoadedEntry, runId: string | null, subject: string, how: {
104
+ reason: 'resolved';
105
+ } | {
106
+ reason: 'dismissed';
107
+ dismissed_by: string;
108
+ }, re?: string): boolean;
109
+ /** Queue the clearing of `watchId` (dismiss uses this directly). */
110
+ clearById(watchId: string, how: {
111
+ reason: 'resolved';
112
+ } | {
113
+ reason: 'dismissed';
114
+ dismissed_by: string;
115
+ }, re?: string): boolean;
116
+ private push;
117
+ /** Emit everything waiting, in order. Concurrent calls share one pass. */
118
+ flush(): Promise<void>;
119
+ private drain;
120
+ private emitOne;
121
+ }
122
+ //# sourceMappingURL=emit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/watch/emit.ts"],"names":[],"mappings":"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"}