@coreplane/switchboard 1.236.0 → 1.238.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/deploy/cloudflare-resident/worker.ts +210 -74
- package/dist/assets/deploy/cloudflare-sandbox/worker.ts +36 -10
- package/dist/assets/package-lock.json +3 -3
- package/dist/assets/package.json +1 -1
- package/dist/assets/source.json +3 -3
- package/dist/assets/src/core/authz/authorize.ts +25 -6
- package/dist/assets/src/core/authz/policy.ts +9 -0
- package/dist/assets/src/core/authz/types.ts +15 -1
- package/dist/assets/src/core/coordinator/driver.ts +5 -1
- package/dist/assets/src/core/runEvents.ts +10 -6
- package/dist/assets/src/core/ship/coordinator.ts +23 -1
- package/dist/assets/src/execution/residentDepsStore.ts +14 -2
- package/dist/assets/src/execution/residentDiskBudget.ts +45 -11
- package/dist/assets/src/execution/residentHead.ts +34 -8
- package/dist/assets/src/execution/residentRebind.ts +88 -31
- package/dist/assets/src/execution/sandboxLifecycle.ts +33 -0
- package/dist/assets/src/execution/snapshotRetention.ts +62 -0
- package/dist/assets/src/mcp/registry.ts +9 -1
- package/dist/assets/web/dist/.vite/manifest.json +408 -408
- package/dist/assets/web/dist/assets/AppShell-MYHNxJks.js +1 -0
- package/dist/assets/web/dist/assets/{CostsPage-BfJsol9y.js → CostsPage-DKk9OjB0.js} +1 -1
- package/dist/assets/web/dist/assets/{DeliveryPage-CvInfu7y.js → DeliveryPage-Kz6js49i.js} +1 -1
- package/dist/assets/web/dist/assets/{NotFoundPage-d37EP8hS.js → NotFoundPage-BXLrQQzy.js} +1 -1
- package/dist/assets/web/dist/assets/{ResidentDetailPage-DQSD0SZD.js → ResidentDetailPage-CrfCd8fx.js} +1 -1
- package/dist/assets/web/dist/assets/ResidentsIndexPage-BdW0k2h3.js +1 -0
- package/dist/assets/web/dist/assets/{RunFoldRow-Bngn4GjF.js → RunFoldRow-CbTd9SiS.js} +1 -1
- package/dist/assets/web/dist/assets/{RunRoutePage-a-tMrirB.js → RunRoutePage-br0H-8Pz.js} +3 -3
- package/dist/assets/web/dist/assets/RunsIndexPage-Bnzb15zH.js +1 -0
- package/dist/assets/web/dist/assets/{RunsTabs-CyCdOhJ2.js → RunsTabs-XpCqeWu4.js} +1 -1
- package/dist/assets/web/dist/assets/{ScheduledPage-ByCmyrDs.js → ScheduledPage-NLhjzHAz.js} +1 -1
- package/dist/assets/web/dist/assets/SettingsPage-D-i0uVw-.js +1 -0
- package/dist/assets/web/dist/assets/{StatusDot-D-BPSPpw.js → StatusDot-DkXALvKf.js} +1 -1
- package/dist/assets/web/dist/assets/{Tooltip-DPDx5tXT.js → Tooltip-DtLIyi5P.js} +1 -1
- package/dist/assets/web/dist/assets/{UnitRoutePage-0eiekTHQ.js → UnitRoutePage-DGXukEAH.js} +1 -1
- package/dist/assets/web/dist/assets/{angular-html-Ni1Xil2G.js → angular-html-DYtV9uIN.js} +1 -1
- package/dist/assets/web/dist/assets/{angular-ts-oCgo6p05.js → angular-ts-DF2P25Zp.js} +1 -1
- package/dist/assets/web/dist/assets/{apl-CiWYl0gh.js → apl-Ff96wxko.js} +1 -1
- package/dist/assets/web/dist/assets/{astro-B-VeKZ_J.js → astro-LbBnZna-.js} +1 -1
- package/dist/assets/web/dist/assets/{blade-BIWEISKd.js → blade-DltuxeBW.js} +1 -1
- package/dist/assets/web/dist/assets/{c-DHxA5Byp.js → c-DBg7yuPx.js} +1 -1
- package/dist/assets/web/dist/assets/{chapel-D4qGLw-Q.js → chapel-C83hUAds.js} +1 -1
- package/dist/assets/web/dist/assets/{cobol-BznX5Q-u.js → cobol-DB0yV_2D.js} +1 -1
- package/dist/assets/web/dist/assets/{coffee-CVr8Idlj.js → coffee-Bpih6Kzl.js} +1 -1
- package/dist/assets/web/dist/assets/{cpp-wrk6NfW4.js → cpp-CU00ZeRn.js} +1 -1
- package/dist/assets/web/dist/assets/{crystal-CGYWMeH1.js → crystal-f8ImJkux.js} +1 -1
- package/dist/assets/web/dist/assets/{css-BgGytMsy.js → css-4VrC4ISo.js} +1 -1
- package/dist/assets/web/dist/assets/{dist-DSkVB16z.js → dist-DtA7JiH5.js} +2 -2
- package/dist/assets/web/dist/assets/{durationTone-DYogEPEk.js → durationTone-CYMux25J.js} +1 -1
- package/dist/assets/web/dist/assets/{edge-CdR6AU9v.js → edge-BwFDzfS_.js} +1 -1
- package/dist/assets/web/dist/assets/{elixir-CQRb3PZx.js → elixir-wwIYIpJm.js} +1 -1
- package/dist/assets/web/dist/assets/{elm-CpuA6W8B.js → elm-DyDuM3v3.js} +1 -1
- package/dist/assets/web/dist/assets/{erb-CvlrblqH.js → erb-DFJBEVrh.js} +1 -1
- package/dist/assets/web/dist/assets/{git-rebase-COnovCVc.js → git-rebase-CuDv-44X.js} +1 -1
- package/dist/assets/web/dist/assets/{glimmer-js-C-DS4g_J.js → glimmer-js-ZFnrm4J3.js} +1 -1
- package/dist/assets/web/dist/assets/{glimmer-ts-DTkorWRI.js → glimmer-ts-XY4Yqshp.js} +1 -1
- package/dist/assets/web/dist/assets/{glsl-CH51-JW7.js → glsl-xnR8efx0.js} +1 -1
- package/dist/assets/web/dist/assets/{graphql-BO-XymNv.js → graphql-D-gO5tnP.js} +1 -1
- package/dist/assets/web/dist/assets/{hack-C-N0oicf.js → hack-CSxbW4ax.js} +1 -1
- package/dist/assets/web/dist/assets/{haml-BfmdtWoP.js → haml-D4ar42QT.js} +1 -1
- package/dist/assets/web/dist/assets/{handlebars-BqhO_te-.js → handlebars-CMLbDE7o.js} +1 -1
- package/dist/assets/web/dist/assets/{html-DUEZlTKV.js → html-CVekU4Fs.js} +1 -1
- package/dist/assets/web/dist/assets/{html-derivative-DOUJTS8A.js → html-derivative-St3HHw_N.js} +1 -1
- package/dist/assets/web/dist/assets/{http-j7UH0Cqv.js → http-Mon0DWHS.js} +1 -1
- package/dist/assets/web/dist/assets/{hurl-D6ZaBLJk.js → hurl-Cbl5IvBs.js} +1 -1
- package/dist/assets/web/dist/assets/{indexRow-BjXBzI5Z.js → indexRow-FLJu5mR9.js} +1 -1
- package/dist/assets/web/dist/assets/{java-dugWx3wi.js → java-Bprck1l-.js} +1 -1
- package/dist/assets/web/dist/assets/{javascript-CK4GC4JO.js → javascript-C73G1-UR.js} +1 -1
- package/dist/assets/web/dist/assets/{jinja-DrLKIyKG.js → jinja-C4DuRxYJ.js} +1 -1
- package/dist/assets/web/dist/assets/{jison-CS1Th-TO.js → jison-B2U03GEC.js} +1 -1
- package/dist/assets/web/dist/assets/{json-CkBqdVys.js → json-CvTZUDzx.js} +1 -1
- package/dist/assets/web/dist/assets/{jsx-CCxdg7n3.js → jsx-DMWKCzwo.js} +1 -1
- package/dist/assets/web/dist/assets/{julia-BalKW2hA.js → julia-Czn7bV_3.js} +1 -1
- package/dist/assets/web/dist/assets/{just-BKw1G40D.js → just-BBxpNfvC.js} +1 -1
- package/dist/assets/web/dist/assets/{latex-Dfad6ZN-.js → latex-Bw9yg5mr.js} +1 -1
- package/dist/assets/web/dist/assets/{liquid-f_CMGBvd.js → liquid-BRCjaydE.js} +1 -1
- package/dist/assets/web/dist/assets/{lua-BcMK_uKM.js → lua-DUu2KIC0.js} +1 -1
- package/dist/assets/web/dist/assets/main-CFHF2RvQ.css +1 -0
- package/dist/assets/web/dist/assets/{main-DR8iKpNt.js → main-Dht0in4v.js} +2 -2
- package/dist/assets/web/dist/assets/{marko-B0oNLx2i.js → marko-CZJZIlSQ.js} +1 -1
- package/dist/assets/web/dist/assets/{mdc-Bc_MmIyq.js → mdc-BmClq6fd.js} +1 -1
- package/dist/assets/web/dist/assets/{nginx-Cmxv8RIt.js → nginx-Bmt3xSEm.js} +1 -1
- package/dist/assets/web/dist/assets/{nim-BtgRfaY0.js → nim-Da-i0utK.js} +1 -1
- package/dist/assets/web/dist/assets/{org-Dl9EzlHh.js → org-BvAre2qP.js} +1 -1
- package/dist/assets/web/dist/assets/{perl-BmF7x7BB.js → perl-v9WwFFtB.js} +1 -1
- package/dist/assets/web/dist/assets/{php-rH6CVptQ.js → php-DTU4Zyze.js} +1 -1
- package/dist/assets/web/dist/assets/{pug-CIN5Ccck.js → pug-DhTwEqTO.js} +1 -1
- package/dist/assets/web/dist/assets/{qml-BpLS3RFr.js → qml-BUD9AC_c.js} +1 -1
- package/dist/assets/web/dist/assets/{r-BUMF3B-H.js → r-CAnu56n7.js} +1 -1
- package/dist/assets/web/dist/assets/{razor-B7sTBPdT.js → razor-Dn0P4gAq.js} +1 -1
- package/dist/assets/web/dist/assets/{regexp-h2SvwrsJ.js → regexp-CZyBRaVW.js} +1 -1
- package/dist/assets/web/dist/assets/residentsModel-By1fThvk.js +1 -0
- package/dist/assets/web/dist/assets/{rst-DLOWEsD2.js → rst-Ckyd5UsY.js} +1 -1
- package/dist/assets/web/dist/assets/{ruby-Cl_-I4k3.js → ruby-BBQ62fsx.js} +1 -1
- package/dist/assets/web/dist/assets/{sas-Cm4M-BvV.js → sas-CW35hMxG.js} +1 -1
- package/dist/assets/web/dist/assets/{scss-CEFCEQUF.js → scss-CpV8pF4J.js} +1 -1
- package/dist/assets/web/dist/assets/{shellscript-CE6zb5eS.js → shellscript-CRJvsmE1.js} +1 -1
- package/dist/assets/web/dist/assets/{shellsession-B4fDVzrM.js → shellsession-CyriUZxf.js} +1 -1
- package/dist/assets/web/dist/assets/{soy-DwXCMpjE.js → soy-D5QzYUeg.js} +1 -1
- package/dist/assets/web/dist/assets/{sql-DrnAKnyD.js → sql-CUBf_Mse.js} +1 -1
- package/dist/assets/web/dist/assets/{stata-BzlwPWD6.js → stata-B-4n4ITz.js} +1 -1
- package/dist/assets/web/dist/assets/{surrealql-CeUieZXd.js → surrealql-RuWZBLtr.js} +1 -1
- package/dist/assets/web/dist/assets/{svelte-BERIpIKR.js → svelte-CO5YzCsK.js} +1 -1
- package/dist/assets/web/dist/assets/{templ-6FSuUDwg.js → templ-DbkWVaBF.js} +1 -1
- package/dist/assets/web/dist/assets/{tex-SWCyMwNX.js → tex-IuxoEcId.js} +1 -1
- package/dist/assets/web/dist/assets/{ts-tags-VWj7gWgY.js → ts-tags-g6dGQPjd.js} +1 -1
- package/dist/assets/web/dist/assets/{tsx-B6dzfL8L.js → tsx-WnXwiyH2.js} +1 -1
- package/dist/assets/web/dist/assets/{twig-BDXsr482.js → twig-Lx1G7PnY.js} +1 -1
- package/dist/assets/web/dist/assets/{typescript-s100Dt8y.js → typescript-BQd7biLF.js} +1 -1
- package/dist/assets/web/dist/assets/{typst-WfyEAUdt.js → typst-D2lXPHK7.js} +1 -1
- package/dist/assets/web/dist/assets/{vue-CkXOOJ-6.js → vue-4wVQD9y9.js} +1 -1
- package/dist/assets/web/dist/assets/{vue-html-CEpzdcau.js → vue-html-DZPaRte4.js} +1 -1
- package/dist/assets/web/dist/assets/{vue-vine-D9dsfiFA.js → vue-vine-DbmZCmu-.js} +1 -1
- package/dist/assets/web/dist/assets/{xml-iBDofbJq.js → xml-DV16szyo.js} +1 -1
- package/dist/assets/web/dist/assets/{xsl-CqbJF4hD.js → xsl-eo5-1sk0.js} +1 -1
- package/dist/assets/web/dist/assets/{yaml-D9i6OxYe.js → yaml-BXdX8HZf.js} +1 -1
- package/dist/cli.js +1143 -542
- package/package.json +1 -1
- package/dist/assets/web/dist/assets/AppShell-DZdz_sl7.js +0 -1
- package/dist/assets/web/dist/assets/ResidentsIndexPage-CZUGLen6.js +0 -1
- package/dist/assets/web/dist/assets/RunsIndexPage-s0VKmRda.js +0 -1
- package/dist/assets/web/dist/assets/SettingsPage-DhKEokGK.js +0 -1
- package/dist/assets/web/dist/assets/main-B77vAZVg.css +0 -1
- package/dist/assets/web/dist/assets/residentsModel-VSJEepL1.js +0 -1
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// A resident keeps two snapshot generations (docs/reference/specs/resident-repos.md
|
|
2
|
+
// item 7). The refresh cycle that writes a new stamped pair used to delete the
|
|
3
|
+
// pair it replaced at once; a seeded sandbox that read the checkout handle from
|
|
4
|
+
// `/status` seconds earlier would then restore from objects that are gone, and
|
|
5
|
+
// a rotation lands exactly when a release train merges — the burst the seeded
|
|
6
|
+
// tier exists for. So the replaced pair is RETIRED instead, and the pair
|
|
7
|
+
// retired before it is what the rotation deletes: a handle read from `/status`
|
|
8
|
+
// resolves for at least one more cycle (ten minutes) after it stops being the
|
|
9
|
+
// current one. Offboard and rebuild delete every recorded generation. This is
|
|
10
|
+
// the decision, pure and imported by the resident Worker like
|
|
11
|
+
// `residentDiskBudget.ts`.
|
|
12
|
+
|
|
13
|
+
/** The two SDK backup handles a snapshot generation is made of. */
|
|
14
|
+
export interface SnapshotHandles {
|
|
15
|
+
mirror: { id: string };
|
|
16
|
+
checkout: { id: string };
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** How many generations a resident keeps: the current pair and the one it replaced. */
|
|
20
|
+
export const SNAPSHOT_GENERATIONS = 2;
|
|
21
|
+
|
|
22
|
+
/** The storage key of the retired generation (the current one is the Worker's `resident:snapshot`). */
|
|
23
|
+
export const RETIRED_SNAPSHOT_KEY = "resident:snapshot:retired";
|
|
24
|
+
|
|
25
|
+
export interface Rotation<T extends SnapshotHandles> {
|
|
26
|
+
/** The generation to record as retired after this rotation. */
|
|
27
|
+
retired: T | undefined;
|
|
28
|
+
/** The backup ids whose objects this rotation deletes. */
|
|
29
|
+
deleteIds: string[];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const idsOf = (h: SnapshotHandles): string[] => [h.mirror.id, h.checkout.id];
|
|
33
|
+
|
|
34
|
+
const sameHandles = (a: SnapshotHandles, b: SnapshotHandles) =>
|
|
35
|
+
a.mirror.id === b.mirror.id && a.checkout.id === b.checkout.id;
|
|
36
|
+
|
|
37
|
+
/** A new pair was committed: the pair it `replaced` (the record read when the
|
|
38
|
+
* step began) becomes the retired generation, and the pair `retired` before
|
|
39
|
+
* it is deleted. The first snapshot ever replaces nothing and changes
|
|
40
|
+
* nothing; a rotation whose replaced pair is the retired one already (a
|
|
41
|
+
* re-fired step) deletes nothing, since those are the objects being kept. */
|
|
42
|
+
export function rotateSnapshots<T extends SnapshotHandles>(input: {
|
|
43
|
+
replaced: T | undefined;
|
|
44
|
+
retired: T | undefined;
|
|
45
|
+
}): Rotation<T> {
|
|
46
|
+
const { replaced, retired } = input;
|
|
47
|
+
if (!replaced) return { retired, deleteIds: [] };
|
|
48
|
+
if (retired && sameHandles(retired, replaced)) return { retired, deleteIds: [] };
|
|
49
|
+
return { retired: replaced, deleteIds: retired ? idsOf(retired) : [] };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Every recorded generation's backup ids, each once, in the order given
|
|
53
|
+
* (current first): what offboard and rebuild delete, and what their dry runs
|
|
54
|
+
* itemize. */
|
|
55
|
+
export function backupIdsOf(records: ReadonlyArray<SnapshotHandles | undefined>): string[] {
|
|
56
|
+
const ids: string[] = [];
|
|
57
|
+
for (const record of records) {
|
|
58
|
+
if (!record) continue;
|
|
59
|
+
for (const id of idsOf(record)) if (!ids.includes(id)) ids.push(id);
|
|
60
|
+
}
|
|
61
|
+
return ids;
|
|
62
|
+
}
|
|
@@ -31,6 +31,8 @@ export interface McpServerEntry {
|
|
|
31
31
|
/** Who added it at run time (`slack:U…`, `cli:local`); absent for static config. */
|
|
32
32
|
addedBy?: string;
|
|
33
33
|
addedAt?: number;
|
|
34
|
+
/** An org entry `mcp promote` copied from a person's tier: that person (record 0042). */
|
|
35
|
+
promotedFrom?: string;
|
|
34
36
|
}
|
|
35
37
|
|
|
36
38
|
/** The three tiers a server can live in, in precedence order for a name clash. */
|
|
@@ -174,7 +176,8 @@ export function isMcpServerEntry(v: unknown): v is McpServerEntry {
|
|
|
174
176
|
(e.tokenEnv === undefined || isStr(e.tokenEnv, 128)) &&
|
|
175
177
|
(e.headersEnv === undefined || isHeadersEnv(e.headersEnv)) &&
|
|
176
178
|
(e.addedBy === undefined || isStr(e.addedBy, 260)) &&
|
|
177
|
-
(e.addedAt === undefined || isNum(e.addedAt))
|
|
179
|
+
(e.addedAt === undefined || isNum(e.addedAt)) &&
|
|
180
|
+
(e.promotedFrom === undefined || isStr(e.promotedFrom, 260))
|
|
178
181
|
);
|
|
179
182
|
}
|
|
180
183
|
|
|
@@ -226,7 +229,11 @@ export interface McpServerView {
|
|
|
226
229
|
state: "connected" | "awaiting_credential" | "static";
|
|
227
230
|
source: "config" | "runtime";
|
|
228
231
|
addedBy?: string;
|
|
232
|
+
/** `addedBy` as a display name, when the service could resolve one (record 0042: the same cached
|
|
233
|
+
* lookup the runs index uses); absent → the surfaces show the id. */
|
|
234
|
+
addedByName?: string;
|
|
229
235
|
addedAt?: number;
|
|
236
|
+
promotedFrom?: string;
|
|
230
237
|
}
|
|
231
238
|
|
|
232
239
|
export function serverView(
|
|
@@ -257,6 +264,7 @@ export function serverView(
|
|
|
257
264
|
source: opts.source,
|
|
258
265
|
...(entry.addedBy ? { addedBy: entry.addedBy } : {}),
|
|
259
266
|
...(entry.addedAt !== undefined ? { addedAt: entry.addedAt } : {}),
|
|
267
|
+
...(entry.promotedFrom ? { promotedFrom: entry.promotedFrom } : {}),
|
|
260
268
|
};
|
|
261
269
|
}
|
|
262
270
|
|