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.
- package/dist/api/capture.d.ts +2 -2
- package/dist/api/chat-citations.d.ts +10 -1
- package/dist/api/chat-citations.d.ts.map +1 -1
- package/dist/api/chat-citations.js +28 -0
- package/dist/api/chat-citations.js.map +1 -1
- package/dist/api/chat-scope.d.ts +4 -2
- package/dist/api/chat-scope.d.ts.map +1 -1
- package/dist/api/chat-scope.js +35 -3
- package/dist/api/chat-scope.js.map +1 -1
- package/dist/api/chat-transcripts.d.ts +23 -1
- package/dist/api/chat-transcripts.d.ts.map +1 -1
- package/dist/api/chat-transcripts.js +61 -6
- package/dist/api/chat-transcripts.js.map +1 -1
- package/dist/api/delivery-index.d.ts +21 -0
- package/dist/api/delivery-index.d.ts.map +1 -1
- package/dist/api/delivery-index.js +36 -0
- package/dist/api/delivery-index.js.map +1 -1
- package/dist/api/elicitation-cache.d.ts +12 -0
- package/dist/api/elicitation-cache.d.ts.map +1 -1
- package/dist/api/elicitation-cache.js +17 -1
- package/dist/api/elicitation-cache.js.map +1 -1
- package/dist/api/eval-sample.d.ts +12 -12
- package/dist/api/governance-steering.d.ts.map +1 -1
- package/dist/api/governance-steering.js +1 -0
- package/dist/api/governance-steering.js.map +1 -1
- package/dist/api/mcp.d.ts +4 -4
- package/dist/api/policy-landing.d.ts +55 -0
- package/dist/api/policy-landing.d.ts.map +1 -0
- package/dist/api/policy-landing.js +174 -0
- package/dist/api/policy-landing.js.map +1 -0
- package/dist/api/recording.d.ts +228 -0
- package/dist/api/recording.d.ts.map +1 -0
- package/dist/api/recording.js +1140 -0
- package/dist/api/recording.js.map +1 -0
- package/dist/api/routes.d.ts +42 -39
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +362 -107
- package/dist/api/routes.js.map +1 -1
- package/dist/api/run-timing-index.d.ts +17 -0
- package/dist/api/run-timing-index.d.ts.map +1 -1
- package/dist/api/run-timing-index.js +43 -1
- package/dist/api/run-timing-index.js.map +1 -1
- package/dist/api/server.d.ts +27 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +168 -4
- package/dist/api/server.js.map +1 -1
- package/dist/api/testing.d.ts +4 -4
- package/dist/api/testing.d.ts.map +1 -1
- package/dist/api/testing.js +3 -0
- package/dist/api/testing.js.map +1 -1
- package/dist/api/watch-routes.d.ts +30 -0
- package/dist/api/watch-routes.d.ts.map +1 -0
- package/dist/api/watch-routes.js +104 -0
- package/dist/api/watch-routes.js.map +1 -0
- package/dist/campaigns/routes.d.ts +2 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +20 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/core/adapter.d.ts +52 -1
- package/dist/core/adapter.d.ts.map +1 -1
- package/dist/core/adapter.js +193 -5
- package/dist/core/adapter.js.map +1 -1
- package/dist/core/run-identity.js +1 -1
- package/dist/core/run-identity.js.map +1 -1
- package/dist/core/walkthrough-root.d.ts +21 -0
- package/dist/core/walkthrough-root.d.ts.map +1 -0
- package/dist/core/walkthrough-root.js +66 -0
- package/dist/core/walkthrough-root.js.map +1 -0
- package/dist/decisions/chat-recorder.d.ts +129 -0
- package/dist/decisions/chat-recorder.d.ts.map +1 -0
- package/dist/decisions/chat-recorder.js +367 -0
- package/dist/decisions/chat-recorder.js.map +1 -0
- package/dist/decisions/consider.d.ts +102 -0
- package/dist/decisions/consider.d.ts.map +1 -0
- package/dist/decisions/consider.js +207 -0
- package/dist/decisions/consider.js.map +1 -0
- package/dist/decisions/derive.d.ts +79 -0
- package/dist/decisions/derive.d.ts.map +1 -0
- package/dist/decisions/derive.js +282 -0
- package/dist/decisions/derive.js.map +1 -0
- package/dist/decisions/events.d.ts +25 -0
- package/dist/decisions/events.d.ts.map +1 -0
- package/dist/decisions/events.js +24 -0
- package/dist/decisions/events.js.map +1 -0
- package/dist/decisions/ingest.d.ts +51 -0
- package/dist/decisions/ingest.d.ts.map +1 -0
- package/dist/decisions/ingest.js +100 -0
- package/dist/decisions/ingest.js.map +1 -0
- package/dist/decisions/land.d.ts +100 -0
- package/dist/decisions/land.d.ts.map +1 -0
- package/dist/decisions/land.js +466 -0
- package/dist/decisions/land.js.map +1 -0
- package/dist/decisions/ledger.d.ts +60 -0
- package/dist/decisions/ledger.d.ts.map +1 -0
- package/dist/decisions/ledger.js +246 -0
- package/dist/decisions/ledger.js.map +1 -0
- package/dist/decisions/routes.d.ts +10 -0
- package/dist/decisions/routes.d.ts.map +1 -0
- package/dist/decisions/routes.js +141 -0
- package/dist/decisions/routes.js.map +1 -0
- package/dist/decisions/rules-text.d.ts +21 -0
- package/dist/decisions/rules-text.d.ts.map +1 -0
- package/dist/decisions/rules-text.js +50 -0
- package/dist/decisions/rules-text.js.map +1 -0
- package/dist/decisions/types.d.ts +120 -0
- package/dist/decisions/types.d.ts.map +1 -0
- package/dist/decisions/types.js +19 -0
- package/dist/decisions/types.js.map +1 -0
- package/dist/editors/csp.d.ts +31 -0
- package/dist/editors/csp.d.ts.map +1 -0
- package/dist/editors/csp.js +46 -0
- package/dist/editors/csp.js.map +1 -0
- package/dist/editors/pack-install.d.ts +28 -0
- package/dist/editors/pack-install.d.ts.map +1 -0
- package/dist/editors/pack-install.js +153 -0
- package/dist/editors/pack-install.js.map +1 -0
- package/dist/editors/registry.d.ts +142 -0
- package/dist/editors/registry.d.ts.map +1 -0
- package/dist/editors/registry.js +255 -0
- package/dist/editors/registry.js.map +1 -0
- package/dist/editors/routes.d.ts +46 -0
- package/dist/editors/routes.d.ts.map +1 -0
- package/dist/editors/routes.js +166 -0
- package/dist/editors/routes.js.map +1 -0
- package/dist/interactive/bridge-pool.d.ts +7 -2
- package/dist/interactive/bridge-pool.d.ts.map +1 -1
- package/dist/interactive/bridge-pool.js +6 -1
- package/dist/interactive/bridge-pool.js.map +1 -1
- package/dist/interactive/draft-events.d.ts.map +1 -1
- package/dist/interactive/draft-events.js +1 -0
- package/dist/interactive/draft-events.js.map +1 -1
- package/dist/interactive/theme-events.d.ts +119 -0
- package/dist/interactive/theme-events.d.ts.map +1 -0
- package/dist/interactive/theme-events.js +606 -0
- package/dist/interactive/theme-events.js.map +1 -0
- package/dist/projects/events.d.ts.map +1 -1
- package/dist/projects/events.js +2 -1
- package/dist/projects/events.js.map +1 -1
- package/dist/projects/routes.d.ts +2 -2
- package/dist/projects/state-home-preflight.d.ts.map +1 -1
- package/dist/projects/state-home-preflight.js +3 -0
- package/dist/projects/state-home-preflight.js.map +1 -1
- package/dist/projects/state-home-registry.d.ts.map +1 -1
- package/dist/projects/state-home-registry.js +2 -0
- package/dist/projects/state-home-registry.js.map +1 -1
- package/dist/projects/state-home.d.ts +6 -0
- package/dist/projects/state-home.d.ts.map +1 -1
- package/dist/projects/state-home.js +28 -1
- package/dist/projects/state-home.js.map +1 -1
- package/dist/qe/acceptance.d.ts +45 -4
- package/dist/qe/acceptance.d.ts.map +1 -1
- package/dist/qe/acceptance.js +93 -4
- package/dist/qe/acceptance.js.map +1 -1
- package/dist/qe/ledger.d.ts +20 -0
- package/dist/qe/ledger.d.ts.map +1 -1
- package/dist/qe/ledger.js +34 -0
- package/dist/qe/ledger.js.map +1 -1
- package/dist/qe/walkthrough-acceptance.d.ts +82 -0
- package/dist/qe/walkthrough-acceptance.d.ts.map +1 -0
- package/dist/qe/walkthrough-acceptance.js +248 -0
- package/dist/qe/walkthrough-acceptance.js.map +1 -0
- package/dist/skills/base-skill.d.ts.map +1 -1
- package/dist/skills/base-skill.js +3 -2
- package/dist/skills/base-skill.js.map +1 -1
- package/dist/skills/plugin-source.d.ts +19 -1
- package/dist/skills/plugin-source.d.ts.map +1 -1
- package/dist/skills/plugin-source.js +31 -2
- package/dist/skills/plugin-source.js.map +1 -1
- package/dist/skills/runtime.d.ts +11 -2
- package/dist/skills/runtime.d.ts.map +1 -1
- package/dist/skills/runtime.js +29 -1
- package/dist/skills/runtime.js.map +1 -1
- package/dist/skills/store.d.ts +14 -1
- package/dist/skills/store.d.ts.map +1 -1
- package/dist/skills/store.js +19 -5
- package/dist/skills/store.js.map +1 -1
- package/dist/standing-orders/routes.d.ts +22 -22
- package/dist/standing-orders/store.d.ts +10 -10
- package/dist/watch/checks/check-failed.d.ts +24 -0
- package/dist/watch/checks/check-failed.d.ts.map +1 -0
- package/dist/watch/checks/check-failed.js +56 -0
- package/dist/watch/checks/check-failed.js.map +1 -0
- package/dist/watch/checks/claim-vs-evidence.d.ts +30 -0
- package/dist/watch/checks/claim-vs-evidence.d.ts.map +1 -0
- package/dist/watch/checks/claim-vs-evidence.js +152 -0
- package/dist/watch/checks/claim-vs-evidence.js.map +1 -0
- package/dist/watch/checks/deliver-audit.d.ts +19 -0
- package/dist/watch/checks/deliver-audit.d.ts.map +1 -0
- package/dist/watch/checks/deliver-audit.js +129 -0
- package/dist/watch/checks/deliver-audit.js.map +1 -0
- package/dist/watch/checks/index.d.ts +8 -0
- package/dist/watch/checks/index.d.ts.map +1 -0
- package/dist/watch/checks/index.js +24 -0
- package/dist/watch/checks/index.js.map +1 -0
- package/dist/watch/checks/lag.d.ts +24 -0
- package/dist/watch/checks/lag.d.ts.map +1 -0
- package/dist/watch/checks/lag.js +55 -0
- package/dist/watch/checks/lag.js.map +1 -0
- package/dist/watch/checks/quiet-after-claim.d.ts +17 -0
- package/dist/watch/checks/quiet-after-claim.d.ts.map +1 -0
- package/dist/watch/checks/quiet-after-claim.js +89 -0
- package/dist/watch/checks/quiet-after-claim.js.map +1 -0
- package/dist/watch/checks/ungated.d.ts +12 -0
- package/dist/watch/checks/ungated.d.ts.map +1 -0
- package/dist/watch/checks/ungated.js +64 -0
- package/dist/watch/checks/ungated.js.map +1 -0
- package/dist/watch/checks/warned-rule.d.ts +26 -0
- package/dist/watch/checks/warned-rule.d.ts.map +1 -0
- package/dist/watch/checks/warned-rule.js +126 -0
- package/dist/watch/checks/warned-rule.js.map +1 -0
- package/dist/watch/emit.d.ts +122 -0
- package/dist/watch/emit.d.ts.map +1 -0
- package/dist/watch/emit.js +443 -0
- package/dist/watch/emit.js.map +1 -0
- package/dist/watch/events.d.ts +21 -0
- package/dist/watch/events.d.ts.map +1 -0
- package/dist/watch/events.js +21 -0
- package/dist/watch/events.js.map +1 -0
- package/dist/watch/keys.d.ts +15 -0
- package/dist/watch/keys.d.ts.map +1 -0
- package/dist/watch/keys.js +23 -0
- package/dist/watch/keys.js.map +1 -0
- package/dist/watch/lanes.d.ts +41 -0
- package/dist/watch/lanes.d.ts.map +1 -0
- package/dist/watch/lanes.js +73 -0
- package/dist/watch/lanes.js.map +1 -0
- package/dist/watch/loader.d.ts +47 -0
- package/dist/watch/loader.d.ts.map +1 -0
- package/dist/watch/loader.js +178 -0
- package/dist/watch/loader.js.map +1 -0
- package/dist/watch/registry.d.ts +166 -0
- package/dist/watch/registry.d.ts.map +1 -0
- package/dist/watch/registry.js +589 -0
- package/dist/watch/registry.js.map +1 -0
- package/dist/watch/ring.d.ts +32 -0
- package/dist/watch/ring.d.ts.map +1 -0
- package/dist/watch/ring.js +90 -0
- package/dist/watch/ring.js.map +1 -0
- package/dist/watch/router.d.ts +25 -0
- package/dist/watch/router.d.ts.map +1 -0
- package/dist/watch/router.js +87 -0
- package/dist/watch/router.js.map +1 -0
- package/dist/watch/sources.d.ts +42 -0
- package/dist/watch/sources.d.ts.map +1 -0
- package/dist/watch/sources.js +104 -0
- package/dist/watch/sources.js.map +1 -0
- package/dist/watch/types.d.ts +129 -0
- package/dist/watch/types.d.ts.map +1 -0
- package/dist/watch/types.js +6 -0
- package/dist/watch/types.js.map +1 -0
- package/endpoint-manifest.json +272 -1
- package/package.json +3 -2
- package/watch/entries/claim-vs-evidence.json +13 -0
- package/watch/entries/deliver-audit.json +17 -0
- package/watch/entries/quiet-after-claim.json +16 -0
- package/watch/entries/registry-check-failed.json +12 -0
- package/watch/entries/registry-lagging.json +12 -0
- package/watch/entries/risky-call.json +12 -0
- package/watch/entries/ungated.json +13 -0
- package/dist/api/demo.d.ts +0 -90
- package/dist/api/demo.d.ts.map +0 -1
- package/dist/api/demo.js +0 -492
- package/dist/api/demo.js.map +0 -1
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The push ring (DES-TRIGGER-REGISTRY-001 §4.6): where the daemon fan-in and the watchdog tee drop
|
|
3
|
+
* their key points. A push is O(1) and never blocks the producer.
|
|
4
|
+
*
|
|
5
|
+
* Capacity is shared by three priority classes. On overflow the oldest `p2` item goes first, then
|
|
6
|
+
* the oldest `p1`. A `p0` item is NEVER shed: when only `p0` items remain the ring grows past its
|
|
7
|
+
* capacity rather than lose one (`claim-vs-evidence` and `deliver-audit` are `p0`).
|
|
8
|
+
*/
|
|
9
|
+
/** A growable FIFO with an O(1) shift (a head index, compacted now and then). */
|
|
10
|
+
class Fifo {
|
|
11
|
+
items = [];
|
|
12
|
+
head = 0;
|
|
13
|
+
get length() {
|
|
14
|
+
return this.items.length - this.head;
|
|
15
|
+
}
|
|
16
|
+
push(item) {
|
|
17
|
+
this.items.push(item);
|
|
18
|
+
}
|
|
19
|
+
peek() {
|
|
20
|
+
return this.head < this.items.length ? this.items[this.head] : undefined;
|
|
21
|
+
}
|
|
22
|
+
shift() {
|
|
23
|
+
if (this.head >= this.items.length)
|
|
24
|
+
return undefined;
|
|
25
|
+
const item = this.items[this.head];
|
|
26
|
+
this.items[this.head] = undefined;
|
|
27
|
+
this.head++;
|
|
28
|
+
// Compact once the dead prefix is half the array: amortised O(1), bounded memory.
|
|
29
|
+
if (this.head > 64 && this.head * 2 >= this.items.length) {
|
|
30
|
+
this.items = this.items.slice(this.head);
|
|
31
|
+
this.head = 0;
|
|
32
|
+
}
|
|
33
|
+
return item;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export class PushRing {
|
|
37
|
+
capacity;
|
|
38
|
+
classes = {
|
|
39
|
+
p0: new Fifo(),
|
|
40
|
+
p1: new Fifo(),
|
|
41
|
+
p2: new Fifo(),
|
|
42
|
+
};
|
|
43
|
+
seq = 0;
|
|
44
|
+
hwm = 0;
|
|
45
|
+
shed = { p0: 0, p1: 0, p2: 0 };
|
|
46
|
+
/** Called once per shed item (the registry raises one `registry-lagging` flag per episode). */
|
|
47
|
+
onShed;
|
|
48
|
+
constructor(capacity = 512) {
|
|
49
|
+
this.capacity = capacity;
|
|
50
|
+
}
|
|
51
|
+
get depth() {
|
|
52
|
+
return this.classes.p0.length + this.classes.p1.length + this.classes.p2.length;
|
|
53
|
+
}
|
|
54
|
+
/** O(1); never throws, never blocks. */
|
|
55
|
+
push(item, priority) {
|
|
56
|
+
this.classes[priority].push({ seq: this.seq++, item });
|
|
57
|
+
while (this.depth > this.capacity) {
|
|
58
|
+
const victim = this.classes.p2.length > 0 ? 'p2' : this.classes.p1.length > 0 ? 'p1' : null;
|
|
59
|
+
if (victim === null)
|
|
60
|
+
break; // only p0 left: never shed, grow instead
|
|
61
|
+
this.classes[victim].shift();
|
|
62
|
+
this.shed[victim]++;
|
|
63
|
+
try {
|
|
64
|
+
this.onShed?.(victim);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
/* a reporting hook never breaks the producer's push */
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (this.depth > this.hwm)
|
|
71
|
+
this.hwm = this.depth;
|
|
72
|
+
}
|
|
73
|
+
/** The oldest item across classes, in arrival order. */
|
|
74
|
+
shift() {
|
|
75
|
+
let best = null;
|
|
76
|
+
let bestSeq = Infinity;
|
|
77
|
+
for (const p of ['p0', 'p1', 'p2']) {
|
|
78
|
+
const head = this.classes[p].peek();
|
|
79
|
+
if (head !== undefined && head.seq < bestSeq) {
|
|
80
|
+
best = p;
|
|
81
|
+
bestSeq = head.seq;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return best === null ? undefined : this.classes[best].shift()?.item;
|
|
85
|
+
}
|
|
86
|
+
stats() {
|
|
87
|
+
return { depth: this.depth, hwm: this.hwm, shed_by_priority: { ...this.shed } };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=ring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ring.js","sourceRoot":"","sources":["../../src/watch/ring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The router (DES-TRIGGER-REGISTRY-001 §4.6): which enabled entries a key point reaches.
|
|
3
|
+
*
|
|
4
|
+
* The type set is precomputed per source, so the 68% of CoreEvents that are `unitOutputDelta` are
|
|
5
|
+
* rejected by one `Set.has` on the hot path (`wants`). The filter is JSON-path equality, an AND of
|
|
6
|
+
* keys; an array value means "any of".
|
|
7
|
+
*/
|
|
8
|
+
import type { WatchEntrySource, WatchPriority } from 'wicked-crew-api-types';
|
|
9
|
+
import type { KeyPointInput, LoadedEntry } from './types.js';
|
|
10
|
+
/** True when `event` satisfies every key of `filter` (an array value: any of its members). */
|
|
11
|
+
export declare function matchesFilter(filter: Record<string, unknown>, event: unknown): boolean;
|
|
12
|
+
export declare class Router {
|
|
13
|
+
private readonly byKey;
|
|
14
|
+
private readonly priorityByKey;
|
|
15
|
+
constructor(entries: readonly LoadedEntry[]);
|
|
16
|
+
/** O(1): the input's priority when some enabled entry listens for it, else `null` (drop it). */
|
|
17
|
+
wants(source: WatchEntrySource, type: string): WatchPriority | null;
|
|
18
|
+
/** The enabled entries whose `on` and `filter` the input satisfies. */
|
|
19
|
+
route(input: KeyPointInput): LoadedEntry[];
|
|
20
|
+
/** Every bus type an enabled entry listens for (the bus pull reads only these). */
|
|
21
|
+
busTypes(): string[];
|
|
22
|
+
/** Enabled entries of one source (coverage, internal ticks). */
|
|
23
|
+
entriesOf(source: WatchEntrySource): LoadedEntry[];
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/watch/router.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA4B7D,8FAA8F;AAC9F,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAMtF;AAQD,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;IACrD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoC;gBAEtD,OAAO,EAAE,SAAS,WAAW,EAAE;IAgB3C,gGAAgG;IAChG,KAAK,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAInE,uEAAuE;IACvE,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,WAAW,EAAE;IAM1C,mFAAmF;IACnF,QAAQ,IAAI,MAAM,EAAE;IAIpB,gEAAgE;IAChE,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAG,WAAW,EAAE;CAKnD"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The router (DES-TRIGGER-REGISTRY-001 §4.6): which enabled entries a key point reaches.
|
|
3
|
+
*
|
|
4
|
+
* The type set is precomputed per source, so the 68% of CoreEvents that are `unitOutputDelta` are
|
|
5
|
+
* rejected by one `Set.has` on the hot path (`wants`). The filter is JSON-path equality, an AND of
|
|
6
|
+
* keys; an array value means "any of".
|
|
7
|
+
*/
|
|
8
|
+
const RANK = { p0: 0, p1: 1, p2: 2 };
|
|
9
|
+
/** The value at a dotted path (`"a.b"`), or `undefined`. */
|
|
10
|
+
function at(obj, path) {
|
|
11
|
+
let cur = obj;
|
|
12
|
+
for (const seg of path.split('.')) {
|
|
13
|
+
if (cur === null || typeof cur !== 'object')
|
|
14
|
+
return undefined;
|
|
15
|
+
cur = cur[seg];
|
|
16
|
+
}
|
|
17
|
+
return cur;
|
|
18
|
+
}
|
|
19
|
+
/** JSON-value equality: key order does not matter, array order does. */
|
|
20
|
+
function same(a, b) {
|
|
21
|
+
if (a === b)
|
|
22
|
+
return true;
|
|
23
|
+
if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null)
|
|
24
|
+
return false;
|
|
25
|
+
if (Array.isArray(a) !== Array.isArray(b))
|
|
26
|
+
return false;
|
|
27
|
+
if (Array.isArray(a)) {
|
|
28
|
+
const bb = b;
|
|
29
|
+
return a.length === bb.length && a.every((v, i) => same(v, bb[i]));
|
|
30
|
+
}
|
|
31
|
+
const ka = Object.keys(a);
|
|
32
|
+
const kb = Object.keys(b);
|
|
33
|
+
return ka.length === kb.length && ka.every((k) => Object.hasOwn(b, k) && same(a[k], b[k]));
|
|
34
|
+
}
|
|
35
|
+
/** True when `event` satisfies every key of `filter` (an array value: any of its members). */
|
|
36
|
+
export function matchesFilter(filter, event) {
|
|
37
|
+
for (const [path, want] of Object.entries(filter)) {
|
|
38
|
+
const got = at(event, path);
|
|
39
|
+
if (Array.isArray(want) ? !want.some((w) => same(got, w)) : !same(got, want))
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
export class Router {
|
|
45
|
+
byKey = new Map();
|
|
46
|
+
priorityByKey = new Map();
|
|
47
|
+
constructor(entries) {
|
|
48
|
+
for (const e of entries) {
|
|
49
|
+
if (!e.enabled)
|
|
50
|
+
continue;
|
|
51
|
+
const points = [{ point: e.on, joined: false }, ...(e.join ?? []).map((point) => ({ point, joined: true }))];
|
|
52
|
+
for (const { point, joined } of points) {
|
|
53
|
+
const key = `${point.source}\u0000${point.type}`;
|
|
54
|
+
const list = this.byKey.get(key) ?? [];
|
|
55
|
+
if (list.some((r) => r.entry.id === e.id))
|
|
56
|
+
continue; // a join naming the trigger's own type
|
|
57
|
+
list.push({ entry: e, joined });
|
|
58
|
+
this.byKey.set(key, list);
|
|
59
|
+
const prev = this.priorityByKey.get(key);
|
|
60
|
+
if (prev === undefined || RANK[e.priority] < RANK[prev])
|
|
61
|
+
this.priorityByKey.set(key, e.priority);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** O(1): the input's priority when some enabled entry listens for it, else `null` (drop it). */
|
|
66
|
+
wants(source, type) {
|
|
67
|
+
return this.priorityByKey.get(`${source}\u0000${type}`) ?? null;
|
|
68
|
+
}
|
|
69
|
+
/** The enabled entries whose `on` and `filter` the input satisfies. */
|
|
70
|
+
route(input) {
|
|
71
|
+
const list = this.byKey.get(`${input.source}\u0000${input.type}`);
|
|
72
|
+
if (list === undefined)
|
|
73
|
+
return [];
|
|
74
|
+
return list.filter((r) => r.joined || matchesFilter(r.entry.filter, input.event)).map((r) => r.entry);
|
|
75
|
+
}
|
|
76
|
+
/** Every bus type an enabled entry listens for (the bus pull reads only these). */
|
|
77
|
+
busTypes() {
|
|
78
|
+
return [...this.byKey.keys()].filter((k) => k.startsWith('bus\u0000')).map((k) => k.slice(4));
|
|
79
|
+
}
|
|
80
|
+
/** Enabled entries of one source (coverage, internal ticks). */
|
|
81
|
+
entriesOf(source) {
|
|
82
|
+
return [...this.byKey.entries()]
|
|
83
|
+
.filter(([k]) => k.startsWith(`${source}\u0000`))
|
|
84
|
+
.flatMap(([, v]) => v.filter((r) => !r.joined).map((r) => r.entry));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/watch/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The registry's pulled sources and its `/ws` relay (DES-TRIGGER-REGISTRY-001 §4.5, §4.6).
|
|
3
|
+
*
|
|
4
|
+
* BUS PULL. Bus key points are PULLED through the engine (`tapBus` over `Core.busRead`), never
|
|
5
|
+
* pushed: the tap awaits each row's handler (route, check, emit) before it reads on, so its
|
|
6
|
+
* in-memory cursor advances only after the row's outputs were emitted or recorded as failed. When
|
|
7
|
+
* the lanes are slow the tap simply reads later; the bus is the buffer. Armed only while an enabled
|
|
8
|
+
* entry listens on the bus (none does in TR-W5a; `plan.accepted` arrives with TR-W7).
|
|
9
|
+
*
|
|
10
|
+
* RELAY. Watch rows reach `/ws` as `{type:"watchEvent", event:<bus row>, project_id?}` through a tap
|
|
11
|
+
* of `wicked.crew.watch_finding.**`, the team relay's pattern (`team/ws-relay.ts`). The registry
|
|
12
|
+
* never broadcasts directly, so the socket and the record cannot disagree.
|
|
13
|
+
*/
|
|
14
|
+
import type { CoreEvent } from '../core/types.js';
|
|
15
|
+
import type { KeyPointInput } from './types.js';
|
|
16
|
+
export interface BusPull {
|
|
17
|
+
/** ms between the newest handled row's emit and its handling (0 when caught up). */
|
|
18
|
+
tailLagMs(): number;
|
|
19
|
+
stop(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
/** Arm the bus pull. `wants(type)` is the router's O(1) type check; `handle` is awaited per row. */
|
|
22
|
+
export declare function startBusPull(opts: {
|
|
23
|
+
dbPath: string;
|
|
24
|
+
wants: (type: string) => boolean;
|
|
25
|
+
handle: (input: KeyPointInput) => Promise<void>;
|
|
26
|
+
pollIntervalMs?: number;
|
|
27
|
+
log?: (msg: string) => void;
|
|
28
|
+
}): Promise<BusPull>;
|
|
29
|
+
/** The boot replay's bus half (§4.8 step 2): the wanted rows of the live runs, oldest first. */
|
|
30
|
+
export declare function replayBusRows(dbPath: string, types: readonly string[], liveRuns: ReadonlySet<string>): Promise<KeyPointInput[]>;
|
|
31
|
+
export interface WatchRelay {
|
|
32
|
+
stop(): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
/** Arm the `watchEvent` relay; `null` (logged) when no engine holds the bus. */
|
|
35
|
+
export declare function startWatchWsRelay(opts: {
|
|
36
|
+
dbPath: string;
|
|
37
|
+
projectOf: (runId: string) => string | undefined;
|
|
38
|
+
broadcast: (frame: CoreEvent) => void;
|
|
39
|
+
pollIntervalMs?: number;
|
|
40
|
+
log?: (msg: string) => void;
|
|
41
|
+
}): Promise<WatchRelay | null>;
|
|
42
|
+
//# sourceMappingURL=sources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../src/watch/sources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKhD,MAAM,WAAW,OAAO;IACtB,oFAAoF;IACpF,SAAS,IAAI,MAAM,CAAC;IACpB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAgBD,oGAAoG;AACpG,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACjC,MAAM,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBnB;AAED,gGAAgG;AAChG,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAUrI;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,gFAAgF;AAChF,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACjD,SAAS,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAgC7B"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The registry's pulled sources and its `/ws` relay (DES-TRIGGER-REGISTRY-001 §4.5, §4.6).
|
|
3
|
+
*
|
|
4
|
+
* BUS PULL. Bus key points are PULLED through the engine (`tapBus` over `Core.busRead`), never
|
|
5
|
+
* pushed: the tap awaits each row's handler (route, check, emit) before it reads on, so its
|
|
6
|
+
* in-memory cursor advances only after the row's outputs were emitted or recorded as failed. When
|
|
7
|
+
* the lanes are slow the tap simply reads later; the bus is the buffer. Armed only while an enabled
|
|
8
|
+
* entry listens on the bus (none does in TR-W5a; `plan.accepted` arrives with TR-W7).
|
|
9
|
+
*
|
|
10
|
+
* RELAY. Watch rows reach `/ws` as `{type:"watchEvent", event:<bus row>, project_id?}` through a tap
|
|
11
|
+
* of `wicked.crew.watch_finding.**`, the team relay's pattern (`team/ws-relay.ts`). The registry
|
|
12
|
+
* never broadcasts directly, so the socket and the record cannot disagree.
|
|
13
|
+
*/
|
|
14
|
+
import { readBus, tapBus } from '../core/bus.js';
|
|
15
|
+
import { WATCH_EVENT_FRAME, WATCH_FINDING_PREFIX } from './events.js';
|
|
16
|
+
/** Every bus row the registry may pull starts with this; the router keeps only the wanted types. */
|
|
17
|
+
const BUS_PULL_FILTER = 'wicked.**';
|
|
18
|
+
function inputOf(row, replay) {
|
|
19
|
+
const payload = (row.payload ?? {});
|
|
20
|
+
const runId = typeof payload['run_id'] === 'string' ? payload['run_id'] : null;
|
|
21
|
+
return {
|
|
22
|
+
source: 'bus',
|
|
23
|
+
type: row.event_type,
|
|
24
|
+
event: row,
|
|
25
|
+
runId,
|
|
26
|
+
at: typeof row.emitted_at === 'number' ? row.emitted_at : Date.now(),
|
|
27
|
+
busKey: row.idempotency_key,
|
|
28
|
+
...(replay ? { replay: true } : {}),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** Arm the bus pull. `wants(type)` is the router's O(1) type check; `handle` is awaited per row. */
|
|
32
|
+
export async function startBusPull(opts) {
|
|
33
|
+
let lag = 0;
|
|
34
|
+
let lastHandled = Date.now();
|
|
35
|
+
const tap = await tapBus({
|
|
36
|
+
dbPath: opts.dbPath,
|
|
37
|
+
filter: BUS_PULL_FILTER,
|
|
38
|
+
pollIntervalMs: opts.pollIntervalMs ?? 2_000,
|
|
39
|
+
handler: async (row) => {
|
|
40
|
+
if (!opts.wants(row.event_type))
|
|
41
|
+
return;
|
|
42
|
+
const now = Date.now();
|
|
43
|
+
lag = typeof row.emitted_at === 'number' ? Math.max(0, now - row.emitted_at) : 0;
|
|
44
|
+
lastHandled = now;
|
|
45
|
+
await opts.handle(inputOf(row, false));
|
|
46
|
+
},
|
|
47
|
+
onError: (err) => opts.log?.(`[watch] bus pull read failed (retrying): ${err.message}`),
|
|
48
|
+
});
|
|
49
|
+
return {
|
|
50
|
+
// A pull that has handled nothing for a poll or two is caught up, not "behind".
|
|
51
|
+
tailLagMs: () => (Date.now() - lastHandled > 5_000 ? 0 : lag),
|
|
52
|
+
stop: () => tap.stop(),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/** The boot replay's bus half (§4.8 step 2): the wanted rows of the live runs, oldest first. */
|
|
56
|
+
export async function replayBusRows(dbPath, types, liveRuns) {
|
|
57
|
+
const out = [];
|
|
58
|
+
for (const type of types) {
|
|
59
|
+
for (const row of await readBus(dbPath, type, { history: true })) {
|
|
60
|
+
if (row.event_type !== type)
|
|
61
|
+
continue;
|
|
62
|
+
const input = inputOf(row, true);
|
|
63
|
+
if (input.runId !== null && liveRuns.has(input.runId))
|
|
64
|
+
out.push(input);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return out.sort((a, b) => a.at - b.at);
|
|
68
|
+
}
|
|
69
|
+
/** Arm the `watchEvent` relay; `null` (logged) when no engine holds the bus. */
|
|
70
|
+
export async function startWatchWsRelay(opts) {
|
|
71
|
+
let lastError = null;
|
|
72
|
+
try {
|
|
73
|
+
return await tapBus({
|
|
74
|
+
dbPath: opts.dbPath,
|
|
75
|
+
filter: `${WATCH_FINDING_PREFIX}**`,
|
|
76
|
+
pollIntervalMs: opts.pollIntervalMs ?? 2_000,
|
|
77
|
+
handler: (event) => {
|
|
78
|
+
lastError = null;
|
|
79
|
+
const payload = event.payload;
|
|
80
|
+
const runId = payload?.run_id;
|
|
81
|
+
const projectId = typeof payload?.project_id === 'string'
|
|
82
|
+
? payload.project_id
|
|
83
|
+
: typeof runId === 'string'
|
|
84
|
+
? opts.projectOf(runId)
|
|
85
|
+
: undefined;
|
|
86
|
+
opts.broadcast({
|
|
87
|
+
type: WATCH_EVENT_FRAME,
|
|
88
|
+
event,
|
|
89
|
+
...(projectId !== undefined ? { project_id: projectId } : {}),
|
|
90
|
+
});
|
|
91
|
+
},
|
|
92
|
+
onError: (err) => {
|
|
93
|
+
if (err.message !== lastError)
|
|
94
|
+
opts.log?.(`[watch-relay] bus read failed (retrying): ${err.message}`);
|
|
95
|
+
lastError = err.message;
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
opts.log?.(`[watch-relay] cannot read the bus — /ws carries no watchEvent frames: ${err instanceof Error ? err.message : String(err)}`);
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/watch/sources.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The watch registry's internal shapes (DES-TRIGGER-REGISTRY-001 §4.2, §4.4). The wire shapes are
|
|
3
|
+
* api-types' (`WatchFinding`, `WatchEntry`, …); these are what the runtime passes between its parts.
|
|
4
|
+
*/
|
|
5
|
+
import type { ZodType } from 'zod';
|
|
6
|
+
import type { WatchCoverage, WatchEmitAs, WatchEntrySource, WatchEvidenceRef, WatchKind, WatchPriority, WatchSeverity } from 'wicked-crew-api-types';
|
|
7
|
+
/** One registry entry as loaded from `watch/entries/<id>.json` (before the operator's overrides). */
|
|
8
|
+
export interface LoadedEntry {
|
|
9
|
+
id: string;
|
|
10
|
+
version: number;
|
|
11
|
+
on: {
|
|
12
|
+
source: WatchEntrySource;
|
|
13
|
+
type: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* TR-W5b: the key points the check JOINS to its trigger (DES §4.3 rows 1, 3, 5 — "joined to the
|
|
17
|
+
* same unit's …"). Routed to the check unfiltered so it can fold them; only `on` triggers a row.
|
|
18
|
+
* Absent = none.
|
|
19
|
+
*/
|
|
20
|
+
join?: Array<{
|
|
21
|
+
source: Exclude<WatchEntrySource, 'internal'>;
|
|
22
|
+
type: string;
|
|
23
|
+
}>;
|
|
24
|
+
filter: Record<string, unknown>;
|
|
25
|
+
check: string;
|
|
26
|
+
params: Record<string, unknown>;
|
|
27
|
+
threshold: Record<string, unknown>;
|
|
28
|
+
emit: {
|
|
29
|
+
as: WatchEmitAs;
|
|
30
|
+
severity: WatchSeverity;
|
|
31
|
+
watch_kind: WatchKind;
|
|
32
|
+
attach: 'gate' | null;
|
|
33
|
+
rate: {
|
|
34
|
+
per_run: number;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
priority: WatchPriority;
|
|
38
|
+
enabled: boolean;
|
|
39
|
+
}
|
|
40
|
+
/** One key point, as a source hands it to the router. */
|
|
41
|
+
export interface KeyPointInput {
|
|
42
|
+
source: WatchEntrySource;
|
|
43
|
+
/** The CoreEvent `type`, the bus `event_type`, the watchdog frame `type`, or the internal tick name. */
|
|
44
|
+
type: string;
|
|
45
|
+
/** The event itself (a CoreEvent, a bus row, a watchdog frame, an internal tick). */
|
|
46
|
+
event: Record<string, unknown>;
|
|
47
|
+
/** The run it belongs to, `null` for run-less inputs. */
|
|
48
|
+
runId: string | null;
|
|
49
|
+
/** Unix millis of the source event (the anchor's `at`). */
|
|
50
|
+
at: number;
|
|
51
|
+
/** For a bus input: the source row's idempotency key (its `subject`). */
|
|
52
|
+
busKey?: string;
|
|
53
|
+
/** Set while the boot replay re-reads a live run's persisted events. */
|
|
54
|
+
replay?: boolean;
|
|
55
|
+
}
|
|
56
|
+
/** Per-run state a check may fold into and read back. One bag per (run, entry). */
|
|
57
|
+
export interface RunWatchState {
|
|
58
|
+
runId: string | null;
|
|
59
|
+
/** Event types this run has shown the registry, for coverage ("the engine is too old" and the like). */
|
|
60
|
+
seen: Set<string>;
|
|
61
|
+
bag: Map<string, unknown>;
|
|
62
|
+
}
|
|
63
|
+
/** The registry's own numbers, for the internal checks (`registry-lagging`). */
|
|
64
|
+
export interface RegistryStats {
|
|
65
|
+
queueDepth: number;
|
|
66
|
+
queueHwm: number;
|
|
67
|
+
shedTotal: number;
|
|
68
|
+
tailLagMs: number;
|
|
69
|
+
}
|
|
70
|
+
/** What a check may know about a steering rule (TR-W6 `warned_rule`): never the whole store. */
|
|
71
|
+
export interface WatchRuleBrief {
|
|
72
|
+
effect?: string | undefined;
|
|
73
|
+
severity: string;
|
|
74
|
+
}
|
|
75
|
+
export interface CheckCtx {
|
|
76
|
+
now(): number;
|
|
77
|
+
stats(): RegistryStats;
|
|
78
|
+
/**
|
|
79
|
+
* TR-W6: the registry's bounded snapshot of the daemon's steering rules by id (refreshed on a
|
|
80
|
+
* cadence, never per frame). Absent on a registry without a rule source; rejects when the store
|
|
81
|
+
* cannot be read — a check treats both as "not classifiable", never as "no rule fired".
|
|
82
|
+
*/
|
|
83
|
+
rules?: () => Promise<ReadonlyMap<string, WatchRuleBrief>>;
|
|
84
|
+
}
|
|
85
|
+
/** What a check returns: a row to raise, or a raised row (by subject) that has resolved. */
|
|
86
|
+
export type CheckOutput = {
|
|
87
|
+
op: 'raise';
|
|
88
|
+
/** Producer-assigned identity only (§4.5): `ord:attempt:<type>`, a bus key, a path, a rule id. */
|
|
89
|
+
subject: string;
|
|
90
|
+
sentence: string;
|
|
91
|
+
facts?: Record<string, unknown>;
|
|
92
|
+
ord?: number | null;
|
|
93
|
+
attempt?: number | null;
|
|
94
|
+
/** Overrides the entry's severity (a warned rule carries the rule's own). */
|
|
95
|
+
severity?: WatchSeverity;
|
|
96
|
+
/**
|
|
97
|
+
* TR-W5b: overrides the entry's `emit.as` between `finding` and `flag` (one entry, several
|
|
98
|
+
* arms: deliver-audit's unverified lift is a finding, its skipped lift a flag). Never a
|
|
99
|
+
* proposal, never anything allow-like.
|
|
100
|
+
*/
|
|
101
|
+
kind?: 'finding' | 'flag';
|
|
102
|
+
re: string;
|
|
103
|
+
evidence?: WatchEvidenceRef[];
|
|
104
|
+
/**
|
|
105
|
+
* TR-W6: set only when the row is for an EARLIER key point than the one being evaluated (a
|
|
106
|
+
* frame a check kept and classified later): that key point's own time and replay provenance,
|
|
107
|
+
* so the anchor is the source event's and a replayed row over the rate is still dropped.
|
|
108
|
+
* Absent = the evaluated input's.
|
|
109
|
+
*/
|
|
110
|
+
at?: number;
|
|
111
|
+
replay?: boolean;
|
|
112
|
+
} | {
|
|
113
|
+
op: 'clear';
|
|
114
|
+
subject: string;
|
|
115
|
+
};
|
|
116
|
+
export interface WatchCheck<P = Record<string, unknown>, T = Record<string, unknown>> {
|
|
117
|
+
/** `"deterministic:<name>"` (`"llm:<prompt-ref>@<n>"` lands with TR-W9). */
|
|
118
|
+
name: string;
|
|
119
|
+
lane: 'deterministic' | 'llm';
|
|
120
|
+
paramsSchema: ZodType<P>;
|
|
121
|
+
thresholdSchema: ZodType<T>;
|
|
122
|
+
/** Pure over (input, the run's folded state); 0..n outputs. A throw is counted by the lane, never escapes. */
|
|
123
|
+
evaluate(input: KeyPointInput, state: RunWatchState, params: P, threshold: T, ctx: CheckCtx): Promise<CheckOutput[]> | CheckOutput[];
|
|
124
|
+
/** What this check can see on this run (G7). `null`: the check is run-less and has no run coverage. */
|
|
125
|
+
coverage(state: RunWatchState): Omit<WatchCoverage, 'entry_id'> | null;
|
|
126
|
+
/** The threshold in plain words, for "When Studio speaks up". */
|
|
127
|
+
describe(threshold: T): string;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/watch/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/watch/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|