@coreplane/switchboard 1.240.0 → 1.241.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 (125) hide show
  1. package/dist/assets/config/config.example.yaml +26 -7
  2. package/dist/assets/deploy/cloudflare/worker.ts +77 -18
  3. package/dist/assets/deploy/cloudflare-resident/worker.ts +1 -0
  4. package/dist/assets/deploy/secrets.manifest.json +6 -0
  5. package/dist/assets/package-lock.json +3 -3
  6. package/dist/assets/package.json +1 -1
  7. package/dist/assets/source.json +3 -3
  8. package/dist/assets/src/agents/registry.ts +27 -8
  9. package/dist/assets/src/core/authz/actor.ts +5 -0
  10. package/dist/assets/src/core/authz/grants.ts +20 -9
  11. package/dist/assets/src/core/coordinator/contract.ts +37 -0
  12. package/dist/assets/src/core/coordinator/driver.ts +17 -1
  13. package/dist/assets/src/core/coordinator/instancesRoute.ts +72 -0
  14. package/dist/assets/src/core/costs.ts +10 -5
  15. package/dist/assets/src/core/ship/coordinator.ts +22 -7
  16. package/dist/assets/src/core/trace/attrs.ts +1 -1
  17. package/dist/assets/src/execution/bindingPurge.ts +2 -2
  18. package/dist/assets/web/dist/.vite/manifest.json +422 -420
  19. package/dist/assets/web/dist/assets/AppShell-DEy5jRuS.js +1 -0
  20. package/dist/assets/web/dist/assets/{CostsPage-BD3w5j_S.js → CostsPage-BuHD-Bv7.js} +2 -2
  21. package/dist/assets/web/dist/assets/{DeliveryPage-BtvzKA1m.js → DeliveryPage-BGpPr5xr.js} +1 -1
  22. package/dist/assets/web/dist/assets/HomePage-dKBvWh-E.js +2 -0
  23. package/dist/assets/web/dist/assets/{NotFoundPage-DwOX1HaZ.js → NotFoundPage-DtmQM2gD.js} +1 -1
  24. package/dist/assets/web/dist/assets/PendingTurnRow-CrEAWx5b.js +1 -0
  25. package/dist/assets/web/dist/assets/{ResidentDetailPage-CUAOh5d9.js → ResidentDetailPage-C-48fxat.js} +1 -1
  26. package/dist/assets/web/dist/assets/{ResidentsIndexPage-B3KUlYy2.js → ResidentsIndexPage-CBBIjPOa.js} +1 -1
  27. package/dist/assets/web/dist/assets/RunFoldRow-B6vxjcBI.js +1 -0
  28. package/dist/assets/web/dist/assets/RunRoutePage-CQjd3Cz-.js +6 -0
  29. package/dist/assets/web/dist/assets/RunsIndexPage-Cy9G6D0p.js +1 -0
  30. package/dist/assets/web/dist/assets/{RunsTabs-BnkvCBrM.js → RunsTabs-CtNGNnhN.js} +1 -1
  31. package/dist/assets/web/dist/assets/{ScheduledPage-C1y9jgAk.js → ScheduledPage-Ci1Ygqnc.js} +1 -1
  32. package/dist/assets/web/dist/assets/SettingsPage-DxmJvAmT.js +1 -0
  33. package/dist/assets/web/dist/assets/{StatusDot-CiByEtoR.js → StatusDot-DPWE1JmO.js} +1 -1
  34. package/dist/assets/web/dist/assets/{Tooltip-DyRxk8A8.js → Tooltip-DKhSRH9t.js} +1 -1
  35. package/dist/assets/web/dist/assets/{UnitRoutePage-CnWyOizV.js → UnitRoutePage-DEN5bSQf.js} +1 -1
  36. package/dist/assets/web/dist/assets/{angular-html-DAQ_1T1v.js → angular-html-DgSK1qvr.js} +1 -1
  37. package/dist/assets/web/dist/assets/{angular-ts-D4kxRVp1.js → angular-ts-D3gNdiSG.js} +1 -1
  38. package/dist/assets/web/dist/assets/{apl-Dy07l64y.js → apl-CkHCYM8I.js} +1 -1
  39. package/dist/assets/web/dist/assets/{astro-DZIbTlc7.js → astro-DLm45axt.js} +1 -1
  40. package/dist/assets/web/dist/assets/{blade-CmSXWX3l.js → blade-BKa-VE-c.js} +1 -1
  41. package/dist/assets/web/dist/assets/{c-ggzVdJLK.js → c-C8NCNWai.js} +1 -1
  42. package/dist/assets/web/dist/assets/{chapel-Bo1wktsG.js → chapel-DqDQ7IKH.js} +1 -1
  43. package/dist/assets/web/dist/assets/{cobol-DJUmtKM2.js → cobol-j4vCD6AJ.js} +1 -1
  44. package/dist/assets/web/dist/assets/{coffee-BZWOVz4C.js → coffee-C6oDVH-0.js} +1 -1
  45. package/dist/assets/web/dist/assets/{cpp-Dtk39yMw.js → cpp-Bd3A1Rtc.js} +1 -1
  46. package/dist/assets/web/dist/assets/{crystal-CGf_-Zoj.js → crystal-CUOgOw0d.js} +1 -1
  47. package/dist/assets/web/dist/assets/{css-CX2fcL4u.js → css-RYljyv7G.js} +1 -1
  48. package/dist/assets/web/dist/assets/{dist-D8TaC961.js → dist-BnJXKHCY.js} +2 -2
  49. package/dist/assets/web/dist/assets/{edge-BYS8FtgQ.js → edge-BJhNdQDc.js} +1 -1
  50. package/dist/assets/web/dist/assets/{elixir-fhUpi3nO.js → elixir-g1AWOAfT.js} +1 -1
  51. package/dist/assets/web/dist/assets/{elm-DAQNiwsN.js → elm-CER5e4Dz.js} +1 -1
  52. package/dist/assets/web/dist/assets/{erb-CWzEys6U.js → erb-D5aOmMQf.js} +1 -1
  53. package/dist/assets/web/dist/assets/{git-rebase-9rY3p-Rw.js → git-rebase-D6rfV8jp.js} +1 -1
  54. package/dist/assets/web/dist/assets/{glimmer-js-tY7hy0nE.js → glimmer-js-BvDH3-mC.js} +1 -1
  55. package/dist/assets/web/dist/assets/{glimmer-ts-CTrLv5JF.js → glimmer-ts-DChtNs9V.js} +1 -1
  56. package/dist/assets/web/dist/assets/{glsl-BRJbiDfq.js → glsl-BHlsWrxf.js} +1 -1
  57. package/dist/assets/web/dist/assets/{graphql-B-MtVLh2.js → graphql-BsaBHb53.js} +1 -1
  58. package/dist/assets/web/dist/assets/{hack-BtIkOypQ.js → hack-0lbDosCd.js} +1 -1
  59. package/dist/assets/web/dist/assets/{haml-CoOH6gfa.js → haml-BKtco2vr.js} +1 -1
  60. package/dist/assets/web/dist/assets/{handlebars-DgrRu-GP.js → handlebars-BE_cj04z.js} +1 -1
  61. package/dist/assets/web/dist/assets/{html-DZaaI7ca.js → html-BNcr8EVd.js} +1 -1
  62. package/dist/assets/web/dist/assets/{html-derivative-DgHvT-qZ.js → html-derivative-BsJt2Kei.js} +1 -1
  63. package/dist/assets/web/dist/assets/{http-CvAd51yz.js → http-BR5P8ER_.js} +1 -1
  64. package/dist/assets/web/dist/assets/{hurl-CXGqAfzx.js → hurl-CtHalpWS.js} +1 -1
  65. package/dist/assets/web/dist/assets/{indexRow-Cse3JGb0.js → indexRow-BD1VT8o8.js} +1 -1
  66. package/dist/assets/web/dist/assets/{java-CIQStIXF.js → java-BXVdhN11.js} +1 -1
  67. package/dist/assets/web/dist/assets/{javascript-WbH8s7E3.js → javascript-CyoShgNQ.js} +1 -1
  68. package/dist/assets/web/dist/assets/{jinja-DzyWEVKC.js → jinja-BQYZzHex.js} +1 -1
  69. package/dist/assets/web/dist/assets/{jison-CrT-zCa-.js → jison-DqrUa1Eq.js} +1 -1
  70. package/dist/assets/web/dist/assets/{json-lHjpjXMQ.js → json-CQiTF9Jj.js} +1 -1
  71. package/dist/assets/web/dist/assets/{jsx-WTwYCHW6.js → jsx-Y16MkCYQ.js} +1 -1
  72. package/dist/assets/web/dist/assets/{julia-Bqpk9H7E.js → julia-zn16YONe.js} +1 -1
  73. package/dist/assets/web/dist/assets/{just-LdXk1r3m.js → just-DcVeN_MN.js} +1 -1
  74. package/dist/assets/web/dist/assets/{latex-h_y2A5KD.js → latex-BNNoF-WP.js} +1 -1
  75. package/dist/assets/web/dist/assets/{liquid-CY7bF2_p.js → liquid-DAi6qHzn.js} +1 -1
  76. package/dist/assets/web/dist/assets/{lua-oQ7XVZOY.js → lua-BswS0axw.js} +1 -1
  77. package/dist/assets/web/dist/assets/{main-CGO6fQ8k.js → main-B3is4sk6.js} +2 -2
  78. package/dist/assets/web/dist/assets/main-DP_zSemY.css +1 -0
  79. package/dist/assets/web/dist/assets/{marko-zv_qZ4QV.js → marko-C-4hkmQZ.js} +1 -1
  80. package/dist/assets/web/dist/assets/{mdc-Dl4kL_YK.js → mdc-0ZaHUkS7.js} +1 -1
  81. package/dist/assets/web/dist/assets/{nginx-CAHCZj4F.js → nginx-DBDg5tOR.js} +1 -1
  82. package/dist/assets/web/dist/assets/{nim-BOtmwCJH.js → nim-BVMz49Yw.js} +1 -1
  83. package/dist/assets/web/dist/assets/{org-DspQk3HQ.js → org-1hO_K6ya.js} +1 -1
  84. package/dist/assets/web/dist/assets/{perl-CAXmvVl0.js → perl-CVRQLvVk.js} +1 -1
  85. package/dist/assets/web/dist/assets/{php-CMUx4VyM.js → php-K9nCrB9n.js} +1 -1
  86. package/dist/assets/web/dist/assets/{pug-B55xVJTv.js → pug-CTxOcmO3.js} +1 -1
  87. package/dist/assets/web/dist/assets/{qml-DsNKCCRk.js → qml-CmCkfG5q.js} +1 -1
  88. package/dist/assets/web/dist/assets/{r-DbhP0VvO.js → r-pP47Xn1X.js} +1 -1
  89. package/dist/assets/web/dist/assets/{razor-BCpE6P-p.js → razor-BpW6r3tC.js} +1 -1
  90. package/dist/assets/web/dist/assets/{regexp-BllsjiN4.js → regexp-CINgdY4N.js} +1 -1
  91. package/dist/assets/web/dist/assets/{rst-CO5Rpq9V.js → rst-BZIUEq2Q.js} +1 -1
  92. package/dist/assets/web/dist/assets/{ruby-C2A4OgQq.js → ruby-nzAOxz6r.js} +1 -1
  93. package/dist/assets/web/dist/assets/{sas-Butzoyql.js → sas-QIS1bFth.js} +1 -1
  94. package/dist/assets/web/dist/assets/{scss-PEUwJBpf.js → scss-BuhBBVNt.js} +1 -1
  95. package/dist/assets/web/dist/assets/{shellscript-3Yhq0khE.js → shellscript-CQc1vXbk.js} +1 -1
  96. package/dist/assets/web/dist/assets/{shellsession-04Hkb7m3.js → shellsession-CoubCAUv.js} +1 -1
  97. package/dist/assets/web/dist/assets/{soy-BnId73cP.js → soy-CPRzlder.js} +1 -1
  98. package/dist/assets/web/dist/assets/{sql-BKwdc0ch.js → sql-W9krb8-9.js} +1 -1
  99. package/dist/assets/web/dist/assets/{sseReplay-DutHNghE.js → sseReplay-yji8a1wM.js} +1 -1
  100. package/dist/assets/web/dist/assets/{stata-BPPtNkay.js → stata-CuISJEC0.js} +1 -1
  101. package/dist/assets/web/dist/assets/{surrealql-CDPChcYP.js → surrealql-CSet7584.js} +1 -1
  102. package/dist/assets/web/dist/assets/{svelte-B15DIQ-z.js → svelte-ChXTSYwK.js} +1 -1
  103. package/dist/assets/web/dist/assets/{templ-D-rp_AiB.js → templ-Bm55v62k.js} +1 -1
  104. package/dist/assets/web/dist/assets/{tex-BnVDCD7p.js → tex-CICMX8Gj.js} +1 -1
  105. package/dist/assets/web/dist/assets/{ts-tags-cpujdyAR.js → ts-tags-CA1UzWyB.js} +1 -1
  106. package/dist/assets/web/dist/assets/{tsx-D1vO4L72.js → tsx-Dy04HNbv.js} +1 -1
  107. package/dist/assets/web/dist/assets/{twig-oQGnQGRc.js → twig-BBHsVnVD.js} +1 -1
  108. package/dist/assets/web/dist/assets/{typescript-CKSFpXiH.js → typescript-Dvc-wVBT.js} +1 -1
  109. package/dist/assets/web/dist/assets/{typst-DKHFo8BF.js → typst-Dvlqx3_q.js} +1 -1
  110. package/dist/assets/web/dist/assets/{vue-html-DpCp0_Sz.js → vue-html-D4YxT3An.js} +1 -1
  111. package/dist/assets/web/dist/assets/{vue-vine-y5d5wUb1.js → vue-vine-0YE7uQlH.js} +1 -1
  112. package/dist/assets/web/dist/assets/{vue-BstokpiS.js → vue-zWi1MNU2.js} +1 -1
  113. package/dist/assets/web/dist/assets/{xml-Br2hx5Ax.js → xml-gm-iksZB.js} +1 -1
  114. package/dist/assets/web/dist/assets/{xsl-Bc8Cobap.js → xsl-D_W5BcrY.js} +1 -1
  115. package/dist/assets/web/dist/assets/{yaml-LOITy_I1.js → yaml-CHmZ21wZ.js} +1 -1
  116. package/dist/cli.js +3411 -502
  117. package/package.json +1 -1
  118. package/dist/assets/web/dist/assets/AppShell-CM_fh-WW.js +0 -1
  119. package/dist/assets/web/dist/assets/HomePage-BU6aRCSe.js +0 -2
  120. package/dist/assets/web/dist/assets/RunFoldRow-Dulcbg25.js +0 -1
  121. package/dist/assets/web/dist/assets/RunRoutePage-DGoGrQZq.js +0 -6
  122. package/dist/assets/web/dist/assets/RunsIndexPage-37W7OZbC.js +0 -1
  123. package/dist/assets/web/dist/assets/SettingsPage-ggfB-Rqr.js +0 -1
  124. package/dist/assets/web/dist/assets/Slideover-CX-LEklF.js +0 -1
  125. package/dist/assets/web/dist/assets/main-O8UXRuEv.css +0 -1
@@ -448,6 +448,8 @@ export type CoordinatorAction =
448
448
  recover?: { runId: string };
449
449
  }
450
450
  | { type: "merge"; step: string; prNumber: number; headSha: string }
451
+ /** Wait for the intake's checks-settled event at the approved head, bounded as the fallback. */
452
+ | { type: "wait-checks"; step: string; headSha: string; timeoutMs: number }
451
453
  | { type: "sleep"; step: string; ms: number }
452
454
  | { type: "end"; step: string; ending: UnitEnding };
453
455
 
@@ -508,6 +510,7 @@ export type StepReturn =
508
510
  // fired, or a person merged — so the runner merged nothing (`by: other`).
509
511
  | { type: "merge"; step: string; outcome: "merged"; by: "other"; sha: string; mergedAt: string; at: number }
510
512
  | { type: "merge"; step: string; outcome: "pending" | "refused"; reason: string; at: number }
513
+ | { type: "wait-checks"; step: string; outcome: "event" | "timeout" }
511
514
  | { type: "sleep"; step: string };
512
515
 
513
516
  /** How one unit's pipeline ended — the truthful vocabulary the ship pipeline
@@ -628,7 +631,7 @@ type Phase =
628
631
  dead?: "failed" | "interrupted";
629
632
  }
630
633
  | { at: "merge"; pr: PrRef; headSha: string; n: number; since: number }
631
- | { at: "merge-sleep"; pr: PrRef; headSha: string; n: number; since: number }
634
+ | { at: "merge-wait"; pr: PrRef; headSha: string; n: number; since: number }
632
635
  | { at: "ended" };
633
636
 
634
637
  export interface UnitPipelineState {
@@ -668,9 +671,16 @@ export const WAIT_MARGIN_MS = 5 * MIN;
668
671
  * margin and the merge poll are the same number), and it keeps a round to a
669
672
  * few steps: a coding child's 45 minutes are ten waits and ten reads. */
670
673
  export const WAIT_CHUNK_MS = 5 * MIN;
671
- /** How often the runner asks for the merge while the guards are still pending, and for how long at most. */
672
- export const MERGE_POLL_MS = 5 * MIN;
674
+ /** How long the merge step waits for the guards at most. While checks are
675
+ * pending the machine waits on the intake's `checks-settled-<head>` event
676
+ * (http-ingress.md item 12) — one bounded wait per ask, the remainder of this
677
+ * cap, as the fallback when the event never arrives. */
673
678
  export const MERGE_WAIT_MAX_MS = 60 * MIN;
679
+ /** One merge wait's fallback timeout: the old poll's cadence. The event wakes
680
+ * the machine at once when the intake delivers it; without one (the webhook
681
+ * not configured, a delivery lost) the door is still re-asked every chunk, so
682
+ * a merge is never slower than the poll it replaced. */
683
+ export const MERGE_WAIT_CHUNK_MS = 5 * MIN;
674
684
  /** A `busy` without the live run's id: nothing to wait on, so a short sleep before the spawn is asked again. */
675
685
  export const BUSY_RETRY_MS = 2 * MIN;
676
686
 
@@ -816,8 +826,13 @@ export function nextAction(s: UnitPipelineState): CoordinatorAction {
816
826
  };
817
827
  case "merge":
818
828
  return { type: "merge", step: `${unit}/merge/${p.n}`, prNumber: p.pr.number, headSha: p.headSha };
819
- case "merge-sleep":
820
- return { type: "sleep", step: `${unit}/merge/sleep/${p.n}`, ms: MERGE_POLL_MS };
829
+ case "merge-wait":
830
+ return {
831
+ type: "wait-checks",
832
+ step: `${unit}/merge/wait/${p.n}`,
833
+ headSha: p.headSha,
834
+ timeoutMs: Math.max(MIN, Math.min(MERGE_WAIT_CHUNK_MS, MERGE_WAIT_MAX_MS - (s.clock - p.since))),
835
+ };
821
836
  case "ended":
822
837
  return { type: "end", step: `${unit}/end`, ending: s.ending! };
823
838
  }
@@ -1349,11 +1364,11 @@ export function applyReturn(s: UnitPipelineState, ret: StepReturn): Transition {
1349
1364
  reviewRounds: s.reviewRounds,
1350
1365
  });
1351
1366
  return {
1352
- state: { ...clocked, phase: { at: "merge-sleep", pr: p.pr, headSha: p.headSha, n: p.n, since: p.since } },
1367
+ state: { ...clocked, phase: { at: "merge-wait", pr: p.pr, headSha: p.headSha, n: p.n, since: p.since } },
1353
1368
  notes: [],
1354
1369
  };
1355
1370
  }
1356
- case "merge-sleep":
1371
+ case "merge-wait":
1357
1372
  return {
1358
1373
  state: { ...s, phase: { at: "merge", pr: p.pr, headSha: p.headSha, n: p.n + 1, since: p.since } },
1359
1374
  notes: [],
@@ -8,7 +8,7 @@
8
8
  * field. */
9
9
 
10
10
  export type Backend = "local" | "resident" | "sandbox" | "e2b";
11
- export type Channel = "slack" | "http" | "mcp" | "cli";
11
+ export type Channel = "slack" | "http" | "mcp" | "cli" | "web";
12
12
 
13
13
  /** Every attribute key any span may carry, with its value domain. */
14
14
  export interface AttrDomain {
@@ -14,8 +14,8 @@ export interface PurgeableBinding {
14
14
  export type PurgeDecision = { ok: true; purge: string[]; keptLive: string[] } | { ok: false; error: string };
15
15
 
16
16
  /** Thread-key namespaces real channels mint (docs/reference/specs/http-ingress.md item 1,
17
- * slack, mcp, the CLI). A purge is for synthetic keys only. */
18
- const PRODUCTION_NAMESPACES = new Set(["slack", "http", "mcp", "cli"]);
17
+ * slack, mcp, the CLI, the web chat). A purge is for synthetic keys only. */
18
+ const PRODUCTION_NAMESPACES = new Set(["slack", "http", "mcp", "cli", "web"]);
19
19
 
20
20
  /** A prefix must be a whole namespace (`load:`) or longer (`load:r1:`), never
21
21
  * empty, never a bare partial namespace, never a production namespace. */