@coreplane/switchboard 1.260.3 → 1.260.5

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 (144) hide show
  1. package/dist/assets/deploy/cloudflare/package.json +2 -2
  2. package/dist/assets/deploy/cloudflare-docs/package.json +1 -1
  3. package/dist/assets/deploy/cloudflare-memory/package.json +2 -2
  4. package/dist/assets/deploy/cloudflare-memory/worker.ts +205 -8
  5. package/dist/assets/deploy/cloudflare-resident/Dockerfile +11 -2
  6. package/dist/assets/deploy/cloudflare-resident/package.json +2 -2
  7. package/dist/assets/deploy/cloudflare-resident/worker.ts +124 -40
  8. package/dist/assets/deploy/cloudflare-sandbox/package.json +2 -2
  9. package/dist/assets/package-lock.json +712 -97
  10. package/dist/assets/package.json +7 -6
  11. package/dist/assets/project.json +4 -0
  12. package/dist/assets/source.json +3 -3
  13. package/dist/assets/src/core/budgets.ts +5 -0
  14. package/dist/assets/src/core/coordinator/contract.ts +5 -0
  15. package/dist/assets/src/core/coordinator/driver.ts +118 -29
  16. package/dist/assets/src/core/pipelineStanding.ts +2 -0
  17. package/dist/assets/src/core/plane/decide.ts +19 -2
  18. package/dist/assets/src/core/provider.ts +380 -0
  19. package/dist/assets/src/core/refusal.ts +1 -0
  20. package/dist/assets/src/core/runEvents.ts +8 -0
  21. package/dist/assets/src/core/runFriction.ts +1 -1
  22. package/dist/assets/src/core/runLedger/types.ts +10 -1
  23. package/dist/assets/src/core/runRecord.ts +31 -0
  24. package/dist/assets/src/core/ship/contract.ts +3 -1
  25. package/dist/assets/src/core/ship/coordinator.ts +518 -56
  26. package/dist/assets/src/core/ship/renewal.ts +3 -1
  27. package/dist/assets/src/core/types.ts +6 -0
  28. package/dist/assets/src/execution/bashTimeout.ts +1 -1
  29. package/dist/assets/src/execution/residentRebind.ts +15 -0
  30. package/dist/assets/src/execution/residentReuse.ts +23 -2
  31. package/dist/assets/src/execution/sandboxErrors.ts +6 -6
  32. package/dist/assets/web/dist/.vite/manifest.json +505 -505
  33. package/dist/assets/web/dist/assets/{AppShell-CSXDCV4x.js → AppShell-DPJVhUGP.js} +1 -1
  34. package/dist/assets/web/dist/assets/{CostChart-DsuPS2g7.js → CostChart-4TeDdbvJ.js} +1 -1
  35. package/dist/assets/web/dist/assets/CostsPage-8HDgvuWB.js +1 -0
  36. package/dist/assets/web/dist/assets/{DeliveryPage-62qCSLvk.js → DeliveryPage-Cf1joUyA.js} +1 -1
  37. package/dist/assets/web/dist/assets/{HomePage-Dk3HRBc3.js → HomePage-DZEAnCCv.js} +1 -1
  38. package/dist/assets/web/dist/assets/{InputMenu-BdZXnibG.js → InputMenu-BRV35UWP.js} +1 -1
  39. package/dist/assets/web/dist/assets/{MetricsPage-o5fSaCTe.js → MetricsPage-BQBuIuYU.js} +1 -1
  40. package/dist/assets/web/dist/assets/{NotFoundPage-DHuWyjlq.js → NotFoundPage-CDjMfCcj.js} +1 -1
  41. package/dist/assets/web/dist/assets/{PendingTurnRow-CeTGOXUy.js → PendingTurnRow-4B8JwETU.js} +1 -1
  42. package/dist/assets/web/dist/assets/{PlanePage-RD0M6O6W.js → PlanePage-CHU2szQs.js} +1 -1
  43. package/dist/assets/web/dist/assets/{ResidentDetailPage-Dl2KId95.js → ResidentDetailPage-L5SRcN_O.js} +1 -1
  44. package/dist/assets/web/dist/assets/{ResidentsIndexPage-DBy43I1R.js → ResidentsIndexPage-BIFf8qyE.js} +1 -1
  45. package/dist/assets/web/dist/assets/RunFoldRow-DzPIshJx.js +1 -0
  46. package/dist/assets/web/dist/assets/{RunRoutePage-Du1HqLZs.js → RunRoutePage-Cru5IVux.js} +3 -3
  47. package/dist/assets/web/dist/assets/{RunsIndexPage-BZphy3Hr.js → RunsIndexPage-CBkdPAdj.js} +1 -1
  48. package/dist/assets/web/dist/assets/{RunsTabs-kHbbxVHx.js → RunsTabs-C7Ua3XX5.js} +1 -1
  49. package/dist/assets/web/dist/assets/{ScheduledPage-B7jh898t.js → ScheduledPage-D_R55BDk.js} +1 -1
  50. package/dist/assets/web/dist/assets/{SettingSelect-BfID5nF4.js → SettingSelect-CEeA4iuC.js} +1 -1
  51. package/dist/assets/web/dist/assets/{SettingsPage-3uLEsiiE.js → SettingsPage-DlmZvAvf.js} +1 -1
  52. package/dist/assets/web/dist/assets/{SilentTurn-CKxSxnQC.js → SilentTurn-PWMDMbMG.js} +1 -1
  53. package/dist/assets/web/dist/assets/{SlackMark-CtiHrNjr.js → SlackMark-DB0MGiF5.js} +1 -1
  54. package/dist/assets/web/dist/assets/{StatusDot-x7vcK0iE.js → StatusDot-Bq0mYMFo.js} +1 -1
  55. package/dist/assets/web/dist/assets/{Tooltip-wVXCWhMp.js → Tooltip-Bs6zd7yE.js} +1 -1
  56. package/dist/assets/web/dist/assets/{UnitRoutePage-V5BXK7FH.js → UnitRoutePage-BMGEZCvn.js} +1 -1
  57. package/dist/assets/web/dist/assets/{angular-html-C8b5YTHf.js → angular-html-BRRhsdQE.js} +1 -1
  58. package/dist/assets/web/dist/assets/{angular-ts-C3f4WYNe.js → angular-ts-BFj-mqCm.js} +1 -1
  59. package/dist/assets/web/dist/assets/{apl-DSHxUJc3.js → apl-CsBuy1IL.js} +1 -1
  60. package/dist/assets/web/dist/assets/{astro-BSGCCBP6.js → astro-cVaqxBZq.js} +1 -1
  61. package/dist/assets/web/dist/assets/{blade-DFeYrMKk.js → blade-MEP5mWha.js} +1 -1
  62. package/dist/assets/web/dist/assets/{browser-B6T5hjfR.js → browser-CCImen5O.js} +1 -1
  63. package/dist/assets/web/dist/assets/budgets-0szUBIMv.js +1 -0
  64. package/dist/assets/web/dist/assets/{c-L_QOnFVv.js → c-D4NGQ_Pd.js} +1 -1
  65. package/dist/assets/web/dist/assets/{chapel-DLQWUwhu.js → chapel-BkWImsIy.js} +1 -1
  66. package/dist/assets/web/dist/assets/{cobol-1DlMmrEO.js → cobol-RPDSPSET.js} +1 -1
  67. package/dist/assets/web/dist/assets/{coffee-BTB6os6N.js → coffee-DZ5z7oVX.js} +1 -1
  68. package/dist/assets/web/dist/assets/{cpp-BvJI2z3u.js → cpp-CrBtIaRZ.js} +1 -1
  69. package/dist/assets/web/dist/assets/{crystal-B11wGW_h.js → crystal-DJesYi6f.js} +1 -1
  70. package/dist/assets/web/dist/assets/{css-BiIWx5Pw.js → css-DO9mjau-.js} +1 -1
  71. package/dist/assets/web/dist/assets/{dist-C-XGnvM4.js → dist-EkKVbIM-.js} +12 -12
  72. package/dist/assets/web/dist/assets/{edge-nSglEXaD.js → edge-C3VzbSW0.js} +1 -1
  73. package/dist/assets/web/dist/assets/{elixir-x7o8qMl8.js → elixir-BkD_Vhfe.js} +1 -1
  74. package/dist/assets/web/dist/assets/{elm-DGrRyqTQ.js → elm-KIM0mFPk.js} +1 -1
  75. package/dist/assets/web/dist/assets/{erb--_dh58Nw.js → erb-D2ruCqb2.js} +1 -1
  76. package/dist/assets/web/dist/assets/{eventSource-Bj_dZf6M.js → eventSource-Cv0AFlMi.js} +1 -1
  77. package/dist/assets/web/dist/assets/{git-rebase-DbpUXwyg.js → git-rebase-CnfbQTxA.js} +1 -1
  78. package/dist/assets/web/dist/assets/{glimmer-js-BG0CuZG5.js → glimmer-js-CbiwFXWH.js} +1 -1
  79. package/dist/assets/web/dist/assets/{glimmer-ts-CQIl5qyR.js → glimmer-ts-DV8ii0Pv.js} +1 -1
  80. package/dist/assets/web/dist/assets/{glsl-9PJNQTcw.js → glsl-CgmznWkA.js} +1 -1
  81. package/dist/assets/web/dist/assets/{graphql-CzVTzjEI.js → graphql-BK-bBYfH.js} +1 -1
  82. package/dist/assets/web/dist/assets/{hack-BhCmAz3Q.js → hack-DnwTTP5n.js} +1 -1
  83. package/dist/assets/web/dist/assets/{haml-BmI12COR.js → haml-DAVJsWwT.js} +1 -1
  84. package/dist/assets/web/dist/assets/{handlebars-Cib-ISTS.js → handlebars-voOVfxFL.js} +1 -1
  85. package/dist/assets/web/dist/assets/{html-D3lDapvI.js → html-3FTqwaPk.js} +1 -1
  86. package/dist/assets/web/dist/assets/{html-derivative-DRPY8vOK.js → html-derivative-CSlhLDQn.js} +1 -1
  87. package/dist/assets/web/dist/assets/{http-B9VttK6m.js → http-Vx4ilPfS.js} +1 -1
  88. package/dist/assets/web/dist/assets/{hurl-C0saNJYj.js → hurl-DxyZDE3R.js} +1 -1
  89. package/dist/assets/web/dist/assets/{indexRow-Dxg7C8s9.js → indexRow-5s3hNzZ9.js} +1 -1
  90. package/dist/assets/web/dist/assets/{java-BCFbtYAj.js → java-nWqdjNJG.js} +1 -1
  91. package/dist/assets/web/dist/assets/{javascript-nwBjnrhh.js → javascript-Dr82HOwp.js} +1 -1
  92. package/dist/assets/web/dist/assets/{jinja-CMYO9byN.js → jinja-BhjLrPOt.js} +1 -1
  93. package/dist/assets/web/dist/assets/{jison-Cko8HnE_.js → jison-DilGIUa8.js} +1 -1
  94. package/dist/assets/web/dist/assets/{json-Dzv__YsX.js → json-CrOcvmhJ.js} +1 -1
  95. package/dist/assets/web/dist/assets/{jsx-CTFxagih.js → jsx-BW_RX-fo.js} +1 -1
  96. package/dist/assets/web/dist/assets/{julia-_Xvten1-.js → julia-CWH071DB.js} +1 -1
  97. package/dist/assets/web/dist/assets/{just-bLps4qOu.js → just-DkhhoWBy.js} +1 -1
  98. package/dist/assets/web/dist/assets/{latex-D6UaYsUP.js → latex-cuHJ4TUT.js} +1 -1
  99. package/dist/assets/web/dist/assets/{liquid-CoDIeULa.js → liquid-DG6afYQN.js} +1 -1
  100. package/dist/assets/web/dist/assets/{lua-D1KFRnVf.js → lua-C5CMnCPS.js} +1 -1
  101. package/dist/assets/web/dist/assets/{main-DAL--hyj.js → main-Disot0n_.js} +3 -3
  102. package/dist/assets/web/dist/assets/{marko-B5N5XcOw.js → marko-Dy2_DuC4.js} +1 -1
  103. package/dist/assets/web/dist/assets/{mdc-uxzjQO3q.js → mdc-BMKb_EeA.js} +1 -1
  104. package/dist/assets/web/dist/assets/{nginx-BMJxs2TK.js → nginx-og0RgMKf.js} +1 -1
  105. package/dist/assets/web/dist/assets/{nim-DqQ3-8p1.js → nim-CQxTQQP0.js} +1 -1
  106. package/dist/assets/web/dist/assets/{org-DsY6LK59.js → org-b5lkq_Pl.js} +1 -1
  107. package/dist/assets/web/dist/assets/{perl--pq9iJFp.js → perl-D9X5_i_J.js} +1 -1
  108. package/dist/assets/web/dist/assets/{php-RHCMbsM2.js → php-CwUxvLX0.js} +1 -1
  109. package/dist/assets/web/dist/assets/{pug-CFNq_FCp.js → pug-uOIOExr0.js} +1 -1
  110. package/dist/assets/web/dist/assets/{qml-C9Acx9E8.js → qml-g5RoADf-.js} +1 -1
  111. package/dist/assets/web/dist/assets/{r-DxlU8FBd.js → r-5LdAopD3.js} +1 -1
  112. package/dist/assets/web/dist/assets/{razor-CLJ2kKih.js → razor-DwrvFLYQ.js} +1 -1
  113. package/dist/assets/web/dist/assets/{regexp-CzmdGoEp.js → regexp-dGtAaxC-.js} +1 -1
  114. package/dist/assets/web/dist/assets/{rst-D9yuxBET.js → rst-wFdW0brr.js} +1 -1
  115. package/dist/assets/web/dist/assets/{ruby-CIRcEvnD.js → ruby-DPglN6I9.js} +1 -1
  116. package/dist/assets/web/dist/assets/{sas-LOl-uUPh.js → sas-CUbCs40d.js} +1 -1
  117. package/dist/assets/web/dist/assets/{scss-BX2_sZHY.js → scss-B-DUiI1c.js} +1 -1
  118. package/dist/assets/web/dist/assets/{shellscript-4d-QvKkY.js → shellscript-lGOV7Ram.js} +1 -1
  119. package/dist/assets/web/dist/assets/{shellsession-DhB16UGy.js → shellsession-BDWtAAjr.js} +1 -1
  120. package/dist/assets/web/dist/assets/{soy-Cm1xTUBr.js → soy-zod_dcOy.js} +1 -1
  121. package/dist/assets/web/dist/assets/{sql-BsfcBJdu.js → sql-BG0HSSoM.js} +1 -1
  122. package/dist/assets/web/dist/assets/{sseReplay-BqgOggyQ.js → sseReplay-9gcMpylx.js} +1 -1
  123. package/dist/assets/web/dist/assets/{stata-Dwat3BSw.js → stata-BVUMLp1W.js} +1 -1
  124. package/dist/assets/web/dist/assets/{surrealql-P4rtxzAW.js → surrealql-DiSUbHKF.js} +1 -1
  125. package/dist/assets/web/dist/assets/{svelte-DTcsi8S8.js → svelte-DZenT45Y.js} +1 -1
  126. package/dist/assets/web/dist/assets/{templ-D-kP0Tg5.js → templ-BWKRNM0-.js} +1 -1
  127. package/dist/assets/web/dist/assets/{tex-D-4vuedK.js → tex-CbMzBlkK.js} +1 -1
  128. package/dist/assets/web/dist/assets/{ts-tags-jEEWYxsu.js → ts-tags-CZsVorDN.js} +1 -1
  129. package/dist/assets/web/dist/assets/{tsx-CFnlrVzT.js → tsx-R1r3mH4W.js} +1 -1
  130. package/dist/assets/web/dist/assets/{twig-D5rGrPjs.js → twig-BjPMyjKH.js} +1 -1
  131. package/dist/assets/web/dist/assets/{typescript-nYIQ35or.js → typescript-Bx-66VN_.js} +1 -1
  132. package/dist/assets/web/dist/assets/{typst-3-UX8dna.js → typst-fW037Eo6.js} +1 -1
  133. package/dist/assets/web/dist/assets/{vue-CLIPIX03.js → vue-D1V_GNxW.js} +1 -1
  134. package/dist/assets/web/dist/assets/{vue-html-Ci9CpkHU.js → vue-html-C-4pTZ-s.js} +1 -1
  135. package/dist/assets/web/dist/assets/{vue-vine-DL5pEYYk.js → vue-vine-C-QsX3hR.js} +1 -1
  136. package/dist/assets/web/dist/assets/{wallClock-DmaC1sKA.js → wallClock-x0hjr0J_.js} +1 -1
  137. package/dist/assets/web/dist/assets/{xml-bO80qikC.js → xml-BJTJXPgC.js} +1 -1
  138. package/dist/assets/web/dist/assets/{xsl-BPze60Ej.js → xsl-Xc9lukqe.js} +1 -1
  139. package/dist/assets/web/dist/assets/{yaml-BQUSon_o.js → yaml-Dw-FMsQa.js} +1 -1
  140. package/dist/cli.js +1988 -546
  141. package/package.json +4 -4
  142. package/dist/assets/web/dist/assets/CostsPage-BaeWnm-o.js +0 -1
  143. package/dist/assets/web/dist/assets/RunFoldRow-CwHDL-Mo.js +0 -1
  144. package/dist/assets/web/dist/assets/budgets-KNNkT4PZ.js +0 -1
@@ -160,7 +160,9 @@ export function renderRenewal(
160
160
  grant: Grant,
161
161
  options: { idle?: boolean; senders?: readonly string[] } = {},
162
162
  ): string {
163
- const recourse = options.idle ? "reply in this thread to continue" : "re-issue the request to try again";
163
+ const recourse = options.idle
164
+ ? "the next reply in this thread continues the unit"
165
+ : "the next reply in this thread continues the original task";
164
166
  const senders = options.senders?.length
165
167
  ? `, with ${options.senders.length} message${options.senders.length === 1 ? "" : "s"} from ${options.senders.join(", ")}`
166
168
  : "";
@@ -321,6 +321,12 @@ export interface ChannelIO {
321
321
  * can name the run it caused. Optional: Slack/CLI need nothing from it.
322
322
  */
323
323
  runFinished?(receipt: RunReceipt): void;
324
+ /**
325
+ * Called when a typed request fails before it can create a run. One-shot
326
+ * channels use this to return a failing process/transport status while the
327
+ * requester-facing reply remains the channel's safe sentence.
328
+ */
329
+ requestFailed?(): void;
324
330
  /**
325
331
  * Called once by the core the moment a run has been CREATED in the registry
326
332
  * (before it executes), with the run id. The async HTTP ingress path uses it
@@ -59,7 +59,7 @@ export function bashBudgetWithinRun(wantedMs: number, remainingMs: number): RunB
59
59
  return {
60
60
  kind: "exhausted",
61
61
  note:
62
- `run budget exhausted — ${secs(remainingMs)}s of wall clock left, inside the ` +
62
+ `the run budget is exhausted — ${secs(remainingMs)}s of wall clock left, inside the ` +
63
63
  `${secs(RUN_DEADLINE_RESERVE_MS)}s write-up reserve, so the command was not run; write up what you have now`,
64
64
  };
65
65
  }
@@ -170,6 +170,21 @@ export function boundByOf(binding: { ref: string; boundBy?: BoundBy }, defaultRe
170
170
  return binding.boundBy ?? (binding.ref === defaultRef ? "default" : "name");
171
171
  }
172
172
 
173
+ /** Disk admission runs after an evicted binding's replacement reserves its
174
+ * pool user in storage. Restore the prior binding before an admission throw
175
+ * escapes, so a failed attach never publishes its provisional replacement. */
176
+ export async function admitThreadDiskWithRollback<T>(
177
+ admitThreadDisk: () => Promise<T>,
178
+ rollback: () => Promise<void>,
179
+ ): Promise<T> {
180
+ try {
181
+ return await admitThreadDisk();
182
+ } catch (err) {
183
+ await rollback();
184
+ throw err;
185
+ }
186
+ }
187
+
173
188
  /** The record a rebind leaves on the binding and in the attach answer: from
174
189
  * which ref, onto which branch, for which pull request, when. `returnedAt`:
175
190
  * that branch was gone from the mirror at a later attach and the binding
@@ -55,21 +55,37 @@ export type WorktreeDecision =
55
55
  /** Keep the tree exactly as it stands. */
56
56
  | { kind: "reuse" }
57
57
  /** Wipe it and clone afresh (a provisioning attach only). */
58
- | { kind: "recreate"; why: "mode-switch" | "missing" | "unreadable" | "dirty" | "stale" }
58
+ | { kind: "recreate"; why: "mode-switch" | "ref-changed" | "missing" | "unreadable" | "dirty" | "stale" }
59
59
  /** A reusing attach cannot keep this tree, and must not replace it. */
60
60
  | { kind: "refuse"; why: string };
61
61
 
62
+ /** A named-ref replacement is built beside the checkout its sticky binding
63
+ * still names. Once the attach settles, discard the superseded checkout on
64
+ * success or the provisional checkout on failure; either outcome leaves the
65
+ * persisted binding and the one surviving checkout saying the same ref. */
66
+ export function replacementWorktreeCleanup(input: {
67
+ priorPath: string;
68
+ replacementPath: string;
69
+ succeeded: boolean;
70
+ }): string | null {
71
+ if (input.priorPath === input.replacementPath) return null;
72
+ return input.succeeded ? input.priorPath : input.replacementPath;
73
+ }
74
+
62
75
  export function decideWorktree(input: {
63
76
  /** True for a resumed run's attach: keep the tree, never wipe it. */
64
77
  reuse: boolean;
65
78
  /** The tree was built for the other mode (read-only against writable). */
66
79
  modeSwitch: boolean;
80
+ /** The binding moved to another ref. Even equal tips need a fresh clone so
81
+ * the checked-out branch is the ref the caller named. */
82
+ refChanged?: boolean;
67
83
  /** The commit a provisioning attach checks out: the ref's tip, or the expected head. */
68
84
  sha: string;
69
85
  worktreePath: string;
70
86
  facts: WorktreeFacts;
71
87
  }): WorktreeDecision {
72
- const { reuse, modeSwitch, sha, worktreePath, facts } = input;
88
+ const { reuse, modeSwitch, refChanged = false, sha, worktreePath, facts } = input;
73
89
  if (modeSwitch) {
74
90
  return reuse
75
91
  ? {
@@ -78,6 +94,11 @@ export function decideWorktree(input: {
78
94
  }
79
95
  : { kind: "recreate", why: "mode-switch" };
80
96
  }
97
+ if (refChanged) {
98
+ return reuse
99
+ ? { kind: "refuse", why: `the worktree at ${worktreePath} is attached to another ref` }
100
+ : { kind: "recreate", why: "ref-changed" };
101
+ }
81
102
  if (!facts.exists) {
82
103
  return reuse
83
104
  ? {
@@ -194,11 +194,11 @@ export function fleetBusyRunEndedLine(run: string | undefined, thread: string, e
194
194
  }
195
195
 
196
196
  /** The message `ExecCapacityError` carries once the wait is spent: names the
197
- * wait and the knob, and tells the reader this is a retry-later condition. */
197
+ * wait and the missing automatic queue as a bug, never delegates a retry. */
198
198
  export function fleetBusyExhaustedMessage(waitedMs: number): string {
199
199
  return (
200
- `sandbox fleet busy — no free per-thread sandbox after waiting ${Math.round(waitedMs / 1000)}s ` +
201
- "(the fleet's max_instances is reached); try again in a few minutes"
200
+ `this is a bug: the sandbox fleet had no free per-thread sandbox after waiting ${Math.round(waitedMs / 1000)}s ` +
201
+ "(the fleet's max_instances is reached), and no automatic queue remained"
202
202
  );
203
203
  }
204
204
 
@@ -273,11 +273,11 @@ export function sandboxStartingExecAnswer(cause: string): {
273
273
  }
274
274
 
275
275
  /** The message `ExecCapacityError` carries when a container did not start
276
- * inside the start budget: the wait, and what to do. */
276
+ * inside the start budget: the wait and the missing automatic recovery. */
277
277
  export function startWaitExhaustedMessage(waitedMs: number): string {
278
278
  return (
279
- `sandbox not ready — the thread's container did not finish starting within ${Math.round(waitedMs / 1000)}s; ` +
280
- "try again in a few minutes"
279
+ `this is a bug: the thread's sandbox did not finish starting within ${Math.round(waitedMs / 1000)}s, ` +
280
+ "and no automatic start wait remained"
281
281
  );
282
282
  }
283
283