@telora/daemon 0.21.169 → 0.21.178

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/build-info.json +6 -3
  2. package/dist/completion/completion-decision.d.ts +16 -0
  3. package/dist/completion/completion-decision.d.ts.map +1 -1
  4. package/dist/completion/completion-decision.js +15 -0
  5. package/dist/completion/completion-decision.js.map +1 -1
  6. package/dist/completion/event-escalations.d.ts +26 -0
  7. package/dist/completion/event-escalations.d.ts.map +1 -1
  8. package/dist/completion/event-escalations.js +77 -19
  9. package/dist/completion/event-escalations.js.map +1 -1
  10. package/dist/completion/event-phases.d.ts +7 -0
  11. package/dist/completion/event-phases.d.ts.map +1 -1
  12. package/dist/completion/event-phases.js +19 -0
  13. package/dist/completion/event-phases.js.map +1 -1
  14. package/dist/completion/event.d.ts.map +1 -1
  15. package/dist/completion/event.js +1 -0
  16. package/dist/completion/event.js.map +1 -1
  17. package/dist/completion/human-only-act.d.ts +43 -0
  18. package/dist/completion/human-only-act.d.ts.map +1 -0
  19. package/dist/completion/human-only-act.js +75 -0
  20. package/dist/completion/human-only-act.js.map +1 -0
  21. package/dist/completion/machine-remediable-demotion.d.ts +14 -0
  22. package/dist/completion/machine-remediable-demotion.d.ts.map +1 -1
  23. package/dist/completion/machine-remediable-demotion.js +24 -1
  24. package/dist/completion/machine-remediable-demotion.js.map +1 -1
  25. package/dist/focus/focus-loop-registry.d.ts.map +1 -1
  26. package/dist/focus/focus-loop-registry.js +12 -0
  27. package/dist/focus/focus-loop-registry.js.map +1 -1
  28. package/dist/focus/listener-auto-advance.d.ts.map +1 -1
  29. package/dist/focus/listener-auto-advance.js +40 -25
  30. package/dist/focus/listener-auto-advance.js.map +1 -1
  31. package/dist/queries/agent-resolvable-aging.d.ts +88 -0
  32. package/dist/queries/agent-resolvable-aging.d.ts.map +1 -0
  33. package/dist/queries/agent-resolvable-aging.js +145 -0
  34. package/dist/queries/agent-resolvable-aging.js.map +1 -0
  35. package/dist/queries/agent-resolvable-promotion.d.ts +37 -8
  36. package/dist/queries/agent-resolvable-promotion.d.ts.map +1 -1
  37. package/dist/queries/agent-resolvable-promotion.js +77 -18
  38. package/dist/queries/agent-resolvable-promotion.js.map +1 -1
  39. package/dist/queries/escalation-consumption.d.ts +14 -0
  40. package/dist/queries/escalation-consumption.d.ts.map +1 -1
  41. package/dist/queries/escalation-consumption.js +15 -0
  42. package/dist/queries/escalation-consumption.js.map +1 -1
  43. package/dist/queries/focuses.d.ts +8 -0
  44. package/dist/queries/focuses.d.ts.map +1 -1
  45. package/dist/queries/focuses.js +19 -1
  46. package/dist/queries/focuses.js.map +1 -1
  47. package/dist/queries/routing-measurement.d.ts +65 -0
  48. package/dist/queries/routing-measurement.d.ts.map +1 -0
  49. package/dist/queries/routing-measurement.js +109 -0
  50. package/dist/queries/routing-measurement.js.map +1 -0
  51. package/dist/queries/routing-quality.d.ts +70 -0
  52. package/dist/queries/routing-quality.d.ts.map +1 -0
  53. package/dist/queries/routing-quality.js +66 -0
  54. package/dist/queries/routing-quality.js.map +1 -0
  55. package/dist/queries/schemas.d.ts +6 -0
  56. package/dist/queries/schemas.d.ts.map +1 -1
  57. package/dist/queries/schemas.js +6 -0
  58. package/dist/queries/schemas.js.map +1 -1
  59. package/dist/queries/sessions.d.ts +10 -0
  60. package/dist/queries/sessions.d.ts.map +1 -1
  61. package/dist/queries/sessions.js +14 -1
  62. package/dist/queries/sessions.js.map +1 -1
  63. package/dist/queries/source-reliability.d.ts +60 -0
  64. package/dist/queries/source-reliability.d.ts.map +1 -0
  65. package/dist/queries/source-reliability.js +70 -0
  66. package/dist/queries/source-reliability.js.map +1 -0
  67. package/dist/shell/control-state.d.ts +23 -7
  68. package/dist/shell/control-state.d.ts.map +1 -1
  69. package/dist/shell/control-state.js +41 -16
  70. package/dist/shell/control-state.js.map +1 -1
  71. package/dist/templates/claude-md.d.ts +1 -1
  72. package/dist/templates/claude-md.d.ts.map +1 -1
  73. package/dist/templates/claude-md.js +9 -0
  74. package/dist/templates/claude-md.js.map +1 -1
  75. package/package.json +3 -3
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Aging observer for the agent_resolvable (machine-owned) lane.
3
+ *
4
+ * agent_resolvable filings are deliberately HIDDEN from the operator inbox: they
5
+ * are machine-owned, ridden into a focus's coding spawns, and (only once the
6
+ * machine has demonstrably tried and failed) promoted to a human. Hiding the lane
7
+ * from people was the right call. Leaving it with NO observer was not: a filing
8
+ * nothing takes -- because its focus never spawns, or because the attempt gate
9
+ * correctly declines to promote it -- ages silently and indefinitely, invisible
10
+ * to everyone.
11
+ *
12
+ * This module separates those two: the lane stays hidden from humans, but its
13
+ * AGING is observable on its own terms. It emits a structured machine signal (a
14
+ * log line / returned summary) describing how the open machine-owned lane is
15
+ * aging -- oldest age, age buckets, the count past a staleness threshold, and the
16
+ * ANCHORLESS count (filings with no focus, hence no machine consumer at all). It
17
+ * is NOT a second human inbox: it files nothing, promotes nothing, and routes
18
+ * nothing to a person; it only makes the machine lane legible to the machine.
19
+ *
20
+ * The pure summary (summarizeAgentResolvableAging) is exercised from fixtures;
21
+ * the observer wraps it around the org-wide read and the daemon log.
22
+ */
23
+ import { listOpenAgentResolvableForOrg as defaultListOpenAgentResolvableForOrg } from './escalation-consumption.js';
24
+ import { resolveAgentResolvablePromoteMs } from './agent-resolvable-promotion.js';
25
+ import { getFocusOrigins as defaultGetFocusOrigins } from './focuses.js';
26
+ import { isLowReliabilityOrigin } from './source-reliability.js';
27
+ import { createLogger } from '../shell/log.js';
28
+ const log = createLogger({ module: 'escalations' });
29
+ const HOUR_MS = 3_600_000;
30
+ const DAY_MS = 24 * HOUR_MS;
31
+ // Fixed ascending age bands. The final band (ltMs null) is open-ended.
32
+ const BUCKET_BOUNDS = [
33
+ { label: '<1h', ltMs: HOUR_MS },
34
+ { label: '1-6h', ltMs: 6 * HOUR_MS },
35
+ { label: '6-24h', ltMs: DAY_MS },
36
+ { label: '1-3d', ltMs: 3 * DAY_MS },
37
+ { label: '3-7d', ltMs: 7 * DAY_MS },
38
+ { label: '>7d', ltMs: null },
39
+ ];
40
+ /**
41
+ * Pure: summarize how a set of open agent_resolvable filings is aging as of
42
+ * `nowMs`. A filing with an unparseable/absent createdAt is counted in `total`
43
+ * (and `anchorless` if it has no focus) but contributes no age -- it cannot be
44
+ * bucketed or judged stale on a bad timestamp, mirroring the promotion partition.
45
+ */
46
+ export function summarizeAgentResolvableAging(items, nowMs, opts) {
47
+ const buckets = BUCKET_BOUNDS.map((b) => ({ label: b.label, ltMs: b.ltMs, count: 0 }));
48
+ const originByFocusId = opts.originByFocusId ?? new Map();
49
+ let oldestAgeMs = null;
50
+ let stalePastThreshold = 0;
51
+ let anchorless = 0;
52
+ let lowReliability = 0;
53
+ for (const item of items) {
54
+ if (!item.focusId)
55
+ anchorless += 1;
56
+ const origin = item.focusId ? (originByFocusId.get(item.focusId) ?? null) : null;
57
+ if (isLowReliabilityOrigin(origin))
58
+ lowReliability += 1;
59
+ const createdMs = Date.parse(item.createdAt);
60
+ if (Number.isNaN(createdMs))
61
+ continue; // no age signal on a bad timestamp
62
+ const ageMs = Math.max(0, nowMs - createdMs);
63
+ if (oldestAgeMs === null || ageMs > oldestAgeMs)
64
+ oldestAgeMs = ageMs;
65
+ if (ageMs > opts.staleThresholdMs)
66
+ stalePastThreshold += 1;
67
+ const bucket = buckets.find((b) => b.ltMs === null || ageMs < b.ltMs);
68
+ // The final band has ltMs null, so bucket is always defined.
69
+ if (bucket)
70
+ bucket.count += 1;
71
+ }
72
+ return {
73
+ total: items.length,
74
+ oldestAgeMs,
75
+ stalePastThreshold,
76
+ staleThresholdMs: opts.staleThresholdMs,
77
+ anchorless,
78
+ lowReliability,
79
+ buckets,
80
+ };
81
+ }
82
+ function defaultAgingDeps() {
83
+ return {
84
+ listOpenForOrg: defaultListOpenAgentResolvableForOrg,
85
+ getFocusOrigins: defaultGetFocusOrigins,
86
+ now: () => Date.now(),
87
+ // A filing still in the machine lane past the promotion window is one the
88
+ // machine did not take -- the natural staleness mark for a "loss".
89
+ staleThresholdMs: resolveAgentResolvablePromoteMs(),
90
+ };
91
+ }
92
+ /** Render the summary as a single structured, machine-parseable log field string. */
93
+ export function formatAgingSummary(s) {
94
+ const oldestH = s.oldestAgeMs === null ? 'n/a' : (s.oldestAgeMs / HOUR_MS).toFixed(1);
95
+ const dist = s.buckets.map((b) => `${b.label}=${b.count}`).join(' ');
96
+ return (`total=${s.total} oldest_h=${oldestH} stale_past_${(s.staleThresholdMs / HOUR_MS).toFixed(0)}h=` +
97
+ `${s.stalePastThreshold} anchorless=${s.anchorless} low_reliability=${s.lowReliability} | ${dist}`);
98
+ }
99
+ /**
100
+ * Observe the org-wide open agent_resolvable lane and emit its aging as a
101
+ * machine signal. Returns the summary; logs it at info when the lane is
102
+ * non-empty (so a healthy empty lane stays quiet), and warns when there are
103
+ * stale or anchorless filings -- work that failed to get taken, which must
104
+ * register as a loss rather than vanish. Files/promotes/routes NOTHING.
105
+ *
106
+ * Best-effort: a read failure is logged and an empty summary returned, never
107
+ * thrown, so this never disturbs the tick it shares.
108
+ */
109
+ export async function observeAgentResolvableAging(deps = {}) {
110
+ const d = { ...defaultAgingDeps(), ...deps };
111
+ let items = [];
112
+ try {
113
+ items = await d.listOpenForOrg();
114
+ }
115
+ catch (err) {
116
+ log.warn(`[agent-resolvable-aging] read failed: ${err.message}`);
117
+ return summarizeAgentResolvableAging([], (d.now ?? Date.now)(), { staleThresholdMs: d.staleThresholdMs });
118
+ }
119
+ // Resolve the producing source of each filing (its focus origin) so the
120
+ // summary can down-weight known-unreliable producers. Best-effort: if the
121
+ // origins read fails, fall back to treating every source as full weight rather
122
+ // than losing the whole aging signal.
123
+ let originByFocusId = new Map();
124
+ const focusIds = [...new Set(items.map((i) => i.focusId).filter((id) => !!id))];
125
+ if (focusIds.length > 0) {
126
+ try {
127
+ originByFocusId = await d.getFocusOrigins(focusIds);
128
+ }
129
+ catch (err) {
130
+ log.warn(`[agent-resolvable-aging] focus-origins read failed (full weight assumed): ${err.message}`);
131
+ }
132
+ }
133
+ const summary = summarizeAgentResolvableAging(items, (d.now ?? Date.now)(), { staleThresholdMs: d.staleThresholdMs, originByFocusId });
134
+ if (summary.total > 0) {
135
+ const line = `[agent-resolvable-aging] ${formatAgingSummary(summary)}`;
136
+ if (summary.stalePastThreshold > 0 || summary.anchorless > 0) {
137
+ log.warn(line);
138
+ }
139
+ else {
140
+ log.info(line);
141
+ }
142
+ }
143
+ return summary;
144
+ }
145
+ //# sourceMappingURL=agent-resolvable-aging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-resolvable-aging.js","sourceRoot":"","sources":["../../src/queries/agent-resolvable-aging.ts"],"names":[],"mappings":"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"}
@@ -11,12 +11,24 @@
11
11
  * PROMOTED to a human by resolving the machine-routed row and refiling the same
12
12
  * content as a needs_operator escalation, which the operator inbox DOES show.
13
13
  *
14
- * Why age, not a per-row attempt counter: escalation_update accepts only
15
- * status/notes/answer (no disposition or metadata writes without a separate edge
16
- * deploy), and there is no per-focus "sessions since T" query. Open-age is the
17
- * deploy-safe, restart-safe, count-free proxy for "it survived N spawn cycles
18
- * unresolved" -- every spawn that rode it in and exited without clearing it is a
19
- * failed attempt, and those accumulate as elapsed open time.
14
+ * Gate: RECORDED ATTEMPT EVIDENCE, not elapsed open-age. Open-age was the
15
+ * original proxy for "it survived N spawn cycles unresolved", but the proxy is
16
+ * inverted in practice: a filing anchored to an un-armed or wedged focus ages
17
+ * past the bound having had ZERO agent sessions, and promoting it hands a human a
18
+ * FIRST attempt dressed up as an exhausted machine. So promotion now gates on the
19
+ * actual count of agent sessions that ran on the filing's focus since it was
20
+ * created (countFocusSessionsSince): a filing with zero recorded attempts NEVER
21
+ * promotes, regardless of age. Open-age is retained only as a cheap CANDIDATE
22
+ * pre-filter (don't even count sessions for a fresh filing, which matters for the
23
+ * org-wide sweep's up-to-500-row scan); the promotion DECISION is the attempt
24
+ * count, and the count is carried into the promoted row's metadata so the human
25
+ * lane shows the evidence of the machine attempts that failed.
26
+ *
27
+ * A filing that cannot accrue attempts -- one with no focus anchor -- therefore
28
+ * does not promote either: it has no machine lane to be attempted in. New
29
+ * anchorless agent_resolvable filings are refused at the filing boundary, and
30
+ * un-taken machine-lane filings are made observable by the aging observer rather
31
+ * than dumped on a human.
20
32
  *
21
33
  * Promotion is idempotent: the needs_operator refile rides the shared cause-keyed
22
34
  * gate keyed on the original escalation id, and the source row is resolved in the
@@ -24,8 +36,17 @@
24
36
  */
25
37
  import { type AgentResolvableItem, type OrgAgentResolvableItem } from './escalation-consumption.js';
26
38
  import { type FileEscalationIdempotentParams, type FileEscalationIdempotentResult } from './escalation-suppression.js';
27
- /** Default hours an agent_resolvable filing may stay open before promotion. */
39
+ /** Default hours an agent_resolvable filing may stay open before it is a promotion CANDIDATE. */
28
40
  export declare const DEFAULT_AGENT_RESOLVABLE_PROMOTE_HOURS = 24;
41
+ /**
42
+ * Minimum recorded agent sessions on a filing's focus (since it was created)
43
+ * before it may be promoted to a human. The decisive gate: at least this many
44
+ * spawns rode the filing in and none cleared it -- an exhausted machine, not a
45
+ * first attempt. A candidate below this floor is NOT promoted regardless of age.
46
+ */
47
+ export declare const DEFAULT_AGENT_RESOLVABLE_PROMOTE_MIN_ATTEMPTS = 1;
48
+ /** Pure: whether a filing's recorded attempts meet the promotion floor. */
49
+ export declare function meetsAttemptFloor(attempts: number, minAttempts: number): boolean;
29
50
  /**
30
51
  * Resolve the promotion threshold (hours -> ms) from the typed, Zod-validated
31
52
  * env-config -- the single declaration site for every operational knob
@@ -70,14 +91,18 @@ export declare function buildAgentResolvablePromotionParams(item: AgentResolvabl
70
91
  organizationId: string;
71
92
  focusId?: string;
72
93
  productId?: string;
73
- }, ageHours: number): FileEscalationIdempotentParams;
94
+ }, ageHours: number, attempts: number): FileEscalationIdempotentParams;
74
95
  /** Injected IO for the promotion reconcile (real defaults; tests inject stubs). */
75
96
  export interface AgentResolvablePromotionDeps {
76
97
  listOpen: (focusId: string) => Promise<AgentResolvableItem[]>;
77
98
  markResolved: (id: string, notes?: string) => Promise<void>;
78
99
  file: (params: FileEscalationIdempotentParams) => Promise<FileEscalationIdempotentResult>;
100
+ /** Count agent sessions on a focus since an ISO timestamp (the attempt evidence). */
101
+ countSessionsSince: (focusId: string, since: string) => Promise<number>;
79
102
  now?: () => number;
80
103
  thresholdMs: number;
104
+ /** Minimum recorded attempts before a candidate may promote (see meetsAttemptFloor). */
105
+ minAttempts: number;
81
106
  }
82
107
  /**
83
108
  * Reconcile a focus's open agent_resolvable filings and return the ones that
@@ -105,8 +130,12 @@ export interface AgentResolvableSweepDeps {
105
130
  listOpenForOrg: () => Promise<OrgAgentResolvableItem[]>;
106
131
  markResolved: (id: string, notes?: string) => Promise<void>;
107
132
  file: (params: FileEscalationIdempotentParams) => Promise<FileEscalationIdempotentResult>;
133
+ /** Count agent sessions on a focus since an ISO timestamp (the attempt evidence). */
134
+ countSessionsSince: (focusId: string, since: string) => Promise<number>;
108
135
  now?: () => number;
109
136
  thresholdMs: number;
137
+ /** Minimum recorded attempts before a candidate may promote (see meetsAttemptFloor). */
138
+ minAttempts: number;
110
139
  }
111
140
  /**
112
141
  * Sweep the org's OPEN agent_resolvable filings and promote every one that has
@@ -1 +1 @@
1
- {"version":3,"file":"agent-resolvable-promotion.d.ts","sourceRoot":"","sources":["../../src/queries/agent-resolvable-promotion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAQH,OAAO,EAAoJ,KAAK,mBAAmB,EAAE,KAAK,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACtP,OAAO,EAEL,KAAK,8BAA8B,EACnC,KAAK,8BAA8B,EACpC,MAAM,6BAA6B,CAAC;AAMrC,+EAA+E;AAC/E,eAAO,MAAM,sCAAsC,KAAK,CAAC;AAEzD;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAE5F;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,SAAS;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC3E,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB;IAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAAC,OAAO,EAAE,CAAC,EAAE,CAAA;CAAE,CAY7B;AAED,wFAAwF;AACxF,wBAAgB,gCAAgC,CAAC,oBAAoB,EAAE,MAAM,GAAG,MAAM,CAErF;AAED,yEAAyE;AACzE,eAAO,MAAM,8BAA8B,8BAA8B,CAAC;AAE1E;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mCAAmC,CACjD,IAAI,EAAE,mBAAmB,EACzB,GAAG,EAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EACrE,QAAQ,EAAE,MAAM,GACf,8BAA8B,CAmChC;AAED,mFAAmF;AACnF,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC9D,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,EAAE,CAAC,MAAM,EAAE,8BAA8B,KAAK,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC1F,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAYD;;;;;;;;;;GAUG;AACH,wBAAsB,gCAAgC,CACpD,GAAG,EAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EACpE,IAAI,GAAE,OAAO,CAAC,4BAA4B,CAAM,GAC/C,OAAO,CAAC,mBAAmB,EAAE,CAAC,CA2BhC;AAwBD,2EAA2E;AAC3E,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,8EAA8E;AAC9E,MAAM,WAAW,wBAAwB;IACvC,cAAc,EAAE,MAAM,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;IACxD,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,EAAE,CAAC,MAAM,EAAE,8BAA8B,KAAK,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC1F,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAYD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,8BAA8B,CAClD,IAAI,GAAE,OAAO,CAAC,wBAAwB,CAAM,GAC3C,OAAO,CAAC,0BAA0B,CAAC,CA+CrC"}
1
+ {"version":3,"file":"agent-resolvable-promotion.d.ts","sourceRoot":"","sources":["../../src/queries/agent-resolvable-promotion.ts"],"names":[],"mappings":"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"}
@@ -11,12 +11,24 @@
11
11
  * PROMOTED to a human by resolving the machine-routed row and refiling the same
12
12
  * content as a needs_operator escalation, which the operator inbox DOES show.
13
13
  *
14
- * Why age, not a per-row attempt counter: escalation_update accepts only
15
- * status/notes/answer (no disposition or metadata writes without a separate edge
16
- * deploy), and there is no per-focus "sessions since T" query. Open-age is the
17
- * deploy-safe, restart-safe, count-free proxy for "it survived N spawn cycles
18
- * unresolved" -- every spawn that rode it in and exited without clearing it is a
19
- * failed attempt, and those accumulate as elapsed open time.
14
+ * Gate: RECORDED ATTEMPT EVIDENCE, not elapsed open-age. Open-age was the
15
+ * original proxy for "it survived N spawn cycles unresolved", but the proxy is
16
+ * inverted in practice: a filing anchored to an un-armed or wedged focus ages
17
+ * past the bound having had ZERO agent sessions, and promoting it hands a human a
18
+ * FIRST attempt dressed up as an exhausted machine. So promotion now gates on the
19
+ * actual count of agent sessions that ran on the filing's focus since it was
20
+ * created (countFocusSessionsSince): a filing with zero recorded attempts NEVER
21
+ * promotes, regardless of age. Open-age is retained only as a cheap CANDIDATE
22
+ * pre-filter (don't even count sessions for a fresh filing, which matters for the
23
+ * org-wide sweep's up-to-500-row scan); the promotion DECISION is the attempt
24
+ * count, and the count is carried into the promoted row's metadata so the human
25
+ * lane shows the evidence of the machine attempts that failed.
26
+ *
27
+ * A filing that cannot accrue attempts -- one with no focus anchor -- therefore
28
+ * does not promote either: it has no machine lane to be attempted in. New
29
+ * anchorless agent_resolvable filings are refused at the filing boundary, and
30
+ * un-taken machine-lane filings are made observable by the aging observer rather
31
+ * than dumped on a human.
20
32
  *
21
33
  * Promotion is idempotent: the needs_operator refile rides the shared cause-keyed
22
34
  * gate keyed on the original escalation id, and the source row is resolved in the
@@ -24,13 +36,25 @@
24
36
  */
25
37
  import { ESCALATION_REASONS, ESCALATION_DISPOSITIONS, loadEnvConfig, } from '@telora/daemon-core';
26
38
  import { markEscalationResolved as defaultMarkEscalationResolved } from './escalations.js';
39
+ import { countFocusSessionsSince as defaultCountFocusSessionsSince } from './sessions.js';
27
40
  import { listOpenAgentResolvableForFocus as defaultListOpenAgentResolvableForFocus, listOpenAgentResolvableForOrg as defaultListOpenAgentResolvableForOrg } from './escalation-consumption.js';
28
41
  import { fileEscalationIdempotent as defaultFileEscalationIdempotent, } from './escalation-suppression.js';
29
42
  import { computeCauseKey } from './cause-key.js';
30
43
  import { createLogger } from '../shell/log.js';
31
44
  const log = createLogger({ module: 'escalations' });
32
- /** Default hours an agent_resolvable filing may stay open before promotion. */
45
+ /** Default hours an agent_resolvable filing may stay open before it is a promotion CANDIDATE. */
33
46
  export const DEFAULT_AGENT_RESOLVABLE_PROMOTE_HOURS = 24;
47
+ /**
48
+ * Minimum recorded agent sessions on a filing's focus (since it was created)
49
+ * before it may be promoted to a human. The decisive gate: at least this many
50
+ * spawns rode the filing in and none cleared it -- an exhausted machine, not a
51
+ * first attempt. A candidate below this floor is NOT promoted regardless of age.
52
+ */
53
+ export const DEFAULT_AGENT_RESOLVABLE_PROMOTE_MIN_ATTEMPTS = 1;
54
+ /** Pure: whether a filing's recorded attempts meet the promotion floor. */
55
+ export function meetsAttemptFloor(attempts, minAttempts) {
56
+ return attempts >= minAttempts;
57
+ }
34
58
  /**
35
59
  * Resolve the promotion threshold (hours -> ms) from the typed, Zod-validated
36
60
  * env-config -- the single declaration site for every operational knob
@@ -83,29 +107,31 @@ export const AGENT_RESOLVABLE_PROMOTED_KIND = 'agent_resolvable_promoted';
83
107
  * anchorless promotion simply files org-scoped with an empty anchor; a
84
108
  * focus-anchored one still stamps the focus for provenance.
85
109
  */
86
- export function buildAgentResolvablePromotionParams(item, ctx, ageHours) {
110
+ export function buildAgentResolvablePromotionParams(item, ctx, ageHours, attempts) {
87
111
  const originalKind = item.escalationKind ?? 'agent_resolvable';
88
112
  return {
89
113
  causeKey: agentResolvablePromotionCauseKey(item.id),
90
114
  organizationId: ctx.organizationId,
91
115
  issueId: null,
92
116
  reasonType: ESCALATION_REASONS.BLOCKED_BY_EXTERNAL,
93
- // It was machine-routable, but the machine had ~ageHours of spawn cycles to
94
- // clear it and did not -- a human must now take it.
117
+ // It was machine-routable, but ${attempts} agent session(s) rode it in over
118
+ // ~${ageHours}h and none cleared it -- an exhausted machine, so a human takes it.
95
119
  disposition: ESCALATION_DISPOSITIONS.NEEDS_OPERATOR,
96
120
  // Anchor to the focus only when one exists; an anchorless filing files
97
121
  // org-scoped (still visible in the operator inbox, keyed on disposition).
98
122
  anchor: ctx.focusId ? { focusId: ctx.focusId } : {},
99
123
  ...(ctx.productId ? { productId: ctx.productId } : {}),
100
124
  escalationKind: AGENT_RESOLVABLE_PROMOTED_KIND,
101
- description: `A machine-routable (agent_resolvable) filing has stayed open ~${ageHours}h ` +
102
- `without the daemon's spawns clearing it, so it is promoted to you.\n\n` +
125
+ description: `A machine-routable (agent_resolvable) filing has had ${attempts} agent ` +
126
+ `session(s) on its focus (over ~${ageHours}h) without any of them clearing ` +
127
+ `it, so it is promoted to you.\n\n` +
103
128
  `**Original kind:** ${originalKind}\n` +
104
- `**Original filing:** ${item.id}\n\n` +
129
+ `**Original filing:** ${item.id}\n` +
130
+ `**Machine attempts that failed:** ${attempts}\n\n` +
105
131
  `${item.description}`,
106
- whatWasTried: `The filing rode into the focus's coding spawns for ~${ageHours}h ` +
107
- `(disposition agent_resolvable) but was never resolved, so the machine has ` +
108
- `exhausted its autonomous attempts.`,
132
+ whatWasTried: `The filing rode into the focus's coding spawns across ${attempts} recorded ` +
133
+ `agent session(s) over ~${ageHours}h (disposition agent_resolvable) but was ` +
134
+ `never resolved, so the machine has exhausted its autonomous attempts.`,
109
135
  helpNeeded: `Resolve the underlying condition manually, or re-file with clearer intent if ` +
110
136
  `the machine cannot act on it.`,
111
137
  metadata: {
@@ -113,6 +139,10 @@ export function buildAgentResolvablePromotionParams(item, ctx, ageHours) {
113
139
  originalEscalationId: item.id,
114
140
  originalKind,
115
141
  ageHours,
142
+ // Attempt evidence: the recorded agent sessions that failed to clear this
143
+ // filing. This is the proof the human lane carries that the machine was
144
+ // exhausted, not merely that time elapsed.
145
+ spawnsInWindow: attempts,
116
146
  },
117
147
  };
118
148
  }
@@ -121,8 +151,10 @@ function defaultDeps() {
121
151
  listOpen: defaultListOpenAgentResolvableForFocus,
122
152
  markResolved: defaultMarkEscalationResolved,
123
153
  file: defaultFileEscalationIdempotent,
154
+ countSessionsSince: defaultCountFocusSessionsSince,
124
155
  now: () => Date.now(),
125
156
  thresholdMs: resolveAgentResolvablePromoteMs(),
157
+ minAttempts: DEFAULT_AGENT_RESOLVABLE_PROMOTE_MIN_ATTEMPTS,
126
158
  };
127
159
  }
128
160
  /**
@@ -142,8 +174,19 @@ export async function reconcileAgentResolvableForFocus(ctx, deps = {}) {
142
174
  const { ride, promote } = partitionAgentResolvableByAge(open, (d.now ?? Date.now)(), d.thresholdMs);
143
175
  for (const item of promote) {
144
176
  const ageHours = Math.max(1, Math.floor(((d.now ?? Date.now)() - Date.parse(item.createdAt)) / 3_600_000));
177
+ // Attempt-evidence gate: only promote a candidate the machine actually TRIED
178
+ // and failed to clear. A candidate with zero agent sessions since it was
179
+ // filed is not exhausted -- it rides on (and the aging observer keeps it
180
+ // visible in the machine lane), never dumped on a human as a first attempt.
181
+ const attempts = await d.countSessionsSince(ctx.focusId, item.createdAt);
182
+ if (!meetsAttemptFloor(attempts, d.minAttempts)) {
183
+ log.info(`[escalations] Not promoting agent_resolvable ${item.id} (focus ${ctx.focusId}): ` +
184
+ `${attempts} recorded attempt(s) < floor ${d.minAttempts}; it rides on unattempted`);
185
+ ride.push(item);
186
+ continue;
187
+ }
145
188
  try {
146
- const result = await d.file(buildAgentResolvablePromotionParams(item, ctx, ageHours));
189
+ const result = await d.file(buildAgentResolvablePromotionParams(item, ctx, ageHours, attempts));
147
190
  // Only retire the machine-routed row once the human-facing refile is in
148
191
  // place (filed OR already suppressed by a prior promotion) -- never resolve
149
192
  // the source without a landing spot, which would drop the signal entirely.
@@ -166,8 +209,10 @@ function defaultSweepDeps() {
166
209
  listOpenForOrg: defaultListOpenAgentResolvableForOrg,
167
210
  markResolved: defaultMarkEscalationResolved,
168
211
  file: defaultFileEscalationIdempotent,
212
+ countSessionsSince: defaultCountFocusSessionsSince,
169
213
  now: () => Date.now(),
170
214
  thresholdMs: resolveAgentResolvablePromoteMs(),
215
+ minAttempts: DEFAULT_AGENT_RESOLVABLE_PROMOTE_MIN_ATTEMPTS,
171
216
  };
172
217
  }
173
218
  /**
@@ -195,6 +240,20 @@ export async function sweepAgentResolvablePromotions(deps = {}) {
195
240
  `cannot org-scope the refile (skipping)`);
196
241
  continue;
197
242
  }
243
+ // Attempt-evidence gate. A filing with no focus anchor cannot accrue agent
244
+ // sessions -- there is no machine lane to be attempted in -- so it has zero
245
+ // attempts and is NOT promoted (new anchorless filings are refused at the
246
+ // filing boundary; the aging observer keeps any residue visible). A
247
+ // focus-anchored candidate promotes only once the machine has actually tried
248
+ // and failed it minAttempts times.
249
+ const attempts = item.focusId
250
+ ? await d.countSessionsSince(item.focusId, item.createdAt)
251
+ : 0;
252
+ if (!meetsAttemptFloor(attempts, d.minAttempts)) {
253
+ log.info(`[escalations] Org-wide sweep not promoting agent_resolvable ${item.id} ` +
254
+ `(focus ${item.focusId ?? '<none>'}): ${attempts} recorded attempt(s) < floor ${d.minAttempts}`);
255
+ continue;
256
+ }
198
257
  const ageHours = Math.max(1, Math.floor(((d.now ?? Date.now)() - Date.parse(item.createdAt)) / 3_600_000));
199
258
  const ctx = {
200
259
  organizationId: item.organizationId,
@@ -202,7 +261,7 @@ export async function sweepAgentResolvablePromotions(deps = {}) {
202
261
  ...(item.productId ? { productId: item.productId } : {}),
203
262
  };
204
263
  try {
205
- const result = await d.file(buildAgentResolvablePromotionParams(item, ctx, ageHours));
264
+ const result = await d.file(buildAgentResolvablePromotionParams(item, ctx, ageHours, attempts));
206
265
  // Only retire the source once the human-facing refile is in place (filed OR
207
266
  // already suppressed by a prior promotion) -- never resolve without a
208
267
  // landing spot, which would drop the signal entirely.
@@ -1 +1 @@
1
- {"version":3,"file":"agent-resolvable-promotion.js","sourceRoot":"","sources":["../../src/queries/agent-resolvable-promotion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-resolvable-promotion.js","sourceRoot":"","sources":["../../src/queries/agent-resolvable-promotion.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,7 @@ export interface AgentResolvableEscalationRow {
22
22
  id: string;
23
23
  status?: string | null;
24
24
  disposition?: string | null;
25
+ resolutionClass?: string | null;
25
26
  escalationKind?: string | null;
26
27
  description?: string | null;
27
28
  createdAt?: string | null;
@@ -29,6 +30,19 @@ export interface AgentResolvableEscalationRow {
29
30
  focusId?: string | null;
30
31
  productId?: string | null;
31
32
  }
33
+ /** A resolved filing reduced to the two axes the routing-quality measure differences. */
34
+ export interface RoutingSampleRow {
35
+ disposition: string | null;
36
+ resolutionClass: string | null;
37
+ }
38
+ /**
39
+ * Sample the org's RESOLVED escalations, reduced to (disposition, resolution_class)
40
+ * -- the live population the routing-quality measure differences to compute the
41
+ * mis-route rate. Both axes ride in the summary base of transformEscalation, so
42
+ * detail:'summary' suffices. A bounded recent page (default 500) is enough for a
43
+ * rate; this is a measurement, not an exhaustive audit.
44
+ */
45
+ export declare function listResolvedRoutingSample(deps?: CallApiDeps, limit?: number): Promise<RoutingSampleRow[]>;
32
46
  /**
33
47
  * An open agent_resolvable filing carrying its OWN anchor (org/focus/product).
34
48
  * The focus-scoped read (listOpenAgentResolvableForFocus) already knows the
@@ -1 +1 @@
1
- {"version":3,"file":"escalation-consumption.d.ts","sourceRoot":"","sources":["../../src/queries/escalation-consumption.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAW,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAIxD,gFAAgF;AAChF,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,sEAAsE;AACtE,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IACjE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,SAAS,4BAA4B,EAAE,GAC5C,mBAAmB,EAAE,CAavB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,+BAA+B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAMrG;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,SAAS,4BAA4B,EAAE,GAC5C,sBAAsB,EAAE,CAgB1B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAanC;AAED,wFAAwF;AACxF,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,uEAAuE;IACvE,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,UAAU,sBAAuB,SAAQ,4BAA4B;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC3C;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,SAAS,sBAAsB,EAAE,GACtC,wBAAwB,EAAE,CAqB5B;AAED;;;;;GAKG;AACH,wBAAsB,kCAAkC,CACtD,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAQrC"}
1
+ {"version":3,"file":"escalation-consumption.d.ts","sourceRoot":"","sources":["../../src/queries/escalation-consumption.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,21 @@
12
12
  import { callApi } from './shared.js';
13
13
  import { OPEN_ESCALATION_STATUSES } from './holds.js';
14
14
  import { DISPOSITION_AGENT_RESOLVABLE, DISPOSITION_NEEDS_INTENT } from './escalation-dispositions.js';
15
+ /**
16
+ * Sample the org's RESOLVED escalations, reduced to (disposition, resolution_class)
17
+ * -- the live population the routing-quality measure differences to compute the
18
+ * mis-route rate. Both axes ride in the summary base of transformEscalation, so
19
+ * detail:'summary' suffices. A bounded recent page (default 500) is enough for a
20
+ * rate; this is a measurement, not an exhaustive audit.
21
+ */
22
+ export async function listResolvedRoutingSample(deps = {}, limit = 500) {
23
+ const call = deps.callApi ?? callApi;
24
+ const result = await call('escalation_list', { fields: { status: 'resolved' }, limit, detail: 'summary' });
25
+ return (result.escalations ?? []).map((e) => ({
26
+ disposition: e.disposition ?? null,
27
+ resolutionClass: e.resolutionClass ?? null,
28
+ }));
29
+ }
15
30
  /**
16
31
  * Pure: keep only the OPEN, agent_resolvable rows and shape them into
17
32
  * AgentResolvableItems. The status re-check is defense-in-depth so a
@@ -1 +1 @@
1
- {"version":3,"file":"escalation-consumption.js","sourceRoot":"","sources":["../../src/queries/escalation-consumption.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAoB,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAoCtG;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAA6C;IAE7C,OAAO,IAAI;SACR,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACrD,CAAC,CAAC,WAAW,KAAK,4BAA4B,CACjD;SACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,cAAc,EAAE,CAAC,CAAC,cAAc,IAAI,IAAI;QACxC,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;QAChC,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;KAC7B,CAAC,CAAC,CAAC;AACR,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAC,OAAe;IACnE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAkD,iBAAiB,EAAE;QAC/F,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE;QACvD,KAAK,EAAE,GAAG;KACX,CAAC,CAAC;IACH,OAAO,sBAAsB,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CACvC,IAA6C;IAE7C,OAAO,IAAI;SACR,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACrD,CAAC,CAAC,WAAW,KAAK,4BAA4B,CACjD;SACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,cAAc,EAAE,CAAC,CAAC,cAAc,IAAI,IAAI;QACxC,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;QAChC,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;QAC5B,cAAc,EAAE,CAAC,CAAC,cAAc,IAAI,IAAI;QACxC,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI;QAC1B,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI;KAC/B,CAAC,CAAC,CAAC;AACR,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,OAAoB,EAAE;IAEtB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAkD,iBAAiB,EAAE;QAC5F,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE;QAC9C,KAAK,EAAE,GAAG;QACV,+EAA+E;QAC/E,gFAAgF;QAChF,gFAAgF;QAChF,gFAAgF;QAChF,kEAAkE;QAClE,MAAM,EAAE,MAAM;KACf,CAAC,CAAC;IACH,OAAO,yBAAyB,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC;AAmBD;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,IAAuC;IAEvC,OAAO,IAAI;SACR,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACrD,CAAC,CAAC,WAAW,KAAK,wBAAwB;QAC1C,CAAC,CAAC,cAAc,KAAK,cAAc,CACtC;SACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,KAAK,GAAI,CAAC,CAAC,QAA2C,EAAE,WAAW,CAAC;QAC1E,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,cAAc,EAAE,CAAC,CAAC,cAAc,IAAI,IAAI;YACxC,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;YAChC,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;YAC5B,cAAc,EAAE,CAAC,CAAC,cAAc,IAAI,IAAI;YACxC,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI;YAC1B,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI;YAC9B,WAAW,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SAC3D,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,OAAoB,EAAE;IAEtB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAA4C,iBAAiB,EAAE;QACtF,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE;QAC9C,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,MAAM;KACf,CAAC,CAAC;IACH,OAAO,2BAA2B,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;AAC/D,CAAC"}
1
+ {"version":3,"file":"escalation-consumption.js","sourceRoot":"","sources":["../../src/queries/escalation-consumption.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,14 @@
5
5
  * can build a complete task DAG.
6
6
  */
7
7
  import type { FocusDeliveryInfo, FocusIssueInfo, StageDirective, Workflow } from '../types/index.js';
8
+ /**
9
+ * Batch-read the provenance origin of a set of focuses, as a Map
10
+ * focusId -> origin|null. Feeds the machine-owned lane's source-reliability
11
+ * weighting: a filing's producing source is carried by its focus origin. A
12
+ * focusId not returned by the backend is absent from the map (the weighting
13
+ * treats a missing origin as a full-weight source). Empty input short-circuits.
14
+ */
15
+ export declare function getFocusOrigins(focusIds: readonly string[]): Promise<Map<string, string | null>>;
8
16
  /** Result of a scan-all focus_list consumption. */
9
17
  export interface ScanAllFocusesResult<F> {
10
18
  /** Every focus accumulated across all pages. */
@@ -1 +1 @@
1
- {"version":3,"file":"focuses.d.ts","sourceRoot":"","sources":["../../src/queries/focuses.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"focuses.d.ts","sourceRoot":"","sources":["../../src/queries/focuses.ts"],"names":[],"mappings":"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"}
@@ -5,9 +5,27 @@
5
5
  * can build a complete task DAG.
6
6
  */
7
7
  import { callApi, callApiValidated } from './shared.js';
8
- import { FocusDeliveriesResponseSchema, FocusIssuesResponseSchema, } from './schemas.js';
8
+ import { FocusDeliveriesResponseSchema, FocusIssuesResponseSchema, FocusOriginsResponseSchema, } from './schemas.js';
9
9
  import { createLogger } from '../shell/log.js';
10
10
  const log = createLogger({ module: 'scanAllFocuses' });
11
+ /**
12
+ * Batch-read the provenance origin of a set of focuses, as a Map
13
+ * focusId -> origin|null. Feeds the machine-owned lane's source-reliability
14
+ * weighting: a filing's producing source is carried by its focus origin. A
15
+ * focusId not returned by the backend is absent from the map (the weighting
16
+ * treats a missing origin as a full-weight source). Empty input short-circuits.
17
+ */
18
+ export async function getFocusOrigins(focusIds) {
19
+ const map = new Map();
20
+ const ids = focusIds.filter((id) => typeof id === 'string' && id.length > 0);
21
+ if (ids.length === 0)
22
+ return map;
23
+ const result = await callApiValidated('daemon_get_focus_origins', FocusOriginsResponseSchema, { focusIds: ids });
24
+ for (const [focusId, origin] of Object.entries(result.origins)) {
25
+ map.set(focusId, origin);
26
+ }
27
+ return map;
28
+ }
11
29
  // ---------------------------------------------------------------------------
12
30
  // Paginated focus_list consumption
13
31
  // ---------------------------------------------------------------------------