@telora/daemon 0.20.21 → 0.20.32
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/build-info.json +4 -3
- package/dist/audit-phase.d.ts +43 -6
- package/dist/audit-phase.d.ts.map +1 -1
- package/dist/audit-phase.js +124 -23
- package/dist/audit-phase.js.map +1 -1
- package/dist/auto-update.d.ts +87 -0
- package/dist/auto-update.d.ts.map +1 -1
- package/dist/auto-update.js +142 -8
- package/dist/auto-update.js.map +1 -1
- package/dist/cascade-restatement.d.ts +13 -147
- package/dist/cascade-restatement.d.ts.map +1 -1
- package/dist/cascade-restatement.js +13 -429
- package/dist/cascade-restatement.js.map +1 -1
- package/dist/focus-engine.d.ts.map +1 -1
- package/dist/focus-engine.js +15 -0
- package/dist/focus-engine.js.map +1 -1
- package/dist/focus-loop-registry.d.ts.map +1 -1
- package/dist/focus-loop-registry.js +43 -90
- package/dist/focus-loop-registry.js.map +1 -1
- package/dist/focus-loop.d.ts +0 -2
- package/dist/focus-loop.d.ts.map +1 -1
- package/dist/focus-loop.js +33 -25
- package/dist/focus-loop.js.map +1 -1
- package/dist/focus-phase.d.ts +26 -0
- package/dist/focus-phase.d.ts.map +1 -1
- package/dist/focus-phase.js +38 -0
- package/dist/focus-phase.js.map +1 -1
- package/dist/focus-prompt-builder.d.ts.map +1 -1
- package/dist/focus-prompt-builder.js +5 -1
- package/dist/focus-prompt-builder.js.map +1 -1
- package/dist/listener.d.ts.map +1 -1
- package/dist/listener.js +40 -9
- package/dist/listener.js.map +1 -1
- package/dist/loops/llm-client.d.ts.map +1 -1
- package/dist/loops/llm-client.js +17 -4
- package/dist/loops/llm-client.js.map +1 -1
- package/dist/prompt-listing.d.ts +25 -0
- package/dist/prompt-listing.d.ts.map +1 -1
- package/dist/prompt-listing.js +61 -0
- package/dist/prompt-listing.js.map +1 -1
- package/dist/queries/audit-runs.d.ts +56 -2
- package/dist/queries/audit-runs.d.ts.map +1 -1
- package/dist/queries/audit-runs.js +40 -0
- package/dist/queries/audit-runs.js.map +1 -1
- package/dist/queries/deliveries.d.ts +27 -0
- package/dist/queries/deliveries.d.ts.map +1 -1
- package/dist/queries/deliveries.js.map +1 -1
- package/dist/queries/focuses.d.ts +0 -9
- package/dist/queries/focuses.d.ts.map +1 -1
- package/dist/queries/focuses.js +0 -14
- package/dist/queries/focuses.js.map +1 -1
- package/dist/resolvers/index.d.ts +1 -1
- package/dist/resolvers/index.d.ts.map +1 -1
- package/dist/resolvers/index.js +1 -1
- package/dist/resolvers/index.js.map +1 -1
- package/dist/resolvers/shared/audit.d.ts +5 -0
- package/dist/resolvers/shared/audit.d.ts.map +1 -1
- package/dist/resolvers/shared/audit.js +8 -3
- package/dist/resolvers/shared/audit.js.map +1 -1
- package/dist/resolvers/shared/git-diff.d.ts +13 -0
- package/dist/resolvers/shared/git-diff.d.ts.map +1 -1
- package/dist/resolvers/shared/git-diff.js +30 -0
- package/dist/resolvers/shared/git-diff.js.map +1 -1
- package/dist/security-scan-engine.d.ts +9 -1
- package/dist/security-scan-engine.d.ts.map +1 -1
- package/dist/security-scan-engine.js +25 -2
- package/dist/security-scan-engine.js.map +1 -1
- package/dist/spawn/review-role-fallback.d.ts +74 -0
- package/dist/spawn/review-role-fallback.d.ts.map +1 -0
- package/dist/spawn/review-role-fallback.js +62 -0
- package/dist/spawn/review-role-fallback.js.map +1 -0
- package/dist/staleness-sensor.d.ts +153 -0
- package/dist/staleness-sensor.d.ts.map +1 -0
- package/dist/staleness-sensor.js +308 -0
- package/dist/staleness-sensor.js.map +1 -0
- package/dist/unified-shell.d.ts.map +1 -1
- package/dist/unified-shell.js +11 -0
- package/dist/unified-shell.js.map +1 -1
- package/dist/verification-engine.d.ts +17 -1
- package/dist/verification-engine.d.ts.map +1 -1
- package/dist/verification-engine.js +143 -104
- package/dist/verification-engine.js.map +1 -1
- package/dist/verification-feedback.d.ts +68 -1
- package/dist/verification-feedback.d.ts.map +1 -1
- package/dist/verification-feedback.js +175 -0
- package/dist/verification-feedback.js.map +1 -1
- package/dist/verify-reconciliation.d.ts +16 -1
- package/dist/verify-reconciliation.d.ts.map +1 -1
- package/dist/verify-reconciliation.js +18 -2
- package/dist/verify-reconciliation.js.map +1 -1
- package/dist/verify-restatement.d.ts +7 -0
- package/dist/verify-restatement.d.ts.map +1 -1
- package/dist/verify-restatement.js +1 -0
- package/dist/verify-restatement.js.map +1 -1
- package/dist/version-check.d.ts +6 -0
- package/dist/version-check.d.ts.map +1 -1
- package/dist/version-check.js +1 -1
- package/dist/version-check.js.map +1 -1
- package/package.json +2 -2
- package/dist/drift-ratify-loop.d.ts +0 -68
- package/dist/drift-ratify-loop.d.ts.map +0 -1
- package/dist/drift-ratify-loop.js +0 -161
- package/dist/drift-ratify-loop.js.map +0 -1
- package/dist/negative-branch.d.ts +0 -136
- package/dist/negative-branch.d.ts.map +0 -1
- package/dist/negative-branch.js +0 -241
- package/dist/negative-branch.js.map +0 -1
- package/dist/shortfall-disposition-config.d.ts +0 -34
- package/dist/shortfall-disposition-config.d.ts.map +0 -1
- package/dist/shortfall-disposition-config.js +0 -46
- package/dist/shortfall-disposition-config.js.map +0 -1
- package/dist/shortfall-disposition-loop.d.ts +0 -86
- package/dist/shortfall-disposition-loop.d.ts.map +0 -1
- package/dist/shortfall-disposition-loop.js +0 -309
- package/dist/shortfall-disposition-loop.js.map +0 -1
package/dist/auto-update.js
CHANGED
|
@@ -27,6 +27,117 @@ export const EXIT_CODE_UPDATE = 75;
|
|
|
27
27
|
* traffic is unaffected (the candidate version comes from the warm cache).
|
|
28
28
|
*/
|
|
29
29
|
export const DEFAULT_SAMPLE_INTERVAL_MS = 30_000;
|
|
30
|
+
/**
|
|
31
|
+
* Steady-state heartbeat for the default decision-logging sink. In the common
|
|
32
|
+
* "checked and current" / "candidate pending" states the sink suppresses
|
|
33
|
+
* duplicate consecutive lines, but re-emits at least this often so that an
|
|
34
|
+
* ABSENT trace positively identifies a controller that is NOT running (the
|
|
35
|
+
* invisibility this module exists to close: a 7-version gap survived 198h
|
|
36
|
+
* precisely because ran-and-found-nothing looked identical to never-ran).
|
|
37
|
+
* With ~30s sampling, a 1h heartbeat caps steady-state log volume at ~24
|
|
38
|
+
* lines/day while making any >1h silence diagnostic.
|
|
39
|
+
*/
|
|
40
|
+
export const DEFAULT_DECISION_HEARTBEAT_MS = 3_600_000;
|
|
41
|
+
/**
|
|
42
|
+
* Render a decision into a loggable line. Exhaustive over {@link UpdateDecision}
|
|
43
|
+
* (the trailing `never` assignment fails the build if a case is added without a
|
|
44
|
+
* message). All lines share the `[auto-update]` prefix so the trace is greppable
|
|
45
|
+
* and assertable.
|
|
46
|
+
*/
|
|
47
|
+
export function describeUpdateDecision(decision, currentVersion) {
|
|
48
|
+
switch (decision.kind) {
|
|
49
|
+
case 'current':
|
|
50
|
+
return {
|
|
51
|
+
level: 'info',
|
|
52
|
+
steady: true,
|
|
53
|
+
signature: 'current',
|
|
54
|
+
message: `[auto-update] Checked: up to date (v${currentVersion}); no newer version available`,
|
|
55
|
+
};
|
|
56
|
+
case 'candidate-pending':
|
|
57
|
+
return {
|
|
58
|
+
level: 'info',
|
|
59
|
+
steady: true,
|
|
60
|
+
signature: `pending:${decision.reason}:${decision.candidate}`,
|
|
61
|
+
message: decision.reason === 'busy'
|
|
62
|
+
? `[auto-update] Candidate v${decision.candidate} available but daemon busy; waiting for a safe seam (current v${currentVersion})`
|
|
63
|
+
: `[auto-update] Candidate v${decision.candidate} available and idle; awaiting rising idle edge (current v${currentVersion})`,
|
|
64
|
+
};
|
|
65
|
+
case 'drain-armed':
|
|
66
|
+
return {
|
|
67
|
+
level: 'info',
|
|
68
|
+
steady: false,
|
|
69
|
+
signature: `drain-armed:${decision.candidate}`,
|
|
70
|
+
message: `[auto-update] Drain armed to create a safe seam for v${decision.candidate} (current v${currentVersion})`,
|
|
71
|
+
};
|
|
72
|
+
case 'applying':
|
|
73
|
+
return {
|
|
74
|
+
level: 'info',
|
|
75
|
+
steady: false,
|
|
76
|
+
signature: `applying:${decision.trigger}:${decision.candidate}`,
|
|
77
|
+
message: decision.trigger === 'urgent'
|
|
78
|
+
? `[auto-update] URGENT signal set -- applying update v${decision.candidate} mid-batch, preempting in-flight work (current v${currentVersion})`
|
|
79
|
+
: `[auto-update] Batch-safe idle seam reached; applying update v${decision.candidate} (current v${currentVersion})`,
|
|
80
|
+
};
|
|
81
|
+
case 'applied':
|
|
82
|
+
return {
|
|
83
|
+
level: 'info',
|
|
84
|
+
steady: false,
|
|
85
|
+
signature: `applied:${decision.candidate}`,
|
|
86
|
+
message: `[auto-update] Update to v${decision.candidate} installed; signaling restart (exit ${EXIT_CODE_UPDATE})`,
|
|
87
|
+
};
|
|
88
|
+
case 'failed':
|
|
89
|
+
return {
|
|
90
|
+
level: 'warn',
|
|
91
|
+
steady: false,
|
|
92
|
+
signature: `failed:${decision.trigger}:${decision.candidate}`,
|
|
93
|
+
message: decision.trigger === 'urgent'
|
|
94
|
+
? `[auto-update] Urgent install of v${decision.candidate} FAILED: ${decision.error}; will retry next tick`
|
|
95
|
+
: `[auto-update] Install of v${decision.candidate} FAILED at idle seam: ${decision.error}; will retry on the next idle edge`,
|
|
96
|
+
};
|
|
97
|
+
case 'error':
|
|
98
|
+
return {
|
|
99
|
+
level: 'warn',
|
|
100
|
+
steady: false,
|
|
101
|
+
signature: 'error',
|
|
102
|
+
message: `[auto-update] Unexpected error: ${decision.error}`,
|
|
103
|
+
};
|
|
104
|
+
default: {
|
|
105
|
+
const _exhaustive = decision;
|
|
106
|
+
return _exhaustive;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Build the default {@link AutoUpdateDeps.onDecision} sink: it logs every
|
|
112
|
+
* actionable decision immediately (loud on failure), and throttles the
|
|
113
|
+
* recurring steady-state decisions to at most one line per heartbeat window so
|
|
114
|
+
* the log stays readable without ever going fully silent while the controller
|
|
115
|
+
* runs.
|
|
116
|
+
*/
|
|
117
|
+
export function createLoggingDecisionSink(opts) {
|
|
118
|
+
const { logger, currentVersion, heartbeatMs = DEFAULT_DECISION_HEARTBEAT_MS, now = Date.now } = opts;
|
|
119
|
+
let lastSteadySignature = null;
|
|
120
|
+
let lastSteadyLoggedAt = Number.NEGATIVE_INFINITY;
|
|
121
|
+
return (decision) => {
|
|
122
|
+
const described = describeUpdateDecision(decision, currentVersion);
|
|
123
|
+
if (described.steady) {
|
|
124
|
+
const heartbeatDue = now() - lastSteadyLoggedAt >= heartbeatMs;
|
|
125
|
+
if (described.signature === lastSteadySignature && !heartbeatDue)
|
|
126
|
+
return;
|
|
127
|
+
lastSteadySignature = described.signature;
|
|
128
|
+
lastSteadyLoggedAt = now();
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// An actionable event breaks the steady-state run; the next steady tick
|
|
132
|
+
// re-logs its current state rather than being suppressed as a duplicate.
|
|
133
|
+
lastSteadySignature = null;
|
|
134
|
+
}
|
|
135
|
+
if (described.level === 'warn')
|
|
136
|
+
logger.warn(described.message);
|
|
137
|
+
else
|
|
138
|
+
logger.info(described.message);
|
|
139
|
+
};
|
|
140
|
+
}
|
|
30
141
|
/**
|
|
31
142
|
* Run `npm install -g <package>@latest` as a child process.
|
|
32
143
|
* Returns true on success, false on failure.
|
|
@@ -64,7 +175,12 @@ export function performSelfUpdate(packageName) {
|
|
|
64
175
|
* re-arms only when the daemon leaves and re-enters the ready state.
|
|
65
176
|
*/
|
|
66
177
|
export function createUpdateController(deps) {
|
|
67
|
-
const { currentVersion, packageName = '@telora/daemon', isIdle, getCachedCandidateVersion, onUpdateReady, performUpdate = performSelfUpdate, now = Date.now, stalenessThresholdMs = Number.POSITIVE_INFINITY, armDrain = armDrainForUpdate, releaseDrain = releaseDrainForUpdate, isUrgent = () => false, } = deps;
|
|
178
|
+
const { currentVersion, packageName = '@telora/daemon', isIdle, getCachedCandidateVersion, onUpdateReady, performUpdate = performSelfUpdate, now = Date.now, stalenessThresholdMs = Number.POSITIVE_INFINITY, armDrain = armDrainForUpdate, releaseDrain = releaseDrainForUpdate, isUrgent = () => false, decisionHeartbeatMs = DEFAULT_DECISION_HEARTBEAT_MS, onDecision, } = deps;
|
|
179
|
+
// Observability sink: every tick emits exactly one classified decision here.
|
|
180
|
+
// Default logs (heartbeat-throttled) so activity is never fully silent; tests
|
|
181
|
+
// inject their own sink to assert the decision contract.
|
|
182
|
+
const emit = onDecision ??
|
|
183
|
+
createLoggingDecisionSink({ logger: log, currentVersion, heartbeatMs: decisionHeartbeatMs, now });
|
|
68
184
|
// True while the "ready to update" condition (idle + newer version) held on
|
|
69
185
|
// the previous tick. The controller acts only on the false->true transition.
|
|
70
186
|
let wasReady = false;
|
|
@@ -103,13 +219,15 @@ export function createUpdateController(deps) {
|
|
|
103
219
|
// interrupt an in-flight batch, and it is NEVER the loop's own decision.
|
|
104
220
|
// Absent the signal, behavior is exactly deliveries A-C.
|
|
105
221
|
if (haveNewer && isUrgent()) {
|
|
106
|
-
|
|
107
|
-
|
|
222
|
+
// candidate is non-null here (haveNewer implies it).
|
|
223
|
+
const target = candidate;
|
|
224
|
+
emit({ kind: 'applying', candidate: target, trigger: 'urgent' });
|
|
108
225
|
const ok = await performUpdate(packageName);
|
|
109
226
|
if (!ok) {
|
|
110
|
-
|
|
227
|
+
emit({ kind: 'failed', candidate: target, trigger: 'urgent', error: 'npm install did not succeed' });
|
|
111
228
|
return;
|
|
112
229
|
}
|
|
230
|
+
emit({ kind: 'applied', candidate: target });
|
|
113
231
|
onUpdateReady();
|
|
114
232
|
return;
|
|
115
233
|
}
|
|
@@ -124,24 +242,40 @@ export function createUpdateController(deps) {
|
|
|
124
242
|
!idleNow &&
|
|
125
243
|
now() - pendingSince >= stalenessThresholdMs) {
|
|
126
244
|
armDrain();
|
|
245
|
+
emit({ kind: 'drain-armed', candidate: candidate });
|
|
127
246
|
}
|
|
128
247
|
const ready = idleNow && haveNewer;
|
|
129
248
|
const risingEdge = ready && !wasReady;
|
|
130
249
|
wasReady = ready;
|
|
131
|
-
if (!risingEdge)
|
|
250
|
+
if (!risingEdge) {
|
|
251
|
+
// No install this tick -- still emit the classified steady state so the
|
|
252
|
+
// controller's liveness is observable (silence never means "not run").
|
|
253
|
+
if (!haveNewer) {
|
|
254
|
+
emit({ kind: 'current' });
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
emit({
|
|
258
|
+
kind: 'candidate-pending',
|
|
259
|
+
candidate: candidate,
|
|
260
|
+
reason: idleNow ? 'awaiting-idle-edge' : 'busy',
|
|
261
|
+
});
|
|
262
|
+
}
|
|
132
263
|
return;
|
|
133
|
-
|
|
264
|
+
}
|
|
265
|
+
const target = candidate;
|
|
266
|
+
emit({ kind: 'applying', candidate: target, trigger: 'idle-seam' });
|
|
134
267
|
const ok = await performUpdate(packageName);
|
|
135
268
|
if (!ok) {
|
|
136
269
|
// Consume the edge: do not retry until the daemon leaves and re-enters
|
|
137
270
|
// the ready state, so a persistent install failure cannot spam npm.
|
|
138
|
-
|
|
271
|
+
emit({ kind: 'failed', candidate: target, trigger: 'idle-seam', error: 'npm install did not succeed' });
|
|
139
272
|
return;
|
|
140
273
|
}
|
|
274
|
+
emit({ kind: 'applied', candidate: target });
|
|
141
275
|
onUpdateReady();
|
|
142
276
|
}
|
|
143
277
|
catch (err) {
|
|
144
|
-
|
|
278
|
+
emit({ kind: 'error', error: err instanceof Error ? err.message : String(err) });
|
|
145
279
|
}
|
|
146
280
|
}
|
|
147
281
|
return { tick };
|
package/dist/auto-update.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;AAGpD,0DAA0D;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,156 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Shared FRT-restatement type aliases.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
4
|
+
* HISTORY. This module used to host two standing timer ticks:
|
|
5
|
+
* - `runCascadeProseTick` -- eager FRT cascade-prose reconciliation, and
|
|
6
|
+
* - `runNegativeBranchTick` -- periodic negative-branch reservation generation.
|
|
7
|
+
* Both were RETIRED with the continuous drift-reconciliation layer (drift is no
|
|
8
|
+
* longer reconciled on a calendar). Per-injection FRT prose is authored at the
|
|
9
|
+
* verify event (`verify-restatement.ts`), not on a timer, so the eager backstop
|
|
10
|
+
* was redundant; the negative-branch generator was the un-deduped source of the
|
|
11
|
+
* duplicate-proposal pile and had no other consumer.
|
|
11
12
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* (`verify-restatement.ts`) only authors prose for the directly-targeted
|
|
16
|
-
* nodes, and only at verify -- so flipped downstream consequences keep reading
|
|
17
|
-
* as present-tense problems until (and unless) they are themselves a verify
|
|
18
|
-
* target.
|
|
19
|
-
*
|
|
20
|
-
* This module closes that gap. It authors future-state desired-effect prose
|
|
21
|
-
* (`frt_statement`) EAGERLY across the whole resolved cascade -- the targeted
|
|
22
|
-
* UDE plus every downstream resolved consequence -- in future tense, while the
|
|
23
|
-
* CRT base statement stays untouched until verify. It is the "daemon
|
|
24
|
-
* reconciliation backstop" the targetInjection edge comment promises.
|
|
25
|
-
*
|
|
26
|
-
* Reuses the de-restatement prose helper (`authorRestatement`) -- it does NOT
|
|
27
|
-
* duplicate the prompt/model logic -- and the server-side derive-FRT action
|
|
28
|
-
* (`reality_tree_derive_frt`, Delivery A) which returns the engine's derived
|
|
29
|
-
* cascade. Overlay-only: only `frt_statement` is written; node_type and the
|
|
30
|
-
* base statement are left untouched.
|
|
31
|
-
*
|
|
32
|
-
* Idempotent at the prose level: a cascade node that already carries a
|
|
33
|
-
* positive `frt_statement` is skipped (`needsRestatement` is false), so the
|
|
34
|
-
* per-tick scan does not churn already-authored trees.
|
|
13
|
+
* What remains are the two shared type aliases the retire-aware restatement path
|
|
14
|
+
* and the backfill CLI still import (`CallApiFn`, `AuthorRestatementFn`). They
|
|
15
|
+
* live here so those importers keep a stable specifier.
|
|
35
16
|
*
|
|
36
17
|
* @module cascade-restatement
|
|
37
18
|
*/
|
|
38
|
-
import {
|
|
39
|
-
import { proposeNegativeBranchesForInjection as defaultProposeNegativeBranches, type ProposeNegativeBranchesDeps, type ProposeNegativeBranchesResult } from './negative-branch.js';
|
|
40
|
-
import { authorRetiredInjectionRestatements as defaultAuthorRetiredInjectionRestatements } from './retire-aware-restatement.js';
|
|
41
|
-
import { getActiveFocuses } from './queries/deliveries.js';
|
|
42
|
-
import type { DaemonConfig } from './types.js';
|
|
19
|
+
import type { RestatementInputs, RestatementOptions } from './de-restatement.js';
|
|
43
20
|
export type CallApiFn = <T>(action: string, params?: Record<string, unknown>) => Promise<T>;
|
|
44
21
|
export type AuthorRestatementFn = (inputs: RestatementInputs, opts?: RestatementOptions) => Promise<string>;
|
|
45
|
-
/** One FRT-visible node as returned by the derive-FRT action (Delivery A). */
|
|
46
|
-
export interface DerivedFrtNode {
|
|
47
|
-
id: string;
|
|
48
|
-
seq: number;
|
|
49
|
-
derivedNodeType: 'entity' | 'undesired_effect' | 'desired_effect' | 'injection';
|
|
50
|
-
resolved: boolean;
|
|
51
|
-
statement: string;
|
|
52
|
-
frtStatement: string | null;
|
|
53
|
-
}
|
|
54
|
-
/** Shape of the `reality_tree_derive_frt` server action response (Delivery A). */
|
|
55
|
-
export interface DeriveFrtResponse {
|
|
56
|
-
treeId: string;
|
|
57
|
-
clearedNodeIds: string[];
|
|
58
|
-
flippedNodeIds: string[];
|
|
59
|
-
nodes: DerivedFrtNode[];
|
|
60
|
-
}
|
|
61
|
-
export interface AuthorCascadeRestatementsDeps {
|
|
62
|
-
callApi?: CallApiFn;
|
|
63
|
-
authorRestatement?: AuthorRestatementFn;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Author injection-conditioned desired-effect prose across the FULL resolved
|
|
67
|
-
* cascade of a tree (the targeted UDE plus every downstream resolved
|
|
68
|
-
* consequence), eagerly.
|
|
69
|
-
*
|
|
70
|
-
* For each flipped/resolved node that still needs prose, authors one positive
|
|
71
|
-
* future-state sentence conditioned on the tree's active injection statements,
|
|
72
|
-
* then writes it to `frt_statement` via `reality_tree_node_update` (which
|
|
73
|
-
* leaves node_type and the base statement untouched).
|
|
74
|
-
*
|
|
75
|
-
* Best-effort per node: a per-node author-or-write failure is swallowed (that
|
|
76
|
-
* node is recorded as skipped) so one failure never aborts the cascade.
|
|
77
|
-
*
|
|
78
|
-
* Idempotent: a node whose `frt_statement` is already a positive sentence is
|
|
79
|
-
* skipped, not re-authored.
|
|
80
|
-
*/
|
|
81
|
-
export declare function authorCascadeRestatements(treeId: string, deps?: AuthorCascadeRestatementsDeps): Promise<{
|
|
82
|
-
authored: string[];
|
|
83
|
-
skipped: string[];
|
|
84
|
-
}>;
|
|
85
|
-
export interface RunCascadeProseTickDeps {
|
|
86
|
-
callApi?: CallApiFn;
|
|
87
|
-
authorRestatement?: AuthorRestatementFn;
|
|
88
|
-
/** Enumerate active focuses for a product. Defaults to the live query. */
|
|
89
|
-
getActiveFocuses?: typeof getActiveFocuses;
|
|
90
|
-
/** Author cascade prose for one tree. Defaults to authorCascadeRestatements. */
|
|
91
|
-
authorCascadeRestatements?: typeof authorCascadeRestatements;
|
|
92
|
-
/**
|
|
93
|
-
* Retire-aware authoring for one tree (verified/retired injections' flipped
|
|
94
|
-
* UDEs, sourced from node history). Defaults to the real helper. Runs ONLY on
|
|
95
|
-
* the departed-focus catch-up pass -- the completion-time safety net.
|
|
96
|
-
*/
|
|
97
|
-
authorRetiredInjectionRestatements?: typeof defaultAuthorRetiredInjectionRestatements;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Test-only seam: reset the prior-active-focus set so unrelated tests do not
|
|
101
|
-
* leak departed-focus state into one another. Not part of the public API.
|
|
102
|
-
*/
|
|
103
|
-
export declare function __resetProseTickState(): void;
|
|
104
|
-
/**
|
|
105
|
-
* Eager reconciliation tick. For every product -> active focus -> active
|
|
106
|
-
* reality tree that carries at least one applied injection, runs
|
|
107
|
-
* authorCascadeRestatements so flipped cascade nodes get future-state prose
|
|
108
|
-
* without waiting for verify.
|
|
109
|
-
*
|
|
110
|
-
* Additionally diffs the current active-focus set against the prior tick's set
|
|
111
|
-
* and re-scans any focus that JUST departed (completed or cancelled), so a
|
|
112
|
-
* focus that leaves the active scan still gets its resolved cascade authored on
|
|
113
|
-
* the next tick. Idempotency means the re-scan is a no-op once authored.
|
|
114
|
-
*
|
|
115
|
-
* Trees with no applied (derivedNodeType==='injection') injection are skipped
|
|
116
|
-
* cheaply -- there is nothing flipped to restate. Idempotency in
|
|
117
|
-
* authorCascadeRestatements prevents churn on already-authored trees.
|
|
118
|
-
*/
|
|
119
|
-
export declare function runCascadeProseTick(config: DaemonConfig, deps?: RunCascadeProseTickDeps): Promise<{
|
|
120
|
-
treesScanned: number;
|
|
121
|
-
authored: number;
|
|
122
|
-
}>;
|
|
123
|
-
export interface RunNegativeBranchTickDeps {
|
|
124
|
-
callApi?: CallApiFn;
|
|
125
|
-
/** Enumerate active focuses for a product. Defaults to the live query. */
|
|
126
|
-
getActiveFocuses?: typeof getActiveFocuses;
|
|
127
|
-
/** Propose NB candidates for one injection. Defaults to proposeNegativeBranchesForInjection. */
|
|
128
|
-
proposeNegativeBranches?: (inputs: Parameters<typeof defaultProposeNegativeBranches>[0], deps?: ProposeNegativeBranchesDeps) => Promise<ProposeNegativeBranchesResult>;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Background tick that proposes negative-branch reservations for every applied
|
|
132
|
-
* injection that has not yet had candidates generated.
|
|
133
|
-
*
|
|
134
|
-
* Idempotency: an injection is skipped when EITHER
|
|
135
|
-
* (a) it carries a durable `negative_branch_pass_ran_at` marker -- a pass has
|
|
136
|
-
* already COMPLETED for it (clean or not), so re-running would re-probe an
|
|
137
|
-
* injection whose doubt is already discharged; OR
|
|
138
|
-
* (b) any non-dismissed `add_node` proposal with
|
|
139
|
-
* `proposedMetadata.isNegativeBranch === true` and
|
|
140
|
-
* `proposedMetadata.sourceInjectionId === injectionId` already exists for
|
|
141
|
-
* the tree (the pre-marker signal; kept for back-compat with injections
|
|
142
|
-
* that were probed before the durable marker existed).
|
|
143
|
-
*
|
|
144
|
-
* The marker (a) is the load-bearing gate: it distinguishes "ran clean" (marker
|
|
145
|
-
* set, zero proposals) from "never ran" (marker null, zero proposals) -- the
|
|
146
|
-
* proposal-presence check (b) alone cannot. Dismissed proposals are left behind
|
|
147
|
-
* (the user cleared the concern; don't re-surface it).
|
|
148
|
-
*
|
|
149
|
-
* Shares the `TELORA_FRT_PROSE_LOOP` opt-out signal with the prose tick --
|
|
150
|
-
* both are FRT-overlay authoring concerns driven by the same guard.
|
|
151
|
-
*/
|
|
152
|
-
export declare function runNegativeBranchTick(config: DaemonConfig, deps?: RunNegativeBranchTickDeps): Promise<{
|
|
153
|
-
treesScanned: number;
|
|
154
|
-
proposed: number;
|
|
155
|
-
}>;
|
|
156
22
|
//# sourceMappingURL=cascade-restatement.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cascade-restatement.d.ts","sourceRoot":"","sources":["../src/cascade-restatement.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cascade-restatement.d.ts","sourceRoot":"","sources":["../src/cascade-restatement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEjF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAE5F,MAAM,MAAM,mBAAmB,GAAG,CAChC,MAAM,EAAE,iBAAiB,EACzB,IAAI,CAAC,EAAE,kBAAkB,KACtB,OAAO,CAAC,MAAM,CAAC,CAAC"}
|