instar 1.3.32 → 1.3.33
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/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +47 -1
- package/dist/commands/server.js.map +1 -1
- package/dist/core/types.d.ts +16 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/feedback-factory/dryrun/dryRunCompare.d.ts +82 -0
- package/dist/feedback-factory/dryrun/dryRunCompare.d.ts.map +1 -0
- package/dist/feedback-factory/dryrun/dryRunCompare.js +88 -0
- package/dist/feedback-factory/dryrun/dryRunCompare.js.map +1 -0
- package/dist/feedback-factory/processor/parity.d.ts +111 -0
- package/dist/feedback-factory/processor/parity.d.ts.map +1 -0
- package/dist/feedback-factory/processor/parity.js +118 -0
- package/dist/feedback-factory/processor/parity.js.map +1 -0
- package/dist/feedback-factory/store/ReadOnlyShadowStore.d.ts +59 -0
- package/dist/feedback-factory/store/ReadOnlyShadowStore.d.ts.map +1 -0
- package/dist/feedback-factory/store/ReadOnlyShadowStore.js +88 -0
- package/dist/feedback-factory/store/ReadOnlyShadowStore.js.map +1 -0
- package/dist/monitoring/StopNotifier.d.ts +88 -0
- package/dist/monitoring/StopNotifier.d.ts.map +1 -0
- package/dist/monitoring/StopNotifier.js +105 -0
- package/dist/monitoring/StopNotifier.js.map +1 -0
- package/dist/server/AgentServer.d.ts +2 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +1 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/routes.d.ts +4 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +13 -0
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +47 -47
- package/upgrades/1.3.31.md +9 -10
- package/upgrades/1.3.33.md +36 -0
- package/upgrades/side-effects/feedback-factory-dryrun.md +93 -0
- package/upgrades/side-effects/notify-on-stop-layer-b.md +34 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* parity.ts — the Phase-3 live-mirror invariant comparator.
|
|
3
|
+
*
|
|
4
|
+
* docs/specs/feedback-factory-migration.md §2.3/§2.5: the live dual-forward gate
|
|
5
|
+
* compares ONLY order-independent invariants between Portal's processor and the
|
|
6
|
+
* ported Instar processor — because clustering is order-dependent (a report merges
|
|
7
|
+
* into whichever similar cluster already exists) and the two instances will NOT see
|
|
8
|
+
* reports in identical order/timing, a raw cluster-membership diff would fail on
|
|
9
|
+
* benign ordering noise and pressure us to weaken the gate. The spec pins three
|
|
10
|
+
* invariants:
|
|
11
|
+
*
|
|
12
|
+
* 1. FINGERPRINT (per cluster) — `computeFingerprint(cluster.type, cluster.title)`,
|
|
13
|
+
* exactly as the reference's cmd_backfill_fingerprints
|
|
14
|
+
* (:256) derives it. Recomputing it over Portal's
|
|
15
|
+
* LIVE clusters and diffing against the stored
|
|
16
|
+
* fingerprint is a pure cross-implementation
|
|
17
|
+
* equivalence check — fully order-independent and
|
|
18
|
+
* needs no replay. It is the highest-signal gate:
|
|
19
|
+
* it catches the byte-level Python↔JS divergence
|
|
20
|
+
* (Unicode regex classes, SHA encoding, tokenizer/
|
|
21
|
+
* case-fold) on REAL production titles the
|
|
22
|
+
* recorded adversarial corpus may not cover.
|
|
23
|
+
* 2. terminal STATUS per group — keyed by fingerprint (the stable cluster key),
|
|
24
|
+
* NOT raw clusterId (slug IDs differ across
|
|
25
|
+
* instances). Requires Instar's recomputed outcomes.
|
|
26
|
+
* 3. RECURRENCE/cycling count — keyed by fingerprint; chronic-regression
|
|
27
|
+
* accounting that should converge on the same set.
|
|
28
|
+
*
|
|
29
|
+
* This module is PURE. Invariant 1 needs only Portal's stored clusters (read-only).
|
|
30
|
+
* Invariants 2 & 3 compare two pre-computed outcome lists; the runner
|
|
31
|
+
* (dryrun/dryRunCompare.ts) supplies Instar's side from a throwaway replay — never
|
|
32
|
+
* against Portal's DB (see ReadOnlyShadowStore). `divergent === true` is the
|
|
33
|
+
* structural signal that BLOCKS Phase 4 cutover (spec §2.5 Phase 4/5).
|
|
34
|
+
*/
|
|
35
|
+
import { computeFingerprint } from './fingerprint.js';
|
|
36
|
+
/** The canonical fingerprint for a cluster: exactly the reference's per-cluster derivation. */
|
|
37
|
+
export function clusterFingerprint(cluster) {
|
|
38
|
+
return computeFingerprint(cluster.type, cluster.title);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Invariant 1 (fingerprint) — pure, fully order-independent, no replay. Recomputes
|
|
42
|
+
* each Portal cluster's fingerprint via the ported `computeFingerprint` and diffs
|
|
43
|
+
* against the fingerprint Portal stored. Any mismatch is a REAL divergence (the
|
|
44
|
+
* ported fingerprint logic differs from the Python reference on a real title) —
|
|
45
|
+
* never benign ordering noise. This is the live extension of the recorded-corpus
|
|
46
|
+
* fingerprint-parity harness.
|
|
47
|
+
*
|
|
48
|
+
* Clusters with no stored fingerprint (e.g. created before a backfill) are skipped
|
|
49
|
+
* — there is nothing to compare against, and flagging them would be a false positive.
|
|
50
|
+
*/
|
|
51
|
+
export function compareClusterFingerprints(portalClusters) {
|
|
52
|
+
const out = [];
|
|
53
|
+
for (const c of portalClusters) {
|
|
54
|
+
if (!c.fingerprint)
|
|
55
|
+
continue;
|
|
56
|
+
const instar = clusterFingerprint(c);
|
|
57
|
+
if (instar !== c.fingerprint) {
|
|
58
|
+
out.push({ clusterId: c.clusterId, instar, portal: c.fingerprint });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Invariants 2 & 3 (terminal status + recurrence) — keyed by fingerprint, NOT raw
|
|
65
|
+
* clusterId. Compares Instar's recomputed cluster outcomes against Portal's actuals.
|
|
66
|
+
* A fingerprint present on one side but not the other is itself a divergence (the
|
|
67
|
+
* two instances grouped reports differently in a way that matters).
|
|
68
|
+
*/
|
|
69
|
+
export function compareClusterOutcomes(instar, portal) {
|
|
70
|
+
const out = [];
|
|
71
|
+
const instarByFp = new Map(instar.map((c) => [c.fingerprint, c]));
|
|
72
|
+
const portalByFp = new Map(portal.map((c) => [c.fingerprint, c]));
|
|
73
|
+
for (const [fp, p] of portalByFp) {
|
|
74
|
+
const i = instarByFp.get(fp);
|
|
75
|
+
if (!i) {
|
|
76
|
+
out.push({ fingerprint: fp, kind: 'missing-instar', portal: p.status });
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (i.status !== p.status) {
|
|
80
|
+
out.push({ fingerprint: fp, kind: 'status', instar: i.status, portal: p.status });
|
|
81
|
+
}
|
|
82
|
+
if (i.recurrenceCount !== p.recurrenceCount) {
|
|
83
|
+
out.push({
|
|
84
|
+
fingerprint: fp,
|
|
85
|
+
kind: 'recurrence',
|
|
86
|
+
instar: i.recurrenceCount,
|
|
87
|
+
portal: p.recurrenceCount,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
for (const [fp, i] of instarByFp) {
|
|
92
|
+
if (!portalByFp.has(fp)) {
|
|
93
|
+
out.push({ fingerprint: fp, kind: 'missing-portal', instar: i.status });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return out;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Full comparison over all three invariants → the cutover-gating verdict.
|
|
100
|
+
* `instarOutcomes`/`portalOutcomes` are optional: the fingerprint invariant (1) is
|
|
101
|
+
* always run over Portal's clusters; the outcome invariants (2 & 3) run only when
|
|
102
|
+
* both outcome lists are supplied (they require Instar's throwaway replay, which
|
|
103
|
+
* is order-dependent — see dryRunCompare).
|
|
104
|
+
*/
|
|
105
|
+
export function compareInvariants(args) {
|
|
106
|
+
const fingerprintDivergences = compareClusterFingerprints(args.portalClusters);
|
|
107
|
+
const outcomeDivergences = args.instarOutcomes && args.portalOutcomes
|
|
108
|
+
? compareClusterOutcomes(args.instarOutcomes, args.portalOutcomes)
|
|
109
|
+
: [];
|
|
110
|
+
return {
|
|
111
|
+
clustersCompared: args.portalClusters.length,
|
|
112
|
+
outcomesCompared: args.portalOutcomes?.length ?? 0,
|
|
113
|
+
fingerprintDivergences,
|
|
114
|
+
outcomeDivergences,
|
|
115
|
+
divergent: fingerprintDivergences.length > 0 || outcomeDivergences.length > 0,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=parity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parity.js","sourceRoot":"","sources":["../../../src/feedback-factory/processor/parity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReadOnlyShadowStore.ts — the dry-run write-guard for the feedback factory.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1/3 of the migration (docs/specs/feedback-factory-migration.md §2.5) runs
|
|
5
|
+
* the ported Instar processor against Portal's LIVE canonical DB to compare its
|
|
6
|
+
* decisions against Portal's — but **Portal must remain the sole writer** (the
|
|
7
|
+
* one-shared-DB precondition prevents split-brain; two writers would corrupt the
|
|
8
|
+
* curated bug history). This wrapper enforces that structurally rather than by
|
|
9
|
+
* convention: every READ delegates to the wrapped store (Portal's read-only
|
|
10
|
+
* Postgres adapter in production, an InMemoryFeedbackStore in tests); every WRITE
|
|
11
|
+
* throws {@link ShadowStoreWriteError}.
|
|
12
|
+
*
|
|
13
|
+
* Why a guard and not just "don't call the writers": defense in depth. If any code
|
|
14
|
+
* path (e.g. an accidental `processUnprocessed(shadowStore, ...)` — which writes)
|
|
15
|
+
* runs against this store, the FIRST write attempt throws loudly at the seam
|
|
16
|
+
* instead of silently mutating Portal's data. The dry-run runner (dryRunCompare)
|
|
17
|
+
* never writes — it uses the pure comparator — but the guard means a future
|
|
18
|
+
* mis-wire can't quietly fork history. This is the "writes throw as a guard"
|
|
19
|
+
* contract confirmed with Dawn (the domain owner) on 2026-05-27.
|
|
20
|
+
*
|
|
21
|
+
* Structure > Willpower: the read-only guarantee lives in the type, not a comment.
|
|
22
|
+
*/
|
|
23
|
+
import type { FeedbackStore, FeedbackMetrics } from './FeedbackStore.js';
|
|
24
|
+
import type { FeedbackItem, Cluster } from '../processor/types.js';
|
|
25
|
+
import type { ReopenDecision } from '../processor/reopen.js';
|
|
26
|
+
import type { DispatchRecord } from '../dispatch/dispatch.js';
|
|
27
|
+
/** Thrown when any mutating FeedbackStore method is called on a ReadOnlyShadowStore. */
|
|
28
|
+
export declare class ShadowStoreWriteError extends Error {
|
|
29
|
+
/** The mutating method that was (illegally) attempted. */
|
|
30
|
+
readonly method: string;
|
|
31
|
+
constructor(method: string);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Wraps a {@link FeedbackStore} so it is read-only: reads delegate, writes throw.
|
|
35
|
+
* The delegate supplies the reads — in production that's the Prisma read-only
|
|
36
|
+
* adapter over Portal's Postgres (credentials-gated, see dryRunCompare.ts); in
|
|
37
|
+
* tests it's an InMemoryFeedbackStore seeded with a corpus.
|
|
38
|
+
*/
|
|
39
|
+
export declare class ReadOnlyShadowStore implements FeedbackStore {
|
|
40
|
+
private readonly read;
|
|
41
|
+
constructor(read: FeedbackStore);
|
|
42
|
+
getUnprocessedFeedback(): FeedbackItem[];
|
|
43
|
+
getActiveClusters(): Cluster[];
|
|
44
|
+
getCluster(clusterId: string): Cluster | undefined;
|
|
45
|
+
hasFeedback(feedbackId: string): boolean;
|
|
46
|
+
listDispatches(filter?: {
|
|
47
|
+
since?: string;
|
|
48
|
+
type?: string;
|
|
49
|
+
}): DispatchRecord[];
|
|
50
|
+
findDispatchByTitle(title: string): DispatchRecord | undefined;
|
|
51
|
+
metrics(): FeedbackMetrics;
|
|
52
|
+
upsertClusterFromItem(_clusterId: string, _item: FeedbackItem): void;
|
|
53
|
+
mergeIntoCluster(_clusterId: string, _item: FeedbackItem): void;
|
|
54
|
+
applyReopen(_clusterId: string, _decision: ReopenDecision): void;
|
|
55
|
+
markProcessed(_feedbackId: string, _clusterId: string): void;
|
|
56
|
+
addFeedback(_item: FeedbackItem): void;
|
|
57
|
+
createDispatch(_record: DispatchRecord): void;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=ReadOnlyShadowStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReadOnlyShadowStore.d.ts","sourceRoot":"","sources":["../../../src/feedback-factory/store/ReadOnlyShadowStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,wFAAwF;AACxF,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACZ,MAAM,EAAE,MAAM;CAS3B;AAED;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IAC3C,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,aAAa;IAGhD,sBAAsB,IAAI,YAAY,EAAE;IAGxC,iBAAiB,IAAI,OAAO,EAAE;IAG9B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAGlD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAGxC,cAAc,CAAC,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc,EAAE;IAG5E,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAG9D,OAAO,IAAI,eAAe;IAK1B,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;IAGpE,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;IAG/D,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,IAAI;IAGhE,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAG5D,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAGtC,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;CAG9C"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReadOnlyShadowStore.ts — the dry-run write-guard for the feedback factory.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1/3 of the migration (docs/specs/feedback-factory-migration.md §2.5) runs
|
|
5
|
+
* the ported Instar processor against Portal's LIVE canonical DB to compare its
|
|
6
|
+
* decisions against Portal's — but **Portal must remain the sole writer** (the
|
|
7
|
+
* one-shared-DB precondition prevents split-brain; two writers would corrupt the
|
|
8
|
+
* curated bug history). This wrapper enforces that structurally rather than by
|
|
9
|
+
* convention: every READ delegates to the wrapped store (Portal's read-only
|
|
10
|
+
* Postgres adapter in production, an InMemoryFeedbackStore in tests); every WRITE
|
|
11
|
+
* throws {@link ShadowStoreWriteError}.
|
|
12
|
+
*
|
|
13
|
+
* Why a guard and not just "don't call the writers": defense in depth. If any code
|
|
14
|
+
* path (e.g. an accidental `processUnprocessed(shadowStore, ...)` — which writes)
|
|
15
|
+
* runs against this store, the FIRST write attempt throws loudly at the seam
|
|
16
|
+
* instead of silently mutating Portal's data. The dry-run runner (dryRunCompare)
|
|
17
|
+
* never writes — it uses the pure comparator — but the guard means a future
|
|
18
|
+
* mis-wire can't quietly fork history. This is the "writes throw as a guard"
|
|
19
|
+
* contract confirmed with Dawn (the domain owner) on 2026-05-27.
|
|
20
|
+
*
|
|
21
|
+
* Structure > Willpower: the read-only guarantee lives in the type, not a comment.
|
|
22
|
+
*/
|
|
23
|
+
/** Thrown when any mutating FeedbackStore method is called on a ReadOnlyShadowStore. */
|
|
24
|
+
export class ShadowStoreWriteError extends Error {
|
|
25
|
+
/** The mutating method that was (illegally) attempted. */
|
|
26
|
+
method;
|
|
27
|
+
constructor(method) {
|
|
28
|
+
super(`ReadOnlyShadowStore: write method '${method}' is forbidden — the dry-run ` +
|
|
29
|
+
`processor must never mutate the canonical feedback DB (Portal is sole ` +
|
|
30
|
+
`writer through cutover; see feedback-factory-migration.md §2.5).`);
|
|
31
|
+
this.name = 'ShadowStoreWriteError';
|
|
32
|
+
this.method = method;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Wraps a {@link FeedbackStore} so it is read-only: reads delegate, writes throw.
|
|
37
|
+
* The delegate supplies the reads — in production that's the Prisma read-only
|
|
38
|
+
* adapter over Portal's Postgres (credentials-gated, see dryRunCompare.ts); in
|
|
39
|
+
* tests it's an InMemoryFeedbackStore seeded with a corpus.
|
|
40
|
+
*/
|
|
41
|
+
export class ReadOnlyShadowStore {
|
|
42
|
+
read;
|
|
43
|
+
constructor(read) {
|
|
44
|
+
this.read = read;
|
|
45
|
+
}
|
|
46
|
+
// --- reads: delegate verbatim ---
|
|
47
|
+
getUnprocessedFeedback() {
|
|
48
|
+
return this.read.getUnprocessedFeedback();
|
|
49
|
+
}
|
|
50
|
+
getActiveClusters() {
|
|
51
|
+
return this.read.getActiveClusters();
|
|
52
|
+
}
|
|
53
|
+
getCluster(clusterId) {
|
|
54
|
+
return this.read.getCluster(clusterId);
|
|
55
|
+
}
|
|
56
|
+
hasFeedback(feedbackId) {
|
|
57
|
+
return this.read.hasFeedback(feedbackId);
|
|
58
|
+
}
|
|
59
|
+
listDispatches(filter) {
|
|
60
|
+
return this.read.listDispatches(filter);
|
|
61
|
+
}
|
|
62
|
+
findDispatchByTitle(title) {
|
|
63
|
+
return this.read.findDispatchByTitle(title);
|
|
64
|
+
}
|
|
65
|
+
metrics() {
|
|
66
|
+
return this.read.metrics();
|
|
67
|
+
}
|
|
68
|
+
// --- writes: forbidden ---
|
|
69
|
+
upsertClusterFromItem(_clusterId, _item) {
|
|
70
|
+
throw new ShadowStoreWriteError('upsertClusterFromItem');
|
|
71
|
+
}
|
|
72
|
+
mergeIntoCluster(_clusterId, _item) {
|
|
73
|
+
throw new ShadowStoreWriteError('mergeIntoCluster');
|
|
74
|
+
}
|
|
75
|
+
applyReopen(_clusterId, _decision) {
|
|
76
|
+
throw new ShadowStoreWriteError('applyReopen');
|
|
77
|
+
}
|
|
78
|
+
markProcessed(_feedbackId, _clusterId) {
|
|
79
|
+
throw new ShadowStoreWriteError('markProcessed');
|
|
80
|
+
}
|
|
81
|
+
addFeedback(_item) {
|
|
82
|
+
throw new ShadowStoreWriteError('addFeedback');
|
|
83
|
+
}
|
|
84
|
+
createDispatch(_record) {
|
|
85
|
+
throw new ShadowStoreWriteError('createDispatch');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=ReadOnlyShadowStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReadOnlyShadowStore.js","sourceRoot":"","sources":["../../../src/feedback-factory/store/ReadOnlyShadowStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAOH,wFAAwF;AACxF,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,0DAA0D;IACjD,MAAM,CAAS;IACxB,YAAY,MAAc;QACxB,KAAK,CACH,sCAAsC,MAAM,+BAA+B;YACzE,wEAAwE;YACxE,kEAAkE,CACrE,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,mBAAmB;IACD;IAA7B,YAA6B,IAAmB;QAAnB,SAAI,GAAJ,IAAI,CAAe;IAAG,CAAC;IAEpD,mCAAmC;IACnC,sBAAsB;QACpB,OAAO,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAC5C,CAAC;IACD,iBAAiB;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACvC,CAAC;IACD,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IACD,WAAW,CAAC,UAAkB;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IACD,cAAc,CAAC,MAA0C;QACvD,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IACD,mBAAmB,CAAC,KAAa;QAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,4BAA4B;IAC5B,qBAAqB,CAAC,UAAkB,EAAE,KAAmB;QAC3D,MAAM,IAAI,qBAAqB,CAAC,uBAAuB,CAAC,CAAC;IAC3D,CAAC;IACD,gBAAgB,CAAC,UAAkB,EAAE,KAAmB;QACtD,MAAM,IAAI,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;IACtD,CAAC;IACD,WAAW,CAAC,UAAkB,EAAE,SAAyB;QACvD,MAAM,IAAI,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACjD,CAAC;IACD,aAAa,CAAC,WAAmB,EAAE,UAAkB;QACnD,MAAM,IAAI,qBAAqB,CAAC,eAAe,CAAC,CAAC;IACnD,CAAC;IACD,WAAW,CAAC,KAAmB;QAC7B,MAAM,IAAI,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACjD,CAAC;IACD,cAAc,CAAC,OAAuB;QACpC,MAAM,IAAI,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IACpD,CAAC;CACF"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StopNotifier — Layer B of notify-on-stop (docs/specs/NOTIFY-ON-STOP-SPEC.md,
|
|
3
|
+
* Task 2 of the 2026-05-27 silent-stalls postmortem).
|
|
4
|
+
*
|
|
5
|
+
* The UnjustifiedStopGate evaluate route classifies every Stop. In `shadow`
|
|
6
|
+
* mode the gate can judge a stop unjustified (decision `continue`) but CANNOT
|
|
7
|
+
* block it — so the session goes silent anyway. And an `escalate` decision means
|
|
8
|
+
* the gate couldn't even tell. Either way, an UNATTENDED session can stall
|
|
9
|
+
* mid-task and the user never hears about it. StopNotifier turns those specific
|
|
10
|
+
* classifications into ONE plain-English heads-up.
|
|
11
|
+
*
|
|
12
|
+
* It is a thin DECISION layer; delivery discipline (coalescing into one message,
|
|
13
|
+
* the single system/lifeline topic, log-always) is reused from SentinelNotifier
|
|
14
|
+
* via the injected `escalate` sink — StopNotifier never invents a second
|
|
15
|
+
* notification path (post-2026-05-22 topic-spam fix).
|
|
16
|
+
*
|
|
17
|
+
* Signal-vs-authority: the Stop-hook router is a dumb thin client; the decision
|
|
18
|
+
* about whether to ALARM the user lives here on the server, where the gate
|
|
19
|
+
* decision, the session's attended-state, and the dedup ledger all exist.
|
|
20
|
+
*
|
|
21
|
+
* Spam controls (all enforced here):
|
|
22
|
+
* 1. notify-worthy decision set ONLY (shadow+continue, or escalate).
|
|
23
|
+
* 2. attended-gate — by default, only UNATTENDED (autonomous) sessions; an
|
|
24
|
+
* interactive session with the user present doesn't need a ping.
|
|
25
|
+
* 3. per-session dedup — at most one notice per session per cooldown window.
|
|
26
|
+
* 4. master enable flag (default ON — Justin explicitly asked to be told when
|
|
27
|
+
* a session stops; the gates above keep it near-silent in practice).
|
|
28
|
+
*/
|
|
29
|
+
export type StopGateMode = 'off' | 'shadow' | 'enforce';
|
|
30
|
+
export type StopGateDecision = 'continue' | 'allow' | 'escalate' | 'force_allow' | null;
|
|
31
|
+
export type StopNotifyOutcome = 'sent' | 'disabled' | 'not-worthy' | 'skipped-attended' | 'skipped-dedup';
|
|
32
|
+
export interface StopNotifierConfig {
|
|
33
|
+
/** Master gate. Default true (Justin's explicit "tell me why it stopped"). */
|
|
34
|
+
enabled?: boolean;
|
|
35
|
+
/** Only notify for unattended (autonomous) sessions. Default true. */
|
|
36
|
+
unattendedOnly?: boolean;
|
|
37
|
+
/** Per-session dedup window in ms. Default 30 min. */
|
|
38
|
+
cooldownMs?: number;
|
|
39
|
+
}
|
|
40
|
+
export interface StopNotifierDeps {
|
|
41
|
+
/**
|
|
42
|
+
* Delegated delivery — coalesced, single system topic, log-always. Wired in
|
|
43
|
+
* server.ts to a SentinelNotifier.escalate bound to the stop-notify channel.
|
|
44
|
+
* Synchronous fire-and-forget (SentinelNotifier batches + sends async).
|
|
45
|
+
*/
|
|
46
|
+
escalate: (sessionName: string, text: string) => void;
|
|
47
|
+
now?: () => number;
|
|
48
|
+
}
|
|
49
|
+
export interface MaybeNotifyInput {
|
|
50
|
+
sessionId: string;
|
|
51
|
+
mode: StopGateMode;
|
|
52
|
+
decision: StopGateDecision;
|
|
53
|
+
/** Whether the stopping session is an autonomous (unattended) run. */
|
|
54
|
+
autonomousActive: boolean;
|
|
55
|
+
/** Optional short, already-sanitized context for the message (no raw logs). */
|
|
56
|
+
detail?: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* True for the stop classifications that mean "an unjustified/ambiguous stop the
|
|
60
|
+
* user should hear about". Deliberately narrow:
|
|
61
|
+
* - shadow + `continue`: gate believes the stop was unjustified but can't block
|
|
62
|
+
* it (shadow) → the silent stall. THE core incident case.
|
|
63
|
+
* - `escalate`: gate couldn't determine justification → surface it.
|
|
64
|
+
* Everything else stays silent: `allow` (routine/legit completion or awaiting
|
|
65
|
+
* user), `continue` in ENFORCE (the session is blocked & continues — not
|
|
66
|
+
* stopping), `force_allow` (continue-ceiling; operator already has the stuck
|
|
67
|
+
* flag), and the fail-open/null cases (transient; DegradationReporter covers).
|
|
68
|
+
*/
|
|
69
|
+
export declare function isNotifyWorthyStop(mode: StopGateMode, decision: StopGateDecision): boolean;
|
|
70
|
+
export declare class StopNotifier {
|
|
71
|
+
private readonly deps;
|
|
72
|
+
private readonly cfg;
|
|
73
|
+
private readonly lastNotified;
|
|
74
|
+
constructor(deps: StopNotifierDeps, cfg?: StopNotifierConfig);
|
|
75
|
+
get enabled(): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Evaluate a stop-gate decision and, if it is a notify-worthy unattended
|
|
78
|
+
* stall not seen recently, hand a fixed-template heads-up to the delegated
|
|
79
|
+
* sink. Pure-ish: returns the outcome for tests; the only side effect is the
|
|
80
|
+
* (coalesced, log-always) escalate call. Never throws.
|
|
81
|
+
*/
|
|
82
|
+
maybeNotify(input: MaybeNotifyInput): StopNotifyOutcome;
|
|
83
|
+
private sessionName;
|
|
84
|
+
private composeMessage;
|
|
85
|
+
/** Test seam. */
|
|
86
|
+
_resetForTests(): void;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=StopNotifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StopNotifier.d.ts","sourceRoot":"","sources":["../../src/monitoring/StopNotifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AACxD,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,aAAa,GAAG,IAAI,CAAC;AAExF,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,UAAU,GACV,YAAY,GACZ,kBAAkB,GAClB,eAAe,CAAC;AAEpB,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sEAAsE;IACtE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,sEAAsE;IACtE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAQD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAI1F;AAED,qBAAa,YAAY;IAKrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJvB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA+B;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;gBAGvC,IAAI,EAAE,gBAAgB,EACvC,GAAG,GAAE,kBAAuB;IAK9B,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB;IAkBvD,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,cAAc;IAStB,iBAAiB;IACjB,cAAc,IAAI,IAAI;CAGvB"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StopNotifier — Layer B of notify-on-stop (docs/specs/NOTIFY-ON-STOP-SPEC.md,
|
|
3
|
+
* Task 2 of the 2026-05-27 silent-stalls postmortem).
|
|
4
|
+
*
|
|
5
|
+
* The UnjustifiedStopGate evaluate route classifies every Stop. In `shadow`
|
|
6
|
+
* mode the gate can judge a stop unjustified (decision `continue`) but CANNOT
|
|
7
|
+
* block it — so the session goes silent anyway. And an `escalate` decision means
|
|
8
|
+
* the gate couldn't even tell. Either way, an UNATTENDED session can stall
|
|
9
|
+
* mid-task and the user never hears about it. StopNotifier turns those specific
|
|
10
|
+
* classifications into ONE plain-English heads-up.
|
|
11
|
+
*
|
|
12
|
+
* It is a thin DECISION layer; delivery discipline (coalescing into one message,
|
|
13
|
+
* the single system/lifeline topic, log-always) is reused from SentinelNotifier
|
|
14
|
+
* via the injected `escalate` sink — StopNotifier never invents a second
|
|
15
|
+
* notification path (post-2026-05-22 topic-spam fix).
|
|
16
|
+
*
|
|
17
|
+
* Signal-vs-authority: the Stop-hook router is a dumb thin client; the decision
|
|
18
|
+
* about whether to ALARM the user lives here on the server, where the gate
|
|
19
|
+
* decision, the session's attended-state, and the dedup ledger all exist.
|
|
20
|
+
*
|
|
21
|
+
* Spam controls (all enforced here):
|
|
22
|
+
* 1. notify-worthy decision set ONLY (shadow+continue, or escalate).
|
|
23
|
+
* 2. attended-gate — by default, only UNATTENDED (autonomous) sessions; an
|
|
24
|
+
* interactive session with the user present doesn't need a ping.
|
|
25
|
+
* 3. per-session dedup — at most one notice per session per cooldown window.
|
|
26
|
+
* 4. master enable flag (default ON — Justin explicitly asked to be told when
|
|
27
|
+
* a session stops; the gates above keep it near-silent in practice).
|
|
28
|
+
*/
|
|
29
|
+
const DEFAULTS = {
|
|
30
|
+
enabled: true,
|
|
31
|
+
unattendedOnly: true,
|
|
32
|
+
cooldownMs: 30 * 60_000,
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* True for the stop classifications that mean "an unjustified/ambiguous stop the
|
|
36
|
+
* user should hear about". Deliberately narrow:
|
|
37
|
+
* - shadow + `continue`: gate believes the stop was unjustified but can't block
|
|
38
|
+
* it (shadow) → the silent stall. THE core incident case.
|
|
39
|
+
* - `escalate`: gate couldn't determine justification → surface it.
|
|
40
|
+
* Everything else stays silent: `allow` (routine/legit completion or awaiting
|
|
41
|
+
* user), `continue` in ENFORCE (the session is blocked & continues — not
|
|
42
|
+
* stopping), `force_allow` (continue-ceiling; operator already has the stuck
|
|
43
|
+
* flag), and the fail-open/null cases (transient; DegradationReporter covers).
|
|
44
|
+
*/
|
|
45
|
+
export function isNotifyWorthyStop(mode, decision) {
|
|
46
|
+
if (decision === 'escalate')
|
|
47
|
+
return true;
|
|
48
|
+
if (decision === 'continue' && mode === 'shadow')
|
|
49
|
+
return true;
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
export class StopNotifier {
|
|
53
|
+
deps;
|
|
54
|
+
cfg;
|
|
55
|
+
lastNotified = new Map();
|
|
56
|
+
constructor(deps, cfg = {}) {
|
|
57
|
+
this.deps = deps;
|
|
58
|
+
this.cfg = { ...DEFAULTS, ...cfg };
|
|
59
|
+
}
|
|
60
|
+
get enabled() {
|
|
61
|
+
return this.cfg.enabled === true;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Evaluate a stop-gate decision and, if it is a notify-worthy unattended
|
|
65
|
+
* stall not seen recently, hand a fixed-template heads-up to the delegated
|
|
66
|
+
* sink. Pure-ish: returns the outcome for tests; the only side effect is the
|
|
67
|
+
* (coalesced, log-always) escalate call. Never throws.
|
|
68
|
+
*/
|
|
69
|
+
maybeNotify(input) {
|
|
70
|
+
if (!this.enabled)
|
|
71
|
+
return 'disabled';
|
|
72
|
+
if (!isNotifyWorthyStop(input.mode, input.decision))
|
|
73
|
+
return 'not-worthy';
|
|
74
|
+
if (this.cfg.unattendedOnly && !input.autonomousActive)
|
|
75
|
+
return 'skipped-attended';
|
|
76
|
+
const now = (this.deps.now ?? Date.now)();
|
|
77
|
+
const last = this.lastNotified.get(input.sessionId);
|
|
78
|
+
if (last !== undefined && now - last < this.cfg.cooldownMs)
|
|
79
|
+
return 'skipped-dedup';
|
|
80
|
+
this.lastNotified.set(input.sessionId, now);
|
|
81
|
+
try {
|
|
82
|
+
this.deps.escalate(this.sessionName(input.sessionId), this.composeMessage(input));
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Delivery is best-effort; a sink failure must never disturb the route.
|
|
86
|
+
}
|
|
87
|
+
return 'sent';
|
|
88
|
+
}
|
|
89
|
+
sessionName(sessionId) {
|
|
90
|
+
// SentinelNotifier.friendly() trims platform prefixes; pass the id through.
|
|
91
|
+
return sessionId || 'a background session';
|
|
92
|
+
}
|
|
93
|
+
composeMessage(input) {
|
|
94
|
+
const why = input.decision === 'escalate'
|
|
95
|
+
? "stopped mid-task and I couldn't confirm it was a justified place to stop"
|
|
96
|
+
: 'stopped mid-task when it looked like there was still work to do';
|
|
97
|
+
const detail = input.detail ? `\n\n${input.detail}` : '';
|
|
98
|
+
return `A background run ${why}. Want me to pick it back up?${detail}`;
|
|
99
|
+
}
|
|
100
|
+
/** Test seam. */
|
|
101
|
+
_resetForTests() {
|
|
102
|
+
this.lastNotified.clear();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=StopNotifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StopNotifier.js","sourceRoot":"","sources":["../../src/monitoring/StopNotifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAyCH,MAAM,QAAQ,GAAiC;IAC7C,OAAO,EAAE,IAAI;IACb,cAAc,EAAE,IAAI;IACpB,UAAU,EAAE,EAAE,GAAG,MAAM;CACxB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAkB,EAAE,QAA0B;IAC/E,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,QAAQ,KAAK,UAAU,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC9D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,OAAO,YAAY;IAKJ;IAJF,GAAG,CAA+B;IAClC,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE1D,YACmB,IAAsB,EACvC,MAA0B,EAAE;QADX,SAAI,GAAJ,IAAI,CAAkB;QAGvC,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,GAAG,EAAE,CAAC;IACrC,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC;IACnC,CAAC;IAED;;;;;OAKG;IACH,WAAW,CAAC,KAAuB;QACjC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,UAAU,CAAC;QACrC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC;YAAE,OAAO,YAAY,CAAC;QACzE,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,gBAAgB;YAAE,OAAO,kBAAkB,CAAC;QAElF,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,IAAI,KAAK,SAAS,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU;YAAE,OAAO,eAAe,CAAC;QACnF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAE5C,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QACpF,CAAC;QAAC,MAAM,CAAC;YACP,wEAAwE;QAC1E,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,WAAW,CAAC,SAAiB;QACnC,4EAA4E;QAC5E,OAAO,SAAS,IAAI,sBAAsB,CAAC;IAC7C,CAAC;IAEO,cAAc,CAAC,KAAuB;QAC5C,MAAM,GAAG,GACP,KAAK,CAAC,QAAQ,KAAK,UAAU;YAC3B,CAAC,CAAC,0EAA0E;YAC5E,CAAC,CAAC,iEAAiE,CAAC;QACxE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,OAAO,oBAAoB,GAAG,gCAAgC,MAAM,EAAE,CAAC;IACzE,CAAC;IAED,iBAAiB;IACjB,cAAc;QACZ,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -182,6 +182,8 @@ export declare class AgentServer {
|
|
|
182
182
|
unjustifiedStopGate?: import('../core/UnjustifiedStopGate.js').UnjustifiedStopGate;
|
|
183
183
|
/** Stop-gate SQLite persistence (PR3). */
|
|
184
184
|
stopGateDb?: import('../core/StopGateDb.js').StopGateDb;
|
|
185
|
+
/** notify-on-stop Layer B — surfaces genuinely-stuck unattended stops. */
|
|
186
|
+
stopNotifier?: import('../monitoring/StopNotifier.js').StopNotifier | null;
|
|
185
187
|
/** Initiative tracker — persisted record of multi-phase long-running work. */
|
|
186
188
|
initiativeTracker?: import('../core/InitiativeTracker.js').InitiativeTracker;
|
|
187
189
|
/** Project-scope round runner (Phase 1b PR 3). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentServer.d.ts","sourceRoot":"","sources":["../../src/server/AgentServer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"AgentServer.d.ts","sourceRoot":"","sources":["../../src/server/AgentServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -417,6 +417,7 @@ export class AgentServer {
|
|
|
417
417
|
ledgerSessionRegistry: options.ledgerSessionRegistry ?? null,
|
|
418
418
|
unjustifiedStopGate: options.unjustifiedStopGate ?? null,
|
|
419
419
|
stopGateDb: options.stopGateDb ?? null,
|
|
420
|
+
stopNotifier: options.stopNotifier ?? null,
|
|
420
421
|
initiativeTracker: options.initiativeTracker ?? null,
|
|
421
422
|
projectRoundRunner: options.projectRoundRunner ?? null,
|
|
422
423
|
projectDriftChecker: options.projectDriftChecker ?? null,
|