instar 1.3.1612 → 1.3.1614

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 (172) hide show
  1. package/dashboard/console/console.js +14 -2
  2. package/dashboard/console/machines-model.js +48 -0
  3. package/dashboard/console/machines.js +6 -3
  4. package/dashboard/console/plans-model.js +8 -6
  5. package/dist/commands/server.d.ts.map +1 -1
  6. package/dist/commands/server.js +31 -7
  7. package/dist/commands/server.js.map +1 -1
  8. package/dist/core/AppConversationService.d.ts.map +1 -1
  9. package/dist/core/AppConversationService.js +3 -4
  10. package/dist/core/AppConversationService.js.map +1 -1
  11. package/dist/core/AppConversationStore.d.ts +28 -2
  12. package/dist/core/AppConversationStore.d.ts.map +1 -1
  13. package/dist/core/AppConversationStore.js +47 -2
  14. package/dist/core/AppConversationStore.js.map +1 -1
  15. package/dist/core/AppConversationsReplicatedStore.js +1 -1
  16. package/dist/core/AppConversationsReplicatedStore.js.map +1 -1
  17. package/dist/core/AppRecordSignatures.d.ts +23 -2
  18. package/dist/core/AppRecordSignatures.d.ts.map +1 -1
  19. package/dist/core/AppRecordSignatures.js +32 -5
  20. package/dist/core/AppRecordSignatures.js.map +1 -1
  21. package/dist/core/LocalAttentionItems.d.ts +49 -0
  22. package/dist/core/LocalAttentionItems.d.ts.map +1 -0
  23. package/dist/core/LocalAttentionItems.js +107 -0
  24. package/dist/core/LocalAttentionItems.js.map +1 -0
  25. package/dist/core/MacDesktopHost.d.ts +3 -0
  26. package/dist/core/MacDesktopHost.d.ts.map +1 -1
  27. package/dist/core/MacDesktopHost.js +10 -0
  28. package/dist/core/MacDesktopHost.js.map +1 -1
  29. package/dist/core/MachineLockStateReader.d.ts.map +1 -1
  30. package/dist/core/MachineLockStateReader.js +6 -1
  31. package/dist/core/MachineLockStateReader.js.map +1 -1
  32. package/dist/core/MobilePush.d.ts +3 -0
  33. package/dist/core/MobilePush.d.ts.map +1 -1
  34. package/dist/core/MobilePush.js +9 -3
  35. package/dist/core/MobilePush.js.map +1 -1
  36. package/dist/core/PostUpdateMigrator.d.ts +12 -0
  37. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  38. package/dist/core/PostUpdateMigrator.js +57 -0
  39. package/dist/core/PostUpdateMigrator.js.map +1 -1
  40. package/dist/core/appMediaReplyFiles.d.ts +10 -0
  41. package/dist/core/appMediaReplyFiles.d.ts.map +1 -1
  42. package/dist/core/appMediaReplyFiles.js +37 -19
  43. package/dist/core/appMediaReplyFiles.js.map +1 -1
  44. package/dist/core/appMediaTypes.d.ts +7 -0
  45. package/dist/core/appMediaTypes.d.ts.map +1 -1
  46. package/dist/core/appMediaTypes.js +17 -0
  47. package/dist/core/appMediaTypes.js.map +1 -1
  48. package/dist/core/appPlatformMedia.d.ts +44 -0
  49. package/dist/core/appPlatformMedia.d.ts.map +1 -0
  50. package/dist/core/appPlatformMedia.js +121 -0
  51. package/dist/core/appPlatformMedia.js.map +1 -0
  52. package/dist/core/types.d.ts +12 -0
  53. package/dist/core/types.d.ts.map +1 -1
  54. package/dist/core/types.js.map +1 -1
  55. package/dist/data/standards-guard-index.json +1 -1
  56. package/dist/data/standards-guard-index.meta.json +2 -2
  57. package/dist/data/standards-registry.meta.json +1 -1
  58. package/dist/messaging/TelegramAdapter.d.ts +21 -0
  59. package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
  60. package/dist/messaging/TelegramAdapter.js +55 -8
  61. package/dist/messaging/TelegramAdapter.js.map +1 -1
  62. package/dist/messaging/shared/MessageLogger.d.ts +2 -0
  63. package/dist/messaging/shared/MessageLogger.d.ts.map +1 -1
  64. package/dist/messaging/shared/MessageLogger.js.map +1 -1
  65. package/dist/messaging/slack/SlackAdapter.d.ts +19 -0
  66. package/dist/messaging/slack/SlackAdapter.d.ts.map +1 -1
  67. package/dist/messaging/slack/SlackAdapter.js +21 -0
  68. package/dist/messaging/slack/SlackAdapter.js.map +1 -1
  69. package/dist/messaging/telegram-origin/OriginForwardToHolder.d.ts +13 -0
  70. package/dist/messaging/telegram-origin/OriginForwardToHolder.d.ts.map +1 -1
  71. package/dist/messaging/telegram-origin/OriginForwardToHolder.js +16 -0
  72. package/dist/messaging/telegram-origin/OriginForwardToHolder.js.map +1 -1
  73. package/dist/messaging/telegram-origin/OriginLegacy.d.ts +8 -0
  74. package/dist/messaging/telegram-origin/OriginLegacy.d.ts.map +1 -1
  75. package/dist/messaging/telegram-origin/OriginLegacy.js +34 -6
  76. package/dist/messaging/telegram-origin/OriginLegacy.js.map +1 -1
  77. package/dist/messaging/telegram-origin/TelegramOriginBoot.d.ts +3 -0
  78. package/dist/messaging/telegram-origin/TelegramOriginBoot.d.ts.map +1 -1
  79. package/dist/messaging/telegram-origin/TelegramOriginBoot.js +54 -10
  80. package/dist/messaging/telegram-origin/TelegramOriginBoot.js.map +1 -1
  81. package/dist/messaging/telegram-origin/types.d.ts +11 -0
  82. package/dist/messaging/telegram-origin/types.d.ts.map +1 -1
  83. package/dist/messaging/telegram-origin/types.js +15 -0
  84. package/dist/messaging/telegram-origin/types.js.map +1 -1
  85. package/dist/monitoring/GreenPrAutoMerger.d.ts.map +1 -1
  86. package/dist/monitoring/GreenPrAutoMerger.js +5 -2
  87. package/dist/monitoring/GreenPrAutoMerger.js.map +1 -1
  88. package/dist/monitoring/greenPrLogic.d.ts +7 -1
  89. package/dist/monitoring/greenPrLogic.d.ts.map +1 -1
  90. package/dist/monitoring/greenPrLogic.js +13 -0
  91. package/dist/monitoring/greenPrLogic.js.map +1 -1
  92. package/dist/monitoring/promptRelaySettle.d.ts +35 -0
  93. package/dist/monitoring/promptRelaySettle.d.ts.map +1 -0
  94. package/dist/monitoring/promptRelaySettle.js +58 -0
  95. package/dist/monitoring/promptRelaySettle.js.map +1 -0
  96. package/dist/native/instar-desktop-host +0 -0
  97. package/dist/scaffold/templates.d.ts.map +1 -1
  98. package/dist/scaffold/templates.js +4 -1
  99. package/dist/scaffold/templates.js.map +1 -1
  100. package/dist/server/AgentServer.d.ts +15 -0
  101. package/dist/server/AgentServer.d.ts.map +1 -1
  102. package/dist/server/AgentServer.js +95 -21
  103. package/dist/server/AgentServer.js.map +1 -1
  104. package/dist/server/CapabilityIndex.js +3 -3
  105. package/dist/server/CapabilityIndex.js.map +1 -1
  106. package/dist/server/machineMaintenancePool.d.ts +84 -0
  107. package/dist/server/machineMaintenancePool.d.ts.map +1 -0
  108. package/dist/server/machineMaintenancePool.js +165 -0
  109. package/dist/server/machineMaintenancePool.js.map +1 -0
  110. package/dist/server/mobileConversationRoutes.d.ts +23 -3
  111. package/dist/server/mobileConversationRoutes.d.ts.map +1 -1
  112. package/dist/server/mobileConversationRoutes.js +91 -9
  113. package/dist/server/mobileConversationRoutes.js.map +1 -1
  114. package/dist/server/mobileMediaRoutes.d.ts.map +1 -1
  115. package/dist/server/mobileMediaRoutes.js +9 -5
  116. package/dist/server/mobileMediaRoutes.js.map +1 -1
  117. package/dist/server/mobilePairingRoutes.d.ts +1 -6
  118. package/dist/server/mobilePairingRoutes.d.ts.map +1 -1
  119. package/dist/server/mobilePairingRoutes.js +16 -4
  120. package/dist/server/mobilePairingRoutes.js.map +1 -1
  121. package/dist/server/mobileSlackRoutes.d.ts +162 -0
  122. package/dist/server/mobileSlackRoutes.d.ts.map +1 -0
  123. package/dist/server/mobileSlackRoutes.js +552 -0
  124. package/dist/server/mobileSlackRoutes.js.map +1 -0
  125. package/dist/server/routes.d.ts +2 -0
  126. package/dist/server/routes.d.ts.map +1 -1
  127. package/dist/server/routes.js +118 -7
  128. package/dist/server/routes.js.map +1 -1
  129. package/package.json +1 -1
  130. package/scripts/build-locked-proof.mjs +125 -0
  131. package/scripts/lib/locked-proof-build.mjs +71 -0
  132. package/scripts/lib/release-local-steps.mjs +11 -2
  133. package/scripts/locked-proof/configure-proof-agent.mjs +68 -0
  134. package/scripts/locked-proof/create-proof-user.sh +89 -0
  135. package/scripts/locked-proof/driver.mjs +457 -0
  136. package/scripts/locked-proof/lib.mjs +267 -0
  137. package/scripts/locked-proof/pty-feed.py +59 -0
  138. package/scripts/locked-proof/remove-proof-user.sh +18 -0
  139. package/scripts/locked-proof/reset-attempts.py +52 -0
  140. package/scripts/locked-proof/stage-proof-agents.sh +68 -0
  141. package/scripts/safe-merge.mjs +35 -0
  142. package/scripts/standards-coverage.mjs +6 -1
  143. package/src/data/builtin-manifest.json +64 -64
  144. package/src/data/standards-guard-index.json +1 -1
  145. package/src/data/standards-guard-index.meta.json +2 -2
  146. package/src/data/standards-registry.meta.json +1 -1
  147. package/src/scaffold/templates.ts +4 -1
  148. package/upgrades/1.3.1613.md +108 -0
  149. package/upgrades/1.3.1614.md +73 -0
  150. package/upgrades/side-effects/app-reply-push-preview.eli16.md +11 -0
  151. package/upgrades/side-effects/app-reply-push-preview.md +57 -0
  152. package/upgrades/side-effects/chat-media-telegram-inbound.eli16.md +11 -0
  153. package/upgrades/side-effects/chat-media-telegram-inbound.md +75 -0
  154. package/upgrades/side-effects/console-blocker-topic-names.eli16.md +5 -0
  155. package/upgrades/side-effects/console-blocker-topic-names.md +34 -0
  156. package/upgrades/side-effects/console-partial-survives-reload.eli16.md +5 -0
  157. package/upgrades/side-effects/console-partial-survives-reload.md +34 -0
  158. package/upgrades/side-effects/desktop-tests-stop-touching-tcc.eli16.md +13 -0
  159. package/upgrades/side-effects/desktop-tests-stop-touching-tcc.md +65 -0
  160. package/upgrades/side-effects/held-expiry-one-row-per-topic.eli16.md +5 -0
  161. package/upgrades/side-effects/held-expiry-one-row-per-topic.md +37 -0
  162. package/upgrades/side-effects/locked-proof-driver.md +72 -0
  163. package/upgrades/side-effects/locked-proof-test-build.md +64 -0
  164. package/upgrades/side-effects/locked-security-item-no-telegram.md +78 -0
  165. package/upgrades/side-effects/machine-maintenance-pool-view.md +107 -0
  166. package/upgrades/side-effects/mobile-native-conversations-inc4.md +115 -0
  167. package/upgrades/side-effects/origin-config-unknown-not-missing.eli16.md +16 -0
  168. package/upgrades/side-effects/origin-config-unknown-not-missing.md +38 -0
  169. package/upgrades/side-effects/prompt-gate-settle-before-relay.eli16.md +11 -0
  170. package/upgrades/side-effects/prompt-gate-settle-before-relay.md +57 -0
  171. package/upgrades/side-effects/release-local-pending-runs.md +60 -0
  172. package/upgrades/side-effects/stacked-pr-and-ci-timeouts.md +120 -0
@@ -440,13 +440,25 @@ function paintHeadline(models) {
440
440
  // should not turn Home into "part could not be checked". While it is retried,
441
441
  // its rows from the last complete answer stand in, for up to two minutes; the
442
442
  // machines that did answer always show their fresh rows.
443
+ // Kept in session storage too, so reopening the app or reloading the page while a
444
+ // machine is slow still has it (page memory alone is lost on reload). Storage can be
445
+ // absent or full; then it is page memory only, as before.
443
446
  const lastComplete = {};
444
447
  const ROW_LISTS = { attention: 'items', sessions: 'sessions' };
448
+ const LAST_COMPLETE_STORE = 'console.lastComplete.';
445
449
  function rememberComplete(key, result) {
446
- if (ROW_LISTS[key]) lastComplete[key] = { result, at: Date.now() };
450
+ if (!ROW_LISTS[key]) return;
451
+ lastComplete[key] = { result, at: Date.now() };
452
+ try { sessionStorage.setItem(LAST_COMPLETE_STORE + key, JSON.stringify(lastComplete[key])); } catch { /* @silent-fallback-ok: storage unavailable or full; page memory only, as before */ }
453
+ }
454
+ function storedComplete(key) {
455
+ try {
456
+ const v = JSON.parse(sessionStorage.getItem(LAST_COMPLETE_STORE + key) || 'null');
457
+ return v && typeof v.at === 'number' && v.result ? v : null;
458
+ } catch { return null; } // @silent-fallback-ok: unreadable storage means no stored answer
447
459
  }
448
460
  function fillFromLastComplete(key, fresh) {
449
- const prev = lastComplete[key];
461
+ const prev = lastComplete[key] || (lastComplete[key] = storedComplete(key) || undefined);
450
462
  return ROW_LISTS[key] && prev ? fillPartial(fresh, prev.result, ROW_LISTS[key], Date.now(), prev.at) : null;
451
463
  }
452
464
 
@@ -148,3 +148,51 @@ export function machineCareLine(r) {
148
148
  : 'Last practice run: outcome unknown';
149
149
  return [`Restart care is watching only, nothing restarts.`, uptime, last, held.length ? `Holding now: ${held.join(', ')}` : null].filter(Boolean).join(' · ');
150
150
  }
151
+
152
+ const CARE_FAILED = {
153
+ offline: 'offline',
154
+ 'not-enabled': 'not turned on there',
155
+ 'route-missing': 'on an older version',
156
+ unauthorized: 'did not accept this machine',
157
+ 'url-rejected': 'no safe connection',
158
+ 'peer-unreachable': 'did not answer',
159
+ 'read-failed': 'its reading failed',
160
+ };
161
+
162
+ /** One short care line for one machine's state (no repeated "watching only" preface). */
163
+ function careShort(d) {
164
+ const uptime = typeof d.uptimeDays === 'number' ? `Up ${d.uptimeDays} days` : 'Uptime unread';
165
+ const held = (Array.isArray(d.safetyHolds) ? d.safetyHolds : []).filter((h) => h && h.active).map((h) => h.label);
166
+ const night = d.lastRehearsal;
167
+ const last = !night ? 'no practice run yet'
168
+ : night.outcome === 'would-restart' ? 'practice run: would have restarted'
169
+ : night.outcome === 'would-roll' ? 'practice run: would have waited a night'
170
+ : night.outcome === 'would-hold' ? 'practice run: would have been held'
171
+ : 'practice run: outcome unknown';
172
+ return [uptime, last, held.length ? `holding: ${held.join(', ')}` : null].filter(Boolean).join(' · ');
173
+ }
174
+
175
+ /**
176
+ * Restart care across the pool (GET /machine-maintenance?scope=pool, CMT-1199).
177
+ * Returns { header, byMachine: {machineId: line}, selfLine, missing: [line] } or null.
178
+ * An older server ignores scope and answers its own status only: treated as self.
179
+ */
180
+ export function machineCarePool(r) {
181
+ if (!r || !r.ok || !r.data) return null;
182
+ const d = r.data;
183
+ const header = 'Restart care is watching only, nothing restarts.';
184
+ if (!Array.isArray(d.machines)) {
185
+ return { header, byMachine: {}, selfLine: careShort(d), missing: [] };
186
+ }
187
+ const byMachine = {};
188
+ let selfLine = null;
189
+ for (const m of d.machines) {
190
+ if (!m || !m.state) continue;
191
+ const line = careShort(m.state);
192
+ byMachine[m.machineId] = line;
193
+ if (m.self) selfLine = line;
194
+ }
195
+ const failed = d.pool && Array.isArray(d.pool.failed) ? d.pool.failed : [];
196
+ const missing = failed.map((f) => `${f.machineNickname || 'a machine with no name yet'}: can’t tell, ${CARE_FAILED[f.reason] || 'no answer'}`);
197
+ return { header, byMachine, selfLine, missing };
198
+ }
@@ -2,7 +2,7 @@
2
2
  // Reads only; the one frequent write is Rename (bearer). Identity reviews stay in
3
3
  // the legacy tab until their PIN sheet is rebuilt (the plan's first cut).
4
4
 
5
- import { buildMachinesPage, ropesFor, healthOf, usageOf, machineCareLine } from './machines-model.js';
5
+ import { buildMachinesPage, ropesFor, healthOf, usageOf, machineCarePool } from './machines-model.js';
6
6
  import { el, setKids, pageHead, sheet, closeSheet, story, note, cantTell } from './ui.js';
7
7
  import { legacyHref } from './nav-model.js';
8
8
 
@@ -11,7 +11,7 @@ const STATE_DOT = { ok: 'dot live', attn: 'dot attn', bad: 'dot bad', stale: 'do
11
11
  export async function renderMachines(main, ctx) {
12
12
  const { get } = ctx;
13
13
  if (!main.querySelector('.machine-cards')) setKids(main, el('section', { class: 'hero page-hero' }, el('div', { class: 'eyebrow', text: 'Capacity · Machines' }), el('h1', { class: 'page-title skeleton', text: 'Loading machines' })));
14
- const [pool, health, guards, sessions, care] = await Promise.all([get('/pool'), get('/health'), get('/guards'), get('/sessions?scope=pool', 8000), get('/machine-maintenance')]);
14
+ const [pool, health, guards, sessions, care] = await Promise.all([get('/pool'), get('/health'), get('/guards'), get('/sessions?scope=pool', 8000), get('/machine-maintenance?scope=pool', 8000)]);
15
15
  const live = sessions.ok && Array.isArray(sessions.data && sessions.data.sessions) ? sessions.data.sessions.filter((s) => s.status === 'running' || s.status === 'starting') : [];
16
16
  const byMachine = {};
17
17
  const names = {};
@@ -21,6 +21,8 @@ export async function renderMachines(main, ctx) {
21
21
  const page = buildMachinesPage(pool, health, Date.now(), { sessionsByMachine: sessions.ok ? byMachine : undefined, needsLook });
22
22
  if (!page.ok) { setKids(main, pageHead({ eyebrow: 'Capacity · Machines', headline: 'Machines', tone: 'muted' }), cantTell(page.reason), legacyLink()); return; }
23
23
 
24
+ const carePool = machineCarePool(care);
25
+ const careFor = (m) => (carePool ? (carePool.byMachine[m.id] || (m.isSelf ? carePool.selfLine : null)) : null);
24
26
  const cards = el('div', { class: 'machine-cards' }, page.machines.map((m) => {
25
27
  const card = el('button', { class: 'machine-card', type: 'button', 'data-state': m.state, 'data-focus-key': `m:${m.id}` },
26
28
  el('span', { class: 'mc-top' },
@@ -31,6 +33,7 @@ export async function renderMachines(main, ctx) {
31
33
  el('span', { class: 'mc-state', text: m.label })),
32
34
  el('span', { class: 'mc-line', text: [m.verdict ? `${m.verdict}${typeof m.perCore === 'number' ? ` · load ${m.perCore.toFixed(1)} per core` : ''}` : 'no load reading', typeof m.sessions === 'number' ? `${m.sessions} ${m.sessions === 1 ? 'session' : 'sessions'}` : null].filter(Boolean).join(' · ') }),
33
35
  el('span', { class: 'mc-evidence', text: m.age ? `last evidence ${m.age}${m.estimated && !page.single ? ' (estimated)' : ''}` : 'no evidence since this server started' }),
36
+ careFor(m) ? el('span', { class: 'mc-evidence', text: `Restart care: ${careFor(m)}` }) : null,
34
37
  );
35
38
  card.addEventListener('click', () => openMachine(m, { get, health, guards, names }));
36
39
  return card;
@@ -38,7 +41,7 @@ export async function renderMachines(main, ctx) {
38
41
  setKids(main,
39
42
  pageHead({ eyebrow: 'Capacity · Machines', headline: page.headline, sub: page.sub, tone: page.tone, facts: page.facts }),
40
43
  !sessions.ok ? note(`Couldn't count sessions: ${sessions.reason}.`) : null,
41
- machineCareLine(care) ? note(machineCareLine(care)) : null,
44
+ carePool ? note([carePool.header, ...carePool.missing].join(' · ')) : null,
42
45
  cards,
43
46
  legacyLink(),
44
47
  );
@@ -168,19 +168,21 @@ function recheckText(e, now) {
168
168
  // printed.
169
169
  const SECRET_QUERY = /([?&](?:sig|signature|token|key|auth|access_token)[^=&\s]*=)[^&\s]+/gi;
170
170
  const SHELL_START = /^\s*(?:cd|cat|curl|echo|node|bash|sh|gh|git|python3?|npx)\b/;
171
- export function blockerText(raw) {
171
+ export function blockerText(raw, topicNames = {}) {
172
172
  const s = String(raw || '');
173
173
  const doc = /<<-?\s*['"]?(\w+)['"]?[^\n]*\n([\s\S]*?)(?:\n[ \t]*\1[ \t]*(?:\n|$)|$)/.exec(s);
174
174
  let body = doc ? doc[2] : s;
175
175
  if (!doc && SHELL_START.test(body)) return 'Flagged in a command I ran (no message text)';
176
176
  body = body.replace(SECRET_QUERY, '$1…');
177
+ // Names, never ids: "topic 136110" reads as that conversation's name when it is known.
178
+ body = body.replace(/\btopic #?(\d{2,})\b/gi, (m, id) => (topicNames[id] ? `“${topicNames[id]}”` : m));
177
179
  const line = body.split('\n').map((l) => l.trim()).find(Boolean) || '';
178
180
  return line.length > 220 ? `${line.slice(0, 219)}…` : line;
179
181
  }
180
182
 
181
183
  /** A blocker as a row: { key, main, sub, end, tone, kind, record }. */
182
- export function blockerRow(e, now = Date.now()) {
183
- const main = blockerText(e.detectedText) || e.origin || 'A blocker';
184
+ export function blockerRow(e, now = Date.now(), topicNames = {}) {
185
+ const main = blockerText(e.detectedText, topicNames) || e.origin || 'A blocker';
184
186
  let sub; let tone = null; let kind;
185
187
  if (e.state === 'true-blocker') { const r = recheckText(e, now); sub = `Truly stuck for now · ${r.text}`; tone = 'bad'; kind = 'stuck'; }
186
188
  else if (e.state === 'access-requested') { sub = 'Waiting on you for access'; tone = 'attn'; kind = 'needs-you'; }
@@ -193,7 +195,7 @@ export function blockerRow(e, now = Date.now()) {
193
195
  * The In the way model from GET /blockers.
194
196
  * { state: 'off'|'failed'|'ok', reason, needsYou, stuck, working, clearedWeek, clearedOlder }
195
197
  */
196
- export function buildInTheWay(res, now = Date.now()) {
198
+ export function buildInTheWay(res, now = Date.now(), topicNames = {}) {
197
199
  if (!res || !res.ok) {
198
200
  if (res && /switched off/.test(res.reason || '')) return { state: 'off', reason: 'Blocker tracking is off on this agent.', needsYou: [], stuck: [], working: [], clearedWeek: [], clearedOlder: [] };
199
201
  return { state: 'failed', reason: `Couldn't read what is in the way: ${res ? res.reason : 'not read'}.`, needsYou: [], stuck: [], working: [], clearedWeek: [], clearedOlder: [] };
@@ -203,7 +205,7 @@ export function buildInTheWay(res, now = Date.now()) {
203
205
  const out = { state: 'ok', reason: null, needsYou: [], stuck: [], working: [], clearedWeek: [], clearedOlder: [], total: Number(res.data.total) || entries.length };
204
206
  for (const e of entries) {
205
207
  if (!e || typeof e.state !== 'string') continue;
206
- const r = blockerRow(e, now);
208
+ const r = blockerRow(e, now, topicNames);
207
209
  if (r.kind === 'needs-you') out.needsYou.push(r);
208
210
  else if (r.kind === 'stuck') out.stuck.push(r);
209
211
  else if (WORKING_STATES.has(e.state)) out.working.push(r);
@@ -330,7 +332,7 @@ export function buildPlansPage(res, now = Date.now(), opts = {}) {
330
332
  else if (age <= MOVING_MS) s.inFlight.push(row);
331
333
  else s.idle.push(row);
332
334
  }
333
- const inTheWay = buildInTheWay(r.blockers, now);
335
+ const inTheWay = buildInTheWay(r.blockers, now, opts.topicNames || {});
334
336
  // A blocker that asked for access is a needs-you item, not a working one.
335
337
  for (const b of inTheWay.needsYou) s.needsYou.push({ ...b, needs: 'I need access to continue', end: 'Open' });
336
338
 
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"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"}
@@ -962,6 +962,8 @@ let _slackAdapter = null;
962
962
  // block; null when Slack is not configured (the owner-side Slack branch then
963
963
  // no-ops — a forwarded Slack key on a Slack-less owner is a misconfiguration the
964
964
  // router's placement should never produce, and falling through is harmless).
965
+ // Returns what happened to the message (mobile-native-conversations §4.9: the app's Slack send
966
+ // records it); the live and forwarded Slack paths ignore the result.
965
967
  let _slackInboundDispatch = null;
966
968
  // SessionRefresh — agent-initiated respawn. Module-scope so onRestartSession
967
969
  // (defined outside startServer) can delegate to it once startServer wires it.
@@ -7357,6 +7359,20 @@ export async function startServer(options) {
7357
7359
  }
7358
7360
  // Relay to messaging platform if adapter is available and session has a binding
7359
7361
  if (classification.action === 'relay' || classification.action === 'auto-approve') {
7362
+ // Settle first: many prompts are answered without a person (account
7363
+ // swap, permission floor, respawn). Relay only one still on screen.
7364
+ const { settleBeforeRelay, DEFAULT_RELAY_SETTLE_MS } = await import('../monitoring/promptRelaySettle.js');
7365
+ const settle = await settleBeforeRelay(prompt, {
7366
+ settleMs: promptGateConfig.relaySettleMs ?? DEFAULT_RELAY_SETTLE_MS,
7367
+ sleep: (ms) => new Promise((r) => setTimeout(r, ms)),
7368
+ isAlive: (name) => sessionManager.isSessionAlive(name),
7369
+ capture: (name) => sessionManager.captureOutput(name, 60),
7370
+ });
7371
+ if (!settle.relay) {
7372
+ console.log(`[PromptGate] Not relaying ${prompt.type} prompt for ${prompt.sessionName}: ${settle.reason}`);
7373
+ detector.onInputSent(prompt.sessionName);
7374
+ return;
7375
+ }
7360
7376
  let relayed = false;
7361
7377
  // Try Telegram first
7362
7378
  if (telegram) {
@@ -9166,6 +9182,12 @@ export async function startServer(options) {
9166
9182
  else if (safeSenderName) {
9167
9183
  prefix = `[slack:${channelId} from ${safeSenderName}]`;
9168
9184
  }
9185
+ // Sent from the Instar app (mobile-native-conversations §4.9): the server appends the mark
9186
+ // after the sanitized name; "📱 signed" only when the phone's signature checked out.
9187
+ const appOrigin = message.metadata?.appOrigin;
9188
+ if (typeof appOrigin === 'string') {
9189
+ prefix = `${prefix.slice(0, -1)} (📱 ${appOrigin === 'verified' ? 'signed' : 'from the app'})]`;
9190
+ }
9169
9191
  // Build context for the session — inject inline like Telegram does
9170
9192
  // Use async fallback to fetch from Slack API if ring buffer is empty
9171
9193
  const tmpDir = '/tmp/instar-slack';
@@ -9297,8 +9319,9 @@ export async function startServer(options) {
9297
9319
  }
9298
9320
  catch (injectErr) {
9299
9321
  console.error(`[slack→session] Injection failed: ${injectErr instanceof Error ? injectErr.message : injectErr}`);
9322
+ return 'refused';
9300
9323
  }
9301
- return;
9324
+ return 'delivered';
9302
9325
  }
9303
9326
  }
9304
9327
  console.log(`[slack→session] Session "${existingSession}" died, respawning...`);
@@ -9328,7 +9351,7 @@ export async function startServer(options) {
9328
9351
  ? 'conversation identity unavailable'
9329
9352
  : (!relayReadiness.ready ? relayReadiness.reason : 'unknown readiness failure');
9330
9353
  console.error(`[slack→session] spawn refused: slack-relay-not-ready (${reason})`);
9331
- return;
9354
+ return 'refused';
9332
9355
  }
9333
9356
  // Slack DMs are isolated 1:1 bound sessions too. A shared lifeline
9334
9357
  // intentionally has no single INSTAR_CONVERSATION_ID, so routing DMs
@@ -9376,7 +9399,7 @@ export async function startServer(options) {
9376
9399
  custodyLive: custody,
9377
9400
  }).catch(() => { });
9378
9401
  }
9379
- return;
9402
+ return custody ? 'queued' : 'refused';
9380
9403
  }
9381
9404
  }
9382
9405
  }
@@ -9403,10 +9426,13 @@ export async function startServer(options) {
9403
9426
  if (contextWallForcesFresh && conversationId !== null) {
9404
9427
  _clearContextExhaustionFreshRequired?.(conversationId);
9405
9428
  }
9429
+ return 'delivered';
9406
9430
  }
9431
+ return 'refused';
9407
9432
  }
9408
9433
  catch (err) {
9409
9434
  console.error(`[slack] Session spawn failed: ${err instanceof Error ? err.message : err}`);
9435
+ return 'refused';
9410
9436
  }
9411
9437
  };
9412
9438
  // Expose to the owner-side mesh bridge (a forwarded Slack message replays
@@ -28116,9 +28142,7 @@ export async function startServer(options) {
28116
28142
  heldAudit({ phase: 'expired', topicId: row.destination.topicId, operationId: row.operationId, lastAttempt: row.holdDetail?.lastAttempt ?? null });
28117
28143
  if (Number.isSafeInteger(topicId))
28118
28144
  heldCollapser.clear(topicId);
28119
- await telegram.createAttentionItem({ id: originForwardMod.heldExpiryItemId(row), category: 'telegram-origin', priority: 'HIGH',
28120
- title: `Held reply to topic ${row.destination.topicId ?? '?'} expired`, summary: originForwardMod.expiredForwardWording(row),
28121
- sourceContext: 'telegram-origin-forward-to-holder' }, { hubOnly: true });
28145
+ await telegram.createAttentionItem(originForwardMod.heldExpiryItem(row), { hubOnly: true });
28122
28146
  };
28123
28147
  }
28124
28148
  telegram.outboundRelay = async (topicId, text, opts) => {
@@ -29456,7 +29480,7 @@ export async function startServer(options) {
29456
29480
  const server = new AgentServer({ config, ecosystemLedger: _ecosystemLedger ?? undefined, singleInstanceLock, agentIdentity: _agentIdentityDeps, terminateSessionAuthority: terminateWithAuthority, subscriptionEmailBinding: credentialLocationLedger, subscriptionEmailBarrier, subscriptionIdentityOracle, sessionManager, llmQueue: sharedLlmQueue, state, scheduler, telegram, telegramOrigin: telegramOriginBoot?.runtime, relationships, feedback, feedbackAnomalyDetector, dispatches, updateChecker, autoUpdater, autoDispatcher, quotaTracker, quotaManager, publisher, viewer, jobAnomalySendAutomationReply: sendAutomationReply, tunnel, evolution, watchdog, topicMemory, triageNurse, projectMapper, cartographerRoots: cartographerRoots ?? undefined, coherenceGate: scopeVerifier, contextHierarchy, canonicalState, operationGate, sentinel, adaptiveTrust, memoryMonitor, orphanReaper, coherenceMonitor, commitmentTracker, subscriptionPool, accountFollowMePeerViews: async () => { const nickById = new Map((_listPoolMachines?.() ?? []).map((m) => [m.machineId, verifiedEntityName(m.machineId, m.nickname) ?? ''])); let peers = (_resolvePeerUrls?.() ?? []).map((p) => ({ machineId: p.machineId, nickname: nickById.get(p.machineId) ?? '', url: p.url })); if (peers.length === 0) {
29457
29481
  peers = (_listPoolMachines?.() ?? []).filter((m) => m.machineId !== _meshSelfId && !!m.lastKnownUrl).map((m) => ({ machineId: m.machineId, nickname: verifiedEntityName(m.machineId, m.nickname) ?? '', url: m.lastKnownUrl }));
29458
29482
  } if (peers.length === 0)
29459
- return []; const { fetchPeerSubscriptionViews } = await import('../core/fetchPeerSubscriptionViews.js'); return fetchPeerSubscriptionViews({ peers: () => peers, fetchImpl: fetch, authToken: config.authToken ?? '' }); }, quotaPoller, quotaAwareScheduler: _quotaAwareScheduler ?? undefined, proactiveSwapMonitor: _proactiveSwapMonitor ?? undefined, inUseAccountResolver, enrollmentWizard, accountFollowMeRevocation, credentialRepointing, semanticMemory, activitySentinel, rateLimitSentinel, releaseReadinessSentinel: releaseReadinessSentinel ?? undefined, greenPrAutoMerger: greenPrAutoMerger ?? undefined, localVerify: localVerifyService ?? undefined, localVerifyStatus: localVerifyStatus ?? undefined, guardLatchStore: guardLatchStore ?? undefined, messageRouter, summarySentinel, spawnManager, systemReviewer, capabilityMapper, selfKnowledgeTree, coverageAuditor, topicResumeMap: _topicResumeMap ?? undefined, topicProfile: _topicProfileCtx ?? undefined, sessionRefresh: _sessionRefresh ?? undefined, autonomyManager, trustElevationTracker, autonomousEvolution, coordinator: coordinator.enabled ? coordinator : undefined, meshBindActive: coordinator.managers.identityManager.hasIdentity() && config.multiMachine?.meshTransport?.enabled !== false, localSigningKeyPem, leaseTransport, peerEndpointRecorder, getSelfMeshEndpoints, onLeasePullRequest: () => leaseCoordinatorRef?.currentLease() ?? null, liveTailReceiver, handoffWireTransport, onHandoffBegin, onHandoffInitiate: handoffInitiate, handoffInProgress: handoffSentinelInProgress, messageLedger, currentInboundByTopic, replyMarkerTransport, onReplyMarker: messageLedger ? (marker) => { const m = marker; messageLedger.applyRemoteReplyMarker(m.dedupeKey, { platform: m.platform, replyIdempotencyKey: m.replyIdempotencyKey, epoch: m.epoch, topic: m.topic ?? null }); } : undefined, whatsapp: whatsappAdapter, slack: slackAdapter, imessage: imessageAdapter, conversationRegistry, conversationBindAuth, appConversations: _appConversationService ?? undefined, conversationFollowThrough, whatsappBusinessBackend, messageBridge, hookEventReceiver, worktreeMonitor, subagentTracker, instructionsVerifier, handshakeManager: threadlineHandshake, threadlineRouter, conversationStore, threadLog, threadMessageRecorder, warrantsReplyGate, collaborationSurfacer, peerHomebaseRelay, threadResumeMap, topicLinkageHandler: topicLinkageHandler ?? undefined, threadlineRelayClient, pairingInvites: threadlinePairingInvites, getLastRelayEvent: threadlineGetLastRelayEvent, a2aRelayForward: _a2aRelayForwardCtx ?? undefined, threadlineReplyWaiters, threadlineMcpHttp, listenerManager: listenerManager ?? undefined, a2aDeliveryTracker: a2aDeliveryTracker ?? undefined, relayVerdictCounters: threadlineRelayClient ? (() => ({ ...threadlineRelayClient.relayVerdictCounters, expiredMismatchIgnored: a2aDeliveryTracker?.expiredMismatchIgnored ?? 0 })) : undefined, inboundIdLedger: _inboundIdLedger ?? undefined, inboundIdLedgerDaemonDeferred: () => _inboundIdLedgerDaemonDeferred, responseReviewGate, reviewCanaryBattery, messagingToneGate, outboundDedupGate, telemetryHeartbeat, pasteManager, featureRegistry, discoveryEvaluator, completionEvaluator, unifiedTrust, liveConfig, sharedStateLedger, ledgerSessionRegistry, worktreeManager, oidcEnrolledRepos: parallelDevConfig?.oidcEnrolledRepos, initiativeTracker, projectRoundRunner, projectDriftChecker, machineHeartbeat, machinePoolRegistry, ropeHealthMonitor, writeAdmission: writeAdmission ?? undefined, getInboundQueue: () => _inboundQueue, getMachineCoherence: () => _machineCoherenceSentinel, getSingleMachineFailoverGap: () => _singleMachineFailoverGap, getMissingLoginSession: () => _missingLoginSession, getSessionPoolFailoverRunner: () => _sessionPoolFailoverRunnerDriver?.status() ?? null, sessionPoolPromotionActivation: _sessionPoolPromotionActivation, meshRpcDispatcher, deliverA2aToMachine: _deliverA2aToMachine ?? undefined, workingSetPullCoordinator, workingSetArtifactManager, orchestratorPoller, commitmentReplicaStore, preferenceReplicaStore, replicatedRecordEmitter, replicatedStoreReconciler, conflictStore, rollbackUnmerge, droppedOriginRegistry, preferencesUnionReader, jevMemoryPicker, forwardCommitmentMutate, sessionOwnershipRegistry, sendDrain: _sendDrain ?? undefined, topicPinStore: _topicPinStore ?? undefined, topicPinSkewQuarantine: _topicPinSkewQuarantine ?? undefined, topicPinFoldView: _topicPinFoldView ?? undefined, ownershipReconciler: _ownershipReconciler ?? undefined, staleOwnerEngine: _staleOwnerEngine ?? undefined, duplicateReconciler: _duplicateReconciler ?? undefined, ownerDarkLadder: _ownerDarkLadder ?? undefined, spawnAdmission: _spawnAdmission ?? undefined, judgmentProvenance: _judgmentProvenance ?? undefined, leaseHandback: _leaseHandbackCtx ?? undefined, streamTicketStore: _streamTicketStore ?? undefined, poolStreamAllowRemoteInput: config.dashboard?.poolStream?.allowRemoteInput ?? false, poolStreamConnector: _poolStreamConnector ?? undefined, secretSync: _secretSyncHandle ?? undefined, meshSelfId: _meshSelfId ?? undefined, resolveRouterUrl: _resolveRouterUrl ?? undefined, resolvePeerUrls: _resolvePeerUrls ?? undefined, recordRopeResult: _recordRopeResult ?? undefined, guardRegistry, listPoolMachines: _listPoolMachines ?? undefined, deliverMandateToMachine: _deliverMandateToMachine ?? undefined, passkeyRevokeOutbox: _passkeyRevokeOutbox ? () => _passkeyRevokeOutbox : undefined, passkeyPeerOnline: _passkeyPeerOnline, passkeyPoolReader: _passkeyPoolReader ? () => _passkeyPoolReader : undefined, passkeyProofBrowser: async (profileDir) => { const { ChromeCdpReloginBrowser } = await import('../core/ChromeCdpReloginBrowser.js'); return new ChromeCdpReloginBrowser({ userDataDir: profileDir, passkeyMode: true, headless: true, launchTimeoutMs: 30_000, operationTimeoutMs: 20_000 }); }, poolLink: _poolLink ?? undefined, poolPollCache: _poolPollCache ?? undefined, sessionPoolE2EResultStore, proxyCoordinator, topicIntentStore, topicIntentArcCheck, usherSignalStore, intelligence: sharedIntelligence ?? undefined, telegramBridgeConfig, telegramBridge: telegramBridge ?? undefined, threadlineObservability, briefDeps, workingMemory, taskFlowRegistry, threadlineFlowBridge, sessionReaper, agentWorktreeReaper, externalHogSentinel, orphanedWorkSentinel, mcpProcessReaper, codexArmSessionSweeper, geminiLoopRunner, sleepController, agentActivityState, reapLog, resumeQueue, resumeDrainer, autonomousLivenessReconciler, enforcedTerminationStatus: () => enforcedTerminationWatchdog?.guardStatus() ?? null, prHandLease: prHandLease ?? undefined, standDownRegistry: _standDownRegistry ?? undefined, standDownAudit: _standDownAudit ?? undefined, operatorStopRecorder: recordOperatorStop, sleepWakeDetector, unjustifiedStopGate, stopGateDb, stopNotifier, liveTestGate, liveTestGateMode, liveTestRunnerCtx }); // Resolve the late-bound topic-operator getter (increment 2e): routing was
29483
+ return []; const { fetchPeerSubscriptionViews } = await import('../core/fetchPeerSubscriptionViews.js'); return fetchPeerSubscriptionViews({ peers: () => peers, fetchImpl: fetch, authToken: config.authToken ?? '' }); }, quotaPoller, quotaAwareScheduler: _quotaAwareScheduler ?? undefined, proactiveSwapMonitor: _proactiveSwapMonitor ?? undefined, inUseAccountResolver, enrollmentWizard, accountFollowMeRevocation, credentialRepointing, semanticMemory, activitySentinel, rateLimitSentinel, releaseReadinessSentinel: releaseReadinessSentinel ?? undefined, greenPrAutoMerger: greenPrAutoMerger ?? undefined, localVerify: localVerifyService ?? undefined, localVerifyStatus: localVerifyStatus ?? undefined, guardLatchStore: guardLatchStore ?? undefined, messageRouter, summarySentinel, spawnManager, systemReviewer, capabilityMapper, selfKnowledgeTree, coverageAuditor, topicResumeMap: _topicResumeMap ?? undefined, topicProfile: _topicProfileCtx ?? undefined, sessionRefresh: _sessionRefresh ?? undefined, autonomyManager, trustElevationTracker, autonomousEvolution, coordinator: coordinator.enabled ? coordinator : undefined, meshBindActive: coordinator.managers.identityManager.hasIdentity() && config.multiMachine?.meshTransport?.enabled !== false, localSigningKeyPem, leaseTransport, peerEndpointRecorder, getSelfMeshEndpoints, onLeasePullRequest: () => leaseCoordinatorRef?.currentLease() ?? null, liveTailReceiver, handoffWireTransport, onHandoffBegin, onHandoffInitiate: handoffInitiate, handoffInProgress: handoffSentinelInProgress, messageLedger, currentInboundByTopic, replyMarkerTransport, onReplyMarker: messageLedger ? (marker) => { const m = marker; messageLedger.applyRemoteReplyMarker(m.dedupeKey, { platform: m.platform, replyIdempotencyKey: m.replyIdempotencyKey, epoch: m.epoch, topic: m.topic ?? null }); } : undefined, whatsapp: whatsappAdapter, slack: slackAdapter, imessage: imessageAdapter, conversationRegistry, conversationBindAuth, appConversations: _appConversationService ?? undefined, slackInboundDispatch: () => _slackInboundDispatch, conversationFollowThrough, whatsappBusinessBackend, messageBridge, hookEventReceiver, worktreeMonitor, subagentTracker, instructionsVerifier, handshakeManager: threadlineHandshake, threadlineRouter, conversationStore, threadLog, threadMessageRecorder, warrantsReplyGate, collaborationSurfacer, peerHomebaseRelay, threadResumeMap, topicLinkageHandler: topicLinkageHandler ?? undefined, threadlineRelayClient, pairingInvites: threadlinePairingInvites, getLastRelayEvent: threadlineGetLastRelayEvent, a2aRelayForward: _a2aRelayForwardCtx ?? undefined, threadlineReplyWaiters, threadlineMcpHttp, listenerManager: listenerManager ?? undefined, a2aDeliveryTracker: a2aDeliveryTracker ?? undefined, relayVerdictCounters: threadlineRelayClient ? (() => ({ ...threadlineRelayClient.relayVerdictCounters, expiredMismatchIgnored: a2aDeliveryTracker?.expiredMismatchIgnored ?? 0 })) : undefined, inboundIdLedger: _inboundIdLedger ?? undefined, inboundIdLedgerDaemonDeferred: () => _inboundIdLedgerDaemonDeferred, responseReviewGate, reviewCanaryBattery, messagingToneGate, outboundDedupGate, telemetryHeartbeat, pasteManager, featureRegistry, discoveryEvaluator, completionEvaluator, unifiedTrust, liveConfig, sharedStateLedger, ledgerSessionRegistry, worktreeManager, oidcEnrolledRepos: parallelDevConfig?.oidcEnrolledRepos, initiativeTracker, projectRoundRunner, projectDriftChecker, machineHeartbeat, machinePoolRegistry, ropeHealthMonitor, writeAdmission: writeAdmission ?? undefined, getInboundQueue: () => _inboundQueue, getMachineCoherence: () => _machineCoherenceSentinel, getSingleMachineFailoverGap: () => _singleMachineFailoverGap, getMissingLoginSession: () => _missingLoginSession, getSessionPoolFailoverRunner: () => _sessionPoolFailoverRunnerDriver?.status() ?? null, sessionPoolPromotionActivation: _sessionPoolPromotionActivation, meshRpcDispatcher, deliverA2aToMachine: _deliverA2aToMachine ?? undefined, workingSetPullCoordinator, workingSetArtifactManager, orchestratorPoller, commitmentReplicaStore, preferenceReplicaStore, replicatedRecordEmitter, replicatedStoreReconciler, conflictStore, rollbackUnmerge, droppedOriginRegistry, preferencesUnionReader, jevMemoryPicker, forwardCommitmentMutate, sessionOwnershipRegistry, sendDrain: _sendDrain ?? undefined, topicPinStore: _topicPinStore ?? undefined, topicPinSkewQuarantine: _topicPinSkewQuarantine ?? undefined, topicPinFoldView: _topicPinFoldView ?? undefined, ownershipReconciler: _ownershipReconciler ?? undefined, staleOwnerEngine: _staleOwnerEngine ?? undefined, duplicateReconciler: _duplicateReconciler ?? undefined, ownerDarkLadder: _ownerDarkLadder ?? undefined, spawnAdmission: _spawnAdmission ?? undefined, judgmentProvenance: _judgmentProvenance ?? undefined, leaseHandback: _leaseHandbackCtx ?? undefined, streamTicketStore: _streamTicketStore ?? undefined, poolStreamAllowRemoteInput: config.dashboard?.poolStream?.allowRemoteInput ?? false, poolStreamConnector: _poolStreamConnector ?? undefined, secretSync: _secretSyncHandle ?? undefined, meshSelfId: _meshSelfId ?? undefined, resolveRouterUrl: _resolveRouterUrl ?? undefined, resolvePeerUrls: _resolvePeerUrls ?? undefined, recordRopeResult: _recordRopeResult ?? undefined, guardRegistry, listPoolMachines: _listPoolMachines ?? undefined, deliverMandateToMachine: _deliverMandateToMachine ?? undefined, passkeyRevokeOutbox: _passkeyRevokeOutbox ? () => _passkeyRevokeOutbox : undefined, passkeyPeerOnline: _passkeyPeerOnline, passkeyPoolReader: _passkeyPoolReader ? () => _passkeyPoolReader : undefined, passkeyProofBrowser: async (profileDir) => { const { ChromeCdpReloginBrowser } = await import('../core/ChromeCdpReloginBrowser.js'); return new ChromeCdpReloginBrowser({ userDataDir: profileDir, passkeyMode: true, headless: true, launchTimeoutMs: 30_000, operationTimeoutMs: 20_000 }); }, poolLink: _poolLink ?? undefined, poolPollCache: _poolPollCache ?? undefined, sessionPoolE2EResultStore, proxyCoordinator, topicIntentStore, topicIntentArcCheck, usherSignalStore, intelligence: sharedIntelligence ?? undefined, telegramBridgeConfig, telegramBridge: telegramBridge ?? undefined, threadlineObservability, briefDeps, workingMemory, taskFlowRegistry, threadlineFlowBridge, sessionReaper, agentWorktreeReaper, externalHogSentinel, orphanedWorkSentinel, mcpProcessReaper, codexArmSessionSweeper, geminiLoopRunner, sleepController, agentActivityState, reapLog, resumeQueue, resumeDrainer, autonomousLivenessReconciler, enforcedTerminationStatus: () => enforcedTerminationWatchdog?.guardStatus() ?? null, prHandLease: prHandLease ?? undefined, standDownRegistry: _standDownRegistry ?? undefined, standDownAudit: _standDownAudit ?? undefined, operatorStopRecorder: recordOperatorStop, sleepWakeDetector, unjustifiedStopGate, stopGateDb, stopNotifier, liveTestGate, liveTestGateMode, liveTestRunnerCtx }); // Resolve the late-bound topic-operator getter (increment 2e): routing was
29460
29484
  const readIdentityProjectionPeerRows = async () => {
29461
29485
  const peers = _resolvePeerUrls?.() ?? [];
29462
29486
  const extra = config.multiMachine?.peerUrlAllowlist;