@telora/daemon 0.17.59 → 0.17.64
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 +15 -3
- package/dist/cascade-restatement.d.ts +10 -0
- package/dist/cascade-restatement.d.ts.map +1 -1
- package/dist/cascade-restatement.js +107 -37
- package/dist/cascade-restatement.js.map +1 -1
- package/dist/ci-escalation.d.ts.map +1 -1
- package/dist/ci-escalation.js +5 -3
- package/dist/ci-escalation.js.map +1 -1
- package/dist/cli/backfill-frt-prose.d.ts +101 -0
- package/dist/cli/backfill-frt-prose.d.ts.map +1 -0
- package/dist/cli/backfill-frt-prose.js +195 -0
- package/dist/cli/backfill-frt-prose.js.map +1 -0
- package/dist/completion/event-escalations.d.ts +4 -11
- package/dist/completion/event-escalations.d.ts.map +1 -1
- package/dist/completion/event-escalations.js +21 -5
- package/dist/completion/event-escalations.js.map +1 -1
- package/dist/completion/event.d.ts +4 -11
- package/dist/completion/event.d.ts.map +1 -1
- package/dist/completion/event.js.map +1 -1
- package/dist/completion/review-exit-phase.d.ts.map +1 -1
- package/dist/completion/review-exit-phase.js +6 -2
- package/dist/completion/review-exit-phase.js.map +1 -1
- package/dist/crash-recovery-cleanup.d.ts.map +1 -1
- package/dist/crash-recovery-cleanup.js +7 -1
- package/dist/crash-recovery-cleanup.js.map +1 -1
- package/dist/crash-recovery-types.d.ts +4 -9
- package/dist/crash-recovery-types.d.ts.map +1 -1
- package/dist/crash-recovery-types.js.map +1 -1
- package/dist/crash-recovery.d.ts +4 -9
- package/dist/crash-recovery.d.ts.map +1 -1
- package/dist/crash-recovery.js +5 -1
- package/dist/crash-recovery.js.map +1 -1
- package/dist/delivery-advance-block.d.ts +8 -6
- package/dist/delivery-advance-block.d.ts.map +1 -1
- package/dist/delivery-advance-block.js +14 -12
- package/dist/delivery-advance-block.js.map +1 -1
- package/dist/delivery-guards.d.ts.map +1 -1
- package/dist/delivery-guards.js +4 -1
- package/dist/delivery-guards.js.map +1 -1
- package/dist/delivery-lifecycle.d.ts.map +1 -1
- package/dist/delivery-lifecycle.js +7 -1
- package/dist/delivery-lifecycle.js.map +1 -1
- package/dist/delivery-merge.d.ts.map +1 -1
- package/dist/delivery-merge.js +5 -1
- package/dist/delivery-merge.js.map +1 -1
- package/dist/directive/directive-dispatch.d.ts.map +1 -1
- package/dist/directive/directive-dispatch.js +4 -1
- package/dist/directive/directive-dispatch.js.map +1 -1
- package/dist/escalation-provenance.d.ts +60 -0
- package/dist/escalation-provenance.d.ts.map +1 -0
- package/dist/escalation-provenance.js +153 -0
- package/dist/escalation-provenance.js.map +1 -0
- package/dist/escalations.d.ts +33 -3
- package/dist/escalations.d.ts.map +1 -1
- package/dist/escalations.js +58 -12
- package/dist/escalations.js.map +1 -1
- package/dist/focus-executor.js +1 -1
- package/dist/focus-executor.js.map +1 -1
- package/dist/focus-merge.d.ts.map +1 -1
- package/dist/focus-merge.js +3 -1
- package/dist/focus-merge.js.map +1 -1
- package/dist/focus-stage-lifecycle.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle.js +5 -2
- package/dist/focus-stage-lifecycle.js.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/listener-auto-advance.d.ts.map +1 -1
- package/dist/listener-auto-advance.js +8 -3
- package/dist/listener-auto-advance.js.map +1 -1
- package/dist/listener.d.ts.map +1 -1
- package/dist/listener.js +6 -0
- package/dist/listener.js.map +1 -1
- package/dist/merge-back-loop.d.ts.map +1 -1
- package/dist/merge-back-loop.js +7 -2
- package/dist/merge-back-loop.js.map +1 -1
- package/dist/nexus-escalation-bridge.d.ts +92 -0
- package/dist/nexus-escalation-bridge.d.ts.map +1 -0
- package/dist/nexus-escalation-bridge.js +109 -0
- package/dist/nexus-escalation-bridge.js.map +1 -0
- package/dist/nexus-incoming.d.ts +47 -0
- package/dist/nexus-incoming.d.ts.map +1 -0
- package/dist/nexus-incoming.js +93 -0
- package/dist/nexus-incoming.js.map +1 -0
- package/dist/nexus-return.d.ts +79 -0
- package/dist/nexus-return.d.ts.map +1 -0
- package/dist/nexus-return.js +193 -0
- package/dist/nexus-return.js.map +1 -0
- package/dist/queries/deliveries.d.ts +12 -0
- package/dist/queries/deliveries.d.ts.map +1 -1
- package/dist/queries/deliveries.js +17 -0
- package/dist/queries/deliveries.js.map +1 -1
- package/dist/queries/issues.d.ts +62 -12
- package/dist/queries/issues.d.ts.map +1 -1
- package/dist/queries/issues.js +46 -13
- package/dist/queries/issues.js.map +1 -1
- package/dist/resolvers/escalation-answers.d.ts +22 -0
- package/dist/resolvers/escalation-answers.d.ts.map +1 -0
- package/dist/resolvers/escalation-answers.js +98 -0
- package/dist/resolvers/escalation-answers.js.map +1 -0
- package/dist/resolvers/index.d.ts.map +1 -1
- package/dist/resolvers/index.js +2 -0
- package/dist/resolvers/index.js.map +1 -1
- package/package.json +3 -3
package/build-info.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"commitSha": "
|
|
3
|
-
"builtAt": "2026-06-
|
|
2
|
+
"commitSha": "f1b85349",
|
|
3
|
+
"builtAt": "2026-06-14T17:15:34.802Z",
|
|
4
4
|
"expectedMigrations": [
|
|
5
5
|
"20250829113330_create_org_nodes_table.sql",
|
|
6
6
|
"20250829113402_fix_function_security_search_path.sql",
|
|
@@ -614,6 +614,18 @@
|
|
|
614
614
|
"20260610211939_add_get_product_issue_counts_rpc.sql",
|
|
615
615
|
"20260610212314_pipeline_config_default_review_enabled.sql",
|
|
616
616
|
"20260612164848_products_default_active.sql",
|
|
617
|
-
"20260613134256_drop_widget_llm_rate_limit_and_audit.sql"
|
|
617
|
+
"20260613134256_drop_widget_llm_rate_limit_and_audit.sql",
|
|
618
|
+
"20260614093000_create_product_requests.sql",
|
|
619
|
+
"20260614093955_add_products_nexus_accept_policy.sql",
|
|
620
|
+
"20260614095312_add_agent_escalations_target_product.sql",
|
|
621
|
+
"20260614122502_reseed_gated_builtin_workflows.sql",
|
|
622
|
+
"20260614125700_agent_escalations_provenance_columns.sql",
|
|
623
|
+
"20260614125701_agent_escalations_disposition.sql",
|
|
624
|
+
"20260614130903_agent_escalations_kind_advance_blocked.sql",
|
|
625
|
+
"20260614132000_add_product_requests_clarification.sql",
|
|
626
|
+
"20260614145313_agent_escalations_kind_nexus_request_resolved.sql",
|
|
627
|
+
"20260614145314_agent_escalations_kind_nexus_clarification_requested.sql",
|
|
628
|
+
"20260614162500_agent_escalations_answer.sql",
|
|
629
|
+
"20260614164700_agent_escalations_answer_consumed.sql"
|
|
618
630
|
]
|
|
619
631
|
}
|
|
@@ -81,12 +81,22 @@ export interface RunCascadeProseTickDeps {
|
|
|
81
81
|
/** Author cascade prose for one tree. Defaults to authorCascadeRestatements. */
|
|
82
82
|
authorCascadeRestatements?: typeof authorCascadeRestatements;
|
|
83
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* Test-only seam: reset the prior-active-focus set so unrelated tests do not
|
|
86
|
+
* leak departed-focus state into one another. Not part of the public API.
|
|
87
|
+
*/
|
|
88
|
+
export declare function __resetProseTickState(): void;
|
|
84
89
|
/**
|
|
85
90
|
* Eager reconciliation tick. For every product -> active focus -> active
|
|
86
91
|
* reality tree that carries at least one applied injection, runs
|
|
87
92
|
* authorCascadeRestatements so flipped cascade nodes get future-state prose
|
|
88
93
|
* without waiting for verify.
|
|
89
94
|
*
|
|
95
|
+
* Additionally diffs the current active-focus set against the prior tick's set
|
|
96
|
+
* and re-scans any focus that JUST departed (completed or cancelled), so a
|
|
97
|
+
* focus that leaves the active scan still gets its resolved cascade authored on
|
|
98
|
+
* the next tick. Idempotency means the re-scan is a no-op once authored.
|
|
99
|
+
*
|
|
90
100
|
* Trees with no applied (derivedNodeType==='injection') injection are skipped
|
|
91
101
|
* cheaply -- there is nothing flipped to restate. Idempotency in
|
|
92
102
|
* authorCascadeRestatements prevents churn on already-authored trees.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cascade-restatement.d.ts","sourceRoot":"","sources":["../src/cascade-restatement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mCAAmC,IAAI,8BAA8B,EACrE,KAAK,2BAA2B,EAChC,KAAK,6BAA6B,EACnC,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,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;AAErB,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,QAAQ,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,WAAW,CAAC;IAChF,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,kFAAkF;AAClF,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,iBAAiB,CAAC,EAAE,mBAAmB,CAAC;CACzC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,6BAAkC,GACvC,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA6CpD;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,iBAAiB,CAAC,EAAE,mBAAmB,CAAC;IACxC,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3C,gFAAgF;IAChF,yBAAyB,CAAC,EAAE,OAAO,yBAAyB,CAAC;CAC9D;AAED
|
|
1
|
+
{"version":3,"file":"cascade-restatement.d.ts","sourceRoot":"","sources":["../src/cascade-restatement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mCAAmC,IAAI,8BAA8B,EACrE,KAAK,2BAA2B,EAChC,KAAK,6BAA6B,EACnC,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,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;AAErB,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,QAAQ,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,WAAW,CAAC;IAChF,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,kFAAkF;AAClF,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,iBAAiB,CAAC,EAAE,mBAAmB,CAAC;CACzC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,6BAAkC,GACvC,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA6CpD;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,iBAAiB,CAAC,EAAE,mBAAmB,CAAC;IACxC,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3C,gFAAgF;IAChF,yBAAyB,CAAC,EAAE,OAAO,yBAAyB,CAAC;CAC9D;AAgGD;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,uBAA4B,GACjC,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAqDrD;AAYD,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3C,gGAAgG;IAChG,uBAAuB,CAAC,EAAE,CACxB,MAAM,EAAE,UAAU,CAAC,OAAO,8BAA8B,CAAC,CAAC,CAAC,CAAC,EAC5D,IAAI,CAAC,EAAE,2BAA2B,KAC/B,OAAO,CAAC,6BAA6B,CAAC,CAAC;CAC7C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,yBAA8B,GACnC,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA6HrD"}
|
|
@@ -89,12 +89,95 @@ export async function authorCascadeRestatements(treeId, deps = {}) {
|
|
|
89
89
|
}
|
|
90
90
|
return { authored, skipped };
|
|
91
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Scan one focus's active reality trees and author cascade prose for any tree
|
|
94
|
+
* carrying at least one applied injection.
|
|
95
|
+
*
|
|
96
|
+
* Trees with no applied (derivedNodeType==='injection') injection are skipped
|
|
97
|
+
* cheaply via the derive-FRT pre-check -- there is nothing flipped to restate,
|
|
98
|
+
* so they do NOT increment treesScanned. Idempotency in
|
|
99
|
+
* authorCascadeRestatements prevents churn on already-authored trees.
|
|
100
|
+
*
|
|
101
|
+
* Shared by both the active-focus pass and the departed-focus catch-up pass so
|
|
102
|
+
* behavior is identical regardless of how the focus entered the scan.
|
|
103
|
+
*/
|
|
104
|
+
async function scanFocusTreesForProse(focusId, deps) {
|
|
105
|
+
let treesScanned = 0;
|
|
106
|
+
let authored = 0;
|
|
107
|
+
let trees;
|
|
108
|
+
try {
|
|
109
|
+
const resp = await deps.callApi('reality_tree_list', {
|
|
110
|
+
focusId,
|
|
111
|
+
});
|
|
112
|
+
trees = (resp.items ?? []).filter((t) => t.status === 'active');
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
console.warn(`[frt-prose] reality_tree_list failed for focus ${focusId}:`, err.message);
|
|
116
|
+
return { treesScanned, authored };
|
|
117
|
+
}
|
|
118
|
+
for (const tree of trees) {
|
|
119
|
+
// Cheap pre-check: derive the FRT once, skip trees with no applied
|
|
120
|
+
// injection (nothing flipped to restate).
|
|
121
|
+
let derived;
|
|
122
|
+
try {
|
|
123
|
+
derived = await deps.callApi('reality_tree_derive_frt', {
|
|
124
|
+
treeId: tree.id,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
console.warn(`[frt-prose] derive_frt failed for tree ${tree.id}:`, err.message);
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
const hasInjection = (derived.nodes ?? []).some((n) => n.derivedNodeType === 'injection' && n.statement && n.statement.trim() !== '');
|
|
132
|
+
if (!hasInjection)
|
|
133
|
+
continue;
|
|
134
|
+
treesScanned += 1;
|
|
135
|
+
try {
|
|
136
|
+
const res = await deps.authorCascadeRestatements(tree.id, {
|
|
137
|
+
callApi: deps.callApi,
|
|
138
|
+
authorRestatement: deps.authorRestatement,
|
|
139
|
+
});
|
|
140
|
+
authored += res.authored.length;
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
console.warn(`[frt-prose] authorCascadeRestatements failed for tree ${tree.id}:`, err.message);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return { treesScanned, authored };
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Focus IDs that were active on the PRIOR tick. focus.status is
|
|
150
|
+
* human-controlled and the daemon never observes a "focus completed" event, so
|
|
151
|
+
* a focus that completes (or is cancelled) simply drops out of
|
|
152
|
+
* getActiveFocuses. We diff against this set each tick to catch focuses that
|
|
153
|
+
* JUST left the active scan and author their resolved cascade once more -- the
|
|
154
|
+
* go-forward half of "every focus is authored before it completes". A focus
|
|
155
|
+
* that completed faster than a tick, before the loop existed, or with the loop
|
|
156
|
+
* opted out is the back-fill (historical) half, handled separately.
|
|
157
|
+
*
|
|
158
|
+
* Module-level so it persists across ticks within one daemon process. Restart
|
|
159
|
+
* resets it to empty: a fresh process simply observes the now-departed focus as
|
|
160
|
+
* never-seen and the historical back-fill covers it, so no authoring is lost.
|
|
161
|
+
*/
|
|
162
|
+
let priorActiveFocusIds = new Set();
|
|
163
|
+
/**
|
|
164
|
+
* Test-only seam: reset the prior-active-focus set so unrelated tests do not
|
|
165
|
+
* leak departed-focus state into one another. Not part of the public API.
|
|
166
|
+
*/
|
|
167
|
+
export function __resetProseTickState() {
|
|
168
|
+
priorActiveFocusIds = new Set();
|
|
169
|
+
}
|
|
92
170
|
/**
|
|
93
171
|
* Eager reconciliation tick. For every product -> active focus -> active
|
|
94
172
|
* reality tree that carries at least one applied injection, runs
|
|
95
173
|
* authorCascadeRestatements so flipped cascade nodes get future-state prose
|
|
96
174
|
* without waiting for verify.
|
|
97
175
|
*
|
|
176
|
+
* Additionally diffs the current active-focus set against the prior tick's set
|
|
177
|
+
* and re-scans any focus that JUST departed (completed or cancelled), so a
|
|
178
|
+
* focus that leaves the active scan still gets its resolved cascade authored on
|
|
179
|
+
* the next tick. Idempotency means the re-scan is a no-op once authored.
|
|
180
|
+
*
|
|
98
181
|
* Trees with no applied (derivedNodeType==='injection') injection are skipped
|
|
99
182
|
* cheaply -- there is nothing flipped to restate. Idempotency in
|
|
100
183
|
* authorCascadeRestatements prevents churn on already-authored trees.
|
|
@@ -103,8 +186,16 @@ export async function runCascadeProseTick(config, deps = {}) {
|
|
|
103
186
|
const callApi = deps.callApi ?? defaultCallApi;
|
|
104
187
|
const listFocuses = deps.getActiveFocuses ?? getActiveFocuses;
|
|
105
188
|
const authorCascade = deps.authorCascadeRestatements ?? authorCascadeRestatements;
|
|
189
|
+
const scanDeps = {
|
|
190
|
+
callApi,
|
|
191
|
+
authorRestatement: deps.authorRestatement,
|
|
192
|
+
authorCascadeRestatements: authorCascade,
|
|
193
|
+
};
|
|
106
194
|
let treesScanned = 0;
|
|
107
195
|
let authored = 0;
|
|
196
|
+
// The current tick's active-focus IDs, accumulated across all products so the
|
|
197
|
+
// departed-focus diff is computed against the whole scan, not per product.
|
|
198
|
+
const currentActiveFocusIds = new Set();
|
|
108
199
|
for (const product of config.products) {
|
|
109
200
|
const pc = configForProduct(config, product);
|
|
110
201
|
let focuses;
|
|
@@ -116,45 +207,24 @@ export async function runCascadeProseTick(config, deps = {}) {
|
|
|
116
207
|
continue;
|
|
117
208
|
}
|
|
118
209
|
for (const focus of focuses) {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
});
|
|
124
|
-
trees = (resp.items ?? []).filter((t) => t.status === 'active');
|
|
125
|
-
}
|
|
126
|
-
catch (err) {
|
|
127
|
-
console.warn(`[frt-prose] reality_tree_list failed for focus ${focus.focus_id}:`, err.message);
|
|
128
|
-
continue;
|
|
129
|
-
}
|
|
130
|
-
for (const tree of trees) {
|
|
131
|
-
// Cheap pre-check: derive the FRT once, skip trees with no applied
|
|
132
|
-
// injection (nothing flipped to restate).
|
|
133
|
-
let derived;
|
|
134
|
-
try {
|
|
135
|
-
derived = await callApi('reality_tree_derive_frt', { treeId: tree.id });
|
|
136
|
-
}
|
|
137
|
-
catch (err) {
|
|
138
|
-
console.warn(`[frt-prose] derive_frt failed for tree ${tree.id}:`, err.message);
|
|
139
|
-
continue;
|
|
140
|
-
}
|
|
141
|
-
const hasInjection = (derived.nodes ?? []).some((n) => n.derivedNodeType === 'injection' && n.statement && n.statement.trim() !== '');
|
|
142
|
-
if (!hasInjection)
|
|
143
|
-
continue;
|
|
144
|
-
treesScanned += 1;
|
|
145
|
-
try {
|
|
146
|
-
const res = await authorCascade(tree.id, {
|
|
147
|
-
callApi,
|
|
148
|
-
authorRestatement: deps.authorRestatement,
|
|
149
|
-
});
|
|
150
|
-
authored += res.authored.length;
|
|
151
|
-
}
|
|
152
|
-
catch (err) {
|
|
153
|
-
console.warn(`[frt-prose] authorCascadeRestatements failed for tree ${tree.id}:`, err.message);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
210
|
+
currentActiveFocusIds.add(focus.focus_id);
|
|
211
|
+
const res = await scanFocusTreesForProse(focus.focus_id, scanDeps);
|
|
212
|
+
treesScanned += res.treesScanned;
|
|
213
|
+
authored += res.authored;
|
|
156
214
|
}
|
|
157
215
|
}
|
|
216
|
+
// Departed focuses: seen active on the prior tick, absent now. Each just left
|
|
217
|
+
// the active scan (completed or cancelled); author its resolved cascade one
|
|
218
|
+
// more time so it never leaves unauthored. Idempotent on already-authored
|
|
219
|
+
// trees and a no-op for departed focuses with no applied injection.
|
|
220
|
+
for (const focusId of priorActiveFocusIds) {
|
|
221
|
+
if (currentActiveFocusIds.has(focusId))
|
|
222
|
+
continue;
|
|
223
|
+
const res = await scanFocusTreesForProse(focusId, scanDeps);
|
|
224
|
+
treesScanned += res.treesScanned;
|
|
225
|
+
authored += res.authored;
|
|
226
|
+
}
|
|
227
|
+
priorActiveFocusIds = currentActiveFocusIds;
|
|
158
228
|
return { treesScanned, authored };
|
|
159
229
|
}
|
|
160
230
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cascade-restatement.js","sourceRoot":"","sources":["../src/cascade-restatement.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cascade-restatement.js","sourceRoot":"","sources":["../src/cascade-restatement.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ci-escalation.d.ts","sourceRoot":"","sources":["../src/ci-escalation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,OAAO,EACrB,MAAM,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAET;AAED,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"ci-escalation.d.ts","sourceRoot":"","sources":["../src/ci-escalation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,OAAO,EACrB,MAAM,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAET;AAED,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAoCf"}
|
package/dist/ci-escalation.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* non-fast-forward, network — the failure must surface as a visible
|
|
7
7
|
* escalation rather than disappearing into the log.
|
|
8
8
|
*/
|
|
9
|
-
import { ESCALATION_REASONS } from '@telora/daemon-core';
|
|
9
|
+
import { ESCALATION_REASONS, ESCALATION_DISPOSITIONS } from '@telora/daemon-core';
|
|
10
10
|
import { createEscalation } from './queries/issues.js';
|
|
11
11
|
export const CD_PUSH_FAILED_KIND = 'cd_push_failed';
|
|
12
12
|
/**
|
|
@@ -36,6 +36,9 @@ export async function fileCdPushEscalation(params) {
|
|
|
36
36
|
sessionId,
|
|
37
37
|
issueId: null,
|
|
38
38
|
reasonType: ESCALATION_REASONS.ERROR_ENCOUNTERED,
|
|
39
|
+
// Operator triage: auth / branch protection / network at the remote.
|
|
40
|
+
disposition: ESCALATION_DISPOSITIONS.NEEDS_OPERATOR,
|
|
41
|
+
anchor: { focusId, branch: integrationBranch },
|
|
39
42
|
description: `CD push to remote failed after merging ${integrationBranch} into main.\n\n` +
|
|
40
43
|
`**Focus:** ${focusName}\n` +
|
|
41
44
|
`**Focus ID:** ${focusId}\n` +
|
|
@@ -46,9 +49,8 @@ export async function fileCdPushEscalation(params) {
|
|
|
46
49
|
helpNeeded: `Inspect the push failure cause (auth / branch protection / network), ` +
|
|
47
50
|
`resolve it, and retry by re-triggering CI on this focus.`,
|
|
48
51
|
escalationKind: CD_PUSH_FAILED_KIND,
|
|
52
|
+
// Evidence/payload only -- focus provenance lives in the columns (anchor).
|
|
49
53
|
metadata: {
|
|
50
|
-
focus_id: focusId,
|
|
51
|
-
focus_name: focusName,
|
|
52
54
|
integration_branch: integrationBranch,
|
|
53
55
|
push_error: pushError,
|
|
54
56
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ci-escalation.js","sourceRoot":"","sources":["../src/ci-escalation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"ci-escalation.js","sourceRoot":"","sources":["../src/ci-escalation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,0BAA0B,CACxC,YAAqB,EACrB,MAA4C;IAE5C,OAAO,YAAY,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzF,CAAC;AAWD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAA8B;IAE9B,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAC/F,IAAI,CAAC;QACH,MAAM,gBAAgB,CAAC;YACrB,cAAc;YACd,SAAS;YACT,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,kBAAkB,CAAC,iBAAiB;YAChD,qEAAqE;YACrE,WAAW,EAAE,uBAAuB,CAAC,cAAc;YACnD,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE;YAC9C,WAAW,EACT,0CAA0C,iBAAiB,iBAAiB;gBAC5E,cAAc,SAAS,IAAI;gBAC3B,iBAAiB,OAAO,IAAI;gBAC5B,cAAc,SAAS,MAAM;gBAC7B,oFAAoF;gBACpF,6DAA6D;YAC/D,YAAY,EAAE,+CAA+C;YAC7D,UAAU,EACR,uEAAuE;gBACvE,0DAA0D;YAC5D,cAAc,EAAE,mBAAmB;YACnC,2EAA2E;YAC3E,QAAQ,EAAE;gBACR,kBAAkB,EAAE,iBAAiB;gBACrC,UAAU,EAAE,SAAS;aACtB;SACF,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,kDAAkD,OAAO,MAAM,SAAS,IAAI,CAAC,CAAC;IAC5F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,2DAA2D,OAAO,GAAG,EACpE,GAAa,CAAC,OAAO,CACvB,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `telora-daemon backfill-frt-prose` subcommand.
|
|
3
|
+
*
|
|
4
|
+
* One-off, idempotent repair of FRT desired-effect prose (`frt_statement`)
|
|
5
|
+
* across the resolved cascade of reality trees belonging to COMPLETED focuses.
|
|
6
|
+
*
|
|
7
|
+
* Why this exists: the eager cascade-prose loop (`runCascadeProseTick`) only
|
|
8
|
+
* scans ACTIVE focuses. A focus whose FRT prose was never authored before it
|
|
9
|
+
* completed therefore never gets authored and never gets backfilled -- the loop
|
|
10
|
+
* has stopped scanning it. The Ship Log then falls back to present-tense UDE
|
|
11
|
+
* text for those already-shipped entries. This command repairs that historical
|
|
12
|
+
* tail. The sibling go-forward fix (completion-time authoring) owns ACTIVE
|
|
13
|
+
* focuses; this command deliberately touches COMPLETED focuses ONLY.
|
|
14
|
+
*
|
|
15
|
+
* Idempotent: it reuses `authorCascadeRestatements`, which skips any cascade
|
|
16
|
+
* node that already carries positive prose (`needsRestatement` is false). Re-runs
|
|
17
|
+
* are safe and converge to a no-op.
|
|
18
|
+
*
|
|
19
|
+
* ---------------------------------------------------------------------------
|
|
20
|
+
* OPERATOR RUNBOOK
|
|
21
|
+
* ---------------------------------------------------------------------------
|
|
22
|
+
* This repair only matters against PROD. The local DB has no real completed
|
|
23
|
+
* focuses with applied injections, so a local run is a near-instant no-op.
|
|
24
|
+
*
|
|
25
|
+
* Point the daemon CLI at the prod config (the `~/.telora/daemon.json` that
|
|
26
|
+
* carries the prod `teloraUrl` = https://api.syntelyos.com + the prod tracker)
|
|
27
|
+
* and ALWAYS dry-run first:
|
|
28
|
+
*
|
|
29
|
+
* # 1. Preview -- no model calls, no writes. Lists every focus/tree/node
|
|
30
|
+
* # that WOULD be authored.
|
|
31
|
+
* telora-daemon backfill-frt-prose --dry-run
|
|
32
|
+
*
|
|
33
|
+
* # (optional) scope to a single product while validating:
|
|
34
|
+
* telora-daemon backfill-frt-prose --dry-run --product <product-uuid>
|
|
35
|
+
*
|
|
36
|
+
* # 2. Once the preview looks right, run for real. Authors prose via the
|
|
37
|
+
* # `claude` CLI per candidate node and writes frt_statement.
|
|
38
|
+
* telora-daemon backfill-frt-prose
|
|
39
|
+
*
|
|
40
|
+
* Post-run Ship Log sanity check: open the Ship Log for one of the completed
|
|
41
|
+
* focuses the run reported as authored and confirm its flipped UDE entries now
|
|
42
|
+
* read as future-state desired-effect prose rather than the present-tense
|
|
43
|
+
* problem text (`buildShipLog.ts` falls back to UDE text only when
|
|
44
|
+
* `frt_statement` is null/blank). If an entry still reads present-tense, check
|
|
45
|
+
* that its node was in the resolved cascade (flipped or `resolved===true`) for
|
|
46
|
+
* that tree -- surviving UDEs are intentionally left untouched.
|
|
47
|
+
*
|
|
48
|
+
* @module cli/backfill-frt-prose
|
|
49
|
+
*/
|
|
50
|
+
import { loadConfig } from '../config.js';
|
|
51
|
+
import { initSupabase } from '../queries/shared.js';
|
|
52
|
+
import { authorCascadeRestatements as defaultAuthorCascadeRestatements, type CallApiFn } from '../cascade-restatement.js';
|
|
53
|
+
export interface RunBackfillFrtProseOptions {
|
|
54
|
+
/** Restrict to a single product UUID. When omitted, all products in config are scanned. */
|
|
55
|
+
productId?: string;
|
|
56
|
+
/** When true, only list candidates -- no model calls and no writes. */
|
|
57
|
+
dryRun?: boolean;
|
|
58
|
+
}
|
|
59
|
+
export interface RunBackfillFrtProseDeps {
|
|
60
|
+
/** API caller. Defaults to the real `callApi`. Injected for tests. */
|
|
61
|
+
callApi?: CallApiFn;
|
|
62
|
+
/** Cascade-prose authoring for one tree. Defaults to the real implementation. */
|
|
63
|
+
authorCascadeRestatements?: typeof defaultAuthorCascadeRestatements;
|
|
64
|
+
/** Load daemon config. Defaults to the real `loadConfig`. Injected for tests. */
|
|
65
|
+
loadConfig?: typeof loadConfig;
|
|
66
|
+
/** Bind the API client to a product-scoped config. Defaults to the real `initSupabase`. */
|
|
67
|
+
initSupabase?: typeof initSupabase;
|
|
68
|
+
/** Sink for human-readable output. Defaults to stdout. */
|
|
69
|
+
out?: (msg: string) => void;
|
|
70
|
+
}
|
|
71
|
+
export interface BackfillFrtProseSummary {
|
|
72
|
+
productsScanned: number;
|
|
73
|
+
focusesScanned: number;
|
|
74
|
+
treesScanned: number;
|
|
75
|
+
treesWithInjection: number;
|
|
76
|
+
authored: number;
|
|
77
|
+
skipped: number;
|
|
78
|
+
/** Candidate nodes detected in dry-run (empty in write mode). */
|
|
79
|
+
dryRunCandidates: Array<{
|
|
80
|
+
focusId: string;
|
|
81
|
+
treeId: string;
|
|
82
|
+
nodeId: string;
|
|
83
|
+
statement: string;
|
|
84
|
+
}>;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Core, unit-testable backfill routine.
|
|
88
|
+
*
|
|
89
|
+
* Per product -> completed focus -> active reality tree:
|
|
90
|
+
* - derive the FRT (`reality_tree_derive_frt`);
|
|
91
|
+
* - skip trees with no applied injection (nothing flipped to restate);
|
|
92
|
+
* - DRY-RUN: report cascade nodes (flipped union resolved) whose prose still
|
|
93
|
+
* needs authoring (`needsRestatement`), making NO model calls and NO writes;
|
|
94
|
+
* - WRITE: delegate to `authorCascadeRestatements` (idempotent, best-effort
|
|
95
|
+
* per node).
|
|
96
|
+
*
|
|
97
|
+
* Per-focus and per-tree failures are best-effort: logged and skipped so one
|
|
98
|
+
* bad row never aborts the run, mirroring `runCascadeProseTick`.
|
|
99
|
+
*/
|
|
100
|
+
export declare function runBackfillFrtProse(opts: RunBackfillFrtProseOptions, deps?: RunBackfillFrtProseDeps): Promise<BackfillFrtProseSummary>;
|
|
101
|
+
//# sourceMappingURL=backfill-frt-prose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backfill-frt-prose.d.ts","sourceRoot":"","sources":["../../src/cli/backfill-frt-prose.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAEH,OAAO,EAAE,UAAU,EAAoB,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,YAAY,EAA6B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACL,yBAAyB,IAAI,gCAAgC,EAC7D,KAAK,SAAS,EAEf,MAAM,2BAA2B,CAAC;AAiBnC,MAAM,WAAW,0BAA0B;IACzC,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,sEAAsE;IACtE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,iFAAiF;IACjF,yBAAyB,CAAC,EAAE,OAAO,gCAAgC,CAAC;IACpE,iFAAiF;IACjF,UAAU,CAAC,EAAE,OAAO,UAAU,CAAC;IAC/B,2FAA2F;IAC3F,YAAY,CAAC,EAAE,OAAO,YAAY,CAAC;IACnC,0DAA0D;IAC1D,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,gBAAgB,EAAE,KAAK,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ;AAqBD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,0BAA0B,EAChC,IAAI,GAAE,uBAA4B,GACjC,OAAO,CAAC,uBAAuB,CAAC,CA2IlC"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `telora-daemon backfill-frt-prose` subcommand.
|
|
3
|
+
*
|
|
4
|
+
* One-off, idempotent repair of FRT desired-effect prose (`frt_statement`)
|
|
5
|
+
* across the resolved cascade of reality trees belonging to COMPLETED focuses.
|
|
6
|
+
*
|
|
7
|
+
* Why this exists: the eager cascade-prose loop (`runCascadeProseTick`) only
|
|
8
|
+
* scans ACTIVE focuses. A focus whose FRT prose was never authored before it
|
|
9
|
+
* completed therefore never gets authored and never gets backfilled -- the loop
|
|
10
|
+
* has stopped scanning it. The Ship Log then falls back to present-tense UDE
|
|
11
|
+
* text for those already-shipped entries. This command repairs that historical
|
|
12
|
+
* tail. The sibling go-forward fix (completion-time authoring) owns ACTIVE
|
|
13
|
+
* focuses; this command deliberately touches COMPLETED focuses ONLY.
|
|
14
|
+
*
|
|
15
|
+
* Idempotent: it reuses `authorCascadeRestatements`, which skips any cascade
|
|
16
|
+
* node that already carries positive prose (`needsRestatement` is false). Re-runs
|
|
17
|
+
* are safe and converge to a no-op.
|
|
18
|
+
*
|
|
19
|
+
* ---------------------------------------------------------------------------
|
|
20
|
+
* OPERATOR RUNBOOK
|
|
21
|
+
* ---------------------------------------------------------------------------
|
|
22
|
+
* This repair only matters against PROD. The local DB has no real completed
|
|
23
|
+
* focuses with applied injections, so a local run is a near-instant no-op.
|
|
24
|
+
*
|
|
25
|
+
* Point the daemon CLI at the prod config (the `~/.telora/daemon.json` that
|
|
26
|
+
* carries the prod `teloraUrl` = https://api.syntelyos.com + the prod tracker)
|
|
27
|
+
* and ALWAYS dry-run first:
|
|
28
|
+
*
|
|
29
|
+
* # 1. Preview -- no model calls, no writes. Lists every focus/tree/node
|
|
30
|
+
* # that WOULD be authored.
|
|
31
|
+
* telora-daemon backfill-frt-prose --dry-run
|
|
32
|
+
*
|
|
33
|
+
* # (optional) scope to a single product while validating:
|
|
34
|
+
* telora-daemon backfill-frt-prose --dry-run --product <product-uuid>
|
|
35
|
+
*
|
|
36
|
+
* # 2. Once the preview looks right, run for real. Authors prose via the
|
|
37
|
+
* # `claude` CLI per candidate node and writes frt_statement.
|
|
38
|
+
* telora-daemon backfill-frt-prose
|
|
39
|
+
*
|
|
40
|
+
* Post-run Ship Log sanity check: open the Ship Log for one of the completed
|
|
41
|
+
* focuses the run reported as authored and confirm its flipped UDE entries now
|
|
42
|
+
* read as future-state desired-effect prose rather than the present-tense
|
|
43
|
+
* problem text (`buildShipLog.ts` falls back to UDE text only when
|
|
44
|
+
* `frt_statement` is null/blank). If an entry still reads present-tense, check
|
|
45
|
+
* that its node was in the resolved cascade (flipped or `resolved===true`) for
|
|
46
|
+
* that tree -- surviving UDEs are intentionally left untouched.
|
|
47
|
+
*
|
|
48
|
+
* @module cli/backfill-frt-prose
|
|
49
|
+
*/
|
|
50
|
+
import { loadConfig, configForProduct } from '../config.js';
|
|
51
|
+
import { initSupabase, callApi as defaultCallApi } from '../queries/shared.js';
|
|
52
|
+
import { authorCascadeRestatements as defaultAuthorCascadeRestatements, } from '../cascade-restatement.js';
|
|
53
|
+
import { needsRestatement } from '../de-restatement.js';
|
|
54
|
+
/**
|
|
55
|
+
* Resolve the set of products to scan: the single `--product` when given (must
|
|
56
|
+
* exist in config), otherwise every product in `config.products`.
|
|
57
|
+
*/
|
|
58
|
+
function resolveProducts(config, productId) {
|
|
59
|
+
if (productId) {
|
|
60
|
+
const match = config.products.find((p) => p.id === productId);
|
|
61
|
+
if (!match) {
|
|
62
|
+
throw new Error(`--product ${productId} is not in the daemon config (known: ${config.products
|
|
63
|
+
.map((p) => p.id)
|
|
64
|
+
.join(', ') || 'none'})`);
|
|
65
|
+
}
|
|
66
|
+
return [match];
|
|
67
|
+
}
|
|
68
|
+
return config.products;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Core, unit-testable backfill routine.
|
|
72
|
+
*
|
|
73
|
+
* Per product -> completed focus -> active reality tree:
|
|
74
|
+
* - derive the FRT (`reality_tree_derive_frt`);
|
|
75
|
+
* - skip trees with no applied injection (nothing flipped to restate);
|
|
76
|
+
* - DRY-RUN: report cascade nodes (flipped union resolved) whose prose still
|
|
77
|
+
* needs authoring (`needsRestatement`), making NO model calls and NO writes;
|
|
78
|
+
* - WRITE: delegate to `authorCascadeRestatements` (idempotent, best-effort
|
|
79
|
+
* per node).
|
|
80
|
+
*
|
|
81
|
+
* Per-focus and per-tree failures are best-effort: logged and skipped so one
|
|
82
|
+
* bad row never aborts the run, mirroring `runCascadeProseTick`.
|
|
83
|
+
*/
|
|
84
|
+
export async function runBackfillFrtProse(opts, deps = {}) {
|
|
85
|
+
const load = deps.loadConfig ?? loadConfig;
|
|
86
|
+
const initApi = deps.initSupabase ?? initSupabase;
|
|
87
|
+
const callApi = deps.callApi ?? defaultCallApi;
|
|
88
|
+
const authorCascade = deps.authorCascadeRestatements ?? defaultAuthorCascadeRestatements;
|
|
89
|
+
const out = deps.out ?? ((msg) => process.stdout.write(msg));
|
|
90
|
+
const dryRun = opts.dryRun === true;
|
|
91
|
+
const config = load();
|
|
92
|
+
const products = resolveProducts(config, opts.productId);
|
|
93
|
+
const summary = {
|
|
94
|
+
productsScanned: 0,
|
|
95
|
+
focusesScanned: 0,
|
|
96
|
+
treesScanned: 0,
|
|
97
|
+
treesWithInjection: 0,
|
|
98
|
+
authored: 0,
|
|
99
|
+
skipped: 0,
|
|
100
|
+
dryRunCandidates: [],
|
|
101
|
+
};
|
|
102
|
+
out(`backfill-frt-prose: ${dryRun ? 'DRY-RUN (no writes)' : 'WRITE mode'} over ${products.length} product(s)\n`);
|
|
103
|
+
for (const product of products) {
|
|
104
|
+
summary.productsScanned += 1;
|
|
105
|
+
// Bind the API client to this product's scoped config (productId/repoPath).
|
|
106
|
+
// The default callApi reads the module-level config set here; an injected
|
|
107
|
+
// test callApi ignores it.
|
|
108
|
+
const pc = configForProduct(config, product);
|
|
109
|
+
initApi(pc);
|
|
110
|
+
let focuses;
|
|
111
|
+
try {
|
|
112
|
+
const resp = await callApi('focus_list', {
|
|
113
|
+
productId: product.id,
|
|
114
|
+
status: 'complete',
|
|
115
|
+
});
|
|
116
|
+
focuses = resp.focuses ?? [];
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
out(` [skip] focus_list failed for product ${product.id}: ${err.message}\n`);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
out(` product ${product.id}: ${focuses.length} completed focus(es)\n`);
|
|
123
|
+
for (const focus of focuses) {
|
|
124
|
+
summary.focusesScanned += 1;
|
|
125
|
+
let trees;
|
|
126
|
+
try {
|
|
127
|
+
const resp = await callApi('reality_tree_list', {
|
|
128
|
+
focusId: focus.id,
|
|
129
|
+
});
|
|
130
|
+
trees = (resp.items ?? []).filter((t) => t.status === 'active');
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
out(` [skip] reality_tree_list failed for focus ${focus.id}: ${err.message}\n`);
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
for (const tree of trees) {
|
|
137
|
+
let derived;
|
|
138
|
+
try {
|
|
139
|
+
derived = await callApi('reality_tree_derive_frt', {
|
|
140
|
+
treeId: tree.id,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
out(` [skip] derive_frt failed for tree ${tree.id}: ${err.message}\n`);
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const nodes = derived.nodes ?? [];
|
|
148
|
+
const hasInjection = nodes.some((n) => n.derivedNodeType === 'injection' && n.statement && n.statement.trim() !== '');
|
|
149
|
+
if (!hasInjection)
|
|
150
|
+
continue;
|
|
151
|
+
summary.treesScanned += 1;
|
|
152
|
+
summary.treesWithInjection += 1;
|
|
153
|
+
if (dryRun) {
|
|
154
|
+
// Compute the resolved cascade (flipped union resolved===true) and
|
|
155
|
+
// report only nodes whose prose still needs authoring. No writes.
|
|
156
|
+
const flippedIds = new Set(derived.flippedNodeIds ?? []);
|
|
157
|
+
const cascade = nodes.filter((n) => flippedIds.has(n.id) || n.resolved === true);
|
|
158
|
+
const candidates = cascade.filter((n) => needsRestatement(n.frtStatement));
|
|
159
|
+
for (const c of candidates) {
|
|
160
|
+
summary.dryRunCandidates.push({
|
|
161
|
+
focusId: focus.id,
|
|
162
|
+
treeId: tree.id,
|
|
163
|
+
nodeId: c.id,
|
|
164
|
+
statement: c.statement,
|
|
165
|
+
});
|
|
166
|
+
out(` [would author] focus=${focus.id} tree=${tree.id} node=${c.id} :: ${c.statement}\n`);
|
|
167
|
+
}
|
|
168
|
+
if (candidates.length === 0) {
|
|
169
|
+
out(` [up-to-date] tree=${tree.id} (no cascade nodes need prose)\n`);
|
|
170
|
+
}
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
// WRITE: idempotent, best-effort per node inside authorCascadeRestatements.
|
|
174
|
+
try {
|
|
175
|
+
const res = await authorCascade(tree.id, { callApi });
|
|
176
|
+
summary.authored += res.authored.length;
|
|
177
|
+
summary.skipped += res.skipped.length;
|
|
178
|
+
out(` [authored] focus=${focus.id} tree=${tree.id} authored=${res.authored.length} skipped=${res.skipped.length}\n`);
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
out(` [skip] authorCascadeRestatements failed for tree ${tree.id}: ${err.message}\n`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Summary line.
|
|
187
|
+
if (dryRun) {
|
|
188
|
+
out(`backfill-frt-prose: DRY-RUN done -- products=${summary.productsScanned} focuses=${summary.focusesScanned} treesWithInjection=${summary.treesWithInjection} wouldAuthor=${summary.dryRunCandidates.length}\n`);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
out(`backfill-frt-prose: done -- products=${summary.productsScanned} focuses=${summary.focusesScanned} treesWithInjection=${summary.treesWithInjection} authored=${summary.authored} skipped=${summary.skipped}\n`);
|
|
192
|
+
}
|
|
193
|
+
return summary;
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=backfill-frt-prose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backfill-frt-prose.js","sourceRoot":"","sources":["../../src/cli/backfill-frt-prose.ts"],"names":[],"mappings":"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"}
|