@coreplane/switchboard 1.243.0 → 1.245.0

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 (159) hide show
  1. package/dist/assets/config/config.example.yaml +6 -3
  2. package/dist/assets/deploy/cloudflare/worker.ts +2 -0
  3. package/dist/assets/deploy/cloudflare-memory/worker.ts +148 -0
  4. package/dist/assets/deploy/cloudflare-resident/gc.ts +8 -1
  5. package/dist/assets/deploy/cloudflare-resident/threadErr.ts +337 -0
  6. package/dist/assets/deploy/cloudflare-resident/tsconfig.json +1 -1
  7. package/dist/assets/deploy/cloudflare-resident/worker.ts +258 -173
  8. package/dist/assets/deploy/cloudflare-sandbox/worker.ts +18 -12
  9. package/dist/assets/deploy/secrets.manifest.json +12 -0
  10. package/dist/assets/package-lock.json +3 -3
  11. package/dist/assets/package.json +1 -1
  12. package/dist/assets/source.json +3 -3
  13. package/dist/assets/src/agents/registry.ts +5 -5
  14. package/dist/assets/src/config/profile.ts +17 -1
  15. package/dist/assets/src/core/authz/types.ts +18 -0
  16. package/dist/assets/src/core/budgets.ts +61 -0
  17. package/dist/assets/src/core/coordinator/contract.ts +32 -0
  18. package/dist/assets/src/core/coordinator/driver.ts +75 -12
  19. package/dist/assets/src/core/delivery.ts +1 -1
  20. package/dist/assets/src/core/reviewVerdict.ts +101 -24
  21. package/dist/assets/src/core/runEvents.ts +76 -8
  22. package/dist/assets/src/core/runFriction.ts +2 -1
  23. package/dist/assets/src/core/runRecord.ts +65 -0
  24. package/dist/assets/src/core/ship/contract.ts +2 -1
  25. package/dist/assets/src/core/ship/coordinator.ts +235 -33
  26. package/dist/assets/src/core/ship/renewal.ts +155 -0
  27. package/dist/assets/src/core/trace/attrs.ts +11 -0
  28. package/dist/assets/src/core/trace/types.ts +4 -3
  29. package/dist/assets/src/execution/residentRefresh.ts +46 -7
  30. package/dist/assets/src/execution/residentText.ts +8 -3
  31. package/dist/assets/src/mcp/registry.ts +3 -0
  32. package/dist/assets/web/dist/.vite/manifest.json +491 -472
  33. package/dist/assets/web/dist/assets/AppShell-qqs_p96-.js +1 -0
  34. package/dist/assets/web/dist/assets/CostsPage-Dd9aXxxI.js +2 -0
  35. package/dist/assets/web/dist/assets/DeliveryPage-D90FTjYq.js +1 -0
  36. package/dist/assets/web/dist/assets/HomePage-VLTFopnl.js +2 -0
  37. package/dist/assets/web/dist/assets/InputMenu-lQP3ia9D.js +1 -0
  38. package/dist/assets/web/dist/assets/NotFoundPage-8ViskpN3.js +1 -0
  39. package/dist/assets/web/dist/assets/PendingTurnRow-D2gHef5v.js +1 -0
  40. package/dist/assets/web/dist/assets/ResidentDetailPage-nWLN8BOd.js +1 -0
  41. package/dist/assets/web/dist/assets/ResidentsIndexPage-D3Q48CJW.js +1 -0
  42. package/dist/assets/web/dist/assets/RunFoldRow-CHy_IfZG.js +1 -0
  43. package/dist/assets/web/dist/assets/RunRoutePage-C6kX5om4.js +9 -0
  44. package/dist/assets/web/dist/assets/RunsIndexPage-DjxGj1Q5.js +1 -0
  45. package/dist/assets/web/dist/assets/RunsTabs-WyeG5tKb.js +1 -0
  46. package/dist/assets/web/dist/assets/ScheduledPage-B8D5AU4d.js +1 -0
  47. package/dist/assets/web/dist/assets/SettingSelect-UTHsqUUS.js +1 -0
  48. package/dist/assets/web/dist/assets/SettingsPage-BoW7Zjzt.js +1 -0
  49. package/dist/assets/web/dist/assets/StatusDot-BGHureCJ.js +1 -0
  50. package/dist/assets/web/dist/assets/Tooltip-CiP8qPd7.js +1 -0
  51. package/dist/assets/web/dist/assets/UnitRoutePage-2zEeRBP1.js +1 -0
  52. package/dist/assets/web/dist/assets/{angular-html-oBNfPJR0.js → angular-html-qXhb9ti8.js} +1 -1
  53. package/dist/assets/web/dist/assets/{angular-ts-BvNwsyWA.js → angular-ts-DzvdyoUZ.js} +1 -1
  54. package/dist/assets/web/dist/assets/{apl-CNUdRlYf.js → apl-Ck7Ru2Sm.js} +1 -1
  55. package/dist/assets/web/dist/assets/{astro-Zb0NriSe.js → astro-CwehvReb.js} +1 -1
  56. package/dist/assets/web/dist/assets/{blade-qPRVheqq.js → blade-WSyVbSFK.js} +1 -1
  57. package/dist/assets/web/dist/assets/{c-D8Awx4YO.js → c-DMHI1wDz.js} +1 -1
  58. package/dist/assets/web/dist/assets/{chapel-Bt72Mhsx.js → chapel-BF8AYK8_.js} +1 -1
  59. package/dist/assets/web/dist/assets/{cobol-BOBacexg.js → cobol-UAfImuWu.js} +1 -1
  60. package/dist/assets/web/dist/assets/{coffee-E4u0liHW.js → coffee-D54hi96d.js} +1 -1
  61. package/dist/assets/web/dist/assets/{cpp-q2sLNlul.js → cpp-BRWfLgBc.js} +1 -1
  62. package/dist/assets/web/dist/assets/{crystal-DyWqUnlb.js → crystal-CSqC5deT.js} +1 -1
  63. package/dist/assets/web/dist/assets/{css-CQY0hFsD.js → css-D4ZuRFGk.js} +1 -1
  64. package/dist/assets/web/dist/assets/{dist-twkFmSUY.js → dist-73ZMn_Mg.js} +2 -2
  65. package/dist/assets/web/dist/assets/{durationTone-BobbycC-.js → durationTone-D51enaGR.js} +1 -1
  66. package/dist/assets/web/dist/assets/{edge-C1MwhJkX.js → edge-DDPtNbZc.js} +1 -1
  67. package/dist/assets/web/dist/assets/{elixir-Bb3YbHfn.js → elixir-BTQkQfsJ.js} +1 -1
  68. package/dist/assets/web/dist/assets/{elm-DAN9IGQw.js → elm-B_PkLzGZ.js} +1 -1
  69. package/dist/assets/web/dist/assets/{erb-BEB8Xlsj.js → erb-DfjIMVM_.js} +1 -1
  70. package/dist/assets/web/dist/assets/{eventSource-tRprhqm7.js → eventSource-By0B_w4S.js} +1 -1
  71. package/dist/assets/web/dist/assets/{git-rebase-tqpjRfxO.js → git-rebase-DP8wmn7K.js} +1 -1
  72. package/dist/assets/web/dist/assets/{glimmer-js-Ccbo65zR.js → glimmer-js-G12VK2gK.js} +1 -1
  73. package/dist/assets/web/dist/assets/{glimmer-ts-B6WBVMpE.js → glimmer-ts-D3XiSI8E.js} +1 -1
  74. package/dist/assets/web/dist/assets/{glsl-tRec3Fcu.js → glsl-DOKAhMj-.js} +1 -1
  75. package/dist/assets/web/dist/assets/{graphql-P8kbxT4F.js → graphql-CJB_fmON.js} +1 -1
  76. package/dist/assets/web/dist/assets/{hack-H9Zhkagy.js → hack-BHqtRWap.js} +1 -1
  77. package/dist/assets/web/dist/assets/{haml-DtEnpn7Z.js → haml-DwotyarS.js} +1 -1
  78. package/dist/assets/web/dist/assets/{handlebars-DkgPfoAz.js → handlebars-B6fDaA3U.js} +1 -1
  79. package/dist/assets/web/dist/assets/{html-derivative-DwozLrEx.js → html-derivative-C5bpQmmI.js} +1 -1
  80. package/dist/assets/web/dist/assets/{html-D30RXpIs.js → html-s52taj36.js} +1 -1
  81. package/dist/assets/web/dist/assets/{http-DXuzBAPm.js → http-99zC935r.js} +1 -1
  82. package/dist/assets/web/dist/assets/{hurl-d1UUJIt_.js → hurl-Bgk-4-0x.js} +1 -1
  83. package/dist/assets/web/dist/assets/{indexRow-B_s5tKyq.js → indexRow-BmK74Vp1.js} +1 -1
  84. package/dist/assets/web/dist/assets/{java-DL0gWf34.js → java-CuV_c5I0.js} +1 -1
  85. package/dist/assets/web/dist/assets/{javascript-Cl7vavnS.js → javascript-CZlOvSMQ.js} +1 -1
  86. package/dist/assets/web/dist/assets/{jinja-CfQOWMX9.js → jinja-BuXeZ4Tu.js} +1 -1
  87. package/dist/assets/web/dist/assets/{jison-KdYirlqm.js → jison-DIuP0hkG.js} +1 -1
  88. package/dist/assets/web/dist/assets/{json-C9cDQ-Qj.js → json-CZ74vfoD.js} +1 -1
  89. package/dist/assets/web/dist/assets/{jsx-CRx5NItd.js → jsx-BNjRs8Vj.js} +1 -1
  90. package/dist/assets/web/dist/assets/{julia-CmsQsZQl.js → julia-OCE-fFOg.js} +1 -1
  91. package/dist/assets/web/dist/assets/{just-CsM3Q8TE.js → just-CtvD87WF.js} +1 -1
  92. package/dist/assets/web/dist/assets/{latex-BXCh5YRX.js → latex-C3kf86OR.js} +1 -1
  93. package/dist/assets/web/dist/assets/{liquid-BF2vwK8p.js → liquid-B1WI--Kp.js} +1 -1
  94. package/dist/assets/web/dist/assets/{lua-DcMBATrl.js → lua-DtoT0gKg.js} +1 -1
  95. package/dist/assets/web/dist/assets/main-ClluP-Qf.js +28 -0
  96. package/dist/assets/web/dist/assets/main-CpkwzHX6.css +1 -0
  97. package/dist/assets/web/dist/assets/{marko-88MndKvG.js → marko-BE2MC6Yt.js} +1 -1
  98. package/dist/assets/web/dist/assets/{mdc-DJ4kVAd8.js → mdc-BwO4weXJ.js} +1 -1
  99. package/dist/assets/web/dist/assets/{nginx-CP6mRgtV.js → nginx-BTuOgGVC.js} +1 -1
  100. package/dist/assets/web/dist/assets/{nim-QQfj3fpF.js → nim-CiIUM-oV.js} +1 -1
  101. package/dist/assets/web/dist/assets/{org-Bke3eBzc.js → org-L78DEWB-.js} +1 -1
  102. package/dist/assets/web/dist/assets/{perl-Bkh0N7Kz.js → perl-KqHOm4Ft.js} +1 -1
  103. package/dist/assets/web/dist/assets/{php-Dnv1Piya.js → php-C41XbEkn.js} +1 -1
  104. package/dist/assets/web/dist/assets/{pug-D6peFFI7.js → pug-B12-4i-k.js} +1 -1
  105. package/dist/assets/web/dist/assets/{qml-D8PEs-C-.js → qml--fw2Up5c.js} +1 -1
  106. package/dist/assets/web/dist/assets/{r-B1EL9b_j.js → r-Db1JBXrC.js} +1 -1
  107. package/dist/assets/web/dist/assets/{razor-BsMTIh2b.js → razor-BYpVBgbu.js} +1 -1
  108. package/dist/assets/web/dist/assets/{regexp-HhvC8spD.js → regexp-BMqGLSPc.js} +1 -1
  109. package/dist/assets/web/dist/assets/{rst-D5paAxpg.js → rst-B63n7-Sa.js} +1 -1
  110. package/dist/assets/web/dist/assets/{ruby-BrQwhLrl.js → ruby-D3VI8UYv.js} +1 -1
  111. package/dist/assets/web/dist/assets/{sas-afot2B1o.js → sas-DxRf8ZAR.js} +1 -1
  112. package/dist/assets/web/dist/assets/{scss-Efm-mwuG.js → scss-DRRA6d6A.js} +1 -1
  113. package/dist/assets/web/dist/assets/seed-DFfT5S_N.js +6 -0
  114. package/dist/assets/web/dist/assets/{settingsApi-priOPiwu.js → settingsApi-Dm6eaQcu.js} +1 -1
  115. package/dist/assets/web/dist/assets/{shellscript-BK0Vv5fT.js → shellscript-CoOBe3_y.js} +1 -1
  116. package/dist/assets/web/dist/assets/{shellsession-BGqlMC7N.js → shellsession-DOV1HYxf.js} +1 -1
  117. package/dist/assets/web/dist/assets/{soy-M0b4UwGM.js → soy-Acpmpp1W.js} +1 -1
  118. package/dist/assets/web/dist/assets/{sql-sxe6IE9j.js → sql-DeT9N-fA.js} +1 -1
  119. package/dist/assets/web/dist/assets/{sseReplay-C9m_EB8J.js → sseReplay-DPXVxhL5.js} +5 -5
  120. package/dist/assets/web/dist/assets/{stata-nPF_ddLP.js → stata-CbxXAMO4.js} +1 -1
  121. package/dist/assets/web/dist/assets/{surrealql-D_GrC6u7.js → surrealql-BdKbi4hc.js} +1 -1
  122. package/dist/assets/web/dist/assets/{svelte-DwL1AtNP.js → svelte-tAcjDM7R.js} +1 -1
  123. package/dist/assets/web/dist/assets/{templ-7s7LTDkc.js → templ-CObINNJj.js} +1 -1
  124. package/dist/assets/web/dist/assets/{tex-Bx-5fMxe.js → tex-BYwpZT1J.js} +1 -1
  125. package/dist/assets/web/dist/assets/{ts-tags-DUMJnke_.js → ts-tags-BciREL5R.js} +1 -1
  126. package/dist/assets/web/dist/assets/{tsx-BN8biPDe.js → tsx-CRiv3Pr3.js} +1 -1
  127. package/dist/assets/web/dist/assets/{twig-8nIu84TN.js → twig-DuZZ1Ej0.js} +1 -1
  128. package/dist/assets/web/dist/assets/{typescript-BooSPq_S.js → typescript-jkHz_5HZ.js} +1 -1
  129. package/dist/assets/web/dist/assets/{typst-CTBiBsem.js → typst-DOac4Gal.js} +1 -1
  130. package/dist/assets/web/dist/assets/{vue-C6Ft4Lea.js → vue-CgOX5wXA.js} +1 -1
  131. package/dist/assets/web/dist/assets/{vue-html-Ba36dD5D.js → vue-html-Duu99VNw.js} +1 -1
  132. package/dist/assets/web/dist/assets/{vue-vine-NkFexVo2.js → vue-vine-Bmj_wvRJ.js} +1 -1
  133. package/dist/assets/web/dist/assets/wallClock-DD_fPuSY.js +1 -0
  134. package/dist/assets/web/dist/assets/{xml-C_THnHXZ.js → xml-BtUIVeWH.js} +1 -1
  135. package/dist/assets/web/dist/assets/{xsl-D8G5xqjY.js → xsl-wX71n1E5.js} +1 -1
  136. package/dist/assets/web/dist/assets/{yaml-jAMIJzge.js → yaml-CdLdXvmz.js} +1 -1
  137. package/dist/cli.js +4330 -1256
  138. package/package.json +1 -1
  139. package/dist/assets/web/dist/assets/AppShell-IDMGG6yi.js +0 -1
  140. package/dist/assets/web/dist/assets/CostsPage-CwXOmkeQ.js +0 -2
  141. package/dist/assets/web/dist/assets/DeliveryPage-n1tz5I_v.js +0 -1
  142. package/dist/assets/web/dist/assets/HomePage-PRxjQiGG.js +0 -2
  143. package/dist/assets/web/dist/assets/NotFoundPage-C97EhJcQ.js +0 -1
  144. package/dist/assets/web/dist/assets/PendingTurnRow-BT9RhFZ7.js +0 -1
  145. package/dist/assets/web/dist/assets/ResidentDetailPage-DACalNVF.js +0 -1
  146. package/dist/assets/web/dist/assets/ResidentsIndexPage-SHPdu6uZ.js +0 -1
  147. package/dist/assets/web/dist/assets/RunFoldRow-0SdOmOr5.js +0 -1
  148. package/dist/assets/web/dist/assets/RunRoutePage-BaFS2p8I.js +0 -9
  149. package/dist/assets/web/dist/assets/RunsIndexPage-DYI-iALj.js +0 -1
  150. package/dist/assets/web/dist/assets/RunsTabs-BUfdk0lH.js +0 -1
  151. package/dist/assets/web/dist/assets/ScheduledPage-DJ8HiCPt.js +0 -1
  152. package/dist/assets/web/dist/assets/SettingsPage-DLiN5IgY.js +0 -1
  153. package/dist/assets/web/dist/assets/StatusDot-Dw0T1M-P.js +0 -1
  154. package/dist/assets/web/dist/assets/Tooltip-BbLuIAiS.js +0 -1
  155. package/dist/assets/web/dist/assets/UnitRoutePage-DicUG96U.js +0 -1
  156. package/dist/assets/web/dist/assets/main-B4kEF3Sg.css +0 -1
  157. package/dist/assets/web/dist/assets/main-d-w-tIKt.js +0 -28
  158. package/dist/assets/web/dist/assets/seed-DeKSHrt2.js +0 -6
  159. package/dist/assets/web/dist/assets/wallClock-61NpVkY6.js +0 -1
@@ -186,6 +186,22 @@ export function killStaleBuildProcessesCommand(user: string, dir: string): strin
186
186
  * failure however it died. */
187
187
  const INTERRUPTION_SIGNATURE = /\bexit 143\b|Session terminated|SIGTERM|^restore-interrupted:/;
188
188
 
189
+ /** The wordings git gives when the MIRROR itself is broken: its `origin`
190
+ * remote gone from `config`, the repository not a repository, an object store
191
+ * with bad, corrupt or unreadable objects, a local file it cannot open. None
192
+ * of these is GitHub's doing, and none is cured by waiting for GitHub. */
193
+ const MIRROR_FAILURE_WORDING =
194
+ /'origin' does not appear to be a git repository|not a git repository|\bbad object\b|\bcorrupt\b|unable to read (?:tree|object|commit|blob)|object file .* is empty|cannot open \.git\/|unable to open object|missing object/i;
195
+
196
+ /** Whether a failed mirror fetch failed on the mirror (the resident's own
197
+ * disk — item 67 counts it) rather than on GitHub (`github-unreachable`, a
198
+ * serviceable reason that parks on repeat, item 16b). GitHub is the default:
199
+ * a message names the mirror only through the wordings above, so an unknown
200
+ * failure keeps the reading it always had. */
201
+ export function fetchFailureIsMirrors(message: string): boolean {
202
+ return MIRROR_FAILURE_WORDING.test(message);
203
+ }
204
+
189
205
  /** Message wording of the Sandbox SDK's runtime-replacement error family — the
190
206
  * container went away UNDER a live SDK call, so the failure never reaches the
191
207
  * shell-kill signature above: a step that dies this way surfaces as
@@ -225,14 +241,17 @@ const INTERRUPTION_SIGNATURE = /\bexit 143\b|Session terminated|SIGTERM|^restore
225
241
  export const RUNTIME_MOVED_WORDING =
226
242
  /previous runtime incarnation|interrupted because the runtime changed|runtime identity is no longer active|sandbox lifetime is no longer current|platform was updating the sandbox runtime|no longer identifies pid/i;
227
243
  /** The platform's words for a container that is down under a command (see
228
- * `RUNTIME_MOVED_WORDING`): the spawn refusal of a stopped container and the
229
- * binding's not-running refusal, anchored to the full phrase so a genuine
244
+ * `RUNTIME_MOVED_WORDING`): the spawn refusal of a stopped container, the
245
+ * binding's not-running refusal, and the SDK's "The container just exited"
246
+ * for a container that died under a live exec (a roll landing mid-step; the
247
+ * bot side reads the same words as a roll, residentWake's
248
+ * CONTAINER_GONE_WORDING), each anchored to the full phrase so a genuine
230
249
  * crash ("container exited with unexpected exit code") and the readiness
231
250
  * probe ("the container is not listening") never match. The harness's
232
251
  * container seam reads the same two as a container down under its one more
233
252
  * command — a wait, never a judgement (harness.md item 6). */
234
253
  export const STOPPED_CONTAINER_WORDING =
235
- /process supervisor is closed|container is not running, consider calling start/i;
254
+ /process supervisor is closed|container is not running, consider calling start|the container just exited/i;
236
255
  export const RUNTIME_REPLACEMENT_WORDING = new RegExp(
237
256
  `${RUNTIME_MOVED_WORDING.source}|${STOPPED_CONTAINER_WORDING.source}`,
238
257
  "i",
@@ -339,10 +358,30 @@ export const WAKE_PORT_READY_MS = 3 * 60_000;
339
358
  * SDK by a test. */
340
359
  export const SDK_RUNTIME_RECORD_KEY = "currentRuntimeIdentity";
341
360
 
342
- /** The DOMException the SDK's connect abort raises: `AbortError`, message
343
- * `The operation was aborted`. Anchored on the whole sentence so a command's
344
- * own `Aborted (core dumped)` never matches. */
345
- export const RUNTIME_UNREACHABLE_WORDING = /\bThe operation was aborted\b/;
361
+ /** The DOMException the SDK's connect abort raises — `fetchUpgradeAttempt`
362
+ * calls `controller.abort()` with no reason when `DEFAULT_CONNECT_TIMEOUT_MS`
363
+ * passes, so the runtime's own `AbortError` with the message exactly `The
364
+ * operation was aborted`. Anchored on the WHOLE message: a command's own
365
+ * `Aborted (core dumped)` never matches, and neither does a `TimeoutError`'s
366
+ * `The operation was aborted due to timeout` — the text `AbortSignal.timeout`
367
+ * raises, a route's own bound on a slow GitHub, not a silent runtime. A
368
+ * wrapper is read by its `cause`, where the DOMException rides whole; a
369
+ * wrapper that only pasted the sentence into a longer message is not the
370
+ * signal. */
371
+ export const RUNTIME_UNREACHABLE_WORDING = /^The operation was aborted\.?$/;
372
+
373
+ /** `err` and its `cause` chain, bounded like the SDK's own `selfAndCauses`
374
+ * walker: the SDK wraps platform errors, so the telling message can sit one or
375
+ * two links down. The one walker for every reader of a throw's chain — the
376
+ * resident Worker's classifiers and its thread-error builders, the sandbox
377
+ * Worker's — so the depth bound and the shape are decided once. */
378
+ export function* selfAndCauses(err: unknown): Generator<unknown> {
379
+ let current = err;
380
+ for (let depth = 0; depth < 8 && current != null; depth++) {
381
+ yield current;
382
+ current = typeof current === "object" ? (current as { cause?: unknown }).cause : undefined;
383
+ }
384
+ }
346
385
 
347
386
  /** Is this one link of an error's cause chain the SDK's connect abort? By
348
387
  * name first (the DOMException's `AbortError`), by the DOMException's message
@@ -38,7 +38,12 @@ export function residentErrorText(text: string): string {
38
38
  return redactAndCap(stripAnsi(text), RESIDENT_ERROR_CAP);
39
39
  }
40
40
 
41
- const SANITIZED_FIELDS = ["error", "reason", "summary"] as const;
41
+ /** The free-text fields a resident body carries: `error` (the reply), `reason`
42
+ * (the answer's own word or a lifecycle reason), `stateReason` (the lifecycle
43
+ * reason beside `state` on a thread route's 503 — the same remote text
44
+ * `reason` used to carry there, item 62), `summary`. A field added to a
45
+ * resident answer that carries remote output is added HERE first. */
46
+ const SANITIZED_FIELDS = ["error", "reason", "stateReason", "summary"] as const;
42
47
 
43
48
  /** How deep the sanitizer descends. The deepest resident shape today is
44
49
  * `/residents` → `residents[]` → `live` → `reason` (depth 3); the bound exists
@@ -48,8 +53,8 @@ const SANITIZE_DEPTH = 4;
48
53
  /** A parsed resident body with its free-text fields made safe, at every level:
49
54
  * `/residents` nests each resident's `state`/`reason` (or an `error`) under
50
55
  * `residents[].live`, and `repo list` renders those. In each plain object only
51
- * `error`, `reason` and `summary` are touched (when strings) — `error` at the
52
- * reply-sized cap, the other two at the card-sized one; `stderr` is
56
+ * `error`, `reason`, `stateReason` and `summary` are touched (when strings) —
57
+ * `error` at the reply-sized cap, the others at the card-sized one; `stderr` is
53
58
  * rewritten only when it mirrors `error` (the thread routes' failure shape
54
59
  * copies the error into stderr). Every other field — `needs`, `state`,
55
60
  * `stdout`, `status`, bindings, numbers — passes through untouched. Arrays are
@@ -238,6 +238,9 @@ export interface McpServerView {
238
238
  promotedFromName?: string;
239
239
  /** A user row's owner (the id after `user:` in `scopeKey`) as a display name, when the lookup answered. */
240
240
  ownerName?: string;
241
+ /** A channel row's channel (the id after `channel:` in `scopeKey`) as its name without the hash,
242
+ * when the lookup answered. */
243
+ channelName?: string;
241
244
  /** A higher tier holds this name, so runs use that entry and this one is idle (`mcpServersFor`'s
242
245
  * `shadowedBy`, the winning scope key — `org`, or `channel:<id>`); absent when this entry serves. */
243
246
  shadowedBy?: string;