@coreplane/switchboard 1.260.3 → 1.260.4
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-resident/Dockerfile +11 -2
- package/dist/assets/package-lock.json +3 -3
- package/dist/assets/package.json +4 -3
- package/dist/assets/project.json +4 -0
- package/dist/assets/source.json +3 -3
- package/dist/assets/src/core/coordinator/driver.ts +4 -4
- package/dist/assets/src/core/runFriction.ts +1 -1
- package/dist/assets/src/core/ship/contract.ts +1 -1
- package/dist/assets/src/core/ship/coordinator.ts +31 -31
- package/dist/assets/src/core/ship/renewal.ts +3 -1
- package/dist/assets/src/execution/bashTimeout.ts +1 -1
- package/dist/assets/src/execution/sandboxErrors.ts +6 -6
- package/dist/assets/web/dist/.vite/manifest.json +488 -488
- 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-BaemWKW8.js} +1 -1
- package/dist/assets/web/dist/assets/{HomePage-Dk3HRBc3.js → HomePage-fgKQHLaO.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-vuWiDzvz.js} +1 -1
- package/dist/assets/web/dist/assets/{PlanePage-RD0M6O6W.js → PlanePage-DXMJf8FB.js} +1 -1
- package/dist/assets/web/dist/assets/{ResidentDetailPage-Dl2KId95.js → ResidentDetailPage-DdC8yU_S.js} +1 -1
- package/dist/assets/web/dist/assets/{ResidentsIndexPage-DBy43I1R.js → ResidentsIndexPage-CSM-KODv.js} +1 -1
- package/dist/assets/web/dist/assets/{RunFoldRow-CwHDL-Mo.js → RunFoldRow-Csik3wD6.js} +1 -1
- package/dist/assets/web/dist/assets/{RunRoutePage-Du1HqLZs.js → RunRoutePage-jo6NZxsP.js} +3 -3
- package/dist/assets/web/dist/assets/{RunsIndexPage-BZphy3Hr.js → RunsIndexPage-Dx1Y4sSq.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-BuB_NZyR.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-Cn96jB6Q.js} +1 -1
- package/dist/assets/web/dist/assets/{SilentTurn-CKxSxnQC.js → SilentTurn-D2cJfpEq.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-DDHUCPVJ.js} +1 -1
- package/dist/assets/web/dist/assets/{Tooltip-wVXCWhMp.js → Tooltip-B4VIHkAI.js} +1 -1
- package/dist/assets/web/dist/assets/{UnitRoutePage-V5BXK7FH.js → UnitRoutePage-C-2DfjLI.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/{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-Cf1CmCSK.js} +2 -2
- 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/{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-DxPqaFu9.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-BzoeVxZB.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 +134 -146
- package/package.json +1 -1
- package/dist/assets/web/dist/assets/CostsPage-BaeWnm-o.js +0 -1
package/dist/cli.js
CHANGED
|
@@ -1874,7 +1874,7 @@ function bashBudgetWithinRun(wantedMs, remainingMs) {
|
|
|
1874
1874
|
if (cap < BASH_TIMEOUT_MIN_MS) {
|
|
1875
1875
|
return {
|
|
1876
1876
|
kind: "exhausted",
|
|
1877
|
-
note: `run budget exhausted \u2014 ${secs(remainingMs)}s of wall clock left, inside the ${secs(RUN_DEADLINE_RESERVE_MS)}s write-up reserve, so the command was not run; write up what you have now`
|
|
1877
|
+
note: `the run budget is exhausted \u2014 ${secs(remainingMs)}s of wall clock left, inside the ${secs(RUN_DEADLINE_RESERVE_MS)}s write-up reserve, so the command was not run; write up what you have now`
|
|
1878
1878
|
};
|
|
1879
1879
|
}
|
|
1880
1880
|
if (cap >= wantedMs) return { kind: "unchanged" };
|
|
@@ -2094,7 +2094,7 @@ function renderFirstInstruction(rebase) {
|
|
|
2094
2094
|
const branch2 = rebase.branch ? `\`${rebase.branch}\`` : "the unit's branch";
|
|
2095
2095
|
const onto = rebase.onto ? `\`${rebase.onto}\`` : "the merged parent";
|
|
2096
2096
|
const gates = `${FAST_GATES_POINTER} ${GATE_RECEIPTS}`;
|
|
2097
|
-
return `Rebase ${branch2} onto ${onto} before any other work \u2014 the parent unit has merged and the base has moved; the only writes are your own on that branch. Push the branch as soon as the change exists and the fast gates pass \u2014 the project's full verification is CI's gate
|
|
2097
|
+
return `Rebase ${branch2} onto ${onto} before any other work \u2014 the parent unit has merged and the base has moved; the only writes are your own on that branch. Push the branch as soon as the change exists and the fast gates pass \u2014 the project's full verification is CI's gate and runs there after the push, with any fix as a further commit; an unpushed tree does not survive the run's end. ${gates} ${REBASE_POINTER} At the wind-down note, commit and push what compiles, say what does not, then answer. ${TIMEOUT_ON_LONG_COMMANDS}`;
|
|
2098
2098
|
}
|
|
2099
2099
|
function renderSpecRow(row2, dropText) {
|
|
2100
2100
|
const head = `#### ${row2.spec} item ${row2.item}`;
|
|
@@ -3007,7 +3007,7 @@ function renewalDecision(input) {
|
|
|
3007
3007
|
};
|
|
3008
3008
|
}
|
|
3009
3009
|
function renderRenewal(decision, grant2, options = {}) {
|
|
3010
|
-
const recourse = options.idle ? "reply in this thread
|
|
3010
|
+
const recourse = options.idle ? "the next reply in this thread continues the unit" : "the next reply in this thread continues the original task";
|
|
3011
3011
|
const senders = options.senders?.length ? `, with ${options.senders.length} message${options.senders.length === 1 ? "" : "s"} from ${options.senders.join(", ")}` : "";
|
|
3012
3012
|
if (decision.renew)
|
|
3013
3013
|
return `budget renewed, ${decision.segment - 1} of ${grant2.renewals}, continues ${decision.from !== void 0 ? decision.from.slice(0, 7) : "the branch's head"}${senders}`;
|
|
@@ -3455,9 +3455,9 @@ function interruptionCauseOfWords(words) {
|
|
|
3455
3455
|
}
|
|
3456
3456
|
function shipInterruptedNote(prUrl3, cause, idle = false) {
|
|
3457
3457
|
const stands = prUrl3 ? `Its work stands on GitHub: ${prUrl3}.` : "Whatever it pushed stands on its pipeline branch; no PR was opened yet.";
|
|
3458
|
-
const
|
|
3458
|
+
const continuation = idle ? "The next reply in this thread continues the unit." : prUrl3 ? `The pipeline kept its task, branch and pull request; the next reply in this thread continues the review loop at ${prUrl3}.` : "The pipeline kept its task and branch; the next reply in this thread starts round 0 again on that branch.";
|
|
3459
3459
|
const opening = cause === "container_replaced" ? "\u26A0\uFE0F The resident container running this pipeline's child was replaced (a deploy's image swap) and the child could not resume, so the pipeline stopped." : cause === "sandbox_fault" ? "\u26A0\uFE0F The sandbox running this pipeline's child failed and the child could not resume, so the pipeline stopped." : cause === "bot_restart" ? "\u26A0\uFE0F The bot restarted while this ship pipeline was running, so the pipeline stopped." : "\u26A0\uFE0F This ship pipeline's child was interrupted and could not resume, so the pipeline stopped.";
|
|
3460
|
-
return `${opening} ${stands} ${
|
|
3460
|
+
return `${opening} ${stands} ${continuation}`;
|
|
3461
3461
|
}
|
|
3462
3462
|
function planIdOf(planPath) {
|
|
3463
3463
|
const base = planPath.split("/").pop() ?? "";
|
|
@@ -4735,7 +4735,7 @@ function analyzeRunFriction(events, opts = {}) {
|
|
|
4735
4735
|
findings.push({
|
|
4736
4736
|
category: "infra_failure",
|
|
4737
4737
|
severity: "high",
|
|
4738
|
-
summary: `no result for tool call (run ended mid-tool): ${event.summary}`,
|
|
4738
|
+
summary: `no result for tool call (the run ended mid-tool): ${event.summary}`,
|
|
4739
4739
|
tool: event.tool,
|
|
4740
4740
|
eventIndex: index,
|
|
4741
4741
|
...durationMs !== void 0 ? { durationMs } : {},
|
|
@@ -11680,13 +11680,13 @@ function fleetBusyRunEndedLine(run2, thread, err2) {
|
|
|
11680
11680
|
});
|
|
11681
11681
|
}
|
|
11682
11682
|
function fleetBusyExhaustedMessage(waitedMs) {
|
|
11683
|
-
return `sandbox fleet
|
|
11683
|
+
return `this is a bug: the sandbox fleet had no free per-thread sandbox after waiting ${Math.round(waitedMs / 1e3)}s (the fleet's max_instances is reached), and no automatic queue remained`;
|
|
11684
11684
|
}
|
|
11685
11685
|
function isWaitReason(reason2) {
|
|
11686
11686
|
return reason2 === FLEET_BUSY_REASON || reason2 === SANDBOX_STARTING_REASON || reason2 === RUNTIME_BUSY_REASON;
|
|
11687
11687
|
}
|
|
11688
11688
|
function startWaitExhaustedMessage(waitedMs) {
|
|
11689
|
-
return `
|
|
11689
|
+
return `this is a bug: the thread's sandbox did not finish starting within ${Math.round(waitedMs / 1e3)}s, and no automatic start wait remained`;
|
|
11690
11690
|
}
|
|
11691
11691
|
function runtimeBusyExhaustedMessage(waitedMs) {
|
|
11692
11692
|
return `sandbox busy \u2014 the thread's container did not accept a connection within ${Math.round(waitedMs / 1e3)}s (the platform refused every connect of the wait; a command saturating its cores is one cause, an idle container has met it too); retry`;
|
|
@@ -15748,9 +15748,7 @@ var init_resident = __esm({
|
|
|
15748
15748
|
* the factory binds the thread to it (loudly) instead of asking. Undefined
|
|
15749
15749
|
* from a Worker predating that field → the dispatcher asks as before. */
|
|
15750
15750
|
constructor(resource, defaultRef) {
|
|
15751
|
-
super(
|
|
15752
|
-
`the ${resource} resident needs a branch for this thread: no ref is bound yet. Name the branch to work on (e.g. "on main") and try again.`
|
|
15753
|
-
);
|
|
15751
|
+
super(`Which branch should the ${resource} resident use for this thread (for example, "main")?`);
|
|
15754
15752
|
this.resource = resource;
|
|
15755
15753
|
this.defaultRef = defaultRef;
|
|
15756
15754
|
this.name = "ResidentNeedsRefError";
|
|
@@ -16280,7 +16278,7 @@ var init_resident = __esm({
|
|
|
16280
16278
|
const callTimeoutMs = opts.callTimeoutMs ?? BASH_TIMEOUT_MS;
|
|
16281
16279
|
const stillGone = (data) => classifyError(
|
|
16282
16280
|
new ExecInfraError(
|
|
16283
|
-
`resident ${route2}
|
|
16281
|
+
`this is a bug: resident ${route2} still had no worktree after its automatic re-attach (${String(data.error ?? "")}); no further restore wait was scheduled`,
|
|
16284
16282
|
"refused"
|
|
16285
16283
|
),
|
|
16286
16284
|
{ kind: "infra", code: "attach" }
|
|
@@ -21529,7 +21527,7 @@ var init_metricsService = __esm({
|
|
|
21529
21527
|
init_budgets();
|
|
21530
21528
|
init_metrics();
|
|
21531
21529
|
init_clock();
|
|
21532
|
-
METRICS_OFF_MESSAGE = "
|
|
21530
|
+
METRICS_OFF_MESSAGE = "Metrics by run aren't configured \u2014 metrics.dataset in config (beside the costs block's Cloudflare account and analytics token) enables this view.";
|
|
21533
21531
|
NullMetricsService = class {
|
|
21534
21532
|
report() {
|
|
21535
21533
|
return Promise.reject(new Error(METRICS_OFF_MESSAGE));
|
|
@@ -23045,7 +23043,7 @@ var init_artifacts = __esm({
|
|
|
23045
23043
|
if (!read.ok)
|
|
23046
23044
|
throw new CommandError(
|
|
23047
23045
|
"unavailable",
|
|
23048
|
-
`the rules were applied to ${bucket} but
|
|
23046
|
+
`this is a bug: the rules were applied to ${bucket}, but their read-back failed (${read.problem}) and no automatic confirmation was completed`
|
|
23049
23047
|
);
|
|
23050
23048
|
const match = rulesMatch(read.value, rules);
|
|
23051
23049
|
if (!match.ok)
|
|
@@ -23565,7 +23563,7 @@ var init_config4 = __esm({
|
|
|
23565
23563
|
destructive: destructiveBeyondMe,
|
|
23566
23564
|
risk: configRisk
|
|
23567
23565
|
},
|
|
23568
|
-
describe: "
|
|
23566
|
+
describe: "Drops every runtime override of a channel (gated), of yourself (your GitHub binding stays \u2014 it is an identity admin's write), or of a thread (gated like the channel); `config clear user --user <id>` removes one person's GitHub binding (identity admins). Static config.yaml values show through again.",
|
|
23569
23567
|
render: (output) => {
|
|
23570
23568
|
const scope = output.scope;
|
|
23571
23569
|
return scope === "user" ? "Cleared the user's GitHub binding." : `Cleared ${who(scope)} overrides.`;
|
|
@@ -23809,7 +23807,7 @@ function renderCostsBy(output, surface = "text") {
|
|
|
23809
23807
|
const columns = surface === "chat" ? [] : [
|
|
23810
23808
|
`${String(o.dimension).padEnd(40)} ${count.padStart(6)} ${"LLM".padStart(10)}${cloud ? "cloud".padStart(10) : ""} ${"total".padStart(10)} share`
|
|
23811
23809
|
];
|
|
23812
|
-
const where = coverage2.historyOn === false ? "
|
|
23810
|
+
const where = coverage2.historyOn === false ? "history is off \u2014 no runs to attribute" : `runs from ${String(coverage2.from)}${coverage2.clamped === true ? ` (earlier days are past the history's ${String(coverage2.retentionDays)}-day window)` : ""}${typeof o.pending === "number" && o.pending > 0 ? ` \xB7 ${o.pending} run(s) still being priced` : ""}`;
|
|
23813
23811
|
const tieOut = typeof rec2.comparedDays === "number" && rec2.comparedDays > 0 ? `LLM attributed ${money(rec2.attributedLlmUsd)} of ${money(rec2.workspaceLlmUsd)} on the workspace over ${rec2.comparedDays} day(s)` + (typeof rec2.unattributedLlmUsd === "number" && rec2.unattributedLlmUsd < 0 ? ` \xB7 ${money(-rec2.unattributedLlmUsd)} more attributed than the workspace figure` : ` \xB7 ${money(rec2.unattributedLlmUsd)} unattributed`) : "no day in range has a workspace LLM figure to compare against";
|
|
23814
23812
|
const cloudLine = cloud ? ` \xB7 cloud allocated ${money(rec2.cloudAllocatedUsd)}${typeof rec2.cloudUnallocatedUsd === "number" && rec2.cloudUnallocatedUsd > 0 ? ` \xB7 ${money(rec2.cloudUnallocatedUsd)} on days with no runs` : ""}` : "";
|
|
23815
23813
|
return [
|
|
@@ -23852,7 +23850,7 @@ var init_costs2 = __esm({
|
|
|
23852
23850
|
if (message4 === COSTS_OFF_MESSAGE) throw new CommandError("unavailable", message4);
|
|
23853
23851
|
throw new CommandError(
|
|
23854
23852
|
"busy",
|
|
23855
|
-
`costs snapshot not taken: ${message4} \u2014 the previous snapshot still serves
|
|
23853
|
+
`costs snapshot not taken: ${message4} \u2014 the previous snapshot still serves, and the scheduled loop will take the next snapshot`
|
|
23856
23854
|
);
|
|
23857
23855
|
}
|
|
23858
23856
|
}
|
|
@@ -24288,7 +24286,7 @@ ${formatDeployResults(result.results, result.notAttempted)}`
|
|
|
24288
24286
|
if (drift.length > 0)
|
|
24289
24287
|
throw new CommandError(
|
|
24290
24288
|
"conflict",
|
|
24291
|
-
`Worker configs are not the render of their templates \u2014 ${drift.map((f) => `${f.path} (${f.status})`).join(", ")}
|
|
24289
|
+
`this is a bug: Worker configs are not the render of their templates \u2014 ${drift.map((f) => `${f.path} (${f.status})`).join(", ")} \u2014 and deploy did not repair or commit the generated files automatically`
|
|
24292
24290
|
);
|
|
24293
24291
|
const output = { profile: { origin: loaded.origin, path: loaded.path }, files };
|
|
24294
24292
|
return output;
|
|
@@ -24703,7 +24701,7 @@ function patternSignature(f) {
|
|
|
24703
24701
|
return "slow_model_turn:model_turn";
|
|
24704
24702
|
case "infra_failure": {
|
|
24705
24703
|
if (summary.startsWith("sandbox dead")) return "infra_failure:sandbox_dead";
|
|
24706
|
-
const mid = /^no result for tool call \(run ended mid-tool\):\s*/.exec(summary);
|
|
24704
|
+
const mid = /^no result for tool call \(the run ended mid-tool\):\s*/.exec(summary);
|
|
24707
24705
|
if (mid) return `infra_failure:mid-tool ${commandSignature(summary.slice(mid[0].length))}`;
|
|
24708
24706
|
const during = /^exec infrastructure failed during\s*/.exec(summary);
|
|
24709
24707
|
return `infra_failure:${commandSignature(during ? summary.slice(during[0].length) : summary)}`;
|
|
@@ -25265,7 +25263,7 @@ async function recentRecords(ledger, query) {
|
|
|
25265
25263
|
function inProgressHint(diagnosis, finished) {
|
|
25266
25264
|
if (!finished) return void 0;
|
|
25267
25265
|
const midTool = diagnosis.findings.some(
|
|
25268
|
-
(f) => f.category === "infra_failure" && f.summary.includes("run ended mid-tool")
|
|
25266
|
+
(f) => f.category === "infra_failure" && f.summary.includes("the run ended mid-tool")
|
|
25269
25267
|
);
|
|
25270
25268
|
return midTool ? "(hint: the stream ends on a tool call with no result \u2014 if this capture was taken mid-run, pass --in-progress)" : void 0;
|
|
25271
25269
|
}
|
|
@@ -25286,7 +25284,7 @@ var init_friction = __esm({
|
|
|
25286
25284
|
defineCommand9 = commandDefiner();
|
|
25287
25285
|
positiveInt2 = z12.coerce.number().int().positive();
|
|
25288
25286
|
repoSlug = z12.string().refine((s) => /^[\w.-]+\/[\w.-]+$/.test(s), "expected an owner/name slug");
|
|
25289
|
-
NO_LEDGER_MESSAGE = "
|
|
25287
|
+
NO_LEDGER_MESSAGE = "History is not configured in this deployment (`runHistory`), so there are no recent runs to analyze.";
|
|
25290
25288
|
NO_REPO_MESSAGE = "Set `selfImprovement.repo` (an `owner/name`) in config.yaml to tell `friction propose` where to file issues.";
|
|
25291
25289
|
asJson2 = (r) => r;
|
|
25292
25290
|
render = (output) => formatSelfImprovementReport(output);
|
|
@@ -25338,7 +25336,7 @@ var init_friction = __esm({
|
|
|
25338
25336
|
openWorld: true,
|
|
25339
25337
|
risk: (input) => dryRunRequested(input) ? PLAN_ONLY_RISK : "files issues on the tracker"
|
|
25340
25338
|
},
|
|
25341
|
-
describe: "
|
|
25339
|
+
describe: "Clusters recent friction, deduplicates against open issues, and files the top proposals as labeled issues.",
|
|
25342
25340
|
render,
|
|
25343
25341
|
handler: async ({ options, caller, deps }) => {
|
|
25344
25342
|
const ledger = await ledgerOf(deps);
|
|
@@ -25927,15 +25925,15 @@ function planCallback(ticket, identity2, now) {
|
|
|
25927
25925
|
function refusalMessage(r) {
|
|
25928
25926
|
switch (r.kind) {
|
|
25929
25927
|
case "not_authorizing":
|
|
25930
|
-
return "This sign-in did not start from a connect link,
|
|
25928
|
+
return "This is a bug: this sign-in did not start from a live connect link, and no fresh connect link was opened automatically.";
|
|
25931
25929
|
case "oauth_failed":
|
|
25932
25930
|
return `Sign-in with the server did not complete: ${r.reason}.`;
|
|
25933
25931
|
case "not_found":
|
|
25934
|
-
return "This connect link is not known
|
|
25932
|
+
return "This is a bug: this connect link is not known, and no fresh connect link was opened automatically.";
|
|
25935
25933
|
case "expired":
|
|
25936
|
-
return "This connect link
|
|
25934
|
+
return "This is a bug: this connect link expired after 10 minutes, and no fresh connect link was opened automatically.";
|
|
25937
25935
|
case "used":
|
|
25938
|
-
return "This connect link was already used
|
|
25936
|
+
return "This connect link was already used; no credential was changed by this visit.";
|
|
25939
25937
|
case "cancelled":
|
|
25940
25938
|
return "This connect link was cancelled.";
|
|
25941
25939
|
case "wrong_identity":
|
|
@@ -25988,7 +25986,7 @@ async function readCapped2(res, max, signal2) {
|
|
|
25988
25986
|
let total = 0;
|
|
25989
25987
|
try {
|
|
25990
25988
|
for (; ; ) {
|
|
25991
|
-
if (signal2?.aborted) throw new McpError("timeout", "run aborted");
|
|
25989
|
+
if (signal2?.aborted) throw new McpError("timeout", "the run was aborted");
|
|
25992
25990
|
const { value, done } = await reader.read();
|
|
25993
25991
|
if (done) break;
|
|
25994
25992
|
if (value) {
|
|
@@ -26484,7 +26482,7 @@ function needsRefresh(cred, now) {
|
|
|
26484
26482
|
async function refreshCredential(fetchImpl, cred, now) {
|
|
26485
26483
|
if (!cred.refreshToken)
|
|
26486
26484
|
throw new OAuthError(
|
|
26487
|
-
"the access token expired
|
|
26485
|
+
"this is a bug: the access token expired, the server issued no refresh token, and no fresh sign-in was opened automatically"
|
|
26488
26486
|
);
|
|
26489
26487
|
const tokens = await tokenRequest(fetchImpl, cred.tokenEndpoint, {
|
|
26490
26488
|
grant_type: "refresh_token",
|
|
@@ -27701,7 +27699,7 @@ var init_service = __esm({
|
|
|
27701
27699
|
} catch (err2) {
|
|
27702
27700
|
return { name: r.name, unavailable: `secret store: ${err2 instanceof Error ? err2.message : String(err2)}` };
|
|
27703
27701
|
}
|
|
27704
|
-
if (!sealed) return { name: r.name, unavailable: "no credential stored
|
|
27702
|
+
if (!sealed) return { name: r.name, unavailable: "no credential is stored, so this server is unavailable" };
|
|
27705
27703
|
try {
|
|
27706
27704
|
const stored = parseStoredCredential(await openCredential(this.opts.key, sealed));
|
|
27707
27705
|
if (stored.kind === "bearer") return { spec: { ...base, auth: { type: "bearer", token: stored.token } } };
|
|
@@ -27926,7 +27924,7 @@ var init_mcp = __esm({
|
|
|
27926
27924
|
// Org-only by definition: it changes what every run in the org can reach,
|
|
27927
27925
|
// so it is destructive at its every input (record 0057's audit rule).
|
|
27928
27926
|
annotations: { destructive: true, risk: () => "adds or moves a server every run in the scope can use" },
|
|
27929
|
-
describe: "
|
|
27927
|
+
describe: "Promote a person's MCP server into the org tier (admins): the same name, URL and auth, added by you; a bearer/oauth server gets a fresh org connect link for you to complete \u2014 the person's credential is never copied.",
|
|
27930
27928
|
render: renderAdd,
|
|
27931
27929
|
settle: (output, { deps }) => settleConnect(deps, output),
|
|
27932
27930
|
handler: async ({ args, options, caller, deps }) => {
|
|
@@ -29764,7 +29762,7 @@ async function fencedTarget(args) {
|
|
|
29764
29762
|
if (args.refusePending && checks.total === 0)
|
|
29765
29763
|
throw new CommandError(
|
|
29766
29764
|
"conflict",
|
|
29767
|
-
`no check reported at the head of ${name} \u2014 nothing was done;
|
|
29765
|
+
`no check reported at the head of ${name} \u2014 nothing was done; this is a bug when the repository has CI because no automatic wait or event re-fire was scheduled (a repository with no CI stays a person's click on GitHub)`
|
|
29768
29766
|
);
|
|
29769
29767
|
if (checks.failed.length > 0)
|
|
29770
29768
|
throw new CommandError(
|
|
@@ -29957,7 +29955,7 @@ var init_metrics2 = __esm({
|
|
|
29957
29955
|
const message4 = err2 instanceof Error ? err2.message : String(err2);
|
|
29958
29956
|
if (message4 === METRICS_OFF_MESSAGE) throw new CommandError("unavailable", message4);
|
|
29959
29957
|
const kind = err2 instanceof Error ? err2.name : "Error";
|
|
29960
|
-
throw new CommandError("unavailable", `run
|
|
29958
|
+
throw new CommandError("unavailable", `metrics by run unavailable: ${kind}: ${message4}`);
|
|
29961
29959
|
}
|
|
29962
29960
|
}
|
|
29963
29961
|
});
|
|
@@ -29992,7 +29990,7 @@ function runLine(row2, now, surface) {
|
|
|
29992
29990
|
}
|
|
29993
29991
|
function prLine(row2, surface) {
|
|
29994
29992
|
const name = `${row2.pr.repo}#${row2.pr.number}`;
|
|
29995
|
-
const owner = row2.owner.unitKey ?? (row2.owner.runId ? `run ${shortId(row2.owner.runId)}` : "a person");
|
|
29993
|
+
const owner = row2.owner.unitKey ?? (row2.owner.runId ? `the run ${shortId(row2.owner.runId)}` : "a person");
|
|
29996
29994
|
const health = healthWords(row2.health) || "-";
|
|
29997
29995
|
if (surface === "chat") return `\u2022 ${name} \u2014 ${health} \xB7 ${owner}`;
|
|
29998
29996
|
return `${name.padEnd(32)} ${health.padEnd(24)} ${owner}`.trimEnd();
|
|
@@ -30484,7 +30482,7 @@ function defineOp(op) {
|
|
|
30484
30482
|
// agent, or the exec grant a token was minted with (policy.ts).
|
|
30485
30483
|
resource: () => ({ type: "agent", name: "coding" }),
|
|
30486
30484
|
effect: "write",
|
|
30487
|
-
describe: `
|
|
30485
|
+
describe: `Executes the repo's onboarded ${op} command with zero model turns (needs coding-agent access; the ref must be a plausible branch).`,
|
|
30488
30486
|
render: renderOp,
|
|
30489
30487
|
handler: async ({ args, caller, deps, span }) => {
|
|
30490
30488
|
if (!await deps.repo.canUseRepo(caller.id, args.slug))
|
|
@@ -30530,7 +30528,7 @@ ${line4}` : ""}`);
|
|
|
30530
30528
|
case "error":
|
|
30531
30529
|
throw new CommandError(
|
|
30532
30530
|
"unavailable",
|
|
30533
|
-
result.transient === true ? `${result.message} \u2014 the resident was unavailable for a moment;
|
|
30531
|
+
result.transient === true ? `${result.message} \u2014 the resident was unavailable for a moment; Switchboard ended the command as unavailable` : result.message
|
|
30534
30532
|
);
|
|
30535
30533
|
}
|
|
30536
30534
|
}
|
|
@@ -30718,7 +30716,7 @@ ${line4}`
|
|
|
30718
30716
|
`\u2022 ${n(w.backupObjects)} snapshot backup object(s) in R2${ids}`,
|
|
30719
30717
|
`\u2022 ${n(w.r2Objects)} object(s) under the resident's R2 prefix`,
|
|
30720
30718
|
`\u2022 ${n(w.threadBindings)} thread binding(s) and the container (currently \`${String(w.container ?? "?")}\`)`,
|
|
30721
|
-
`Nothing was changed.
|
|
30719
|
+
`Nothing was changed. Without \`--dry-run\`, \`repo offboard ${slug}\` performs this removal.`
|
|
30722
30720
|
].join("\n");
|
|
30723
30721
|
}
|
|
30724
30722
|
const errors = Array.isArray(o.errors) ? o.errors : [];
|
|
@@ -30758,7 +30756,7 @@ ${line4}`
|
|
|
30758
30756
|
snap ? `\u2022 discard the snapshot from ${String(snap.createdAt ?? "?")} (${n(discards.backupObjects)} backup object(s); ids ${String(snap.mirrorBackupId ?? "?")}, ${String(snap.checkoutBackupId ?? "?")})` : "\u2022 discard no snapshot (none recorded)",
|
|
30759
30757
|
`\u2022 reprovision from scratch on \`${String(reprov.defaultRef ?? "?")}\` (budget ${n(reprov.provisioningTimeoutMs)}ms)`,
|
|
30760
30758
|
`\u2022 keep the registry record and ${n(keeps.threadBindings)} thread binding(s)`,
|
|
30761
|
-
`Nothing was changed.
|
|
30759
|
+
`Nothing was changed. Without \`--dry-run\`, \`repo rebuild ${slug}\` performs this rebuild.`
|
|
30762
30760
|
].join("\n");
|
|
30763
30761
|
}
|
|
30764
30762
|
return `\u{1F504} Rebuilding \`${slug}\`: discarded ${n(o.backupObjectsDeleted)} backup object(s); reprovisioning from scratch on \`${String(reprov.defaultRef ?? "?")}\` (state \`onboarding\` \u2014 I'll report here when it is warm or has failed; \`repo list\` shows the live state meanwhile).`;
|
|
@@ -31704,7 +31702,7 @@ function newestFinished(a, b) {
|
|
|
31704
31702
|
}
|
|
31705
31703
|
function hostedSealAnswer(units, runnerStopped) {
|
|
31706
31704
|
const lines = units.map((u) => {
|
|
31707
|
-
const how = u.ending ? u.ending.kind : u.threadKey !== void 0 ? "no ending was recorded \u2014
|
|
31705
|
+
const how = u.ending ? u.ending.kind : u.threadKey !== void 0 ? "no ending was recorded \u2014 the next reply in its thread continues the unit" : "not started";
|
|
31708
31706
|
return `${u.unit} \u2014 ${how}${u.pr ? ` \u2014 ${u.pr.url}` : ""}`;
|
|
31709
31707
|
});
|
|
31710
31708
|
return [
|
|
@@ -32345,10 +32343,10 @@ async function abridgerOf(deps) {
|
|
|
32345
32343
|
async function assertVisible(deps, id, caller) {
|
|
32346
32344
|
const runs = await deps.review.runs();
|
|
32347
32345
|
const res = await runs.getRun(id);
|
|
32348
|
-
if (!res.ok) throw new CommandError("not_found", "run
|
|
32346
|
+
if (!res.ok) throw new CommandError("not_found", "no run found");
|
|
32349
32347
|
const actor = caller.actor;
|
|
32350
32348
|
if (!authorize(actor, "runs:read", runResource(res.value)).allow)
|
|
32351
|
-
throw new CommandError("not_found", "run
|
|
32349
|
+
throw new CommandError("not_found", "no run found", "policy");
|
|
32352
32350
|
}
|
|
32353
32351
|
function refused2(err2) {
|
|
32354
32352
|
if (err2 instanceof AbridgeRefusal) throw new CommandError(err2.code, err2.message);
|
|
@@ -32368,13 +32366,13 @@ var init_review = __esm({
|
|
|
32368
32366
|
init_runsService();
|
|
32369
32367
|
defineCommand19 = commandDefiner();
|
|
32370
32368
|
runId = z22.string().regex(RUN_ID_PATTERN);
|
|
32371
|
-
ABRIDGE_OFF_MESSAGE = "The abridged reading diff is off in this deployment: it needs the `meat` binary on the bot host, the Anthropic provider's credential, `review.readingDiff.provider` not `off`,
|
|
32369
|
+
ABRIDGE_OFF_MESSAGE = "The abridged reading diff is off in this deployment: it needs the `meat` binary on the bot host, the Anthropic provider's credential, `review.readingDiff.provider` not `off`, plus history to store it.";
|
|
32372
32370
|
reviewAbridge = defineCommand19({
|
|
32373
32371
|
id: "review.abridge",
|
|
32374
32372
|
// Hidden unless the abridging can happen here (the binary, the credential,
|
|
32375
32373
|
// the switch) AND there is a record to append to.
|
|
32376
32374
|
enabledWhen: (caps) => caps.runHistory && caps.readingDiffAbridge,
|
|
32377
|
-
args: [{ name: "id", schema: runId, describe: "
|
|
32375
|
+
args: [{ name: "id", schema: runId, describe: "id of a finished PR review run" }],
|
|
32378
32376
|
options: z22.object({
|
|
32379
32377
|
model: z22.string().min(1).optional().describe("meat's model (default review.readingDiff.meatModel; without either the abridge fails naming the key)"),
|
|
32380
32378
|
force: flag.optional().describe("recompute even when an abridged diff is already stored, or retry a failed one"),
|
|
@@ -32414,7 +32412,7 @@ import { z as z23 } from "zod";
|
|
|
32414
32412
|
function unwrap2(res, what = "run") {
|
|
32415
32413
|
if (res.ok) return res.value;
|
|
32416
32414
|
if (res.error === "hosted") throw new CommandError("conflict", HOSTED_STOP_REFUSAL);
|
|
32417
|
-
throw new CommandError(res.error, res.error === "not_found" ?
|
|
32415
|
+
throw new CommandError(res.error, res.error === "not_found" ? `no ${what} found` : "the run already finished");
|
|
32418
32416
|
}
|
|
32419
32417
|
async function getVisibleRun(runs, id, caller, action, deps, commandId, opts = {}) {
|
|
32420
32418
|
const view = unwrap2(await runs.getRun(id, opts));
|
|
@@ -32422,7 +32420,7 @@ async function getVisibleRun(runs, id, caller, action, deps, commandId, opts = {
|
|
|
32422
32420
|
const decision = authorize(actor, action, runResource(view));
|
|
32423
32421
|
if (!decision.allow) {
|
|
32424
32422
|
(deps.denied ?? logDenied)({ commandId, actorId: actor.id, action, reason: decision.reason });
|
|
32425
|
-
throw new CommandError("not_found", "run
|
|
32423
|
+
throw new CommandError("not_found", "no run found");
|
|
32426
32424
|
}
|
|
32427
32425
|
return view;
|
|
32428
32426
|
}
|
|
@@ -32553,7 +32551,7 @@ var init_runs = __esm({
|
|
|
32553
32551
|
defineCommand20 = commandDefiner();
|
|
32554
32552
|
runId2 = z23.string().regex(RUN_ID_PATTERN);
|
|
32555
32553
|
positiveInt3 = z23.coerce.number().int().positive();
|
|
32556
|
-
idArg = { name: "id", schema: runId2, describe: "run
|
|
32554
|
+
idArg = { name: "id", schema: runId2, describe: "id of the run" };
|
|
32557
32555
|
HOSTED_STOP_REFUSAL = "this run is a pipeline; its units run in their own threads, so a soft stop ends nothing; `--mode hard` is the escape: it seals the run failed and releases the thread";
|
|
32558
32556
|
NO_RUNS_NAME_PR = "no runs name this pull request";
|
|
32559
32557
|
SESSION_SEARCH_DEFAULT_HITS = 10;
|
|
@@ -33121,8 +33119,8 @@ function capabilityLine(c) {
|
|
|
33121
33119
|
`execution ${c.execution}`,
|
|
33122
33120
|
`github ${onOff(c.github)}`,
|
|
33123
33121
|
`memory ${onOff(c.memory)}`,
|
|
33124
|
-
`
|
|
33125
|
-
`
|
|
33122
|
+
`history ${onOff(c.runHistory)}`,
|
|
33123
|
+
`ledger ${onOff(c.runLedger)}`,
|
|
33126
33124
|
`mcp ${onOff(c.mcp)}`,
|
|
33127
33125
|
`costs ${onOff(c.costs)}`,
|
|
33128
33126
|
`schedules ${onOff(c.schedules)}`,
|
|
@@ -35073,7 +35071,7 @@ function activityLine(e) {
|
|
|
35073
35071
|
case "answer":
|
|
35074
35072
|
return "answer ready";
|
|
35075
35073
|
case "run_meta":
|
|
35076
|
-
return "run
|
|
35074
|
+
return "context for the run recorded";
|
|
35077
35075
|
// published straight to the registry too — never arrives here
|
|
35078
35076
|
case "lease":
|
|
35079
35077
|
return "lease started";
|
|
@@ -35363,13 +35361,13 @@ var init_reply = __esm({
|
|
|
35363
35361
|
live_agent_allowlist: (p) => `\u{1F6AB} You're not on the allowlist for the \`${p.agent}\` agent, whose run is in flight in this thread. Ask ${p.adminsHint} for access.`,
|
|
35364
35362
|
elsewhere_agent_allowlist: (p) => `\u{1F6AB} You're not on the allowlist for the \`${p.agent}\` agent, whose run is in flight in this thread. Ask ${p.adminsHint} for access.`,
|
|
35365
35363
|
repo_not_visible: (p) => `\u{1F4E6} \`${p.slug}\` is not a repository this installation can see \u2014 GitHub answered 404 \u2014 so I did not start ${aRun(p.agent)} for it. The repository is outside the Switchboard GitHub App installation (\`github_repos\` lists the reachable ones), or the name is wrong.`,
|
|
35366
|
-
repo_unverified: (p) => p.via === "github" ? `\u26A0\uFE0F I couldn't verify \`${p.slug}\` against GitHub
|
|
35364
|
+
repo_unverified: (p) => p.via === "github" ? `\u26A0\uFE0F This is a bug: I couldn't verify \`${p.slug}\` against GitHub because it did not answer, so I did not start ${aRun(p.agent)} and no automatic retry was scheduled.` : `\u26A0\uFE0F This is a bug: I couldn't verify that \`${p.slug}\` is an onboarded repo because the resident registry did not answer, so I did not start a *${p.agent}* run and no automatic fallback was started.`,
|
|
35367
35365
|
repo_not_onboarded: (p) => `\u{1F4E6} \`${p.slug}\` is not onboarded as a resident, so I did not start a *${p.agent}* run for it. ${p.onboardHint} for a warm, deps-ready environment, or name the repository by URL (https://github.com/${p.slug}) to run in a cold per-thread sandbox.`,
|
|
35368
35366
|
repo_access: (p) => `\u{1F6AB} You're not on the allowlist for the \`${p.repo}\` repo environment. Ask ${p.adminsHint} for access.`,
|
|
35369
35367
|
which_branch: (p) => `\u{1F33F} Which branch of \`${p.repo}\` should this thread work on? No branch is bound yet; a branch token such as \`branch:main\` will bind it.`,
|
|
35370
35368
|
ship_thread_live: () => "\u{1F6AB} A pipeline is already running in this thread \u2014 one pipeline per thread. Follow the one in flight here, or start this one in a thread of its own.",
|
|
35371
35369
|
pipeline_thread_owned: (p) => `\u{1F6A6} This thread belongs to the live *${p.agent}* pipeline runner \u2014 nothing runs beside it here. ` + (p.units.length > 0 ? `Reply in the unit's own thread instead: ${p.units.map((u) => `${u.unit}${u.threadKey !== void 0 ? ` (\`${u.threadKey}\`)` : ""}`).join(", ")}.` : "Reply in the unit's own thread instead."),
|
|
35372
|
-
ship_budget: (p) => `\u{1F6AB} Ship cannot start under a ${p.maxMinutes}-minute budget: the loop it allows (${p.maxRounds} review rounds) needs ${p.need} minutes \u2014 ${p.provision} to provision, the coding child's ${p.coding}, and the reserve for the rounds after it at their floors.
|
|
35370
|
+
ship_budget: (p) => `\u{1F6AB} Ship cannot start under a ${p.maxMinutes}-minute budget: the loop it allows (${p.maxRounds} review rounds) needs ${p.need} minutes \u2014 ${p.provision} to provision, the coding child's ${p.coding}, and the reserve for the rounds after it at their floors. Switchboard left the budget and boundary unchanged and did not start either the review loop or a single coding pass.`
|
|
35373
35371
|
};
|
|
35374
35372
|
LONG_COMMAND_REPLY_CHARS = 3e3;
|
|
35375
35373
|
}
|
|
@@ -36064,7 +36062,7 @@ function checkPrHeadPreflight(input) {
|
|
|
36064
36062
|
return {
|
|
36065
36063
|
ok: false,
|
|
36066
36064
|
where,
|
|
36067
|
-
reply: `\u{1F500} Review of ${where} not started: GitHub did not give me a usable head commit for the PR (the lookup failed, or answered without a well-formed SHA), so I cannot pin a review to it.
|
|
36065
|
+
reply: `\u{1F500} Review of ${where} not started: GitHub did not give me a usable head commit for the PR (the lookup failed, or answered without a well-formed SHA), so I cannot pin a review to it. This is a bug: no automatic head lookup retry was scheduled, and nothing was posted to GitHub.`
|
|
36068
36066
|
};
|
|
36069
36067
|
}
|
|
36070
36068
|
async function guardAttachedHead(input) {
|
|
@@ -36079,7 +36077,7 @@ async function guardAttachedHead(input) {
|
|
|
36079
36077
|
console.log(`[review] ${input.logKey} not started: ${namedSource} unreadable, PR head ${expected} (${where})`);
|
|
36080
36078
|
return {
|
|
36081
36079
|
outcome: "refused",
|
|
36082
|
-
reply: `\u{1F500} Review of ${where} not started: ${namedSource} could not be read, so the workspace cannot be verified against PR head ${expected}. This infrastructure failure is not a finding and nothing was posted to GitHub
|
|
36080
|
+
reply: `\u{1F500} Review of ${where} not started: ${namedSource} could not be read, so the workspace cannot be verified against PR head ${expected}. This is a bug: the infrastructure failure was not retried automatically. It is not a finding, and nothing was posted to GitHub.`
|
|
36083
36081
|
};
|
|
36084
36082
|
}
|
|
36085
36083
|
if (sameCommit(expected, attached)) return { outcome: "verified" };
|
|
@@ -36093,7 +36091,7 @@ async function guardAttachedHead(input) {
|
|
|
36093
36091
|
console.log(`[review] ${input.logKey} not started: ${namedSource} ${attached}, PR head ${expected} (${where})`);
|
|
36094
36092
|
return {
|
|
36095
36093
|
outcome: "refused",
|
|
36096
|
-
reply: `\u{1F500} Review of ${where} not started: the ${namedSource} is at ${attached}, but the PR head is ${expected} \u2014 the branch moved while the workspace was being prepared (a push or force-push). This
|
|
36094
|
+
reply: `\u{1F500} Review of ${where} not started: the ${namedSource} is at ${attached}, but the PR head is ${expected} \u2014 the branch moved while the workspace was being prepared (a push or force-push). This is a bug: the workspace was not reprovisioned automatically at the new head. It is not a finding, and nothing was posted to GitHub.`
|
|
36097
36095
|
};
|
|
36098
36096
|
}
|
|
36099
36097
|
function makeSystemComposer(input) {
|
|
@@ -36415,56 +36413,34 @@ function boundaryOf(scope) {
|
|
|
36415
36413
|
return "the parent run's remaining budget";
|
|
36416
36414
|
}
|
|
36417
36415
|
}
|
|
36418
|
-
function
|
|
36416
|
+
function boundaryOutcome(scope) {
|
|
36419
36417
|
switch (scope) {
|
|
36420
36418
|
case "channel":
|
|
36421
|
-
return
|
|
36419
|
+
return "Switchboard left this channel's boundary unchanged";
|
|
36422
36420
|
case "user":
|
|
36423
|
-
return
|
|
36421
|
+
return "Switchboard left your boundary and overrides unchanged";
|
|
36424
36422
|
case "defaults":
|
|
36425
|
-
return
|
|
36423
|
+
return "Switchboard left the installation's default boundary unchanged";
|
|
36426
36424
|
case "directive":
|
|
36427
|
-
return "
|
|
36425
|
+
return "Switchboard applied this message's budget directive";
|
|
36428
36426
|
case "parent":
|
|
36429
|
-
return
|
|
36427
|
+
return "Switchboard left the parent run's remaining budget unchanged";
|
|
36430
36428
|
}
|
|
36431
36429
|
}
|
|
36432
|
-
function
|
|
36433
|
-
switch (scope) {
|
|
36434
|
-
case "directive":
|
|
36435
|
-
return `send the message again with \`budget:${needs}\` or more`;
|
|
36436
|
-
case "user":
|
|
36437
|
-
return `raise your own boundary with \`config set me --boundary.maxMinutes ${needs}\`, or drop your overrides with \`config clear me\``;
|
|
36438
|
-
case "channel":
|
|
36439
|
-
return `run it in a channel whose boundary allows ${needs} minutes, or ask ${adminsHint} to raise this channel's boundary`;
|
|
36440
|
-
case "defaults":
|
|
36441
|
-
return `ask ${adminsHint} to raise \`defaults.boundary\` in the configuration`;
|
|
36442
|
-
case "parent":
|
|
36443
|
-
return `spawn it from a run with at least ${needs} minutes left`;
|
|
36444
|
-
}
|
|
36445
|
-
}
|
|
36446
|
-
function profileRefusalReply(agentName, refusal, adminsHint) {
|
|
36447
|
-
const capitalize = (s) => s.charAt(0).toUpperCase() + s.slice(1);
|
|
36430
|
+
function profileRefusalReply(agentName, refusal, _adminsHint) {
|
|
36448
36431
|
if (refusal.axis === "identity") {
|
|
36449
|
-
const
|
|
36450
|
-
return `\u{1F6AB} \`${agentName}\` needs a \`${refusal.needs}\` credential; ${boundaryOf(refusal.scope)} caps runs at \`${refusal.cap}\`. ${
|
|
36432
|
+
const outcome = boundaryOutcome(refusal.scope);
|
|
36433
|
+
return `\u{1F6AB} \`${agentName}\` needs a \`${refusal.needs}\` credential; ${boundaryOf(refusal.scope)} caps runs at \`${refusal.cap}\`. ${outcome} and did not start the run.`;
|
|
36451
36434
|
}
|
|
36452
36435
|
if (refusal.axis === "minutes") {
|
|
36453
|
-
const
|
|
36454
|
-
return `\u{1F6AB} \`${agentName}\` needs at least ${refusal.needs} minutes \u2014 a turn, then its write-up and post-step \u2014 and ${boundaryOf(refusal.scope)} gives it ${refusal.have}. ${
|
|
36436
|
+
const outcome = boundaryOutcome(refusal.scope);
|
|
36437
|
+
return `\u{1F6AB} \`${agentName}\` needs at least ${refusal.needs} minutes \u2014 a turn, then its write-up and post-step \u2014 and ${boundaryOf(refusal.scope)} gives it ${refusal.have}. ${outcome} and did not start the run.`;
|
|
36455
36438
|
}
|
|
36456
36439
|
const scopes = refusal.scopes.map(boundaryOf);
|
|
36457
36440
|
const who2 = scopes.length > 1 ? `${scopes.join(" and ")} allow` : `${scopes[0] ?? "the boundary"} allows`;
|
|
36458
36441
|
const allowed2 = refusal.allowed.map((m) => `\`${m}\``).join(", ");
|
|
36459
|
-
const
|
|
36460
|
-
|
|
36461
|
-
scope,
|
|
36462
|
-
"machines",
|
|
36463
|
-
scope === "user" ? `<classes including ${refusal.needs}>` : refusal.needs,
|
|
36464
|
-
adminsHint
|
|
36465
|
-
)
|
|
36466
|
-
).join("; ");
|
|
36467
|
-
return `\u{1F6AB} \`${agentName}\` runs on a \`${refusal.needs}\` machine; ${who2} only ${allowed2}. ${capitalize(how)}.`;
|
|
36442
|
+
const outcomes = refusal.scopes.map(boundaryOutcome).join("; ");
|
|
36443
|
+
return `\u{1F6AB} \`${agentName}\` runs on a \`${refusal.needs}\` machine; ${who2} only ${allowed2}. ${outcomes}; it did not start the run.`;
|
|
36468
36444
|
}
|
|
36469
36445
|
function escapeRegExp2(s) {
|
|
36470
36446
|
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
@@ -36958,7 +36934,7 @@ function steerAck(live, now) {
|
|
|
36958
36934
|
}
|
|
36959
36935
|
function refusalReply(live, decision, now) {
|
|
36960
36936
|
return `\u23F3 A *${live.agent}* run is already in flight in this thread (${elapsed(live, now)} in).${linkSuffix(live)}
|
|
36961
|
-
An \`agent:${decision.requestedAgent}\` request cannot start beside it \u2014 one run per thread
|
|
36937
|
+
An \`agent:${decision.requestedAgent}\` request cannot start beside it \u2014 one run per thread \u2014 so this request was not started.`;
|
|
36962
36938
|
}
|
|
36963
36939
|
function followUpPrompt(inputs, opts = {}) {
|
|
36964
36940
|
const body = inputs.map((i) => attributedText(attributed(i))).map((line4) => inputs.length > 1 ? `- ${line4}` : line4).join("\n");
|
|
@@ -37398,13 +37374,13 @@ async function steerRun2(deps, sender, target, text) {
|
|
|
37398
37374
|
if (live && live.runId === target.runId) {
|
|
37399
37375
|
live.inbox.push(followUpOf(msg, text, at, { ledgerSeq, ...sender.from ? { from: sender.from } : {} }));
|
|
37400
37376
|
console.log(
|
|
37401
|
-
`[steer] ${sender.from ? `run ${sender.from.runId}` : sender.userId} \u2192 ${target.agent} run ${target.runId} in ${target.threadKey} (${live.inbox.size} pending${ledgerSeq !== void 0 ? `, durable seq ${ledgerSeq}` : ""})`
|
|
37377
|
+
`[steer] ${sender.from ? `the run ${sender.from.runId}` : sender.userId} \u2192 the ${target.agent} run ${target.runId} in ${target.threadKey} (${live.inbox.size} pending${ledgerSeq !== void 0 ? `, durable seq ${ledgerSeq}` : ""})`
|
|
37402
37378
|
);
|
|
37403
37379
|
return { kind: "steered", where: "here", at, ...ledgerSeq !== void 0 ? { ledgerSeq } : {} };
|
|
37404
37380
|
}
|
|
37405
37381
|
if (ledgerSeq !== void 0) {
|
|
37406
37382
|
console.log(
|
|
37407
|
-
`[steer] ${sender.from ? `run ${sender.from.runId}` : sender.userId} \u2192 ${target.agent} run ${target.runId} live on another generation (durable seq ${ledgerSeq})`
|
|
37383
|
+
`[steer] ${sender.from ? `the run ${sender.from.runId}` : sender.userId} \u2192 the ${target.agent} run ${target.runId} live on another generation (durable seq ${ledgerSeq})`
|
|
37408
37384
|
);
|
|
37409
37385
|
return { kind: "steered", where: "elsewhere", at, ledgerSeq };
|
|
37410
37386
|
}
|
|
@@ -37420,7 +37396,7 @@ function createSteerSender(deps) {
|
|
|
37420
37396
|
return {
|
|
37421
37397
|
async send(runId3, words, caller) {
|
|
37422
37398
|
const run2 = deps.runs.getById(runId3);
|
|
37423
|
-
if (!run2) throw new CommandError("not_found", `run ${runId3} is not known here.`);
|
|
37399
|
+
if (!run2) throw new CommandError("not_found", `the run ${runId3} is not known here.`);
|
|
37424
37400
|
const owner = authorizeSteerOwner({
|
|
37425
37401
|
caller: { ids: caller.actor.self ?? [caller.actor.id], grants: effectiveGrants(caller.actor) },
|
|
37426
37402
|
target: {
|
|
@@ -37435,7 +37411,7 @@ function createSteerSender(deps) {
|
|
|
37435
37411
|
const ended = run2.finished || run2.threadKey === void 0 || run2.agent === void 0;
|
|
37436
37412
|
if (ended) {
|
|
37437
37413
|
const when = run2.finishedAt !== void 0 ? `at ${new Date(run2.finishedAt).toISOString()}` : "before this steer arrived";
|
|
37438
|
-
throw new CommandError("conflict", `run ${runId3} ended ${when}; nothing to steer.`);
|
|
37414
|
+
throw new CommandError("conflict", `the run ${runId3} ended ${when}; nothing to steer.`);
|
|
37439
37415
|
}
|
|
37440
37416
|
const out = await steerRun2(
|
|
37441
37417
|
deps,
|
|
@@ -37466,7 +37442,7 @@ function createSteerSender(deps) {
|
|
|
37466
37442
|
case "not_live":
|
|
37467
37443
|
throw new CommandError(
|
|
37468
37444
|
"conflict",
|
|
37469
|
-
`run ${runId3} ended while the steer was being delivered; nothing to steer.`
|
|
37445
|
+
`the run ${runId3} ended while the steer was being delivered; nothing to steer.`
|
|
37470
37446
|
);
|
|
37471
37447
|
}
|
|
37472
37448
|
}
|
|
@@ -39038,11 +39014,11 @@ var init_confirm = __esm({
|
|
|
39038
39014
|
init_runOwner();
|
|
39039
39015
|
init_commandRun();
|
|
39040
39016
|
init_route();
|
|
39041
|
-
OFFER_EXPIRED_LINE = "this offer expired
|
|
39042
|
-
QUESTION_EXPIRED_LINE = "this question expired
|
|
39017
|
+
OFFER_EXPIRED_LINE = "this offer expired after ten minutes; nothing ran, and a later request may receive a fresh confirmation";
|
|
39018
|
+
QUESTION_EXPIRED_LINE = "this question expired after one day; nothing ran, and a later request may receive a fresh question";
|
|
39043
39019
|
OFFER_FOREIGN_LINE = "only the requester can confirm this";
|
|
39044
39020
|
OFFER_USED_LINE = "this offer was already used";
|
|
39045
|
-
OFFER_UNREADABLE_LINE = "the confirmation could not be read
|
|
39021
|
+
OFFER_UNREADABLE_LINE = "this is a bug: the confirmation could not be read, so nothing ran and no replacement offer was minted";
|
|
39046
39022
|
OFFER_CANCELLED_LINE = "Cancelled; nothing ran";
|
|
39047
39023
|
CONFIRMED_REASON = "confirmed after offer";
|
|
39048
39024
|
REFUSED_REASON = "refused after offer";
|
|
@@ -39449,7 +39425,7 @@ function resolveTarget2(deps, ctx) {
|
|
|
39449
39425
|
throw new RefusalError(
|
|
39450
39426
|
refusalOf(
|
|
39451
39427
|
"model_card_refused",
|
|
39452
|
-
`Model "${resolved.modelRef}" speaks the openai-responses wire, which the "opencode" harness cannot speak yet
|
|
39428
|
+
`Model "${resolved.modelRef}" speaks the openai-responses wire, which the "opencode" harness cannot speak yet; this request needs the pi harness or an openai-chat block.`
|
|
39453
39429
|
)
|
|
39454
39430
|
);
|
|
39455
39431
|
}
|
|
@@ -43132,7 +43108,7 @@ async function spawnChild(deps, parent, request2) {
|
|
|
43132
43108
|
if (AGENTS[request2.preset]?.identity === "write") {
|
|
43133
43109
|
return refused7(
|
|
43134
43110
|
"spawn_identity",
|
|
43135
|
-
`\`${request2.preset}\` runs as a \`write\` identity \u2014 it pushes branches and opens pull requests \u2014
|
|
43111
|
+
`\`${request2.preset}\` runs as a \`write\` identity \u2014 it pushes branches and opens pull requests \u2014 so this run was not started: spawned children read this conversation and report, but never write`
|
|
43136
43112
|
);
|
|
43137
43113
|
}
|
|
43138
43114
|
const childPreset = LOOP_PRESETS.includes(request2.preset) ? request2.preset : "general";
|
|
@@ -46348,28 +46324,32 @@ function windDownAnswer(ending, maxMinutes, facts2) {
|
|
|
46348
46324
|
return unlabelledAnswer(ending.text, ending.writeUpFailed, ending.ended, facts2);
|
|
46349
46325
|
}
|
|
46350
46326
|
}
|
|
46351
|
-
function established(facts2
|
|
46352
|
-
const then = advice ? ` \u2014 ${advice}` : "";
|
|
46327
|
+
function established(facts2) {
|
|
46353
46328
|
const w = facts2?.workspace;
|
|
46354
46329
|
let tree = "";
|
|
46355
|
-
if (w?.kind === "unmeasured") tree =
|
|
46330
|
+
if (w?.kind === "unmeasured") tree = "The workspace could not be measured, so work may sit unpushed there.";
|
|
46356
46331
|
else if (w?.kind === "clean")
|
|
46357
46332
|
tree = `The tree was clean${w.branch ? ` and \`${w.branch}\` held no unpushed commits` : " with no unpushed commits"}${w.head ? ` \u2014 its head \`${shortSha2(w.head)}\` is on the remote` : ""}.`;
|
|
46358
46333
|
else if (w?.kind === "salvaged")
|
|
46359
46334
|
tree = `What the tree held was pushed to \`${w.branch}\`${w.head ? ` at \`${shortSha2(w.head)}\`` : ""} by the budget salvage, unreviewed \u2014 a follow-up starts from it.`;
|
|
46360
46335
|
else if (w?.kind === "left")
|
|
46361
|
-
tree = w.fate === "kept" ? `${counted(w)} sit in the workspace, kept for this thread until it idles out \u2014 a follow-up here reuses them.` : w.fate === "discarded" ? `${counted(w)} were left in the tree and discarded at the run's end
|
|
46336
|
+
tree = w.fate === "kept" ? `${counted(w)} sit in the workspace, kept for this thread until it idles out \u2014 a follow-up here reuses them.` : w.fate === "discarded" ? `${counted(w)} were left in the tree and discarded at the run's end.` : `${counted(w)} were left in the tree, which is torn down since a command may still be running in it.`;
|
|
46362
46337
|
const description = facts2?.description === "submitted" ? "The PR description was submitted." : facts2?.description === "not_submitted" ? "No PR description was submitted." : "";
|
|
46363
46338
|
return [tree, description].filter((s) => s !== "").join(" ");
|
|
46364
46339
|
}
|
|
46365
|
-
function
|
|
46366
|
-
const
|
|
46367
|
-
|
|
46368
|
-
|
|
46369
|
-
|
|
46340
|
+
function gapApplies(facts2) {
|
|
46341
|
+
const w = facts2?.workspace;
|
|
46342
|
+
return w === void 0 || w.kind === "unread" || w.kind === "unmeasured" || w.kind === "none" || w.kind === "left" && w.fate !== "kept";
|
|
46343
|
+
}
|
|
46344
|
+
function nothingWritten(facts2, gap) {
|
|
46345
|
+
const gapSentence = gap && gapApplies(facts2) ? `${gap.charAt(0).toUpperCase()}${gap.slice(1)}.` : "";
|
|
46346
|
+
const known = established(facts2);
|
|
46347
|
+
if (known) return ` ${[gapSentence, known].filter((s) => s !== "").join(" ")}`;
|
|
46348
|
+
if (facts2?.workspace?.kind === "none") return gapSentence ? ` ${gapSentence}` : "";
|
|
46349
|
+
return ` Partial work may exist in the workspace${gap ? ` \u2014 ${gap}` : ""}.`;
|
|
46370
46350
|
}
|
|
46371
46351
|
function beforeFindings(facts2) {
|
|
46372
|
-
const known = established(facts2
|
|
46352
|
+
const known = established(facts2);
|
|
46373
46353
|
return known ? `. ${known} Findings so far:` : " \u2014 findings so far:";
|
|
46374
46354
|
}
|
|
46375
46355
|
function elapsedMinutes(ms) {
|
|
@@ -46393,10 +46373,10 @@ var init_windDown = __esm({
|
|
|
46393
46373
|
MODEL_CALL_IN_FLIGHT = "a model call was in flight";
|
|
46394
46374
|
timeBudgetNote = (doing) => doing ? `the loop's time is up while ${doing} \u2014 writing up findings so far inside the lease` : "the loop's time is up \u2014 writing up findings so far inside the lease";
|
|
46395
46375
|
toolCutNote = (doing) => `the loop's end cut the command in flight (${doing}) so the write-up keeps its allowance`;
|
|
46396
|
-
commandPastLoopEndRefusal = (askedSecs, leftSecs) => `budget \u2014 this command asked for a ${askedSecs} s timeout and the loop ends in ${leftSecs} s, so it could never finish
|
|
46376
|
+
commandPastLoopEndRefusal = (askedSecs, leftSecs) => `budget \u2014 this command asked for a ${askedSecs} s timeout and the loop ends in ${leftSecs} s, so it could never finish. A timeout inside the ${leftSecs} s left can still finish; otherwise the current work and write-up stand, and CI owns full verification.`;
|
|
46397
46377
|
turnGuardNote = (pace) => `turn guard fired: ${pace}, a pace that looks like a loop \u2014 writing up findings so far`;
|
|
46398
46378
|
softStopNote = () => "soft stop \u2014 no further steps, writing up findings so far";
|
|
46399
|
-
hardStopNote = () => "hard stop \u2014 run aborted, no summary written";
|
|
46379
|
+
hardStopNote = () => "hard stop \u2014 the run was aborted, no summary written";
|
|
46400
46380
|
windDownFailureNote = (error, closes = "run") => `the model call failed during the wind-down (${error}); the ${closes} closes with its findings so far`;
|
|
46401
46381
|
finaleWaitNote = (reason2, doing, interruptUnanswered, closes = "run") => `the finale bound ended the wait${doing ? ` while ${doing}` : ""}${interruptUnanswered ? ", the loop-end interrupt unanswered" : ""} (${reason2}); the ${closes} closes with its findings so far`;
|
|
46402
46382
|
finaleTimedOutNote = (closes = "run") => `finale timed out \u2014 closing the ${closes} without a write-up`;
|
|
@@ -46420,14 +46400,14 @@ var init_windDown = __esm({
|
|
|
46420
46400
|
wrapUpName = (kind) => kind === "time" ? "time-budget" : kind === "turns" ? "turn-guard" : "soft-stop";
|
|
46421
46401
|
finaleAbortReason = (boundMs) => `aborted at the finale bound (${elapsedMinutes(boundMs)})`;
|
|
46422
46402
|
noWriteUp = (failed, onTool) => failed ? onTool ? `; the finale bound ended the wait on a tool call (${failed}), so no write-up came` : `; the model call failed during the wind-down (${failed}), so no write-up came` : "";
|
|
46423
|
-
TIME_ADVICE = "
|
|
46424
|
-
TURN_ADVICE = "
|
|
46403
|
+
TIME_ADVICE = "this is a bug: the task outlived its run budget and no automatic continuation was scheduled";
|
|
46404
|
+
TURN_ADVICE = "this is a bug: a retry loop spent the turn guard and no automatic recovery was scheduled";
|
|
46425
46405
|
shortSha2 = (sha) => sha.slice(0, 7);
|
|
46426
46406
|
counted = (w) => `${w.uncommitted} uncommitted change(s) and ${w.unpushed} unpushed commit(s)`;
|
|
46427
46407
|
timeBudgetAnswer = (text, maxMinutes, writeUpFailed, facts2, writeUpFailedOnTool) => text ? `\u26A0\uFE0F _Hit the ${maxMinutes}-minute budget before finishing${beforeFindings(facts2)}_
|
|
46428
46408
|
|
|
46429
46409
|
${text}` : `Stopped at the ${maxMinutes}-minute budget without finishing${noWriteUp(writeUpFailed, writeUpFailedOnTool)}.${nothingWritten(facts2, TIME_ADVICE)}`;
|
|
46430
|
-
turnGuardAnswer = (text, pace, writeUpFailed, facts2, writeUpFailedOnTool) => text ? `\u26A0\uFE0F _Stopped after ${pace} \u2014 that pace looks like a loop${established(facts2
|
|
46410
|
+
turnGuardAnswer = (text, pace, writeUpFailed, facts2, writeUpFailedOnTool) => text ? `\u26A0\uFE0F _Stopped after ${pace} \u2014 that pace looks like a loop${established(facts2) ? beforeFindings(facts2) : "; findings so far:"}_
|
|
46431
46411
|
|
|
46432
46412
|
${text}` : `Stopped after ${pace} \u2014 that pace looks like a loop \u2014 without finishing${noWriteUp(writeUpFailed, writeUpFailedOnTool)}.${nothingWritten(facts2, TURN_ADVICE)}`;
|
|
46433
46413
|
unlabelledAnswer = (text, writeUpFailed, ended = "failed", facts2) => {
|
|
@@ -52908,12 +52888,12 @@ async function handOffToCoordinator(deps, input) {
|
|
|
52908
52888
|
if (status3.kind === "unanswered")
|
|
52909
52889
|
return refused5(
|
|
52910
52890
|
"plan_runner_state_unknown",
|
|
52911
|
-
`\u26A0\uFE0F
|
|
52891
|
+
`\u26A0\uFE0F This is a bug: the plan runner could not tell whether \`${latest.id}\` still runs (${status3.reason}), so nothing ran and no automatic state retry was scheduled.`
|
|
52912
52892
|
);
|
|
52913
52893
|
if (status3.kind === "status" && RUNNING.has(status3.status))
|
|
52914
52894
|
return refused5(
|
|
52915
52895
|
"plan_runner_live",
|
|
52916
|
-
`\u{1F6AB} A runner for ${where} is still running (\`${latest.id}\`, status: ${status3.status})
|
|
52896
|
+
`\u{1F6AB} A runner for ${where} is still running (\`${latest.id}\`, status: ${status3.status}), so this request started no second runner.`
|
|
52917
52897
|
);
|
|
52918
52898
|
if (status3.kind === "status" && !ENDED.has(status3.status))
|
|
52919
52899
|
return refused5(
|
|
@@ -52977,7 +52957,7 @@ async function start(deps, input, instance, units, where, write) {
|
|
|
52977
52957
|
);
|
|
52978
52958
|
return refused5(
|
|
52979
52959
|
"plan_runner_conflict",
|
|
52980
|
-
`\u{1F6AB} A runner for \`${instance.id}\` was just recorded by another request
|
|
52960
|
+
`\u{1F6AB} A runner for \`${instance.id}\` was just recorded by another request, so this request started nothing; the recorded runner owns the pipeline.`
|
|
52981
52961
|
);
|
|
52982
52962
|
}
|
|
52983
52963
|
const rows = await deps.instances.putUnits(units);
|
|
@@ -53035,7 +53015,7 @@ async function start(deps, input, instance, units, where, write) {
|
|
|
53035
53015
|
log(`[ship] ${input.msg.threadKey}: the plan runner ${instance.id} could not be started \u2014 ${answer.reason}`);
|
|
53036
53016
|
return refused5(
|
|
53037
53017
|
"plan_start_failed",
|
|
53038
|
-
`\u26A0\uFE0F
|
|
53018
|
+
`\u26A0\uFE0F This is a bug: the plan runner could not be started (${answer.reason}), nothing ran, and no automatic start retry was scheduled.`
|
|
53039
53019
|
);
|
|
53040
53020
|
}
|
|
53041
53021
|
}
|
|
@@ -53618,7 +53598,7 @@ function settleThread(deps, ctx) {
|
|
|
53618
53598
|
console.log(`[dispatch] ${msg.threadKey} ${fromRuns} steer(s) from a parent run never read \u2014 not run fresh`);
|
|
53619
53599
|
const stopMode = stopCounts ? control?.requested : void 0;
|
|
53620
53600
|
if (pending2.length > 0 && stopMode) {
|
|
53621
|
-
console.log(`[dispatch] ${msg.threadKey} ${pending2.length} follow-up(s) dropped: run stopped (${stopMode})`);
|
|
53601
|
+
console.log(`[dispatch] ${msg.threadKey} ${pending2.length} follow-up(s) dropped: the run stopped (${stopMode})`);
|
|
53622
53602
|
return { kind: "dropped", stopMode, pending: pending2 };
|
|
53623
53603
|
}
|
|
53624
53604
|
if (pending2.length > 0 && admitted) {
|
|
@@ -53669,7 +53649,7 @@ var init_settle = __esm({
|
|
|
53669
53649
|
init_requestTrace();
|
|
53670
53650
|
init_threadAdmission();
|
|
53671
53651
|
init_admission();
|
|
53672
|
-
FOLLOW_UP_DROPPED_BY_STOP = "\u26D4
|
|
53652
|
+
FOLLOW_UP_DROPPED_BY_STOP = "\u26D4 This is a bug: the run was stopped before it read this folded follow-up, and the follow-up was not replayed as a fresh request.";
|
|
53673
53653
|
fromPerson = (p) => p.from === void 0 && p.io !== void 0;
|
|
53674
53654
|
}
|
|
53675
53655
|
});
|
|
@@ -53692,7 +53672,7 @@ function carriedCoordinatorTag(row2, events) {
|
|
|
53692
53672
|
}
|
|
53693
53673
|
function lostWorkspaceNote(why, restarts) {
|
|
53694
53674
|
const lost = `resumed after a restart: the run's workspace could not be re-attached (${why})`;
|
|
53695
|
-
return restarts ? `${lost}; the run restarts from its request under the same run id` : `${lost}
|
|
53675
|
+
return restarts ? `${lost}; the run restarts from its request under the same run id` : `${lost}; this is a bug: the row's request cannot be read, so the run ends here and no replacement run starts`;
|
|
53696
53676
|
}
|
|
53697
53677
|
function carriedRunIdentity(registry, runId3, note) {
|
|
53698
53678
|
const snap = registry.snapshotById(runId3);
|
|
@@ -53737,7 +53717,7 @@ async function abandonLostWorkspace(ctx) {
|
|
|
53737
53717
|
shell.close({
|
|
53738
53718
|
kind: "not_started",
|
|
53739
53719
|
icon: "\u{1F501}",
|
|
53740
|
-
reason: restored ? "workspace lost across the restart; restarting from the request" : "workspace lost across the restart
|
|
53720
|
+
reason: restored ? "workspace lost across the restart; restarting from the request" : "this is a bug: the workspace was lost across the restart, the request could not be read, and no replacement run starts",
|
|
53741
53721
|
...closeLines(clock4(), false)
|
|
53742
53722
|
})
|
|
53743
53723
|
);
|
|
@@ -54415,7 +54395,7 @@ async function dispatch(deps, msg, io, opts = {}) {
|
|
|
54415
54395
|
const original = await shipRequestOf(runsService, owner.run.id);
|
|
54416
54396
|
if (original === void 0) {
|
|
54417
54397
|
await io.reply(
|
|
54418
|
-
"This ship pipeline ended, but its original task could not be read
|
|
54398
|
+
"This ship pipeline ended, but its original task could not be read. What was the pipeline's original task?"
|
|
54419
54399
|
);
|
|
54420
54400
|
await recordPendingOperator();
|
|
54421
54401
|
return ended;
|
|
@@ -62704,7 +62684,7 @@ function findOrphanedCards(input) {
|
|
|
62704
62684
|
}
|
|
62705
62685
|
function interruptedCardFrame(cardText) {
|
|
62706
62686
|
const label = cardText.replace(LIVE_GLYPH_PREFIX, "").replace(SHUTDOWN_NOTICE_SUFFIX, "").replace(ACTIVITY_SUFFIX, "").replaceAll("<", "<").replaceAll(">", ">").replaceAll("&", "&").trim();
|
|
62707
|
-
const detail = "
|
|
62687
|
+
const detail = "This is a bug: the bot restarted while this run was in flight, but the run could not be resumed from the ledger. The card stopped updating and no replacement run was started.";
|
|
62708
62688
|
return { title: `\u274C interrupted \xB7 ${label}`, detail };
|
|
62709
62689
|
}
|
|
62710
62690
|
async function catchUpMissedMentions(opts) {
|
|
@@ -63861,7 +63841,7 @@ var init_slack = __esm({
|
|
|
63861
63841
|
PLATFORM3 = "slack";
|
|
63862
63842
|
SLACK_MSG_LIMIT = 3500;
|
|
63863
63843
|
SLACK_SECTION_LIMIT = 3e3;
|
|
63864
|
-
CLICK_FAILED_LINE = "this click could not be handled;
|
|
63844
|
+
CLICK_FAILED_LINE = "this click could not be handled; nothing ran, and the command line remains visible in the offer";
|
|
63865
63845
|
LOADING_PHRASES = [
|
|
63866
63846
|
"is patching you through\u2026",
|
|
63867
63847
|
"is untangling the cords\u2026",
|
|
@@ -65440,7 +65420,7 @@ function serveEvents(subscribe, sink, onLive) {
|
|
|
65440
65420
|
);
|
|
65441
65421
|
if (!subscribed) {
|
|
65442
65422
|
sink.writeHead(404, { "content-type": "text/plain; charset=utf-8" });
|
|
65443
|
-
sink.write("run
|
|
65423
|
+
sink.write("no run found");
|
|
65444
65424
|
sink.end();
|
|
65445
65425
|
return;
|
|
65446
65426
|
}
|
|
@@ -65731,7 +65711,7 @@ function createLiveViewHandler(deps) {
|
|
|
65731
65711
|
};
|
|
65732
65712
|
const liveTokens = () => new Map(index.listActive().map((s) => [s.id, s.token]));
|
|
65733
65713
|
const notFoundPage = (req, res, viewer) => {
|
|
65734
|
-
deps.page(req, res, 404, viewer, "
|
|
65714
|
+
deps.page(req, res, 404, viewer, "No run found", {
|
|
65735
65715
|
page: "runNotFound",
|
|
65736
65716
|
retentionDays: deps.retention ? deps.retention.retentionDays : null
|
|
65737
65717
|
});
|
|
@@ -65929,7 +65909,7 @@ function createLiveViewHandler(deps) {
|
|
|
65929
65909
|
}
|
|
65930
65910
|
const result = access.requestStop(mode);
|
|
65931
65911
|
if (!result.ok) {
|
|
65932
|
-
if (result.reason === "finished") text(res, 409, "run already finished");
|
|
65912
|
+
if (result.reason === "finished") text(res, 409, "the run already finished");
|
|
65933
65913
|
else if (result.reason === "hosted") text(res, 409, HOSTED_STOP);
|
|
65934
65914
|
else text(res, 404, NOT_FOUND2);
|
|
65935
65915
|
return true;
|
|
@@ -65963,13 +65943,13 @@ function createLiveViewHandler(deps) {
|
|
|
65963
65943
|
return;
|
|
65964
65944
|
}
|
|
65965
65945
|
if (found.value.finished) {
|
|
65966
|
-
text(res, 409, "run already finished");
|
|
65946
|
+
text(res, 409, "the run already finished");
|
|
65967
65947
|
return;
|
|
65968
65948
|
}
|
|
65969
65949
|
const stopped = await service.stopRun(route2.id, mode, { kind: "access", id: actor.id });
|
|
65970
65950
|
if (!stopped.ok) {
|
|
65971
65951
|
if (stopped.error === "hosted") text(res, 409, HOSTED_STOP);
|
|
65972
|
-
else if (stopped.error === "conflict") text(res, 409, "run already finished");
|
|
65952
|
+
else if (stopped.error === "conflict") text(res, 409, "the run already finished");
|
|
65973
65953
|
else text(res, 404, NOT_FOUND2);
|
|
65974
65954
|
return;
|
|
65975
65955
|
}
|
|
@@ -66104,7 +66084,7 @@ var init_liveView = __esm({
|
|
|
66104
66084
|
INDEX_PAGE_SIZE = 25;
|
|
66105
66085
|
RUNS_GET = { type: "command", id: "runs.get" };
|
|
66106
66086
|
RUNS_STOP = { type: "command", id: "runs.stop" };
|
|
66107
|
-
NOT_FOUND2 = "run
|
|
66087
|
+
NOT_FOUND2 = "no run found";
|
|
66108
66088
|
HOSTED_STOP = "this run is a pipeline; its units run in their own threads, so a stop here ends nothing; an operator's hard stop seals it failed and releases the thread";
|
|
66109
66089
|
TEXT = { "content-type": "text/plain; charset=utf-8" };
|
|
66110
66090
|
JSON_NO_STORE2 = { "content-type": "application/json; charset=utf-8", "cache-control": "no-store" };
|
|
@@ -67022,7 +67002,7 @@ function createWebChatHandler(deps) {
|
|
|
67022
67002
|
const threadKey = threadKeyFor(sub, route2.id);
|
|
67023
67003
|
readTurns(threadKey, ctx.actor).then(async (open2) => {
|
|
67024
67004
|
if (open2.runs.length === 0 && !ownLane(sub, threadKey)) {
|
|
67025
|
-
deps.page(req, res, 404, ctx.actor, "
|
|
67005
|
+
deps.page(req, res, 404, ctx.actor, "No run found", { page: "runNotFound", retentionDays });
|
|
67026
67006
|
return;
|
|
67027
67007
|
}
|
|
67028
67008
|
const seed = await seedFor(ctx, route2.id, threadKey, open2);
|
|
@@ -67304,14 +67284,14 @@ function createMetricsViewHandler(service, page2) {
|
|
|
67304
67284
|
json2(res, report2);
|
|
67305
67285
|
return;
|
|
67306
67286
|
}
|
|
67307
|
-
page2(req, res, 200, ctx.actor, "
|
|
67287
|
+
page2(req, res, 200, ctx.actor, "Metrics by run", { page: "metrics", report: report2 });
|
|
67308
67288
|
}).catch((err2) => {
|
|
67309
67289
|
const message4 = err2 instanceof Error ? err2.message : String(err2);
|
|
67310
67290
|
if (message4 === METRICS_OFF_MESSAGE) {
|
|
67311
67291
|
plain3(res, 503, METRICS_OFF_MESSAGE);
|
|
67312
67292
|
return;
|
|
67313
67293
|
}
|
|
67314
|
-
plain3(res, 503, `run
|
|
67294
|
+
plain3(res, 503, `metrics by run unavailable: ${err2 instanceof Error ? err2.name : "Error"}`);
|
|
67315
67295
|
});
|
|
67316
67296
|
return true;
|
|
67317
67297
|
};
|
|
@@ -68121,7 +68101,7 @@ async function complete(svc, nonce, identity2, token2, res) {
|
|
|
68121
68101
|
res,
|
|
68122
68102
|
400,
|
|
68123
68103
|
"Token rejected by the server",
|
|
68124
|
-
`<p class="err">${esc(warning ?? "the server rejected the token")}</p><p>Nothing was stored.
|
|
68104
|
+
`<p class="err">${esc(warning ?? "the server rejected the token")}</p><p>Nothing was stored. This is a bug: the token was refused and no fresh sign-in was opened automatically.</p>${server ? entryForm(server, nonce) : ""}`
|
|
68125
68105
|
);
|
|
68126
68106
|
}
|
|
68127
68107
|
return connected(res, server, toolCount, warning);
|
|
@@ -68269,7 +68249,12 @@ function page(res, status3, title, body, head = "") {
|
|
|
68269
68249
|
}
|
|
68270
68250
|
function failure(res, err2) {
|
|
68271
68251
|
console.error(`[mcp-connect] ${err2 instanceof Error ? err2.message : String(err2)}`);
|
|
68272
|
-
page(
|
|
68252
|
+
page(
|
|
68253
|
+
res,
|
|
68254
|
+
503,
|
|
68255
|
+
"Registry unavailable",
|
|
68256
|
+
"<p>This is a bug: the MCP registry could not be reached and no automatic retry was scheduled.</p>"
|
|
68257
|
+
);
|
|
68273
68258
|
}
|
|
68274
68259
|
function esc(s) {
|
|
68275
68260
|
return s.replace(
|
|
@@ -68398,8 +68383,8 @@ function closureNote(agent, prUrl3, cause) {
|
|
|
68398
68383
|
if (agent === "ship")
|
|
68399
68384
|
return shipInterruptedNote(prUrl3, cause === "resident_replaced" ? "container_replaced" : "bot_restart");
|
|
68400
68385
|
if (cause !== void 0)
|
|
68401
|
-
return `This run ended \u2014 ${endingCauseWords(cause)} \u2014
|
|
68402
|
-
return "
|
|
68386
|
+
return `This is a bug: this run ended \u2014 ${endingCauseWords(cause)} \u2014 but it could not be resumed from the ledger. This card stopped updating and no replacement run was started.`;
|
|
68387
|
+
return "This is a bug: the bot restarted while this run was in flight, but the run could not be resumed from the ledger. This card stopped updating and no replacement run was started.";
|
|
68403
68388
|
}
|
|
68404
68389
|
function prUrlOf(events) {
|
|
68405
68390
|
let url;
|
|
@@ -69544,7 +69529,7 @@ ${turn}`, contract };
|
|
|
69544
69529
|
return {
|
|
69545
69530
|
preset: "coding",
|
|
69546
69531
|
ref: unit.branch,
|
|
69547
|
-
prompt: `The approved pull request ${prUrl(instance.repo, brief.pr)} conflicts with \`${brief.base}\` at reviewed head \`${brief.headSha}\`. Rebase \`${unit.branch}\` onto the latest \`${brief.base}\`, resolve only the conflicts git left using the thread and repository rules,
|
|
69532
|
+
prompt: `The approved pull request ${prUrl(instance.repo, brief.pr)} conflicts with \`${brief.base}\` at reviewed head \`${brief.headSha}\`. Rebase \`${unit.branch}\` onto the latest \`${brief.base}\`, resolve only the conflicts git left using the thread and repository rules, and make the lease-protected push only after the changed-set fast gates pass. Resubmit the pull request description at the pushed head. Never merge and never approve; the pipeline re-reviews the changed patch.`
|
|
69548
69533
|
};
|
|
69549
69534
|
default: {
|
|
69550
69535
|
const unknown = brief;
|
|
@@ -69554,7 +69539,7 @@ ${turn}`, contract };
|
|
|
69554
69539
|
}
|
|
69555
69540
|
async function facts(readers, runId3) {
|
|
69556
69541
|
const read = await readers.readRunFacts(runId3);
|
|
69557
|
-
if (!read) throw new Error(`run ${runId3} is not in
|
|
69542
|
+
if (!read) throw new Error(`the run ${runId3} is not in history`);
|
|
69558
69543
|
return read;
|
|
69559
69544
|
}
|
|
69560
69545
|
var SPECS_DIR2, RULES_FILES2, isGenerated, prUrl;
|
|
@@ -70840,7 +70825,7 @@ async function unitWake(body, deps) {
|
|
|
70840
70825
|
} else {
|
|
70841
70826
|
answer = {
|
|
70842
70827
|
kind: "answered",
|
|
70843
|
-
reply: `${renderRenewal(decision, grantFact.grant, { idle: true })} (grant from ${grantFact.source});
|
|
70828
|
+
reply: `${renderRenewal(decision, grantFact.grant, { idle: true })} (grant from ${grantFact.source}); the idle unit remains open, and \`runs stop ${instance.id}:${row2.unit}\` is its stop command.`
|
|
70844
70829
|
};
|
|
70845
70830
|
}
|
|
70846
70831
|
}
|
|
@@ -71230,7 +71215,7 @@ async function merge(body, deps, subject2) {
|
|
|
71230
71215
|
const enqueue = async () => {
|
|
71231
71216
|
if (deps.enqueuePullRequest === void 0)
|
|
71232
71217
|
return refused7(
|
|
71233
|
-
`\`${facts2.baseRef ?? "the base"}\` takes changes only through a merge queue and the door cannot enqueue \u2014
|
|
71218
|
+
`\`${facts2.baseRef ?? "the base"}\` takes changes only through a merge queue and the door cannot enqueue \u2014 this is a bug: automatic merge-queue enqueue is unavailable; the approved work stands`
|
|
71234
71219
|
);
|
|
71235
71220
|
let queued;
|
|
71236
71221
|
try {
|
|
@@ -71329,7 +71314,7 @@ async function checksStep(body, deps) {
|
|
|
71329
71314
|
function planSummary(units, generated = false) {
|
|
71330
71315
|
const lines = units.map((u) => {
|
|
71331
71316
|
const kind = u.ending ? u.ending.kind : u.threadKey ? "unfinished" : "not started";
|
|
71332
|
-
const how = u.ending ? endingWordOf(u.ending.kind) : u.threadKey ? "no ending was recorded \u2014
|
|
71317
|
+
const how = u.ending ? endingWordOf(u.ending.kind) : u.threadKey ? "no ending was recorded \u2014 the next reply in its thread continues the unit" : kind;
|
|
71333
71318
|
const pr = u.pr ? ` \u2014 ${u.pr.url}` : "";
|
|
71334
71319
|
return generated ? `${ENDING_ICON[kind] ?? "\u2022"} ${how}${pr}` : `${ENDING_ICON[kind] ?? "\u2022"} ${u.unit} \u2014 ${how}${pr}`;
|
|
71335
71320
|
});
|
|
@@ -72040,14 +72025,17 @@ async function sweepOne(pr, deps, owner) {
|
|
|
72040
72025
|
return at("skipped", "deferred \u2014 its pipeline runner owns the rebase");
|
|
72041
72026
|
const dirty = pr.mergeableState === "dirty";
|
|
72042
72027
|
if (!dirty && (pr.mergeableState === "unknown" || pr.mergeableState === ""))
|
|
72043
|
-
return at("skipped", "mergeability still computing \u2014
|
|
72028
|
+
return at("skipped", "mergeability still computing \u2014 no rebase was attempted");
|
|
72044
72029
|
if (!dirty) return at("skipped", "skipped, already current");
|
|
72045
72030
|
try {
|
|
72046
72031
|
const rebased = await deps.git.rebase(pr);
|
|
72047
72032
|
const decision = rebased.kind === "conflict" ? owner === "runner" ? { action: "model-round", file: rebased.file } : decideSweep({ dirty, rebase: rebased, modelRoundSpent: await deps.effects.modelRoundSpent(pr) }) : decideSweep({ dirty, rebase: rebased, patchUnchanged: await deps.git.patchUnchanged(pr, rebased.newHead) });
|
|
72048
72033
|
switch (decision.action) {
|
|
72049
72034
|
case "end":
|
|
72050
|
-
return at(
|
|
72035
|
+
return at(
|
|
72036
|
+
"conflict",
|
|
72037
|
+
`this is a bug: the conflict in ${decision.file} remained after the sweep's fix round, and no automatic recovery remains`
|
|
72038
|
+
);
|
|
72051
72039
|
case "model-round": {
|
|
72052
72040
|
if (owner === "runner")
|
|
72053
72041
|
return at("conflict", `conflict in ${decision.file}, the pipeline runner's fix round will resolve it`);
|
|
@@ -73845,7 +73833,7 @@ function askExitCode(finished) {
|
|
|
73845
73833
|
function missingBotConfig(configPath) {
|
|
73846
73834
|
return new CommandError(
|
|
73847
73835
|
"unavailable",
|
|
73848
|
-
`bot config not found at ${configPath} \u2014
|
|
73836
|
+
`bot config not found at ${configPath} \u2014 the command stopped before work began; the config path comes from SWITCHBOARD_CONFIG or defaults to config/config.yaml (deploy, env, friction analyze need no bot config)`
|
|
73849
73837
|
);
|
|
73850
73838
|
}
|
|
73851
73839
|
async function loadBotConfig(configPath, overridesPath, opts = {}) {
|