@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.
- package/dist/assets/deploy/cloudflare/package.json +2 -2
- package/dist/assets/deploy/cloudflare-docs/package.json +1 -1
- package/dist/assets/deploy/cloudflare-memory/package.json +2 -2
- package/dist/assets/deploy/cloudflare-memory/worker.ts +205 -8
- package/dist/assets/deploy/cloudflare-resident/Dockerfile +11 -2
- package/dist/assets/deploy/cloudflare-resident/package.json +2 -2
- package/dist/assets/deploy/cloudflare-resident/worker.ts +124 -40
- package/dist/assets/deploy/cloudflare-sandbox/package.json +2 -2
- package/dist/assets/package-lock.json +712 -97
- package/dist/assets/package.json +7 -6
- package/dist/assets/project.json +4 -0
- package/dist/assets/source.json +3 -3
- package/dist/assets/src/core/budgets.ts +5 -0
- package/dist/assets/src/core/coordinator/contract.ts +5 -0
- package/dist/assets/src/core/coordinator/driver.ts +118 -29
- package/dist/assets/src/core/pipelineStanding.ts +2 -0
- package/dist/assets/src/core/plane/decide.ts +19 -2
- package/dist/assets/src/core/provider.ts +380 -0
- package/dist/assets/src/core/refusal.ts +1 -0
- package/dist/assets/src/core/runEvents.ts +8 -0
- package/dist/assets/src/core/runFriction.ts +1 -1
- package/dist/assets/src/core/runLedger/types.ts +10 -1
- package/dist/assets/src/core/runRecord.ts +31 -0
- package/dist/assets/src/core/ship/contract.ts +3 -1
- package/dist/assets/src/core/ship/coordinator.ts +518 -56
- package/dist/assets/src/core/ship/renewal.ts +3 -1
- package/dist/assets/src/core/types.ts +6 -0
- package/dist/assets/src/execution/bashTimeout.ts +1 -1
- package/dist/assets/src/execution/residentRebind.ts +15 -0
- package/dist/assets/src/execution/residentReuse.ts +23 -2
- package/dist/assets/src/execution/sandboxErrors.ts +6 -6
- package/dist/assets/web/dist/.vite/manifest.json +505 -505
- package/dist/assets/web/dist/assets/{AppShell-CSXDCV4x.js → AppShell-DPJVhUGP.js} +1 -1
- package/dist/assets/web/dist/assets/{CostChart-DsuPS2g7.js → CostChart-4TeDdbvJ.js} +1 -1
- package/dist/assets/web/dist/assets/CostsPage-8HDgvuWB.js +1 -0
- package/dist/assets/web/dist/assets/{DeliveryPage-62qCSLvk.js → DeliveryPage-Cf1joUyA.js} +1 -1
- package/dist/assets/web/dist/assets/{HomePage-Dk3HRBc3.js → HomePage-DZEAnCCv.js} +1 -1
- package/dist/assets/web/dist/assets/{InputMenu-BdZXnibG.js → InputMenu-BRV35UWP.js} +1 -1
- package/dist/assets/web/dist/assets/{MetricsPage-o5fSaCTe.js → MetricsPage-BQBuIuYU.js} +1 -1
- package/dist/assets/web/dist/assets/{NotFoundPage-DHuWyjlq.js → NotFoundPage-CDjMfCcj.js} +1 -1
- package/dist/assets/web/dist/assets/{PendingTurnRow-CeTGOXUy.js → PendingTurnRow-4B8JwETU.js} +1 -1
- package/dist/assets/web/dist/assets/{PlanePage-RD0M6O6W.js → PlanePage-CHU2szQs.js} +1 -1
- package/dist/assets/web/dist/assets/{ResidentDetailPage-Dl2KId95.js → ResidentDetailPage-L5SRcN_O.js} +1 -1
- package/dist/assets/web/dist/assets/{ResidentsIndexPage-DBy43I1R.js → ResidentsIndexPage-BIFf8qyE.js} +1 -1
- package/dist/assets/web/dist/assets/RunFoldRow-DzPIshJx.js +1 -0
- package/dist/assets/web/dist/assets/{RunRoutePage-Du1HqLZs.js → RunRoutePage-Cru5IVux.js} +3 -3
- package/dist/assets/web/dist/assets/{RunsIndexPage-BZphy3Hr.js → RunsIndexPage-CBkdPAdj.js} +1 -1
- package/dist/assets/web/dist/assets/{RunsTabs-kHbbxVHx.js → RunsTabs-C7Ua3XX5.js} +1 -1
- package/dist/assets/web/dist/assets/{ScheduledPage-B7jh898t.js → ScheduledPage-D_R55BDk.js} +1 -1
- package/dist/assets/web/dist/assets/{SettingSelect-BfID5nF4.js → SettingSelect-CEeA4iuC.js} +1 -1
- package/dist/assets/web/dist/assets/{SettingsPage-3uLEsiiE.js → SettingsPage-DlmZvAvf.js} +1 -1
- package/dist/assets/web/dist/assets/{SilentTurn-CKxSxnQC.js → SilentTurn-PWMDMbMG.js} +1 -1
- package/dist/assets/web/dist/assets/{SlackMark-CtiHrNjr.js → SlackMark-DB0MGiF5.js} +1 -1
- package/dist/assets/web/dist/assets/{StatusDot-x7vcK0iE.js → StatusDot-Bq0mYMFo.js} +1 -1
- package/dist/assets/web/dist/assets/{Tooltip-wVXCWhMp.js → Tooltip-Bs6zd7yE.js} +1 -1
- package/dist/assets/web/dist/assets/{UnitRoutePage-V5BXK7FH.js → UnitRoutePage-BMGEZCvn.js} +1 -1
- package/dist/assets/web/dist/assets/{angular-html-C8b5YTHf.js → angular-html-BRRhsdQE.js} +1 -1
- package/dist/assets/web/dist/assets/{angular-ts-C3f4WYNe.js → angular-ts-BFj-mqCm.js} +1 -1
- package/dist/assets/web/dist/assets/{apl-DSHxUJc3.js → apl-CsBuy1IL.js} +1 -1
- package/dist/assets/web/dist/assets/{astro-BSGCCBP6.js → astro-cVaqxBZq.js} +1 -1
- package/dist/assets/web/dist/assets/{blade-DFeYrMKk.js → blade-MEP5mWha.js} +1 -1
- package/dist/assets/web/dist/assets/{browser-B6T5hjfR.js → browser-CCImen5O.js} +1 -1
- package/dist/assets/web/dist/assets/budgets-0szUBIMv.js +1 -0
- package/dist/assets/web/dist/assets/{c-L_QOnFVv.js → c-D4NGQ_Pd.js} +1 -1
- package/dist/assets/web/dist/assets/{chapel-DLQWUwhu.js → chapel-BkWImsIy.js} +1 -1
- package/dist/assets/web/dist/assets/{cobol-1DlMmrEO.js → cobol-RPDSPSET.js} +1 -1
- package/dist/assets/web/dist/assets/{coffee-BTB6os6N.js → coffee-DZ5z7oVX.js} +1 -1
- package/dist/assets/web/dist/assets/{cpp-BvJI2z3u.js → cpp-CrBtIaRZ.js} +1 -1
- package/dist/assets/web/dist/assets/{crystal-B11wGW_h.js → crystal-DJesYi6f.js} +1 -1
- package/dist/assets/web/dist/assets/{css-BiIWx5Pw.js → css-DO9mjau-.js} +1 -1
- package/dist/assets/web/dist/assets/{dist-C-XGnvM4.js → dist-EkKVbIM-.js} +12 -12
- package/dist/assets/web/dist/assets/{edge-nSglEXaD.js → edge-C3VzbSW0.js} +1 -1
- package/dist/assets/web/dist/assets/{elixir-x7o8qMl8.js → elixir-BkD_Vhfe.js} +1 -1
- package/dist/assets/web/dist/assets/{elm-DGrRyqTQ.js → elm-KIM0mFPk.js} +1 -1
- package/dist/assets/web/dist/assets/{erb--_dh58Nw.js → erb-D2ruCqb2.js} +1 -1
- package/dist/assets/web/dist/assets/{eventSource-Bj_dZf6M.js → eventSource-Cv0AFlMi.js} +1 -1
- package/dist/assets/web/dist/assets/{git-rebase-DbpUXwyg.js → git-rebase-CnfbQTxA.js} +1 -1
- package/dist/assets/web/dist/assets/{glimmer-js-BG0CuZG5.js → glimmer-js-CbiwFXWH.js} +1 -1
- package/dist/assets/web/dist/assets/{glimmer-ts-CQIl5qyR.js → glimmer-ts-DV8ii0Pv.js} +1 -1
- package/dist/assets/web/dist/assets/{glsl-9PJNQTcw.js → glsl-CgmznWkA.js} +1 -1
- package/dist/assets/web/dist/assets/{graphql-CzVTzjEI.js → graphql-BK-bBYfH.js} +1 -1
- package/dist/assets/web/dist/assets/{hack-BhCmAz3Q.js → hack-DnwTTP5n.js} +1 -1
- package/dist/assets/web/dist/assets/{haml-BmI12COR.js → haml-DAVJsWwT.js} +1 -1
- package/dist/assets/web/dist/assets/{handlebars-Cib-ISTS.js → handlebars-voOVfxFL.js} +1 -1
- package/dist/assets/web/dist/assets/{html-D3lDapvI.js → html-3FTqwaPk.js} +1 -1
- package/dist/assets/web/dist/assets/{html-derivative-DRPY8vOK.js → html-derivative-CSlhLDQn.js} +1 -1
- package/dist/assets/web/dist/assets/{http-B9VttK6m.js → http-Vx4ilPfS.js} +1 -1
- package/dist/assets/web/dist/assets/{hurl-C0saNJYj.js → hurl-DxyZDE3R.js} +1 -1
- package/dist/assets/web/dist/assets/{indexRow-Dxg7C8s9.js → indexRow-5s3hNzZ9.js} +1 -1
- package/dist/assets/web/dist/assets/{java-BCFbtYAj.js → java-nWqdjNJG.js} +1 -1
- package/dist/assets/web/dist/assets/{javascript-nwBjnrhh.js → javascript-Dr82HOwp.js} +1 -1
- package/dist/assets/web/dist/assets/{jinja-CMYO9byN.js → jinja-BhjLrPOt.js} +1 -1
- package/dist/assets/web/dist/assets/{jison-Cko8HnE_.js → jison-DilGIUa8.js} +1 -1
- package/dist/assets/web/dist/assets/{json-Dzv__YsX.js → json-CrOcvmhJ.js} +1 -1
- package/dist/assets/web/dist/assets/{jsx-CTFxagih.js → jsx-BW_RX-fo.js} +1 -1
- package/dist/assets/web/dist/assets/{julia-_Xvten1-.js → julia-CWH071DB.js} +1 -1
- package/dist/assets/web/dist/assets/{just-bLps4qOu.js → just-DkhhoWBy.js} +1 -1
- package/dist/assets/web/dist/assets/{latex-D6UaYsUP.js → latex-cuHJ4TUT.js} +1 -1
- package/dist/assets/web/dist/assets/{liquid-CoDIeULa.js → liquid-DG6afYQN.js} +1 -1
- package/dist/assets/web/dist/assets/{lua-D1KFRnVf.js → lua-C5CMnCPS.js} +1 -1
- package/dist/assets/web/dist/assets/{main-DAL--hyj.js → main-Disot0n_.js} +3 -3
- package/dist/assets/web/dist/assets/{marko-B5N5XcOw.js → marko-Dy2_DuC4.js} +1 -1
- package/dist/assets/web/dist/assets/{mdc-uxzjQO3q.js → mdc-BMKb_EeA.js} +1 -1
- package/dist/assets/web/dist/assets/{nginx-BMJxs2TK.js → nginx-og0RgMKf.js} +1 -1
- package/dist/assets/web/dist/assets/{nim-DqQ3-8p1.js → nim-CQxTQQP0.js} +1 -1
- package/dist/assets/web/dist/assets/{org-DsY6LK59.js → org-b5lkq_Pl.js} +1 -1
- package/dist/assets/web/dist/assets/{perl--pq9iJFp.js → perl-D9X5_i_J.js} +1 -1
- package/dist/assets/web/dist/assets/{php-RHCMbsM2.js → php-CwUxvLX0.js} +1 -1
- package/dist/assets/web/dist/assets/{pug-CFNq_FCp.js → pug-uOIOExr0.js} +1 -1
- package/dist/assets/web/dist/assets/{qml-C9Acx9E8.js → qml-g5RoADf-.js} +1 -1
- package/dist/assets/web/dist/assets/{r-DxlU8FBd.js → r-5LdAopD3.js} +1 -1
- package/dist/assets/web/dist/assets/{razor-CLJ2kKih.js → razor-DwrvFLYQ.js} +1 -1
- package/dist/assets/web/dist/assets/{regexp-CzmdGoEp.js → regexp-dGtAaxC-.js} +1 -1
- package/dist/assets/web/dist/assets/{rst-D9yuxBET.js → rst-wFdW0brr.js} +1 -1
- package/dist/assets/web/dist/assets/{ruby-CIRcEvnD.js → ruby-DPglN6I9.js} +1 -1
- package/dist/assets/web/dist/assets/{sas-LOl-uUPh.js → sas-CUbCs40d.js} +1 -1
- package/dist/assets/web/dist/assets/{scss-BX2_sZHY.js → scss-B-DUiI1c.js} +1 -1
- package/dist/assets/web/dist/assets/{shellscript-4d-QvKkY.js → shellscript-lGOV7Ram.js} +1 -1
- package/dist/assets/web/dist/assets/{shellsession-DhB16UGy.js → shellsession-BDWtAAjr.js} +1 -1
- package/dist/assets/web/dist/assets/{soy-Cm1xTUBr.js → soy-zod_dcOy.js} +1 -1
- package/dist/assets/web/dist/assets/{sql-BsfcBJdu.js → sql-BG0HSSoM.js} +1 -1
- package/dist/assets/web/dist/assets/{sseReplay-BqgOggyQ.js → sseReplay-9gcMpylx.js} +1 -1
- package/dist/assets/web/dist/assets/{stata-Dwat3BSw.js → stata-BVUMLp1W.js} +1 -1
- package/dist/assets/web/dist/assets/{surrealql-P4rtxzAW.js → surrealql-DiSUbHKF.js} +1 -1
- package/dist/assets/web/dist/assets/{svelte-DTcsi8S8.js → svelte-DZenT45Y.js} +1 -1
- package/dist/assets/web/dist/assets/{templ-D-kP0Tg5.js → templ-BWKRNM0-.js} +1 -1
- package/dist/assets/web/dist/assets/{tex-D-4vuedK.js → tex-CbMzBlkK.js} +1 -1
- package/dist/assets/web/dist/assets/{ts-tags-jEEWYxsu.js → ts-tags-CZsVorDN.js} +1 -1
- package/dist/assets/web/dist/assets/{tsx-CFnlrVzT.js → tsx-R1r3mH4W.js} +1 -1
- package/dist/assets/web/dist/assets/{twig-D5rGrPjs.js → twig-BjPMyjKH.js} +1 -1
- package/dist/assets/web/dist/assets/{typescript-nYIQ35or.js → typescript-Bx-66VN_.js} +1 -1
- package/dist/assets/web/dist/assets/{typst-3-UX8dna.js → typst-fW037Eo6.js} +1 -1
- package/dist/assets/web/dist/assets/{vue-CLIPIX03.js → vue-D1V_GNxW.js} +1 -1
- package/dist/assets/web/dist/assets/{vue-html-Ci9CpkHU.js → vue-html-C-4pTZ-s.js} +1 -1
- package/dist/assets/web/dist/assets/{vue-vine-DL5pEYYk.js → vue-vine-C-QsX3hR.js} +1 -1
- package/dist/assets/web/dist/assets/{wallClock-DmaC1sKA.js → wallClock-x0hjr0J_.js} +1 -1
- package/dist/assets/web/dist/assets/{xml-bO80qikC.js → xml-BJTJXPgC.js} +1 -1
- package/dist/assets/web/dist/assets/{xsl-BPze60Ej.js → xsl-Xc9lukqe.js} +1 -1
- package/dist/assets/web/dist/assets/{yaml-BQUSon_o.js → yaml-Dw-FMsQa.js} +1 -1
- package/dist/cli.js +1988 -546
- package/package.json +4 -4
- package/dist/assets/web/dist/assets/CostsPage-BaeWnm-o.js +0 -1
- package/dist/assets/web/dist/assets/RunFoldRow-CwHDL-Mo.js +0 -1
- 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
|
|
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
|
|
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
|
|
201
|
-
"(the fleet's max_instances is reached)
|
|
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
|
|
276
|
+
* inside the start budget: the wait and the missing automatic recovery. */
|
|
277
277
|
export function startWaitExhaustedMessage(waitedMs: number): string {
|
|
278
278
|
return (
|
|
279
|
-
`
|
|
280
|
-
"
|
|
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
|
|